summaryrefslogtreecommitdiff
path: root/arch/sparc/lib
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-12-09 01:07:09 -0800
committerDavid S. Miller <davem@davemloft.net>2008-12-09 01:07:09 -0800
commitae984d72e0632782dd98c3fcf469b9045ad0d449 (patch)
treecd1f09781fffee44c72218d354aa23d9bd069e52 /arch/sparc/lib
parent5c03d590910a6ccddc144b382b0ecdb122c349f3 (diff)
downloadlwn-ae984d72e0632782dd98c3fcf469b9045ad0d449.tar.gz
lwn-ae984d72e0632782dd98c3fcf469b9045ad0d449.zip
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/lib')
-rw-r--r--arch/sparc/lib/Makefile2
-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.S81
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