1*3e12c5d1SDavid du Colombier TEXT memmove(SB), $0 2*3e12c5d1SDavid du Colombier JMP move 3*3e12c5d1SDavid du Colombier 4*3e12c5d1SDavid du Colombier TEXT memcpy(SB), $0 5*3e12c5d1SDavid du Colombiermove: 6*3e12c5d1SDavid du Colombier 7*3e12c5d1SDavid du Colombier/* 8*3e12c5d1SDavid du Colombier * performance: 9*3e12c5d1SDavid du Colombier * (tba) 10*3e12c5d1SDavid du Colombier */ 11*3e12c5d1SDavid du Colombier 12*3e12c5d1SDavid du Colombier MOVW R7, s1+0(FP) 13*3e12c5d1SDavid du Colombier MOVW n+8(FP), R9 /* R9 is count */ 14*3e12c5d1SDavid du Colombier MOVW R7, R10 /* R10 is to-pointer */ 15*3e12c5d1SDavid du Colombier SUBCC R0,R9, R0 16*3e12c5d1SDavid du Colombier BGE ok 17*3e12c5d1SDavid du Colombier MOVW 0(R0), R0 18*3e12c5d1SDavid du Colombier 19*3e12c5d1SDavid du Colombierok: 20*3e12c5d1SDavid du Colombier MOVW s2+4(FP), R11 /* R11 is from-pointer */ 21*3e12c5d1SDavid du Colombier ADD R9,R11, R13 /* R13 is end from-pointer */ 22*3e12c5d1SDavid du Colombier ADD R9,R10, R12 /* R12 is end to-pointer */ 23*3e12c5d1SDavid du Colombier 24*3e12c5d1SDavid du Colombier/* 25*3e12c5d1SDavid du Colombier * easiest test is copy backwards if 26*3e12c5d1SDavid du Colombier * destination string has higher mem address 27*3e12c5d1SDavid du Colombier */ 28*3e12c5d1SDavid du Colombier SUBCC R11,R10, R0 29*3e12c5d1SDavid du Colombier BGU back 30*3e12c5d1SDavid du Colombier 31*3e12c5d1SDavid du Colombier/* 32*3e12c5d1SDavid du Colombier * if not at least 8 chars, 33*3e12c5d1SDavid du Colombier * dont even mess around. 34*3e12c5d1SDavid du Colombier * 7 chars to guarantee any 35*3e12c5d1SDavid du Colombier * rounding up to a word 36*3e12c5d1SDavid du Colombier * boundary and 8 characters 37*3e12c5d1SDavid du Colombier * to get at least maybe one 38*3e12c5d1SDavid du Colombier * full word store. 39*3e12c5d1SDavid du Colombier */ 40*3e12c5d1SDavid du Colombier SUBCC $8,R9, R0 41*3e12c5d1SDavid du Colombier BL fout 42*3e12c5d1SDavid du Colombier 43*3e12c5d1SDavid du Colombier/* 44*3e12c5d1SDavid du Colombier * test if both pointers 45*3e12c5d1SDavid du Colombier * are similarly word aligned 46*3e12c5d1SDavid du Colombier */ 47*3e12c5d1SDavid du Colombier XOR R10,R11, R7 48*3e12c5d1SDavid du Colombier ANDCC $7,R7, R0 49*3e12c5d1SDavid du Colombier BNE fout 50*3e12c5d1SDavid du Colombier 51*3e12c5d1SDavid du Colombier/* 52*3e12c5d1SDavid du Colombier * byte at a time to double align 53*3e12c5d1SDavid du Colombier */ 54*3e12c5d1SDavid du Colombierf1: 55*3e12c5d1SDavid du Colombier ANDCC $7,R10, R0 56*3e12c5d1SDavid du Colombier BE f2 57*3e12c5d1SDavid du Colombier MOVB 0(R11), R16 58*3e12c5d1SDavid du Colombier ADD $1, R11 59*3e12c5d1SDavid du Colombier MOVB R16, 0(R10) 60*3e12c5d1SDavid du Colombier ADD $1, R10 61*3e12c5d1SDavid du Colombier JMP f1 62*3e12c5d1SDavid du Colombier 63*3e12c5d1SDavid du Colombier/* 64*3e12c5d1SDavid du Colombier * turn R9 into to-end pointer-15 65*3e12c5d1SDavid du Colombier * copy 16 at a time while theres room. 66*3e12c5d1SDavid du Colombier * R12 is smaller than R13 -- 67*3e12c5d1SDavid du Colombier * there are problems if R13 is 0. 68*3e12c5d1SDavid du Colombier */ 69*3e12c5d1SDavid du Colombierf2: 70*3e12c5d1SDavid du Colombier SUB $15,R12, R9 71*3e12c5d1SDavid du Colombierf3: 72*3e12c5d1SDavid du Colombier SUBCC R10,R9, R0 73*3e12c5d1SDavid du Colombier BLEU f4 74*3e12c5d1SDavid du Colombier MOVD 0(R11), R16 75*3e12c5d1SDavid du Colombier MOVD R16, 0(R10) 76*3e12c5d1SDavid du Colombier MOVD 8(R11), R16 77*3e12c5d1SDavid du Colombier ADD $16, R11 78*3e12c5d1SDavid du Colombier MOVD R16, 8(R10) 79*3e12c5d1SDavid du Colombier ADD $16, R10 80*3e12c5d1SDavid du Colombier JMP f3 81*3e12c5d1SDavid du Colombier 82*3e12c5d1SDavid du Colombier/* 83*3e12c5d1SDavid du Colombier * turn R9 into to-end pointer-3 84*3e12c5d1SDavid du Colombier * copy 4 at a time while theres room 85*3e12c5d1SDavid du Colombier */ 86*3e12c5d1SDavid du Colombierf4: 87*3e12c5d1SDavid du Colombier SUB $3,R12, R9 88*3e12c5d1SDavid du Colombierf5: 89*3e12c5d1SDavid du Colombier SUBCC R10,R9, R0 90*3e12c5d1SDavid du Colombier BLEU fout 91*3e12c5d1SDavid du Colombier MOVW 0(R11), R16 92*3e12c5d1SDavid du Colombier ADD $4, R11 93*3e12c5d1SDavid du Colombier MOVW R16, 0(R10) 94*3e12c5d1SDavid du Colombier ADD $4, R10 95*3e12c5d1SDavid du Colombier JMP f5 96*3e12c5d1SDavid du Colombier 97*3e12c5d1SDavid du Colombier/* 98*3e12c5d1SDavid du Colombier * last loop, copy byte at a time 99*3e12c5d1SDavid du Colombier */ 100*3e12c5d1SDavid du Colombierfout: 101*3e12c5d1SDavid du Colombier SUBCC R11,R13, R0 102*3e12c5d1SDavid du Colombier BLEU ret 103*3e12c5d1SDavid du Colombier MOVB 0(R11), R16 104*3e12c5d1SDavid du Colombier ADD $1, R11 105*3e12c5d1SDavid du Colombier MOVB R16, 0(R10) 106*3e12c5d1SDavid du Colombier ADD $1, R10 107*3e12c5d1SDavid du Colombier JMP fout 108*3e12c5d1SDavid du Colombier 109*3e12c5d1SDavid du Colombier/* 110*3e12c5d1SDavid du Colombier * whole thing repeated for backwards 111*3e12c5d1SDavid du Colombier */ 112*3e12c5d1SDavid du Colombierback: 113*3e12c5d1SDavid du Colombier SUBCC $8,R9, R0 114*3e12c5d1SDavid du Colombier BL bout 115*3e12c5d1SDavid du Colombier 116*3e12c5d1SDavid du Colombier XOR R12,R13, R7 117*3e12c5d1SDavid du Colombier ANDCC $7,R7, R0 118*3e12c5d1SDavid du Colombier BNE bout 119*3e12c5d1SDavid du Colombierb1: 120*3e12c5d1SDavid du Colombier ANDCC $7,R13, R0 121*3e12c5d1SDavid du Colombier BE b2 122*3e12c5d1SDavid du Colombier MOVB -1(R13), R16 123*3e12c5d1SDavid du Colombier SUB $1, R13 124*3e12c5d1SDavid du Colombier MOVB R16, -1(R12) 125*3e12c5d1SDavid du Colombier SUB $1, R12 126*3e12c5d1SDavid du Colombier JMP b1 127*3e12c5d1SDavid du Colombierb2: 128*3e12c5d1SDavid du Colombier ADD $15,R11, R9 129*3e12c5d1SDavid du Colombierb3: 130*3e12c5d1SDavid du Colombier SUBCC R9,R13, R0 131*3e12c5d1SDavid du Colombier BLEU b4 132*3e12c5d1SDavid du Colombier 133*3e12c5d1SDavid du Colombier MOVD -8(R13), R16 134*3e12c5d1SDavid du Colombier MOVD R16, -8(R12) 135*3e12c5d1SDavid du Colombier MOVD -16(R13), R16 136*3e12c5d1SDavid du Colombier SUB $16, R13 137*3e12c5d1SDavid du Colombier MOVD R16, -16(R12); 138*3e12c5d1SDavid du Colombier SUB $16, R12 139*3e12c5d1SDavid du Colombier JMP b3 140*3e12c5d1SDavid du Colombierb4: 141*3e12c5d1SDavid du Colombier ADD $3,R11, R9 142*3e12c5d1SDavid du Colombierb5: 143*3e12c5d1SDavid du Colombier SUBCC R9,R13, R0 144*3e12c5d1SDavid du Colombier BLEU bout 145*3e12c5d1SDavid du Colombier MOVW -4(R13), R16 146*3e12c5d1SDavid du Colombier SUB $4, R13 147*3e12c5d1SDavid du Colombier MOVW R16, -4(R12) 148*3e12c5d1SDavid du Colombier SUB $4, R12 149*3e12c5d1SDavid du Colombier JMP b5 150*3e12c5d1SDavid du Colombier 151*3e12c5d1SDavid du Colombierbout: 152*3e12c5d1SDavid du Colombier SUBCC R11,R13, R0 153*3e12c5d1SDavid du Colombier BLEU ret 154*3e12c5d1SDavid du Colombier MOVB -1(R13), R16 155*3e12c5d1SDavid du Colombier SUB $1, R13 156*3e12c5d1SDavid du Colombier MOVB R16, -1(R12) 157*3e12c5d1SDavid du Colombier SUB $1, R12 158*3e12c5d1SDavid du Colombier JMP bout 159*3e12c5d1SDavid du Colombier 160*3e12c5d1SDavid du Colombierret: 161*3e12c5d1SDavid du Colombier MOVW s1+0(FP), R7 162*3e12c5d1SDavid du Colombier RETURN 163