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