123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- TEXT memmove(SB), $0
- JMP move
- TEXT memcpy(SB), $0
- move:
- /*
- * performance:
- * (tba)
- */
- MOVW R7, s1+0(FP)
- MOVW n+8(FP), R9 /* R9 is count */
- MOVW R7, R10 /* R10 is to-pointer */
- SUBCC R0,R9, R0
- BGE ok
- MOVW 0(R0), R0
- ok:
- MOVW s2+4(FP), R11 /* R11 is from-pointer */
- ADD R9,R11, R13 /* R13 is end from-pointer */
- ADD R9,R10, R12 /* R12 is end to-pointer */
- /*
- * easiest test is copy backwards if
- * destination string has higher mem address
- */
- SUBCC R11,R10, R0
- BGU back
- /*
- * if not at least 8 chars,
- * dont even mess around.
- * 7 chars to guarantee any
- * rounding up to a word
- * boundary and 8 characters
- * to get at least maybe one
- * full word store.
- */
- SUBCC $8,R9, R0
- BL fout
- /*
- * test if both pointers
- * are similarly word aligned
- */
- XOR R10,R11, R7
- ANDCC $7,R7, R0
- BNE fout
- /*
- * byte at a time to double align
- */
- f1:
- ANDCC $7,R10, R0
- BE f2
- MOVB 0(R11), R16
- ADD $1, R11
- MOVB R16, 0(R10)
- ADD $1, R10
- JMP f1
- /*
- * turn R9 into to-end pointer-15
- * copy 16 at a time while theres room.
- * R12 is smaller than R13 --
- * there are problems if R13 is 0.
- */
- f2:
- SUB $15,R12, R9
- f3:
- SUBCC R10,R9, R0
- BLEU f4
- MOVD 0(R11), R16
- MOVD R16, 0(R10)
- MOVD 8(R11), R16
- ADD $16, R11
- MOVD R16, 8(R10)
- ADD $16, R10
- JMP f3
- /*
- * turn R9 into to-end pointer-3
- * copy 4 at a time while theres room
- */
- f4:
- SUB $3,R12, R9
- f5:
- SUBCC R10,R9, R0
- BLEU fout
- MOVW 0(R11), R16
- ADD $4, R11
- MOVW R16, 0(R10)
- ADD $4, R10
- JMP f5
- /*
- * last loop, copy byte at a time
- */
- fout:
- SUBCC R11,R13, R0
- BLEU ret
- MOVB 0(R11), R16
- ADD $1, R11
- MOVB R16, 0(R10)
- ADD $1, R10
- JMP fout
- /*
- * whole thing repeated for backwards
- */
- back:
- SUBCC $8,R9, R0
- BL bout
- XOR R12,R13, R7
- ANDCC $7,R7, R0
- BNE bout
- b1:
- ANDCC $7,R13, R0
- BE b2
- MOVB -1(R13), R16
- SUB $1, R13
- MOVB R16, -1(R12)
- SUB $1, R12
- JMP b1
- b2:
- ADD $15,R11, R9
- b3:
- SUBCC R9,R13, R0
- BLEU b4
- MOVD -8(R13), R16
- MOVD R16, -8(R12)
- MOVD -16(R13), R16
- SUB $16, R13
- MOVD R16, -16(R12);
- SUB $16, R12
- JMP b3
- b4:
- ADD $3,R11, R9
- b5:
- SUBCC R9,R13, R0
- BLEU bout
- MOVW -4(R13), R16
- SUB $4, R13
- MOVW R16, -4(R12)
- SUB $4, R12
- JMP b5
- bout:
- SUBCC R11,R13, R0
- BLEU ret
- MOVB -1(R13), R16
- SUB $1, R13
- MOVB R16, -1(R12)
- SUB $1, R12
- JMP bout
- ret:
- MOVW s1+0(FP), R7
- RETURN
|