1*d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */ 21f7e3dc0SClaudiu Zissulescu/* 31f7e3dc0SClaudiu Zissulescu * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) 41f7e3dc0SClaudiu Zissulescu */ 51f7e3dc0SClaudiu Zissulescu 61f7e3dc0SClaudiu Zissulescu#include <linux/linkage.h> 71f7e3dc0SClaudiu Zissulescu 886effd0dSVineet GuptaENTRY_CFI(strcmp) 91f7e3dc0SClaudiu Zissulescu or r2, r0, r1 101f7e3dc0SClaudiu Zissulescu bmsk_s r2, r2, 1 111f7e3dc0SClaudiu Zissulescu brne r2, 0, @.Lcharloop 121f7e3dc0SClaudiu Zissulescu 131f7e3dc0SClaudiu Zissulescu;;; s1 and s2 are word aligned 141f7e3dc0SClaudiu Zissulescu ld.ab r2, [r0, 4] 151f7e3dc0SClaudiu Zissulescu 161f7e3dc0SClaudiu Zissulescu mov_s r12, 0x01010101 171f7e3dc0SClaudiu Zissulescu ror r11, r12 181f7e3dc0SClaudiu Zissulescu .align 4 191f7e3dc0SClaudiu Zissulescu.LwordLoop: 201f7e3dc0SClaudiu Zissulescu ld.ab r3, [r1, 4] 211f7e3dc0SClaudiu Zissulescu ;; Detect NULL char in str1 221f7e3dc0SClaudiu Zissulescu sub r4, r2, r12 231f7e3dc0SClaudiu Zissulescu ld.ab r5, [r0, 4] 241f7e3dc0SClaudiu Zissulescu bic r4, r4, r2 251f7e3dc0SClaudiu Zissulescu and r4, r4, r11 261f7e3dc0SClaudiu Zissulescu brne.d.nt r4, 0, .LfoundNULL 271f7e3dc0SClaudiu Zissulescu ;; Check if the read locations are the same 281f7e3dc0SClaudiu Zissulescu cmp r2, r3 291f7e3dc0SClaudiu Zissulescu beq.d .LwordLoop 301f7e3dc0SClaudiu Zissulescu mov.eq r2, r5 311f7e3dc0SClaudiu Zissulescu 321f7e3dc0SClaudiu Zissulescu ;; A match is found, spot it out 331f7e3dc0SClaudiu Zissulescu#ifdef __LITTLE_ENDIAN__ 341f7e3dc0SClaudiu Zissulescu swape r3, r3 351f7e3dc0SClaudiu Zissulescu mov_s r0, 1 361f7e3dc0SClaudiu Zissulescu swape r2, r2 371f7e3dc0SClaudiu Zissulescu#else 381f7e3dc0SClaudiu Zissulescu mov_s r0, 1 391f7e3dc0SClaudiu Zissulescu#endif 401f7e3dc0SClaudiu Zissulescu cmp_s r2, r3 411f7e3dc0SClaudiu Zissulescu j_s.d [blink] 421f7e3dc0SClaudiu Zissulescu bset.lo r0, r0, 31 431f7e3dc0SClaudiu Zissulescu 441f7e3dc0SClaudiu Zissulescu .align 4 451f7e3dc0SClaudiu Zissulescu.LfoundNULL: 461f7e3dc0SClaudiu Zissulescu#ifdef __BIG_ENDIAN__ 471f7e3dc0SClaudiu Zissulescu swape r4, r4 481f7e3dc0SClaudiu Zissulescu swape r2, r2 491f7e3dc0SClaudiu Zissulescu swape r3, r3 501f7e3dc0SClaudiu Zissulescu#endif 511f7e3dc0SClaudiu Zissulescu ;; Find null byte 521f7e3dc0SClaudiu Zissulescu ffs r0, r4 531f7e3dc0SClaudiu Zissulescu bmsk r2, r2, r0 541f7e3dc0SClaudiu Zissulescu bmsk r3, r3, r0 551f7e3dc0SClaudiu Zissulescu swape r2, r2 561f7e3dc0SClaudiu Zissulescu swape r3, r3 571f7e3dc0SClaudiu Zissulescu ;; make the return value 581f7e3dc0SClaudiu Zissulescu sub.f r0, r2, r3 591f7e3dc0SClaudiu Zissulescu mov.hi r0, 1 601f7e3dc0SClaudiu Zissulescu j_s.d [blink] 611f7e3dc0SClaudiu Zissulescu bset.lo r0, r0, 31 621f7e3dc0SClaudiu Zissulescu 631f7e3dc0SClaudiu Zissulescu .align 4 641f7e3dc0SClaudiu Zissulescu.Lcharloop: 651f7e3dc0SClaudiu Zissulescu ldb.ab r2, [r0, 1] 661f7e3dc0SClaudiu Zissulescu ldb.ab r3, [r1, 1] 671f7e3dc0SClaudiu Zissulescu nop 681f7e3dc0SClaudiu Zissulescu breq r2, 0, .Lcmpend 691f7e3dc0SClaudiu Zissulescu breq r2, r3, .Lcharloop 701f7e3dc0SClaudiu Zissulescu 711f7e3dc0SClaudiu Zissulescu .align 4 721f7e3dc0SClaudiu Zissulescu.Lcmpend: 731f7e3dc0SClaudiu Zissulescu j_s.d [blink] 741f7e3dc0SClaudiu Zissulescu sub r0, r2, r3 7586effd0dSVineet GuptaEND_CFI(strcmp) 76