powerpc: Optimize POWER7 strcmp trailing checks
[platform/upstream/glibc.git] / sysdeps / powerpc / powerpc64 / multiarch / ifunc-impl-list.c
1 /* Enumerate available IFUNC implementations of a function.  PowerPC64 version.
2    Copyright (C) 2013-2015 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    <http://www.gnu.org/licenses/>.  */
18
19 #include <assert.h>
20 #include <string.h>
21 #include <wchar.h>
22 #include <ldsodefs.h>
23 #include <ifunc-impl-list.h>
24
25 /* Maximum number of IFUNC implementations.  */
26 #define MAX_IFUNC       6
27
28 size_t
29 __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
30                         size_t max)
31 {
32   assert (max >= MAX_IFUNC);
33
34   size_t i = 0;
35
36   unsigned long int hwcap = GLRO(dl_hwcap);
37   unsigned long int hwcap2 = GLRO(dl_hwcap2);
38
39   /* hwcap contains only the latest supported ISA, the code checks which is
40      and fills the previous supported ones.  */
41   if (hwcap & PPC_FEATURE_ARCH_2_06)
42     hwcap |= PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_POWER5_PLUS |
43              PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
44   else if (hwcap & PPC_FEATURE_ARCH_2_05)
45     hwcap |= PPC_FEATURE_POWER5_PLUS | PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
46   else if (hwcap & PPC_FEATURE_POWER5_PLUS)
47     hwcap |= PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
48   else if (hwcap & PPC_FEATURE_POWER5)
49     hwcap |= PPC_FEATURE_POWER4;
50
51 #ifdef SHARED
52   /* Support sysdeps/powerpc/powerpc64/multiarch/memcpy.c.  */
53   IFUNC_IMPL (i, name, memcpy,
54               IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_HAS_VSX,
55                               __memcpy_power7)
56               IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06,
57                               __memcpy_a2)
58               IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_05,
59                               __memcpy_power6)
60               IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_CELL_BE,
61                               __memcpy_cell)
62               IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_POWER4,
63                               __memcpy_power4)
64               IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ppc))
65
66   /* Support sysdeps/powerpc/powerpc64/multiarch/memmove.c.  */
67   IFUNC_IMPL (i, name, memmove,
68               IFUNC_IMPL_ADD (array, i, memmove, hwcap & PPC_FEATURE_HAS_VSX,
69                               __memmove_power7)
70               IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ppc))
71
72   /* Support sysdeps/powerpc/powerpc64/multiarch/memset.c.  */
73   IFUNC_IMPL (i, name, memset,
74               IFUNC_IMPL_ADD (array, i, memset, hwcap2 & PPC_FEATURE2_ARCH_2_07,
75                               __memset_power8)
76               IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_HAS_VSX,
77                               __memset_power7)
78               IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_ARCH_2_05,
79                               __memset_power6)
80               IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_POWER4,
81                               __memset_power4)
82               IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ppc))
83
84   /* Support sysdeps/powerpc/powerpc64/multiarch/strcpy.c.  */
85   IFUNC_IMPL (i, name, strcpy,
86               IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07,
87                               __strcpy_power8)
88               IFUNC_IMPL_ADD (array, i, strcpy, hwcap & PPC_FEATURE_HAS_VSX,
89                               __strcpy_power7)
90               IFUNC_IMPL_ADD (array, i, strcpy, 1,
91                               __strcpy_ppc))
92
93   /* Support sysdeps/powerpc/powerpc64/multiarch/stpcpy.c.  */
94   IFUNC_IMPL (i, name, stpcpy,
95               IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07,
96                               __stpcpy_power8)
97               IFUNC_IMPL_ADD (array, i, stpcpy, hwcap & PPC_FEATURE_HAS_VSX,
98                               __stpcpy_power7)
99               IFUNC_IMPL_ADD (array, i, stpcpy, 1,
100                               __stpcpy_ppc))
101
102   /* Support sysdeps/powerpc/powerpc64/multiarch/strlen.c.  */
103   IFUNC_IMPL (i, name, strlen,
104               IFUNC_IMPL_ADD (array, i, strlen, hwcap & PPC_FEATURE_HAS_VSX,
105                               __strlen_power7)
106               IFUNC_IMPL_ADD (array, i, strlen, 1,
107                               __strlen_ppc))
108
109   /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c.  */
110   IFUNC_IMPL (i, name, strncmp,
111               IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_HAS_VSX,
112                               __strncmp_power7)
113               IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_POWER4,
114                               __strncmp_power4)
115               IFUNC_IMPL_ADD (array, i, strncmp, 1,
116                               __strncmp_ppc))
117
118   /* Support sysdeps/powerpc/powerpc64/multiarch/strchr.c.  */
119   IFUNC_IMPL (i, name, strchr,
120               IFUNC_IMPL_ADD (array, i, strchr,
121                               hwcap & PPC_FEATURE_HAS_VSX,
122                               __strchr_power7)
123               IFUNC_IMPL_ADD (array, i, strchr, 1,
124                               __strchr_ppc))
125
126   /* Support sysdeps/powerpc/powerpc64/multiarch/strchrnul.c.  */
127   IFUNC_IMPL (i, name, strchrnul,
128               IFUNC_IMPL_ADD (array, i, strchrnul,
129                               hwcap & PPC_FEATURE_HAS_VSX,
130                               __strchrnul_power7)
131               IFUNC_IMPL_ADD (array, i, strchrnul, 1,
132                               __strchrnul_ppc))
133 #endif
134
135   /* Support sysdeps/powerpc/powerpc64/multiarch/memcmp.c.  */
136   IFUNC_IMPL (i, name, memcmp,
137               IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_HAS_VSX,
138                               __memcmp_power7)
139               IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_POWER4,
140                               __memcmp_power4)
141               IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ppc))
142
143   /* Support sysdeps/powerpc/powerpc64/multiarch/bzero.c.  */
144   IFUNC_IMPL (i, name, bzero,
145               IFUNC_IMPL_ADD (array, i, bzero, hwcap2 & PPC_FEATURE2_ARCH_2_07,
146                               __bzero_power8)
147               IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_HAS_VSX,
148                               __bzero_power7)
149               IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_ARCH_2_05,
150                               __bzero_power6)
151               IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_POWER4,
152                               __bzero_power4)
153               IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ppc))
154
155   /* Support sysdeps/powerpc/powerpc64/multiarch/bcopy.c.  */
156   IFUNC_IMPL (i, name, bcopy,
157               IFUNC_IMPL_ADD (array, i, bcopy, hwcap & PPC_FEATURE_HAS_VSX,
158                               __bcopy_power7)
159               IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ppc))
160
161   /* Support sysdeps/powerpc/powerpc64/multiarch/mempcpy.c.  */
162   IFUNC_IMPL (i, name, mempcpy,
163               IFUNC_IMPL_ADD (array, i, mempcpy,
164                               hwcap & PPC_FEATURE_HAS_VSX,
165                               __mempcpy_power7)
166               IFUNC_IMPL_ADD (array, i, mempcpy, 1,
167                               __mempcpy_ppc))
168
169   /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c.  */
170   IFUNC_IMPL (i, name, memchr,
171               IFUNC_IMPL_ADD (array, i, memchr,
172                               hwcap & PPC_FEATURE_HAS_VSX,
173                               __memchr_power7)
174               IFUNC_IMPL_ADD (array, i, memchr, 1,
175                               __memchr_ppc))
176
177   /* Support sysdeps/powerpc/powerpc64/multiarch/memrchr.c.  */
178   IFUNC_IMPL (i, name, memrchr,
179               IFUNC_IMPL_ADD (array, i, memrchr,
180                               hwcap & PPC_FEATURE_HAS_VSX,
181                               __memrchr_power7)
182               IFUNC_IMPL_ADD (array, i, memrchr, 1,
183                               __memrchr_ppc))
184
185   /* Support sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c.  */
186   IFUNC_IMPL (i, name, rawmemchr,
187               IFUNC_IMPL_ADD (array, i, rawmemchr,
188                               hwcap & PPC_FEATURE_HAS_VSX,
189                               __rawmemchr_power7)
190               IFUNC_IMPL_ADD (array, i, rawmemchr, 1,
191                               __rawmemchr_ppc))
192
193   /* Support sysdeps/powerpc/powerpc64/multiarch/strnlen.c.  */
194   IFUNC_IMPL (i, name, strnlen,
195               IFUNC_IMPL_ADD (array, i, strnlen, hwcap & PPC_FEATURE_HAS_VSX,
196                               __strnlen_power7)
197               IFUNC_IMPL_ADD (array, i, strnlen, 1,
198                               __strnlen_ppc))
199
200   /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c.  */
201   IFUNC_IMPL (i, name, strcasecmp,
202               IFUNC_IMPL_ADD (array, i, strcasecmp,
203                               hwcap & PPC_FEATURE_HAS_VSX,
204                               __strcasecmp_power7)
205               IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_ppc))
206
207   /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c.  */
208   IFUNC_IMPL (i, name, strcasecmp_l,
209               IFUNC_IMPL_ADD (array, i, strcasecmp_l,
210                               hwcap & PPC_FEATURE_HAS_VSX,
211                               __strcasecmp_l_power7)
212               IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
213                               __strcasecmp_l_ppc))
214
215   /* Support sysdeps/powerpc/powerpc64/multiarch/strncase.c.  */
216   IFUNC_IMPL (i, name, strncasecmp,
217               IFUNC_IMPL_ADD (array, i, strncasecmp,
218                               hwcap & PPC_FEATURE_HAS_VSX,
219                               __strncasecmp_power7)
220               IFUNC_IMPL_ADD (array, i, strncasecmp, 1, __strncasecmp_ppc))
221
222   /* Support sysdeps/powerpc/powerpc64/multiarch/strncase_l.c.  */
223   IFUNC_IMPL (i, name, strncasecmp_l,
224               IFUNC_IMPL_ADD (array, i, strncasecmp_l,
225                               hwcap & PPC_FEATURE_HAS_VSX,
226                               __strncasecmp_l_power7)
227               IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
228                               __strncasecmp_l_ppc))
229
230   /* Support sysdeps/powerpc/powerpc64/multiarch/wcschr.c.  */
231   IFUNC_IMPL (i, name, wcschr,
232               IFUNC_IMPL_ADD (array, i, wcschr,
233                               hwcap & PPC_FEATURE_HAS_VSX,
234                               __wcschr_power7)
235               IFUNC_IMPL_ADD (array, i, wcschr,
236                               hwcap & PPC_FEATURE_ARCH_2_05,
237                               __wcschr_power6)
238               IFUNC_IMPL_ADD (array, i, wcschr, 1,
239                               __wcschr_ppc))
240
241   /* Support sysdeps/powerpc/powerpc64/multiarch/wcschr.c.  */
242   IFUNC_IMPL (i, name, wcsrchr,
243               IFUNC_IMPL_ADD (array, i, wcsrchr,
244                               hwcap & PPC_FEATURE_HAS_VSX,
245                               __wcsrchr_power7)
246               IFUNC_IMPL_ADD (array, i, wcsrchr,
247                               hwcap & PPC_FEATURE_ARCH_2_05,
248                               __wcsrchr_power6)
249               IFUNC_IMPL_ADD (array, i, wcsrchr, 1,
250                               __wcsrchr_ppc))
251
252   /* Support sysdeps/powerpc/powerpc64/multiarch/wcscpy.c.  */
253   IFUNC_IMPL (i, name, wcscpy,
254               IFUNC_IMPL_ADD (array, i, wcscpy,
255                               hwcap & PPC_FEATURE_HAS_VSX,
256                               __wcscpy_power7)
257               IFUNC_IMPL_ADD (array, i, wcscpy,
258                               hwcap & PPC_FEATURE_ARCH_2_05,
259                               __wcscpy_power6)
260               IFUNC_IMPL_ADD (array, i, wcscpy, 1,
261                               __wcscpy_ppc))
262
263   /* Support sysdeps/powerpc/powerpc64/multiarch/strrchr.c.  */
264   IFUNC_IMPL (i, name, strrchr,
265               IFUNC_IMPL_ADD (array, i, strrchr,
266                               hwcap & PPC_FEATURE_HAS_VSX,
267                               __strrchr_power7)
268               IFUNC_IMPL_ADD (array, i, strrchr, 1,
269                               __strrchr_ppc))
270
271   /* Support sysdeps/powerpc/powerpc64/multiarch/strncat.c.  */
272   IFUNC_IMPL (i, name, strncat,
273               IFUNC_IMPL_ADD (array, i, strncat,
274                               hwcap & PPC_FEATURE_HAS_VSX,
275                               __strncat_power7)
276               IFUNC_IMPL_ADD (array, i, strncat, 1,
277                               __strncat_ppc))
278
279   /* Support sysdeps/powerpc/powerpc64/multiarch/strncpy.c.  */
280   IFUNC_IMPL (i, name, strncpy,
281               IFUNC_IMPL_ADD (array, i, strncpy,
282                               hwcap2 & PPC_FEATURE2_ARCH_2_07,
283                               __strncpy_power8)
284               IFUNC_IMPL_ADD (array, i, strncpy,
285                               hwcap & PPC_FEATURE_HAS_VSX,
286                               __strncpy_power7)
287               IFUNC_IMPL_ADD (array, i, strncpy, 1,
288                              __strncpy_ppc))
289
290   /* Support sysdeps/powerpc/powerpc64/multiarch/stpncpy.c.  */
291   IFUNC_IMPL (i, name, stpncpy,
292               IFUNC_IMPL_ADD (array, i, stpncpy,
293                               hwcap2 & PPC_FEATURE2_ARCH_2_07,
294                               __stpncpy_power8)
295               IFUNC_IMPL_ADD (array, i, stpncpy,
296                               hwcap & PPC_FEATURE_HAS_VSX,
297                               __stpncpy_power7)
298               IFUNC_IMPL_ADD (array, i, stpncpy, 1,
299                              __stpncpy_ppc))
300
301   /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c.  */
302   IFUNC_IMPL (i, name, strcmp,
303               IFUNC_IMPL_ADD (array, i, strcmp,
304                               hwcap2 & PPC_FEATURE2_ARCH_2_07,
305                               __strcmp_power8)
306               IFUNC_IMPL_ADD (array, i, strcmp,
307                               hwcap & PPC_FEATURE_HAS_VSX,
308                               __strcmp_power7)
309               IFUNC_IMPL_ADD (array, i, strcmp, 1,
310                              __strcmp_ppc))
311
312   /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c.  */
313   IFUNC_IMPL (i, name, strcat,
314               IFUNC_IMPL_ADD (array, i, strcat,
315                               hwcap2 & PPC_FEATURE2_ARCH_2_07,
316                               __strcat_power8)
317               IFUNC_IMPL_ADD (array, i, strcat,
318                               hwcap & PPC_FEATURE_HAS_VSX,
319                               __strcat_power7)
320               IFUNC_IMPL_ADD (array, i, strcat, 1,
321                              __strcat_ppc))
322
323   return i;
324 }