aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-02-09 15:18:58 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-02-09 15:23:18 +0000
commitb49a0db6628e6f953504ebc8712ed582471ccd05 (patch)
tree3b4b7976058cca4d471cf0ea948d8f1cad3dee11 /sys
parentec090f4a67654fa541e6d97fd5f74d3f66c1c0d0 (diff)
downloadsrc-b49a0db6628e6f953504ebc8712ed582471ccd05.tar.gz
src-b49a0db6628e6f953504ebc8712ed582471ccd05.zip
Revert "amd64: implement strlen in assembly"
This reverts commit af366d353b84bdc4e730f0fc563853abc338271c. Trips over '\xa4' byte and terminates early, as found in lib/libc/gen/setdomainname_test:setdomainname_basic testcase However, keep moving libkern/strlen.c out of conf/files. Reported by: lwhsu
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/support.S66
-rw-r--r--sys/conf/files.amd641
2 files changed, 1 insertions, 66 deletions
diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S
index a059b520c5d5..b623fba277db 100644
--- a/sys/amd64/amd64/support.S
+++ b/sys/amd64/amd64/support.S
@@ -697,72 +697,6 @@ ENTRY(fillw)
ret
END(fillw)
-/*
- * strlen(string)
- * %rdi
- *
- * Uses the ((x - 0x01....01) & ~x & 0x80....80) trick.
- *
- * 0x01....01 is replaced with 0x0 - 0x01....01 so that it can be added
- * with leaq.
- *
- * For a description see either:
- * - "Hacker's Delight" by Henry S. Warren, Jr.
- * - "Optimizing subroutines in assembly language: An optimization guide for x86 platforms"
- * by Agner Fog
- *
- * The latter contains a 32-bit variant of the same algorithm coded in assembly for i386.
- */
-ENTRY(strlen)
- PUSH_FRAME_POINTER
- movabsq $0xfefefefefefefeff,%r8
- movabsq $0x8080808080808080,%r9
-
- movq %rdi,%r10
- movq %rdi,%rcx
- testb $7,%dil
- jz 2f
-
- /*
- * Handle misaligned reads: align to 8 and fill
- * the spurious bytes.
- */
- andq $~7,%rdi
- movq (%rdi),%r11
- shlq $3,%rcx
- movq $-1,%rdx
- shlq %cl,%rdx
- notq %rdx
- orq %rdx,%r11
-
- leaq (%r11,%r8),%rcx
- notq %r11
- andq %r11,%rcx
- andq %r9,%rcx
- jnz 3f
-
- /*
- * Main loop.
- */
- ALIGN_TEXT
-1:
- leaq 8(%rdi),%rdi
-2:
- movq (%rdi),%r11
- leaq (%r11,%r8),%rcx
- notq %r11
- andq %rcx,%r11
- andq %r9,%rcx
- jz 1b
-3:
- bsfq %rcx,%rcx
- shrq $3,%rcx
- leaq (%rcx,%rdi),%rax
- subq %r10,%rax
- POP_FRAME_POINTER
- ret
-END(strlen)
-
/*****************************************************************************/
/* copyout and fubyte family */
/*****************************************************************************/
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 395f501198f8..98a78a8b1ef9 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -390,6 +390,7 @@ isa/syscons_isa.c optional sc
isa/vga_isa.c optional vga
kern/imgact_aout.c optional compat_aout
kern/link_elf_obj.c standard
+libkern/strlen.c standard
#
# IA32 binary support
#