13e12c5d1SDavid du Colombier TEXT memmove(SB), $0 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier JMP move 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier TEXT memcpy(SB), $0 63e12c5d1SDavid du Colombiermove: 73e12c5d1SDavid du Colombier MOVW R1, s1+0(FP) 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier MOVW n+8(FP), R3 /* R3 is count */ 103e12c5d1SDavid du Colombier MOVW R1, R4 /* R4 is to-pointer */ 113e12c5d1SDavid du Colombier SGT R0, R3, R5 123e12c5d1SDavid du Colombier BEQ R5, ok 133e12c5d1SDavid du Colombier MOVW (R0), R0 /* abort if negative count */ 143e12c5d1SDavid du Colombierok: 153e12c5d1SDavid du Colombier MOVW s2+4(FP), R5 /* R5 is from-pointer */ 163e12c5d1SDavid du Colombier ADDU R3,R5, R7 /* R7 is end from-pointer */ 173e12c5d1SDavid du Colombier ADDU R3,R4, R6 /* R6 is end to-pointer */ 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier/* 203e12c5d1SDavid du Colombier * easiest test is copy backwards if 213e12c5d1SDavid du Colombier * destination string has higher mem address 223e12c5d1SDavid du Colombier */ 233e12c5d1SDavid du Colombier SGT $4,R3, R2 243e12c5d1SDavid du Colombier SGTU R4,R5, R1 253e12c5d1SDavid du Colombier BNE R1, back 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier/* 283e12c5d1SDavid du Colombier * if not at least 4 chars, 29*219b2ee8SDavid du Colombier * don't even mess around. 303e12c5d1SDavid du Colombier * 3 chars to guarantee any 313e12c5d1SDavid du Colombier * rounding up to a word 323e12c5d1SDavid du Colombier * boundary and 4 characters 333e12c5d1SDavid du Colombier * to get at least maybe one 343e12c5d1SDavid du Colombier * full word store. 353e12c5d1SDavid du Colombier */ 363e12c5d1SDavid du Colombier BNE R2, fout 373e12c5d1SDavid du Colombier 383e12c5d1SDavid du Colombier 393e12c5d1SDavid du Colombier/* 40*219b2ee8SDavid du Colombier * byte at a time to word align destination 413e12c5d1SDavid du Colombier */ 423e12c5d1SDavid du Colombierf1: 433e12c5d1SDavid du Colombier AND $3,R4, R1 443e12c5d1SDavid du Colombier BEQ R1, f2 453e12c5d1SDavid du Colombier MOVB 0(R5), R8 463e12c5d1SDavid du Colombier ADDU $1, R5 473e12c5d1SDavid du Colombier MOVB R8, 0(R4) 483e12c5d1SDavid du Colombier ADDU $1, R4 493e12c5d1SDavid du Colombier JMP f1 503e12c5d1SDavid du Colombier 513e12c5d1SDavid du Colombier/* 52*219b2ee8SDavid du Colombier * test if source is now word aligned 53*219b2ee8SDavid du Colombier */ 54*219b2ee8SDavid du Colombierf2: 55*219b2ee8SDavid du Colombier AND $3, R5, R1 56*219b2ee8SDavid du Colombier BNE R1, fun2 57*219b2ee8SDavid du Colombier/* 583e12c5d1SDavid du Colombier * turn R3 into to-end pointer-15 593e12c5d1SDavid du Colombier * copy 16 at a time while theres room. 603e12c5d1SDavid du Colombier * R6 is smaller than R7 -- 613e12c5d1SDavid du Colombier * there are problems if R7 is 0. 623e12c5d1SDavid du Colombier */ 633e12c5d1SDavid du Colombier ADDU $-15,R6, R3 643e12c5d1SDavid du Colombierf3: 653e12c5d1SDavid du Colombier SGTU R3,R4, R1 663e12c5d1SDavid du Colombier BEQ R1, f4 673e12c5d1SDavid du Colombier MOVW 0(R5), R8 683e12c5d1SDavid du Colombier MOVW 4(R5), R9 693e12c5d1SDavid du Colombier MOVW R8, 0(R4) 703e12c5d1SDavid du Colombier MOVW 8(R5), R8 713e12c5d1SDavid du Colombier MOVW R9, 4(R4) 723e12c5d1SDavid du Colombier MOVW 12(R5), R9 733e12c5d1SDavid du Colombier ADDU $16, R5 743e12c5d1SDavid du Colombier MOVW R8, 8(R4) 753e12c5d1SDavid du Colombier MOVW R9, 12(R4) 763e12c5d1SDavid du Colombier ADDU $16, R4 773e12c5d1SDavid du Colombier JMP f3 783e12c5d1SDavid du Colombier 793e12c5d1SDavid du Colombier/* 803e12c5d1SDavid du Colombier * turn R3 into to-end pointer-3 813e12c5d1SDavid du Colombier * copy 4 at a time while theres room 823e12c5d1SDavid du Colombier */ 833e12c5d1SDavid du Colombierf4: 843e12c5d1SDavid du Colombier ADDU $-3,R6, R3 853e12c5d1SDavid du Colombierf5: 863e12c5d1SDavid du Colombier SGTU R3,R4, R1 873e12c5d1SDavid du Colombier BEQ R1, fout 883e12c5d1SDavid du Colombier MOVW 0(R5), R8 893e12c5d1SDavid du Colombier ADDU $4, R5 903e12c5d1SDavid du Colombier MOVW R8, 0(R4) 913e12c5d1SDavid du Colombier ADDU $4, R4 923e12c5d1SDavid du Colombier JMP f5 933e12c5d1SDavid du Colombier 943e12c5d1SDavid du Colombier/* 95*219b2ee8SDavid du Colombier * forward copy, unaligned 96*219b2ee8SDavid du Colombier * turn R3 into to-end pointer-15 97*219b2ee8SDavid du Colombier * copy 16 at a time while theres room. 98*219b2ee8SDavid du Colombier * R6 is smaller than R7 -- 99*219b2ee8SDavid du Colombier * there are problems if R7 is 0. 100*219b2ee8SDavid du Colombier */ 101*219b2ee8SDavid du Colombierfun2: 102*219b2ee8SDavid du Colombier ADDU $-15,R6, R3 103*219b2ee8SDavid du Colombierfun3: 104*219b2ee8SDavid du Colombier SGTU R3,R4, R1 105*219b2ee8SDavid du Colombier BEQ R1, fun4 106*219b2ee8SDavid du Colombier MOVWL 0(R5), R8 107*219b2ee8SDavid du Colombier MOVWR 3(R5), R8 108*219b2ee8SDavid du Colombier MOVWL 4(R5), R9 109*219b2ee8SDavid du Colombier MOVWR 7(R5), R9 110*219b2ee8SDavid du Colombier MOVW R8, 0(R4) 111*219b2ee8SDavid du Colombier MOVWL 8(R5), R8 112*219b2ee8SDavid du Colombier MOVWR 11(R5), R8 113*219b2ee8SDavid du Colombier MOVW R9, 4(R4) 114*219b2ee8SDavid du Colombier MOVWL 12(R5), R9 115*219b2ee8SDavid du Colombier MOVWR 15(R5), R9 116*219b2ee8SDavid du Colombier ADDU $16, R5 117*219b2ee8SDavid du Colombier MOVW R8, 8(R4) 118*219b2ee8SDavid du Colombier MOVW R9, 12(R4) 119*219b2ee8SDavid du Colombier ADDU $16, R4 120*219b2ee8SDavid du Colombier JMP fun3 121*219b2ee8SDavid du Colombier 122*219b2ee8SDavid du Colombier/* 123*219b2ee8SDavid du Colombier * turn R3 into to-end pointer-3 124*219b2ee8SDavid du Colombier * copy 4 at a time while theres room 125*219b2ee8SDavid du Colombier */ 126*219b2ee8SDavid du Colombierfun4: 127*219b2ee8SDavid du Colombier ADDU $-3,R6, R3 128*219b2ee8SDavid du Colombierfun5: 129*219b2ee8SDavid du Colombier SGTU R3,R4, R1 130*219b2ee8SDavid du Colombier BEQ R1, fout 131*219b2ee8SDavid du Colombier MOVWL 0(R5), R8 132*219b2ee8SDavid du Colombier MOVWR 3(R5), R8 133*219b2ee8SDavid du Colombier ADDU $4, R5 134*219b2ee8SDavid du Colombier MOVW R8, 0(R4) 135*219b2ee8SDavid du Colombier ADDU $4, R4 136*219b2ee8SDavid du Colombier JMP fun5 137*219b2ee8SDavid du Colombier 138*219b2ee8SDavid du Colombier/* 1393e12c5d1SDavid du Colombier * last loop, copy byte at a time 1403e12c5d1SDavid du Colombier */ 1413e12c5d1SDavid du Colombierfout: 1423e12c5d1SDavid du Colombier BEQ R7,R5, ret 1433e12c5d1SDavid du Colombier MOVB 0(R5), R8 1443e12c5d1SDavid du Colombier ADDU $1, R5 1453e12c5d1SDavid du Colombier MOVB R8, 0(R4) 1463e12c5d1SDavid du Colombier ADDU $1, R4 1473e12c5d1SDavid du Colombier JMP fout 1483e12c5d1SDavid du Colombier 1493e12c5d1SDavid du Colombier/* 1503e12c5d1SDavid du Colombier * whole thing repeated for backwards 1513e12c5d1SDavid du Colombier */ 1523e12c5d1SDavid du Colombierback: 1533e12c5d1SDavid du Colombier BNE R2, bout 1543e12c5d1SDavid du Colombierb1: 155*219b2ee8SDavid du Colombier AND $3,R6, R1 1563e12c5d1SDavid du Colombier BEQ R1, b2 1573e12c5d1SDavid du Colombier MOVB -1(R7), R8 1583e12c5d1SDavid du Colombier ADDU $-1, R7 1593e12c5d1SDavid du Colombier MOVB R8, -1(R6) 1603e12c5d1SDavid du Colombier ADDU $-1, R6 1613e12c5d1SDavid du Colombier JMP b1 162*219b2ee8SDavid du Colombier 1633e12c5d1SDavid du Colombierb2: 164*219b2ee8SDavid du Colombier AND $3, R7, R1 165*219b2ee8SDavid du Colombier BNE R1, bun2 166*219b2ee8SDavid du Colombier 1673e12c5d1SDavid du Colombier ADDU $15,R5, R3 1683e12c5d1SDavid du Colombierb3: 1693e12c5d1SDavid du Colombier SGTU R7,R3, R1 1703e12c5d1SDavid du Colombier BEQ R1, b4 1713e12c5d1SDavid du Colombier MOVW -4(R7), R8 1723e12c5d1SDavid du Colombier MOVW -8(R7), R9 1733e12c5d1SDavid du Colombier MOVW R8, -4(R6) 1743e12c5d1SDavid du Colombier MOVW -12(R7), R8 1753e12c5d1SDavid du Colombier MOVW R9, -8(R6) 1763e12c5d1SDavid du Colombier MOVW -16(R7), R9 1773e12c5d1SDavid du Colombier ADDU $-16, R7 1783e12c5d1SDavid du Colombier MOVW R8, -12(R6) 1793e12c5d1SDavid du Colombier MOVW R9, -16(R6) 1803e12c5d1SDavid du Colombier ADDU $-16, R6 1813e12c5d1SDavid du Colombier JMP b3 1823e12c5d1SDavid du Colombierb4: 1833e12c5d1SDavid du Colombier ADDU $3,R5, R3 1843e12c5d1SDavid du Colombierb5: 1853e12c5d1SDavid du Colombier SGTU R7,R3, R1 1863e12c5d1SDavid du Colombier BEQ R1, bout 1873e12c5d1SDavid du Colombier MOVW -4(R7), R8 1883e12c5d1SDavid du Colombier ADDU $-4, R7 1893e12c5d1SDavid du Colombier MOVW R8, -4(R6) 1903e12c5d1SDavid du Colombier ADDU $-4, R6 1913e12c5d1SDavid du Colombier JMP b5 1923e12c5d1SDavid du Colombier 193*219b2ee8SDavid du Colombierbun2: 194*219b2ee8SDavid du Colombier ADDU $15,R5, R3 195*219b2ee8SDavid du Colombierbun3: 196*219b2ee8SDavid du Colombier SGTU R7,R3, R1 197*219b2ee8SDavid du Colombier BEQ R1, bun4 198*219b2ee8SDavid du Colombier MOVWL -4(R7), R8 199*219b2ee8SDavid du Colombier MOVWR -1(R7), R8 200*219b2ee8SDavid du Colombier MOVWL -8(R7), R9 201*219b2ee8SDavid du Colombier MOVWR -5(R7), R9 202*219b2ee8SDavid du Colombier MOVW R8, -4(R6) 203*219b2ee8SDavid du Colombier MOVWL -12(R7), R8 204*219b2ee8SDavid du Colombier MOVWR -9(R7), R8 205*219b2ee8SDavid du Colombier MOVW R9, -8(R6) 206*219b2ee8SDavid du Colombier MOVWL -16(R7), R9 207*219b2ee8SDavid du Colombier MOVWR -13(R7), R9 208*219b2ee8SDavid du Colombier ADDU $-16, R7 209*219b2ee8SDavid du Colombier MOVW R8, -12(R6) 210*219b2ee8SDavid du Colombier MOVW R9, -16(R6) 211*219b2ee8SDavid du Colombier ADDU $-16, R6 212*219b2ee8SDavid du Colombier JMP bun3 213*219b2ee8SDavid du Colombier 214*219b2ee8SDavid du Colombierbun4: 215*219b2ee8SDavid du Colombier ADDU $3,R5, R3 216*219b2ee8SDavid du Colombierbun5: 217*219b2ee8SDavid du Colombier SGTU R7,R3, R1 218*219b2ee8SDavid du Colombier BEQ R1, bout 219*219b2ee8SDavid du Colombier MOVWL -4(R7), R8 220*219b2ee8SDavid du Colombier MOVWR -1(R7), R8 221*219b2ee8SDavid du Colombier ADDU $-4, R7 222*219b2ee8SDavid du Colombier MOVW R8, -4(R6) 223*219b2ee8SDavid du Colombier ADDU $-4, R6 224*219b2ee8SDavid du Colombier JMP bun5 225*219b2ee8SDavid du Colombier 2263e12c5d1SDavid du Colombierbout: 2273e12c5d1SDavid du Colombier BEQ R7,R5, ret 2283e12c5d1SDavid du Colombier MOVB -1(R7), R8 2293e12c5d1SDavid du Colombier ADDU $-1, R7 2303e12c5d1SDavid du Colombier MOVB R8, -1(R6) 2313e12c5d1SDavid du Colombier ADDU $-1, R6 2323e12c5d1SDavid du Colombier JMP bout 2333e12c5d1SDavid du Colombier 2343e12c5d1SDavid du Colombierret: 2353e12c5d1SDavid du Colombier MOVW s1+0(FP), R1 2363e12c5d1SDavid du Colombier RET 2373e12c5d1SDavid du Colombier END 238