patch-1.3.93 linux/arch/sparc/lib/strlen.S
Next file: linux/arch/sparc/mm/Makefile
Previous file: linux/arch/sparc/lib/memset.c
Back to the patch index
Back to the overall index
- Lines: 89
- Date:
Sun Apr 21 12:30:31 1996
- Orig file:
v1.3.92/linux/arch/sparc/lib/strlen.S
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.92/linux/arch/sparc/lib/strlen.S linux/arch/sparc/lib/strlen.S
@@ -0,0 +1,88 @@
+/* strlen.S: Sparc optimized strlen().
+ *
+ * This was hand optimized by davem@caip.rutgers.edu from
+ * the C-code in GNU-libc.
+ */
+
+#include <asm/cprefix.h>
+
+#define LO_MAGIC 0x01010101
+#define HI_MAGIC 0x80808080
+
+ .align 4
+ .global C_LABEL(strlen)
+C_LABEL(strlen):
+ mov %o0,%o1
+ andcc %o0,3,%g0 ! and with %o0 so no dependency problems
+ be scan_words
+ sethi %hi(HI_MAGIC),%g2 ! common case and most Sparcs predict taken
+
+ ldsb [%o0],%g2
+still_not_word_aligned:
+ cmp %g2,0
+ bne,a 1f
+ add %o0,1,%o0
+
+ /* Ok, so there are tons of quick interlocks above for the
+ * < 4 length string unaligned... not too common so I'm not
+ * very concerned.
+ */
+ retl
+ sub %o0,%o1,%o0
+
+1:
+ andcc %o0,3,%g0
+ bne,a still_not_word_aligned
+ ldsb [%o0],%g2
+
+ /* HyperSparc executes each sethi/or pair in 1 cycle. */
+ sethi %hi(HI_MAGIC),%g2
+scan_words:
+ or %g2,%lo(HI_MAGIC),%o3
+ sethi %hi(LO_MAGIC),%g3
+ or %g3,%lo(LO_MAGIC),%o2
+next_word:
+ ld [%o0],%g2 ! no dependancies
+next_word_preloaded:
+ sub %g2,%o2,%g2 ! lots of locks here
+ andcc %g2,%o3,%g0 ! and I dont like it...
+ be next_word
+ add %o0,4,%o0
+
+ /* Check every byte. */
+byte_zero:
+ ldsb [%o0-4],%g2
+ cmp %g2,0
+ bne byte_one
+ add %o0,-4,%g3
+
+ retl
+ sub %g3,%o1,%o0
+
+byte_one:
+ ldsb [%o0-3],%g2
+ cmp %g2,0
+ bne,a byte_two_and_three
+ ldsb [%o0-2],%g2
+
+ sub %g3,%o1,%o0
+ retl
+ add %o0,1,%o0
+
+byte_two_and_three:
+ cmp %g2,0
+ be,a found_it
+ sub %g3,%o1,%o0
+
+ ldsb [%o0-1],%g2
+ cmp %g2,0
+ bne,a next_word_preloaded
+ ld [%o0],%g2
+
+ sub %g3,%o1,%o0
+ retl
+ add %o0,3,%o0
+
+found_it:
+ retl
+ add %o0,2,%o0
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this