about summary refs log tree commit diff
path: root/sysdeps/x86_64/multiarch/strcmp-naming.h
diff options
context:
space:
mode:
authorNoah Goldstein <goldstein.w.n@gmail.com>2022-07-12 12:28:06 -0700
committerNoah Goldstein <goldstein.w.n@gmail.com>2022-07-13 14:55:31 -0700
commitd561fbb041fe6aa205f652aecefe4bb84fd124a5 (patch)
tree4fa103748eb51664285b31d4186ee06b6bea35b2 /sysdeps/x86_64/multiarch/strcmp-naming.h
parent30e57e0a21cc50eead14f729a29a5604a6b23e18 (diff)
downloadglibc-d561fbb041fe6aa205f652aecefe4bb84fd124a5.tar.gz
glibc-d561fbb041fe6aa205f652aecefe4bb84fd124a5.tar.xz
glibc-d561fbb041fe6aa205f652aecefe4bb84fd124a5.zip
x86: Move strcmp SSE2 implementation to multiarch/strcmp-sse2.S
This commit doesn't affect libc.so.6, its just housekeeping to prepare
for adding explicit ISA level support.

Because strcmp-sse2.S implements so many functions (more from
avx2/evex/sse42) add a new file 'strcmp-naming.h' to assist in
getting the correct symbol name for all the function across
multiarch/non-multiarch builds.

Tested build on x86_64 and x86_32 with/without multiarch.
Diffstat (limited to 'sysdeps/x86_64/multiarch/strcmp-naming.h')
-rw-r--r--sysdeps/x86_64/multiarch/strcmp-naming.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/sysdeps/x86_64/multiarch/strcmp-naming.h b/sysdeps/x86_64/multiarch/strcmp-naming.h
new file mode 100644
index 0000000000..6a7529b6a4
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/strcmp-naming.h
@@ -0,0 +1,68 @@
+#ifndef _STRCMP_NAMING_H_
+#define _STRCMP_NAMING_H_
+
+/* Utility macros.  */
+#define STRCMP_SUFFIX(x, y) x##y
+#define STRCMP_NAME(x, y) STRCMP_SUFFIX (x, y)
+
+/* Setup base of all definitions.  */
+#define STRNCASECMP_BASE __strncasecmp
+#define STRCASECMP_BASE __strcasecmp
+#define WCSCMP_BASE __wcscmp
+
+#if defined USE_MULTIARCH && IS_IN (libc)
+# define WCSNCMP_BASE __wcsncmp
+# define STRNCMP_BASE __strncmp
+# define STRCMP_BASE __strcmp
+
+#else
+/* Covers IS_IN (rtld) or non-multiarch build.  */
+# define WCSNCMP_BASE wcsncmp
+# define STRNCMP_BASE strncmp
+# define STRCMP_BASE strcmp
+
+# undef STRCMP_ISA
+# define STRCMP_ISA
+#endif
+
+#if IS_IN (rtld) || defined USE_MULTIARCH
+# define ISA_HIDDEN_JUMPTARGET(...) __VA_ARGS__
+#else
+# define ISA_HIDDEN_JUMPTARGET(...) HIDDEN_JUMPTARGET (__VA_ARGS__)
+#endif
+
+/* Get correct symbol for OVERFLOW_STRCMP, STRCMP, and
+   STRCASECMP.  */
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+
+# if defined USE_AS_WCSCMP || defined USE_AS_WCSNCMP
+#  define OVERFLOW_STRCMP_SYM WCSCMP_BASE
+#  define STRCMP_SYM WCSNCMP_BASE
+# elif defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+#  define OVERFLOW_STRCMP_SYM STRCMP_NAME (STRCASECMP_BASE, _l)
+#  define STRCMP_SYM STRCMP_NAME (STRNCASECMP_BASE, _l)
+# else
+#  define OVERFLOW_STRCMP_SYM STRCMP_BASE
+#  define STRCMP_SYM STRNCMP_BASE
+# endif
+
+# define STRCASECMP_SYM STRNCASECMP_BASE
+# define OVERFLOW_STRCMP \
+    ISA_HIDDEN_JUMPTARGET (STRCMP_NAME (OVERFLOW_STRCMP_SYM, STRCMP_ISA))
+#else
+# ifdef USE_AS_WCSCMP
+#  define STRCMP_SYM WCSCMP_BASE
+# elif defined USE_AS_STRCASECMP_L
+#  define STRCMP_SYM STRCMP_NAME (STRCASECMP_BASE, _l)
+# else
+#  define STRCMP_SYM STRCMP_BASE
+# endif
+
+# define STRCASECMP_SYM STRCASECMP_BASE
+#endif
+
+#define STRCASECMP_L_NONASCII STRCMP_NAME (STRCASECMP_SYM, _l_nonascii)
+#define STRCASECMP STRCMP_NAME (STRCASECMP_SYM, STRCMP_ISA)
+#define STRCMP STRCMP_NAME (STRCMP_SYM, STRCMP_ISA)
+
+#endif