162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/linkage.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciENTRY_CFI(strcmp)
962306a36Sopenharmony_ci	or	r2, r0, r1
1062306a36Sopenharmony_ci	bmsk_s	r2, r2, 1
1162306a36Sopenharmony_ci	brne	r2, 0, @.Lcharloop
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci;;; s1 and s2 are word aligned
1462306a36Sopenharmony_ci	ld.ab	r2, [r0, 4]
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	mov_s	r12, 0x01010101
1762306a36Sopenharmony_ci	ror	r11, r12
1862306a36Sopenharmony_ci	.align  4
1962306a36Sopenharmony_ci.LwordLoop:
2062306a36Sopenharmony_ci	ld.ab	r3, [r1, 4]
2162306a36Sopenharmony_ci	;; Detect NULL char in str1
2262306a36Sopenharmony_ci	sub	r4, r2, r12
2362306a36Sopenharmony_ci	ld.ab	r5, [r0, 4]
2462306a36Sopenharmony_ci	bic	r4, r4, r2
2562306a36Sopenharmony_ci	and	r4, r4, r11
2662306a36Sopenharmony_ci	brne.d.nt	r4, 0, .LfoundNULL
2762306a36Sopenharmony_ci	;; Check if the read locations are the same
2862306a36Sopenharmony_ci	cmp	r2, r3
2962306a36Sopenharmony_ci	beq.d	.LwordLoop
3062306a36Sopenharmony_ci	mov.eq	r2, r5
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	;; A match is found, spot it out
3362306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN__
3462306a36Sopenharmony_ci	swape	r3, r3
3562306a36Sopenharmony_ci	mov_s	r0, 1
3662306a36Sopenharmony_ci	swape	r2, r2
3762306a36Sopenharmony_ci#else
3862306a36Sopenharmony_ci	mov_s	r0, 1
3962306a36Sopenharmony_ci#endif
4062306a36Sopenharmony_ci	cmp_s	r2, r3
4162306a36Sopenharmony_ci	j_s.d	[blink]
4262306a36Sopenharmony_ci	bset.lo	r0, r0, 31
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	.align 4
4562306a36Sopenharmony_ci.LfoundNULL:
4662306a36Sopenharmony_ci#ifdef __BIG_ENDIAN__
4762306a36Sopenharmony_ci	swape	r4, r4
4862306a36Sopenharmony_ci	swape	r2, r2
4962306a36Sopenharmony_ci	swape	r3, r3
5062306a36Sopenharmony_ci#endif
5162306a36Sopenharmony_ci	;; Find null byte
5262306a36Sopenharmony_ci	ffs	r0, r4
5362306a36Sopenharmony_ci	bmsk	r2, r2, r0
5462306a36Sopenharmony_ci	bmsk	r3, r3, r0
5562306a36Sopenharmony_ci	swape	r2, r2
5662306a36Sopenharmony_ci	swape	r3, r3
5762306a36Sopenharmony_ci	;; make the return value
5862306a36Sopenharmony_ci	sub.f	r0, r2, r3
5962306a36Sopenharmony_ci	mov.hi	r0, 1
6062306a36Sopenharmony_ci	j_s.d	[blink]
6162306a36Sopenharmony_ci	bset.lo	r0, r0, 31
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	.align 4
6462306a36Sopenharmony_ci.Lcharloop:
6562306a36Sopenharmony_ci	ldb.ab	r2, [r0, 1]
6662306a36Sopenharmony_ci	ldb.ab	r3, [r1, 1]
6762306a36Sopenharmony_ci	nop
6862306a36Sopenharmony_ci	breq	r2, 0, .Lcmpend
6962306a36Sopenharmony_ci	breq	r2, r3, .Lcharloop
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	.align 4
7262306a36Sopenharmony_ci.Lcmpend:
7362306a36Sopenharmony_ci	j_s.d	[blink]
7462306a36Sopenharmony_ci	sub	r0, r2, r3
7562306a36Sopenharmony_ciEND_CFI(strcmp)
76