1*3e12c5d1SDavid du Colombier TEXT memcmp(SB), $0 2*3e12c5d1SDavid du Colombier 3*3e12c5d1SDavid du Colombier/* 4*3e12c5d1SDavid du Colombier * performance: 5*3e12c5d1SDavid du Colombier * (tba) 6*3e12c5d1SDavid du Colombier */ 7*3e12c5d1SDavid du Colombier 8*3e12c5d1SDavid du Colombier MOVW R7, 0(FP) 9*3e12c5d1SDavid du Colombier MOVW n+8(FP), R9 /* R9 is count */ 10*3e12c5d1SDavid du Colombier MOVW s1+0(FP), R10 /* R10 is pointer1 */ 11*3e12c5d1SDavid du Colombier MOVW s2+4(FP), R11 /* R11 is pointer2 */ 12*3e12c5d1SDavid du Colombier ADD R9,R10, R12 /* R12 is end pointer1 */ 13*3e12c5d1SDavid du Colombier 14*3e12c5d1SDavid du Colombier/* 15*3e12c5d1SDavid du Colombier * if not at least 4 chars, 16*3e12c5d1SDavid du Colombier * dont even mess around. 17*3e12c5d1SDavid du Colombier * 3 chars to guarantee any 18*3e12c5d1SDavid du Colombier * rounding up to a word 19*3e12c5d1SDavid du Colombier * boundary and 4 characters 20*3e12c5d1SDavid du Colombier * to get at least maybe one 21*3e12c5d1SDavid du Colombier * full word cmp. 22*3e12c5d1SDavid du Colombier */ 23*3e12c5d1SDavid du Colombier SUBCC $4,R9, R0 24*3e12c5d1SDavid du Colombier BL out 25*3e12c5d1SDavid du Colombier 26*3e12c5d1SDavid du Colombier/* 27*3e12c5d1SDavid du Colombier * test if both pointers 28*3e12c5d1SDavid du Colombier * are similarly word alligned 29*3e12c5d1SDavid du Colombier */ 30*3e12c5d1SDavid du Colombier XOR R10,R11, R7 31*3e12c5d1SDavid du Colombier ANDCC $3,R7, R0 32*3e12c5d1SDavid du Colombier BNE out 33*3e12c5d1SDavid du Colombier 34*3e12c5d1SDavid du Colombier/* 35*3e12c5d1SDavid du Colombier * byte at a time to word allign 36*3e12c5d1SDavid du Colombier */ 37*3e12c5d1SDavid du Colombierl1: 38*3e12c5d1SDavid du Colombier ANDCC $3,R10, R0 39*3e12c5d1SDavid du Colombier BE l2 40*3e12c5d1SDavid du Colombier MOVBU 0(R10), R16 41*3e12c5d1SDavid du Colombier MOVBU 0(R11), R17 42*3e12c5d1SDavid du Colombier ADD $1, R10 43*3e12c5d1SDavid du Colombier SUBCC R16,R17, R0 44*3e12c5d1SDavid du Colombier BNE ne 45*3e12c5d1SDavid du Colombier ADD $1, R11 46*3e12c5d1SDavid du Colombier JMP l1 47*3e12c5d1SDavid du Colombier 48*3e12c5d1SDavid du Colombier/* 49*3e12c5d1SDavid du Colombier * turn R9 into end pointer1-15 50*3e12c5d1SDavid du Colombier * cmp 16 at a time while theres room 51*3e12c5d1SDavid du Colombier */ 52*3e12c5d1SDavid du Colombierl2: 53*3e12c5d1SDavid du Colombier SUB $15,R12, R9 54*3e12c5d1SDavid du Colombierl3: 55*3e12c5d1SDavid du Colombier SUBCC R10,R9, R0 56*3e12c5d1SDavid du Colombier BLEU l4 57*3e12c5d1SDavid du Colombier MOVW 0(R10), R16 58*3e12c5d1SDavid du Colombier MOVW 0(R11), R17 59*3e12c5d1SDavid du Colombier MOVW 4(R10), R18 60*3e12c5d1SDavid du Colombier SUBCC R16,R17, R0 61*3e12c5d1SDavid du Colombier BNE ne 62*3e12c5d1SDavid du Colombier MOVW 4(R11), R19 63*3e12c5d1SDavid du Colombier MOVW 8(R10), R16 64*3e12c5d1SDavid du Colombier SUBCC R18,R19, R0 65*3e12c5d1SDavid du Colombier BNE ne 66*3e12c5d1SDavid du Colombier MOVW 8(R11), R17 67*3e12c5d1SDavid du Colombier MOVW 12(R10), R18 68*3e12c5d1SDavid du Colombier SUBCC R16,R17, R0 69*3e12c5d1SDavid du Colombier BNE ne 70*3e12c5d1SDavid du Colombier MOVW 12(R11), R19 71*3e12c5d1SDavid du Colombier ADD $16, R10 72*3e12c5d1SDavid du Colombier SUBCC R18,R19, R0 73*3e12c5d1SDavid du Colombier BNE ne 74*3e12c5d1SDavid du Colombier SUBCC R16,R17, R0 75*3e12c5d1SDavid du Colombier BNE ne 76*3e12c5d1SDavid du Colombier ADD $16, R11 77*3e12c5d1SDavid du Colombier JMP l3 78*3e12c5d1SDavid du Colombier 79*3e12c5d1SDavid du Colombier/* 80*3e12c5d1SDavid du Colombier * turn R9 into end pointer1-3 81*3e12c5d1SDavid du Colombier * cmp 4 at a time while theres room 82*3e12c5d1SDavid du Colombier */ 83*3e12c5d1SDavid du Colombierl4: 84*3e12c5d1SDavid du Colombier SUB $3,R12, R9 85*3e12c5d1SDavid du Colombierl5: 86*3e12c5d1SDavid du Colombier SUBCC R10,R9, R0 87*3e12c5d1SDavid du Colombier BLEU out 88*3e12c5d1SDavid du Colombier MOVW 0(R10), R16 89*3e12c5d1SDavid du Colombier MOVW 0(R11), R17 90*3e12c5d1SDavid du Colombier ADD $4, R10 91*3e12c5d1SDavid du Colombier SUBCC R16,R17, R0 /* only works because big endian */ 92*3e12c5d1SDavid du Colombier BNE ne 93*3e12c5d1SDavid du Colombier ADD $4, R11 94*3e12c5d1SDavid du Colombier JMP l5 95*3e12c5d1SDavid du Colombier 96*3e12c5d1SDavid du Colombier/* 97*3e12c5d1SDavid du Colombier * last loop, cmp byte at a time 98*3e12c5d1SDavid du Colombier */ 99*3e12c5d1SDavid du Colombierout: 100*3e12c5d1SDavid du Colombier SUBCC R10,R12, R0 101*3e12c5d1SDavid du Colombier BE zero 102*3e12c5d1SDavid du Colombier MOVBU 0(R10), R16 103*3e12c5d1SDavid du Colombier MOVBU 0(R11), R17 104*3e12c5d1SDavid du Colombier ADD $1, R10 105*3e12c5d1SDavid du Colombier SUBCC R16,R17, R0 106*3e12c5d1SDavid du Colombier BNE ne 107*3e12c5d1SDavid du Colombier ADD $1, R11 108*3e12c5d1SDavid du Colombier JMP out 109*3e12c5d1SDavid du Colombier 110*3e12c5d1SDavid du Colombierne: 111*3e12c5d1SDavid du Colombier BGU plus 112*3e12c5d1SDavid du Colombier MOVW $1, R7 113*3e12c5d1SDavid du Colombier RETURN 114*3e12c5d1SDavid du Colombierplus: 115*3e12c5d1SDavid du Colombier MOVW $-1, R7 116*3e12c5d1SDavid du Colombier RETURN 117*3e12c5d1SDavid du Colombier 118*3e12c5d1SDavid du Colombierzero: 119*3e12c5d1SDavid du Colombier MOVW R0, R7 120*3e12c5d1SDavid du Colombier RETURN 121