x86-64: Implement strcmp family IFUNC selectors in C
commit11ffcacb64a939c10cfc713746b8ec88837f5c4a
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 21 Jun 2017 19:10:50 +0000 (21 12:10 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 21 Jun 2017 19:11:06 +0000 (21 12:11 -0700)
tree628e976f8ba6f657300dd0ed4705ee5e8f67f0fa
parent9649350d2ee47fae00794d57e2526aa5d67d900e
x86-64: Implement strcmp family IFUNC selectors in C

Implement strcmp family IFUNC selectors in C.

All internal calls within libc.so can use IFUNC on x86-64 since unlike
x86, x86-64 supports PC-relative addressing to access the GOT entry so
that it can call via PLT without using an extra register.  For libc.a,
we can't use IFUNC for functions which are called before IFUNC has been
initialized.  Use IFUNC internally reduces the icache footprint since
libc.so and other codes in the process use the same implementations.
This patch uses IFUNC for strcmp family functions within libc.

* sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Add
strcmp-sse2, strcmp-sse4_2, strncmp-sse2, strncmp-sse4_2,
strcasecmp_l-sse2, strcasecmp_l-sse4_2, strcasecmp_l-avx,
strncase_l-sse2, strncase_l-sse4_2 and strncase_l-avx.
* sysdeps/x86_64/multiarch/ifunc-strcasecmp.h: New file.
* sysdeps/x86_64/multiarch/strcasecmp.c: Likewise.
* sysdeps/x86_64/multiarch/strcasecmp_l-avx.S: Likewise.
* sysdeps/x86_64/multiarch/strcasecmp_l-sse2.S: Likewise.
* sysdeps/x86_64/multiarch/strcasecmp_l-sse4_2.S: Likewise.
* sysdeps/x86_64/multiarch/strcasecmp_l.c: Likewise.
* sysdeps/x86_64/multiarch/strcmp-sse2.S: Likewise.
* sysdeps/x86_64/multiarch/strcmp-sse4_2.S: Likewise.
* sysdeps/x86_64/multiarch/strcmp.c: Likewise.
* sysdeps/x86_64/multiarch/strncase.c: Likewise.
* sysdeps/x86_64/multiarch/strncase_l-avx.S : Likewise.
* sysdeps/x86_64/multiarch/strncase_l-sse2.S: Likewise.
* sysdeps/x86_64/multiarch/strncase_l-sse4_2.S: Likewise.
* sysdeps/x86_64/multiarch/strncase_l.c: Likewise.
* sysdeps/x86_64/multiarch/strncmp-sse2.S: Likewise.
* sysdeps/x86_64/multiarch/strncmp-sse4_2.S: Likewise.
* sysdeps/x86_64/multiarch/strncmp.c: Likewise.
* sysdeps/x86_64/multiarch/strcasecmp_l.S: Removed.
* sysdeps/x86_64/multiarch/strcmp.S: Likewise.
* sysdeps/x86_64/multiarch/strncase_l.S: Likewise.
* sysdeps/x86_64/multiarch/strncmp.S: Likewise.
* sysdeps/x86_64/multiarch/strcmp-sse42.S: Include <sysdep.h>.
(STRCMP_SSE42): New.  Defined to __strcmp_sse42 if not defined.
[USE_AS_STRCASECMP_L || USE_AS_STRNCASECMP_L]: Include
"locale-defines.h".
(UPDATE_STRNCMP_COUNTER): New.
(SECTION): Likewise.
(GLABEL): Likewise.
(LABEL): Likewise.
* sysdeps/x86_64/multiarch/strncmp-ssse3.S: Rewrite and enable
for libc.a.
25 files changed:
ChangeLog
sysdeps/x86_64/multiarch/Makefile
sysdeps/x86_64/multiarch/ifunc-strcasecmp.h [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcasecmp.c [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcasecmp_l-avx.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcasecmp_l-sse2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcasecmp_l-sse4_2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcasecmp_l.S [deleted file]
sysdeps/x86_64/multiarch/strcasecmp_l.c [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcmp-sse2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcmp-sse42.S
sysdeps/x86_64/multiarch/strcmp-sse4_2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strcmp.S [deleted file]
sysdeps/x86_64/multiarch/strcmp.c [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncase.c [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncase_l-avx.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncase_l-sse2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncase_l-sse4_2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncase_l.S [deleted file]
sysdeps/x86_64/multiarch/strncase_l.c [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncmp-sse2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncmp-sse4_2.S [new file with mode: 0644]
sysdeps/x86_64/multiarch/strncmp-ssse3.S
sysdeps/x86_64/multiarch/strncmp.S [deleted file]
sysdeps/x86_64/multiarch/strncmp.c [new file with mode: 0644]