bca718
commit 1aee37a22e3977de7a89e734e0a1e112f52045f2
bca718
Author: H.J. Lu <hjl.tools@gmail.com>
bca718
Date:   Thu Aug 13 03:39:22 2015 -0700
bca718
bca718
    Update i686 multiarch functions for <cpu-features.h>
bca718
bca718
    This patch updates i686 multiarch functions to use the newly defined
bca718
    HAS_CPU_FEATURE, HAS_ARCH_FEATURE, LOAD_GOT_AND_RTLD_GLOBAL_RO and
bca718
    LOAD_FUNC_GOT_EAX from <cpu-features.h>.
bca718
bca718
commit 4e940b2f4b577f3a530e0580373f7c2d569f4d63
bca718
Author: H.J. Lu <hjl.tools@gmail.com>
bca718
Date:   Sun Mar 6 08:23:24 2016 -0800
bca718
bca718
    Use HAS_ARCH_FEATURE with Fast_Rep_String
bca718
    
bca718
    HAS_ARCH_FEATURE, not HAS_CPU_FEATURE, should be used with
bca718
    Fast_Rep_String.
bca718
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/e_expf.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/e_expf.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/e_expf.c
bca718
@@ -23,11 +23,15 @@ extern double __ieee754_expf_ia32 (doubl
bca718
 
bca718
 double __ieee754_expf (double);
bca718
 libm_ifunc (__ieee754_expf,
bca718
-	    HAS_SSE2 ? __ieee754_expf_sse2 : __ieee754_expf_ia32);
bca718
+	    HAS_CPU_FEATURE (SSE2)
bca718
+	    ? __ieee754_expf_sse2
bca718
+	    : __ieee754_expf_ia32);
bca718
 
bca718
 extern double __expf_finite_sse2 (double);
bca718
 extern double __expf_finite_ia32 (double);
bca718
 
bca718
 double __expf_finite (double);
bca718
 libm_ifunc (__expf_finite,
bca718
-	    HAS_SSE2 ? __expf_finite_sse2 : __expf_finite_ia32);
bca718
+	    HAS_CPU_FEATURE (SSE2)
bca718
+	    ? __expf_finite_sse2
bca718
+	    : __expf_finite_ia32);
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_cosf.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/s_cosf.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_cosf.c
bca718
@@ -22,7 +22,7 @@ extern float __cosf_sse2 (float);
bca718
 extern float __cosf_ia32 (float);
bca718
 float __cosf (float);
bca718
 
bca718
-libm_ifunc (__cosf, HAS_SSE2 ? __cosf_sse2 : __cosf_ia32);
bca718
+libm_ifunc (__cosf, HAS_CPU_FEATURE (SSE2) ? __cosf_sse2 : __cosf_ia32);
bca718
 weak_alias (__cosf, cosf);
bca718
 
bca718
 #define COSF __cosf_ia32
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sincosf.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/s_sincosf.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sincosf.c
bca718
@@ -22,7 +22,8 @@ extern void __sincosf_sse2 (float, float
bca718
 extern void __sincosf_ia32 (float, float *, float *);
bca718
 void __sincosf (float, float *, float *);
bca718
 
bca718
-libm_ifunc (__sincosf, HAS_SSE2 ? __sincosf_sse2 : __sincosf_ia32);
bca718
+libm_ifunc (__sincosf,
bca718
+	    HAS_CPU_FEATURE (SSE2) ? __sincosf_sse2 : __sincosf_ia32);
bca718
 weak_alias (__sincosf, sincosf);
bca718
 
bca718
 #define SINCOSF __sincosf_ia32
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sinf.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/fpu/multiarch/s_sinf.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/fpu/multiarch/s_sinf.c
bca718
@@ -22,7 +22,7 @@ extern float __sinf_sse2 (float);
bca718
 extern float __sinf_ia32 (float);
bca718
 float __sinf (float);
bca718
 
bca718
-libm_ifunc (__sinf, HAS_SSE2 ? __sinf_sse2 : __sinf_ia32);
bca718
+libm_ifunc (__sinf, HAS_CPU_FEATURE (SSE2) ? __sinf_sse2 : __sinf_ia32);
bca718
 weak_alias (__sinf, sinf);
bca718
 #define SINF __sinf_ia32
bca718
 #include <sysdeps/ieee754/flt-32/s_sinf.c>
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bcopy.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/bcopy.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bcopy.S
bca718
@@ -23,46 +23,19 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in lib.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(bcopy)
bca718
 	.type	bcopy, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__bcopy_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__bcopy_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__bcopy_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__bcopy_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__bcopy_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(bcopy)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(bcopy)
bca718
-	.type	bcopy, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__bcopy_ia32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__bcopy_ssse3, %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__bcopy_ssse3_rep, %eax
bca718
+	LOAD_FUNC_GOT_EAX(__bcopy_ssse3_rep)
bca718
 2:	ret
bca718
 END(bcopy)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bzero.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/bzero.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/bzero.S
bca718
@@ -23,46 +23,19 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in lib.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(__bzero)
bca718
 	.type	__bzero, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__bzero_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__bzero_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__bzero_sse2@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX ( __bzero_sse2)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__bzero_sse2_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(__bzero)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(__bzero)
bca718
-	.type	__bzero, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__bzero_ia32, %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__bzero_sse2, %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__bzero_sse2_rep, %eax
bca718
+	LOAD_FUNC_GOT_EAX (__bzero_sse2_rep)
bca718
 2:	ret
bca718
 END(__bzero)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
bca718
@@ -38,152 +38,152 @@ __libc_ifunc_impl_list (const char *name
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/bcopy.S.  */
bca718
   IFUNC_IMPL (i, name, bcopy,
bca718
-	      IFUNC_IMPL_ADD (array, i, bcopy, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, bcopy, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __bcopy_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, bcopy, HAS_SSSE3, __bcopy_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, bcopy, HAS_CPU_FEATURE (SSSE3), __bcopy_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/bzero.S.  */
bca718
   IFUNC_IMPL (i, name, bzero,
bca718
-	      IFUNC_IMPL_ADD (array, i, bzero, HAS_SSE2, __bzero_sse2_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, bzero, HAS_SSE2, __bzero_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, bzero, HAS_CPU_FEATURE (SSE2), __bzero_sse2_rep)
bca718
+	      IFUNC_IMPL_ADD (array, i, bzero, HAS_CPU_FEATURE (SSE2), __bzero_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memchr.S.  */
bca718
   IFUNC_IMPL (i, name, memchr,
bca718
-	      IFUNC_IMPL_ADD (array, i, memchr, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, memchr, HAS_CPU_FEATURE (SSE2),
bca718
 			      __memchr_sse2_bsf)
bca718
-	      IFUNC_IMPL_ADD (array, i, memchr, HAS_SSE2, __memchr_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, memchr, HAS_CPU_FEATURE (SSE2), __memchr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memcmp.S.  */
bca718
   IFUNC_IMPL (i, name, memcmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __memcmp_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSSE3, __memcmp_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSSE3), __memcmp_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memmove_chk.S.  */
bca718
   IFUNC_IMPL (i, name, __memmove_chk,
bca718
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memmove_chk_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memmove_chk_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
bca718
 			      __memmove_chk_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memmove.S.  */
bca718
   IFUNC_IMPL (i, name, memmove,
bca718
-	      IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memmove_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memmove_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memrchr.S.  */
bca718
   IFUNC_IMPL (i, name, memrchr,
bca718
-	      IFUNC_IMPL_ADD (array, i, memrchr, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, memrchr, HAS_CPU_FEATURE (SSE2),
bca718
 			      __memrchr_sse2_bsf)
bca718
-	      IFUNC_IMPL_ADD (array, i, memrchr, HAS_SSE2, __memrchr_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, memrchr, HAS_CPU_FEATURE (SSE2), __memrchr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memset_chk.S.  */
bca718
   IFUNC_IMPL (i, name, __memset_chk,
bca718
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_CPU_FEATURE (SSE2),
bca718
 			      __memset_chk_sse2_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, __memset_chk, HAS_CPU_FEATURE (SSE2),
bca718
 			      __memset_chk_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
bca718
 			      __memset_chk_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memset.S.  */
bca718
   IFUNC_IMPL (i, name, memset,
bca718
-	      IFUNC_IMPL_ADD (array, i, memset, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, memset, HAS_CPU_FEATURE (SSE2),
bca718
 			      __memset_sse2_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, memset, HAS_SSE2, __memset_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, memset, HAS_CPU_FEATURE (SSE2), __memset_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/rawmemchr.S.  */
bca718
   IFUNC_IMPL (i, name, rawmemchr,
bca718
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_CPU_FEATURE (SSE2),
bca718
 			      __rawmemchr_sse2_bsf)
bca718
-	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_CPU_FEATURE (SSE2),
bca718
 			      __rawmemchr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/stpncpy.S.  */
bca718
   IFUNC_IMPL (i, name, stpncpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __stpncpy_ssse3)
bca718
-	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSE2, __stpncpy_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, stpncpy, HAS_CPU_FEATURE (SSE2), __stpncpy_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/stpcpy.S.  */
bca718
   IFUNC_IMPL (i, name, stpcpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSSE3, __stpcpy_ssse3)
bca718
-	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSE2, __stpcpy_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSSE3), __stpcpy_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSE2), __stpcpy_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcasecmp.S.  */
bca718
   IFUNC_IMPL (i, name, strcasecmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strcasecmp_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __strcasecmp_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcasecmp_l.S.  */
bca718
   IFUNC_IMPL (i, name, strcasecmp_l,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strcasecmp_l_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __strcasecmp_l_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
bca718
 			      __strcasecmp_l_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcasestr.c.  */
bca718
   IFUNC_IMPL (i, name, strcasestr,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcasestr, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strcasestr_sse42)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcat.S.  */
bca718
   IFUNC_IMPL (i, name, strcat,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcat, HAS_SSSE3, __strcat_ssse3)
bca718
-	      IFUNC_IMPL_ADD (array, i, strcat, HAS_SSE2, __strcat_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSSE3), __strcat_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSE2), __strcat_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strchr.S.  */
bca718
   IFUNC_IMPL (i, name, strchr,
bca718
-	      IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strchr, HAS_CPU_FEATURE (SSE2),
bca718
 			      __strchr_sse2_bsf)
bca718
-	      IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE2, __strchr_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strchr, HAS_CPU_FEATURE (SSE2), __strchr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcmp.S.  */
bca718
   IFUNC_IMPL (i, name, strcmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strcmp_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSSE3, __strcmp_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSSE3), __strcmp_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcpy.S.  */
bca718
   IFUNC_IMPL (i, name, strcpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSSE3, __strcpy_ssse3)
bca718
-	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSE2, __strcpy_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSSE3), __strcpy_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSE2), __strcpy_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strcspn.S.  */
bca718
   IFUNC_IMPL (i, name, strcspn,
bca718
-	      IFUNC_IMPL_ADD (array, i, strcspn, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strcspn, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strcspn_sse42)
bca718
 	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strncase.S.  */
bca718
   IFUNC_IMPL (i, name, strncasecmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strncasecmp_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __strncasecmp_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
bca718
 			      __strncasecmp_ia32))
bca718
@@ -191,133 +191,133 @@ __libc_ifunc_impl_list (const char *name
bca718
   /* Support sysdeps/i386/i686/multiarch/strncase_l.S.  */
bca718
   IFUNC_IMPL (i, name, strncasecmp_l,
bca718
 	      IFUNC_IMPL_ADD (array, i, strncasecmp_l,
bca718
-			      HAS_SSE4_2, __strncasecmp_l_sse4_2)
bca718
+			      HAS_CPU_FEATURE (SSE4_2), __strncasecmp_l_sse4_2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strncasecmp_l,
bca718
-			      HAS_SSSE3, __strncasecmp_l_ssse3)
bca718
+			      HAS_CPU_FEATURE (SSSE3), __strncasecmp_l_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
bca718
 			      __strncasecmp_l_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strncat.S.  */
bca718
   IFUNC_IMPL (i, name, strncat,
bca718
-	      IFUNC_IMPL_ADD (array, i, strncat, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __strncat_ssse3)
bca718
-	      IFUNC_IMPL_ADD (array, i, strncat, HAS_SSE2, __strncat_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSE2), __strncat_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strncpy.S.  */
bca718
   IFUNC_IMPL (i, name, strncpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __strncpy_ssse3)
bca718
-	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSE2, __strncpy_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSE2), __strncpy_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strnlen.S.  */
bca718
   IFUNC_IMPL (i, name, strnlen,
bca718
-	      IFUNC_IMPL_ADD (array, i, strnlen, HAS_SSE2, __strnlen_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strnlen, HAS_CPU_FEATURE (SSE2), __strnlen_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strpbrk.S.  */
bca718
   IFUNC_IMPL (i, name, strpbrk,
bca718
-	      IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strpbrk, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strpbrk_sse42)
bca718
 	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strrchr.S.  */
bca718
   IFUNC_IMPL (i, name, strrchr,
bca718
-	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_CPU_FEATURE (SSE2),
bca718
 			      __strrchr_sse2_bsf)
bca718
-	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE2, __strrchr_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strrchr, HAS_CPU_FEATURE (SSE2), __strrchr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strspn.S.  */
bca718
   IFUNC_IMPL (i, name, strspn,
bca718
-	      IFUNC_IMPL_ADD (array, i, strspn, HAS_SSE4_2, __strspn_sse42)
bca718
+	      IFUNC_IMPL_ADD (array, i, strspn, HAS_CPU_FEATURE (SSE4_2), __strspn_sse42)
bca718
 	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strstr-c.c.  */
bca718
   IFUNC_IMPL (i, name, strstr,
bca718
-	      IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42)
bca718
+	      IFUNC_IMPL_ADD (array, i, strstr, HAS_CPU_FEATURE (SSE4_2), __strstr_sse42)
bca718
 	      IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/wcschr.S.  */
bca718
   IFUNC_IMPL (i, name, wcschr,
bca718
-	      IFUNC_IMPL_ADD (array, i, wcschr, HAS_SSE2, __wcschr_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, wcschr, HAS_CPU_FEATURE (SSE2), __wcschr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/wcscmp.S.  */
bca718
   IFUNC_IMPL (i, name, wcscmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, wcscmp, HAS_SSE2, __wcscmp_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, wcscmp, HAS_CPU_FEATURE (SSE2), __wcscmp_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, wcscmp, 1, __wcscmp_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/wcscpy.S.  */
bca718
   IFUNC_IMPL (i, name, wcscpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, wcscpy, HAS_SSSE3, __wcscpy_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, wcscpy, HAS_CPU_FEATURE (SSSE3), __wcscpy_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/wcslen.S.  */
bca718
   IFUNC_IMPL (i, name, wcslen,
bca718
-	      IFUNC_IMPL_ADD (array, i, wcslen, HAS_SSE2, __wcslen_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, wcslen, HAS_CPU_FEATURE (SSE2), __wcslen_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/wcsrchr.S.  */
bca718
   IFUNC_IMPL (i, name, wcsrchr,
bca718
-	      IFUNC_IMPL_ADD (array, i, wcsrchr, HAS_SSE2, __wcsrchr_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, wcsrchr, HAS_CPU_FEATURE (SSE2), __wcsrchr_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/wmemcmp.S.  */
bca718
   IFUNC_IMPL (i, name, wmemcmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __wmemcmp_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __wmemcmp_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_ia32))
bca718
 
bca718
 #ifdef SHARED
bca718
   /* Support sysdeps/i386/i686/multiarch/memcpy_chk.S.  */
bca718
   IFUNC_IMPL (i, name, __memcpy_chk,
bca718
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memcpy_chk_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memcpy_chk_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
bca718
 			      __memcpy_chk_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/memcpy.S.  */
bca718
   IFUNC_IMPL (i, name, memcpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __memcpy_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, __memcpy_ssse3)
bca718
+	      IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3), __memcpy_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/mempcpy_chk.S.  */
bca718
   IFUNC_IMPL (i, name, __mempcpy_chk,
bca718
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __mempcpy_chk_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __mempcpy_chk_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
bca718
 			      __mempcpy_chk_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/mempcpy.S.  */
bca718
   IFUNC_IMPL (i, name, mempcpy,
bca718
-	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __mempcpy_ssse3_rep)
bca718
-	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __mempcpy_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strlen.S.  */
bca718
   IFUNC_IMPL (i, name, strlen,
bca718
-	      IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strlen, HAS_CPU_FEATURE (SSE2),
bca718
 			      __strlen_sse2_bsf)
bca718
-	      IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE2, __strlen_sse2)
bca718
+	      IFUNC_IMPL_ADD (array, i, strlen, HAS_CPU_FEATURE (SSE2), __strlen_sse2)
bca718
 	      IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_ia32))
bca718
 
bca718
   /* Support sysdeps/i386/i686/multiarch/strncmp.S.  */
bca718
   IFUNC_IMPL (i, name, strncmp,
bca718
-	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2,
bca718
+	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSE4_2),
bca718
 			      __strncmp_sse4_2)
bca718
-	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSSE3,
bca718
+	      IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSSE3),
bca718
 			      __strncmp_ssse3)
bca718
 	      IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_ia32))
bca718
 #endif
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memchr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memchr.S
bca718
@@ -22,46 +22,22 @@
bca718
 #include <init-arch.h>
bca718
 
bca718
 #if IS_IN (libc)
bca718
-# define CFI_POP(REG) \
bca718
-	cfi_adjust_cfa_offset (-4); \
bca718
-	cfi_restore (REG)
bca718
-
bca718
-# define CFI_PUSH(REG) \
bca718
-	cfi_adjust_cfa_offset (4); \
bca718
-	cfi_rel_offset (REG, 0)
bca718
-
bca718
 	.text
bca718
 ENTRY(__memchr)
bca718
 	.type	__memchr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	CFI_PUSH (%ebx)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-
bca718
-1:	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	testl	$bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx)
bca718
+	HAS_ARCH_FEATURE (Slow_BSF)
bca718
 	jz	3f
bca718
 
bca718
-	leal	__memchr_sse2@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX ( __memchr_sse2)
bca718
 	ret
bca718
 
bca718
-	CFI_PUSH (%ebx)
bca718
-
bca718
-2:	leal	__memchr_ia32@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+2:	LOAD_FUNC_GOT_EAX (__memchr_ia32)
bca718
 	ret
bca718
 
bca718
-	CFI_PUSH (%ebx)
bca718
-
bca718
-3:	leal	__memchr_sse2_bsf@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+3:	LOAD_FUNC_GOT_EAX (__memchr_sse2_bsf)
bca718
 	ret
bca718
 END(__memchr)
bca718
 
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcmp.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcmp.S
bca718
@@ -23,46 +23,19 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in libc. */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(memcmp)
bca718
 	.type	memcmp, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memcmp_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memcmp_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__memcmp_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memcmp_ssse3)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	__memcmp_sse4_2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(memcmp)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(memcmp)
bca718
-	.type	memcmp, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memcmp_ia32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memcmp_ssse3, %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memcmp_sse4_2, %eax
bca718
+	LOAD_FUNC_GOT_EAX (__memcmp_sse4_2)
bca718
 2:	ret
bca718
 END(memcmp)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy.S
bca718
@@ -28,24 +28,15 @@
bca718
 	.text
bca718
 ENTRY(memcpy)
bca718
 	.type	memcpy, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memcpy_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memcpy_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__memcpy_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memcpy_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__memcpy_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__memcpy_ssse3_rep)
bca718
+2:	ret
bca718
 END(memcpy)
bca718
 
bca718
 # undef ENTRY
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy_chk.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memcpy_chk.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memcpy_chk.S
bca718
@@ -29,24 +29,15 @@
bca718
 	.text
bca718
 ENTRY(__memcpy_chk)
bca718
 	.type	__memcpy_chk, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memcpy_chk_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memcpy_chk_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__memcpy_chk_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__memcpy_chk_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3_rep)
bca718
+2:	ret
bca718
 END(__memcpy_chk)
bca718
 # else
bca718
 #  include "../memcpy_chk.S"
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memmove.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove.S
bca718
@@ -23,32 +23,23 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in lib.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(memmove)
bca718
 	.type	memmove, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memmove_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memmove_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__memmove_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memmove_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__memmove_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__memmove_ssse3_rep)
bca718
+2:	ret
bca718
 END(memmove)
bca718
 
bca718
-# undef ENTRY
bca718
-# define ENTRY(name) \
bca718
+# ifdef SHARED
bca718
+#  undef ENTRY
bca718
+#  define ENTRY(name) \
bca718
 	.type __memmove_ia32, @function; \
bca718
 	.p2align 4; \
bca718
 	.globl __memmove_ia32; \
bca718
@@ -56,24 +47,9 @@ END(memmove)
bca718
 	__memmove_ia32: cfi_startproc; \
bca718
 	CALL_MCOUNT
bca718
 # else
bca718
-	.text
bca718
-ENTRY(memmove)
bca718
-	.type	memmove, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memmove_ia32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memmove_ssse3, %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memmove_ssse3_rep, %eax
bca718
-2:	ret
bca718
-END(memmove)
bca718
 
bca718
-# undef ENTRY
bca718
-# define ENTRY(name) \
bca718
+#  undef ENTRY
bca718
+#  define ENTRY(name) \
bca718
 	.type __memmove_ia32, @function; \
bca718
 	.globl __memmove_ia32; \
bca718
 	.p2align 4; \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove_chk.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memmove_chk.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memmove_chk.S
bca718
@@ -23,46 +23,21 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in lib.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(__memmove_chk)
bca718
 	.type	__memmove_chk, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memmove_chk_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memmove_chk_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__memmove_chk_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__memmove_chk_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(__memmove_chk)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(__memmove_chk)
bca718
-	.type	__memmove_chk, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memmove_chk_ia32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memmove_chk_ssse3, %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memmove_chk_ssse3_rep, %eax
bca718
+	LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3_rep)
bca718
 2:	ret
bca718
 END(__memmove_chk)
bca718
 
bca718
+# ifndef SHARED
bca718
 	.type __memmove_chk_ssse3, @function
bca718
 	.p2align 4;
bca718
 __memmove_chk_ssse3:
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/mempcpy.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy.S
bca718
@@ -28,24 +28,15 @@
bca718
 	.text
bca718
 ENTRY(__mempcpy)
bca718
 	.type	__mempcpy, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__mempcpy_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__mempcpy_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__mempcpy_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__mempcpy_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__mempcpy_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__mempcpy_ssse3_rep)
bca718
+2:	ret
bca718
 END(__mempcpy)
bca718
 
bca718
 # undef ENTRY
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy_chk.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/mempcpy_chk.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/mempcpy_chk.S
bca718
@@ -29,24 +29,15 @@
bca718
 	.text
bca718
 ENTRY(__mempcpy_chk)
bca718
 	.type	__mempcpy_chk, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__mempcpy_chk_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__mempcpy_chk_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__mempcpy_chk_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__mempcpy_chk_ssse3_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3_rep)
bca718
+2:	ret
bca718
 END(__mempcpy_chk)
bca718
 # else
bca718
 #  include "../mempcpy_chk.S"
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memrchr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memrchr.S
bca718
@@ -22,46 +22,22 @@
bca718
 #include <init-arch.h>
bca718
 
bca718
 #if IS_IN (libc)
bca718
-# define CFI_POP(REG) \
bca718
-	cfi_adjust_cfa_offset (-4); \
bca718
-	cfi_restore (REG)
bca718
-
bca718
-# define CFI_PUSH(REG) \
bca718
-	cfi_adjust_cfa_offset (4); \
bca718
-	cfi_rel_offset (REG, 0)
bca718
-
bca718
 	.text
bca718
 ENTRY(__memrchr)
bca718
 	.type	__memrchr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	CFI_PUSH (%ebx)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-
bca718
-1:	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	testl	$bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx)
bca718
+	HAS_ARCH_FEATURE (Slow_BSF)
bca718
 	jz	3f
bca718
 
bca718
-	leal	__memrchr_sse2@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memrchr_sse2)
bca718
 	ret
bca718
 
bca718
-	CFI_PUSH (%ebx)
bca718
-
bca718
-2:	leal	__memrchr_ia32@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+2:	LOAD_FUNC_GOT_EAX (__memrchr_ia32)
bca718
 	ret
bca718
 
bca718
-	CFI_PUSH (%ebx)
bca718
-
bca718
-3:	leal	__memrchr_sse2_bsf@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+3:	LOAD_FUNC_GOT_EAX (__memrchr_sse2_bsf)
bca718
 	ret
bca718
 END(__memrchr)
bca718
 
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset.S
bca718
@@ -23,46 +23,19 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in lib.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(memset)
bca718
 	.type	memset, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memset_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memset_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__memset_sse2@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memset_sse2)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__memset_sse2_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(memset)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(memset)
bca718
-	.type	memset, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memset_ia32, %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memset_sse2, %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memset_sse2_rep, %eax
bca718
+	LOAD_FUNC_GOT_EAX (__memset_sse2_rep)
bca718
 2:	ret
bca718
 END(memset)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset_chk.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/memset_chk.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/memset_chk.S
bca718
@@ -23,50 +23,26 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in lib.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(__memset_chk)
bca718
 	.type	__memset_chk, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memset_chk_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__memset_chk_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__memset_chk_sse2@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__memset_chk_sse2)
bca718
+	HAS_ARCH_FEATURE (Fast_Rep_String)
bca718
 	jz	2f
bca718
-	leal	__memset_chk_sse2_rep@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__memset_chk_sse2_rep)
bca718
+2:	ret
bca718
 END(__memset_chk)
bca718
 
bca718
+# ifdef SHARED
bca718
 strong_alias (__memset_chk, __memset_zero_constant_len_parameter)
bca718
 	.section .gnu.warning.__memset_zero_constant_len_parameter
bca718
 	.string "memset used with constant zero length parameter; this could be due to transposed parameters"
bca718
 # else
bca718
 	.text
bca718
-ENTRY(__memset_chk)
bca718
-	.type	__memset_chk, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__memset_chk_ia32, %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memset_chk_sse2, %eax
bca718
-	testl	$bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__memset_chk_sse2_rep, %eax
bca718
-2:	ret
bca718
-END(__memset_chk)
bca718
-
bca718
 	.type __memset_chk_sse2, @function
bca718
 	.p2align 4;
bca718
 __memset_chk_sse2:
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/rawmemchr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/rawmemchr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/rawmemchr.S
bca718
@@ -22,46 +22,22 @@
bca718
 #include <init-arch.h>
bca718
 
bca718
 #if IS_IN (libc)
bca718
-# define CFI_POP(REG) \
bca718
-	cfi_adjust_cfa_offset (-4); \
bca718
-	cfi_restore (REG)
bca718
-
bca718
-# define CFI_PUSH(REG) \
bca718
-	cfi_adjust_cfa_offset (4); \
bca718
-	cfi_rel_offset (REG, 0)
bca718
-
bca718
 	.text
bca718
 ENTRY(__rawmemchr)
bca718
 	.type	__rawmemchr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	CFI_PUSH (%ebx)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-
bca718
-1:	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	testl	$bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx)
bca718
+	HAS_ARCH_FEATURE (Slow_BSF)
bca718
 	jz	3f
bca718
 
bca718
-	leal	__rawmemchr_sse2@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__rawmemchr_sse2)
bca718
 	ret
bca718
 
bca718
-	CFI_PUSH (%ebx)
bca718
-
bca718
-2:	leal	__rawmemchr_ia32@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+2:	LOAD_FUNC_GOT_EAX (__rawmemchr_ia32)
bca718
 	ret
bca718
 
bca718
-	CFI_PUSH (%ebx)
bca718
-
bca718
-3:	leal	__rawmemchr_sse2_bsf@GOTOFF(%ebx), %eax
bca718
-	popl	%ebx
bca718
-	CFI_POP	(%ebx)
bca718
+3:	LOAD_FUNC_GOT_EAX (__rawmemchr_sse2_bsf)
bca718
 	ret
bca718
 END(__rawmemchr)
bca718
 
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fma.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/s_fma.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fma.c
bca718
@@ -26,7 +26,8 @@
bca718
 extern double __fma_ia32 (double x, double y, double z) attribute_hidden;
bca718
 extern double __fma_fma (double x, double y, double z) attribute_hidden;
bca718
 
bca718
-libm_ifunc (__fma, HAS_FMA ? __fma_fma : __fma_ia32);
bca718
+libm_ifunc (__fma,
bca718
+	    HAS_ARCH_FEATURE (FMA_Usable) ? __fma_fma : __fma_ia32);
bca718
 weak_alias (__fma, fma)
bca718
 
bca718
 # define __fma __fma_ia32
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fmaf.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/s_fmaf.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/s_fmaf.c
bca718
@@ -26,7 +26,8 @@
bca718
 extern float __fmaf_ia32 (float x, float y, float z) attribute_hidden;
bca718
 extern float __fmaf_fma (float x, float y, float z) attribute_hidden;
bca718
 
bca718
-libm_ifunc (__fmaf, HAS_FMA ? __fmaf_fma : __fmaf_ia32);
bca718
+libm_ifunc (__fmaf,
bca718
+	    HAS_ARCH_FEATURE (FMA_Usable) ? __fmaf_fma : __fmaf_ia32);
bca718
 weak_alias (__fmaf, fmaf)
bca718
 
bca718
 # define __fmaf __fmaf_ia32
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcasecmp.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcasecmp.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcasecmp.S
bca718
@@ -20,48 +20,18 @@
bca718
 #include <sysdep.h>
bca718
 #include <init-arch.h>
bca718
 
bca718
-#ifdef SHARED
bca718
 	.text
bca718
 ENTRY(__strcasecmp)
bca718
 	.type	__strcasecmp, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strcasecmp_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strcasecmp_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__strcasecmp_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__strcasecmp_ssse3)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	__strcasecmp_sse4_2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(__strcasecmp)
bca718
-#else
bca718
-	.text
bca718
-ENTRY(__strcasecmp)
bca718
-	.type	__strcasecmp, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strcasecmp_ia32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__strcasecmp_ssse3, %eax
bca718
-#if 0
bca718
-	// XXX Temporarily
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__strcasecmp_sse4_2, %eax
bca718
-#endif
bca718
+	LOAD_FUNC_GOT_EAX (__strcasecmp_sse4_2)
bca718
 2:	ret
bca718
 END(__strcasecmp)
bca718
-#endif
bca718
 
bca718
 weak_alias (__strcasecmp, strcasecmp)
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcat.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcat.S
bca718
@@ -45,52 +45,22 @@
bca718
    need strncat before the initialization happened.  */
bca718
 #if IS_IN (libc)
bca718
 
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(STRCAT)
bca718
 	.type	STRCAT, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	STRCAT_IA32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (STRCAT_IA32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	STRCAT_SSE2@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (STRCAT_SSE2)
bca718
+	HAS_ARCH_FEATURE (Fast_Unaligned_Load)
bca718
 	jnz	2f
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	STRCAT_SSSE3@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(STRCAT)
bca718
-# else
bca718
-
bca718
-ENTRY(STRCAT)
bca718
-	.type	STRCAT, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	STRCAT_IA32, %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	STRCAT_SSE2, %eax
bca718
-	testl	$bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features
bca718
-	jnz	2f
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	STRCAT_SSSE3, %eax
bca718
+	LOAD_FUNC_GOT_EAX (STRCAT_SSSE3)
bca718
 2:	ret
bca718
 END(STRCAT)
bca718
 
bca718
-# endif
bca718
-
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
 	.type STRCAT_IA32, @function; \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strchr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strchr.S
bca718
@@ -25,24 +25,15 @@
bca718
 	.text
bca718
 ENTRY(strchr)
bca718
 	.type	strchr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strchr_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strchr_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__strchr_sse2_bsf@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__strchr_sse2_bsf)
bca718
+	HAS_ARCH_FEATURE (Slow_BSF)
bca718
 	jz	2f
bca718
-	leal	__strchr_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__strchr_sse2)
bca718
+2:	ret
bca718
 END(strchr)
bca718
 
bca718
 # undef ENTRY
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcmp.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcmp.S
bca718
@@ -51,46 +51,19 @@
bca718
    define multiple versions for strncmp in static library since we
bca718
    need strncmp before the initialization happened.  */
bca718
 #if (defined SHARED || !defined USE_AS_STRNCMP) && IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(STRCMP)
bca718
 	.type	STRCMP, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__STRCMP_IA32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__STRCMP_IA32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__STRCMP_SSSE3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__STRCMP_SSSE3)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	__STRCMP_SSE4_2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(STRCMP)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(STRCMP)
bca718
-	.type	STRCMP, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__STRCMP_IA32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__STRCMP_SSSE3, %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__STRCMP_SSE4_2, %eax
bca718
+	LOAD_FUNC_GOT_EAX (__STRCMP_SSE4_2)
bca718
 2:	ret
bca718
 END(STRCMP)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcpy.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcpy.S
bca718
@@ -61,52 +61,22 @@
bca718
    need strncpy before the initialization happened.  */
bca718
 #if IS_IN (libc)
bca718
 
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(STRCPY)
bca718
 	.type	STRCPY, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	STRCPY_IA32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (STRCPY_IA32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	STRCPY_SSE2@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (STRCPY_SSE2)
bca718
+	HAS_ARCH_FEATURE (Fast_Unaligned_Load)
bca718
 	jnz	2f
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	STRCPY_SSSE3@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(STRCPY)
bca718
-# else
bca718
-
bca718
-ENTRY(STRCPY)
bca718
-	.type	STRCPY, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	STRCPY_IA32, %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	STRCPY_SSE2, %eax
bca718
-	testl	$bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features
bca718
-	jnz	2f
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	STRCPY_SSSE3, %eax
bca718
+	LOAD_FUNC_GOT_EAX (STRCPY_SSSE3)
bca718
 2:	ret
bca718
 END(STRCPY)
bca718
 
bca718
-# endif
bca718
-
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
 	.type STRCPY_IA32, @function; \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcspn.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strcspn.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strcspn.S
bca718
@@ -42,40 +42,16 @@
bca718
    define multiple versions for strpbrk in static library since we
bca718
    need strpbrk before the initialization happened.  */
bca718
 #if (defined SHARED || !defined USE_AS_STRPBRK) && IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(STRCSPN)
bca718
 	.type	STRCSPN, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	STRCSPN_IA32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (STRCSPN_IA32)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	STRCSPN_SSE42@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(STRCSPN)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(STRCSPN)
bca718
-	.type	STRCSPN, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	STRCSPN_IA32, %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	STRCSPN_SSE42, %eax
bca718
+	LOAD_FUNC_GOT_EAX (STRCSPN_SSE42)
bca718
 2:	ret
bca718
 END(STRCSPN)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strlen.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strlen.S
bca718
@@ -28,24 +28,15 @@
bca718
 	.text
bca718
 ENTRY(strlen)
bca718
 	.type	strlen, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strlen_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strlen_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__strlen_sse2_bsf@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__strlen_sse2_bsf)
bca718
+	HAS_ARCH_FEATURE (Slow_BSF)
bca718
 	jz	2f
bca718
-	leal	__strlen_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__strlen_sse2)
bca718
+2:	ret
bca718
 END(strlen)
bca718
 
bca718
 # undef ENTRY
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strncase.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strncase.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strncase.S
bca718
@@ -20,48 +20,18 @@
bca718
 #include <sysdep.h>
bca718
 #include <init-arch.h>
bca718
 
bca718
-#ifdef SHARED
bca718
 	.text
bca718
 ENTRY(__strncasecmp)
bca718
 	.type	__strncasecmp, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strncasecmp_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strncasecmp_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__strncasecmp_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__strncasecmp_ssse3)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	__strncasecmp_sse4_2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(__strncasecmp)
bca718
-#else
bca718
-	.text
bca718
-ENTRY(__strncasecmp)
bca718
-	.type	__strncasecmp, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strncasecmp_ia32, %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__strncasecmp_ssse3, %eax
bca718
-#if 0
bca718
-	// XXX Temporarily
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__strncasecmp_sse4_2, %eax
bca718
-#endif
bca718
+	LOAD_FUNC_GOT_EAX (__strncasecmp_sse4_2)
bca718
 2:	ret
bca718
 END(__strncasecmp)
bca718
-#endif
bca718
 
bca718
 weak_alias (__strncasecmp, strncasecmp)
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strnlen.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strnlen.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strnlen.S
bca718
@@ -25,21 +25,12 @@
bca718
 	.text
bca718
 ENTRY(__strnlen)
bca718
 	.type	__strnlen, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strnlen_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strnlen_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__strnlen_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__strnlen_sse2)
bca718
+2:	ret
bca718
 END(__strnlen)
bca718
 
bca718
 weak_alias(__strnlen, strnlen)
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strrchr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strrchr.S
bca718
@@ -25,24 +25,15 @@
bca718
 	.text
bca718
 ENTRY(strrchr)
bca718
 	.type	strrchr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strrchr_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strrchr_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__strrchr_sse2_bsf@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__strrchr_sse2_bsf)
bca718
+	HAS_ARCH_FEATURE (Slow_BSF)
bca718
 	jz	2f
bca718
-	leal	__strrchr_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__strrchr_sse2)
bca718
+2:	ret
bca718
 END(strrchr)
bca718
 
bca718
 # undef ENTRY
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strspn.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strspn.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strspn.S
bca718
@@ -27,40 +27,16 @@
bca718
 
bca718
 /* Define multiple versions only for the definition in libc.  */
bca718
 #if IS_IN (libc)
bca718
-# ifdef SHARED
bca718
 	.text
bca718
 ENTRY(strspn)
bca718
 	.type	strspn, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strspn_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__strspn_ia32)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	__strspn_sse42@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
-END(strspn)
bca718
-# else
bca718
-	.text
bca718
-ENTRY(strspn)
bca718
-	.type	strspn, @gnu_indirect_function
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__strspn_ia32, %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
bca718
-	jz	2f
bca718
-	leal	__strspn_sse42, %eax
bca718
+	LOAD_FUNC_GOT_EAX (__strspn_sse42)
bca718
 2:	ret
bca718
 END(strspn)
bca718
-# endif
bca718
 
bca718
 # undef ENTRY
bca718
 # define ENTRY(name) \
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcschr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcschr.S
bca718
@@ -25,20 +25,11 @@
bca718
 	.text
bca718
 ENTRY(wcschr)
bca718
 	.type	wcschr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__wcschr_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__wcschr_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__wcschr_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__wcschr_sse2)
bca718
+2:	ret
bca718
 END(wcschr)
bca718
 #endif
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscmp.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscmp.S
bca718
@@ -28,20 +28,11 @@
bca718
 	.text
bca718
 ENTRY(wcscmp)
bca718
 	.type	wcscmp, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__wcscmp_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__wcscmp_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__wcscmp_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__wcscmp_sse2)
bca718
+2:	ret
bca718
 END(wcscmp)
bca718
 #endif
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcscpy.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcscpy.S
bca718
@@ -26,20 +26,11 @@
bca718
 	.text
bca718
 ENTRY(wcscpy)
bca718
 	.type	wcscpy, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__wcscpy_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__wcscpy_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__wcscpy_ssse3@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__wcscpy_ssse3)
bca718
+2:	ret
bca718
 END(wcscpy)
bca718
 #endif
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcslen.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcslen.S
bca718
@@ -25,21 +25,12 @@
bca718
 	.text
bca718
 ENTRY(__wcslen)
bca718
 	.type	__wcslen, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__wcslen_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__wcslen_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__wcslen_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__wcslen_sse2)
bca718
+2:	ret
bca718
 END(__wcslen)
bca718
 
bca718
 weak_alias(__wcslen, wcslen)
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wcsrchr.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wcsrchr.S
bca718
@@ -25,20 +25,11 @@
bca718
 	.text
bca718
 ENTRY(wcsrchr)
bca718
 	.type	wcsrchr, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__wcsrchr_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__wcsrchr_ia32)
bca718
+	HAS_CPU_FEATURE (SSE2)
bca718
 	jz	2f
bca718
-	leal	__wcsrchr_sse2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4);
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__wcsrchr_sse2)
bca718
+2:	ret
bca718
 END(wcsrchr)
bca718
 #endif
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp.S
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/wmemcmp.S
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/wmemcmp.S
bca718
@@ -27,23 +27,14 @@
bca718
 	.text
bca718
 ENTRY(wmemcmp)
bca718
 	.type	wmemcmp, @gnu_indirect_function
bca718
-	pushl	%ebx
bca718
-	cfi_adjust_cfa_offset (4)
bca718
-	cfi_rel_offset (ebx, 0)
bca718
-	LOAD_PIC_REG(bx)
bca718
-	cmpl	$0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
bca718
-	jne	1f
bca718
-	call	__init_cpu_features
bca718
-1:	leal	__wmemcmp_ia32@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_GOT_AND_RTLD_GLOBAL_RO
bca718
+	LOAD_FUNC_GOT_EAX (__wmemcmp_ia32)
bca718
+	HAS_CPU_FEATURE (SSSE3)
bca718
 	jz	2f
bca718
-	leal	__wmemcmp_ssse3@GOTOFF(%ebx), %eax
bca718
-	testl	$bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
bca718
+	LOAD_FUNC_GOT_EAX (__wmemcmp_ssse3)
bca718
+	HAS_CPU_FEATURE (SSE4_2)
bca718
 	jz	2f
bca718
-	leal	__wmemcmp_sse4_2@GOTOFF(%ebx), %eax
bca718
-2:	popl	%ebx
bca718
-	cfi_adjust_cfa_offset (-4)
bca718
-	cfi_restore (ebx)
bca718
-	ret
bca718
+	LOAD_FUNC_GOT_EAX (__wmemcmp_sse4_2)
bca718
+2:	ret
bca718
 END(wmemcmp)
bca718
 #endif
bca718
Index: glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strstr-c.c
bca718
===================================================================
bca718
--- glibc-2.17-c758a686.orig/sysdeps/i386/i686/multiarch/strstr-c.c
bca718
+++ glibc-2.17-c758a686/sysdeps/i386/i686/multiarch/strstr-c.c
bca718
@@ -24,7 +24,7 @@ extern __typeof (__redirect_strstr) __st
bca718
    ifunc symbol properly.  */
bca718
 extern __typeof (__redirect_strstr) __libc_strstr;
bca718
 libc_ifunc (__libc_strstr,
bca718
-	    HAS_SSE4_2 && !use_unaligned_strstr () ?
bca718
+	    HAS_CPU_FEATURE (SSE4_2) && !use_unaligned_strstr () ?
bca718
 	    __strstr_sse42 : __strstr_ia32)
bca718
 
bca718
 #undef strstr