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 * test if both pointers 40*12b1df16SDavid du Colombier * are similarly word aligned 41*12b1df16SDavid du Colombier */ 42*12b1df16SDavid du Colombier XOR R4,R5, R1 43*12b1df16SDavid du Colombier AND $3, R1 44*12b1df16SDavid du Colombier BNE R1, fout 45*12b1df16SDavid du Colombier 46*12b1df16SDavid du Colombier/* 47*12b1df16SDavid du Colombier * byte at a time to word align 48*12b1df16SDavid du Colombier */ 49*12b1df16SDavid du Colombierf1: 50*12b1df16SDavid du Colombier AND $3,R4, R1 51*12b1df16SDavid du Colombier BEQ R1, f2 52*12b1df16SDavid du Colombier MOVB 0(R5), R8 53*12b1df16SDavid du Colombier ADDU $1, R5 54*12b1df16SDavid du Colombier MOVB R8, 0(R4) 55*12b1df16SDavid du Colombier ADDU $1, R4 56*12b1df16SDavid du Colombier JMP f1 57*12b1df16SDavid du Colombier 58*12b1df16SDavid du Colombier/* 59*12b1df16SDavid du Colombier * turn R3 into to-end pointer-15 60*12b1df16SDavid du Colombier * copy 16 at a time while theres room. 61*12b1df16SDavid du Colombier * R6 is smaller than R7 -- 62*12b1df16SDavid du Colombier * there are problems if R7 is 0. 63*12b1df16SDavid du Colombier */ 64*12b1df16SDavid du Colombierf2: 65*12b1df16SDavid du Colombier ADDU $-15,R6, R3 66*12b1df16SDavid du Colombierf3: 67*12b1df16SDavid du Colombier SGTU R3,R4, R1 68*12b1df16SDavid du Colombier BEQ R1, f4 69*12b1df16SDavid du Colombier MOVW 0(R5), R8 70*12b1df16SDavid du Colombier MOVW 4(R5), R9 71*12b1df16SDavid du Colombier MOVW R8, 0(R4) 72*12b1df16SDavid du Colombier MOVW 8(R5), R8 73*12b1df16SDavid du Colombier MOVW R9, 4(R4) 74*12b1df16SDavid du Colombier MOVW 12(R5), R9 75*12b1df16SDavid du Colombier ADDU $16, R5 76*12b1df16SDavid du Colombier MOVW R8, 8(R4) 77*12b1df16SDavid du Colombier MOVW R9, 12(R4) 78*12b1df16SDavid du Colombier ADDU $16, R4 79*12b1df16SDavid du Colombier JMP f3 80*12b1df16SDavid du Colombier 81*12b1df16SDavid du Colombier/* 82*12b1df16SDavid du Colombier * turn R3 into to-end pointer-3 83*12b1df16SDavid du Colombier * copy 4 at a time while theres room 84*12b1df16SDavid du Colombier */ 85*12b1df16SDavid du Colombierf4: 86*12b1df16SDavid du Colombier ADDU $-3,R6, R3 87*12b1df16SDavid du Colombierf5: 88*12b1df16SDavid du Colombier SGTU R3,R4, R1 89*12b1df16SDavid du Colombier BEQ R1, fout 90*12b1df16SDavid du Colombier MOVW 0(R5), R8 91*12b1df16SDavid du Colombier ADDU $4, R5 92*12b1df16SDavid du Colombier MOVW R8, 0(R4) 93*12b1df16SDavid du Colombier ADDU $4, R4 94*12b1df16SDavid du Colombier JMP f5 95*12b1df16SDavid du Colombier 96*12b1df16SDavid du Colombier/* 97*12b1df16SDavid du Colombier * last loop, copy byte at a time 98*12b1df16SDavid du Colombier */ 99*12b1df16SDavid du Colombierfout: 100*12b1df16SDavid du Colombier BEQ R7,R5, ret 101*12b1df16SDavid du Colombier MOVB 0(R5), R8 102*12b1df16SDavid du Colombier ADDU $1, R5 103*12b1df16SDavid du Colombier MOVB R8, 0(R4) 104*12b1df16SDavid du Colombier ADDU $1, R4 105*12b1df16SDavid du Colombier JMP fout 106*12b1df16SDavid du Colombier 107*12b1df16SDavid du Colombier/* 108*12b1df16SDavid du Colombier * whole thing repeated for backwards 109*12b1df16SDavid du Colombier */ 110*12b1df16SDavid du Colombierback: 111*12b1df16SDavid du Colombier BNE R2, bout 112*12b1df16SDavid du Colombier XOR R6,R7, R1 113*12b1df16SDavid du Colombier AND $3, R1 114*12b1df16SDavid du Colombier BNE R1, bout 115*12b1df16SDavid du Colombierb1: 116*12b1df16SDavid du Colombier AND $3,R7, R1 117*12b1df16SDavid du Colombier BEQ R1, b2 118*12b1df16SDavid du Colombier MOVB -1(R7), R8 119*12b1df16SDavid du Colombier ADDU $-1, R7 120*12b1df16SDavid du Colombier MOVB R8, -1(R6) 121*12b1df16SDavid du Colombier ADDU $-1, R6 122*12b1df16SDavid du Colombier JMP b1 123*12b1df16SDavid du Colombierb2: 124*12b1df16SDavid du Colombier ADDU $15,R5, R3 125*12b1df16SDavid du Colombierb3: 126*12b1df16SDavid du Colombier SGTU R7,R3, R1 127*12b1df16SDavid du Colombier BEQ R1, b4 128*12b1df16SDavid du Colombier MOVW -4(R7), R8 129*12b1df16SDavid du Colombier MOVW -8(R7), R9 130*12b1df16SDavid du Colombier MOVW R8, -4(R6) 131*12b1df16SDavid du Colombier MOVW -12(R7), R8 132*12b1df16SDavid du Colombier MOVW R9, -8(R6) 133*12b1df16SDavid du Colombier MOVW -16(R7), R9 134*12b1df16SDavid du Colombier ADDU $-16, R7 135*12b1df16SDavid du Colombier MOVW R8, -12(R6) 136*12b1df16SDavid du Colombier MOVW R9, -16(R6) 137*12b1df16SDavid du Colombier ADDU $-16, R6 138*12b1df16SDavid du Colombier JMP b3 139*12b1df16SDavid du Colombierb4: 140*12b1df16SDavid du Colombier ADDU $3,R5, R3 141*12b1df16SDavid du Colombierb5: 142*12b1df16SDavid du Colombier SGTU R7,R3, R1 143*12b1df16SDavid du Colombier BEQ R1, bout 144*12b1df16SDavid du Colombier MOVW -4(R7), R8 145*12b1df16SDavid du Colombier ADDU $-4, R7 146*12b1df16SDavid du Colombier MOVW R8, -4(R6) 147*12b1df16SDavid du Colombier ADDU $-4, R6 148*12b1df16SDavid du Colombier JMP b5 149*12b1df16SDavid du Colombier 150*12b1df16SDavid du Colombierbout: 151*12b1df16SDavid du Colombier BEQ R7,R5, ret 152*12b1df16SDavid du Colombier MOVB -1(R7), R8 153*12b1df16SDavid du Colombier ADDU $-1, R7 154*12b1df16SDavid du Colombier MOVB R8, -1(R6) 155*12b1df16SDavid du Colombier ADDU $-1, R6 156*12b1df16SDavid du Colombier JMP bout 157*12b1df16SDavid du Colombier 158*12b1df16SDavid du Colombierret: 159*12b1df16SDavid du Colombier MOVW s1+0(FP), R1 160*12b1df16SDavid du Colombier RET 161*12b1df16SDavid du Colombier END 162