| /* |
| * 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 |
| .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 |
| .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 |