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