1 TEXT memmove(SB), $0 2 3 JMP move 4 5 TEXT memcpy(SB), $0 6move: 7 MOVW R1, s1+0(FP) 8 9 MOVW n+8(FP), R3 /* R3 is count */ 10 MOVW R1, R4 /* R4 is to-pointer */ 11 SGT R0, R3, R5 12 BEQ R5, ok 13 MOVW (R0), R0 /* abort if negative count */ 14ok: 15 MOVW s2+4(FP), R5 /* R5 is from-pointer */ 16 ADDU R3,R5, R7 /* R7 is end from-pointer */ 17 ADDU R3,R4, R6 /* R6 is end to-pointer */ 18 19/* 20 * easiest test is copy backwards if 21 * destination string has higher mem address 22 */ 23 SGT $4,R3, R2 24 SGTU R4,R5, R1 25 BNE R1, back 26 27/* 28 * if not at least 4 chars, 29 * don't even mess around. 30 * 3 chars to guarantee any 31 * rounding up to a word 32 * boundary and 4 characters 33 * to get at least maybe one 34 * full word store. 35 */ 36 BNE R2, fout 37 38/* 39 * test if both pointers 40 * are similarly word aligned 41 */ 42 XOR R4,R5, R1 43 AND $3, R1 44 BNE R1, fout 45 46/* 47 * byte at a time to word align 48 */ 49f1: 50 AND $3,R4, R1 51 BEQ R1, f2 52 MOVB 0(R5), R8 53 ADDU $1, R5 54 MOVB R8, 0(R4) 55 ADDU $1, R4 56 JMP f1 57 58/* 59 * turn R3 into to-end pointer-15 60 * copy 16 at a time while theres room. 61 * R6 is smaller than R7 -- 62 * there are problems if R7 is 0. 63 */ 64f2: 65 ADDU $-15,R6, R3 66f3: 67 SGTU R3,R4, R1 68 BEQ R1, f4 69 MOVW 0(R5), R8 70 MOVW 4(R5), R9 71 MOVW R8, 0(R4) 72 MOVW 8(R5), R8 73 MOVW R9, 4(R4) 74 MOVW 12(R5), R9 75 ADDU $16, R5 76 MOVW R8, 8(R4) 77 MOVW R9, 12(R4) 78 ADDU $16, R4 79 JMP f3 80 81/* 82 * turn R3 into to-end pointer-3 83 * copy 4 at a time while theres room 84 */ 85f4: 86 ADDU $-3,R6, R3 87f5: 88 SGTU R3,R4, R1 89 BEQ R1, fout 90 MOVW 0(R5), R8 91 ADDU $4, R5 92 MOVW R8, 0(R4) 93 ADDU $4, R4 94 JMP f5 95 96/* 97 * last loop, copy byte at a time 98 */ 99fout: 100 BEQ R7,R5, ret 101 MOVB 0(R5), R8 102 ADDU $1, R5 103 MOVB R8, 0(R4) 104 ADDU $1, R4 105 JMP fout 106 107/* 108 * whole thing repeated for backwards 109 */ 110back: 111 BNE R2, bout 112 XOR R6,R7, R1 113 AND $3, R1 114 BNE R1, bout 115b1: 116 AND $3,R7, R1 117 BEQ R1, b2 118 MOVB -1(R7), R8 119 ADDU $-1, R7 120 MOVB R8, -1(R6) 121 ADDU $-1, R6 122 JMP b1 123b2: 124 ADDU $15,R5, R3 125b3: 126 SGTU R7,R3, R1 127 BEQ R1, b4 128 MOVW -4(R7), R8 129 MOVW -8(R7), R9 130 MOVW R8, -4(R6) 131 MOVW -12(R7), R8 132 MOVW R9, -8(R6) 133 MOVW -16(R7), R9 134 ADDU $-16, R7 135 MOVW R8, -12(R6) 136 MOVW R9, -16(R6) 137 ADDU $-16, R6 138 JMP b3 139b4: 140 ADDU $3,R5, R3 141b5: 142 SGTU R7,R3, R1 143 BEQ R1, bout 144 MOVW -4(R7), R8 145 ADDU $-4, R7 146 MOVW R8, -4(R6) 147 ADDU $-4, R6 148 JMP b5 149 150bout: 151 BEQ R7,R5, ret 152 MOVB -1(R7), R8 153 ADDU $-1, R7 154 MOVB R8, -1(R6) 155 ADDU $-1, R6 156 JMP bout 157 158ret: 159 MOVW s1+0(FP), R1 160 RET 161 END 162