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/* 40 * byte at a time to word align destination 41 */ 42f1: 43 AND $3,R4, R1 44 BEQ R1, f2 45 MOVB 0(R5), R8 46 ADDU $1, R5 47 MOVB R8, 0(R4) 48 ADDU $1, R4 49 JMP f1 50 51/* 52 * test if source is now word aligned 53 */ 54f2: 55 AND $3, R5, R1 56 BNE R1, fun2 57/* 58 * turn R3 into to-end pointer-15 59 * copy 16 at a time while theres room. 60 * R6 is smaller than R7 -- 61 * there are problems if R7 is 0. 62 */ 63 ADDU $-15,R6, R3 64f3: 65 SGTU R3,R4, R1 66 BEQ R1, f4 67 MOVW 0(R5), R8 68 MOVW 4(R5), R9 69 MOVW R8, 0(R4) 70 MOVW 8(R5), R8 71 MOVW R9, 4(R4) 72 MOVW 12(R5), R9 73 ADDU $16, R5 74 MOVW R8, 8(R4) 75 MOVW R9, 12(R4) 76 ADDU $16, R4 77 JMP f3 78 79/* 80 * turn R3 into to-end pointer-3 81 * copy 4 at a time while theres room 82 */ 83f4: 84 ADDU $-3,R6, R3 85f5: 86 SGTU R3,R4, R1 87 BEQ R1, fout 88 MOVW 0(R5), R8 89 ADDU $4, R5 90 MOVW R8, 0(R4) 91 ADDU $4, R4 92 JMP f5 93 94/* 95 * forward copy, unaligned 96 * turn R3 into to-end pointer-15 97 * copy 16 at a time while theres room. 98 * R6 is smaller than R7 -- 99 * there are problems if R7 is 0. 100 */ 101fun2: 102 ADDU $-15,R6, R3 103fun3: 104 SGTU R3,R4, R1 105 BEQ R1, fun4 106 MOVWL 0(R5), R8 107 MOVWR 3(R5), R8 108 MOVWL 4(R5), R9 109 MOVWR 7(R5), R9 110 MOVW R8, 0(R4) 111 MOVWL 8(R5), R8 112 MOVWR 11(R5), R8 113 MOVW R9, 4(R4) 114 MOVWL 12(R5), R9 115 MOVWR 15(R5), R9 116 ADDU $16, R5 117 MOVW R8, 8(R4) 118 MOVW R9, 12(R4) 119 ADDU $16, R4 120 JMP fun3 121 122/* 123 * turn R3 into to-end pointer-3 124 * copy 4 at a time while theres room 125 */ 126fun4: 127 ADDU $-3,R6, R3 128fun5: 129 SGTU R3,R4, R1 130 BEQ R1, fout 131 MOVWL 0(R5), R8 132 MOVWR 3(R5), R8 133 ADDU $4, R5 134 MOVW R8, 0(R4) 135 ADDU $4, R4 136 JMP fun5 137 138/* 139 * last loop, copy byte at a time 140 */ 141fout: 142 BEQ R7,R5, ret 143 MOVB 0(R5), R8 144 ADDU $1, R5 145 MOVB R8, 0(R4) 146 ADDU $1, R4 147 JMP fout 148 149/* 150 * whole thing repeated for backwards 151 */ 152back: 153 BNE R2, bout 154b1: 155 AND $3,R6, R1 156 BEQ R1, b2 157 MOVB -1(R7), R8 158 ADDU $-1, R7 159 MOVB R8, -1(R6) 160 ADDU $-1, R6 161 JMP b1 162 163b2: 164 AND $3, R7, R1 165 BNE R1, bun2 166 167 ADDU $15,R5, R3 168b3: 169 SGTU R7,R3, R1 170 BEQ R1, b4 171 MOVW -4(R7), R8 172 MOVW -8(R7), R9 173 MOVW R8, -4(R6) 174 MOVW -12(R7), R8 175 MOVW R9, -8(R6) 176 MOVW -16(R7), R9 177 ADDU $-16, R7 178 MOVW R8, -12(R6) 179 MOVW R9, -16(R6) 180 ADDU $-16, R6 181 JMP b3 182b4: 183 ADDU $3,R5, R3 184b5: 185 SGTU R7,R3, R1 186 BEQ R1, bout 187 MOVW -4(R7), R8 188 ADDU $-4, R7 189 MOVW R8, -4(R6) 190 ADDU $-4, R6 191 JMP b5 192 193bun2: 194 ADDU $15,R5, R3 195bun3: 196 SGTU R7,R3, R1 197 BEQ R1, bun4 198 MOVWL -4(R7), R8 199 MOVWR -1(R7), R8 200 MOVWL -8(R7), R9 201 MOVWR -5(R7), R9 202 MOVW R8, -4(R6) 203 MOVWL -12(R7), R8 204 MOVWR -9(R7), R8 205 MOVW R9, -8(R6) 206 MOVWL -16(R7), R9 207 MOVWR -13(R7), R9 208 ADDU $-16, R7 209 MOVW R8, -12(R6) 210 MOVW R9, -16(R6) 211 ADDU $-16, R6 212 JMP bun3 213 214bun4: 215 ADDU $3,R5, R3 216bun5: 217 SGTU R7,R3, R1 218 BEQ R1, bout 219 MOVWL -4(R7), R8 220 MOVWR -1(R7), R8 221 ADDU $-4, R7 222 MOVW R8, -4(R6) 223 ADDU $-4, R6 224 JMP bun5 225 226bout: 227 BEQ R7,R5, ret 228 MOVB -1(R7), R8 229 ADDU $-1, R7 230 MOVB R8, -1(R6) 231 ADDU $-1, R6 232 JMP bout 233 234ret: 235 MOVW s1+0(FP), R1 236 RET 237 END 238