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