summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Upton <oliver.upton@linux.dev>2023-11-28 19:56:18 +0000
committerOliver Upton <oliver.upton@linux.dev>2023-11-28 20:02:53 +0000
commitf798a804c604f52716af50c7ca48b29a8c18da35 (patch)
treebd82cd1b54191504f0441a50cf43d96b8d51fd33
parent82da2059833f0235f35f8f913c8258865b1d3ee2 (diff)
downloadaarch64-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--Makefile2
-rw-r--r--main.c10
-rw-r--r--memcpy.h2
-rw-r--r--memcpy_ldp_sttr.S14
-rw-r--r--memcpy_ldtr_stp.S14
5 files changed, 42 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index e9557a3..a424394 100644
--- a/Makefile
+++ b/Makefile
@@ -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 $@
diff --git a/main.c b/main.c
index 21452ea..88483dd 100644
--- a/main.c
+++ b/main.c
@@ -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;
diff --git a/memcpy.h b/memcpy.h
index f510c8f..e0fce8c 100644
--- a/memcpy.h
+++ b/memcpy.h
@@ -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