xref: /rk3399_rockchip-uboot/arch/arc/lib/memcmp.S (revision e1cc4d31f889428a4ca73120951389c756404184)
122723828SAlexey Brodkin/*
222723828SAlexey Brodkin * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
322723828SAlexey Brodkin *
422723828SAlexey Brodkin * SPDX-License-Identifier:	GPL-2.0+
522723828SAlexey Brodkin */
622723828SAlexey Brodkin
722723828SAlexey Brodkin#ifdef __LITTLE_ENDIAN__
822723828SAlexey Brodkin#define WORD2 r2
922723828SAlexey Brodkin#define SHIFT r3
1022723828SAlexey Brodkin#else /* __BIG_ENDIAN__ */
1122723828SAlexey Brodkin#define WORD2 r3
1222723828SAlexey Brodkin#define SHIFT r2
1322723828SAlexey Brodkin#endif /* _ENDIAN__ */
1422723828SAlexey Brodkin
1522723828SAlexey Brodkin.global memcmp
1622723828SAlexey Brodkin.align 4
1722723828SAlexey Brodkinmemcmp:
1822723828SAlexey Brodkin	or	%r12, %r0, %r1
1922723828SAlexey Brodkin	asl_s	%r12, %r12, 30
2022723828SAlexey Brodkin	sub	%r3, %r2, 1
2122723828SAlexey Brodkin	brls	%r2, %r12, .Lbytewise
2222723828SAlexey Brodkin	ld	%r4, [%r0, 0]
2322723828SAlexey Brodkin	ld	%r5, [%r1, 0]
2422723828SAlexey Brodkin	lsr.f	%lp_count, %r3, 3
2522723828SAlexey Brodkin	lpne	.Loop_end
2622723828SAlexey Brodkin	ld_s	WORD2, [%r0, 4]
2722723828SAlexey Brodkin	ld_s	%r12, [%r1, 4]
2822723828SAlexey Brodkin	brne	%r4, %r5, .Leven
2922723828SAlexey Brodkin	ld.a	%r4, [%r0, 8]
3022723828SAlexey Brodkin	ld.a	%r5, [%r1, 8]
3122723828SAlexey Brodkin	brne	WORD2, %r12, .Lodd
32*f958a91fSIgor Guryanov	nop
3322723828SAlexey Brodkin.Loop_end:
3422723828SAlexey Brodkin	asl_s	SHIFT, SHIFT, 3
3522723828SAlexey Brodkin	bhs_s	.Last_cmp
3622723828SAlexey Brodkin	brne	%r4, %r5, .Leven
3722723828SAlexey Brodkin	ld	%r4, [%r0, 4]
3822723828SAlexey Brodkin	ld	%r5, [%r1, 4]
3922723828SAlexey Brodkin#ifdef __LITTLE_ENDIAN__
4022723828SAlexey Brodkin	nop_s
4122723828SAlexey Brodkin	/* one more load latency cycle */
4222723828SAlexey Brodkin.Last_cmp:
4322723828SAlexey Brodkin	xor	%r0, %r4, %r5
4422723828SAlexey Brodkin	bset	%r0, %r0, SHIFT
4522723828SAlexey Brodkin	sub_s	%r1, %r0, 1
4622723828SAlexey Brodkin	bic_s	%r1, %r1, %r0
4722723828SAlexey Brodkin	norm	%r1, %r1
4822723828SAlexey Brodkin	b.d	.Leven_cmp
4922723828SAlexey Brodkin	and	%r1, %r1, 24
5022723828SAlexey Brodkin.Leven:
5122723828SAlexey Brodkin	xor	%r0, %r4, %r5
5222723828SAlexey Brodkin	sub_s	%r1, %r0, 1
5322723828SAlexey Brodkin	bic_s	%r1, %r1, %r0
5422723828SAlexey Brodkin	norm	%r1, %r1
5522723828SAlexey Brodkin	/* slow track insn */
5622723828SAlexey Brodkin	and	%r1, %r1, 24
5722723828SAlexey Brodkin.Leven_cmp:
5822723828SAlexey Brodkin	asl	%r2, %r4, %r1
5922723828SAlexey Brodkin	asl	%r12, %r5, %r1
6022723828SAlexey Brodkin	lsr_s	%r2, %r2, 1
6122723828SAlexey Brodkin	lsr_s	%r12, %r12, 1
6222723828SAlexey Brodkin	j_s.d	[%blink]
6322723828SAlexey Brodkin	sub	%r0, %r2, %r12
6422723828SAlexey Brodkin	.balign	4
6522723828SAlexey Brodkin.Lodd:
6622723828SAlexey Brodkin	xor	%r0, WORD2, %r12
6722723828SAlexey Brodkin	sub_s	%r1, %r0, 1
6822723828SAlexey Brodkin	bic_s	%r1, %r1, %r0
6922723828SAlexey Brodkin	norm	%r1, %r1
7022723828SAlexey Brodkin	/* slow track insn */
7122723828SAlexey Brodkin	and	%r1, %r1, 24
7222723828SAlexey Brodkin	asl_s	%r2, %r2, %r1
7322723828SAlexey Brodkin	asl_s	%r12, %r12, %r1
7422723828SAlexey Brodkin	lsr_s	%r2, %r2, 1
7522723828SAlexey Brodkin	lsr_s	%r12, %r12, 1
7622723828SAlexey Brodkin	j_s.d	[%blink]
7722723828SAlexey Brodkin	sub	%r0, %r2, %r12
7822723828SAlexey Brodkin#else /* __BIG_ENDIAN__ */
7922723828SAlexey Brodkin.Last_cmp:
8022723828SAlexey Brodkin	neg_s	SHIFT, SHIFT
8122723828SAlexey Brodkin	lsr	%r4, %r4, SHIFT
8222723828SAlexey Brodkin	lsr	%r5, %r5, SHIFT
8322723828SAlexey Brodkin	/* slow track insn */
8422723828SAlexey Brodkin.Leven:
8522723828SAlexey Brodkin	sub.f	%r0, %r4, %r5
8622723828SAlexey Brodkin	mov.ne	%r0, 1
8722723828SAlexey Brodkin	j_s.d	[%blink]
8822723828SAlexey Brodkin	bset.cs	%r0, %r0, 31
8922723828SAlexey Brodkin.Lodd:
9022723828SAlexey Brodkin	cmp_s	WORD2, %r12
9122723828SAlexey Brodkin
9222723828SAlexey Brodkin	mov_s	%r0, 1
9322723828SAlexey Brodkin	j_s.d	[%blink]
9422723828SAlexey Brodkin	bset.cs	%r0, %r0, 31
9522723828SAlexey Brodkin#endif /* _ENDIAN__ */
9622723828SAlexey Brodkin	.balign	4
9722723828SAlexey Brodkin.Lbytewise:
9822723828SAlexey Brodkin	breq	%r2, 0, .Lnil
9922723828SAlexey Brodkin	ldb	%r4, [%r0, 0]
10022723828SAlexey Brodkin	ldb	%r5, [%r1, 0]
10122723828SAlexey Brodkin	lsr.f	%lp_count, %r3
10222723828SAlexey Brodkin	lpne	.Lbyte_end
10322723828SAlexey Brodkin	ldb_s	%r3, [%r0, 1]
10422723828SAlexey Brodkin	ldb	%r12, [%r1, 1]
10522723828SAlexey Brodkin	brne	%r4, %r5, .Lbyte_even
10622723828SAlexey Brodkin	ldb.a	%r4, [%r0, 2]
10722723828SAlexey Brodkin	ldb.a	%r5, [%r1, 2]
10822723828SAlexey Brodkin	brne	%r3, %r12, .Lbyte_odd
109*f958a91fSIgor Guryanov	nop
11022723828SAlexey Brodkin.Lbyte_end:
11122723828SAlexey Brodkin	bcc	.Lbyte_even
11222723828SAlexey Brodkin	brne	%r4, %r5, .Lbyte_even
11322723828SAlexey Brodkin	ldb_s	%r3, [%r0, 1]
11422723828SAlexey Brodkin	ldb_s	%r12, [%r1, 1]
11522723828SAlexey Brodkin.Lbyte_odd:
11622723828SAlexey Brodkin	j_s.d	[%blink]
11722723828SAlexey Brodkin	sub	%r0, %r3, %r12
11822723828SAlexey Brodkin.Lbyte_even:
11922723828SAlexey Brodkin	j_s.d	[%blink]
12022723828SAlexey Brodkin	sub	%r0, %r4, %r5
12122723828SAlexey Brodkin.Lnil:
12222723828SAlexey Brodkin	j_s.d	[%blink]
12322723828SAlexey Brodkin	mov	%r0, 0
124