1/* strlen.S: Sparc64 optimized strlen code 2 * Hand optimized from GNU libc's strlen 3 * Copyright (C) 1991,1996 Free Software Foundation 4 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 5 * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 6 */ 7 8#define LO_MAGIC 0x01010101 9#define HI_MAGIC 0x80808080 10 11 .align 32 12 .global strlen, __strlen 13strlen: 14__strlen: 15 mov %o0, %o1 16 andcc %o0, 3, %g0 17 be,pt %icc, 9f 18 sethi %hi(HI_MAGIC), %o4 19 ldub [%o0], %o5 20 brz,pn %o5, 11f 21 add %o0, 1, %o0 22 andcc %o0, 3, %g0 23 be,pn %icc, 4f 24 or %o4, %lo(HI_MAGIC), %o3 25 ldub [%o0], %o5 26 brz,pn %o5, 12f 27 add %o0, 1, %o0 28 andcc %o0, 3, %g0 29 be,pt %icc, 5f 30 sethi %hi(LO_MAGIC), %o4 31 ldub [%o0], %o5 32 brz,pn %o5, 13f 33 add %o0, 1, %o0 34 ba,pt %icc, 8f 35 or %o4, %lo(LO_MAGIC), %o2 369: 37 or %o4, %lo(HI_MAGIC), %o3 384: 39 sethi %hi(LO_MAGIC), %o4 405: 41 or %o4, %lo(LO_MAGIC), %o2 428: 43 ld [%o0], %o5 442: 45 sub %o5, %o2, %o4 46 andcc %o4, %o3, %g0 47 be,pt %icc, 8b 48 add %o0, 4, %o0 49 50 /* Check every byte. */ 51 srl %o5, 24, %g5 52 andcc %g5, 0xff, %g0 53 be,pn %icc, 1f 54 add %o0, -4, %o4 55 srl %o5, 16, %g5 56 andcc %g5, 0xff, %g0 57 be,pn %icc, 1f 58 add %o4, 1, %o4 59 srl %o5, 8, %g5 60 andcc %g5, 0xff, %g0 61 be,pn %icc, 1f 62 add %o4, 1, %o4 63 andcc %o5, 0xff, %g0 64 bne,a,pt %icc, 2b 65 ld [%o0], %o5 66 add %o4, 1, %o4 671: 68 retl 69 sub %o4, %o1, %o0 7011: 71 retl 72 mov 0, %o0 7312: 74 retl 75 mov 1, %o0 7613: 77 retl 78 mov 2, %o0 79