1 TEXT memmove(SB), $0 2 3 JMP move 4 5 TEXT memcpy(SB), $0 6move: 7 MOVV R1, s1+0(FP) 8 9 MOVW n+16(FP), R3 /* R3 is count */ 10 MOVV 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 MOVV s2+8(FP), R5 /* R5 is from-pointer */ 16 ADDVU R3,R5, R7 /* R7 is end from-pointer */ 17 ADDVU 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 ADDVU $1, R5 47 MOVB R8, 0(R4) 48 ADDVU $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 ADDVU $-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 ADDVU $16, R5 74 MOVW R8, 8(R4) 75 MOVW R9, 12(R4) 76 ADDVU $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 ADDVU $-3,R6, R3 85f5: 86 SGTU R3,R4, R1 87 BEQ R1, fout 88 MOVW 0(R5), R8 89 ADDVU $4, R5 90 MOVW R8, 0(R4) 91 ADDVU $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 ADDVU $-15,R6, R3 103fun3: 104 SGTU R3,R4, R1 105 BEQ R1, fun4 106 MOVWR 0(R5), R8 107 MOVWL 3(R5), R8 108 MOVWR 4(R5), R9 109 MOVWL 7(R5), R9 110 MOVW R8, 0(R4) 111 MOVWR 8(R5), R8 112 MOVWL 11(R5), R8 113 MOVW R9, 4(R4) 114 MOVWR 12(R5), R9 115 MOVWL 15(R5), R9 116 ADDVU $16, R5 117 MOVW R8, 8(R4) 118 MOVW R9, 12(R4) 119 ADDVU $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 ADDVU $-3,R6, R3 128fun5: 129 SGTU R3,R4, R1 130 BEQ R1, fout 131 MOVWR 0(R5), R8 132 MOVWL 3(R5), R8 133 ADDVU $4, R5 134 MOVW R8, 0(R4) 135 ADDVU $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 ADDVU $1, R5 145 MOVB R8, 0(R4) 146 ADDVU $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 ADDVU $-1, R7 159 MOVB R8, -1(R6) 160 ADDVU $-1, R6 161 JMP b1 162 163b2: 164 AND $3, R7, R1 165 BNE R1, bun2 166 167 ADDVU $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 ADDVU $-16, R7 178 MOVW R8, -12(R6) 179 MOVW R9, -16(R6) 180 ADDVU $-16, R6 181 JMP b3 182b4: 183 ADDVU $3,R5, R3 184b5: 185 SGTU R7,R3, R1 186 BEQ R1, bout 187 MOVW -4(R7), R8 188 ADDVU $-4, R7 189 MOVW R8, -4(R6) 190 ADDVU $-4, R6 191 JMP b5 192 193bun2: 194 ADDVU $15,R5, R3 195bun3: 196 SGTU R7,R3, R1 197 BEQ R1, bun4 198 MOVWR -4(R7), R8 199 MOVWL -1(R7), R8 200 MOVWR -8(R7), R9 201 MOVWL -5(R7), R9 202 MOVW R8, -4(R6) 203 MOVWR -12(R7), R8 204 MOVWL -9(R7), R8 205 MOVW R9, -8(R6) 206 MOVWR -16(R7), R9 207 MOVWL -13(R7), R9 208 ADDVU $-16, R7 209 MOVW R8, -12(R6) 210 MOVW R9, -16(R6) 211 ADDVU $-16, R6 212 JMP bun3 213 214bun4: 215 ADDVU $3,R5, R3 216bun5: 217 SGTU R7,R3, R1 218 BEQ R1, bout 219 MOVWR -4(R7), R8 220 MOVWL -1(R7), R8 221 ADDVU $-4, R7 222 MOVW R8, -4(R6) 223 ADDVU $-4, R6 224 JMP bun5 225 226bout: 227 BEQ R7,R5, ret 228 MOVB -1(R7), R8 229 ADDVU $-1, R7 230 MOVB R8, -1(R6) 231 ADDVU $-1, R6 232 JMP bout 233 234ret: 235 MOVV s1+0(FP), R1 236 RET 237 END 238