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> 10d3867f04SAl Viro#include <asm/export.h> 11ae984d72SDavid S. Miller 12ae984d72SDavid S. Miller#define LO_MAGIC 0x01010101 13ae984d72SDavid S. Miller#define HI_MAGIC 0x80808080 14ae984d72SDavid S. Miller 15ae984d72SDavid S. Miller .text 16ae984d72SDavid S. MillerENTRY(strlen) 17ae984d72SDavid S. Miller mov %o0, %o1 18ae984d72SDavid S. Miller andcc %o0, 3, %g0 19ae984d72SDavid S. Miller BRANCH32(be, pt, 9f) 20ae984d72SDavid S. Miller sethi %hi(HI_MAGIC), %o4 21ae984d72SDavid S. Miller ldub [%o0], %o5 22ae984d72SDavid S. Miller BRANCH_REG_ZERO(pn, %o5, 11f) 23ae984d72SDavid S. Miller add %o0, 1, %o0 24ae984d72SDavid S. Miller andcc %o0, 3, %g0 25ae984d72SDavid S. Miller BRANCH32(be, pn, 4f) 26ae984d72SDavid S. Miller or %o4, %lo(HI_MAGIC), %o3 27ae984d72SDavid S. Miller ldub [%o0], %o5 28ae984d72SDavid S. Miller BRANCH_REG_ZERO(pn, %o5, 12f) 29ae984d72SDavid S. Miller add %o0, 1, %o0 30ae984d72SDavid S. Miller andcc %o0, 3, %g0 31ae984d72SDavid S. Miller BRANCH32(be, pt, 5f) 32ae984d72SDavid S. Miller sethi %hi(LO_MAGIC), %o4 33ae984d72SDavid S. Miller ldub [%o0], %o5 34ae984d72SDavid S. Miller BRANCH_REG_ZERO(pn, %o5, 13f) 35ae984d72SDavid S. Miller add %o0, 1, %o0 36ae984d72SDavid S. Miller BRANCH32(ba, pt, 8f) 37ae984d72SDavid S. Miller or %o4, %lo(LO_MAGIC), %o2 38ae984d72SDavid S. Miller9: 39ae984d72SDavid S. Miller or %o4, %lo(HI_MAGIC), %o3 40ae984d72SDavid S. Miller4: 41ae984d72SDavid S. Miller sethi %hi(LO_MAGIC), %o4 42ae984d72SDavid S. Miller5: 43ae984d72SDavid S. Miller or %o4, %lo(LO_MAGIC), %o2 44ae984d72SDavid S. Miller8: 45ae984d72SDavid S. Miller ld [%o0], %o5 46ae984d72SDavid S. Miller2: 47ae984d72SDavid S. Miller sub %o5, %o2, %o4 48ae984d72SDavid S. Miller andcc %o4, %o3, %g0 49ae984d72SDavid S. Miller BRANCH32(be, pt, 8b) 50ae984d72SDavid S. Miller add %o0, 4, %o0 51ae984d72SDavid S. Miller 52ae984d72SDavid S. Miller /* Check every byte. */ 53ae984d72SDavid S. Miller srl %o5, 24, %g7 54ae984d72SDavid S. Miller andcc %g7, 0xff, %g0 55ae984d72SDavid S. Miller BRANCH32(be, pn, 1f) 56ae984d72SDavid S. Miller add %o0, -4, %o4 57ae984d72SDavid S. Miller srl %o5, 16, %g7 58ae984d72SDavid S. Miller andcc %g7, 0xff, %g0 59ae984d72SDavid S. Miller BRANCH32(be, pn, 1f) 60ae984d72SDavid S. Miller add %o4, 1, %o4 61ae984d72SDavid S. Miller srl %o5, 8, %g7 62ae984d72SDavid S. Miller andcc %g7, 0xff, %g0 63ae984d72SDavid S. Miller BRANCH32(be, pn, 1f) 64ae984d72SDavid S. Miller add %o4, 1, %o4 65ae984d72SDavid S. Miller andcc %o5, 0xff, %g0 66ae984d72SDavid S. Miller BRANCH32_ANNUL(bne, pt, 2b) 67ae984d72SDavid S. Miller ld [%o0], %o5 68ae984d72SDavid S. Miller add %o4, 1, %o4 69ae984d72SDavid S. Miller1: 70ae984d72SDavid S. Miller retl 71ae984d72SDavid S. Miller sub %o4, %o1, %o0 72ae984d72SDavid S. Miller11: 73ae984d72SDavid S. Miller retl 74ae984d72SDavid S. Miller mov 0, %o0 75ae984d72SDavid S. Miller12: 76ae984d72SDavid S. Miller retl 77ae984d72SDavid S. Miller mov 1, %o0 78ae984d72SDavid S. Miller13: 79ae984d72SDavid S. Miller retl 80ae984d72SDavid S. Miller mov 2, %o0 81ae984d72SDavid S. MillerENDPROC(strlen) 82d3867f04SAl ViroEXPORT_SYMBOL(strlen) 83