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