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