diff options
author | David S. Miller <davem@davemloft.net> | 2008-12-09 01:07:09 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-09 01:07:09 -0800 |
commit | ae984d72e0632782dd98c3fcf469b9045ad0d449 (patch) | |
tree | cd1f09781fffee44c72218d354aa23d9bd069e52 /arch/sparc | |
parent | 5c03d590910a6ccddc144b382b0ecdb122c349f3 (diff) | |
download | linux-ae984d72e0632782dd98c3fcf469b9045ad0d449.tar.bz2 |
sparc: Unify strlen assembler.
Use the new asm/asm.h header to help commonize the
strlen assembler between 32-bit and 64-bit
While we're here, use proper linux/linkage.h macros
instead of by-hand stuff.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/lib/Makefile | 2 | ||||
-rw-r--r-- | arch/sparc/lib/strlen.S (renamed from arch/sparc/lib/strlen_64.S) | 40 | ||||
-rw-r--r-- | arch/sparc/lib/strlen_32.S | 81 |
3 files changed, 21 insertions, 102 deletions
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index 05ae5c945e35..0db2c61a0f78 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile @@ -6,7 +6,7 @@ ccflags-y := -Werror lib-$(CONFIG_SPARC32) += mul.o rem.o sdiv.o udiv.o umul.o urem.o ashrdi3.o lib-$(CONFIG_SPARC32) += memcpy.o memset.o -lib-y += strlen_$(BITS).o +lib-y += strlen.o lib-y += checksum_$(BITS).o lib-$(CONFIG_SPARC32) += blockops.o lib-y += memscan_$(BITS).o memcmp_$(BITS).o strncmp_$(BITS).o diff --git a/arch/sparc/lib/strlen_64.S b/arch/sparc/lib/strlen.S index e9ba1920d818..536f83507fbf 100644 --- a/arch/sparc/lib/strlen_64.S +++ b/arch/sparc/lib/strlen.S @@ -1,37 +1,38 @@ -/* strlen.S: Sparc64 optimized strlen code +/* strlen.S: Sparc optimized strlen code * Hand optimized from GNU libc's strlen * Copyright (C) 1991,1996 Free Software Foundation - * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) + * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net) * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) */ +#include <linux/linkage.h> +#include <asm/asm.h> + #define LO_MAGIC 0x01010101 #define HI_MAGIC 0x80808080 - .align 32 - .globl strlen - .type strlen,#function -strlen: + .text +ENTRY(strlen) mov %o0, %o1 andcc %o0, 3, %g0 - be,pt %icc, 9f + BRANCH32(be, pt, 9f) sethi %hi(HI_MAGIC), %o4 ldub [%o0], %o5 - brz,pn %o5, 11f + BRANCH_REG_ZERO(pn, %o5, 11f) add %o0, 1, %o0 andcc %o0, 3, %g0 - be,pn %icc, 4f + BRANCH32(be, pn, 4f) or %o4, %lo(HI_MAGIC), %o3 ldub [%o0], %o5 - brz,pn %o5, 12f + BRANCH_REG_ZERO(pn, %o5, 12f) add %o0, 1, %o0 andcc %o0, 3, %g0 - be,pt %icc, 5f + BRANCH32(be, pt, 5f) sethi %hi(LO_MAGIC), %o4 ldub [%o0], %o5 - brz,pn %o5, 13f + BRANCH_REG_ZERO(pn, %o5, 13f) add %o0, 1, %o0 - ba,pt %icc, 8f + BRANCH32(ba, pt, 8f) or %o4, %lo(LO_MAGIC), %o2 9: or %o4, %lo(HI_MAGIC), %o3 @@ -44,24 +45,24 @@ strlen: 2: sub %o5, %o2, %o4 andcc %o4, %o3, %g0 - be,pt %icc, 8b + BRANCH32(be, pt, 8b) add %o0, 4, %o0 /* Check every byte. */ srl %o5, 24, %g7 andcc %g7, 0xff, %g0 - be,pn %icc, 1f + BRANCH32(be, pn, 1f) add %o0, -4, %o4 srl %o5, 16, %g7 andcc %g7, 0xff, %g0 - be,pn %icc, 1f + BRANCH32(be, pn, 1f) add %o4, 1, %o4 srl %o5, 8, %g7 andcc %g7, 0xff, %g0 - be,pn %icc, 1f + BRANCH32(be, pn, 1f) add %o4, 1, %o4 andcc %o5, 0xff, %g0 - bne,a,pt %icc, 2b + BRANCH32_ANNUL(bne, pt, 2b) ld [%o0], %o5 add %o4, 1, %o4 1: @@ -76,5 +77,4 @@ strlen: 13: retl mov 2, %o0 - - .size strlen, .-strlen +ENDPROC(strlen) diff --git a/arch/sparc/lib/strlen_32.S b/arch/sparc/lib/strlen_32.S deleted file mode 100644 index ed9a763368cd..000000000000 --- a/arch/sparc/lib/strlen_32.S +++ /dev/null @@ -1,81 +0,0 @@ -/* strlen.S: Sparc optimized strlen code - * Hand optimized from GNU libc's strlen - * Copyright (C) 1991,1996 Free Software Foundation - * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) - * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - */ - -#define LO_MAGIC 0x01010101 -#define HI_MAGIC 0x80808080 - -0: - ldub [%o0], %o5 - cmp %o5, 0 - be 1f - add %o0, 1, %o0 - andcc %o0, 3, %g0 - be 4f - or %o4, %lo(HI_MAGIC), %o3 - ldub [%o0], %o5 - cmp %o5, 0 - be 2f - add %o0, 1, %o0 - andcc %o0, 3, %g0 - be 5f - sethi %hi(LO_MAGIC), %o4 - ldub [%o0], %o5 - cmp %o5, 0 - be 3f - add %o0, 1, %o0 - b 8f - or %o4, %lo(LO_MAGIC), %o2 -1: - retl - mov 0, %o0 -2: - retl - mov 1, %o0 -3: - retl - mov 2, %o0 - - .align 4 - .global strlen -strlen: - mov %o0, %o1 - andcc %o0, 3, %g0 - bne 0b - sethi %hi(HI_MAGIC), %o4 - or %o4, %lo(HI_MAGIC), %o3 -4: - sethi %hi(LO_MAGIC), %o4 -5: - or %o4, %lo(LO_MAGIC), %o2 -8: - ld [%o0], %o5 -2: - sub %o5, %o2, %o4 - andcc %o4, %o3, %g0 - be 8b - add %o0, 4, %o0 - - /* Check every byte. */ - srl %o5, 24, %g5 - andcc %g5, 0xff, %g0 - be 1f - add %o0, -4, %o4 - srl %o5, 16, %g5 - andcc %g5, 0xff, %g0 - be 1f - add %o4, 1, %o4 - srl %o5, 8, %g5 - andcc %g5, 0xff, %g0 - be 1f - add %o4, 1, %o4 - andcc %o5, 0xff, %g0 - bne,a 2b - ld [%o0], %o5 - add %o4, 1, %o4 -1: - retl - sub %o4, %o1, %o0 |