1  /* Enumerate available IFUNC implementations of a function.  x86-64 version.
       2     Copyright (C) 2012-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <assert.h>
      20  #include <string.h>
      21  #include <wchar.h>
      22  #include <ifunc-impl-list.h>
      23  #include <sysdep.h>
      24  #include "init-arch.h"
      25  
      26  /* Fill ARRAY of MAX elements with IFUNC implementations for function
      27     NAME supported on target machine and return the number of valid
      28     entries.  Each set of implementations for a given function is sorted in
      29     descending order by ISA level.  */
      30  
      31  size_t
      32  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
      33  			size_t max)
      34  {
      35    size_t i = max;
      36  
      37    /* Support sysdeps/x86_64/multiarch/memcmpeq.c.  */
      38    IFUNC_IMPL (i, name, __memcmpeq,
      39  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memcmpeq,
      40  				     (CPU_FEATURE_USABLE (AVX512VL)
      41  				      && CPU_FEATURE_USABLE (AVX512BW)
      42  				      && CPU_FEATURE_USABLE (BMI2)),
      43  				     __memcmpeq_evex)
      44  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memcmpeq,
      45  				     (CPU_FEATURE_USABLE (AVX2)
      46  				      && CPU_FEATURE_USABLE (BMI2)),
      47  				     __memcmpeq_avx2)
      48  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memcmpeq,
      49  				     (CPU_FEATURE_USABLE (AVX2)
      50  				      && CPU_FEATURE_USABLE (BMI2)
      51  				      && CPU_FEATURE_USABLE (RTM)),
      52  				     __memcmpeq_avx2_rtm)
      53  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
      54  	         implementation is also used at ISA level 2.  */
      55  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memcmpeq,
      56  				     1,
      57  				     __memcmpeq_sse2))
      58  
      59    /* Support sysdeps/x86_64/multiarch/memchr.c.  */
      60    IFUNC_IMPL (i, name, memchr,
      61  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memchr,
      62  				     (CPU_FEATURE_USABLE (AVX512VL)
      63  				      && CPU_FEATURE_USABLE (AVX512BW)
      64  				      && CPU_FEATURE_USABLE (BMI2)),
      65  				     __memchr_evex)
      66  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memchr,
      67  				     (CPU_FEATURE_USABLE (AVX512VL)
      68  				      && CPU_FEATURE_USABLE (AVX512BW)
      69  				      && CPU_FEATURE_USABLE (BMI2)),
      70  				     __memchr_evex512)
      71  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memchr,
      72  				     (CPU_FEATURE_USABLE (AVX512VL)
      73  				      && CPU_FEATURE_USABLE (AVX512BW)
      74  				      && CPU_FEATURE_USABLE (BMI2)),
      75  				     __memchr_evex_rtm)
      76  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memchr,
      77  				     (CPU_FEATURE_USABLE (AVX2)
      78  				      && CPU_FEATURE_USABLE (BMI2)),
      79  				     __memchr_avx2)
      80  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memchr,
      81  				     (CPU_FEATURE_USABLE (AVX2)
      82  				      && CPU_FEATURE_USABLE (BMI2)
      83  				      && CPU_FEATURE_USABLE (RTM)),
      84  				     __memchr_avx2_rtm)
      85  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
      86  	         implementation is also used at ISA level 2.  */
      87  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memchr,
      88  				     1,
      89  				     __memchr_sse2))
      90  
      91    /* Support sysdeps/x86_64/multiarch/memcmp.c.  */
      92    IFUNC_IMPL (i, name, memcmp,
      93  	      /* NB: If any of these names change or if any new
      94  	         implementations are added be sure to update
      95  	         sysdeps/x86_64/memcmp-isa-default-impl.h.  */
      96  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memcmp,
      97  				     (CPU_FEATURE_USABLE (AVX512VL)
      98  				      && CPU_FEATURE_USABLE (AVX512BW)
      99  				      && CPU_FEATURE_USABLE (BMI2)
     100  				      && CPU_FEATURE_USABLE (MOVBE)),
     101  				     __memcmp_evex_movbe)
     102  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memcmp,
     103  				     (CPU_FEATURE_USABLE (AVX2)
     104  				      && CPU_FEATURE_USABLE (BMI2)
     105  				      && CPU_FEATURE_USABLE (MOVBE)),
     106  				     __memcmp_avx2_movbe)
     107  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memcmp,
     108  				     (CPU_FEATURE_USABLE (AVX2)
     109  				      && CPU_FEATURE_USABLE (BMI2)
     110  				      && CPU_FEATURE_USABLE (MOVBE)
     111  				      && CPU_FEATURE_USABLE (RTM)),
     112  				     __memcmp_avx2_movbe_rtm)
     113  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     114  	         implementation is also used at ISA level 2.  */
     115  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memcmp,
     116  				     1,
     117  				     __memcmp_sse2))
     118  
     119  #ifdef SHARED
     120    /* Support sysdeps/x86_64/multiarch/memmove_chk.c.  */
     121    IFUNC_IMPL (i, name, __memmove_chk,
     122  	      IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
     123  			      __memmove_chk_erms)
     124  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
     125  				     CPU_FEATURE_USABLE (AVX512F),
     126  				     __memmove_chk_avx512_no_vzeroupper)
     127  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
     128  				     CPU_FEATURE_USABLE (AVX512VL),
     129  				     __memmove_chk_avx512_unaligned)
     130  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
     131  				     CPU_FEATURE_USABLE (AVX512VL),
     132  				     __memmove_chk_avx512_unaligned_erms)
     133  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
     134  				     CPU_FEATURE_USABLE (AVX512VL),
     135  				     __memmove_chk_evex_unaligned)
     136  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
     137  				     CPU_FEATURE_USABLE (AVX512VL),
     138  				     __memmove_chk_evex_unaligned_erms)
     139  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
     140  				     CPU_FEATURE_USABLE (AVX),
     141  				     __memmove_chk_avx_unaligned)
     142  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
     143  				     CPU_FEATURE_USABLE (AVX),
     144  				     __memmove_chk_avx_unaligned_erms)
     145  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
     146  				     (CPU_FEATURE_USABLE (AVX)
     147  				      && CPU_FEATURE_USABLE (RTM)),
     148  				     __memmove_chk_avx_unaligned_rtm)
     149  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
     150  				     (CPU_FEATURE_USABLE (AVX)
     151  				      && CPU_FEATURE_USABLE (RTM)),
     152  				     __memmove_chk_avx_unaligned_erms_rtm)
     153  	      /* By V3 we assume fast aligned copy.  */
     154  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk,
     155  				     CPU_FEATURE_USABLE (SSSE3),
     156  				     __memmove_chk_ssse3)
     157  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     158  	         implementation is also used at ISA level 2 (SSSE3 is too
     159  	         optimized around aligned copy to be better as general
     160  	         purpose memmove).  */
     161  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
     162  				     __memmove_chk_sse2_unaligned)
     163  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
     164  				     __memmove_chk_sse2_unaligned_erms))
     165  #endif
     166  
     167    /* Support sysdeps/x86_64/multiarch/memmove.c.  */
     168    IFUNC_IMPL (i, name, memmove,
     169  	      IFUNC_IMPL_ADD (array, i, memmove, 1,
     170  			      __memmove_erms)
     171  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
     172  				     CPU_FEATURE_USABLE (AVX512F),
     173  				     __memmove_avx512_no_vzeroupper)
     174  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
     175  				     CPU_FEATURE_USABLE (AVX512VL),
     176  				     __memmove_avx512_unaligned)
     177  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
     178  				     CPU_FEATURE_USABLE (AVX512VL),
     179  				     __memmove_avx512_unaligned_erms)
     180  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
     181  				     CPU_FEATURE_USABLE (AVX512VL),
     182  				     __memmove_evex_unaligned)
     183  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
     184  				     CPU_FEATURE_USABLE (AVX512VL),
     185  				     __memmove_evex_unaligned_erms)
     186  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
     187  				     CPU_FEATURE_USABLE (AVX),
     188  				     __memmove_avx_unaligned)
     189  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
     190  				     CPU_FEATURE_USABLE (AVX),
     191  				     __memmove_avx_unaligned_erms)
     192  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
     193  				     (CPU_FEATURE_USABLE (AVX)
     194  				      && CPU_FEATURE_USABLE (RTM)),
     195  				     __memmove_avx_unaligned_rtm)
     196  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
     197  				     (CPU_FEATURE_USABLE (AVX)
     198  				      && CPU_FEATURE_USABLE (RTM)),
     199  				     __memmove_avx_unaligned_erms_rtm)
     200  	      /* By V3 we assume fast aligned copy.  */
     201  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memmove,
     202  				     CPU_FEATURE_USABLE (SSSE3),
     203  				     __memmove_ssse3)
     204  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     205  	         implementation is also used at ISA level 2 (SSSE3 is too
     206  	         optimized around aligned copy to be better as general
     207  	         purpose memmove).  */
     208  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
     209  				     __memmove_sse2_unaligned)
     210  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
     211  				     __memmove_sse2_unaligned_erms))
     212  
     213    /* Support sysdeps/x86_64/multiarch/memrchr.c.  */
     214    IFUNC_IMPL (i, name, memrchr,
     215  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memrchr,
     216  				     (CPU_FEATURE_USABLE (AVX512VL)
     217  				      && CPU_FEATURE_USABLE (AVX512BW)
     218  				      && CPU_FEATURE_USABLE (BMI2)
     219  				      && CPU_FEATURE_USABLE (LZCNT)),
     220  				     __memrchr_evex)
     221  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memrchr,
     222  				     (CPU_FEATURE_USABLE (AVX2)
     223  				      && CPU_FEATURE_USABLE (BMI2)
     224  				      && CPU_FEATURE_USABLE (LZCNT)),
     225  				     __memrchr_avx2)
     226  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memrchr,
     227  				     (CPU_FEATURE_USABLE (AVX2)
     228  				      && CPU_FEATURE_USABLE (BMI2)
     229  				      && CPU_FEATURE_USABLE (LZCNT)
     230  				      && CPU_FEATURE_USABLE (RTM)),
     231  				     __memrchr_avx2_rtm)
     232  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     233  	         implementation is also used at ISA level 2.  */
     234  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memrchr,
     235  				     1,
     236  				     __memrchr_sse2))
     237  
     238  #ifdef SHARED
     239    /* Support sysdeps/x86_64/multiarch/memset_chk.c.  */
     240    IFUNC_IMPL (i, name, __memset_chk,
     241  	      IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
     242  			      __memset_chk_erms)
     243  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
     244  				     (CPU_FEATURE_USABLE (AVX512VL)
     245  				      && CPU_FEATURE_USABLE (AVX512BW)
     246  				      && CPU_FEATURE_USABLE (BMI2)),
     247  				     __memset_chk_avx512_unaligned_erms)
     248  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
     249  				     (CPU_FEATURE_USABLE (AVX512VL)
     250  				      && CPU_FEATURE_USABLE (AVX512BW)
     251  				      && CPU_FEATURE_USABLE (BMI2)),
     252  				     __memset_chk_avx512_unaligned)
     253  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
     254  				     CPU_FEATURE_USABLE (AVX512F),
     255  				     __memset_chk_avx512_no_vzeroupper)
     256  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
     257  				     (CPU_FEATURE_USABLE (AVX512VL)
     258  				      && CPU_FEATURE_USABLE (AVX512BW)
     259  				      && CPU_FEATURE_USABLE (BMI2)),
     260  				     __memset_chk_evex_unaligned)
     261  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
     262  				     (CPU_FEATURE_USABLE (AVX512VL)
     263  				      && CPU_FEATURE_USABLE (AVX512BW)
     264  				      && CPU_FEATURE_USABLE (BMI2)),
     265  				     __memset_chk_evex_unaligned_erms)
     266  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
     267  				     CPU_FEATURE_USABLE (AVX2),
     268  				     __memset_chk_avx2_unaligned)
     269  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
     270  				     CPU_FEATURE_USABLE (AVX2),
     271  				     __memset_chk_avx2_unaligned_erms)
     272  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
     273  				     (CPU_FEATURE_USABLE (AVX2)
     274  				      && CPU_FEATURE_USABLE (RTM)),
     275  				     __memset_chk_avx2_unaligned_rtm)
     276  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
     277  				     (CPU_FEATURE_USABLE (AVX2)
     278  				      && CPU_FEATURE_USABLE (RTM)),
     279  				     __memset_chk_avx2_unaligned_erms_rtm)
     280  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     281  	         implementation is also used at ISA level 2.  */
     282  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memset_chk, 1,
     283  				     __memset_chk_sse2_unaligned)
     284  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memset_chk, 1,
     285  				     __memset_chk_sse2_unaligned_erms)
     286  	      )
     287  #endif
     288  
     289    /* Support sysdeps/x86_64/multiarch/memset.c.  */
     290    IFUNC_IMPL (i, name, memset,
     291  	      IFUNC_IMPL_ADD (array, i, memset, 1,
     292  			      __memset_erms)
     293  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
     294  				     (CPU_FEATURE_USABLE (AVX512VL)
     295  				      && CPU_FEATURE_USABLE (AVX512BW)
     296  				      && CPU_FEATURE_USABLE (BMI2)),
     297  				     __memset_avx512_unaligned_erms)
     298  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
     299  				     (CPU_FEATURE_USABLE (AVX512VL)
     300  				      && CPU_FEATURE_USABLE (AVX512BW)
     301  				      && CPU_FEATURE_USABLE (BMI2)),
     302  				     __memset_avx512_unaligned)
     303  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
     304  				     CPU_FEATURE_USABLE (AVX512F),
     305  				     __memset_avx512_no_vzeroupper)
     306  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
     307  				     (CPU_FEATURE_USABLE (AVX512VL)
     308  				      && CPU_FEATURE_USABLE (AVX512BW)
     309  				      && CPU_FEATURE_USABLE (BMI2)),
     310  				     __memset_evex_unaligned)
     311  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
     312  				     (CPU_FEATURE_USABLE (AVX512VL)
     313  				      && CPU_FEATURE_USABLE (AVX512BW)
     314  				      && CPU_FEATURE_USABLE (BMI2)),
     315  				     __memset_evex_unaligned_erms)
     316  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
     317  				     CPU_FEATURE_USABLE (AVX2),
     318  				     __memset_avx2_unaligned)
     319  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
     320  				     CPU_FEATURE_USABLE (AVX2),
     321  				     __memset_avx2_unaligned_erms)
     322  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
     323  				     (CPU_FEATURE_USABLE (AVX2)
     324  				      && CPU_FEATURE_USABLE (RTM)),
     325  				     __memset_avx2_unaligned_rtm)
     326  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
     327  				     (CPU_FEATURE_USABLE (AVX2)
     328  				      && CPU_FEATURE_USABLE (RTM)),
     329  				     __memset_avx2_unaligned_erms_rtm)
     330  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     331  	         implementation is also used at ISA level 2.  */
     332  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memset, 1,
     333  				     __memset_sse2_unaligned)
     334  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memset, 1,
     335  				     __memset_sse2_unaligned_erms)
     336  	     )
     337  
     338    /* Support sysdeps/x86_64/multiarch/rawmemchr.c.  */
     339    IFUNC_IMPL (i, name, rawmemchr,
     340  	      X86_IFUNC_IMPL_ADD_V4 (array, i, rawmemchr,
     341  				     (CPU_FEATURE_USABLE (AVX512VL)
     342  				      && CPU_FEATURE_USABLE (AVX512BW)
     343  				      && CPU_FEATURE_USABLE (BMI2)),
     344  				     __rawmemchr_evex)
     345  	      X86_IFUNC_IMPL_ADD_V4 (array, i, rawmemchr,
     346  				     (CPU_FEATURE_USABLE (AVX512VL)
     347  				      && CPU_FEATURE_USABLE (AVX512BW)
     348  				      && CPU_FEATURE_USABLE (BMI2)),
     349  				     __rawmemchr_evex512)
     350  	      X86_IFUNC_IMPL_ADD_V4 (array, i, rawmemchr,
     351  				     (CPU_FEATURE_USABLE (AVX512VL)
     352  				      && CPU_FEATURE_USABLE (AVX512BW)
     353  				      && CPU_FEATURE_USABLE (BMI2)),
     354  				     __rawmemchr_evex_rtm)
     355  	      X86_IFUNC_IMPL_ADD_V3 (array, i, rawmemchr,
     356  				     (CPU_FEATURE_USABLE (AVX2)
     357  				      && CPU_FEATURE_USABLE (BMI2)),
     358  				     __rawmemchr_avx2)
     359  	      X86_IFUNC_IMPL_ADD_V3 (array, i, rawmemchr,
     360  				     (CPU_FEATURE_USABLE (AVX2)
     361  				      && CPU_FEATURE_USABLE (BMI2)
     362  				      && CPU_FEATURE_USABLE (RTM)),
     363  				     __rawmemchr_avx2_rtm)
     364  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     365  	         implementation is also used at ISA level 2.  */
     366  	      X86_IFUNC_IMPL_ADD_V2 (array, i, rawmemchr,
     367  				     1,
     368  				     __rawmemchr_sse2))
     369  
     370    /* Support sysdeps/x86_64/multiarch/strlen.c.  */
     371    IFUNC_IMPL (i, name, strlen,
     372  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strlen,
     373  				     (CPU_FEATURE_USABLE (AVX512VL)
     374  				      && CPU_FEATURE_USABLE (AVX512BW)
     375  				      && CPU_FEATURE_USABLE (BMI2)),
     376  				     __strlen_evex)
     377  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strlen,
     378  				     (CPU_FEATURE_USABLE (AVX512VL)
     379  				      && CPU_FEATURE_USABLE (AVX512BW)
     380  				      && CPU_FEATURE_USABLE (BMI2)),
     381  				     __strlen_evex512)
     382  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strlen,
     383  				     (CPU_FEATURE_USABLE (AVX2)
     384  				      && CPU_FEATURE_USABLE (BMI2)),
     385  				     __strlen_avx2)
     386  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strlen,
     387  				     (CPU_FEATURE_USABLE (AVX2)
     388  				      && CPU_FEATURE_USABLE (BMI2)
     389  				      && CPU_FEATURE_USABLE (RTM)),
     390  				     __strlen_avx2_rtm)
     391  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     392  	         implementation is also used at ISA level 2.  */
     393  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strlen,
     394  				     1,
     395  				     __strlen_sse2))
     396  
     397    /* Support sysdeps/x86_64/multiarch/strnlen.c.  */
     398    IFUNC_IMPL (i, name, strnlen,
     399  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strnlen,
     400  				     (CPU_FEATURE_USABLE (AVX512VL)
     401  				      && CPU_FEATURE_USABLE (AVX512BW)
     402  				      && CPU_FEATURE_USABLE (BMI2)),
     403  				     __strnlen_evex)
     404  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strnlen,
     405  				     (CPU_FEATURE_USABLE (AVX512VL)
     406  				      && CPU_FEATURE_USABLE (AVX512BW)
     407  				      && CPU_FEATURE_USABLE (BMI2)),
     408  				     __strnlen_evex512)
     409  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strnlen,
     410  				     (CPU_FEATURE_USABLE (AVX2)
     411  				      && CPU_FEATURE_USABLE (BMI2)),
     412  				     __strnlen_avx2)
     413  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strnlen,
     414  				     (CPU_FEATURE_USABLE (AVX2)
     415  				      && CPU_FEATURE_USABLE (BMI2)
     416  				      && CPU_FEATURE_USABLE (RTM)),
     417  				     __strnlen_avx2_rtm)
     418  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     419  	         implementation is also used at ISA level 2.  */
     420  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strnlen,
     421  				     1,
     422  				     __strnlen_sse2))
     423  
     424    /* Support sysdeps/x86_64/multiarch/stpncpy.c.  */
     425    IFUNC_IMPL (i, name, stpncpy,
     426  	      X86_IFUNC_IMPL_ADD_V4 (array, i, stpncpy,
     427  				     (CPU_FEATURE_USABLE (AVX512VL)
     428  				      && CPU_FEATURE_USABLE (AVX512BW)),
     429  				     __stpncpy_evex)
     430  	      X86_IFUNC_IMPL_ADD_V3 (array, i, stpncpy,
     431  				     CPU_FEATURE_USABLE (AVX2),
     432  				     __stpncpy_avx2)
     433  	      X86_IFUNC_IMPL_ADD_V3 (array, i, stpncpy,
     434  				     (CPU_FEATURE_USABLE (AVX2)
     435  				      && CPU_FEATURE_USABLE (RTM)),
     436  				     __stpncpy_avx2_rtm)
     437  	      /* ISA V2 wrapper for sse2_unaligned implementation because
     438  	         the sse2_unaligned implementation is also used at ISA
     439  	         level 2.  */
     440  	      X86_IFUNC_IMPL_ADD_V2 (array, i, stpncpy,
     441  				     1,
     442  				     __stpncpy_sse2_unaligned))
     443  
     444    /* Support sysdeps/x86_64/multiarch/stpcpy.c.  */
     445    IFUNC_IMPL (i, name, stpcpy,
     446  	      X86_IFUNC_IMPL_ADD_V4 (array, i, stpcpy,
     447  				     (CPU_FEATURE_USABLE (AVX512VL)
     448  				      && CPU_FEATURE_USABLE (AVX512BW)),
     449  				     __stpcpy_evex)
     450  	      X86_IFUNC_IMPL_ADD_V3 (array, i, stpcpy,
     451  				     CPU_FEATURE_USABLE (AVX2),
     452  				     __stpcpy_avx2)
     453  	      X86_IFUNC_IMPL_ADD_V3 (array, i, stpcpy,
     454  				     (CPU_FEATURE_USABLE (AVX2)
     455  				      && CPU_FEATURE_USABLE (RTM)),
     456  				     __stpcpy_avx2_rtm)
     457  	      /* ISA V2 wrapper for sse2_unaligned implementation because
     458  	         the sse2_unaligned implementation is also used at ISA
     459  	         level 2.  */
     460  	      X86_IFUNC_IMPL_ADD_V2 (array, i, stpcpy,
     461  				     1,
     462  				     __stpcpy_sse2_unaligned)
     463  	      X86_IFUNC_IMPL_ADD_V1 (array, i, stpcpy,
     464  				     1,
     465  				     __stpcpy_sse2))
     466  
     467    /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c.  */
     468    IFUNC_IMPL (i, name, strcasecmp,
     469  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strcasecmp,
     470  				     (CPU_FEATURE_USABLE (AVX512VL)
     471  				      && CPU_FEATURE_USABLE (AVX512BW)
     472  				      && CPU_FEATURE_USABLE (BMI2)),
     473  				     __strcasecmp_evex)
     474  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
     475  				     (CPU_FEATURE_USABLE (AVX2)
     476  				      && CPU_FEATURE_USABLE (BMI2)),
     477  				     __strcasecmp_avx2)
     478  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
     479  				     (CPU_FEATURE_USABLE (AVX2)
     480  				      && CPU_FEATURE_USABLE (BMI2)
     481  				      && CPU_FEATURE_USABLE (RTM)),
     482  				     __strcasecmp_avx2_rtm)
     483  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp,
     484  				     CPU_FEATURE_USABLE (SSE4_2),
     485  				     __strcasecmp_sse42)
     486  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     487  	         implementation is also used at ISA level 2.  */
     488  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp,
     489  				     1,
     490  				     __strcasecmp_sse2))
     491  
     492    /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c.  */
     493    IFUNC_IMPL (i, name, strcasecmp_l,
     494  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strcasecmp,
     495  				     (CPU_FEATURE_USABLE (AVX512VL)
     496  				      && CPU_FEATURE_USABLE (AVX512BW)
     497  				      && CPU_FEATURE_USABLE (BMI2)),
     498  				     __strcasecmp_l_evex)
     499  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
     500  				     (CPU_FEATURE_USABLE (AVX2)
     501  				      && CPU_FEATURE_USABLE (BMI2)),
     502  				     __strcasecmp_l_avx2)
     503  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
     504  				     (CPU_FEATURE_USABLE (AVX2)
     505  				      && CPU_FEATURE_USABLE (BMI2)
     506  				      && CPU_FEATURE_USABLE (RTM)),
     507  				     __strcasecmp_l_avx2_rtm)
     508  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp_l,
     509  				     CPU_FEATURE_USABLE (SSE4_2),
     510  				     __strcasecmp_l_sse42)
     511  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     512  	         implementation is also used at ISA level 2.  */
     513  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp_l,
     514  				     1,
     515  				     __strcasecmp_l_sse2))
     516  
     517    /* Support sysdeps/x86_64/multiarch/strcat.c.  */
     518    IFUNC_IMPL (i, name, strcat,
     519  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strcat,
     520  				     (CPU_FEATURE_USABLE (AVX512VL)
     521  				      && CPU_FEATURE_USABLE (AVX512BW)),
     522  				     __strcat_evex)
     523  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcat,
     524  				     CPU_FEATURE_USABLE (AVX2),
     525  				     __strcat_avx2)
     526  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcat,
     527  				     (CPU_FEATURE_USABLE (AVX2)
     528  				      && CPU_FEATURE_USABLE (RTM)),
     529  				     __strcat_avx2_rtm)
     530  	      /* ISA V2 wrapper for sse2_unaligned implementation because
     531  	         the sse2_unaligned implementation is also used at ISA
     532  	         level 2.  */
     533  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcat,
     534  				     1,
     535  				     __strcat_sse2_unaligned)
     536  	      X86_IFUNC_IMPL_ADD_V1 (array, i, strcat,
     537  				     1,
     538  				     __strcat_sse2))
     539  
     540    /* Support sysdeps/x86_64/multiarch/strchr.c.  */
     541    IFUNC_IMPL (i, name, strchr,
     542  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strchr,
     543  				     (CPU_FEATURE_USABLE (AVX512VL)
     544  				      && CPU_FEATURE_USABLE (AVX512BW)
     545  				      && CPU_FEATURE_USABLE (BMI2)),
     546  				     __strchr_evex)
     547  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strchr,
     548  				     (CPU_FEATURE_USABLE (AVX512VL)
     549  				      && CPU_FEATURE_USABLE (AVX512BW)),
     550  				     __strchr_evex512)
     551  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strchr,
     552  				     (CPU_FEATURE_USABLE (AVX2)
     553  				      && CPU_FEATURE_USABLE (BMI2)),
     554  				     __strchr_avx2)
     555  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strchr,
     556  				     (CPU_FEATURE_USABLE (AVX2)
     557  				      && CPU_FEATURE_USABLE (BMI2)
     558  				      && CPU_FEATURE_USABLE (RTM)),
     559  				     __strchr_avx2_rtm)
     560  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     561  	         implementation is also used at ISA level 2.  */
     562  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strchr,
     563  				     1,
     564  				     __strchr_sse2)
     565  	      X86_IFUNC_IMPL_ADD_V1 (array, i, strchr,
     566  				     1,
     567  				     __strchr_sse2_no_bsf))
     568  
     569    /* Support sysdeps/x86_64/multiarch/strchrnul.c.  */
     570    IFUNC_IMPL (i, name, strchrnul,
     571  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strchrnul,
     572  				     (CPU_FEATURE_USABLE (AVX512VL)
     573  				      && CPU_FEATURE_USABLE (AVX512BW)
     574  				      && CPU_FEATURE_USABLE (BMI2)),
     575  				     __strchrnul_evex)
     576  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strchrnul,
     577  				     (CPU_FEATURE_USABLE (AVX512VL)
     578  				      && CPU_FEATURE_USABLE (AVX512BW)),
     579  				     __strchrnul_evex512)
     580  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strchrnul,
     581  				     (CPU_FEATURE_USABLE (AVX2)
     582  				      && CPU_FEATURE_USABLE (BMI2)),
     583  				     __strchrnul_avx2)
     584  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strchrnul,
     585  				     (CPU_FEATURE_USABLE (AVX2)
     586  				      && CPU_FEATURE_USABLE (BMI2)
     587  				      && CPU_FEATURE_USABLE (RTM)),
     588  				     __strchrnul_avx2_rtm)
     589  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     590  	         implementation is also used at ISA level 2.  */
     591  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strchrnul,
     592  				     1,
     593  				     __strchrnul_sse2))
     594  
     595    /* Support sysdeps/x86_64/multiarch/strrchr.c.  */
     596    IFUNC_IMPL (i, name, strrchr,
     597  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strrchr,
     598  				     (CPU_FEATURE_USABLE (AVX512VL)
     599  				      && CPU_FEATURE_USABLE (AVX512BW)
     600  				      && CPU_FEATURE_USABLE (BMI1)
     601  				      && CPU_FEATURE_USABLE (BMI2)),
     602  				     __strrchr_evex)
     603  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strrchr,
     604  				     (CPU_FEATURE_USABLE (AVX512VL)
     605  				      && CPU_FEATURE_USABLE (AVX512BW)
     606  				      && CPU_FEATURE_USABLE (BMI2)),
     607  				     __strrchr_evex512)
     608  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strrchr,
     609  				     (CPU_FEATURE_USABLE (AVX2)
     610  				      && CPU_FEATURE_USABLE (BMI1)
     611  				      && CPU_FEATURE_USABLE (BMI2)),
     612  				     __strrchr_avx2)
     613  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strrchr,
     614  				     (CPU_FEATURE_USABLE (AVX2)
     615  				      && CPU_FEATURE_USABLE (BMI1)
     616  				      && CPU_FEATURE_USABLE (BMI2)
     617  				      && CPU_FEATURE_USABLE (RTM)),
     618  				     __strrchr_avx2_rtm)
     619  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     620  	         implementation is also used at ISA level 2.  */
     621  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strrchr,
     622  				     1,
     623  				     __strrchr_sse2))
     624  
     625    /* Support sysdeps/x86_64/multiarch/strcmp.c.  */
     626    IFUNC_IMPL (i, name, strcmp,
     627  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strcmp,
     628  				     (CPU_FEATURE_USABLE (AVX512VL)
     629  				      && CPU_FEATURE_USABLE (AVX512BW)
     630  				      && CPU_FEATURE_USABLE (BMI2)),
     631  				     __strcmp_evex)
     632  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcmp,
     633  				     (CPU_FEATURE_USABLE (AVX2)
     634  				      && CPU_FEATURE_USABLE (BMI2)),
     635  				     __strcmp_avx2)
     636  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcmp,
     637  				     (CPU_FEATURE_USABLE (AVX2)
     638  				      && CPU_FEATURE_USABLE (BMI2)
     639  				      && CPU_FEATURE_USABLE (RTM)),
     640  				     __strcmp_avx2_rtm)
     641  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcmp,
     642                                   CPU_FEATURE_USABLE (SSE4_2),
     643                                   __strcmp_sse42)
     644  	      /* ISA V2 wrapper for SSE2 implementations because the SSE2
     645  	         implementations are also used at ISA level 2.  */
     646  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcmp,
     647  				     1,
     648  				     __strcmp_sse2_unaligned)
     649  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcmp,
     650  				     1,
     651  				     __strcmp_sse2))
     652  
     653    /* Support sysdeps/x86_64/multiarch/strcpy.c.  */
     654    IFUNC_IMPL (i, name, strcpy,
     655  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strcpy,
     656  				     (CPU_FEATURE_USABLE (AVX512VL)
     657  				      && CPU_FEATURE_USABLE (AVX512BW)),
     658  				     __strcpy_evex)
     659  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcpy,
     660  				     CPU_FEATURE_USABLE (AVX2),
     661  				     __strcpy_avx2)
     662  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strcpy,
     663  				     (CPU_FEATURE_USABLE (AVX2)
     664  				      && CPU_FEATURE_USABLE (RTM)),
     665  				     __strcpy_avx2_rtm)
     666  	      /* ISA V2 wrapper for sse2_unaligned implementation because
     667  	         the sse2_unaligned implementation is also used at ISA
     668  	         level 2.  */
     669  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strcpy,
     670  				     1,
     671  				     __strcpy_sse2_unaligned)
     672  	      X86_IFUNC_IMPL_ADD_V1 (array, i, strcpy,
     673  				     1,
     674  				     __strcpy_sse2))
     675  
     676    /* Support sysdeps/x86_64/multiarch/strcspn.c.  */
     677    IFUNC_IMPL (i, name, strcspn,
     678  	      /* All implementations of strcspn are built at all ISA
     679  	         levels.  */
     680  	      IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
     681  			      __strcspn_sse42)
     682  	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_generic))
     683  
     684    /* Support sysdeps/x86_64/multiarch/strncase_l.c.  */
     685    IFUNC_IMPL (i, name, strncasecmp,
     686  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strncasecmp,
     687  				     (CPU_FEATURE_USABLE (AVX512VL)
     688  				      && CPU_FEATURE_USABLE (AVX512BW)
     689  				      && CPU_FEATURE_USABLE (BMI2)),
     690  				     __strncasecmp_evex)
     691  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
     692  				     (CPU_FEATURE_USABLE (AVX2)
     693  				      && CPU_FEATURE_USABLE (BMI2)),
     694  				     __strncasecmp_avx2)
     695  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
     696  				     (CPU_FEATURE_USABLE (AVX2)
     697  				      && CPU_FEATURE_USABLE (BMI2)
     698  				      && CPU_FEATURE_USABLE (RTM)),
     699  				     __strncasecmp_avx2_rtm)
     700  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp,
     701  				     CPU_FEATURE_USABLE (SSE4_2),
     702  				     __strncasecmp_sse42)
     703  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     704  	         implementation is also used at ISA level 2.  */
     705  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp,
     706  				     1,
     707  				     __strncasecmp_sse2))
     708  
     709    /* Support sysdeps/x86_64/multiarch/strncase_l.c.  */
     710    IFUNC_IMPL (i, name, strncasecmp_l,
     711  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strncasecmp,
     712  				     (CPU_FEATURE_USABLE (AVX512VL)
     713  				      & CPU_FEATURE_USABLE (AVX512BW)
     714  				      && CPU_FEATURE_USABLE (BMI2)),
     715  				     __strncasecmp_l_evex)
     716  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
     717  				     (CPU_FEATURE_USABLE (AVX2)
     718  				      && CPU_FEATURE_USABLE (BMI2)),
     719  				     __strncasecmp_l_avx2)
     720  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
     721  				     (CPU_FEATURE_USABLE (AVX2)
     722  				      && CPU_FEATURE_USABLE (BMI2)
     723  				      && CPU_FEATURE_USABLE (RTM)),
     724  				     __strncasecmp_l_avx2_rtm)
     725  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp_l,
     726  				     CPU_FEATURE_USABLE (SSE4_2),
     727  				     __strncasecmp_l_sse42)
     728  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     729  	         implementation is also used at ISA level 2.  */
     730  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp_l,
     731  				     1,
     732  				     __strncasecmp_l_sse2))
     733  
     734    /* Support sysdeps/x86_64/multiarch/strncat.c.  */
     735    IFUNC_IMPL (i, name, strncat,
     736  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strncat,
     737  				     (CPU_FEATURE_USABLE (AVX512VL)
     738  				      && CPU_FEATURE_USABLE (AVX512BW)),
     739  				     __strncat_evex)
     740  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncat,
     741  				     CPU_FEATURE_USABLE (AVX2),
     742  				     __strncat_avx2)
     743  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncat,
     744  				     (CPU_FEATURE_USABLE (AVX2)
     745  				      && CPU_FEATURE_USABLE (RTM)),
     746  				     __strncat_avx2_rtm)
     747  	      /* ISA V2 wrapper for sse2_unaligned implementation because
     748  	         the sse2_unaligned implementation is also used at ISA
     749  	         level 2.  */
     750  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncat,
     751  				     1,
     752  				     __strncat_sse2_unaligned))
     753  
     754    /* Support sysdeps/x86_64/multiarch/strncpy.c.  */
     755    IFUNC_IMPL (i, name, strncpy,
     756  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strncpy,
     757  				     (CPU_FEATURE_USABLE (AVX512VL)
     758  				      && CPU_FEATURE_USABLE (AVX512BW)),
     759  				     __strncpy_evex)
     760  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncpy,
     761  				     CPU_FEATURE_USABLE (AVX2),
     762  				     __strncpy_avx2)
     763  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncpy,
     764  				     (CPU_FEATURE_USABLE (AVX2)
     765  				      && CPU_FEATURE_USABLE (RTM)),
     766  				     __strncpy_avx2_rtm)
     767  	      /* ISA V2 wrapper for sse2_unaligned implementation because
     768  	         the sse2_unaligned implementation is also used at ISA
     769  	         level 2.  */
     770  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncpy,
     771  				     1,
     772  				     __strncpy_sse2_unaligned))
     773  
     774    /* Support sysdeps/x86_64/multiarch/strpbrk.c.  */
     775    IFUNC_IMPL (i, name, strpbrk,
     776  	      /* All implementations of strpbrk are built at all ISA
     777  	         levels.  */
     778  	      IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
     779  			      __strpbrk_sse42)
     780  	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_generic))
     781  
     782  
     783    /* Support sysdeps/x86_64/multiarch/strspn.c.  */
     784    IFUNC_IMPL (i, name, strspn,
     785  	      /* All implementations of strspn are built at all ISA
     786  	         levels.  */
     787  	      IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
     788  			      __strspn_sse42)
     789  	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_generic))
     790  
     791    /* Support sysdeps/x86_64/multiarch/strstr.c.  */
     792    IFUNC_IMPL (i, name, strstr,
     793                IFUNC_IMPL_ADD (array, i, strstr,
     794                                (CPU_FEATURE_USABLE (AVX512VL)
     795                                 && CPU_FEATURE_USABLE (AVX512BW)
     796                                 && CPU_FEATURE_USABLE (AVX512DQ)
     797                                 && CPU_FEATURE_USABLE (BMI2)),
     798                                __strstr_avx512)
     799  	      IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
     800  	      IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_generic))
     801  
     802    /* Support sysdeps/x86_64/multiarch/wcschr.c.  */
     803    IFUNC_IMPL (i, name, wcschr,
     804  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcschr,
     805  				     (CPU_FEATURE_USABLE (AVX512VL)
     806  				      && CPU_FEATURE_USABLE (AVX512BW)
     807  				      && CPU_FEATURE_USABLE (BMI2)),
     808  				     __wcschr_evex)
     809  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcschr,
     810  				     (CPU_FEATURE_USABLE (AVX512VL)
     811  				      && CPU_FEATURE_USABLE (AVX512BW)),
     812  				     __wcschr_evex512)
     813  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcschr,
     814  				     (CPU_FEATURE_USABLE (AVX2)
     815  				      && CPU_FEATURE_USABLE (BMI2)),
     816  				     __wcschr_avx2)
     817  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcschr,
     818  				     (CPU_FEATURE_USABLE (AVX2)
     819  				      && CPU_FEATURE_USABLE (BMI2)
     820  				      && CPU_FEATURE_USABLE (RTM)),
     821  				     __wcschr_avx2_rtm)
     822  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     823  	         implementation is also used at ISA level 2.  */
     824  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcschr,
     825  				     1,
     826  				     __wcschr_sse2))
     827  
     828    /* Support sysdeps/x86_64/multiarch/wcsrchr.c.  */
     829    IFUNC_IMPL (i, name, wcsrchr,
     830  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsrchr,
     831  				     (CPU_FEATURE_USABLE (AVX512VL)
     832  				      && CPU_FEATURE_USABLE (AVX512BW)
     833  				      && CPU_FEATURE_USABLE (BMI1)
     834  				      && CPU_FEATURE_USABLE (BMI2)),
     835  				     __wcsrchr_evex)
     836  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsrchr,
     837  				     (CPU_FEATURE_USABLE (AVX512VL)
     838  				      && CPU_FEATURE_USABLE (AVX512BW)
     839  				      && CPU_FEATURE_USABLE (BMI2)),
     840  				     __wcsrchr_evex512)
     841  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsrchr,
     842  				     (CPU_FEATURE_USABLE (AVX2)
     843  				      && CPU_FEATURE_USABLE (BMI1)
     844  				      && CPU_FEATURE_USABLE (BMI2)),
     845  				     __wcsrchr_avx2)
     846  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsrchr,
     847  				     (CPU_FEATURE_USABLE (AVX2)
     848  				      && CPU_FEATURE_USABLE (BMI1)
     849  				      && CPU_FEATURE_USABLE (BMI2)
     850  				      && CPU_FEATURE_USABLE (RTM)),
     851  				     __wcsrchr_avx2_rtm)
     852  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     853  	         implementation is also used at ISA level 2.  */
     854  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcsrchr,
     855  				     1,
     856  				     __wcsrchr_sse2))
     857  
     858    /* Support sysdeps/x86_64/multiarch/wcscmp.c.  */
     859    IFUNC_IMPL (i, name, wcscmp,
     860  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcscmp,
     861  				     (CPU_FEATURE_USABLE (AVX512VL)
     862  				      && CPU_FEATURE_USABLE (AVX512BW)
     863  				      && CPU_FEATURE_USABLE (BMI2)),
     864  				     __wcscmp_evex)
     865  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcscmp,
     866  				     (CPU_FEATURE_USABLE (AVX2)
     867  				      && CPU_FEATURE_USABLE (BMI2)),
     868  				     __wcscmp_avx2)
     869  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcscmp,
     870  				     (CPU_FEATURE_USABLE (AVX2)
     871  				      && CPU_FEATURE_USABLE (BMI2)
     872  				      && CPU_FEATURE_USABLE (RTM)),
     873  				     __wcscmp_avx2_rtm)
     874  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
     875  	         implementation is also used at ISA level 2.  */
     876  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcscmp,
     877  				     1,
     878  				     __wcscmp_sse2))
     879  
     880    /* Support sysdeps/x86_64/multiarch/wcsncmp.c.  */
     881    IFUNC_IMPL (i, name, wcsncmp,
     882  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncmp,
     883  				     (CPU_FEATURE_USABLE (AVX512VL)
     884  				      && CPU_FEATURE_USABLE (AVX512BW)
     885  				      && CPU_FEATURE_USABLE (BMI2)),
     886  				     __wcsncmp_evex)
     887  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncmp,
     888  				     (CPU_FEATURE_USABLE (AVX2)
     889  				      && CPU_FEATURE_USABLE (BMI2)),
     890  				     __wcsncmp_avx2)
     891  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncmp,
     892  				     (CPU_FEATURE_USABLE (AVX2)
     893  				      && CPU_FEATURE_USABLE (BMI2)
     894  				      && CPU_FEATURE_USABLE (RTM)),
     895  				     __wcsncmp_avx2_rtm)
     896  	      /* ISA V2 wrapper for GENERIC implementation because the
     897  	         GENERIC implementation is also used at ISA level 2.  */
     898  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncmp,
     899  				     1,
     900  				     __wcsncmp_generic))
     901  
     902    /* Support sysdeps/x86_64/multiarch/wcscpy.c.  */
     903    IFUNC_IMPL (i, name, wcscpy,
     904  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcscpy,
     905  				     (CPU_FEATURE_USABLE (AVX512VL)
     906  				      && CPU_FEATURE_USABLE (AVX512BW)
     907  				      && CPU_FEATURE_USABLE (BMI2)),
     908  				     __wcscpy_evex)
     909  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcscpy,
     910  				     (CPU_FEATURE_USABLE (AVX2)
     911  				      && CPU_FEATURE_USABLE (BMI2)),
     912  				     __wcscpy_avx2)
     913  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcscpy,
     914  				     CPU_FEATURE_USABLE (SSSE3),
     915  				     __wcscpy_ssse3)
     916  	      X86_IFUNC_IMPL_ADD_V1 (array, i, wcscpy,
     917  				     1,
     918  				     __wcscpy_generic))
     919  
     920    /* Support sysdeps/x86_64/multiarch/wcsncpy.c.  */
     921    IFUNC_IMPL (i, name, wcsncpy,
     922  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncpy,
     923  				     (CPU_FEATURE_USABLE (AVX512VL)
     924  				      && CPU_FEATURE_USABLE (AVX512BW)
     925  				      && CPU_FEATURE_USABLE (BMI2)),
     926  				     __wcsncpy_evex)
     927  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncpy,
     928  				     (CPU_FEATURE_USABLE (AVX2)
     929  				      && CPU_FEATURE_USABLE (BMI2)),
     930  				     __wcsncpy_avx2)
     931  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcpncpy,
     932  				     1,
     933  				     __wcsncpy_generic))
     934  
     935    /* Support sysdeps/x86_64/multiarch/wcpcpy.c.  */
     936    IFUNC_IMPL (i, name, wcpcpy,
     937  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcpcpy,
     938  				     (CPU_FEATURE_USABLE (AVX512VL)
     939  				      && CPU_FEATURE_USABLE (AVX512BW)
     940  				      && CPU_FEATURE_USABLE (BMI2)),
     941  				     __wcpcpy_evex)
     942  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcpcpy,
     943  				     (CPU_FEATURE_USABLE (AVX2)
     944  				      && CPU_FEATURE_USABLE (BMI2)),
     945  				     __wcpcpy_avx2)
     946  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcpcpy,
     947  				     1,
     948  				     __wcpcpy_generic))
     949  
     950    /* Support sysdeps/x86_64/multiarch/wcpncpy.c.  */
     951    IFUNC_IMPL (i, name, wcpncpy,
     952  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcpncpy,
     953  				     (CPU_FEATURE_USABLE (AVX512VL)
     954  				      && CPU_FEATURE_USABLE (AVX512BW)
     955  				      && CPU_FEATURE_USABLE (BMI2)),
     956  				     __wcpncpy_evex)
     957  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcpncpy,
     958  				     (CPU_FEATURE_USABLE (AVX2)
     959  				      && CPU_FEATURE_USABLE (BMI2)),
     960  				     __wcpncpy_avx2)
     961  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncpy,
     962  				     1,
     963  				     __wcpncpy_generic))
     964  
     965    /* Support sysdeps/x86_64/multiarch/wcscat.c.  */
     966    IFUNC_IMPL (i, name, wcscat,
     967  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcscat,
     968  				     (CPU_FEATURE_USABLE (AVX512VL)
     969  				      && CPU_FEATURE_USABLE (AVX512BW)
     970  				      && CPU_FEATURE_USABLE (BMI2)),
     971  				     __wcscat_evex)
     972  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcscat,
     973  				     (CPU_FEATURE_USABLE (AVX2)
     974  				      && CPU_FEATURE_USABLE (BMI2)),
     975  				     __wcscat_avx2)
     976  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcscat,
     977  				     1,
     978  				     __wcscat_generic))
     979  
     980    /* Support sysdeps/x86_64/multiarch/wcsncat.c.  */
     981    IFUNC_IMPL (i, name, wcsncat,
     982  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncat,
     983  				     (CPU_FEATURE_USABLE (AVX512VL)
     984  				      && CPU_FEATURE_USABLE (AVX512BW)
     985  				      && CPU_FEATURE_USABLE (BMI2)),
     986  				     __wcsncat_evex)
     987  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncat,
     988  				     (CPU_FEATURE_USABLE (AVX2)
     989  				      && CPU_FEATURE_USABLE (BMI2)),
     990  				     __wcsncat_avx2)
     991  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncat,
     992  				     1,
     993  				     __wcsncat_generic))
     994  
     995    /* Support sysdeps/x86_64/multiarch/wcslen.c.  */
     996    IFUNC_IMPL (i, name, wcslen,
     997  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcslen,
     998  				     (CPU_FEATURE_USABLE (AVX512VL)
     999  				      && CPU_FEATURE_USABLE (AVX512BW)
    1000  				      && CPU_FEATURE_USABLE (BMI2)),
    1001  				     __wcslen_evex)
    1002  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcslen,
    1003  				     (CPU_FEATURE_USABLE (AVX512VL)
    1004  				      && CPU_FEATURE_USABLE (AVX512BW)
    1005  				      && CPU_FEATURE_USABLE (BMI2)),
    1006  				     __wcslen_evex512)
    1007  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcslen,
    1008  				     (CPU_FEATURE_USABLE (AVX2)
    1009  				      && CPU_FEATURE_USABLE (BMI2)),
    1010  				     __wcslen_avx2)
    1011  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcslen,
    1012  				     (CPU_FEATURE_USABLE (AVX2)
    1013  				      && CPU_FEATURE_USABLE (BMI2)
    1014  				      && CPU_FEATURE_USABLE (RTM)),
    1015  				     __wcslen_avx2_rtm)
    1016  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcslen,
    1017  				     CPU_FEATURE_USABLE (SSE4_1),
    1018  				     __wcslen_sse4_1)
    1019  	      X86_IFUNC_IMPL_ADD_V1 (array, i, wcslen,
    1020  				     1,
    1021  				     __wcslen_sse2))
    1022  
    1023    /* Support sysdeps/x86_64/multiarch/wcsnlen.c.  */
    1024    IFUNC_IMPL (i, name, wcsnlen,
    1025  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsnlen,
    1026  				     (CPU_FEATURE_USABLE (AVX512VL)
    1027  				      && CPU_FEATURE_USABLE (AVX512BW)
    1028  				      && CPU_FEATURE_USABLE (BMI2)),
    1029  				     __wcsnlen_evex)
    1030  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wcsnlen,
    1031  				     (CPU_FEATURE_USABLE (AVX512VL)
    1032  				      && CPU_FEATURE_USABLE (AVX512BW)
    1033  				      && CPU_FEATURE_USABLE (BMI2)),
    1034  				     __wcsnlen_evex512)
    1035  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsnlen,
    1036  				     (CPU_FEATURE_USABLE (AVX2)
    1037  				      && CPU_FEATURE_USABLE (BMI2)),
    1038  				     __wcsnlen_avx2)
    1039  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wcsnlen,
    1040  				     (CPU_FEATURE_USABLE (AVX2)
    1041  				      && CPU_FEATURE_USABLE (BMI2)
    1042  				      && CPU_FEATURE_USABLE (RTM)),
    1043  				     __wcsnlen_avx2_rtm)
    1044  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wcsnlen,
    1045  				     CPU_FEATURE_USABLE (SSE4_1),
    1046  				     __wcsnlen_sse4_1)
    1047  	      X86_IFUNC_IMPL_ADD_V1 (array, i, wcsnlen,
    1048  				     1,
    1049  				     __wcsnlen_generic))
    1050  
    1051    /* Support sysdeps/x86_64/multiarch/wmemchr.c.  */
    1052    IFUNC_IMPL (i, name, wmemchr,
    1053  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wmemchr,
    1054  				     (CPU_FEATURE_USABLE (AVX512VL)
    1055  				      && CPU_FEATURE_USABLE (AVX512BW)
    1056  				      && CPU_FEATURE_USABLE (BMI2)),
    1057  				     __wmemchr_evex)
    1058  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wmemchr,
    1059  				     (CPU_FEATURE_USABLE (AVX512VL)
    1060  				      && CPU_FEATURE_USABLE (AVX512BW)
    1061  				      && CPU_FEATURE_USABLE (BMI2)),
    1062  				     __wmemchr_evex512)
    1063  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wmemchr,
    1064  				     (CPU_FEATURE_USABLE (AVX512VL)
    1065  				      && CPU_FEATURE_USABLE (AVX512BW)
    1066  				      && CPU_FEATURE_USABLE (BMI2)),
    1067  				     __wmemchr_evex_rtm)
    1068  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wmemchr,
    1069  				     (CPU_FEATURE_USABLE (AVX2)
    1070  				      && CPU_FEATURE_USABLE (BMI2)),
    1071  				     __wmemchr_avx2)
    1072  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wmemchr,
    1073  				     (CPU_FEATURE_USABLE (AVX2)
    1074  				      && CPU_FEATURE_USABLE (BMI2)
    1075  				      && CPU_FEATURE_USABLE (RTM)),
    1076  				     __wmemchr_avx2_rtm)
    1077  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1078  	         implementation is also used at ISA level 2.  */
    1079  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wmemchr,
    1080  				     1,
    1081  				     __wmemchr_sse2))
    1082  
    1083    /* Support sysdeps/x86_64/multiarch/wmemcmp.c.  */
    1084    IFUNC_IMPL (i, name, wmemcmp,
    1085  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wmemcmp,
    1086  				     (CPU_FEATURE_USABLE (AVX512VL)
    1087  				      && CPU_FEATURE_USABLE (AVX512BW)
    1088  				      && CPU_FEATURE_USABLE (BMI2)
    1089  				      && CPU_FEATURE_USABLE (MOVBE)),
    1090  				     __wmemcmp_evex_movbe)
    1091  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wmemcmp,
    1092  				     (CPU_FEATURE_USABLE (AVX2)
    1093  				      && CPU_FEATURE_USABLE (BMI2)
    1094  				      && CPU_FEATURE_USABLE (MOVBE)),
    1095  				     __wmemcmp_avx2_movbe)
    1096  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wmemcmp,
    1097  				     (CPU_FEATURE_USABLE (AVX2)
    1098  				      && CPU_FEATURE_USABLE (BMI2)
    1099  				      && CPU_FEATURE_USABLE (MOVBE)
    1100  				      && CPU_FEATURE_USABLE (RTM)),
    1101  				     __wmemcmp_avx2_movbe_rtm)
    1102  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1103  	         implementation is also used at ISA level 2.  */
    1104  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wmemcmp,
    1105  				     1,
    1106  				     __wmemcmp_sse2))
    1107  
    1108    /* Support sysdeps/x86_64/multiarch/wmemset.c.  */
    1109    IFUNC_IMPL (i, name, wmemset,
    1110  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wmemset,
    1111  				     (CPU_FEATURE_USABLE (AVX512VL)
    1112  				      && CPU_FEATURE_USABLE (AVX512BW)
    1113  				      && CPU_FEATURE_USABLE (BMI2)),
    1114  				     __wmemset_evex_unaligned)
    1115  	      X86_IFUNC_IMPL_ADD_V4 (array, i, wmemset,
    1116  				     (CPU_FEATURE_USABLE (AVX512VL)
    1117  				      && CPU_FEATURE_USABLE (AVX512BW)
    1118  				      && CPU_FEATURE_USABLE (BMI2)),
    1119  				     __wmemset_avx512_unaligned)
    1120  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wmemset,
    1121  				     CPU_FEATURE_USABLE (AVX2),
    1122  				     __wmemset_avx2_unaligned)
    1123  	      X86_IFUNC_IMPL_ADD_V3 (array, i, wmemset,
    1124  				     (CPU_FEATURE_USABLE (AVX2)
    1125  				      && CPU_FEATURE_USABLE (RTM)),
    1126  				     __wmemset_avx2_unaligned_rtm)
    1127  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1128  	         implementation is also used at ISA level 2.  */
    1129  	      X86_IFUNC_IMPL_ADD_V2 (array, i, wmemset, 1,
    1130  				     __wmemset_sse2_unaligned))
    1131  
    1132  #ifdef SHARED
    1133    /* Support sysdeps/x86_64/multiarch/memcpy_chk.c.  */
    1134    IFUNC_IMPL (i, name, __memcpy_chk,
    1135  	      IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
    1136  			      __memcpy_chk_erms)
    1137  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
    1138  				     CPU_FEATURE_USABLE (AVX512F),
    1139  				     __memcpy_chk_avx512_no_vzeroupper)
    1140  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
    1141  				     CPU_FEATURE_USABLE (AVX512VL),
    1142  				     __memcpy_chk_avx512_unaligned)
    1143  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
    1144  				     CPU_FEATURE_USABLE (AVX512VL),
    1145  				     __memcpy_chk_avx512_unaligned_erms)
    1146  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
    1147  				     CPU_FEATURE_USABLE (AVX512VL),
    1148  				     __memcpy_chk_evex_unaligned)
    1149  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
    1150  				     CPU_FEATURE_USABLE (AVX512VL),
    1151  				     __memcpy_chk_evex_unaligned_erms)
    1152  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
    1153  				     CPU_FEATURE_USABLE (AVX),
    1154  				     __memcpy_chk_avx_unaligned)
    1155  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
    1156  				     CPU_FEATURE_USABLE (AVX),
    1157  				     __memcpy_chk_avx_unaligned_erms)
    1158  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
    1159  				     (CPU_FEATURE_USABLE (AVX)
    1160  				      && CPU_FEATURE_USABLE (RTM)),
    1161  				     __memcpy_chk_avx_unaligned_rtm)
    1162  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
    1163  				     (CPU_FEATURE_USABLE (AVX)
    1164  				      && CPU_FEATURE_USABLE (RTM)),
    1165  				     __memcpy_chk_avx_unaligned_erms_rtm)
    1166  	      /* By V3 we assume fast aligned copy.  */
    1167  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk,
    1168  				     CPU_FEATURE_USABLE (SSSE3),
    1169  				     __memcpy_chk_ssse3)
    1170  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1171  	         implementation is also used at ISA level 2 (SSSE3 is too
    1172  	         optimized around aligned copy to be better as general
    1173  	         purpose memmove).  */
    1174  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
    1175  				     __memcpy_chk_sse2_unaligned)
    1176  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
    1177  				     __memcpy_chk_sse2_unaligned_erms))
    1178  #endif
    1179  
    1180    /* Support sysdeps/x86_64/multiarch/memcpy.c.  */
    1181    IFUNC_IMPL (i, name, memcpy,
    1182  	      IFUNC_IMPL_ADD (array, i, memcpy, 1,
    1183  			      __memcpy_erms)
    1184  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
    1185  				     CPU_FEATURE_USABLE (AVX512F),
    1186  				     __memcpy_avx512_no_vzeroupper)
    1187  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
    1188  				     CPU_FEATURE_USABLE (AVX512VL),
    1189  				     __memcpy_avx512_unaligned)
    1190  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
    1191  				     CPU_FEATURE_USABLE (AVX512VL),
    1192  				     __memcpy_avx512_unaligned_erms)
    1193  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
    1194  				     CPU_FEATURE_USABLE (AVX512VL),
    1195  				     __memcpy_evex_unaligned)
    1196  	      X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
    1197  				     CPU_FEATURE_USABLE (AVX512VL),
    1198  				     __memcpy_evex_unaligned_erms)
    1199  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
    1200  				     CPU_FEATURE_USABLE (AVX),
    1201  				     __memcpy_avx_unaligned)
    1202  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
    1203  				     CPU_FEATURE_USABLE (AVX),
    1204  				     __memcpy_avx_unaligned_erms)
    1205  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
    1206  				     (CPU_FEATURE_USABLE (AVX)
    1207  				      && CPU_FEATURE_USABLE (RTM)),
    1208  				     __memcpy_avx_unaligned_rtm)
    1209  	      X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
    1210  				     (CPU_FEATURE_USABLE (AVX)
    1211  				      && CPU_FEATURE_USABLE (RTM)),
    1212  				     __memcpy_avx_unaligned_erms_rtm)
    1213  	      /* By V3 we assume fast aligned copy.  */
    1214  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy,
    1215  				     CPU_FEATURE_USABLE (SSSE3),
    1216  				     __memcpy_ssse3)
    1217  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1218  	         implementation is also used at ISA level 2 (SSSE3 is too
    1219  	         optimized around aligned copy to be better as general
    1220  	         purpose memmove).  */
    1221  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
    1222  				     __memcpy_sse2_unaligned)
    1223  	      X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
    1224  				     __memcpy_sse2_unaligned_erms))
    1225  
    1226  #ifdef SHARED
    1227    /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c.  */
    1228    IFUNC_IMPL (i, name, __mempcpy_chk,
    1229  	      IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
    1230  			      __mempcpy_chk_erms)
    1231  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
    1232  				     CPU_FEATURE_USABLE (AVX512F),
    1233  				     __mempcpy_chk_avx512_no_vzeroupper)
    1234  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
    1235  				     CPU_FEATURE_USABLE (AVX512VL),
    1236  				     __mempcpy_chk_avx512_unaligned)
    1237  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
    1238  				     CPU_FEATURE_USABLE (AVX512VL),
    1239  				     __mempcpy_chk_avx512_unaligned_erms)
    1240  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
    1241  				     CPU_FEATURE_USABLE (AVX512VL),
    1242  				     __mempcpy_chk_evex_unaligned)
    1243  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
    1244  				     CPU_FEATURE_USABLE (AVX512VL),
    1245  				     __mempcpy_chk_evex_unaligned_erms)
    1246  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
    1247  				     CPU_FEATURE_USABLE (AVX),
    1248  				     __mempcpy_chk_avx_unaligned)
    1249  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
    1250  				     CPU_FEATURE_USABLE (AVX),
    1251  				     __mempcpy_chk_avx_unaligned_erms)
    1252  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
    1253  				     (CPU_FEATURE_USABLE (AVX)
    1254  				      && CPU_FEATURE_USABLE (RTM)),
    1255  				     __mempcpy_chk_avx_unaligned_rtm)
    1256  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
    1257  				     (CPU_FEATURE_USABLE (AVX)
    1258  				      && CPU_FEATURE_USABLE (RTM)),
    1259  				     __mempcpy_chk_avx_unaligned_erms_rtm)
    1260  	      /* By V3 we assume fast aligned copy.  */
    1261  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk,
    1262  				     CPU_FEATURE_USABLE (SSSE3),
    1263  				     __mempcpy_chk_ssse3)
    1264  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1265  	         implementation is also used at ISA level 2 (SSSE3 is too
    1266  	         optimized around aligned copy to be better as general
    1267  	         purpose memmove).  */
    1268  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
    1269  				     __mempcpy_chk_sse2_unaligned)
    1270  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
    1271  				     __mempcpy_chk_sse2_unaligned_erms))
    1272  #endif
    1273  
    1274    /* Support sysdeps/x86_64/multiarch/mempcpy.c.  */
    1275    IFUNC_IMPL (i, name, mempcpy,
    1276  	      IFUNC_IMPL_ADD (array, i, mempcpy, 1,
    1277  			      __mempcpy_erms)
    1278  	      X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
    1279  				     CPU_FEATURE_USABLE (AVX512F),
    1280  				     __mempcpy_avx512_no_vzeroupper)
    1281  	      X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
    1282  				     CPU_FEATURE_USABLE (AVX512VL),
    1283  				     __mempcpy_avx512_unaligned)
    1284  	      X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
    1285  				     CPU_FEATURE_USABLE (AVX512VL),
    1286  				     __mempcpy_avx512_unaligned_erms)
    1287  	      X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
    1288  				     CPU_FEATURE_USABLE (AVX512VL),
    1289  				     __mempcpy_evex_unaligned)
    1290  	      X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
    1291  				     CPU_FEATURE_USABLE (AVX512VL),
    1292  				     __mempcpy_evex_unaligned_erms)
    1293  	      X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
    1294  				     CPU_FEATURE_USABLE (AVX),
    1295  				     __mempcpy_avx_unaligned)
    1296  	      X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
    1297  				     CPU_FEATURE_USABLE (AVX),
    1298  				     __mempcpy_avx_unaligned_erms)
    1299  	      X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
    1300  				     (CPU_FEATURE_USABLE (AVX)
    1301  				      && CPU_FEATURE_USABLE (RTM)),
    1302  				     __mempcpy_avx_unaligned_rtm)
    1303  	      X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
    1304  				     (CPU_FEATURE_USABLE (AVX)
    1305  				      && CPU_FEATURE_USABLE (RTM)),
    1306  				     __mempcpy_avx_unaligned_erms_rtm)
    1307  	      /* By V3 we assume fast aligned copy.  */
    1308  	      X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy,
    1309  				     CPU_FEATURE_USABLE (SSSE3),
    1310  				     __mempcpy_ssse3)
    1311  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1312  	         implementation is also used at ISA level 2 (SSSE3 is too
    1313  	         optimized around aligned copy to be better as general
    1314  	         purpose memmove).  */
    1315  	      X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
    1316  				     __mempcpy_sse2_unaligned)
    1317  	      X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
    1318  				     __mempcpy_sse2_unaligned_erms))
    1319  
    1320    /* Support sysdeps/x86_64/multiarch/strncmp.c.  */
    1321    IFUNC_IMPL (i, name, strncmp,
    1322  	      X86_IFUNC_IMPL_ADD_V4 (array, i, strncmp,
    1323  				     (CPU_FEATURE_USABLE (AVX512VL)
    1324  				      && CPU_FEATURE_USABLE (AVX512BW)
    1325  				      && CPU_FEATURE_USABLE (BMI2)),
    1326  				     __strncmp_evex)
    1327  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncmp,
    1328  				     (CPU_FEATURE_USABLE (AVX2)
    1329  				      && CPU_FEATURE_USABLE (BMI2)),
    1330  				     __strncmp_avx2)
    1331  	      X86_IFUNC_IMPL_ADD_V3 (array, i, strncmp,
    1332  				     (CPU_FEATURE_USABLE (AVX2)
    1333  				      && CPU_FEATURE_USABLE (BMI2)
    1334  				      && CPU_FEATURE_USABLE (RTM)),
    1335  				     __strncmp_avx2_rtm)
    1336  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncmp,
    1337  				     CPU_FEATURE_USABLE (SSE4_2),
    1338  				     __strncmp_sse42)
    1339  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1340  	         implementation is also used at ISA level 2.  */
    1341  	      X86_IFUNC_IMPL_ADD_V2 (array, i, strncmp,
    1342  				     1,
    1343  				     __strncmp_sse2))
    1344  
    1345  #ifdef SHARED
    1346    /* Support sysdeps/x86_64/multiarch/wmemset_chk.c.  */
    1347    IFUNC_IMPL (i, name, __wmemset_chk,
    1348  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __wmemset_chk,
    1349  				     (CPU_FEATURE_USABLE (AVX512VL)
    1350  				      && CPU_FEATURE_USABLE (AVX512BW)
    1351  				      && CPU_FEATURE_USABLE (BMI2)),
    1352  				     __wmemset_chk_evex_unaligned)
    1353  	      X86_IFUNC_IMPL_ADD_V4 (array, i, __wmemset_chk,
    1354  				     (CPU_FEATURE_USABLE (AVX512VL)
    1355  				      && CPU_FEATURE_USABLE (AVX512BW)
    1356  				      && CPU_FEATURE_USABLE (BMI2)),
    1357  				     __wmemset_chk_avx512_unaligned)
    1358  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __wmemset_chk,
    1359  				     CPU_FEATURE_USABLE (AVX2),
    1360  				     __wmemset_chk_avx2_unaligned)
    1361  	      X86_IFUNC_IMPL_ADD_V3 (array, i, __wmemset_chk,
    1362  				     (CPU_FEATURE_USABLE (AVX2)
    1363  				      && CPU_FEATURE_USABLE (RTM)),
    1364  				     __wmemset_chk_avx2_unaligned_rtm)
    1365  	      /* ISA V2 wrapper for SSE2 implementation because the SSE2
    1366  	         implementation is also used at ISA level 2.  */
    1367  	      X86_IFUNC_IMPL_ADD_V2 (array, i, __wmemset_chk, 1,
    1368  				     __wmemset_chk_sse2_unaligned))
    1369  #endif
    1370  
    1371    return 0;
    1372  }