1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun#include <linux/linkage.h> 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunENTRY_CFI(strcmp) 9*4882a593Smuzhiyun or r2, r0, r1 10*4882a593Smuzhiyun bmsk_s r2, r2, 1 11*4882a593Smuzhiyun brne r2, 0, @.Lcharloop 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun;;; s1 and s2 are word aligned 14*4882a593Smuzhiyun ld.ab r2, [r0, 4] 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun mov_s r12, 0x01010101 17*4882a593Smuzhiyun ror r11, r12 18*4882a593Smuzhiyun .align 4 19*4882a593Smuzhiyun.LwordLoop: 20*4882a593Smuzhiyun ld.ab r3, [r1, 4] 21*4882a593Smuzhiyun ;; Detect NULL char in str1 22*4882a593Smuzhiyun sub r4, r2, r12 23*4882a593Smuzhiyun ld.ab r5, [r0, 4] 24*4882a593Smuzhiyun bic r4, r4, r2 25*4882a593Smuzhiyun and r4, r4, r11 26*4882a593Smuzhiyun brne.d.nt r4, 0, .LfoundNULL 27*4882a593Smuzhiyun ;; Check if the read locations are the same 28*4882a593Smuzhiyun cmp r2, r3 29*4882a593Smuzhiyun beq.d .LwordLoop 30*4882a593Smuzhiyun mov.eq r2, r5 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun ;; A match is found, spot it out 33*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__ 34*4882a593Smuzhiyun swape r3, r3 35*4882a593Smuzhiyun mov_s r0, 1 36*4882a593Smuzhiyun swape r2, r2 37*4882a593Smuzhiyun#else 38*4882a593Smuzhiyun mov_s r0, 1 39*4882a593Smuzhiyun#endif 40*4882a593Smuzhiyun cmp_s r2, r3 41*4882a593Smuzhiyun j_s.d [blink] 42*4882a593Smuzhiyun bset.lo r0, r0, 31 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun .align 4 45*4882a593Smuzhiyun.LfoundNULL: 46*4882a593Smuzhiyun#ifdef __BIG_ENDIAN__ 47*4882a593Smuzhiyun swape r4, r4 48*4882a593Smuzhiyun swape r2, r2 49*4882a593Smuzhiyun swape r3, r3 50*4882a593Smuzhiyun#endif 51*4882a593Smuzhiyun ;; Find null byte 52*4882a593Smuzhiyun ffs r0, r4 53*4882a593Smuzhiyun bmsk r2, r2, r0 54*4882a593Smuzhiyun bmsk r3, r3, r0 55*4882a593Smuzhiyun swape r2, r2 56*4882a593Smuzhiyun swape r3, r3 57*4882a593Smuzhiyun ;; make the return value 58*4882a593Smuzhiyun sub.f r0, r2, r3 59*4882a593Smuzhiyun mov.hi r0, 1 60*4882a593Smuzhiyun j_s.d [blink] 61*4882a593Smuzhiyun bset.lo r0, r0, 31 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun .align 4 64*4882a593Smuzhiyun.Lcharloop: 65*4882a593Smuzhiyun ldb.ab r2, [r0, 1] 66*4882a593Smuzhiyun ldb.ab r3, [r1, 1] 67*4882a593Smuzhiyun nop 68*4882a593Smuzhiyun breq r2, 0, .Lcmpend 69*4882a593Smuzhiyun breq r2, r3, .Lcharloop 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun .align 4 72*4882a593Smuzhiyun.Lcmpend: 73*4882a593Smuzhiyun j_s.d [blink] 74*4882a593Smuzhiyun sub r0, r2, r3 75*4882a593SmuzhiyunEND_CFI(strcmp) 76