summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap/mips/strcpy.s
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/lib/ap/mips/strcpy.s
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/lib/ap/mips/strcpy.s')
-rwxr-xr-xsys/src/ape/lib/ap/mips/strcpy.s96
1 files changed, 96 insertions, 0 deletions
diff --git a/sys/src/ape/lib/ap/mips/strcpy.s b/sys/src/ape/lib/ap/mips/strcpy.s
new file mode 100755
index 000000000..77be42669
--- /dev/null
+++ b/sys/src/ape/lib/ap/mips/strcpy.s
@@ -0,0 +1,96 @@
+TEXT strcpy(SB), $0
+
+ MOVW s2+4(FP),R2 /* R2 is from pointer */
+ MOVW R1, R3 /* R3 is to pointer */
+
+/*
+ * align 'from' pointer
+ */
+l1:
+ AND $3, R2, R5
+ ADDU $1, R2
+ BEQ R5, l2
+ MOVB -1(R2), R5
+ ADDU $1, R3
+ MOVB R5, -1(R3)
+ BNE R5, l1
+ RET
+
+/*
+ * test if 'to' is also alligned
+ */
+l2:
+ AND $3,R3, R5
+ BEQ R5, l4
+
+/*
+ * copy 4 at a time, 'to' not aligned
+ */
+l3:
+ MOVW -1(R2), R4
+ ADD $4, R2
+ ADD $4, R3
+ SRL $24,R4, R5
+ MOVB R5, -4(R3)
+ BEQ R5, out
+
+ SRL $16,R4, R5
+ AND $0xff, R5
+ MOVB R5, -3(R3)
+ BEQ R5, out
+
+ SRL $8,R4, R5
+ AND $0xff, R5
+ MOVB R5, -2(R3)
+ BEQ R5, out
+
+ AND $0xff,R4, R5
+ MOVB R5, -1(R3)
+ BNE R5, l3
+
+out:
+ RET
+
+/*
+ * word at a time both aligned
+ */
+l4:
+ MOVW $0xff000000, R7
+ MOVW $0x00ff0000, R8
+
+l5:
+ ADDU $4, R3
+ MOVW -1(R2), R4 /* fetch */
+
+ ADDU $4, R2
+ AND R7,R4, R5 /* is it byte 0 */
+ AND R8,R4, R6 /* is it byte 1 */
+ BEQ R5, b0
+
+ AND $0xff00,R4, R5 /* is it byte 2 */
+ BEQ R6, b1
+
+ AND $0xff,R4, R6 /* is it byte 3 */
+ BEQ R5, b2
+
+ MOVW R4, -4(R3) /* store */
+ BNE R6, l5
+ JMP out
+
+b0:
+ MOVB $0, -4(R3)
+ JMP out
+
+b1:
+ SRL $24, R4
+ MOVB R4, -4(R3)
+ MOVB $0, -3(R3)
+ JMP out
+
+b2:
+ SRL $24,R4, R5
+ MOVB R5, -4(R3)
+ SRL $16, R4
+ MOVB R4, -3(R3)
+ MOVB $0, -2(R3)
+ JMP out