1*12b1df16SDavid du Colombier TEXT memmove(SB), $0 2*12b1df16SDavid du Colombier 3*12b1df16SDavid du Colombier JMP move 4*12b1df16SDavid du Colombier 5*12b1df16SDavid du Colombier TEXT memcpy(SB), $0 6*12b1df16SDavid du Colombiermove: 7*12b1df16SDavid du Colombier MOVW R1, s1+0(FP) 8*12b1df16SDavid du Colombier 9*12b1df16SDavid du Colombier MOVW n+8(FP), R3 /* R3 is count */ 10*12b1df16SDavid du Colombier MOVW R1, R4 /* R4 is to-pointer */ 11*12b1df16SDavid du Colombier SGT R0, R3, R5 12*12b1df16SDavid du Colombier BEQ R5, ok 13*12b1df16SDavid du Colombier MOVW (R0), R0 /* abort if negative count */ 14*12b1df16SDavid du Colombierok: 15*12b1df16SDavid du Colombier MOVW s2+4(FP), R5 /* R5 is from-pointer */ 16*12b1df16SDavid du Colombier ADDU R3,R5, R7 /* R7 is end from-pointer */ 17*12b1df16SDavid du Colombier ADDU R3,R4, R6 /* R6 is end to-pointer */ 18*12b1df16SDavid du Colombier 19*12b1df16SDavid du Colombier/* 20*12b1df16SDavid du Colombier * easiest test is copy backwards if 21*12b1df16SDavid du Colombier * destination string has higher mem address 22*12b1df16SDavid du Colombier */ 23*12b1df16SDavid du Colombier SGT $4,R3, R2 24*12b1df16SDavid du Colombier SGTU R4,R5, R1 25*12b1df16SDavid du Colombier BNE R1, back 26*12b1df16SDavid du Colombier 27*12b1df16SDavid du Colombier/* 28*12b1df16SDavid du Colombier * if not at least 4 chars, 29*12b1df16SDavid du Colombier * don't even mess around. 30*12b1df16SDavid du Colombier * 3 chars to guarantee any 31*12b1df16SDavid du Colombier * rounding up to a word 32*12b1df16SDavid du Colombier * boundary and 4 characters 33*12b1df16SDavid du Colombier * to get at least maybe one 34*12b1df16SDavid du Colombier * full word store. 35*12b1df16SDavid du Colombier */ 36*12b1df16SDavid du Colombier BNE R2, fout 37*12b1df16SDavid du Colombier 38*12b1df16SDavid du Colombier 39*12b1df16SDavid du Colombier/* 40*12b1df16SDavid du Colombier * byte at a time to word align destination 41*12b1df16SDavid du Colombier */ 42*12b1df16SDavid du Colombierf1: 43*12b1df16SDavid du Colombier AND $3,R4, R1 44*12b1df16SDavid du Colombier BEQ R1, f2 45*12b1df16SDavid du Colombier MOVB 0(R5), R8 46*12b1df16SDavid du Colombier ADDU $1, R5 47*12b1df16SDavid du Colombier MOVB R8, 0(R4) 48*12b1df16SDavid du Colombier ADDU $1, R4 49*12b1df16SDavid du Colombier JMP f1 50*12b1df16SDavid du Colombier 51*12b1df16SDavid du Colombier/* 52*12b1df16SDavid du Colombier * test if source is now word aligned 53*12b1df16SDavid du Colombier */ 54*12b1df16SDavid du Colombierf2: 55*12b1df16SDavid du Colombier AND $3, R5, R1 56*12b1df16SDavid du Colombier BNE R1, fun2 57*12b1df16SDavid du Colombier/* 58*12b1df16SDavid du Colombier * turn R3 into to-end pointer-15 59*12b1df16SDavid du Colombier * copy 16 at a time while theres room. 60*12b1df16SDavid du Colombier * R6 is smaller than R7 -- 61*12b1df16SDavid du Colombier * there are problems if R7 is 0. 62*12b1df16SDavid du Colombier */ 63*12b1df16SDavid du Colombier ADDU $-15,R6, R3 64*12b1df16SDavid du Colombierf3: 65*12b1df16SDavid du Colombier SGTU R3,R4, R1 66*12b1df16SDavid du Colombier BEQ R1, f4 67*12b1df16SDavid du Colombier MOVW 0(R5), R8 68*12b1df16SDavid du Colombier MOVW 4(R5), R9 69*12b1df16SDavid du Colombier MOVW R8, 0(R4) 70*12b1df16SDavid du Colombier MOVW 8(R5), R8 71*12b1df16SDavid du Colombier MOVW R9, 4(R4) 72*12b1df16SDavid du Colombier MOVW 12(R5), R9 73*12b1df16SDavid du Colombier ADDU $16, R5 74*12b1df16SDavid du Colombier MOVW R8, 8(R4) 75*12b1df16SDavid du Colombier MOVW R9, 12(R4) 76*12b1df16SDavid du Colombier ADDU $16, R4 77*12b1df16SDavid du Colombier JMP f3 78*12b1df16SDavid du Colombier 79*12b1df16SDavid du Colombier/* 80*12b1df16SDavid du Colombier * turn R3 into to-end pointer-3 81*12b1df16SDavid du Colombier * copy 4 at a time while theres room 82*12b1df16SDavid du Colombier */ 83*12b1df16SDavid du Colombierf4: 84*12b1df16SDavid du Colombier ADDU $-3,R6, R3 85*12b1df16SDavid du Colombierf5: 86*12b1df16SDavid du Colombier SGTU R3,R4, R1 87*12b1df16SDavid du Colombier BEQ R1, fout 88*12b1df16SDavid du Colombier MOVW 0(R5), R8 89*12b1df16SDavid du Colombier ADDU $4, R5 90*12b1df16SDavid du Colombier MOVW R8, 0(R4) 91*12b1df16SDavid du Colombier ADDU $4, R4 92*12b1df16SDavid du Colombier JMP f5 93*12b1df16SDavid du Colombier 94*12b1df16SDavid du Colombier/* 95*12b1df16SDavid du Colombier * forward copy, unaligned 96*12b1df16SDavid du Colombier * turn R3 into to-end pointer-15 97*12b1df16SDavid du Colombier * copy 16 at a time while theres room. 98*12b1df16SDavid du Colombier * R6 is smaller than R7 -- 99*12b1df16SDavid du Colombier * there are problems if R7 is 0. 100*12b1df16SDavid du Colombier */ 101*12b1df16SDavid du Colombierfun2: 102*12b1df16SDavid du Colombier ADDU $-15,R6, R3 103*12b1df16SDavid du Colombierfun3: 104*12b1df16SDavid du Colombier SGTU R3,R4, R1 105*12b1df16SDavid du Colombier BEQ R1, fun4 106*12b1df16SDavid du Colombier MOVWR 0(R5), R8 107*12b1df16SDavid du Colombier MOVWL 3(R5), R8 108*12b1df16SDavid du Colombier MOVWR 4(R5), R9 109*12b1df16SDavid du Colombier MOVWL 7(R5), R9 110*12b1df16SDavid du Colombier MOVW R8, 0(R4) 111*12b1df16SDavid du Colombier MOVWR 8(R5), R8 112*12b1df16SDavid du Colombier MOVWL 11(R5), R8 113*12b1df16SDavid du Colombier MOVW R9, 4(R4) 114*12b1df16SDavid du Colombier MOVWR 12(R5), R9 115*12b1df16SDavid du Colombier MOVWL 15(R5), R9 116*12b1df16SDavid du Colombier ADDU $16, R5 117*12b1df16SDavid du Colombier MOVW R8, 8(R4) 118*12b1df16SDavid du Colombier MOVW R9, 12(R4) 119*12b1df16SDavid du Colombier ADDU $16, R4 120*12b1df16SDavid du Colombier JMP fun3 121*12b1df16SDavid du Colombier 122*12b1df16SDavid du Colombier/* 123*12b1df16SDavid du Colombier * turn R3 into to-end pointer-3 124*12b1df16SDavid du Colombier * copy 4 at a time while theres room 125*12b1df16SDavid du Colombier */ 126*12b1df16SDavid du Colombierfun4: 127*12b1df16SDavid du Colombier ADDU $-3,R6, R3 128*12b1df16SDavid du Colombierfun5: 129*12b1df16SDavid du Colombier SGTU R3,R4, R1 130*12b1df16SDavid du Colombier BEQ R1, fout 131*12b1df16SDavid du Colombier MOVWR 0(R5), R8 132*12b1df16SDavid du Colombier MOVWL 3(R5), R8 133*12b1df16SDavid du Colombier ADDU $4, R5 134*12b1df16SDavid du Colombier MOVW R8, 0(R4) 135*12b1df16SDavid du Colombier ADDU $4, R4 136*12b1df16SDavid du Colombier JMP fun5 137*12b1df16SDavid du Colombier 138*12b1df16SDavid du Colombier/* 139*12b1df16SDavid du Colombier * last loop, copy byte at a time 140*12b1df16SDavid du Colombier */ 141*12b1df16SDavid du Colombierfout: 142*12b1df16SDavid du Colombier BEQ R7,R5, ret 143*12b1df16SDavid du Colombier MOVB 0(R5), R8 144*12b1df16SDavid du Colombier ADDU $1, R5 145*12b1df16SDavid du Colombier MOVB R8, 0(R4) 146*12b1df16SDavid du Colombier ADDU $1, R4 147*12b1df16SDavid du Colombier JMP fout 148*12b1df16SDavid du Colombier 149*12b1df16SDavid du Colombier/* 150*12b1df16SDavid du Colombier * whole thing repeated for backwards 151*12b1df16SDavid du Colombier */ 152*12b1df16SDavid du Colombierback: 153*12b1df16SDavid du Colombier BNE R2, bout 154*12b1df16SDavid du Colombierb1: 155*12b1df16SDavid du Colombier AND $3,R6, R1 156*12b1df16SDavid du Colombier BEQ R1, b2 157*12b1df16SDavid du Colombier MOVB -1(R7), R8 158*12b1df16SDavid du Colombier ADDU $-1, R7 159*12b1df16SDavid du Colombier MOVB R8, -1(R6) 160*12b1df16SDavid du Colombier ADDU $-1, R6 161*12b1df16SDavid du Colombier JMP b1 162*12b1df16SDavid du Colombier 163*12b1df16SDavid du Colombierb2: 164*12b1df16SDavid du Colombier AND $3, R7, R1 165*12b1df16SDavid du Colombier BNE R1, bun2 166*12b1df16SDavid du Colombier 167*12b1df16SDavid du Colombier ADDU $15,R5, R3 168*12b1df16SDavid du Colombierb3: 169*12b1df16SDavid du Colombier SGTU R7,R3, R1 170*12b1df16SDavid du Colombier BEQ R1, b4 171*12b1df16SDavid du Colombier MOVW -4(R7), R8 172*12b1df16SDavid du Colombier MOVW -8(R7), R9 173*12b1df16SDavid du Colombier MOVW R8, -4(R6) 174*12b1df16SDavid du Colombier MOVW -12(R7), R8 175*12b1df16SDavid du Colombier MOVW R9, -8(R6) 176*12b1df16SDavid du Colombier MOVW -16(R7), R9 177*12b1df16SDavid du Colombier ADDU $-16, R7 178*12b1df16SDavid du Colombier MOVW R8, -12(R6) 179*12b1df16SDavid du Colombier MOVW R9, -16(R6) 180*12b1df16SDavid du Colombier ADDU $-16, R6 181*12b1df16SDavid du Colombier JMP b3 182*12b1df16SDavid du Colombierb4: 183*12b1df16SDavid du Colombier ADDU $3,R5, R3 184*12b1df16SDavid du Colombierb5: 185*12b1df16SDavid du Colombier SGTU R7,R3, R1 186*12b1df16SDavid du Colombier BEQ R1, bout 187*12b1df16SDavid du Colombier MOVW -4(R7), R8 188*12b1df16SDavid du Colombier ADDU $-4, R7 189*12b1df16SDavid du Colombier MOVW R8, -4(R6) 190*12b1df16SDavid du Colombier ADDU $-4, R6 191*12b1df16SDavid du Colombier JMP b5 192*12b1df16SDavid du Colombier 193*12b1df16SDavid du Colombierbun2: 194*12b1df16SDavid du Colombier ADDU $15,R5, R3 195*12b1df16SDavid du Colombierbun3: 196*12b1df16SDavid du Colombier SGTU R7,R3, R1 197*12b1df16SDavid du Colombier BEQ R1, bun4 198*12b1df16SDavid du Colombier MOVWR -4(R7), R8 199*12b1df16SDavid du Colombier MOVWL -1(R7), R8 200*12b1df16SDavid du Colombier MOVWR -8(R7), R9 201*12b1df16SDavid du Colombier MOVWL -5(R7), R9 202*12b1df16SDavid du Colombier MOVW R8, -4(R6) 203*12b1df16SDavid du Colombier MOVWR -12(R7), R8 204*12b1df16SDavid du Colombier MOVWL -9(R7), R8 205*12b1df16SDavid du Colombier MOVW R9, -8(R6) 206*12b1df16SDavid du Colombier MOVWR -16(R7), R9 207*12b1df16SDavid du Colombier MOVWL -13(R7), R9 208*12b1df16SDavid du Colombier ADDU $-16, R7 209*12b1df16SDavid du Colombier MOVW R8, -12(R6) 210*12b1df16SDavid du Colombier MOVW R9, -16(R6) 211*12b1df16SDavid du Colombier ADDU $-16, R6 212*12b1df16SDavid du Colombier JMP bun3 213*12b1df16SDavid du Colombier 214*12b1df16SDavid du Colombierbun4: 215*12b1df16SDavid du Colombier ADDU $3,R5, R3 216*12b1df16SDavid du Colombierbun5: 217*12b1df16SDavid du Colombier SGTU R7,R3, R1 218*12b1df16SDavid du Colombier BEQ R1, bout 219*12b1df16SDavid du Colombier MOVWR -4(R7), R8 220*12b1df16SDavid du Colombier MOVWL -1(R7), R8 221*12b1df16SDavid du Colombier ADDU $-4, R7 222*12b1df16SDavid du Colombier MOVW R8, -4(R6) 223*12b1df16SDavid du Colombier ADDU $-4, R6 224*12b1df16SDavid du Colombier JMP bun5 225*12b1df16SDavid du Colombier 226*12b1df16SDavid du Colombierbout: 227*12b1df16SDavid du Colombier BEQ R7,R5, ret 228*12b1df16SDavid du Colombier MOVB -1(R7), R8 229*12b1df16SDavid du Colombier ADDU $-1, R7 230*12b1df16SDavid du Colombier MOVB R8, -1(R6) 231*12b1df16SDavid du Colombier ADDU $-1, R6 232*12b1df16SDavid du Colombier JMP bout 233*12b1df16SDavid du Colombier 234*12b1df16SDavid du Colombierret: 235*12b1df16SDavid du Colombier MOVW s1+0(FP), R1 236*12b1df16SDavid du Colombier RET 237*12b1df16SDavid du Colombier END 238