| /* | |
| * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) | |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License version 2 as | |
| * published by the Free Software Foundation. | |
| */ | |
| #include <linux/linkage.h> | |
| ENTRY_CFI(strcmp) | |
| or r2, r0, r1 | |
| bmsk_s r2, r2, 1 | |
| brne r2, 0, @.Lcharloop | |
| ;;; s1 and s2 are word aligned | |
| ld.ab r2, [r0, 4] | |
| mov_s r12, 0x01010101 | |
| ror r11, r12 | |
| .align 4 | |
| .LwordLoop: | |
| ld.ab r3, [r1, 4] | |
| ;; Detect NULL char in str1 | |
| sub r4, r2, r12 | |
| ld.ab r5, [r0, 4] | |
| bic r4, r4, r2 | |
| and r4, r4, r11 | |
| brne.d.nt r4, 0, .LfoundNULL | |
| ;; Check if the read locations are the same | |
| cmp r2, r3 | |
| beq.d .LwordLoop | |
| mov.eq r2, r5 | |
| ;; A match is found, spot it out | |
| #ifdef __LITTLE_ENDIAN__ | |
| swape r3, r3 | |
| mov_s r0, 1 | |
| swape r2, r2 | |
| #else | |
| mov_s r0, 1 | |
| #endif | |
| cmp_s r2, r3 | |
| j_s.d [blink] | |
| bset.lo r0, r0, 31 | |
| .align 4 | |
| .LfoundNULL: | |
| #ifdef __BIG_ENDIAN__ | |
| swape r4, r4 | |
| swape r2, r2 | |
| swape r3, r3 | |
| #endif | |
| ;; Find null byte | |
| ffs r0, r4 | |
| bmsk r2, r2, r0 | |
| bmsk r3, r3, r0 | |
| swape r2, r2 | |
| swape r3, r3 | |
| ;; make the return value | |
| sub.f r0, r2, r3 | |
| mov.hi r0, 1 | |
| j_s.d [blink] | |
| bset.lo r0, r0, 31 | |
| .align 4 | |
| .Lcharloop: | |
| ldb.ab r2, [r0, 1] | |
| ldb.ab r3, [r1, 1] | |
| nop | |
| breq r2, 0, .Lcmpend | |
| breq r2, r3, .Lcharloop | |
| .align 4 | |
| .Lcmpend: | |
| j_s.d [blink] | |
| sub r0, r2, r3 | |
| END_CFI(strcmp) |