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