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