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