| /* | |
| * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved. | |
| * | |
| * SPDX-License-Identifier: GPL-2.0+ | |
| */ | |
| #ifdef __LITTLE_ENDIAN__ | |
| #define WORD2 r2 | |
| #define SHIFT r3 | |
| #else /* __BIG_ENDIAN__ */ | |
| #define WORD2 r3 | |
| #define SHIFT r2 | |
| #endif /* _ENDIAN__ */ | |
| .global memcmp | |
| .align 4 | |
| memcmp: | |
| or %r12, %r0, %r1 | |
| asl_s %r12, %r12, 30 | |
| sub %r3, %r2, 1 | |
| brls %r2, %r12, .Lbytewise | |
| ld %r4, [%r0, 0] | |
| ld %r5, [%r1, 0] | |
| lsr.f %lp_count, %r3, 3 | |
| lpne .Loop_end | |
| ld_s WORD2, [%r0, 4] | |
| ld_s %r12, [%r1, 4] | |
| brne %r4, %r5, .Leven | |
| ld.a %r4, [%r0, 8] | |
| ld.a %r5, [%r1, 8] | |
| brne WORD2, %r12, .Lodd | |
| nop | |
| .Loop_end: | |
| asl_s SHIFT, SHIFT, 3 | |
| bhs_s .Last_cmp | |
| brne %r4, %r5, .Leven | |
| ld %r4, [%r0, 4] | |
| ld %r5, [%r1, 4] | |
| #ifdef __LITTLE_ENDIAN__ | |
| nop_s | |
| /* one more load latency cycle */ | |
| .Last_cmp: | |
| xor %r0, %r4, %r5 | |
| bset %r0, %r0, SHIFT | |
| sub_s %r1, %r0, 1 | |
| bic_s %r1, %r1, %r0 | |
| norm %r1, %r1 | |
| b.d .Leven_cmp | |
| and %r1, %r1, 24 | |
| .Leven: | |
| xor %r0, %r4, %r5 | |
| sub_s %r1, %r0, 1 | |
| bic_s %r1, %r1, %r0 | |
| norm %r1, %r1 | |
| /* slow track insn */ | |
| and %r1, %r1, 24 | |
| .Leven_cmp: | |
| asl %r2, %r4, %r1 | |
| asl %r12, %r5, %r1 | |
| lsr_s %r2, %r2, 1 | |
| lsr_s %r12, %r12, 1 | |
| j_s.d [%blink] | |
| sub %r0, %r2, %r12 | |
| .balign 4 | |
| .Lodd: | |
| xor %r0, WORD2, %r12 | |
| sub_s %r1, %r0, 1 | |
| bic_s %r1, %r1, %r0 | |
| norm %r1, %r1 | |
| /* slow track insn */ | |
| and %r1, %r1, 24 | |
| asl_s %r2, %r2, %r1 | |
| asl_s %r12, %r12, %r1 | |
| lsr_s %r2, %r2, 1 | |
| lsr_s %r12, %r12, 1 | |
| j_s.d [%blink] | |
| sub %r0, %r2, %r12 | |
| #else /* __BIG_ENDIAN__ */ | |
| .Last_cmp: | |
| neg_s SHIFT, SHIFT | |
| lsr %r4, %r4, SHIFT | |
| lsr %r5, %r5, SHIFT | |
| /* slow track insn */ | |
| .Leven: | |
| sub.f %r0, %r4, %r5 | |
| mov.ne %r0, 1 | |
| j_s.d [%blink] | |
| bset.cs %r0, %r0, 31 | |
| .Lodd: | |
| cmp_s WORD2, %r12 | |
| mov_s %r0, 1 | |
| j_s.d [%blink] | |
| bset.cs %r0, %r0, 31 | |
| #endif /* _ENDIAN__ */ | |
| .balign 4 | |
| .Lbytewise: | |
| breq %r2, 0, .Lnil | |
| ldb %r4, [%r0, 0] | |
| ldb %r5, [%r1, 0] | |
| lsr.f %lp_count, %r3 | |
| lpne .Lbyte_end | |
| ldb_s %r3, [%r0, 1] | |
| ldb %r12, [%r1, 1] | |
| brne %r4, %r5, .Lbyte_even | |
| ldb.a %r4, [%r0, 2] | |
| ldb.a %r5, [%r1, 2] | |
| brne %r3, %r12, .Lbyte_odd | |
| nop | |
| .Lbyte_end: | |
| bcc .Lbyte_even | |
| brne %r4, %r5, .Lbyte_even | |
| ldb_s %r3, [%r0, 1] | |
| ldb_s %r12, [%r1, 1] | |
| .Lbyte_odd: | |
| j_s.d [%blink] | |
| sub %r0, %r3, %r12 | |
| .Lbyte_even: | |
| j_s.d [%blink] | |
| sub %r0, %r4, %r5 | |
| .Lnil: | |
| j_s.d [%blink] | |
| mov %r0, 0 |