94eca17094
Upstream commit: ede8d94d154157d269b18f3601440ac576c1f96a - csu: Implement and use _dl_early_allocate during static startup - Linux: Introduce __brk_call for invoking the brk system call - Linux: Implement a useful version of _startup_fatal - ia64: Always define IA64_USE_NEW_STUB as a flag macro - Linux: Define MMAP_CALL_INTERNAL - i386: Honor I386_USE_SYSENTER for 6-argument Linux system calls - i386: Remove OPTIMIZE_FOR_GCC_5 from Linux libc-do-syscall.S - elf: Remove __libc_init_secure - Linux: Consolidate auxiliary vector parsing (redo) - Linux: Include <dl-auxv.h> in dl-sysdep.c only for SHARED - Revert "Linux: Consolidate auxiliary vector parsing" - Linux: Consolidate auxiliary vector parsing - Linux: Assume that NEED_DL_SYSINFO_DSO is always defined - Linux: Remove DL_FIND_ARG_COMPONENTS - Linux: Remove HAVE_AUX_SECURE, HAVE_AUX_XID, HAVE_AUX_PAGESIZE - elf: Merge dl-sysdep.c into the Linux version - elf: Remove unused NEED_DL_BASE_ADDR and _dl_base_addr - x86: Optimize {str|wcs}rchr-evex - x86: Optimize {str|wcs}rchr-avx2 - x86: Optimize {str|wcs}rchr-sse2 - x86: Cleanup page cross code in memcmp-avx2-movbe.S - x86: Remove memcmp-sse4.S - x86: Small improvements for wcslen - x86: Remove AVX str{n}casecmp - x86: Add EVEX optimized str{n}casecmp - x86: Add AVX2 optimized str{n}casecmp - x86: Optimize str{n}casecmp TOLOWER logic in strcmp-sse42.S - x86: Optimize str{n}casecmp TOLOWER logic in strcmp.S - x86: Remove strspn-sse2.S and use the generic implementation - x86: Remove strpbrk-sse2.S and use the generic implementation - x86: Remove strcspn-sse2.S and use the generic implementation - x86: Optimize strspn in strspn-c.c - x86: Optimize strcspn and strpbrk in strcspn-c.c - x86: Code cleanup in strchr-evex and comment justifying branch - x86: Code cleanup in strchr-avx2 and comment justifying branch - x86_64: Remove bcopy optimizations - x86-64: Remove bzero weak alias in SS2 memset - x86_64/multiarch: Sort sysdep_routines and put one entry per line - x86: Improve L to support L(XXX_SYMBOL (YYY, ZZZ)) - fortify: Ensure that __glibc_fortify condition is a constant [BZ #29141]
119 lines
3.5 KiB
Diff
119 lines
3.5 KiB
Diff
commit 5997011826b7bbb7015f56bf143a6e4fd0f5a7df
|
|
Author: Noah Goldstein <goldstein.w.n@gmail.com>
|
|
Date: Wed Mar 23 16:57:36 2022 -0500
|
|
|
|
x86: Optimize str{n}casecmp TOLOWER logic in strcmp.S
|
|
|
|
Slightly faster method of doing TOLOWER that saves an
|
|
instruction.
|
|
|
|
Also replace the hard coded 5-byte no with .p2align 4. On builds with
|
|
CET enabled this misaligned entry to strcasecmp.
|
|
|
|
geometric_mean(N=40) of all benchmarks New / Original: .894
|
|
|
|
All string/memory tests pass.
|
|
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
|
|
|
|
(cherry picked from commit 670b54bc585ea4a94f3b2e9272ba44aa6b730b73)
|
|
|
|
diff --git a/sysdeps/x86_64/strcmp.S b/sysdeps/x86_64/strcmp.S
|
|
index 7f8a1bc756f86aee..ca70b540eb2dd190 100644
|
|
--- a/sysdeps/x86_64/strcmp.S
|
|
+++ b/sysdeps/x86_64/strcmp.S
|
|
@@ -78,9 +78,8 @@ ENTRY2 (__strcasecmp)
|
|
movq __libc_tsd_LOCALE@gottpoff(%rip),%rax
|
|
mov %fs:(%rax),%RDX_LP
|
|
|
|
- // XXX 5 byte should be before the function
|
|
- /* 5-byte NOP. */
|
|
- .byte 0x0f,0x1f,0x44,0x00,0x00
|
|
+ /* Either 1 or 5 bytes (dependeing if CET is enabled). */
|
|
+ .p2align 4
|
|
END2 (__strcasecmp)
|
|
# ifndef NO_NOLOCALE_ALIAS
|
|
weak_alias (__strcasecmp, strcasecmp)
|
|
@@ -97,9 +96,8 @@ ENTRY2 (__strncasecmp)
|
|
movq __libc_tsd_LOCALE@gottpoff(%rip),%rax
|
|
mov %fs:(%rax),%RCX_LP
|
|
|
|
- // XXX 5 byte should be before the function
|
|
- /* 5-byte NOP. */
|
|
- .byte 0x0f,0x1f,0x44,0x00,0x00
|
|
+ /* Either 1 or 5 bytes (dependeing if CET is enabled). */
|
|
+ .p2align 4
|
|
END2 (__strncasecmp)
|
|
# ifndef NO_NOLOCALE_ALIAS
|
|
weak_alias (__strncasecmp, strncasecmp)
|
|
@@ -149,22 +147,22 @@ ENTRY (STRCMP)
|
|
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
|
|
.section .rodata.cst16,"aM",@progbits,16
|
|
.align 16
|
|
-.Lbelowupper:
|
|
- .quad 0x4040404040404040
|
|
- .quad 0x4040404040404040
|
|
-.Ltopupper:
|
|
- .quad 0x5b5b5b5b5b5b5b5b
|
|
- .quad 0x5b5b5b5b5b5b5b5b
|
|
-.Ltouppermask:
|
|
+.Llcase_min:
|
|
+ .quad 0x3f3f3f3f3f3f3f3f
|
|
+ .quad 0x3f3f3f3f3f3f3f3f
|
|
+.Llcase_max:
|
|
+ .quad 0x9999999999999999
|
|
+ .quad 0x9999999999999999
|
|
+.Lcase_add:
|
|
.quad 0x2020202020202020
|
|
.quad 0x2020202020202020
|
|
.previous
|
|
- movdqa .Lbelowupper(%rip), %xmm5
|
|
-# define UCLOW_reg %xmm5
|
|
- movdqa .Ltopupper(%rip), %xmm6
|
|
-# define UCHIGH_reg %xmm6
|
|
- movdqa .Ltouppermask(%rip), %xmm7
|
|
-# define LCQWORD_reg %xmm7
|
|
+ movdqa .Llcase_min(%rip), %xmm5
|
|
+# define LCASE_MIN_reg %xmm5
|
|
+ movdqa .Llcase_max(%rip), %xmm6
|
|
+# define LCASE_MAX_reg %xmm6
|
|
+ movdqa .Lcase_add(%rip), %xmm7
|
|
+# define CASE_ADD_reg %xmm7
|
|
#endif
|
|
cmp $0x30, %ecx
|
|
ja LABEL(crosscache) /* rsi: 16-byte load will cross cache line */
|
|
@@ -175,22 +173,18 @@ ENTRY (STRCMP)
|
|
movhpd 8(%rdi), %xmm1
|
|
movhpd 8(%rsi), %xmm2
|
|
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
|
|
-# define TOLOWER(reg1, reg2) \
|
|
- movdqa reg1, %xmm8; \
|
|
- movdqa UCHIGH_reg, %xmm9; \
|
|
- movdqa reg2, %xmm10; \
|
|
- movdqa UCHIGH_reg, %xmm11; \
|
|
- pcmpgtb UCLOW_reg, %xmm8; \
|
|
- pcmpgtb reg1, %xmm9; \
|
|
- pcmpgtb UCLOW_reg, %xmm10; \
|
|
- pcmpgtb reg2, %xmm11; \
|
|
- pand %xmm9, %xmm8; \
|
|
- pand %xmm11, %xmm10; \
|
|
- pand LCQWORD_reg, %xmm8; \
|
|
- pand LCQWORD_reg, %xmm10; \
|
|
- por %xmm8, reg1; \
|
|
- por %xmm10, reg2
|
|
- TOLOWER (%xmm1, %xmm2)
|
|
+# define TOLOWER(reg1, reg2) \
|
|
+ movdqa LCASE_MIN_reg, %xmm8; \
|
|
+ movdqa LCASE_MIN_reg, %xmm9; \
|
|
+ paddb reg1, %xmm8; \
|
|
+ paddb reg2, %xmm9; \
|
|
+ pcmpgtb LCASE_MAX_reg, %xmm8; \
|
|
+ pcmpgtb LCASE_MAX_reg, %xmm9; \
|
|
+ pandn CASE_ADD_reg, %xmm8; \
|
|
+ pandn CASE_ADD_reg, %xmm9; \
|
|
+ paddb %xmm8, reg1; \
|
|
+ paddb %xmm9, reg2
|
|
+ TOLOWER (%xmm1, %xmm2)
|
|
#else
|
|
# define TOLOWER(reg1, reg2)
|
|
#endif
|