summaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106794.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-oe/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106794.patch')
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106794.patch2648
1 files changed, 2648 insertions, 0 deletions
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106794.patch b/meta-oe/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106794.patch
new file mode 100644
index 0000000000..29663c64a0
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106794.patch
@@ -0,0 +1,2648 @@
12011-08-24 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
2
3 gcc/
4 * config/arm/arm.c (arm_init_neon_builtins): Use
5 n_operands instead of n_generator_args.
6
72011-08-24 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
8
9 Backport from mainline
10 2011-04-18 Jie Zhang <jie@codesourcery.com>
11 Richard Earnshaw <rearnsha@arm.com>
12
13 * arm.c (neon_builtin_type_bits): Remove.
14 (typedef enum neon_builtin_mode): New.
15 (T_MAX): Don't define.
16 (typedef enum neon_builtin_datum): Remove bits, codes[],
17 num_vars and base_fcode. Add mode, code and fcode.
18 (VAR1, VAR2, VAR3, VAR4, VAR5, VAR6, VAR7, VAR8, VAR9
19 VAR10): Change accordingly.
20 (neon_builtin_data[]): Change accordingly
21 (arm_init_neon_builtins): Change accordingly.
22 (neon_builtin_compare): Remove.
23 (locate_neon_builtin_icode): Remove.
24 (arm_expand_neon_builtin): Change accordingly.
25
26 * arm.h (enum arm_builtins): Move to ...
27 * arm.c (enum arm_builtins): ... here; and rearrange builtin code.
28
29 * arm.c (arm_builtin_decl): Declare.
30 (TARGET_BUILTIN_DECL): Define.
31 (enum arm_builtins): Correct ARM_BUILTIN_MAX.
32 (arm_builtin_decls[]): New.
33 (arm_init_neon_builtins): Store builtin declarations in
34 arm_builtin_decls[].
35 (arm_init_tls_builtins): Likewise.
36 (arm_init_iwmmxt_builtins): Likewise. Refactor initialization code.
37 (arm_builtin_decl): New.
38
39=== modified file 'gcc/config/arm/arm.c'
40--- old/gcc/config/arm/arm.c 2011-08-18 13:53:37 +0000
41+++ new/gcc/config/arm/arm.c 2011-08-24 17:35:16 +0000
42@@ -162,6 +162,7 @@
43 static rtx arm_expand_binop_builtin (enum insn_code, tree, rtx);
44 static rtx arm_expand_unop_builtin (enum insn_code, tree, rtx, int);
45 static rtx arm_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
46+static tree arm_builtin_decl (unsigned, bool);
47 static void emit_constant_insn (rtx cond, rtx pattern);
48 static rtx emit_set_insn (rtx, rtx);
49 static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
50@@ -415,6 +416,8 @@
51 #define TARGET_INIT_BUILTINS arm_init_builtins
52 #undef TARGET_EXPAND_BUILTIN
53 #define TARGET_EXPAND_BUILTIN arm_expand_builtin
54+#undef TARGET_BUILTIN_DECL
55+#define TARGET_BUILTIN_DECL arm_builtin_decl
56
57 #undef TARGET_INIT_LIBFUNCS
58 #define TARGET_INIT_LIBFUNCS arm_init_libfuncs
59@@ -18147,505 +18150,31 @@
60 return value;
61 }
62
63-#define def_mbuiltin(MASK, NAME, TYPE, CODE) \
64- do \
65- { \
66- if ((MASK) & insn_flags) \
67- add_builtin_function ((NAME), (TYPE), (CODE), \
68- BUILT_IN_MD, NULL, NULL_TREE); \
69- } \
70- while (0)
71-
72-struct builtin_description
73-{
74- const unsigned int mask;
75- const enum insn_code icode;
76- const char * const name;
77- const enum arm_builtins code;
78- const enum rtx_code comparison;
79- const unsigned int flag;
80-};
81-
82-static const struct builtin_description bdesc_2arg[] =
83-{
84-#define IWMMXT_BUILTIN(code, string, builtin) \
85- { FL_IWMMXT, CODE_FOR_##code, "__builtin_arm_" string, \
86- ARM_BUILTIN_##builtin, UNKNOWN, 0 },
87-
88- IWMMXT_BUILTIN (addv8qi3, "waddb", WADDB)
89- IWMMXT_BUILTIN (addv4hi3, "waddh", WADDH)
90- IWMMXT_BUILTIN (addv2si3, "waddw", WADDW)
91- IWMMXT_BUILTIN (subv8qi3, "wsubb", WSUBB)
92- IWMMXT_BUILTIN (subv4hi3, "wsubh", WSUBH)
93- IWMMXT_BUILTIN (subv2si3, "wsubw", WSUBW)
94- IWMMXT_BUILTIN (ssaddv8qi3, "waddbss", WADDSSB)
95- IWMMXT_BUILTIN (ssaddv4hi3, "waddhss", WADDSSH)
96- IWMMXT_BUILTIN (ssaddv2si3, "waddwss", WADDSSW)
97- IWMMXT_BUILTIN (sssubv8qi3, "wsubbss", WSUBSSB)
98- IWMMXT_BUILTIN (sssubv4hi3, "wsubhss", WSUBSSH)
99- IWMMXT_BUILTIN (sssubv2si3, "wsubwss", WSUBSSW)
100- IWMMXT_BUILTIN (usaddv8qi3, "waddbus", WADDUSB)
101- IWMMXT_BUILTIN (usaddv4hi3, "waddhus", WADDUSH)
102- IWMMXT_BUILTIN (usaddv2si3, "waddwus", WADDUSW)
103- IWMMXT_BUILTIN (ussubv8qi3, "wsubbus", WSUBUSB)
104- IWMMXT_BUILTIN (ussubv4hi3, "wsubhus", WSUBUSH)
105- IWMMXT_BUILTIN (ussubv2si3, "wsubwus", WSUBUSW)
106- IWMMXT_BUILTIN (mulv4hi3, "wmulul", WMULUL)
107- IWMMXT_BUILTIN (smulv4hi3_highpart, "wmulsm", WMULSM)
108- IWMMXT_BUILTIN (umulv4hi3_highpart, "wmulum", WMULUM)
109- IWMMXT_BUILTIN (eqv8qi3, "wcmpeqb", WCMPEQB)
110- IWMMXT_BUILTIN (eqv4hi3, "wcmpeqh", WCMPEQH)
111- IWMMXT_BUILTIN (eqv2si3, "wcmpeqw", WCMPEQW)
112- IWMMXT_BUILTIN (gtuv8qi3, "wcmpgtub", WCMPGTUB)
113- IWMMXT_BUILTIN (gtuv4hi3, "wcmpgtuh", WCMPGTUH)
114- IWMMXT_BUILTIN (gtuv2si3, "wcmpgtuw", WCMPGTUW)
115- IWMMXT_BUILTIN (gtv8qi3, "wcmpgtsb", WCMPGTSB)
116- IWMMXT_BUILTIN (gtv4hi3, "wcmpgtsh", WCMPGTSH)
117- IWMMXT_BUILTIN (gtv2si3, "wcmpgtsw", WCMPGTSW)
118- IWMMXT_BUILTIN (umaxv8qi3, "wmaxub", WMAXUB)
119- IWMMXT_BUILTIN (smaxv8qi3, "wmaxsb", WMAXSB)
120- IWMMXT_BUILTIN (umaxv4hi3, "wmaxuh", WMAXUH)
121- IWMMXT_BUILTIN (smaxv4hi3, "wmaxsh", WMAXSH)
122- IWMMXT_BUILTIN (umaxv2si3, "wmaxuw", WMAXUW)
123- IWMMXT_BUILTIN (smaxv2si3, "wmaxsw", WMAXSW)
124- IWMMXT_BUILTIN (uminv8qi3, "wminub", WMINUB)
125- IWMMXT_BUILTIN (sminv8qi3, "wminsb", WMINSB)
126- IWMMXT_BUILTIN (uminv4hi3, "wminuh", WMINUH)
127- IWMMXT_BUILTIN (sminv4hi3, "wminsh", WMINSH)
128- IWMMXT_BUILTIN (uminv2si3, "wminuw", WMINUW)
129- IWMMXT_BUILTIN (sminv2si3, "wminsw", WMINSW)
130- IWMMXT_BUILTIN (iwmmxt_anddi3, "wand", WAND)
131- IWMMXT_BUILTIN (iwmmxt_nanddi3, "wandn", WANDN)
132- IWMMXT_BUILTIN (iwmmxt_iordi3, "wor", WOR)
133- IWMMXT_BUILTIN (iwmmxt_xordi3, "wxor", WXOR)
134- IWMMXT_BUILTIN (iwmmxt_uavgv8qi3, "wavg2b", WAVG2B)
135- IWMMXT_BUILTIN (iwmmxt_uavgv4hi3, "wavg2h", WAVG2H)
136- IWMMXT_BUILTIN (iwmmxt_uavgrndv8qi3, "wavg2br", WAVG2BR)
137- IWMMXT_BUILTIN (iwmmxt_uavgrndv4hi3, "wavg2hr", WAVG2HR)
138- IWMMXT_BUILTIN (iwmmxt_wunpckilb, "wunpckilb", WUNPCKILB)
139- IWMMXT_BUILTIN (iwmmxt_wunpckilh, "wunpckilh", WUNPCKILH)
140- IWMMXT_BUILTIN (iwmmxt_wunpckilw, "wunpckilw", WUNPCKILW)
141- IWMMXT_BUILTIN (iwmmxt_wunpckihb, "wunpckihb", WUNPCKIHB)
142- IWMMXT_BUILTIN (iwmmxt_wunpckihh, "wunpckihh", WUNPCKIHH)
143- IWMMXT_BUILTIN (iwmmxt_wunpckihw, "wunpckihw", WUNPCKIHW)
144- IWMMXT_BUILTIN (iwmmxt_wmadds, "wmadds", WMADDS)
145- IWMMXT_BUILTIN (iwmmxt_wmaddu, "wmaddu", WMADDU)
146-
147-#define IWMMXT_BUILTIN2(code, builtin) \
148- { FL_IWMMXT, CODE_FOR_##code, NULL, ARM_BUILTIN_##builtin, UNKNOWN, 0 },
149-
150- IWMMXT_BUILTIN2 (iwmmxt_wpackhss, WPACKHSS)
151- IWMMXT_BUILTIN2 (iwmmxt_wpackwss, WPACKWSS)
152- IWMMXT_BUILTIN2 (iwmmxt_wpackdss, WPACKDSS)
153- IWMMXT_BUILTIN2 (iwmmxt_wpackhus, WPACKHUS)
154- IWMMXT_BUILTIN2 (iwmmxt_wpackwus, WPACKWUS)
155- IWMMXT_BUILTIN2 (iwmmxt_wpackdus, WPACKDUS)
156- IWMMXT_BUILTIN2 (ashlv4hi3_di, WSLLH)
157- IWMMXT_BUILTIN2 (ashlv4hi3_iwmmxt, WSLLHI)
158- IWMMXT_BUILTIN2 (ashlv2si3_di, WSLLW)
159- IWMMXT_BUILTIN2 (ashlv2si3_iwmmxt, WSLLWI)
160- IWMMXT_BUILTIN2 (ashldi3_di, WSLLD)
161- IWMMXT_BUILTIN2 (ashldi3_iwmmxt, WSLLDI)
162- IWMMXT_BUILTIN2 (lshrv4hi3_di, WSRLH)
163- IWMMXT_BUILTIN2 (lshrv4hi3_iwmmxt, WSRLHI)
164- IWMMXT_BUILTIN2 (lshrv2si3_di, WSRLW)
165- IWMMXT_BUILTIN2 (lshrv2si3_iwmmxt, WSRLWI)
166- IWMMXT_BUILTIN2 (lshrdi3_di, WSRLD)
167- IWMMXT_BUILTIN2 (lshrdi3_iwmmxt, WSRLDI)
168- IWMMXT_BUILTIN2 (ashrv4hi3_di, WSRAH)
169- IWMMXT_BUILTIN2 (ashrv4hi3_iwmmxt, WSRAHI)
170- IWMMXT_BUILTIN2 (ashrv2si3_di, WSRAW)
171- IWMMXT_BUILTIN2 (ashrv2si3_iwmmxt, WSRAWI)
172- IWMMXT_BUILTIN2 (ashrdi3_di, WSRAD)
173- IWMMXT_BUILTIN2 (ashrdi3_iwmmxt, WSRADI)
174- IWMMXT_BUILTIN2 (rorv4hi3_di, WRORH)
175- IWMMXT_BUILTIN2 (rorv4hi3, WRORHI)
176- IWMMXT_BUILTIN2 (rorv2si3_di, WRORW)
177- IWMMXT_BUILTIN2 (rorv2si3, WRORWI)
178- IWMMXT_BUILTIN2 (rordi3_di, WRORD)
179- IWMMXT_BUILTIN2 (rordi3, WRORDI)
180- IWMMXT_BUILTIN2 (iwmmxt_wmacuz, WMACUZ)
181- IWMMXT_BUILTIN2 (iwmmxt_wmacsz, WMACSZ)
182-};
183-
184-static const struct builtin_description bdesc_1arg[] =
185-{
186- IWMMXT_BUILTIN (iwmmxt_tmovmskb, "tmovmskb", TMOVMSKB)
187- IWMMXT_BUILTIN (iwmmxt_tmovmskh, "tmovmskh", TMOVMSKH)
188- IWMMXT_BUILTIN (iwmmxt_tmovmskw, "tmovmskw", TMOVMSKW)
189- IWMMXT_BUILTIN (iwmmxt_waccb, "waccb", WACCB)
190- IWMMXT_BUILTIN (iwmmxt_wacch, "wacch", WACCH)
191- IWMMXT_BUILTIN (iwmmxt_waccw, "waccw", WACCW)
192- IWMMXT_BUILTIN (iwmmxt_wunpckehub, "wunpckehub", WUNPCKEHUB)
193- IWMMXT_BUILTIN (iwmmxt_wunpckehuh, "wunpckehuh", WUNPCKEHUH)
194- IWMMXT_BUILTIN (iwmmxt_wunpckehuw, "wunpckehuw", WUNPCKEHUW)
195- IWMMXT_BUILTIN (iwmmxt_wunpckehsb, "wunpckehsb", WUNPCKEHSB)
196- IWMMXT_BUILTIN (iwmmxt_wunpckehsh, "wunpckehsh", WUNPCKEHSH)
197- IWMMXT_BUILTIN (iwmmxt_wunpckehsw, "wunpckehsw", WUNPCKEHSW)
198- IWMMXT_BUILTIN (iwmmxt_wunpckelub, "wunpckelub", WUNPCKELUB)
199- IWMMXT_BUILTIN (iwmmxt_wunpckeluh, "wunpckeluh", WUNPCKELUH)
200- IWMMXT_BUILTIN (iwmmxt_wunpckeluw, "wunpckeluw", WUNPCKELUW)
201- IWMMXT_BUILTIN (iwmmxt_wunpckelsb, "wunpckelsb", WUNPCKELSB)
202- IWMMXT_BUILTIN (iwmmxt_wunpckelsh, "wunpckelsh", WUNPCKELSH)
203- IWMMXT_BUILTIN (iwmmxt_wunpckelsw, "wunpckelsw", WUNPCKELSW)
204-};
205-
206-/* Set up all the iWMMXt builtins. This is
207- not called if TARGET_IWMMXT is zero. */
208-
209-static void
210-arm_init_iwmmxt_builtins (void)
211-{
212- const struct builtin_description * d;
213- size_t i;
214- tree endlink = void_list_node;
215-
216- tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
217- tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
218- tree V8QI_type_node = build_vector_type_for_mode (intQI_type_node, V8QImode);
219-
220- tree int_ftype_int
221- = build_function_type (integer_type_node,
222- tree_cons (NULL_TREE, integer_type_node, endlink));
223- tree v8qi_ftype_v8qi_v8qi_int
224- = build_function_type (V8QI_type_node,
225- tree_cons (NULL_TREE, V8QI_type_node,
226- tree_cons (NULL_TREE, V8QI_type_node,
227- tree_cons (NULL_TREE,
228- integer_type_node,
229- endlink))));
230- tree v4hi_ftype_v4hi_int
231- = build_function_type (V4HI_type_node,
232- tree_cons (NULL_TREE, V4HI_type_node,
233- tree_cons (NULL_TREE, integer_type_node,
234- endlink)));
235- tree v2si_ftype_v2si_int
236- = build_function_type (V2SI_type_node,
237- tree_cons (NULL_TREE, V2SI_type_node,
238- tree_cons (NULL_TREE, integer_type_node,
239- endlink)));
240- tree v2si_ftype_di_di
241- = build_function_type (V2SI_type_node,
242- tree_cons (NULL_TREE, long_long_integer_type_node,
243- tree_cons (NULL_TREE, long_long_integer_type_node,
244- endlink)));
245- tree di_ftype_di_int
246- = build_function_type (long_long_integer_type_node,
247- tree_cons (NULL_TREE, long_long_integer_type_node,
248- tree_cons (NULL_TREE, integer_type_node,
249- endlink)));
250- tree di_ftype_di_int_int
251- = build_function_type (long_long_integer_type_node,
252- tree_cons (NULL_TREE, long_long_integer_type_node,
253- tree_cons (NULL_TREE, integer_type_node,
254- tree_cons (NULL_TREE,
255- integer_type_node,
256- endlink))));
257- tree int_ftype_v8qi
258- = build_function_type (integer_type_node,
259- tree_cons (NULL_TREE, V8QI_type_node,
260- endlink));
261- tree int_ftype_v4hi
262- = build_function_type (integer_type_node,
263- tree_cons (NULL_TREE, V4HI_type_node,
264- endlink));
265- tree int_ftype_v2si
266- = build_function_type (integer_type_node,
267- tree_cons (NULL_TREE, V2SI_type_node,
268- endlink));
269- tree int_ftype_v8qi_int
270- = build_function_type (integer_type_node,
271- tree_cons (NULL_TREE, V8QI_type_node,
272- tree_cons (NULL_TREE, integer_type_node,
273- endlink)));
274- tree int_ftype_v4hi_int
275- = build_function_type (integer_type_node,
276- tree_cons (NULL_TREE, V4HI_type_node,
277- tree_cons (NULL_TREE, integer_type_node,
278- endlink)));
279- tree int_ftype_v2si_int
280- = build_function_type (integer_type_node,
281- tree_cons (NULL_TREE, V2SI_type_node,
282- tree_cons (NULL_TREE, integer_type_node,
283- endlink)));
284- tree v8qi_ftype_v8qi_int_int
285- = build_function_type (V8QI_type_node,
286- tree_cons (NULL_TREE, V8QI_type_node,
287- tree_cons (NULL_TREE, integer_type_node,
288- tree_cons (NULL_TREE,
289- integer_type_node,
290- endlink))));
291- tree v4hi_ftype_v4hi_int_int
292- = build_function_type (V4HI_type_node,
293- tree_cons (NULL_TREE, V4HI_type_node,
294- tree_cons (NULL_TREE, integer_type_node,
295- tree_cons (NULL_TREE,
296- integer_type_node,
297- endlink))));
298- tree v2si_ftype_v2si_int_int
299- = build_function_type (V2SI_type_node,
300- tree_cons (NULL_TREE, V2SI_type_node,
301- tree_cons (NULL_TREE, integer_type_node,
302- tree_cons (NULL_TREE,
303- integer_type_node,
304- endlink))));
305- /* Miscellaneous. */
306- tree v8qi_ftype_v4hi_v4hi
307- = build_function_type (V8QI_type_node,
308- tree_cons (NULL_TREE, V4HI_type_node,
309- tree_cons (NULL_TREE, V4HI_type_node,
310- endlink)));
311- tree v4hi_ftype_v2si_v2si
312- = build_function_type (V4HI_type_node,
313- tree_cons (NULL_TREE, V2SI_type_node,
314- tree_cons (NULL_TREE, V2SI_type_node,
315- endlink)));
316- tree v2si_ftype_v4hi_v4hi
317- = build_function_type (V2SI_type_node,
318- tree_cons (NULL_TREE, V4HI_type_node,
319- tree_cons (NULL_TREE, V4HI_type_node,
320- endlink)));
321- tree v2si_ftype_v8qi_v8qi
322- = build_function_type (V2SI_type_node,
323- tree_cons (NULL_TREE, V8QI_type_node,
324- tree_cons (NULL_TREE, V8QI_type_node,
325- endlink)));
326- tree v4hi_ftype_v4hi_di
327- = build_function_type (V4HI_type_node,
328- tree_cons (NULL_TREE, V4HI_type_node,
329- tree_cons (NULL_TREE,
330- long_long_integer_type_node,
331- endlink)));
332- tree v2si_ftype_v2si_di
333- = build_function_type (V2SI_type_node,
334- tree_cons (NULL_TREE, V2SI_type_node,
335- tree_cons (NULL_TREE,
336- long_long_integer_type_node,
337- endlink)));
338- tree void_ftype_int_int
339- = build_function_type (void_type_node,
340- tree_cons (NULL_TREE, integer_type_node,
341- tree_cons (NULL_TREE, integer_type_node,
342- endlink)));
343- tree di_ftype_void
344- = build_function_type (long_long_unsigned_type_node, endlink);
345- tree di_ftype_v8qi
346- = build_function_type (long_long_integer_type_node,
347- tree_cons (NULL_TREE, V8QI_type_node,
348- endlink));
349- tree di_ftype_v4hi
350- = build_function_type (long_long_integer_type_node,
351- tree_cons (NULL_TREE, V4HI_type_node,
352- endlink));
353- tree di_ftype_v2si
354- = build_function_type (long_long_integer_type_node,
355- tree_cons (NULL_TREE, V2SI_type_node,
356- endlink));
357- tree v2si_ftype_v4hi
358- = build_function_type (V2SI_type_node,
359- tree_cons (NULL_TREE, V4HI_type_node,
360- endlink));
361- tree v4hi_ftype_v8qi
362- = build_function_type (V4HI_type_node,
363- tree_cons (NULL_TREE, V8QI_type_node,
364- endlink));
365-
366- tree di_ftype_di_v4hi_v4hi
367- = build_function_type (long_long_unsigned_type_node,
368- tree_cons (NULL_TREE,
369- long_long_unsigned_type_node,
370- tree_cons (NULL_TREE, V4HI_type_node,
371- tree_cons (NULL_TREE,
372- V4HI_type_node,
373- endlink))));
374-
375- tree di_ftype_v4hi_v4hi
376- = build_function_type (long_long_unsigned_type_node,
377- tree_cons (NULL_TREE, V4HI_type_node,
378- tree_cons (NULL_TREE, V4HI_type_node,
379- endlink)));
380-
381- /* Normal vector binops. */
382- tree v8qi_ftype_v8qi_v8qi
383- = build_function_type (V8QI_type_node,
384- tree_cons (NULL_TREE, V8QI_type_node,
385- tree_cons (NULL_TREE, V8QI_type_node,
386- endlink)));
387- tree v4hi_ftype_v4hi_v4hi
388- = build_function_type (V4HI_type_node,
389- tree_cons (NULL_TREE, V4HI_type_node,
390- tree_cons (NULL_TREE, V4HI_type_node,
391- endlink)));
392- tree v2si_ftype_v2si_v2si
393- = build_function_type (V2SI_type_node,
394- tree_cons (NULL_TREE, V2SI_type_node,
395- tree_cons (NULL_TREE, V2SI_type_node,
396- endlink)));
397- tree di_ftype_di_di
398- = build_function_type (long_long_unsigned_type_node,
399- tree_cons (NULL_TREE, long_long_unsigned_type_node,
400- tree_cons (NULL_TREE,
401- long_long_unsigned_type_node,
402- endlink)));
403-
404- /* Add all builtins that are more or less simple operations on two
405- operands. */
406- for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
407- {
408- /* Use one of the operands; the target can have a different mode for
409- mask-generating compares. */
410- enum machine_mode mode;
411- tree type;
412-
413- if (d->name == 0)
414- continue;
415-
416- mode = insn_data[d->icode].operand[1].mode;
417-
418- switch (mode)
419- {
420- case V8QImode:
421- type = v8qi_ftype_v8qi_v8qi;
422- break;
423- case V4HImode:
424- type = v4hi_ftype_v4hi_v4hi;
425- break;
426- case V2SImode:
427- type = v2si_ftype_v2si_v2si;
428- break;
429- case DImode:
430- type = di_ftype_di_di;
431- break;
432-
433- default:
434- gcc_unreachable ();
435- }
436-
437- def_mbuiltin (d->mask, d->name, type, d->code);
438- }
439-
440- /* Add the remaining MMX insns with somewhat more complicated types. */
441- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wzero", di_ftype_void, ARM_BUILTIN_WZERO);
442- def_mbuiltin (FL_IWMMXT, "__builtin_arm_setwcx", void_ftype_int_int, ARM_BUILTIN_SETWCX);
443- def_mbuiltin (FL_IWMMXT, "__builtin_arm_getwcx", int_ftype_int, ARM_BUILTIN_GETWCX);
444-
445- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsllh", v4hi_ftype_v4hi_di, ARM_BUILTIN_WSLLH);
446- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsllw", v2si_ftype_v2si_di, ARM_BUILTIN_WSLLW);
447- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wslld", di_ftype_di_di, ARM_BUILTIN_WSLLD);
448- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsllhi", v4hi_ftype_v4hi_int, ARM_BUILTIN_WSLLHI);
449- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsllwi", v2si_ftype_v2si_int, ARM_BUILTIN_WSLLWI);
450- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wslldi", di_ftype_di_int, ARM_BUILTIN_WSLLDI);
451-
452- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrlh", v4hi_ftype_v4hi_di, ARM_BUILTIN_WSRLH);
453- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrlw", v2si_ftype_v2si_di, ARM_BUILTIN_WSRLW);
454- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrld", di_ftype_di_di, ARM_BUILTIN_WSRLD);
455- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrlhi", v4hi_ftype_v4hi_int, ARM_BUILTIN_WSRLHI);
456- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrlwi", v2si_ftype_v2si_int, ARM_BUILTIN_WSRLWI);
457- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrldi", di_ftype_di_int, ARM_BUILTIN_WSRLDI);
458-
459- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrah", v4hi_ftype_v4hi_di, ARM_BUILTIN_WSRAH);
460- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsraw", v2si_ftype_v2si_di, ARM_BUILTIN_WSRAW);
461- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrad", di_ftype_di_di, ARM_BUILTIN_WSRAD);
462- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrahi", v4hi_ftype_v4hi_int, ARM_BUILTIN_WSRAHI);
463- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsrawi", v2si_ftype_v2si_int, ARM_BUILTIN_WSRAWI);
464- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsradi", di_ftype_di_int, ARM_BUILTIN_WSRADI);
465-
466- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wrorh", v4hi_ftype_v4hi_di, ARM_BUILTIN_WRORH);
467- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wrorw", v2si_ftype_v2si_di, ARM_BUILTIN_WRORW);
468- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wrord", di_ftype_di_di, ARM_BUILTIN_WRORD);
469- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wrorhi", v4hi_ftype_v4hi_int, ARM_BUILTIN_WRORHI);
470- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wrorwi", v2si_ftype_v2si_int, ARM_BUILTIN_WRORWI);
471- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wrordi", di_ftype_di_int, ARM_BUILTIN_WRORDI);
472-
473- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wshufh", v4hi_ftype_v4hi_int, ARM_BUILTIN_WSHUFH);
474-
475- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsadb", v2si_ftype_v8qi_v8qi, ARM_BUILTIN_WSADB);
476- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsadh", v2si_ftype_v4hi_v4hi, ARM_BUILTIN_WSADH);
477- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsadbz", v2si_ftype_v8qi_v8qi, ARM_BUILTIN_WSADBZ);
478- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wsadhz", v2si_ftype_v4hi_v4hi, ARM_BUILTIN_WSADHZ);
479-
480- def_mbuiltin (FL_IWMMXT, "__builtin_arm_textrmsb", int_ftype_v8qi_int, ARM_BUILTIN_TEXTRMSB);
481- def_mbuiltin (FL_IWMMXT, "__builtin_arm_textrmsh", int_ftype_v4hi_int, ARM_BUILTIN_TEXTRMSH);
482- def_mbuiltin (FL_IWMMXT, "__builtin_arm_textrmsw", int_ftype_v2si_int, ARM_BUILTIN_TEXTRMSW);
483- def_mbuiltin (FL_IWMMXT, "__builtin_arm_textrmub", int_ftype_v8qi_int, ARM_BUILTIN_TEXTRMUB);
484- def_mbuiltin (FL_IWMMXT, "__builtin_arm_textrmuh", int_ftype_v4hi_int, ARM_BUILTIN_TEXTRMUH);
485- def_mbuiltin (FL_IWMMXT, "__builtin_arm_textrmuw", int_ftype_v2si_int, ARM_BUILTIN_TEXTRMUW);
486- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tinsrb", v8qi_ftype_v8qi_int_int, ARM_BUILTIN_TINSRB);
487- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tinsrh", v4hi_ftype_v4hi_int_int, ARM_BUILTIN_TINSRH);
488- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tinsrw", v2si_ftype_v2si_int_int, ARM_BUILTIN_TINSRW);
489-
490- def_mbuiltin (FL_IWMMXT, "__builtin_arm_waccb", di_ftype_v8qi, ARM_BUILTIN_WACCB);
491- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wacch", di_ftype_v4hi, ARM_BUILTIN_WACCH);
492- def_mbuiltin (FL_IWMMXT, "__builtin_arm_waccw", di_ftype_v2si, ARM_BUILTIN_WACCW);
493-
494- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmovmskb", int_ftype_v8qi, ARM_BUILTIN_TMOVMSKB);
495- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmovmskh", int_ftype_v4hi, ARM_BUILTIN_TMOVMSKH);
496- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmovmskw", int_ftype_v2si, ARM_BUILTIN_TMOVMSKW);
497-
498- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wpackhss", v8qi_ftype_v4hi_v4hi, ARM_BUILTIN_WPACKHSS);
499- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wpackhus", v8qi_ftype_v4hi_v4hi, ARM_BUILTIN_WPACKHUS);
500- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wpackwus", v4hi_ftype_v2si_v2si, ARM_BUILTIN_WPACKWUS);
501- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wpackwss", v4hi_ftype_v2si_v2si, ARM_BUILTIN_WPACKWSS);
502- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wpackdus", v2si_ftype_di_di, ARM_BUILTIN_WPACKDUS);
503- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wpackdss", v2si_ftype_di_di, ARM_BUILTIN_WPACKDSS);
504-
505- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckehub", v4hi_ftype_v8qi, ARM_BUILTIN_WUNPCKEHUB);
506- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckehuh", v2si_ftype_v4hi, ARM_BUILTIN_WUNPCKEHUH);
507- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckehuw", di_ftype_v2si, ARM_BUILTIN_WUNPCKEHUW);
508- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckehsb", v4hi_ftype_v8qi, ARM_BUILTIN_WUNPCKEHSB);
509- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckehsh", v2si_ftype_v4hi, ARM_BUILTIN_WUNPCKEHSH);
510- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckehsw", di_ftype_v2si, ARM_BUILTIN_WUNPCKEHSW);
511- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckelub", v4hi_ftype_v8qi, ARM_BUILTIN_WUNPCKELUB);
512- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckeluh", v2si_ftype_v4hi, ARM_BUILTIN_WUNPCKELUH);
513- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckeluw", di_ftype_v2si, ARM_BUILTIN_WUNPCKELUW);
514- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckelsb", v4hi_ftype_v8qi, ARM_BUILTIN_WUNPCKELSB);
515- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckelsh", v2si_ftype_v4hi, ARM_BUILTIN_WUNPCKELSH);
516- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wunpckelsw", di_ftype_v2si, ARM_BUILTIN_WUNPCKELSW);
517-
518- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wmacs", di_ftype_di_v4hi_v4hi, ARM_BUILTIN_WMACS);
519- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wmacsz", di_ftype_v4hi_v4hi, ARM_BUILTIN_WMACSZ);
520- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wmacu", di_ftype_di_v4hi_v4hi, ARM_BUILTIN_WMACU);
521- def_mbuiltin (FL_IWMMXT, "__builtin_arm_wmacuz", di_ftype_v4hi_v4hi, ARM_BUILTIN_WMACUZ);
522-
523- def_mbuiltin (FL_IWMMXT, "__builtin_arm_walign", v8qi_ftype_v8qi_v8qi_int, ARM_BUILTIN_WALIGN);
524- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmia", di_ftype_di_int_int, ARM_BUILTIN_TMIA);
525- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmiaph", di_ftype_di_int_int, ARM_BUILTIN_TMIAPH);
526- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmiabb", di_ftype_di_int_int, ARM_BUILTIN_TMIABB);
527- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmiabt", di_ftype_di_int_int, ARM_BUILTIN_TMIABT);
528- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmiatb", di_ftype_di_int_int, ARM_BUILTIN_TMIATB);
529- def_mbuiltin (FL_IWMMXT, "__builtin_arm_tmiatt", di_ftype_di_int_int, ARM_BUILTIN_TMIATT);
530-}
531-
532-static void
533-arm_init_tls_builtins (void)
534-{
535- tree ftype, decl;
536-
537- ftype = build_function_type (ptr_type_node, void_list_node);
538- decl = add_builtin_function ("__builtin_thread_pointer", ftype,
539- ARM_BUILTIN_THREAD_POINTER, BUILT_IN_MD,
540- NULL, NULL_TREE);
541- TREE_NOTHROW (decl) = 1;
542- TREE_READONLY (decl) = 1;
543-}
544-
545-enum neon_builtin_type_bits {
546- T_V8QI = 0x0001,
547- T_V4HI = 0x0002,
548- T_V2SI = 0x0004,
549- T_V2SF = 0x0008,
550- T_DI = 0x0010,
551- T_DREG = 0x001F,
552- T_V16QI = 0x0020,
553- T_V8HI = 0x0040,
554- T_V4SI = 0x0080,
555- T_V4SF = 0x0100,
556- T_V2DI = 0x0200,
557- T_TI = 0x0400,
558- T_QREG = 0x07E0,
559- T_EI = 0x0800,
560- T_OI = 0x1000
561-};
562+typedef enum {
563+ T_V8QI,
564+ T_V4HI,
565+ T_V2SI,
566+ T_V2SF,
567+ T_DI,
568+ T_V16QI,
569+ T_V8HI,
570+ T_V4SI,
571+ T_V4SF,
572+ T_V2DI,
573+ T_TI,
574+ T_EI,
575+ T_OI,
576+ T_MAX /* Size of enum. Keep last. */
577+} neon_builtin_type_mode;
578+
579+#define TYPE_MODE_BIT(X) (1 << (X))
580+
581+#define TB_DREG (TYPE_MODE_BIT (T_V8QI) | TYPE_MODE_BIT (T_V4HI) \
582+ | TYPE_MODE_BIT (T_V2SI) | TYPE_MODE_BIT (T_V2SF) \
583+ | TYPE_MODE_BIT (T_DI))
584+#define TB_QREG (TYPE_MODE_BIT (T_V16QI) | TYPE_MODE_BIT (T_V8HI) \
585+ | TYPE_MODE_BIT (T_V4SI) | TYPE_MODE_BIT (T_V4SF) \
586+ | TYPE_MODE_BIT (T_V2DI) | TYPE_MODE_BIT (T_TI))
587
588 #define v8qi_UP T_V8QI
589 #define v4hi_UP T_V4HI
590@@ -18663,8 +18192,6 @@
591
592 #define UP(X) X##_UP
593
594-#define T_MAX 13
595-
596 typedef enum {
597 NEON_BINOP,
598 NEON_TERNOP,
599@@ -18708,49 +18235,42 @@
600 typedef struct {
601 const char *name;
602 const neon_itype itype;
603- const int bits;
604- const enum insn_code codes[T_MAX];
605- const unsigned int num_vars;
606- unsigned int base_fcode;
607+ const neon_builtin_type_mode mode;
608+ const enum insn_code code;
609+ unsigned int fcode;
610 } neon_builtin_datum;
611
612 #define CF(N,X) CODE_FOR_neon_##N##X
613
614 #define VAR1(T, N, A) \
615- #N, NEON_##T, UP (A), { CF (N, A) }, 1, 0
616+ {#N, NEON_##T, UP (A), CF (N, A), 0}
617 #define VAR2(T, N, A, B) \
618- #N, NEON_##T, UP (A) | UP (B), { CF (N, A), CF (N, B) }, 2, 0
619+ VAR1 (T, N, A), \
620+ {#N, NEON_##T, UP (B), CF (N, B), 0}
621 #define VAR3(T, N, A, B, C) \
622- #N, NEON_##T, UP (A) | UP (B) | UP (C), \
623- { CF (N, A), CF (N, B), CF (N, C) }, 3, 0
624+ VAR2 (T, N, A, B), \
625+ {#N, NEON_##T, UP (C), CF (N, C), 0}
626 #define VAR4(T, N, A, B, C, D) \
627- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D), \
628- { CF (N, A), CF (N, B), CF (N, C), CF (N, D) }, 4, 0
629+ VAR3 (T, N, A, B, C), \
630+ {#N, NEON_##T, UP (D), CF (N, D), 0}
631 #define VAR5(T, N, A, B, C, D, E) \
632- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D) | UP (E), \
633- { CF (N, A), CF (N, B), CF (N, C), CF (N, D), CF (N, E) }, 5, 0
634+ VAR4 (T, N, A, B, C, D), \
635+ {#N, NEON_##T, UP (E), CF (N, E), 0}
636 #define VAR6(T, N, A, B, C, D, E, F) \
637- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D) | UP (E) | UP (F), \
638- { CF (N, A), CF (N, B), CF (N, C), CF (N, D), CF (N, E), CF (N, F) }, 6, 0
639+ VAR5 (T, N, A, B, C, D, E), \
640+ {#N, NEON_##T, UP (F), CF (N, F), 0}
641 #define VAR7(T, N, A, B, C, D, E, F, G) \
642- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D) | UP (E) | UP (F) | UP (G), \
643- { CF (N, A), CF (N, B), CF (N, C), CF (N, D), CF (N, E), CF (N, F), \
644- CF (N, G) }, 7, 0
645+ VAR6 (T, N, A, B, C, D, E, F), \
646+ {#N, NEON_##T, UP (G), CF (N, G), 0}
647 #define VAR8(T, N, A, B, C, D, E, F, G, H) \
648- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D) | UP (E) | UP (F) | UP (G) \
649- | UP (H), \
650- { CF (N, A), CF (N, B), CF (N, C), CF (N, D), CF (N, E), CF (N, F), \
651- CF (N, G), CF (N, H) }, 8, 0
652+ VAR7 (T, N, A, B, C, D, E, F, G), \
653+ {#N, NEON_##T, UP (H), CF (N, H), 0}
654 #define VAR9(T, N, A, B, C, D, E, F, G, H, I) \
655- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D) | UP (E) | UP (F) | UP (G) \
656- | UP (H) | UP (I), \
657- { CF (N, A), CF (N, B), CF (N, C), CF (N, D), CF (N, E), CF (N, F), \
658- CF (N, G), CF (N, H), CF (N, I) }, 9, 0
659+ VAR8 (T, N, A, B, C, D, E, F, G, H), \
660+ {#N, NEON_##T, UP (I), CF (N, I), 0}
661 #define VAR10(T, N, A, B, C, D, E, F, G, H, I, J) \
662- #N, NEON_##T, UP (A) | UP (B) | UP (C) | UP (D) | UP (E) | UP (F) | UP (G) \
663- | UP (H) | UP (I) | UP (J), \
664- { CF (N, A), CF (N, B), CF (N, C), CF (N, D), CF (N, E), CF (N, F), \
665- CF (N, G), CF (N, H), CF (N, I), CF (N, J) }, 10, 0
666+ VAR9 (T, N, A, B, C, D, E, F, G, H, I), \
667+ {#N, NEON_##T, UP (J), CF (N, J), 0}
668
669 /* The mode entries in the following table correspond to the "key" type of the
670 instruction variant, i.e. equivalent to that which would be specified after
671@@ -18758,192 +18278,190 @@
672 (Signed/unsigned/polynomial types are not differentiated between though, and
673 are all mapped onto the same mode for a given element size.) The modes
674 listed per instruction should be the same as those defined for that
675- instruction's pattern in neon.md.
676- WARNING: Variants should be listed in the same increasing order as
677- neon_builtin_type_bits. */
678+ instruction's pattern in neon.md. */
679
680 static neon_builtin_datum neon_builtin_data[] =
681 {
682- { VAR10 (BINOP, vadd,
683- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
684- { VAR3 (BINOP, vaddl, v8qi, v4hi, v2si) },
685- { VAR3 (BINOP, vaddw, v8qi, v4hi, v2si) },
686- { VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
687- { VAR8 (BINOP, vqadd, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
688- { VAR3 (BINOP, vaddhn, v8hi, v4si, v2di) },
689- { VAR8 (BINOP, vmul, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
690- { VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
691- { VAR3 (TERNOP, vmlal, v8qi, v4hi, v2si) },
692- { VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
693- { VAR3 (TERNOP, vmlsl, v8qi, v4hi, v2si) },
694- { VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si) },
695- { VAR2 (TERNOP, vqdmlal, v4hi, v2si) },
696- { VAR2 (TERNOP, vqdmlsl, v4hi, v2si) },
697- { VAR3 (BINOP, vmull, v8qi, v4hi, v2si) },
698- { VAR2 (SCALARMULL, vmull_n, v4hi, v2si) },
699- { VAR2 (LANEMULL, vmull_lane, v4hi, v2si) },
700- { VAR2 (SCALARMULL, vqdmull_n, v4hi, v2si) },
701- { VAR2 (LANEMULL, vqdmull_lane, v4hi, v2si) },
702- { VAR4 (SCALARMULH, vqdmulh_n, v4hi, v2si, v8hi, v4si) },
703- { VAR4 (LANEMULH, vqdmulh_lane, v4hi, v2si, v8hi, v4si) },
704- { VAR2 (BINOP, vqdmull, v4hi, v2si) },
705- { VAR8 (BINOP, vshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
706- { VAR8 (BINOP, vqshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
707- { VAR8 (SHIFTIMM, vshr_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
708- { VAR3 (SHIFTIMM, vshrn_n, v8hi, v4si, v2di) },
709- { VAR3 (SHIFTIMM, vqshrn_n, v8hi, v4si, v2di) },
710- { VAR3 (SHIFTIMM, vqshrun_n, v8hi, v4si, v2di) },
711- { VAR8 (SHIFTIMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
712- { VAR8 (SHIFTIMM, vqshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
713- { VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
714- { VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si) },
715- { VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
716- { VAR10 (BINOP, vsub,
717- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
718- { VAR3 (BINOP, vsubl, v8qi, v4hi, v2si) },
719- { VAR3 (BINOP, vsubw, v8qi, v4hi, v2si) },
720- { VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
721- { VAR6 (BINOP, vhsub, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
722- { VAR3 (BINOP, vsubhn, v8hi, v4si, v2di) },
723- { VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
724- { VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
725- { VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
726- { VAR2 (BINOP, vcage, v2sf, v4sf) },
727- { VAR2 (BINOP, vcagt, v2sf, v4sf) },
728- { VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
729- { VAR8 (BINOP, vabd, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
730- { VAR3 (BINOP, vabdl, v8qi, v4hi, v2si) },
731- { VAR6 (TERNOP, vaba, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
732- { VAR3 (TERNOP, vabal, v8qi, v4hi, v2si) },
733- { VAR8 (BINOP, vmax, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
734- { VAR8 (BINOP, vmin, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
735- { VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf) },
736- { VAR6 (UNOP, vpaddl, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
737- { VAR6 (BINOP, vpadal, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
738- { VAR4 (BINOP, vpmax, v8qi, v4hi, v2si, v2sf) },
739- { VAR4 (BINOP, vpmin, v8qi, v4hi, v2si, v2sf) },
740- { VAR2 (BINOP, vrecps, v2sf, v4sf) },
741- { VAR2 (BINOP, vrsqrts, v2sf, v4sf) },
742- { VAR8 (SHIFTINSERT, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
743- { VAR8 (SHIFTINSERT, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) },
744- { VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
745- { VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
746- { VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
747- { VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
748- { VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
749- { VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
750- { VAR2 (UNOP, vcnt, v8qi, v16qi) },
751- { VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf) },
752- { VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf) },
753- { VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si) },
754+ VAR10 (BINOP, vadd,
755+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
756+ VAR3 (BINOP, vaddl, v8qi, v4hi, v2si),
757+ VAR3 (BINOP, vaddw, v8qi, v4hi, v2si),
758+ VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
759+ VAR8 (BINOP, vqadd, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
760+ VAR3 (BINOP, vaddhn, v8hi, v4si, v2di),
761+ VAR8 (BINOP, vmul, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
762+ VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
763+ VAR3 (TERNOP, vmlal, v8qi, v4hi, v2si),
764+ VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
765+ VAR3 (TERNOP, vmlsl, v8qi, v4hi, v2si),
766+ VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si),
767+ VAR2 (TERNOP, vqdmlal, v4hi, v2si),
768+ VAR2 (TERNOP, vqdmlsl, v4hi, v2si),
769+ VAR3 (BINOP, vmull, v8qi, v4hi, v2si),
770+ VAR2 (SCALARMULL, vmull_n, v4hi, v2si),
771+ VAR2 (LANEMULL, vmull_lane, v4hi, v2si),
772+ VAR2 (SCALARMULL, vqdmull_n, v4hi, v2si),
773+ VAR2 (LANEMULL, vqdmull_lane, v4hi, v2si),
774+ VAR4 (SCALARMULH, vqdmulh_n, v4hi, v2si, v8hi, v4si),
775+ VAR4 (LANEMULH, vqdmulh_lane, v4hi, v2si, v8hi, v4si),
776+ VAR2 (BINOP, vqdmull, v4hi, v2si),
777+ VAR8 (BINOP, vshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
778+ VAR8 (BINOP, vqshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
779+ VAR8 (SHIFTIMM, vshr_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
780+ VAR3 (SHIFTIMM, vshrn_n, v8hi, v4si, v2di),
781+ VAR3 (SHIFTIMM, vqshrn_n, v8hi, v4si, v2di),
782+ VAR3 (SHIFTIMM, vqshrun_n, v8hi, v4si, v2di),
783+ VAR8 (SHIFTIMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
784+ VAR8 (SHIFTIMM, vqshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
785+ VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
786+ VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si),
787+ VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
788+ VAR10 (BINOP, vsub,
789+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
790+ VAR3 (BINOP, vsubl, v8qi, v4hi, v2si),
791+ VAR3 (BINOP, vsubw, v8qi, v4hi, v2si),
792+ VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
793+ VAR6 (BINOP, vhsub, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
794+ VAR3 (BINOP, vsubhn, v8hi, v4si, v2di),
795+ VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
796+ VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
797+ VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
798+ VAR2 (BINOP, vcage, v2sf, v4sf),
799+ VAR2 (BINOP, vcagt, v2sf, v4sf),
800+ VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
801+ VAR8 (BINOP, vabd, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
802+ VAR3 (BINOP, vabdl, v8qi, v4hi, v2si),
803+ VAR6 (TERNOP, vaba, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
804+ VAR3 (TERNOP, vabal, v8qi, v4hi, v2si),
805+ VAR8 (BINOP, vmax, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
806+ VAR8 (BINOP, vmin, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
807+ VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf),
808+ VAR6 (UNOP, vpaddl, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
809+ VAR6 (BINOP, vpadal, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
810+ VAR4 (BINOP, vpmax, v8qi, v4hi, v2si, v2sf),
811+ VAR4 (BINOP, vpmin, v8qi, v4hi, v2si, v2sf),
812+ VAR2 (BINOP, vrecps, v2sf, v4sf),
813+ VAR2 (BINOP, vrsqrts, v2sf, v4sf),
814+ VAR8 (SHIFTINSERT, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
815+ VAR8 (SHIFTINSERT, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
816+ VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
817+ VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
818+ VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
819+ VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
820+ VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
821+ VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
822+ VAR2 (UNOP, vcnt, v8qi, v16qi),
823+ VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf),
824+ VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf),
825+ VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
826 /* FIXME: vget_lane supports more variants than this! */
827- { VAR10 (GETLANE, vget_lane,
828- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
829- { VAR10 (SETLANE, vset_lane,
830- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
831- { VAR5 (CREATE, vcreate, v8qi, v4hi, v2si, v2sf, di) },
832- { VAR10 (DUP, vdup_n,
833- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
834- { VAR10 (DUPLANE, vdup_lane,
835- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
836- { VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di) },
837- { VAR5 (SPLIT, vget_high, v16qi, v8hi, v4si, v4sf, v2di) },
838- { VAR5 (SPLIT, vget_low, v16qi, v8hi, v4si, v4sf, v2di) },
839- { VAR3 (UNOP, vmovn, v8hi, v4si, v2di) },
840- { VAR3 (UNOP, vqmovn, v8hi, v4si, v2di) },
841- { VAR3 (UNOP, vqmovun, v8hi, v4si, v2di) },
842- { VAR3 (UNOP, vmovl, v8qi, v4hi, v2si) },
843- { VAR6 (LANEMUL, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
844- { VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
845- { VAR2 (LANEMAC, vmlal_lane, v4hi, v2si) },
846- { VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si) },
847- { VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
848- { VAR2 (LANEMAC, vmlsl_lane, v4hi, v2si) },
849- { VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si) },
850- { VAR6 (SCALARMUL, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
851- { VAR6 (SCALARMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
852- { VAR2 (SCALARMAC, vmlal_n, v4hi, v2si) },
853- { VAR2 (SCALARMAC, vqdmlal_n, v4hi, v2si) },
854- { VAR6 (SCALARMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
855- { VAR2 (SCALARMAC, vmlsl_n, v4hi, v2si) },
856- { VAR2 (SCALARMAC, vqdmlsl_n, v4hi, v2si) },
857- { VAR10 (BINOP, vext,
858- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
859- { VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
860- { VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi) },
861- { VAR2 (UNOP, vrev16, v8qi, v16qi) },
862- { VAR4 (CONVERT, vcvt, v2si, v2sf, v4si, v4sf) },
863- { VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf) },
864- { VAR10 (SELECT, vbsl,
865- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
866- { VAR1 (VTBL, vtbl1, v8qi) },
867- { VAR1 (VTBL, vtbl2, v8qi) },
868- { VAR1 (VTBL, vtbl3, v8qi) },
869- { VAR1 (VTBL, vtbl4, v8qi) },
870- { VAR1 (VTBX, vtbx1, v8qi) },
871- { VAR1 (VTBX, vtbx2, v8qi) },
872- { VAR1 (VTBX, vtbx3, v8qi) },
873- { VAR1 (VTBX, vtbx4, v8qi) },
874- { VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
875- { VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
876- { VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) },
877- { VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di) },
878- { VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di) },
879- { VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di) },
880- { VAR5 (REINTERP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di) },
881- { VAR5 (REINTERP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di) },
882- { VAR5 (REINTERP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di) },
883- { VAR5 (REINTERP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di) },
884- { VAR5 (REINTERP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di) },
885- { VAR5 (REINTERP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di) },
886- { VAR5 (REINTERP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di) },
887- { VAR10 (LOAD1, vld1,
888- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
889- { VAR10 (LOAD1LANE, vld1_lane,
890- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
891- { VAR10 (LOAD1, vld1_dup,
892- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
893- { VAR10 (STORE1, vst1,
894- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
895- { VAR10 (STORE1LANE, vst1_lane,
896- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
897- { VAR9 (LOADSTRUCT,
898- vld2, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf) },
899- { VAR7 (LOADSTRUCTLANE, vld2_lane,
900- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
901- { VAR5 (LOADSTRUCT, vld2_dup, v8qi, v4hi, v2si, v2sf, di) },
902- { VAR9 (STORESTRUCT, vst2,
903- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf) },
904- { VAR7 (STORESTRUCTLANE, vst2_lane,
905- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
906- { VAR9 (LOADSTRUCT,
907- vld3, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf) },
908- { VAR7 (LOADSTRUCTLANE, vld3_lane,
909- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
910- { VAR5 (LOADSTRUCT, vld3_dup, v8qi, v4hi, v2si, v2sf, di) },
911- { VAR9 (STORESTRUCT, vst3,
912- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf) },
913- { VAR7 (STORESTRUCTLANE, vst3_lane,
914- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
915- { VAR9 (LOADSTRUCT, vld4,
916- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf) },
917- { VAR7 (LOADSTRUCTLANE, vld4_lane,
918- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
919- { VAR5 (LOADSTRUCT, vld4_dup, v8qi, v4hi, v2si, v2sf, di) },
920- { VAR9 (STORESTRUCT, vst4,
921- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf) },
922- { VAR7 (STORESTRUCTLANE, vst4_lane,
923- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf) },
924- { VAR10 (LOGICBINOP, vand,
925- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
926- { VAR10 (LOGICBINOP, vorr,
927- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
928- { VAR10 (BINOP, veor,
929- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
930- { VAR10 (LOGICBINOP, vbic,
931- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) },
932- { VAR10 (LOGICBINOP, vorn,
933- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) }
934+ VAR10 (GETLANE, vget_lane,
935+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
936+ VAR10 (SETLANE, vset_lane,
937+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
938+ VAR5 (CREATE, vcreate, v8qi, v4hi, v2si, v2sf, di),
939+ VAR10 (DUP, vdup_n,
940+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
941+ VAR10 (DUPLANE, vdup_lane,
942+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
943+ VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di),
944+ VAR5 (SPLIT, vget_high, v16qi, v8hi, v4si, v4sf, v2di),
945+ VAR5 (SPLIT, vget_low, v16qi, v8hi, v4si, v4sf, v2di),
946+ VAR3 (UNOP, vmovn, v8hi, v4si, v2di),
947+ VAR3 (UNOP, vqmovn, v8hi, v4si, v2di),
948+ VAR3 (UNOP, vqmovun, v8hi, v4si, v2di),
949+ VAR3 (UNOP, vmovl, v8qi, v4hi, v2si),
950+ VAR6 (LANEMUL, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
951+ VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
952+ VAR2 (LANEMAC, vmlal_lane, v4hi, v2si),
953+ VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si),
954+ VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
955+ VAR2 (LANEMAC, vmlsl_lane, v4hi, v2si),
956+ VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si),
957+ VAR6 (SCALARMUL, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
958+ VAR6 (SCALARMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
959+ VAR2 (SCALARMAC, vmlal_n, v4hi, v2si),
960+ VAR2 (SCALARMAC, vqdmlal_n, v4hi, v2si),
961+ VAR6 (SCALARMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
962+ VAR2 (SCALARMAC, vmlsl_n, v4hi, v2si),
963+ VAR2 (SCALARMAC, vqdmlsl_n, v4hi, v2si),
964+ VAR10 (BINOP, vext,
965+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
966+ VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
967+ VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi),
968+ VAR2 (UNOP, vrev16, v8qi, v16qi),
969+ VAR4 (CONVERT, vcvt, v2si, v2sf, v4si, v4sf),
970+ VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf),
971+ VAR10 (SELECT, vbsl,
972+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
973+ VAR1 (VTBL, vtbl1, v8qi),
974+ VAR1 (VTBL, vtbl2, v8qi),
975+ VAR1 (VTBL, vtbl3, v8qi),
976+ VAR1 (VTBL, vtbl4, v8qi),
977+ VAR1 (VTBX, vtbx1, v8qi),
978+ VAR1 (VTBX, vtbx2, v8qi),
979+ VAR1 (VTBX, vtbx3, v8qi),
980+ VAR1 (VTBX, vtbx4, v8qi),
981+ VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
982+ VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
983+ VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
984+ VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di),
985+ VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di),
986+ VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di),
987+ VAR5 (REINTERP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di),
988+ VAR5 (REINTERP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di),
989+ VAR5 (REINTERP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di),
990+ VAR5 (REINTERP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di),
991+ VAR5 (REINTERP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di),
992+ VAR5 (REINTERP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di),
993+ VAR5 (REINTERP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di),
994+ VAR10 (LOAD1, vld1,
995+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
996+ VAR10 (LOAD1LANE, vld1_lane,
997+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
998+ VAR10 (LOAD1, vld1_dup,
999+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1000+ VAR10 (STORE1, vst1,
1001+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1002+ VAR10 (STORE1LANE, vst1_lane,
1003+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1004+ VAR9 (LOADSTRUCT,
1005+ vld2, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
1006+ VAR7 (LOADSTRUCTLANE, vld2_lane,
1007+ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
1008+ VAR5 (LOADSTRUCT, vld2_dup, v8qi, v4hi, v2si, v2sf, di),
1009+ VAR9 (STORESTRUCT, vst2,
1010+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
1011+ VAR7 (STORESTRUCTLANE, vst2_lane,
1012+ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
1013+ VAR9 (LOADSTRUCT,
1014+ vld3, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
1015+ VAR7 (LOADSTRUCTLANE, vld3_lane,
1016+ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
1017+ VAR5 (LOADSTRUCT, vld3_dup, v8qi, v4hi, v2si, v2sf, di),
1018+ VAR9 (STORESTRUCT, vst3,
1019+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
1020+ VAR7 (STORESTRUCTLANE, vst3_lane,
1021+ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
1022+ VAR9 (LOADSTRUCT, vld4,
1023+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
1024+ VAR7 (LOADSTRUCTLANE, vld4_lane,
1025+ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
1026+ VAR5 (LOADSTRUCT, vld4_dup, v8qi, v4hi, v2si, v2sf, di),
1027+ VAR9 (STORESTRUCT, vst4,
1028+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
1029+ VAR7 (STORESTRUCTLANE, vst4_lane,
1030+ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
1031+ VAR10 (LOGICBINOP, vand,
1032+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1033+ VAR10 (LOGICBINOP, vorr,
1034+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1035+ VAR10 (BINOP, veor,
1036+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1037+ VAR10 (LOGICBINOP, vbic,
1038+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
1039+ VAR10 (LOGICBINOP, vorn,
1040+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
1041 };
1042
1043 #undef CF
1044@@ -18958,10 +18476,185 @@
1045 #undef VAR9
1046 #undef VAR10
1047
1048+/* Neon defines builtins from ARM_BUILTIN_MAX upwards, though they don't have
1049+ symbolic names defined here (which would require too much duplication).
1050+ FIXME? */
1051+enum arm_builtins
1052+{
1053+ ARM_BUILTIN_GETWCX,
1054+ ARM_BUILTIN_SETWCX,
1055+
1056+ ARM_BUILTIN_WZERO,
1057+
1058+ ARM_BUILTIN_WAVG2BR,
1059+ ARM_BUILTIN_WAVG2HR,
1060+ ARM_BUILTIN_WAVG2B,
1061+ ARM_BUILTIN_WAVG2H,
1062+
1063+ ARM_BUILTIN_WACCB,
1064+ ARM_BUILTIN_WACCH,
1065+ ARM_BUILTIN_WACCW,
1066+
1067+ ARM_BUILTIN_WMACS,
1068+ ARM_BUILTIN_WMACSZ,
1069+ ARM_BUILTIN_WMACU,
1070+ ARM_BUILTIN_WMACUZ,
1071+
1072+ ARM_BUILTIN_WSADB,
1073+ ARM_BUILTIN_WSADBZ,
1074+ ARM_BUILTIN_WSADH,
1075+ ARM_BUILTIN_WSADHZ,
1076+
1077+ ARM_BUILTIN_WALIGN,
1078+
1079+ ARM_BUILTIN_TMIA,
1080+ ARM_BUILTIN_TMIAPH,
1081+ ARM_BUILTIN_TMIABB,
1082+ ARM_BUILTIN_TMIABT,
1083+ ARM_BUILTIN_TMIATB,
1084+ ARM_BUILTIN_TMIATT,
1085+
1086+ ARM_BUILTIN_TMOVMSKB,
1087+ ARM_BUILTIN_TMOVMSKH,
1088+ ARM_BUILTIN_TMOVMSKW,
1089+
1090+ ARM_BUILTIN_TBCSTB,
1091+ ARM_BUILTIN_TBCSTH,
1092+ ARM_BUILTIN_TBCSTW,
1093+
1094+ ARM_BUILTIN_WMADDS,
1095+ ARM_BUILTIN_WMADDU,
1096+
1097+ ARM_BUILTIN_WPACKHSS,
1098+ ARM_BUILTIN_WPACKWSS,
1099+ ARM_BUILTIN_WPACKDSS,
1100+ ARM_BUILTIN_WPACKHUS,
1101+ ARM_BUILTIN_WPACKWUS,
1102+ ARM_BUILTIN_WPACKDUS,
1103+
1104+ ARM_BUILTIN_WADDB,
1105+ ARM_BUILTIN_WADDH,
1106+ ARM_BUILTIN_WADDW,
1107+ ARM_BUILTIN_WADDSSB,
1108+ ARM_BUILTIN_WADDSSH,
1109+ ARM_BUILTIN_WADDSSW,
1110+ ARM_BUILTIN_WADDUSB,
1111+ ARM_BUILTIN_WADDUSH,
1112+ ARM_BUILTIN_WADDUSW,
1113+ ARM_BUILTIN_WSUBB,
1114+ ARM_BUILTIN_WSUBH,
1115+ ARM_BUILTIN_WSUBW,
1116+ ARM_BUILTIN_WSUBSSB,
1117+ ARM_BUILTIN_WSUBSSH,
1118+ ARM_BUILTIN_WSUBSSW,
1119+ ARM_BUILTIN_WSUBUSB,
1120+ ARM_BUILTIN_WSUBUSH,
1121+ ARM_BUILTIN_WSUBUSW,
1122+
1123+ ARM_BUILTIN_WAND,
1124+ ARM_BUILTIN_WANDN,
1125+ ARM_BUILTIN_WOR,
1126+ ARM_BUILTIN_WXOR,
1127+
1128+ ARM_BUILTIN_WCMPEQB,
1129+ ARM_BUILTIN_WCMPEQH,
1130+ ARM_BUILTIN_WCMPEQW,
1131+ ARM_BUILTIN_WCMPGTUB,
1132+ ARM_BUILTIN_WCMPGTUH,
1133+ ARM_BUILTIN_WCMPGTUW,
1134+ ARM_BUILTIN_WCMPGTSB,
1135+ ARM_BUILTIN_WCMPGTSH,
1136+ ARM_BUILTIN_WCMPGTSW,
1137+
1138+ ARM_BUILTIN_TEXTRMSB,
1139+ ARM_BUILTIN_TEXTRMSH,
1140+ ARM_BUILTIN_TEXTRMSW,
1141+ ARM_BUILTIN_TEXTRMUB,
1142+ ARM_BUILTIN_TEXTRMUH,
1143+ ARM_BUILTIN_TEXTRMUW,
1144+ ARM_BUILTIN_TINSRB,
1145+ ARM_BUILTIN_TINSRH,
1146+ ARM_BUILTIN_TINSRW,
1147+
1148+ ARM_BUILTIN_WMAXSW,
1149+ ARM_BUILTIN_WMAXSH,
1150+ ARM_BUILTIN_WMAXSB,
1151+ ARM_BUILTIN_WMAXUW,
1152+ ARM_BUILTIN_WMAXUH,
1153+ ARM_BUILTIN_WMAXUB,
1154+ ARM_BUILTIN_WMINSW,
1155+ ARM_BUILTIN_WMINSH,
1156+ ARM_BUILTIN_WMINSB,
1157+ ARM_BUILTIN_WMINUW,
1158+ ARM_BUILTIN_WMINUH,
1159+ ARM_BUILTIN_WMINUB,
1160+
1161+ ARM_BUILTIN_WMULUM,
1162+ ARM_BUILTIN_WMULSM,
1163+ ARM_BUILTIN_WMULUL,
1164+
1165+ ARM_BUILTIN_PSADBH,
1166+ ARM_BUILTIN_WSHUFH,
1167+
1168+ ARM_BUILTIN_WSLLH,
1169+ ARM_BUILTIN_WSLLW,
1170+ ARM_BUILTIN_WSLLD,
1171+ ARM_BUILTIN_WSRAH,
1172+ ARM_BUILTIN_WSRAW,
1173+ ARM_BUILTIN_WSRAD,
1174+ ARM_BUILTIN_WSRLH,
1175+ ARM_BUILTIN_WSRLW,
1176+ ARM_BUILTIN_WSRLD,
1177+ ARM_BUILTIN_WRORH,
1178+ ARM_BUILTIN_WRORW,
1179+ ARM_BUILTIN_WRORD,
1180+ ARM_BUILTIN_WSLLHI,
1181+ ARM_BUILTIN_WSLLWI,
1182+ ARM_BUILTIN_WSLLDI,
1183+ ARM_BUILTIN_WSRAHI,
1184+ ARM_BUILTIN_WSRAWI,
1185+ ARM_BUILTIN_WSRADI,
1186+ ARM_BUILTIN_WSRLHI,
1187+ ARM_BUILTIN_WSRLWI,
1188+ ARM_BUILTIN_WSRLDI,
1189+ ARM_BUILTIN_WRORHI,
1190+ ARM_BUILTIN_WRORWI,
1191+ ARM_BUILTIN_WRORDI,
1192+
1193+ ARM_BUILTIN_WUNPCKIHB,
1194+ ARM_BUILTIN_WUNPCKIHH,
1195+ ARM_BUILTIN_WUNPCKIHW,
1196+ ARM_BUILTIN_WUNPCKILB,
1197+ ARM_BUILTIN_WUNPCKILH,
1198+ ARM_BUILTIN_WUNPCKILW,
1199+
1200+ ARM_BUILTIN_WUNPCKEHSB,
1201+ ARM_BUILTIN_WUNPCKEHSH,
1202+ ARM_BUILTIN_WUNPCKEHSW,
1203+ ARM_BUILTIN_WUNPCKEHUB,
1204+ ARM_BUILTIN_WUNPCKEHUH,
1205+ ARM_BUILTIN_WUNPCKEHUW,
1206+ ARM_BUILTIN_WUNPCKELSB,
1207+ ARM_BUILTIN_WUNPCKELSH,
1208+ ARM_BUILTIN_WUNPCKELSW,
1209+ ARM_BUILTIN_WUNPCKELUB,
1210+ ARM_BUILTIN_WUNPCKELUH,
1211+ ARM_BUILTIN_WUNPCKELUW,
1212+
1213+ ARM_BUILTIN_THREAD_POINTER,
1214+
1215+ ARM_BUILTIN_NEON_BASE,
1216+
1217+ ARM_BUILTIN_MAX = ARM_BUILTIN_NEON_BASE + ARRAY_SIZE (neon_builtin_data)
1218+};
1219+
1220+static GTY(()) tree arm_builtin_decls[ARM_BUILTIN_MAX];
1221+
1222 static void
1223 arm_init_neon_builtins (void)
1224 {
1225- unsigned int i, fcode = ARM_BUILTIN_NEON_BASE;
1226+ unsigned int i, fcode;
1227+ tree decl;
1228
1229 tree neon_intQI_type_node;
1230 tree neon_intHI_type_node;
1231@@ -19209,250 +18902,740 @@
1232 }
1233 }
1234
1235- for (i = 0; i < ARRAY_SIZE (neon_builtin_data); i++)
1236+ for (i = 0, fcode = ARM_BUILTIN_NEON_BASE;
1237+ i < ARRAY_SIZE (neon_builtin_data);
1238+ i++, fcode++)
1239 {
1240 neon_builtin_datum *d = &neon_builtin_data[i];
1241- unsigned int j, codeidx = 0;
1242-
1243- d->base_fcode = fcode;
1244-
1245- for (j = 0; j < T_MAX; j++)
1246- {
1247- const char* const modenames[] = {
1248- "v8qi", "v4hi", "v2si", "v2sf", "di",
1249- "v16qi", "v8hi", "v4si", "v4sf", "v2di"
1250- };
1251- char namebuf[60];
1252- tree ftype = NULL;
1253- enum insn_code icode;
1254- int is_load = 0, is_store = 0;
1255-
1256- if ((d->bits & (1 << j)) == 0)
1257- continue;
1258-
1259- icode = d->codes[codeidx++];
1260-
1261- switch (d->itype)
1262- {
1263- case NEON_LOAD1:
1264- case NEON_LOAD1LANE:
1265- case NEON_LOADSTRUCT:
1266- case NEON_LOADSTRUCTLANE:
1267- is_load = 1;
1268- /* Fall through. */
1269- case NEON_STORE1:
1270- case NEON_STORE1LANE:
1271- case NEON_STORESTRUCT:
1272- case NEON_STORESTRUCTLANE:
1273- if (!is_load)
1274- is_store = 1;
1275- /* Fall through. */
1276- case NEON_UNOP:
1277- case NEON_BINOP:
1278- case NEON_LOGICBINOP:
1279- case NEON_SHIFTINSERT:
1280- case NEON_TERNOP:
1281- case NEON_GETLANE:
1282- case NEON_SETLANE:
1283- case NEON_CREATE:
1284- case NEON_DUP:
1285- case NEON_DUPLANE:
1286- case NEON_SHIFTIMM:
1287- case NEON_SHIFTACC:
1288- case NEON_COMBINE:
1289- case NEON_SPLIT:
1290- case NEON_CONVERT:
1291- case NEON_FIXCONV:
1292- case NEON_LANEMUL:
1293- case NEON_LANEMULL:
1294- case NEON_LANEMULH:
1295- case NEON_LANEMAC:
1296- case NEON_SCALARMUL:
1297- case NEON_SCALARMULL:
1298- case NEON_SCALARMULH:
1299- case NEON_SCALARMAC:
1300- case NEON_SELECT:
1301- case NEON_VTBL:
1302- case NEON_VTBX:
1303- {
1304- int k;
1305- tree return_type = void_type_node, args = void_list_node;
1306-
1307- /* Build a function type directly from the insn_data for this
1308- builtin. The build_function_type() function takes care of
1309- removing duplicates for us. */
1310- for (k = insn_data[icode].n_operands - 1; k >= 0; k--)
1311- {
1312- tree eltype;
1313-
1314- if (is_load && k == 1)
1315- {
1316- /* Neon load patterns always have the memory operand
1317- in the operand 1 position. */
1318- gcc_assert (insn_data[icode].operand[k].predicate
1319- == neon_struct_operand);
1320-
1321- switch (1 << j)
1322- {
1323- case T_V8QI:
1324- case T_V16QI:
1325- eltype = const_intQI_pointer_node;
1326- break;
1327-
1328- case T_V4HI:
1329- case T_V8HI:
1330- eltype = const_intHI_pointer_node;
1331- break;
1332-
1333- case T_V2SI:
1334- case T_V4SI:
1335- eltype = const_intSI_pointer_node;
1336- break;
1337-
1338- case T_V2SF:
1339- case T_V4SF:
1340- eltype = const_float_pointer_node;
1341- break;
1342-
1343- case T_DI:
1344- case T_V2DI:
1345- eltype = const_intDI_pointer_node;
1346- break;
1347-
1348- default: gcc_unreachable ();
1349- }
1350- }
1351- else if (is_store && k == 0)
1352- {
1353- /* Similarly, Neon store patterns use operand 0 as
1354- the memory location to store to. */
1355- gcc_assert (insn_data[icode].operand[k].predicate
1356- == neon_struct_operand);
1357-
1358- switch (1 << j)
1359- {
1360- case T_V8QI:
1361- case T_V16QI:
1362- eltype = intQI_pointer_node;
1363- break;
1364-
1365- case T_V4HI:
1366- case T_V8HI:
1367- eltype = intHI_pointer_node;
1368- break;
1369-
1370- case T_V2SI:
1371- case T_V4SI:
1372- eltype = intSI_pointer_node;
1373- break;
1374-
1375- case T_V2SF:
1376- case T_V4SF:
1377- eltype = float_pointer_node;
1378- break;
1379-
1380- case T_DI:
1381- case T_V2DI:
1382- eltype = intDI_pointer_node;
1383- break;
1384-
1385- default: gcc_unreachable ();
1386- }
1387- }
1388- else
1389- {
1390- switch (insn_data[icode].operand[k].mode)
1391- {
1392- case VOIDmode: eltype = void_type_node; break;
1393- /* Scalars. */
1394- case QImode: eltype = neon_intQI_type_node; break;
1395- case HImode: eltype = neon_intHI_type_node; break;
1396- case SImode: eltype = neon_intSI_type_node; break;
1397- case SFmode: eltype = neon_float_type_node; break;
1398- case DImode: eltype = neon_intDI_type_node; break;
1399- case TImode: eltype = intTI_type_node; break;
1400- case EImode: eltype = intEI_type_node; break;
1401- case OImode: eltype = intOI_type_node; break;
1402- case CImode: eltype = intCI_type_node; break;
1403- case XImode: eltype = intXI_type_node; break;
1404- /* 64-bit vectors. */
1405- case V8QImode: eltype = V8QI_type_node; break;
1406- case V4HImode: eltype = V4HI_type_node; break;
1407- case V2SImode: eltype = V2SI_type_node; break;
1408- case V2SFmode: eltype = V2SF_type_node; break;
1409- /* 128-bit vectors. */
1410- case V16QImode: eltype = V16QI_type_node; break;
1411- case V8HImode: eltype = V8HI_type_node; break;
1412- case V4SImode: eltype = V4SI_type_node; break;
1413- case V4SFmode: eltype = V4SF_type_node; break;
1414- case V2DImode: eltype = V2DI_type_node; break;
1415- default: gcc_unreachable ();
1416- }
1417- }
1418-
1419- if (k == 0 && !is_store)
1420- return_type = eltype;
1421- else
1422- args = tree_cons (NULL_TREE, eltype, args);
1423- }
1424-
1425- ftype = build_function_type (return_type, args);
1426- }
1427- break;
1428-
1429- case NEON_RESULTPAIR:
1430- {
1431- switch (insn_data[icode].operand[1].mode)
1432- {
1433- case V8QImode: ftype = void_ftype_pv8qi_v8qi_v8qi; break;
1434- case V4HImode: ftype = void_ftype_pv4hi_v4hi_v4hi; break;
1435- case V2SImode: ftype = void_ftype_pv2si_v2si_v2si; break;
1436- case V2SFmode: ftype = void_ftype_pv2sf_v2sf_v2sf; break;
1437- case DImode: ftype = void_ftype_pdi_di_di; break;
1438- case V16QImode: ftype = void_ftype_pv16qi_v16qi_v16qi; break;
1439- case V8HImode: ftype = void_ftype_pv8hi_v8hi_v8hi; break;
1440- case V4SImode: ftype = void_ftype_pv4si_v4si_v4si; break;
1441- case V4SFmode: ftype = void_ftype_pv4sf_v4sf_v4sf; break;
1442- case V2DImode: ftype = void_ftype_pv2di_v2di_v2di; break;
1443- default: gcc_unreachable ();
1444- }
1445- }
1446- break;
1447-
1448- case NEON_REINTERP:
1449- {
1450- /* We iterate over 5 doubleword types, then 5 quadword
1451- types. */
1452- int rhs = j % 5;
1453- switch (insn_data[icode].operand[0].mode)
1454- {
1455- case V8QImode: ftype = reinterp_ftype_dreg[0][rhs]; break;
1456- case V4HImode: ftype = reinterp_ftype_dreg[1][rhs]; break;
1457- case V2SImode: ftype = reinterp_ftype_dreg[2][rhs]; break;
1458- case V2SFmode: ftype = reinterp_ftype_dreg[3][rhs]; break;
1459- case DImode: ftype = reinterp_ftype_dreg[4][rhs]; break;
1460- case V16QImode: ftype = reinterp_ftype_qreg[0][rhs]; break;
1461- case V8HImode: ftype = reinterp_ftype_qreg[1][rhs]; break;
1462- case V4SImode: ftype = reinterp_ftype_qreg[2][rhs]; break;
1463- case V4SFmode: ftype = reinterp_ftype_qreg[3][rhs]; break;
1464- case V2DImode: ftype = reinterp_ftype_qreg[4][rhs]; break;
1465- default: gcc_unreachable ();
1466- }
1467- }
1468- break;
1469-
1470- default:
1471- gcc_unreachable ();
1472- }
1473-
1474- gcc_assert (ftype != NULL);
1475-
1476- sprintf (namebuf, "__builtin_neon_%s%s", d->name, modenames[j]);
1477-
1478- add_builtin_function (namebuf, ftype, fcode++, BUILT_IN_MD, NULL,
1479- NULL_TREE);
1480- }
1481- }
1482+
1483+ const char* const modenames[] = {
1484+ "v8qi", "v4hi", "v2si", "v2sf", "di",
1485+ "v16qi", "v8hi", "v4si", "v4sf", "v2di",
1486+ "ti", "ei", "oi"
1487+ };
1488+ char namebuf[60];
1489+ tree ftype = NULL;
1490+ int is_load = 0, is_store = 0;
1491+
1492+ gcc_assert (ARRAY_SIZE (modenames) == T_MAX);
1493+
1494+ d->fcode = fcode;
1495+
1496+ switch (d->itype)
1497+ {
1498+ case NEON_LOAD1:
1499+ case NEON_LOAD1LANE:
1500+ case NEON_LOADSTRUCT:
1501+ case NEON_LOADSTRUCTLANE:
1502+ is_load = 1;
1503+ /* Fall through. */
1504+ case NEON_STORE1:
1505+ case NEON_STORE1LANE:
1506+ case NEON_STORESTRUCT:
1507+ case NEON_STORESTRUCTLANE:
1508+ if (!is_load)
1509+ is_store = 1;
1510+ /* Fall through. */
1511+ case NEON_UNOP:
1512+ case NEON_BINOP:
1513+ case NEON_LOGICBINOP:
1514+ case NEON_SHIFTINSERT:
1515+ case NEON_TERNOP:
1516+ case NEON_GETLANE:
1517+ case NEON_SETLANE:
1518+ case NEON_CREATE:
1519+ case NEON_DUP:
1520+ case NEON_DUPLANE:
1521+ case NEON_SHIFTIMM:
1522+ case NEON_SHIFTACC:
1523+ case NEON_COMBINE:
1524+ case NEON_SPLIT:
1525+ case NEON_CONVERT:
1526+ case NEON_FIXCONV:
1527+ case NEON_LANEMUL:
1528+ case NEON_LANEMULL:
1529+ case NEON_LANEMULH:
1530+ case NEON_LANEMAC:
1531+ case NEON_SCALARMUL:
1532+ case NEON_SCALARMULL:
1533+ case NEON_SCALARMULH:
1534+ case NEON_SCALARMAC:
1535+ case NEON_SELECT:
1536+ case NEON_VTBL:
1537+ case NEON_VTBX:
1538+ {
1539+ int k;
1540+ tree return_type = void_type_node, args = void_list_node;
1541+
1542+ /* Build a function type directly from the insn_data for
1543+ this builtin. The build_function_type() function takes
1544+ care of removing duplicates for us. */
1545+ for (k = insn_data[d->code].n_operands - 1; k >= 0; k--)
1546+ {
1547+ tree eltype;
1548+
1549+ if (is_load && k == 1)
1550+ {
1551+ /* Neon load patterns always have the memory
1552+ operand in the operand 1 position. */
1553+ gcc_assert (insn_data[d->code].operand[k].predicate
1554+ == neon_struct_operand);
1555+
1556+ switch (d->mode)
1557+ {
1558+ case T_V8QI:
1559+ case T_V16QI:
1560+ eltype = const_intQI_pointer_node;
1561+ break;
1562+
1563+ case T_V4HI:
1564+ case T_V8HI:
1565+ eltype = const_intHI_pointer_node;
1566+ break;
1567+
1568+ case T_V2SI:
1569+ case T_V4SI:
1570+ eltype = const_intSI_pointer_node;
1571+ break;
1572+
1573+ case T_V2SF:
1574+ case T_V4SF:
1575+ eltype = const_float_pointer_node;
1576+ break;
1577+
1578+ case T_DI:
1579+ case T_V2DI:
1580+ eltype = const_intDI_pointer_node;
1581+ break;
1582+
1583+ default: gcc_unreachable ();
1584+ }
1585+ }
1586+ else if (is_store && k == 0)
1587+ {
1588+ /* Similarly, Neon store patterns use operand 0 as
1589+ the memory location to store to. */
1590+ gcc_assert (insn_data[d->code].operand[k].predicate
1591+ == neon_struct_operand);
1592+
1593+ switch (d->mode)
1594+ {
1595+ case T_V8QI:
1596+ case T_V16QI:
1597+ eltype = intQI_pointer_node;
1598+ break;
1599+
1600+ case T_V4HI:
1601+ case T_V8HI:
1602+ eltype = intHI_pointer_node;
1603+ break;
1604+
1605+ case T_V2SI:
1606+ case T_V4SI:
1607+ eltype = intSI_pointer_node;
1608+ break;
1609+
1610+ case T_V2SF:
1611+ case T_V4SF:
1612+ eltype = float_pointer_node;
1613+ break;
1614+
1615+ case T_DI:
1616+ case T_V2DI:
1617+ eltype = intDI_pointer_node;
1618+ break;
1619+
1620+ default: gcc_unreachable ();
1621+ }
1622+ }
1623+ else
1624+ {
1625+ switch (insn_data[d->code].operand[k].mode)
1626+ {
1627+ case VOIDmode: eltype = void_type_node; break;
1628+ /* Scalars. */
1629+ case QImode: eltype = neon_intQI_type_node; break;
1630+ case HImode: eltype = neon_intHI_type_node; break;
1631+ case SImode: eltype = neon_intSI_type_node; break;
1632+ case SFmode: eltype = neon_float_type_node; break;
1633+ case DImode: eltype = neon_intDI_type_node; break;
1634+ case TImode: eltype = intTI_type_node; break;
1635+ case EImode: eltype = intEI_type_node; break;
1636+ case OImode: eltype = intOI_type_node; break;
1637+ case CImode: eltype = intCI_type_node; break;
1638+ case XImode: eltype = intXI_type_node; break;
1639+ /* 64-bit vectors. */
1640+ case V8QImode: eltype = V8QI_type_node; break;
1641+ case V4HImode: eltype = V4HI_type_node; break;
1642+ case V2SImode: eltype = V2SI_type_node; break;
1643+ case V2SFmode: eltype = V2SF_type_node; break;
1644+ /* 128-bit vectors. */
1645+ case V16QImode: eltype = V16QI_type_node; break;
1646+ case V8HImode: eltype = V8HI_type_node; break;
1647+ case V4SImode: eltype = V4SI_type_node; break;
1648+ case V4SFmode: eltype = V4SF_type_node; break;
1649+ case V2DImode: eltype = V2DI_type_node; break;
1650+ default: gcc_unreachable ();
1651+ }
1652+ }
1653+
1654+ if (k == 0 && !is_store)
1655+ return_type = eltype;
1656+ else
1657+ args = tree_cons (NULL_TREE, eltype, args);
1658+ }
1659+
1660+ ftype = build_function_type (return_type, args);
1661+ }
1662+ break;
1663+
1664+ case NEON_RESULTPAIR:
1665+ {
1666+ switch (insn_data[d->code].operand[1].mode)
1667+ {
1668+ case V8QImode: ftype = void_ftype_pv8qi_v8qi_v8qi; break;
1669+ case V4HImode: ftype = void_ftype_pv4hi_v4hi_v4hi; break;
1670+ case V2SImode: ftype = void_ftype_pv2si_v2si_v2si; break;
1671+ case V2SFmode: ftype = void_ftype_pv2sf_v2sf_v2sf; break;
1672+ case DImode: ftype = void_ftype_pdi_di_di; break;
1673+ case V16QImode: ftype = void_ftype_pv16qi_v16qi_v16qi; break;
1674+ case V8HImode: ftype = void_ftype_pv8hi_v8hi_v8hi; break;
1675+ case V4SImode: ftype = void_ftype_pv4si_v4si_v4si; break;
1676+ case V4SFmode: ftype = void_ftype_pv4sf_v4sf_v4sf; break;
1677+ case V2DImode: ftype = void_ftype_pv2di_v2di_v2di; break;
1678+ default: gcc_unreachable ();
1679+ }
1680+ }
1681+ break;
1682+
1683+ case NEON_REINTERP:
1684+ {
1685+ /* We iterate over 5 doubleword types, then 5 quadword
1686+ types. */
1687+ int rhs = d->mode % 5;
1688+ switch (insn_data[d->code].operand[0].mode)
1689+ {
1690+ case V8QImode: ftype = reinterp_ftype_dreg[0][rhs]; break;
1691+ case V4HImode: ftype = reinterp_ftype_dreg[1][rhs]; break;
1692+ case V2SImode: ftype = reinterp_ftype_dreg[2][rhs]; break;
1693+ case V2SFmode: ftype = reinterp_ftype_dreg[3][rhs]; break;
1694+ case DImode: ftype = reinterp_ftype_dreg[4][rhs]; break;
1695+ case V16QImode: ftype = reinterp_ftype_qreg[0][rhs]; break;
1696+ case V8HImode: ftype = reinterp_ftype_qreg[1][rhs]; break;
1697+ case V4SImode: ftype = reinterp_ftype_qreg[2][rhs]; break;
1698+ case V4SFmode: ftype = reinterp_ftype_qreg[3][rhs]; break;
1699+ case V2DImode: ftype = reinterp_ftype_qreg[4][rhs]; break;
1700+ default: gcc_unreachable ();
1701+ }
1702+ }
1703+ break;
1704+
1705+ default:
1706+ gcc_unreachable ();
1707+ }
1708+
1709+ gcc_assert (ftype != NULL);
1710+
1711+ sprintf (namebuf, "__builtin_neon_%s%s", d->name, modenames[d->mode]);
1712+
1713+ decl = add_builtin_function (namebuf, ftype, fcode, BUILT_IN_MD, NULL,
1714+ NULL_TREE);
1715+ arm_builtin_decls[fcode] = decl;
1716+ }
1717+}
1718+
1719+#define def_mbuiltin(MASK, NAME, TYPE, CODE) \
1720+ do \
1721+ { \
1722+ if ((MASK) & insn_flags) \
1723+ { \
1724+ tree bdecl; \
1725+ bdecl = add_builtin_function ((NAME), (TYPE), (CODE), \
1726+ BUILT_IN_MD, NULL, NULL_TREE); \
1727+ arm_builtin_decls[CODE] = bdecl; \
1728+ } \
1729+ } \
1730+ while (0)
1731+
1732+struct builtin_description
1733+{
1734+ const unsigned int mask;
1735+ const enum insn_code icode;
1736+ const char * const name;
1737+ const enum arm_builtins code;
1738+ const enum rtx_code comparison;
1739+ const unsigned int flag;
1740+};
1741+
1742+static const struct builtin_description bdesc_2arg[] =
1743+{
1744+#define IWMMXT_BUILTIN(code, string, builtin) \
1745+ { FL_IWMMXT, CODE_FOR_##code, "__builtin_arm_" string, \
1746+ ARM_BUILTIN_##builtin, UNKNOWN, 0 },
1747+
1748+ IWMMXT_BUILTIN (addv8qi3, "waddb", WADDB)
1749+ IWMMXT_BUILTIN (addv4hi3, "waddh", WADDH)
1750+ IWMMXT_BUILTIN (addv2si3, "waddw", WADDW)
1751+ IWMMXT_BUILTIN (subv8qi3, "wsubb", WSUBB)
1752+ IWMMXT_BUILTIN (subv4hi3, "wsubh", WSUBH)
1753+ IWMMXT_BUILTIN (subv2si3, "wsubw", WSUBW)
1754+ IWMMXT_BUILTIN (ssaddv8qi3, "waddbss", WADDSSB)
1755+ IWMMXT_BUILTIN (ssaddv4hi3, "waddhss", WADDSSH)
1756+ IWMMXT_BUILTIN (ssaddv2si3, "waddwss", WADDSSW)
1757+ IWMMXT_BUILTIN (sssubv8qi3, "wsubbss", WSUBSSB)
1758+ IWMMXT_BUILTIN (sssubv4hi3, "wsubhss", WSUBSSH)
1759+ IWMMXT_BUILTIN (sssubv2si3, "wsubwss", WSUBSSW)
1760+ IWMMXT_BUILTIN (usaddv8qi3, "waddbus", WADDUSB)
1761+ IWMMXT_BUILTIN (usaddv4hi3, "waddhus", WADDUSH)
1762+ IWMMXT_BUILTIN (usaddv2si3, "waddwus", WADDUSW)
1763+ IWMMXT_BUILTIN (ussubv8qi3, "wsubbus", WSUBUSB)
1764+ IWMMXT_BUILTIN (ussubv4hi3, "wsubhus", WSUBUSH)
1765+ IWMMXT_BUILTIN (ussubv2si3, "wsubwus", WSUBUSW)
1766+ IWMMXT_BUILTIN (mulv4hi3, "wmulul", WMULUL)
1767+ IWMMXT_BUILTIN (smulv4hi3_highpart, "wmulsm", WMULSM)
1768+ IWMMXT_BUILTIN (umulv4hi3_highpart, "wmulum", WMULUM)
1769+ IWMMXT_BUILTIN (eqv8qi3, "wcmpeqb", WCMPEQB)
1770+ IWMMXT_BUILTIN (eqv4hi3, "wcmpeqh", WCMPEQH)
1771+ IWMMXT_BUILTIN (eqv2si3, "wcmpeqw", WCMPEQW)
1772+ IWMMXT_BUILTIN (gtuv8qi3, "wcmpgtub", WCMPGTUB)
1773+ IWMMXT_BUILTIN (gtuv4hi3, "wcmpgtuh", WCMPGTUH)
1774+ IWMMXT_BUILTIN (gtuv2si3, "wcmpgtuw", WCMPGTUW)
1775+ IWMMXT_BUILTIN (gtv8qi3, "wcmpgtsb", WCMPGTSB)
1776+ IWMMXT_BUILTIN (gtv4hi3, "wcmpgtsh", WCMPGTSH)
1777+ IWMMXT_BUILTIN (gtv2si3, "wcmpgtsw", WCMPGTSW)
1778+ IWMMXT_BUILTIN (umaxv8qi3, "wmaxub", WMAXUB)
1779+ IWMMXT_BUILTIN (smaxv8qi3, "wmaxsb", WMAXSB)
1780+ IWMMXT_BUILTIN (umaxv4hi3, "wmaxuh", WMAXUH)
1781+ IWMMXT_BUILTIN (smaxv4hi3, "wmaxsh", WMAXSH)
1782+ IWMMXT_BUILTIN (umaxv2si3, "wmaxuw", WMAXUW)
1783+ IWMMXT_BUILTIN (smaxv2si3, "wmaxsw", WMAXSW)
1784+ IWMMXT_BUILTIN (uminv8qi3, "wminub", WMINUB)
1785+ IWMMXT_BUILTIN (sminv8qi3, "wminsb", WMINSB)
1786+ IWMMXT_BUILTIN (uminv4hi3, "wminuh", WMINUH)
1787+ IWMMXT_BUILTIN (sminv4hi3, "wminsh", WMINSH)
1788+ IWMMXT_BUILTIN (uminv2si3, "wminuw", WMINUW)
1789+ IWMMXT_BUILTIN (sminv2si3, "wminsw", WMINSW)
1790+ IWMMXT_BUILTIN (iwmmxt_anddi3, "wand", WAND)
1791+ IWMMXT_BUILTIN (iwmmxt_nanddi3, "wandn", WANDN)
1792+ IWMMXT_BUILTIN (iwmmxt_iordi3, "wor", WOR)
1793+ IWMMXT_BUILTIN (iwmmxt_xordi3, "wxor", WXOR)
1794+ IWMMXT_BUILTIN (iwmmxt_uavgv8qi3, "wavg2b", WAVG2B)
1795+ IWMMXT_BUILTIN (iwmmxt_uavgv4hi3, "wavg2h", WAVG2H)
1796+ IWMMXT_BUILTIN (iwmmxt_uavgrndv8qi3, "wavg2br", WAVG2BR)
1797+ IWMMXT_BUILTIN (iwmmxt_uavgrndv4hi3, "wavg2hr", WAVG2HR)
1798+ IWMMXT_BUILTIN (iwmmxt_wunpckilb, "wunpckilb", WUNPCKILB)
1799+ IWMMXT_BUILTIN (iwmmxt_wunpckilh, "wunpckilh", WUNPCKILH)
1800+ IWMMXT_BUILTIN (iwmmxt_wunpckilw, "wunpckilw", WUNPCKILW)
1801+ IWMMXT_BUILTIN (iwmmxt_wunpckihb, "wunpckihb", WUNPCKIHB)
1802+ IWMMXT_BUILTIN (iwmmxt_wunpckihh, "wunpckihh", WUNPCKIHH)
1803+ IWMMXT_BUILTIN (iwmmxt_wunpckihw, "wunpckihw", WUNPCKIHW)
1804+ IWMMXT_BUILTIN (iwmmxt_wmadds, "wmadds", WMADDS)
1805+ IWMMXT_BUILTIN (iwmmxt_wmaddu, "wmaddu", WMADDU)
1806+
1807+#define IWMMXT_BUILTIN2(code, builtin) \
1808+ { FL_IWMMXT, CODE_FOR_##code, NULL, ARM_BUILTIN_##builtin, UNKNOWN, 0 },
1809+
1810+ IWMMXT_BUILTIN2 (iwmmxt_wpackhss, WPACKHSS)
1811+ IWMMXT_BUILTIN2 (iwmmxt_wpackwss, WPACKWSS)
1812+ IWMMXT_BUILTIN2 (iwmmxt_wpackdss, WPACKDSS)
1813+ IWMMXT_BUILTIN2 (iwmmxt_wpackhus, WPACKHUS)
1814+ IWMMXT_BUILTIN2 (iwmmxt_wpackwus, WPACKWUS)
1815+ IWMMXT_BUILTIN2 (iwmmxt_wpackdus, WPACKDUS)
1816+ IWMMXT_BUILTIN2 (ashlv4hi3_di, WSLLH)
1817+ IWMMXT_BUILTIN2 (ashlv4hi3_iwmmxt, WSLLHI)
1818+ IWMMXT_BUILTIN2 (ashlv2si3_di, WSLLW)
1819+ IWMMXT_BUILTIN2 (ashlv2si3_iwmmxt, WSLLWI)
1820+ IWMMXT_BUILTIN2 (ashldi3_di, WSLLD)
1821+ IWMMXT_BUILTIN2 (ashldi3_iwmmxt, WSLLDI)
1822+ IWMMXT_BUILTIN2 (lshrv4hi3_di, WSRLH)
1823+ IWMMXT_BUILTIN2 (lshrv4hi3_iwmmxt, WSRLHI)
1824+ IWMMXT_BUILTIN2 (lshrv2si3_di, WSRLW)
1825+ IWMMXT_BUILTIN2 (lshrv2si3_iwmmxt, WSRLWI)
1826+ IWMMXT_BUILTIN2 (lshrdi3_di, WSRLD)
1827+ IWMMXT_BUILTIN2 (lshrdi3_iwmmxt, WSRLDI)
1828+ IWMMXT_BUILTIN2 (ashrv4hi3_di, WSRAH)
1829+ IWMMXT_BUILTIN2 (ashrv4hi3_iwmmxt, WSRAHI)
1830+ IWMMXT_BUILTIN2 (ashrv2si3_di, WSRAW)
1831+ IWMMXT_BUILTIN2 (ashrv2si3_iwmmxt, WSRAWI)
1832+ IWMMXT_BUILTIN2 (ashrdi3_di, WSRAD)
1833+ IWMMXT_BUILTIN2 (ashrdi3_iwmmxt, WSRADI)
1834+ IWMMXT_BUILTIN2 (rorv4hi3_di, WRORH)
1835+ IWMMXT_BUILTIN2 (rorv4hi3, WRORHI)
1836+ IWMMXT_BUILTIN2 (rorv2si3_di, WRORW)
1837+ IWMMXT_BUILTIN2 (rorv2si3, WRORWI)
1838+ IWMMXT_BUILTIN2 (rordi3_di, WRORD)
1839+ IWMMXT_BUILTIN2 (rordi3, WRORDI)
1840+ IWMMXT_BUILTIN2 (iwmmxt_wmacuz, WMACUZ)
1841+ IWMMXT_BUILTIN2 (iwmmxt_wmacsz, WMACSZ)
1842+};
1843+
1844+static const struct builtin_description bdesc_1arg[] =
1845+{
1846+ IWMMXT_BUILTIN (iwmmxt_tmovmskb, "tmovmskb", TMOVMSKB)
1847+ IWMMXT_BUILTIN (iwmmxt_tmovmskh, "tmovmskh", TMOVMSKH)
1848+ IWMMXT_BUILTIN (iwmmxt_tmovmskw, "tmovmskw", TMOVMSKW)
1849+ IWMMXT_BUILTIN (iwmmxt_waccb, "waccb", WACCB)
1850+ IWMMXT_BUILTIN (iwmmxt_wacch, "wacch", WACCH)
1851+ IWMMXT_BUILTIN (iwmmxt_waccw, "waccw", WACCW)
1852+ IWMMXT_BUILTIN (iwmmxt_wunpckehub, "wunpckehub", WUNPCKEHUB)
1853+ IWMMXT_BUILTIN (iwmmxt_wunpckehuh, "wunpckehuh", WUNPCKEHUH)
1854+ IWMMXT_BUILTIN (iwmmxt_wunpckehuw, "wunpckehuw", WUNPCKEHUW)
1855+ IWMMXT_BUILTIN (iwmmxt_wunpckehsb, "wunpckehsb", WUNPCKEHSB)
1856+ IWMMXT_BUILTIN (iwmmxt_wunpckehsh, "wunpckehsh", WUNPCKEHSH)
1857+ IWMMXT_BUILTIN (iwmmxt_wunpckehsw, "wunpckehsw", WUNPCKEHSW)
1858+ IWMMXT_BUILTIN (iwmmxt_wunpckelub, "wunpckelub", WUNPCKELUB)
1859+ IWMMXT_BUILTIN (iwmmxt_wunpckeluh, "wunpckeluh", WUNPCKELUH)
1860+ IWMMXT_BUILTIN (iwmmxt_wunpckeluw, "wunpckeluw", WUNPCKELUW)
1861+ IWMMXT_BUILTIN (iwmmxt_wunpckelsb, "wunpckelsb", WUNPCKELSB)
1862+ IWMMXT_BUILTIN (iwmmxt_wunpckelsh, "wunpckelsh", WUNPCKELSH)
1863+ IWMMXT_BUILTIN (iwmmxt_wunpckelsw, "wunpckelsw", WUNPCKELSW)
1864+};
1865+
1866+/* Set up all the iWMMXt builtins. This is not called if
1867+ TARGET_IWMMXT is zero. */
1868+
1869+static void
1870+arm_init_iwmmxt_builtins (void)
1871+{
1872+ const struct builtin_description * d;
1873+ size_t i;
1874+ tree endlink = void_list_node;
1875+
1876+ tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
1877+ tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
1878+ tree V8QI_type_node = build_vector_type_for_mode (intQI_type_node, V8QImode);
1879+
1880+ tree int_ftype_int
1881+ = build_function_type (integer_type_node,
1882+ tree_cons (NULL_TREE, integer_type_node, endlink));
1883+ tree v8qi_ftype_v8qi_v8qi_int
1884+ = build_function_type (V8QI_type_node,
1885+ tree_cons (NULL_TREE, V8QI_type_node,
1886+ tree_cons (NULL_TREE, V8QI_type_node,
1887+ tree_cons (NULL_TREE,
1888+ integer_type_node,
1889+ endlink))));
1890+ tree v4hi_ftype_v4hi_int
1891+ = build_function_type (V4HI_type_node,
1892+ tree_cons (NULL_TREE, V4HI_type_node,
1893+ tree_cons (NULL_TREE, integer_type_node,
1894+ endlink)));
1895+ tree v2si_ftype_v2si_int
1896+ = build_function_type (V2SI_type_node,
1897+ tree_cons (NULL_TREE, V2SI_type_node,
1898+ tree_cons (NULL_TREE, integer_type_node,
1899+ endlink)));
1900+ tree v2si_ftype_di_di
1901+ = build_function_type (V2SI_type_node,
1902+ tree_cons (NULL_TREE, long_long_integer_type_node,
1903+ tree_cons (NULL_TREE,
1904+ long_long_integer_type_node,
1905+ endlink)));
1906+ tree di_ftype_di_int
1907+ = build_function_type (long_long_integer_type_node,
1908+ tree_cons (NULL_TREE, long_long_integer_type_node,
1909+ tree_cons (NULL_TREE, integer_type_node,
1910+ endlink)));
1911+ tree di_ftype_di_int_int
1912+ = build_function_type (long_long_integer_type_node,
1913+ tree_cons (NULL_TREE, long_long_integer_type_node,
1914+ tree_cons (NULL_TREE, integer_type_node,
1915+ tree_cons (NULL_TREE,
1916+ integer_type_node,
1917+ endlink))));
1918+ tree int_ftype_v8qi
1919+ = build_function_type (integer_type_node,
1920+ tree_cons (NULL_TREE, V8QI_type_node,
1921+ endlink));
1922+ tree int_ftype_v4hi
1923+ = build_function_type (integer_type_node,
1924+ tree_cons (NULL_TREE, V4HI_type_node,
1925+ endlink));
1926+ tree int_ftype_v2si
1927+ = build_function_type (integer_type_node,
1928+ tree_cons (NULL_TREE, V2SI_type_node,
1929+ endlink));
1930+ tree int_ftype_v8qi_int
1931+ = build_function_type (integer_type_node,
1932+ tree_cons (NULL_TREE, V8QI_type_node,
1933+ tree_cons (NULL_TREE, integer_type_node,
1934+ endlink)));
1935+ tree int_ftype_v4hi_int
1936+ = build_function_type (integer_type_node,
1937+ tree_cons (NULL_TREE, V4HI_type_node,
1938+ tree_cons (NULL_TREE, integer_type_node,
1939+ endlink)));
1940+ tree int_ftype_v2si_int
1941+ = build_function_type (integer_type_node,
1942+ tree_cons (NULL_TREE, V2SI_type_node,
1943+ tree_cons (NULL_TREE, integer_type_node,
1944+ endlink)));
1945+ tree v8qi_ftype_v8qi_int_int
1946+ = build_function_type (V8QI_type_node,
1947+ tree_cons (NULL_TREE, V8QI_type_node,
1948+ tree_cons (NULL_TREE, integer_type_node,
1949+ tree_cons (NULL_TREE,
1950+ integer_type_node,
1951+ endlink))));
1952+ tree v4hi_ftype_v4hi_int_int
1953+ = build_function_type (V4HI_type_node,
1954+ tree_cons (NULL_TREE, V4HI_type_node,
1955+ tree_cons (NULL_TREE, integer_type_node,
1956+ tree_cons (NULL_TREE,
1957+ integer_type_node,
1958+ endlink))));
1959+ tree v2si_ftype_v2si_int_int
1960+ = build_function_type (V2SI_type_node,
1961+ tree_cons (NULL_TREE, V2SI_type_node,
1962+ tree_cons (NULL_TREE, integer_type_node,
1963+ tree_cons (NULL_TREE,
1964+ integer_type_node,
1965+ endlink))));
1966+ /* Miscellaneous. */
1967+ tree v8qi_ftype_v4hi_v4hi
1968+ = build_function_type (V8QI_type_node,
1969+ tree_cons (NULL_TREE, V4HI_type_node,
1970+ tree_cons (NULL_TREE, V4HI_type_node,
1971+ endlink)));
1972+ tree v4hi_ftype_v2si_v2si
1973+ = build_function_type (V4HI_type_node,
1974+ tree_cons (NULL_TREE, V2SI_type_node,
1975+ tree_cons (NULL_TREE, V2SI_type_node,
1976+ endlink)));
1977+ tree v2si_ftype_v4hi_v4hi
1978+ = build_function_type (V2SI_type_node,
1979+ tree_cons (NULL_TREE, V4HI_type_node,
1980+ tree_cons (NULL_TREE, V4HI_type_node,
1981+ endlink)));
1982+ tree v2si_ftype_v8qi_v8qi
1983+ = build_function_type (V2SI_type_node,
1984+ tree_cons (NULL_TREE, V8QI_type_node,
1985+ tree_cons (NULL_TREE, V8QI_type_node,
1986+ endlink)));
1987+ tree v4hi_ftype_v4hi_di
1988+ = build_function_type (V4HI_type_node,
1989+ tree_cons (NULL_TREE, V4HI_type_node,
1990+ tree_cons (NULL_TREE,
1991+ long_long_integer_type_node,
1992+ endlink)));
1993+ tree v2si_ftype_v2si_di
1994+ = build_function_type (V2SI_type_node,
1995+ tree_cons (NULL_TREE, V2SI_type_node,
1996+ tree_cons (NULL_TREE,
1997+ long_long_integer_type_node,
1998+ endlink)));
1999+ tree void_ftype_int_int
2000+ = build_function_type (void_type_node,
2001+ tree_cons (NULL_TREE, integer_type_node,
2002+ tree_cons (NULL_TREE, integer_type_node,
2003+ endlink)));
2004+ tree di_ftype_void
2005+ = build_function_type (long_long_unsigned_type_node, endlink);
2006+ tree di_ftype_v8qi
2007+ = build_function_type (long_long_integer_type_node,
2008+ tree_cons (NULL_TREE, V8QI_type_node,
2009+ endlink));
2010+ tree di_ftype_v4hi
2011+ = build_function_type (long_long_integer_type_node,
2012+ tree_cons (NULL_TREE, V4HI_type_node,
2013+ endlink));
2014+ tree di_ftype_v2si
2015+ = build_function_type (long_long_integer_type_node,
2016+ tree_cons (NULL_TREE, V2SI_type_node,
2017+ endlink));
2018+ tree v2si_ftype_v4hi
2019+ = build_function_type (V2SI_type_node,
2020+ tree_cons (NULL_TREE, V4HI_type_node,
2021+ endlink));
2022+ tree v4hi_ftype_v8qi
2023+ = build_function_type (V4HI_type_node,
2024+ tree_cons (NULL_TREE, V8QI_type_node,
2025+ endlink));
2026+
2027+ tree di_ftype_di_v4hi_v4hi
2028+ = build_function_type (long_long_unsigned_type_node,
2029+ tree_cons (NULL_TREE,
2030+ long_long_unsigned_type_node,
2031+ tree_cons (NULL_TREE, V4HI_type_node,
2032+ tree_cons (NULL_TREE,
2033+ V4HI_type_node,
2034+ endlink))));
2035+
2036+ tree di_ftype_v4hi_v4hi
2037+ = build_function_type (long_long_unsigned_type_node,
2038+ tree_cons (NULL_TREE, V4HI_type_node,
2039+ tree_cons (NULL_TREE, V4HI_type_node,
2040+ endlink)));
2041+
2042+ /* Normal vector binops. */
2043+ tree v8qi_ftype_v8qi_v8qi
2044+ = build_function_type (V8QI_type_node,
2045+ tree_cons (NULL_TREE, V8QI_type_node,
2046+ tree_cons (NULL_TREE, V8QI_type_node,
2047+ endlink)));
2048+ tree v4hi_ftype_v4hi_v4hi
2049+ = build_function_type (V4HI_type_node,
2050+ tree_cons (NULL_TREE, V4HI_type_node,
2051+ tree_cons (NULL_TREE, V4HI_type_node,
2052+ endlink)));
2053+ tree v2si_ftype_v2si_v2si
2054+ = build_function_type (V2SI_type_node,
2055+ tree_cons (NULL_TREE, V2SI_type_node,
2056+ tree_cons (NULL_TREE, V2SI_type_node,
2057+ endlink)));
2058+ tree di_ftype_di_di
2059+ = build_function_type (long_long_unsigned_type_node,
2060+ tree_cons (NULL_TREE, long_long_unsigned_type_node,
2061+ tree_cons (NULL_TREE,
2062+ long_long_unsigned_type_node,
2063+ endlink)));
2064+
2065+ /* Add all builtins that are more or less simple operations on two
2066+ operands. */
2067+ for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
2068+ {
2069+ /* Use one of the operands; the target can have a different mode for
2070+ mask-generating compares. */
2071+ enum machine_mode mode;
2072+ tree type;
2073+
2074+ if (d->name == 0)
2075+ continue;
2076+
2077+ mode = insn_data[d->icode].operand[1].mode;
2078+
2079+ switch (mode)
2080+ {
2081+ case V8QImode:
2082+ type = v8qi_ftype_v8qi_v8qi;
2083+ break;
2084+ case V4HImode:
2085+ type = v4hi_ftype_v4hi_v4hi;
2086+ break;
2087+ case V2SImode:
2088+ type = v2si_ftype_v2si_v2si;
2089+ break;
2090+ case DImode:
2091+ type = di_ftype_di_di;
2092+ break;
2093+
2094+ default:
2095+ gcc_unreachable ();
2096+ }
2097+
2098+ def_mbuiltin (d->mask, d->name, type, d->code);
2099+ }
2100+
2101+ /* Add the remaining MMX insns with somewhat more complicated types. */
2102+#define iwmmx_mbuiltin(NAME, TYPE, CODE) \
2103+ def_mbuiltin (FL_IWMMXT, "__builtin_arm_" NAME, (TYPE), \
2104+ ARM_BUILTIN_ ## CODE)
2105+
2106+ iwmmx_mbuiltin ("wzero", di_ftype_void, WZERO);
2107+ iwmmx_mbuiltin ("setwcx", void_ftype_int_int, SETWCX);
2108+ iwmmx_mbuiltin ("getwcx", int_ftype_int, GETWCX);
2109+
2110+ iwmmx_mbuiltin ("wsllh", v4hi_ftype_v4hi_di, WSLLH);
2111+ iwmmx_mbuiltin ("wsllw", v2si_ftype_v2si_di, WSLLW);
2112+ iwmmx_mbuiltin ("wslld", di_ftype_di_di, WSLLD);
2113+ iwmmx_mbuiltin ("wsllhi", v4hi_ftype_v4hi_int, WSLLHI);
2114+ iwmmx_mbuiltin ("wsllwi", v2si_ftype_v2si_int, WSLLWI);
2115+ iwmmx_mbuiltin ("wslldi", di_ftype_di_int, WSLLDI);
2116+
2117+ iwmmx_mbuiltin ("wsrlh", v4hi_ftype_v4hi_di, WSRLH);
2118+ iwmmx_mbuiltin ("wsrlw", v2si_ftype_v2si_di, WSRLW);
2119+ iwmmx_mbuiltin ("wsrld", di_ftype_di_di, WSRLD);
2120+ iwmmx_mbuiltin ("wsrlhi", v4hi_ftype_v4hi_int, WSRLHI);
2121+ iwmmx_mbuiltin ("wsrlwi", v2si_ftype_v2si_int, WSRLWI);
2122+ iwmmx_mbuiltin ("wsrldi", di_ftype_di_int, WSRLDI);
2123+
2124+ iwmmx_mbuiltin ("wsrah", v4hi_ftype_v4hi_di, WSRAH);
2125+ iwmmx_mbuiltin ("wsraw", v2si_ftype_v2si_di, WSRAW);
2126+ iwmmx_mbuiltin ("wsrad", di_ftype_di_di, WSRAD);
2127+ iwmmx_mbuiltin ("wsrahi", v4hi_ftype_v4hi_int, WSRAHI);
2128+ iwmmx_mbuiltin ("wsrawi", v2si_ftype_v2si_int, WSRAWI);
2129+ iwmmx_mbuiltin ("wsradi", di_ftype_di_int, WSRADI);
2130+
2131+ iwmmx_mbuiltin ("wrorh", v4hi_ftype_v4hi_di, WRORH);
2132+ iwmmx_mbuiltin ("wrorw", v2si_ftype_v2si_di, WRORW);
2133+ iwmmx_mbuiltin ("wrord", di_ftype_di_di, WRORD);
2134+ iwmmx_mbuiltin ("wrorhi", v4hi_ftype_v4hi_int, WRORHI);
2135+ iwmmx_mbuiltin ("wrorwi", v2si_ftype_v2si_int, WRORWI);
2136+ iwmmx_mbuiltin ("wrordi", di_ftype_di_int, WRORDI);
2137+
2138+ iwmmx_mbuiltin ("wshufh", v4hi_ftype_v4hi_int, WSHUFH);
2139+
2140+ iwmmx_mbuiltin ("wsadb", v2si_ftype_v8qi_v8qi, WSADB);
2141+ iwmmx_mbuiltin ("wsadh", v2si_ftype_v4hi_v4hi, WSADH);
2142+ iwmmx_mbuiltin ("wsadbz", v2si_ftype_v8qi_v8qi, WSADBZ);
2143+ iwmmx_mbuiltin ("wsadhz", v2si_ftype_v4hi_v4hi, WSADHZ);
2144+
2145+ iwmmx_mbuiltin ("textrmsb", int_ftype_v8qi_int, TEXTRMSB);
2146+ iwmmx_mbuiltin ("textrmsh", int_ftype_v4hi_int, TEXTRMSH);
2147+ iwmmx_mbuiltin ("textrmsw", int_ftype_v2si_int, TEXTRMSW);
2148+ iwmmx_mbuiltin ("textrmub", int_ftype_v8qi_int, TEXTRMUB);
2149+ iwmmx_mbuiltin ("textrmuh", int_ftype_v4hi_int, TEXTRMUH);
2150+ iwmmx_mbuiltin ("textrmuw", int_ftype_v2si_int, TEXTRMUW);
2151+ iwmmx_mbuiltin ("tinsrb", v8qi_ftype_v8qi_int_int, TINSRB);
2152+ iwmmx_mbuiltin ("tinsrh", v4hi_ftype_v4hi_int_int, TINSRH);
2153+ iwmmx_mbuiltin ("tinsrw", v2si_ftype_v2si_int_int, TINSRW);
2154+
2155+ iwmmx_mbuiltin ("waccb", di_ftype_v8qi, WACCB);
2156+ iwmmx_mbuiltin ("wacch", di_ftype_v4hi, WACCH);
2157+ iwmmx_mbuiltin ("waccw", di_ftype_v2si, WACCW);
2158+
2159+ iwmmx_mbuiltin ("tmovmskb", int_ftype_v8qi, TMOVMSKB);
2160+ iwmmx_mbuiltin ("tmovmskh", int_ftype_v4hi, TMOVMSKH);
2161+ iwmmx_mbuiltin ("tmovmskw", int_ftype_v2si, TMOVMSKW);
2162+
2163+ iwmmx_mbuiltin ("wpackhss", v8qi_ftype_v4hi_v4hi, WPACKHSS);
2164+ iwmmx_mbuiltin ("wpackhus", v8qi_ftype_v4hi_v4hi, WPACKHUS);
2165+ iwmmx_mbuiltin ("wpackwus", v4hi_ftype_v2si_v2si, WPACKWUS);
2166+ iwmmx_mbuiltin ("wpackwss", v4hi_ftype_v2si_v2si, WPACKWSS);
2167+ iwmmx_mbuiltin ("wpackdus", v2si_ftype_di_di, WPACKDUS);
2168+ iwmmx_mbuiltin ("wpackdss", v2si_ftype_di_di, WPACKDSS);
2169+
2170+ iwmmx_mbuiltin ("wunpckehub", v4hi_ftype_v8qi, WUNPCKEHUB);
2171+ iwmmx_mbuiltin ("wunpckehuh", v2si_ftype_v4hi, WUNPCKEHUH);
2172+ iwmmx_mbuiltin ("wunpckehuw", di_ftype_v2si, WUNPCKEHUW);
2173+ iwmmx_mbuiltin ("wunpckehsb", v4hi_ftype_v8qi, WUNPCKEHSB);
2174+ iwmmx_mbuiltin ("wunpckehsh", v2si_ftype_v4hi, WUNPCKEHSH);
2175+ iwmmx_mbuiltin ("wunpckehsw", di_ftype_v2si, WUNPCKEHSW);
2176+ iwmmx_mbuiltin ("wunpckelub", v4hi_ftype_v8qi, WUNPCKELUB);
2177+ iwmmx_mbuiltin ("wunpckeluh", v2si_ftype_v4hi, WUNPCKELUH);
2178+ iwmmx_mbuiltin ("wunpckeluw", di_ftype_v2si, WUNPCKELUW);
2179+ iwmmx_mbuiltin ("wunpckelsb", v4hi_ftype_v8qi, WUNPCKELSB);
2180+ iwmmx_mbuiltin ("wunpckelsh", v2si_ftype_v4hi, WUNPCKELSH);
2181+ iwmmx_mbuiltin ("wunpckelsw", di_ftype_v2si, WUNPCKELSW);
2182+
2183+ iwmmx_mbuiltin ("wmacs", di_ftype_di_v4hi_v4hi, WMACS);
2184+ iwmmx_mbuiltin ("wmacsz", di_ftype_v4hi_v4hi, WMACSZ);
2185+ iwmmx_mbuiltin ("wmacu", di_ftype_di_v4hi_v4hi, WMACU);
2186+ iwmmx_mbuiltin ("wmacuz", di_ftype_v4hi_v4hi, WMACUZ);
2187+
2188+ iwmmx_mbuiltin ("walign", v8qi_ftype_v8qi_v8qi_int, WALIGN);
2189+ iwmmx_mbuiltin ("tmia", di_ftype_di_int_int, TMIA);
2190+ iwmmx_mbuiltin ("tmiaph", di_ftype_di_int_int, TMIAPH);
2191+ iwmmx_mbuiltin ("tmiabb", di_ftype_di_int_int, TMIABB);
2192+ iwmmx_mbuiltin ("tmiabt", di_ftype_di_int_int, TMIABT);
2193+ iwmmx_mbuiltin ("tmiatb", di_ftype_di_int_int, TMIATB);
2194+ iwmmx_mbuiltin ("tmiatt", di_ftype_di_int_int, TMIATT);
2195+
2196+#undef iwmmx_mbuiltin
2197+}
2198+
2199+static void
2200+arm_init_tls_builtins (void)
2201+{
2202+ tree ftype, decl;
2203+
2204+ ftype = build_function_type (ptr_type_node, void_list_node);
2205+ decl = add_builtin_function ("__builtin_thread_pointer", ftype,
2206+ ARM_BUILTIN_THREAD_POINTER, BUILT_IN_MD,
2207+ NULL, NULL_TREE);
2208+ TREE_NOTHROW (decl) = 1;
2209+ TREE_READONLY (decl) = 1;
2210+ arm_builtin_decls[ARM_BUILTIN_THREAD_POINTER] = decl;
2211 }
2212
2213 static void
2214@@ -19479,6 +19662,17 @@
2215 arm_init_fp16_builtins ();
2216 }
2217
2218+/* Return the ARM builtin for CODE. */
2219+
2220+static tree
2221+arm_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
2222+{
2223+ if (code >= ARM_BUILTIN_MAX)
2224+ return error_mark_node;
2225+
2226+ return arm_builtin_decls[code];
2227+}
2228+
2229 /* Implement TARGET_INVALID_PARAMETER_TYPE. */
2230
2231 static const char *
2232@@ -19630,58 +19824,6 @@
2233 return target;
2234 }
2235
2236-static int
2237-neon_builtin_compare (const void *a, const void *b)
2238-{
2239- const neon_builtin_datum *const key = (const neon_builtin_datum *) a;
2240- const neon_builtin_datum *const memb = (const neon_builtin_datum *) b;
2241- unsigned int soughtcode = key->base_fcode;
2242-
2243- if (soughtcode >= memb->base_fcode
2244- && soughtcode < memb->base_fcode + memb->num_vars)
2245- return 0;
2246- else if (soughtcode < memb->base_fcode)
2247- return -1;
2248- else
2249- return 1;
2250-}
2251-
2252-static enum insn_code
2253-locate_neon_builtin_icode (int fcode, neon_itype *itype,
2254- enum neon_builtin_type_bits *type_bit)
2255-{
2256- neon_builtin_datum key
2257- = { NULL, (neon_itype) 0, 0, { CODE_FOR_nothing }, 0, 0 };
2258- neon_builtin_datum *found;
2259- int idx, type, ntypes;
2260-
2261- key.base_fcode = fcode;
2262- found = (neon_builtin_datum *)
2263- bsearch (&key, &neon_builtin_data[0], ARRAY_SIZE (neon_builtin_data),
2264- sizeof (neon_builtin_data[0]), neon_builtin_compare);
2265- gcc_assert (found);
2266- idx = fcode - (int) found->base_fcode;
2267- gcc_assert (idx >= 0 && idx < T_MAX && idx < (int)found->num_vars);
2268-
2269- if (itype)
2270- *itype = found->itype;
2271-
2272- if (type_bit)
2273- {
2274- ntypes = 0;
2275- for (type = 0; type < T_MAX; type++)
2276- if (found->bits & (1 << type))
2277- {
2278- if (ntypes == idx)
2279- break;
2280- ntypes++;
2281- }
2282- gcc_assert (type < T_MAX);
2283- *type_bit = (enum neon_builtin_type_bits) (1 << type);
2284- }
2285- return found->codes[idx];
2286-}
2287-
2288 typedef enum {
2289 NEON_ARG_COPY_TO_REG,
2290 NEON_ARG_CONSTANT,
2291@@ -19695,14 +19837,14 @@
2292 and return an expression for the accessed memory.
2293
2294 The intrinsic function operates on a block of registers that has
2295- mode REG_MODE. This block contains vectors of type TYPE_BIT.
2296+ mode REG_MODE. This block contains vectors of type TYPE_MODE.
2297 The function references the memory at EXP in mode MEM_MODE;
2298 this mode may be BLKmode if no more suitable mode is available. */
2299
2300 static tree
2301 neon_dereference_pointer (tree exp, enum machine_mode mem_mode,
2302 enum machine_mode reg_mode,
2303- enum neon_builtin_type_bits type_bit)
2304+ neon_builtin_type_mode type_mode)
2305 {
2306 HOST_WIDE_INT reg_size, vector_size, nvectors, nelems;
2307 tree elem_type, upper_bound, array_type;
2308@@ -19711,8 +19853,8 @@
2309 reg_size = GET_MODE_SIZE (reg_mode);
2310
2311 /* Work out the size of each vector in bytes. */
2312- gcc_assert (type_bit & (T_DREG | T_QREG));
2313- vector_size = (type_bit & T_QREG ? 16 : 8);
2314+ gcc_assert (TYPE_MODE_BIT (type_mode) & (TB_DREG | TB_QREG));
2315+ vector_size = (TYPE_MODE_BIT (type_mode) & TB_QREG ? 16 : 8);
2316
2317 /* Work out how many vectors there are. */
2318 gcc_assert (reg_size % vector_size == 0);
2319@@ -19743,7 +19885,7 @@
2320 /* Expand a Neon builtin. */
2321 static rtx
2322 arm_expand_neon_args (rtx target, int icode, int have_retval,
2323- enum neon_builtin_type_bits type_bit,
2324+ neon_builtin_type_mode type_mode,
2325 tree exp, ...)
2326 {
2327 va_list ap;
2328@@ -19779,7 +19921,7 @@
2329 {
2330 other_mode = insn_data[icode].operand[1 - opno].mode;
2331 arg[argc] = neon_dereference_pointer (arg[argc], mode[argc],
2332- other_mode, type_bit);
2333+ other_mode, type_mode);
2334 }
2335 op[argc] = expand_normal (arg[argc]);
2336
2337@@ -19889,16 +20031,17 @@
2338 static rtx
2339 arm_expand_neon_builtin (int fcode, tree exp, rtx target)
2340 {
2341- neon_itype itype;
2342- enum neon_builtin_type_bits type_bit;
2343- enum insn_code icode = locate_neon_builtin_icode (fcode, &itype, &type_bit);
2344+ neon_builtin_datum *d = &neon_builtin_data[fcode - ARM_BUILTIN_NEON_BASE];
2345+ neon_itype itype = d->itype;
2346+ enum insn_code icode = d->code;
2347+ neon_builtin_type_mode type_mode = d->mode;
2348
2349 switch (itype)
2350 {
2351 case NEON_UNOP:
2352 case NEON_CONVERT:
2353 case NEON_DUPLANE:
2354- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2355+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2356 NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT, NEON_ARG_STOP);
2357
2358 case NEON_BINOP:
2359@@ -19908,89 +20051,89 @@
2360 case NEON_SCALARMULH:
2361 case NEON_SHIFTINSERT:
2362 case NEON_LOGICBINOP:
2363- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2364+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2365 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT,
2366 NEON_ARG_STOP);
2367
2368 case NEON_TERNOP:
2369- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2370+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2371 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG,
2372 NEON_ARG_CONSTANT, NEON_ARG_STOP);
2373
2374 case NEON_GETLANE:
2375 case NEON_FIXCONV:
2376 case NEON_SHIFTIMM:
2377- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2378+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2379 NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT, NEON_ARG_CONSTANT,
2380 NEON_ARG_STOP);
2381
2382 case NEON_CREATE:
2383- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2384+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2385 NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
2386
2387 case NEON_DUP:
2388 case NEON_SPLIT:
2389 case NEON_REINTERP:
2390- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2391+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2392 NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
2393
2394 case NEON_COMBINE:
2395 case NEON_VTBL:
2396- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2397+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2398 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
2399
2400 case NEON_RESULTPAIR:
2401- return arm_expand_neon_args (target, icode, 0, type_bit, exp,
2402+ return arm_expand_neon_args (target, icode, 0, type_mode, exp,
2403 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG,
2404 NEON_ARG_STOP);
2405
2406 case NEON_LANEMUL:
2407 case NEON_LANEMULL:
2408 case NEON_LANEMULH:
2409- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2410+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2411 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT,
2412 NEON_ARG_CONSTANT, NEON_ARG_STOP);
2413
2414 case NEON_LANEMAC:
2415- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2416+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2417 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG,
2418 NEON_ARG_CONSTANT, NEON_ARG_CONSTANT, NEON_ARG_STOP);
2419
2420 case NEON_SHIFTACC:
2421- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2422+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2423 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT,
2424 NEON_ARG_CONSTANT, NEON_ARG_STOP);
2425
2426 case NEON_SCALARMAC:
2427- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2428+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2429 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG,
2430 NEON_ARG_CONSTANT, NEON_ARG_STOP);
2431
2432 case NEON_SELECT:
2433 case NEON_VTBX:
2434- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2435+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2436 NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG,
2437 NEON_ARG_STOP);
2438
2439 case NEON_LOAD1:
2440 case NEON_LOADSTRUCT:
2441- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2442+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2443 NEON_ARG_MEMORY, NEON_ARG_STOP);
2444
2445 case NEON_LOAD1LANE:
2446 case NEON_LOADSTRUCTLANE:
2447- return arm_expand_neon_args (target, icode, 1, type_bit, exp,
2448+ return arm_expand_neon_args (target, icode, 1, type_mode, exp,
2449 NEON_ARG_MEMORY, NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT,
2450 NEON_ARG_STOP);
2451
2452 case NEON_STORE1:
2453 case NEON_STORESTRUCT:
2454- return arm_expand_neon_args (target, icode, 0, type_bit, exp,
2455+ return arm_expand_neon_args (target, icode, 0, type_mode, exp,
2456 NEON_ARG_MEMORY, NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
2457
2458 case NEON_STORE1LANE:
2459 case NEON_STORESTRUCTLANE:
2460- return arm_expand_neon_args (target, icode, 0, type_bit, exp,
2461+ return arm_expand_neon_args (target, icode, 0, type_mode, exp,
2462 NEON_ARG_MEMORY, NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT,
2463 NEON_ARG_STOP);
2464 }
2465
2466=== modified file 'gcc/config/arm/arm.h'
2467--- old/gcc/config/arm/arm.h 2011-08-13 08:32:32 +0000
2468+++ new/gcc/config/arm/arm.h 2011-08-24 17:35:16 +0000
2469@@ -2269,178 +2269,6 @@
2470 : arm_gen_return_addr_mask ())
2471
2472
2473-/* Neon defines builtins from ARM_BUILTIN_MAX upwards, though they don't have
2474- symbolic names defined here (which would require too much duplication).
2475- FIXME? */
2476-enum arm_builtins
2477-{
2478- ARM_BUILTIN_GETWCX,
2479- ARM_BUILTIN_SETWCX,
2480-
2481- ARM_BUILTIN_WZERO,
2482-
2483- ARM_BUILTIN_WAVG2BR,
2484- ARM_BUILTIN_WAVG2HR,
2485- ARM_BUILTIN_WAVG2B,
2486- ARM_BUILTIN_WAVG2H,
2487-
2488- ARM_BUILTIN_WACCB,
2489- ARM_BUILTIN_WACCH,
2490- ARM_BUILTIN_WACCW,
2491-
2492- ARM_BUILTIN_WMACS,
2493- ARM_BUILTIN_WMACSZ,
2494- ARM_BUILTIN_WMACU,
2495- ARM_BUILTIN_WMACUZ,
2496-
2497- ARM_BUILTIN_WSADB,
2498- ARM_BUILTIN_WSADBZ,
2499- ARM_BUILTIN_WSADH,
2500- ARM_BUILTIN_WSADHZ,
2501-
2502- ARM_BUILTIN_WALIGN,
2503-
2504- ARM_BUILTIN_TMIA,
2505- ARM_BUILTIN_TMIAPH,
2506- ARM_BUILTIN_TMIABB,
2507- ARM_BUILTIN_TMIABT,
2508- ARM_BUILTIN_TMIATB,
2509- ARM_BUILTIN_TMIATT,
2510-
2511- ARM_BUILTIN_TMOVMSKB,
2512- ARM_BUILTIN_TMOVMSKH,
2513- ARM_BUILTIN_TMOVMSKW,
2514-
2515- ARM_BUILTIN_TBCSTB,
2516- ARM_BUILTIN_TBCSTH,
2517- ARM_BUILTIN_TBCSTW,
2518-
2519- ARM_BUILTIN_WMADDS,
2520- ARM_BUILTIN_WMADDU,
2521-
2522- ARM_BUILTIN_WPACKHSS,
2523- ARM_BUILTIN_WPACKWSS,
2524- ARM_BUILTIN_WPACKDSS,
2525- ARM_BUILTIN_WPACKHUS,
2526- ARM_BUILTIN_WPACKWUS,
2527- ARM_BUILTIN_WPACKDUS,
2528-
2529- ARM_BUILTIN_WADDB,
2530- ARM_BUILTIN_WADDH,
2531- ARM_BUILTIN_WADDW,
2532- ARM_BUILTIN_WADDSSB,
2533- ARM_BUILTIN_WADDSSH,
2534- ARM_BUILTIN_WADDSSW,
2535- ARM_BUILTIN_WADDUSB,
2536- ARM_BUILTIN_WADDUSH,
2537- ARM_BUILTIN_WADDUSW,
2538- ARM_BUILTIN_WSUBB,
2539- ARM_BUILTIN_WSUBH,
2540- ARM_BUILTIN_WSUBW,
2541- ARM_BUILTIN_WSUBSSB,
2542- ARM_BUILTIN_WSUBSSH,
2543- ARM_BUILTIN_WSUBSSW,
2544- ARM_BUILTIN_WSUBUSB,
2545- ARM_BUILTIN_WSUBUSH,
2546- ARM_BUILTIN_WSUBUSW,
2547-
2548- ARM_BUILTIN_WAND,
2549- ARM_BUILTIN_WANDN,
2550- ARM_BUILTIN_WOR,
2551- ARM_BUILTIN_WXOR,
2552-
2553- ARM_BUILTIN_WCMPEQB,
2554- ARM_BUILTIN_WCMPEQH,
2555- ARM_BUILTIN_WCMPEQW,
2556- ARM_BUILTIN_WCMPGTUB,
2557- ARM_BUILTIN_WCMPGTUH,
2558- ARM_BUILTIN_WCMPGTUW,
2559- ARM_BUILTIN_WCMPGTSB,
2560- ARM_BUILTIN_WCMPGTSH,
2561- ARM_BUILTIN_WCMPGTSW,
2562-
2563- ARM_BUILTIN_TEXTRMSB,
2564- ARM_BUILTIN_TEXTRMSH,
2565- ARM_BUILTIN_TEXTRMSW,
2566- ARM_BUILTIN_TEXTRMUB,
2567- ARM_BUILTIN_TEXTRMUH,
2568- ARM_BUILTIN_TEXTRMUW,
2569- ARM_BUILTIN_TINSRB,
2570- ARM_BUILTIN_TINSRH,
2571- ARM_BUILTIN_TINSRW,
2572-
2573- ARM_BUILTIN_WMAXSW,
2574- ARM_BUILTIN_WMAXSH,
2575- ARM_BUILTIN_WMAXSB,
2576- ARM_BUILTIN_WMAXUW,
2577- ARM_BUILTIN_WMAXUH,
2578- ARM_BUILTIN_WMAXUB,
2579- ARM_BUILTIN_WMINSW,
2580- ARM_BUILTIN_WMINSH,
2581- ARM_BUILTIN_WMINSB,
2582- ARM_BUILTIN_WMINUW,
2583- ARM_BUILTIN_WMINUH,
2584- ARM_BUILTIN_WMINUB,
2585-
2586- ARM_BUILTIN_WMULUM,
2587- ARM_BUILTIN_WMULSM,
2588- ARM_BUILTIN_WMULUL,
2589-
2590- ARM_BUILTIN_PSADBH,
2591- ARM_BUILTIN_WSHUFH,
2592-
2593- ARM_BUILTIN_WSLLH,
2594- ARM_BUILTIN_WSLLW,
2595- ARM_BUILTIN_WSLLD,
2596- ARM_BUILTIN_WSRAH,
2597- ARM_BUILTIN_WSRAW,
2598- ARM_BUILTIN_WSRAD,
2599- ARM_BUILTIN_WSRLH,
2600- ARM_BUILTIN_WSRLW,
2601- ARM_BUILTIN_WSRLD,
2602- ARM_BUILTIN_WRORH,
2603- ARM_BUILTIN_WRORW,
2604- ARM_BUILTIN_WRORD,
2605- ARM_BUILTIN_WSLLHI,
2606- ARM_BUILTIN_WSLLWI,
2607- ARM_BUILTIN_WSLLDI,
2608- ARM_BUILTIN_WSRAHI,
2609- ARM_BUILTIN_WSRAWI,
2610- ARM_BUILTIN_WSRADI,
2611- ARM_BUILTIN_WSRLHI,
2612- ARM_BUILTIN_WSRLWI,
2613- ARM_BUILTIN_WSRLDI,
2614- ARM_BUILTIN_WRORHI,
2615- ARM_BUILTIN_WRORWI,
2616- ARM_BUILTIN_WRORDI,
2617-
2618- ARM_BUILTIN_WUNPCKIHB,
2619- ARM_BUILTIN_WUNPCKIHH,
2620- ARM_BUILTIN_WUNPCKIHW,
2621- ARM_BUILTIN_WUNPCKILB,
2622- ARM_BUILTIN_WUNPCKILH,
2623- ARM_BUILTIN_WUNPCKILW,
2624-
2625- ARM_BUILTIN_WUNPCKEHSB,
2626- ARM_BUILTIN_WUNPCKEHSH,
2627- ARM_BUILTIN_WUNPCKEHSW,
2628- ARM_BUILTIN_WUNPCKEHUB,
2629- ARM_BUILTIN_WUNPCKEHUH,
2630- ARM_BUILTIN_WUNPCKEHUW,
2631- ARM_BUILTIN_WUNPCKELSB,
2632- ARM_BUILTIN_WUNPCKELSH,
2633- ARM_BUILTIN_WUNPCKELSW,
2634- ARM_BUILTIN_WUNPCKELUB,
2635- ARM_BUILTIN_WUNPCKELUH,
2636- ARM_BUILTIN_WUNPCKELUW,
2637-
2638- ARM_BUILTIN_THREAD_POINTER,
2639-
2640- ARM_BUILTIN_NEON_BASE,
2641-
2642- ARM_BUILTIN_MAX = ARM_BUILTIN_NEON_BASE /* FIXME: Wrong! */
2643-};
2644-
2645 /* Do not emit .note.GNU-stack by default. */
2646 #ifndef NEED_INDICATE_EXEC_STACK
2647 #define NEED_INDICATE_EXEC_STACK 0
2648