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