1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gni !! 2 /* strlen.S: Sparc optimized strlen code 3 * !! 3 * Hand optimized from GNU libc's strlen 4 * "strlen" implementation of SuperH !! 4 * Copyright (C) 1991,1996 Free Software Foundation 5 * !! 5 * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net) 6 * Copyright (C) 1999 Kaz Kojima !! 6 * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 7 * << 8 */ 7 */ 9 8 10 /* size_t strlen (const char *s) */ !! 9 #include <linux/export.h> 11 << 12 #include <linux/linkage.h> 10 #include <linux/linkage.h> 13 ENTRY(strlen) !! 11 #include <asm/asm.h> 14 mov r4,r0 << 15 and #3,r0 << 16 tst r0,r0 << 17 bt/s 1f << 18 mov #0,r2 << 19 << 20 add #-1,r0 << 21 shll2 r0 << 22 shll r0 << 23 braf r0 << 24 nop << 25 12 26 mov.b @r4+,r1 !! 13 #define LO_MAGIC 0x01010101 27 tst r1,r1 !! 14 #define HI_MAGIC 0x80808080 28 bt 8f << 29 add #1,r2 << 30 15 31 mov.b @r4+,r1 !! 16 .text 32 tst r1,r1 !! 17 ENTRY(strlen) 33 bt 8f !! 18 mov %o0, %o1 34 add #1,r2 !! 19 andcc %o0, 3, %g0 35 !! 20 BRANCH32(be, pt, 9f) 36 mov.b @r4+,r1 !! 21 sethi %hi(HI_MAGIC), %o4 37 tst r1,r1 !! 22 ldub [%o0], %o5 38 bt 8f !! 23 BRANCH_REG_ZERO(pn, %o5, 11f) 39 add #1,r2 !! 24 add %o0, 1, %o0 40 !! 25 andcc %o0, 3, %g0 41 1: !! 26 BRANCH32(be, pn, 4f) 42 mov #0,r3 !! 27 or %o4, %lo(HI_MAGIC), %o3 43 2: !! 28 ldub [%o0], %o5 44 mov.l @r4+,r1 !! 29 BRANCH_REG_ZERO(pn, %o5, 12f) 45 cmp/str r3,r1 !! 30 add %o0, 1, %o0 46 bf/s 2b !! 31 andcc %o0, 3, %g0 47 add #4,r2 !! 32 BRANCH32(be, pt, 5f) 48 !! 33 sethi %hi(LO_MAGIC), %o4 49 add #-4,r2 !! 34 ldub [%o0], %o5 50 #ifndef __LITTLE_ENDIAN__ !! 35 BRANCH_REG_ZERO(pn, %o5, 13f) 51 swap.b r1,r1 !! 36 add %o0, 1, %o0 52 swap.w r1,r1 !! 37 BRANCH32(ba, pt, 8f) 53 swap.b r1,r1 !! 38 or %o4, %lo(LO_MAGIC), %o2 54 #endif !! 39 9: 55 extu.b r1,r0 !! 40 or %o4, %lo(HI_MAGIC), %o3 56 tst r0,r0 !! 41 4: 57 bt/s 8f !! 42 sethi %hi(LO_MAGIC), %o4 58 shlr8 r1 !! 43 5: 59 add #1,r2 !! 44 or %o4, %lo(LO_MAGIC), %o2 60 extu.b r1,r0 << 61 tst r0,r0 << 62 bt/s 8f << 63 shlr8 r1 << 64 add #1,r2 << 65 extu.b r1,r0 << 66 tst r0,r0 << 67 bt 8f << 68 add #1,r2 << 69 8: 45 8: 70 rts !! 46 ld [%o0], %o5 71 mov r2,r0 !! 47 2: >> 48 sub %o5, %o2, %o4 >> 49 andcc %o4, %o3, %g0 >> 50 BRANCH32(be, pt, 8b) >> 51 add %o0, 4, %o0 >> 52 >> 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 >> 70 1: >> 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)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.