diff options
author | Oliver Upton <oliver.upton@linux.dev> | 2023-11-28 19:56:18 +0000 |
---|---|---|
committer | Oliver Upton <oliver.upton@linux.dev> | 2023-11-28 20:02:53 +0000 |
commit | f798a804c604f52716af50c7ca48b29a8c18da35 (patch) | |
tree | bd82cd1b54191504f0441a50cf43d96b8d51fd33 | |
parent | 82da2059833f0235f35f8f913c8258865b1d3ee2 (diff) | |
download | aarch64-memcpy-f798a804c604f52716af50c7ca48b29a8c18da35.tar.gz |
who knows, maybe someone though about copy_{to,from}_user()
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | main.c | 10 | ||||
-rw-r--r-- | memcpy.h | 2 | ||||
-rw-r--r-- | memcpy_ldp_sttr.S | 14 | ||||
-rw-r--r-- | memcpy_ldtr_stp.S | 14 |
5 files changed, 42 insertions, 0 deletions
@@ -3,8 +3,10 @@ CFLAGS += -O3 -Wall -Werror OBJS = main.o OBJS += memcpy_ldp_str.o +OBJS += memcpy_ldp_sttr.o OBJS += memcpy_ldp_stp.o OBJS += memcpy_ldr_stp.o +OBJS += memcpy_ldtr_stp.o memcpy: $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $@ @@ -14,7 +14,9 @@ enum mode { LDP_STR = 0, + LDP_STTR, LDR_STP, + LDTR_STP, LDP_STP, NR_MODES @@ -30,7 +32,9 @@ static enum mode test_mode; static void pr_modes(void) { PR_MODE(LDP_STR); + PR_MODE(LDP_STTR); PR_MODE(LDR_STP); + PR_MODE(LDTR_STP); PR_MODE(LDP_STP); } @@ -65,9 +69,15 @@ static void do_memcpy(void *dst, const void *src) case LDP_STR: memcpy_ldp_str(dst, src, test_size); break; + case LDP_STTR: + memcpy_ldp_sttr(dst, src, test_size); + break; case LDR_STP: memcpy_ldr_stp(dst, src, test_size); break; + case LDTR_STP: + memcpy_ldtr_stp(dst, src, test_size); + break; case LDP_STP: memcpy_ldp_stp(dst, src, test_size); break; @@ -4,7 +4,9 @@ #include <stdint.h> void memcpy_ldp_str(void *dst, const void *src, size_t count); +void memcpy_ldp_sttr(void *dst, const void *src, size_t count); void memcpy_ldr_stp(void *dst, const void *src, size_t count); +void memcpy_ldtr_stp(void *dst, const void *src, size_t count); void memcpy_ldp_stp(void *dst, const void *src, size_t count); #endif /* __MEMCPY_H__ */ diff --git a/memcpy_ldp_sttr.S b/memcpy_ldp_sttr.S new file mode 100644 index 0000000..b517d7a --- /dev/null +++ b/memcpy_ldp_sttr.S @@ -0,0 +1,14 @@ +.macro ldp1, Xt1, Xt2, Xn, imm + ldp \Xt1, \Xt2, [\Xn], \imm +.endm + +.macro stp1, Xt1, Xt2, Xn, imm + sttr \Xt1, [\Xn] + sttr \Xt2, [\Xn, #8] + add \Xn, \Xn, \imm +.endm + +.globl memcpy_ldp_sttr +memcpy_ldp_sttr: + #include "copy_template.h" + ret diff --git a/memcpy_ldtr_stp.S b/memcpy_ldtr_stp.S new file mode 100644 index 0000000..e7ea408 --- /dev/null +++ b/memcpy_ldtr_stp.S @@ -0,0 +1,14 @@ +.macro ldp1, Xt1, Xt2, Xn, imm + ldtr \Xt1, [\Xn] + ldtr \Xt2, [\Xn, #8] + add \Xn, \Xn, \imm +.endm + +.macro stp1, Xt1, Xt2, Xn, imm + stp \Xt1, \Xt2, [\Xn], \imm +.endm + +.globl memcpy_ldtr_stp +memcpy_ldtr_stp: + #include "copy_template.h" + ret |