1*ce95e1b3SDavid du Colombier TEXT memcmp(SB), $0 2*ce95e1b3SDavid du Colombier MOVW R8, s1+0(FP) 3*ce95e1b3SDavid du Colombier MOVW n+8(FP), R15 /* R15 is count */ 4*ce95e1b3SDavid du Colombier MOVW s1+0(FP), R9 /* R9 is pointer1 */ 5*ce95e1b3SDavid du Colombier MOVW s2+4(FP), R10 /* R10 is pointer2 */ 6*ce95e1b3SDavid du Colombier ADD R15,R9, R11 /* R11 is end pointer1 */ 7*ce95e1b3SDavid du Colombier 8*ce95e1b3SDavid du Colombier/* 9*ce95e1b3SDavid du Colombier * if not at least 4 chars, 10*ce95e1b3SDavid du Colombier * dont even mess around. 11*ce95e1b3SDavid du Colombier * 3 chars to guarantee any 12*ce95e1b3SDavid du Colombier * rounding up to a word 13*ce95e1b3SDavid du Colombier * boundary and 4 characters 14*ce95e1b3SDavid du Colombier * to get at least maybe one 15*ce95e1b3SDavid du Colombier * full word cmp. 16*ce95e1b3SDavid du Colombier */ 17*ce95e1b3SDavid du Colombier SLT $4,R15, R8 18*ce95e1b3SDavid du Colombier BNE R8, out 19*ce95e1b3SDavid du Colombier 20*ce95e1b3SDavid du Colombier/* 21*ce95e1b3SDavid du Colombier * test if both pointers 22*ce95e1b3SDavid du Colombier * are similarly word aligned 23*ce95e1b3SDavid du Colombier */ 24*ce95e1b3SDavid du Colombier XOR R9,R10, R8 25*ce95e1b3SDavid du Colombier AND $3, R8 26*ce95e1b3SDavid du Colombier BNE R8, out 27*ce95e1b3SDavid du Colombier 28*ce95e1b3SDavid du Colombier/* 29*ce95e1b3SDavid du Colombier * byte at a time to word align 30*ce95e1b3SDavid du Colombier */ 31*ce95e1b3SDavid du Colombierl1: 32*ce95e1b3SDavid du Colombier AND $3,R9, R8 33*ce95e1b3SDavid du Colombier BEQ R8, l2 34*ce95e1b3SDavid du Colombier MOVBU 0(R9), R14 35*ce95e1b3SDavid du Colombier MOVBU 0(R10), R15 36*ce95e1b3SDavid du Colombier ADD $1, R9 37*ce95e1b3SDavid du Colombier BNE R14,R15, ne 38*ce95e1b3SDavid du Colombier ADD $1, R10 39*ce95e1b3SDavid du Colombier JMP l1 40*ce95e1b3SDavid du Colombier 41*ce95e1b3SDavid du Colombier/* 42*ce95e1b3SDavid du Colombier * turn R15 into end pointer1-15 43*ce95e1b3SDavid du Colombier * cmp 16 at a time while theres room 44*ce95e1b3SDavid du Colombier */ 45*ce95e1b3SDavid du Colombierl2: 46*ce95e1b3SDavid du Colombier ADD $-15,R11, R15 47*ce95e1b3SDavid du Colombierl3: 48*ce95e1b3SDavid du Colombier SLTU R15,R9, R8 49*ce95e1b3SDavid du Colombier BEQ R8, l4 50*ce95e1b3SDavid du Colombier MOVW 0(R9), R12 51*ce95e1b3SDavid du Colombier MOVW 0(R10), R13 52*ce95e1b3SDavid du Colombier BNE R12,R13, ne1 53*ce95e1b3SDavid du Colombier MOVW 4(R9), R12 54*ce95e1b3SDavid du Colombier MOVW 4(R10), R13 55*ce95e1b3SDavid du Colombier BNE R12,R13, ne1 56*ce95e1b3SDavid du Colombier MOVW 8(R9), R12 57*ce95e1b3SDavid du Colombier MOVW 8(R10), R13 58*ce95e1b3SDavid du Colombier BNE R12,R13, ne1 59*ce95e1b3SDavid du Colombier MOVW 12(R9), R12 60*ce95e1b3SDavid du Colombier MOVW 12(R10), R13 61*ce95e1b3SDavid du Colombier BNE R12,R13, ne1 62*ce95e1b3SDavid du Colombier ADD $16, R9 63*ce95e1b3SDavid du Colombier ADD $16, R10 64*ce95e1b3SDavid du Colombier JMP l3 65*ce95e1b3SDavid du Colombier 66*ce95e1b3SDavid du Colombier/* 67*ce95e1b3SDavid du Colombier * turn R15 into end pointer1-3 68*ce95e1b3SDavid du Colombier * cmp 4 at a time while theres room 69*ce95e1b3SDavid du Colombier */ 70*ce95e1b3SDavid du Colombierl4: 71*ce95e1b3SDavid du Colombier ADD $-3,R11, R15 72*ce95e1b3SDavid du Colombierl5: 73*ce95e1b3SDavid du Colombier SLTU R15,R9, R8 74*ce95e1b3SDavid du Colombier BEQ R8, out 75*ce95e1b3SDavid du Colombier MOVW 0(R9), R12 76*ce95e1b3SDavid du Colombier MOVW 0(R10), R13 77*ce95e1b3SDavid du Colombier ADD $4, R9 78*ce95e1b3SDavid du Colombier BNE R12,R13, ne1 79*ce95e1b3SDavid du Colombier ADD $4, R10 80*ce95e1b3SDavid du Colombier JMP l5 81*ce95e1b3SDavid du Colombier 82*ce95e1b3SDavid du Colombier/* 83*ce95e1b3SDavid du Colombier * last loop, cmp byte at a time 84*ce95e1b3SDavid du Colombier */ 85*ce95e1b3SDavid du Colombierout: 86*ce95e1b3SDavid du Colombier SLTU R11,R9, R8 87*ce95e1b3SDavid du Colombier BEQ R8, ret 88*ce95e1b3SDavid du Colombier MOVBU 0(R9), R14 89*ce95e1b3SDavid du Colombier MOVBU 0(R10), R15 90*ce95e1b3SDavid du Colombier ADD $1, R9 91*ce95e1b3SDavid du Colombier BNE R14,R15, ne 92*ce95e1b3SDavid du Colombier ADD $1, R10 93*ce95e1b3SDavid du Colombier JMP out 94*ce95e1b3SDavid du Colombier 95*ce95e1b3SDavid du Colombier/* 96*ce95e1b3SDavid du Colombier * compare bytes in R12 and R13, lsb first 97*ce95e1b3SDavid du Colombier */ 98*ce95e1b3SDavid du Colombierne1: 99*ce95e1b3SDavid du Colombier MOVW $0xff, R8 100*ce95e1b3SDavid du Colombierne1x: 101*ce95e1b3SDavid du Colombier AND R8, R12, R14 102*ce95e1b3SDavid du Colombier AND R8, R13, R15 103*ce95e1b3SDavid du Colombier BNE R14, R15, ne 104*ce95e1b3SDavid du Colombier SLL $8, R8 105*ce95e1b3SDavid du Colombier BNE R8, ne1x 106*ce95e1b3SDavid du Colombier JMP ret 107*ce95e1b3SDavid du Colombier 108*ce95e1b3SDavid du Colombierne: 109*ce95e1b3SDavid du Colombier SLTU R14,R15, R8 110*ce95e1b3SDavid du Colombier BNE R8, ret 111*ce95e1b3SDavid du Colombier MOVW $-1,R8 112*ce95e1b3SDavid du Colombierret: 113*ce95e1b3SDavid du Colombier RET 114*ce95e1b3SDavid du Colombier END 115