summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/picotls/deps/cifra/src/arm/memcpy.s
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--web/server/h2o/libh2o/deps/picotls/deps/cifra/src/arm/memcpy.s49
1 files changed, 49 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/deps/picotls/deps/cifra/src/arm/memcpy.s b/web/server/h2o/libh2o/deps/picotls/deps/cifra/src/arm/memcpy.s
new file mode 100644
index 00000000..63406fe5
--- /dev/null
+++ b/web/server/h2o/libh2o/deps/picotls/deps/cifra/src/arm/memcpy.s
@@ -0,0 +1,49 @@
+ .text
+ .syntax unified
+ .global memcpy
+ .func memcpy
+ .thumb_func
+
+memcpy:
+ /* on entry
+ * r0 = targ
+ * r1 = src
+ * r2 = len (bytes)
+ * on exit
+ * r0 = targ (unchanged)
+ */
+ push {r0, r4, lr}
+
+ /* If targ or src are unaligned, drop to byte
+ * processing. */
+ mov r3, r0
+ movs r4, #3
+ orrs r3, r1
+ ands r3, r4
+ bne L_bytewise
+
+ /* Process words */
+L_wordwise:
+ cmp r2, #4
+ blo L_bytewise
+ ldr r4, [r1]
+ adds r1, #4
+ str r4, [r0]
+ adds r0, #4
+ subs r2, #4
+ b L_wordwise
+
+ /* Process bytes */
+L_bytewise:
+ cmp r2, #0
+ beq L_fin
+ ldrb r4, [r1]
+ adds r1, #1
+ strb r4, [r0]
+ adds r0, #1
+ subs r2, #1
+ b L_bytewise
+
+L_fin:
+ pop {r0, r4, pc}
+ .endfunc