treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / arch / sparc / lib / strlen.S
blobdd111bbad5df9063337ba7f2c9b72903399416f1
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* strlen.S: Sparc optimized strlen code
3  * Hand optimized from GNU libc's strlen
4  * Copyright (C) 1991,1996 Free Software Foundation
5  * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net)
6  * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
7  */
9 #include <linux/linkage.h>
10 #include <asm/asm.h>
11 #include <asm/export.h>
13 #define LO_MAGIC 0x01010101
14 #define HI_MAGIC 0x80808080
16         .text
17 ENTRY(strlen)
18         mov     %o0, %o1
19         andcc   %o0, 3, %g0
20         BRANCH32(be, pt, 9f)
21          sethi  %hi(HI_MAGIC), %o4
22         ldub    [%o0], %o5
23         BRANCH_REG_ZERO(pn, %o5, 11f)
24          add    %o0, 1, %o0
25         andcc   %o0, 3, %g0
26         BRANCH32(be, pn, 4f)
27          or     %o4, %lo(HI_MAGIC), %o3
28         ldub    [%o0], %o5
29         BRANCH_REG_ZERO(pn, %o5, 12f)
30          add    %o0, 1, %o0
31         andcc   %o0, 3, %g0
32         BRANCH32(be, pt, 5f)
33          sethi  %hi(LO_MAGIC), %o4
34         ldub    [%o0], %o5
35         BRANCH_REG_ZERO(pn, %o5, 13f)
36          add    %o0, 1, %o0
37         BRANCH32(ba, pt, 8f)
38          or     %o4, %lo(LO_MAGIC), %o2
40         or      %o4, %lo(HI_MAGIC), %o3
42         sethi   %hi(LO_MAGIC), %o4
44         or      %o4, %lo(LO_MAGIC), %o2
46         ld      [%o0], %o5
48         sub     %o5, %o2, %o4
49         andcc   %o4, %o3, %g0
50         BRANCH32(be, pt, 8b)
51          add    %o0, 4, %o0
53         /* Check every byte. */
54         srl     %o5, 24, %g7
55         andcc   %g7, 0xff, %g0
56         BRANCH32(be, pn, 1f)
57          add    %o0, -4, %o4
58         srl     %o5, 16, %g7
59         andcc   %g7, 0xff, %g0
60         BRANCH32(be, pn, 1f)
61          add    %o4, 1, %o4
62         srl     %o5, 8, %g7
63         andcc   %g7, 0xff, %g0
64         BRANCH32(be, pn, 1f)
65          add    %o4, 1, %o4
66         andcc   %o5, 0xff, %g0
67         BRANCH32_ANNUL(bne, pt, 2b)
68          ld     [%o0], %o5
69         add     %o4, 1, %o4
71         retl
72          sub    %o4, %o1, %o0
73 11:
74         retl
75          mov    0, %o0
76 12:
77         retl
78          mov    1, %o0
79 13:
80         retl
81          mov    2, %o0
82 ENDPROC(strlen)
83 EXPORT_SYMBOL(strlen)