1 /* SPDX-License-Identifier: GPL-2.0 */ << 2 /* strlen.S: Sparc optimized strlen code 1 /* strlen.S: Sparc optimized strlen code 3 * Hand optimized from GNU libc's strlen 2 * Hand optimized from GNU libc's strlen 4 * Copyright (C) 1991,1996 Free Software Found 3 * Copyright (C) 1991,1996 Free Software Foundation 5 * Copyright (C) 1996,2008 David S. Miller (da !! 4 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 6 * Copyright (C) 1996, 1997 Jakub Jelinek (jj@ !! 5 * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 7 */ 6 */ 8 7 9 #include <linux/export.h> !! 8 #include <asm/cprefix.h> 10 #include <linux/linkage.h> << 11 #include <asm/asm.h> << 12 9 13 #define LO_MAGIC 0x01010101 10 #define LO_MAGIC 0x01010101 14 #define HI_MAGIC 0x80808080 11 #define HI_MAGIC 0x80808080 15 12 16 .text !! 13 0: 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 14 ldub [%o0], %o5 23 BRANCH_REG_ZERO(pn, %o5, 11f) !! 15 cmp %o5, 0 >> 16 be 1f 24 add %o0, 1, %o0 17 add %o0, 1, %o0 25 andcc %o0, 3, %g0 18 andcc %o0, 3, %g0 26 BRANCH32(be, pn, 4f) !! 19 be 4f 27 or %o4, %lo(HI_MAGIC), %o3 20 or %o4, %lo(HI_MAGIC), %o3 28 ldub [%o0], %o5 21 ldub [%o0], %o5 29 BRANCH_REG_ZERO(pn, %o5, 12f) !! 22 cmp %o5, 0 >> 23 be 2f 30 add %o0, 1, %o0 24 add %o0, 1, %o0 31 andcc %o0, 3, %g0 25 andcc %o0, 3, %g0 32 BRANCH32(be, pt, 5f) !! 26 be 5f 33 sethi %hi(LO_MAGIC), %o4 27 sethi %hi(LO_MAGIC), %o4 34 ldub [%o0], %o5 28 ldub [%o0], %o5 35 BRANCH_REG_ZERO(pn, %o5, 13f) !! 29 cmp %o5, 0 >> 30 be 3f 36 add %o0, 1, %o0 31 add %o0, 1, %o0 37 BRANCH32(ba, pt, 8f) !! 32 b 8f 38 or %o4, %lo(LO_MAGIC), %o2 33 or %o4, %lo(LO_MAGIC), %o2 39 9: !! 34 1: >> 35 retl >> 36 mov 0, %o0 >> 37 2: >> 38 retl >> 39 mov 1, %o0 >> 40 3: >> 41 retl >> 42 mov 2, %o0 >> 43 >> 44 .align 4 >> 45 .global C_LABEL(strlen) >> 46 C_LABEL(strlen): >> 47 mov %o0, %o1 >> 48 andcc %o0, 3, %g0 >> 49 bne 0b >> 50 sethi %hi(HI_MAGIC), %o4 40 or %o4, %lo(HI_MAGIC), %o3 51 or %o4, %lo(HI_MAGIC), %o3 41 4: 52 4: 42 sethi %hi(LO_MAGIC), %o4 53 sethi %hi(LO_MAGIC), %o4 43 5: 54 5: 44 or %o4, %lo(LO_MAGIC), %o2 55 or %o4, %lo(LO_MAGIC), %o2 45 8: 56 8: 46 ld [%o0], %o5 57 ld [%o0], %o5 47 2: 58 2: 48 sub %o5, %o2, %o4 59 sub %o5, %o2, %o4 49 andcc %o4, %o3, %g0 60 andcc %o4, %o3, %g0 50 BRANCH32(be, pt, 8b) !! 61 be 8b 51 add %o0, 4, %o0 62 add %o0, 4, %o0 52 63 53 /* Check every byte. */ 64 /* Check every byte. */ 54 srl %o5, 24, %g7 !! 65 srl %o5, 24, %g5 55 andcc %g7, 0xff, %g0 !! 66 andcc %g5, 0xff, %g0 56 BRANCH32(be, pn, 1f) !! 67 be 1f 57 add %o0, -4, %o4 68 add %o0, -4, %o4 58 srl %o5, 16, %g7 !! 69 srl %o5, 16, %g5 59 andcc %g7, 0xff, %g0 !! 70 andcc %g5, 0xff, %g0 60 BRANCH32(be, pn, 1f) !! 71 be 1f 61 add %o4, 1, %o4 72 add %o4, 1, %o4 62 srl %o5, 8, %g7 !! 73 srl %o5, 8, %g5 63 andcc %g7, 0xff, %g0 !! 74 andcc %g5, 0xff, %g0 64 BRANCH32(be, pn, 1f) !! 75 be 1f 65 add %o4, 1, %o4 76 add %o4, 1, %o4 66 andcc %o5, 0xff, %g0 77 andcc %o5, 0xff, %g0 67 BRANCH32_ANNUL(bne, pt, 2b) !! 78 bne,a 2b 68 ld [%o0], %o5 79 ld [%o0], %o5 69 add %o4, 1, %o4 80 add %o4, 1, %o4 70 1: 81 1: 71 retl 82 retl 72 sub %o4, %o1, %o0 83 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.