optabs.h revision 1.1.1.1 1 1.1 mrg /* Definitions for code generation pass of GNU compiler.
2 1.1 mrg Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 1.1 mrg Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify
8 1.1 mrg it under the terms of the GNU General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
10 1.1 mrg any later version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful,
13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 mrg GNU General Public License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg #ifndef GCC_OPTABS_H
22 1.1 mrg #define GCC_OPTABS_H
23 1.1 mrg
24 1.1 mrg #include "insn-codes.h"
25 1.1 mrg
26 1.1 mrg /* Optabs are tables saying how to generate insn bodies
27 1.1 mrg for various machine modes and numbers of operands.
28 1.1 mrg Each optab applies to one operation.
29 1.1 mrg
30 1.1 mrg For example, add_optab applies to addition.
31 1.1 mrg
32 1.1 mrg The insn_code slot is the enum insn_code that says how to
33 1.1 mrg generate an insn for this operation on a particular machine mode.
34 1.1 mrg It is CODE_FOR_nothing if there is no such insn on the target machine.
35 1.1 mrg
36 1.1 mrg The `lib_call' slot is the name of the library function that
37 1.1 mrg can be used to perform the operation.
38 1.1 mrg
39 1.1 mrg A few optabs, such as move_optab, are used by special code. */
40 1.1 mrg
41 1.1 mrg struct optab_handlers
42 1.1 mrg {
43 1.1 mrg enum insn_code insn_code;
44 1.1 mrg };
45 1.1 mrg
46 1.1 mrg struct optab_d
47 1.1 mrg {
48 1.1 mrg enum rtx_code code;
49 1.1 mrg const char *libcall_basename;
50 1.1 mrg char libcall_suffix;
51 1.1 mrg void (*libcall_gen)(struct optab_d *, const char *name, char suffix,
52 1.1 mrg enum machine_mode);
53 1.1 mrg struct optab_handlers handlers[NUM_MACHINE_MODES];
54 1.1 mrg };
55 1.1 mrg typedef struct optab_d * optab;
56 1.1 mrg
57 1.1 mrg /* A convert_optab is for some sort of conversion operation between
58 1.1 mrg modes. The first array index is the destination mode, the second
59 1.1 mrg is the source mode. */
60 1.1 mrg struct convert_optab_d
61 1.1 mrg {
62 1.1 mrg enum rtx_code code;
63 1.1 mrg const char *libcall_basename;
64 1.1 mrg void (*libcall_gen)(struct convert_optab_d *, const char *name,
65 1.1 mrg enum machine_mode,
66 1.1 mrg enum machine_mode);
67 1.1 mrg struct optab_handlers handlers[NUM_MACHINE_MODES][NUM_MACHINE_MODES];
68 1.1 mrg };
69 1.1 mrg typedef struct convert_optab_d *convert_optab;
70 1.1 mrg
71 1.1 mrg /* Given an enum insn_code, access the function to construct
72 1.1 mrg the body of that kind of insn. */
73 1.1 mrg #define GEN_FCN(CODE) (insn_data[CODE].genfun)
74 1.1 mrg
75 1.1 mrg /* Enumeration of valid indexes into optab_table. */
76 1.1 mrg enum optab_index
77 1.1 mrg {
78 1.1 mrg /* Fixed-point operators with signed/unsigned saturation */
79 1.1 mrg OTI_ssadd,
80 1.1 mrg OTI_usadd,
81 1.1 mrg OTI_sssub,
82 1.1 mrg OTI_ussub,
83 1.1 mrg OTI_ssmul,
84 1.1 mrg OTI_usmul,
85 1.1 mrg OTI_ssdiv,
86 1.1 mrg OTI_usdiv,
87 1.1 mrg OTI_ssneg,
88 1.1 mrg OTI_usneg,
89 1.1 mrg OTI_ssashl,
90 1.1 mrg OTI_usashl,
91 1.1 mrg
92 1.1 mrg OTI_add,
93 1.1 mrg OTI_addv,
94 1.1 mrg OTI_sub,
95 1.1 mrg OTI_subv,
96 1.1 mrg
97 1.1 mrg /* Signed and fp multiply */
98 1.1 mrg OTI_smul,
99 1.1 mrg OTI_smulv,
100 1.1 mrg /* Signed multiply, return high word */
101 1.1 mrg OTI_smul_highpart,
102 1.1 mrg OTI_umul_highpart,
103 1.1 mrg /* Signed multiply with result one machine mode wider than args */
104 1.1 mrg OTI_smul_widen,
105 1.1 mrg OTI_umul_widen,
106 1.1 mrg /* Widening multiply of one unsigned and one signed operand. */
107 1.1 mrg OTI_usmul_widen,
108 1.1 mrg /* Signed multiply and add with the result and addend one machine mode
109 1.1 mrg wider than the multiplicand and multiplier. */
110 1.1 mrg OTI_smadd_widen,
111 1.1 mrg /* Unsigned multiply and add with the result and addend one machine mode
112 1.1 mrg wider than the multiplicand and multiplier. */
113 1.1 mrg OTI_umadd_widen,
114 1.1 mrg /* Signed multiply and add with the result and addend one machine mode
115 1.1 mrg wider than the multiplicand and multiplier.
116 1.1 mrg All involved operations are saturating. */
117 1.1 mrg OTI_ssmadd_widen,
118 1.1 mrg /* Unsigned multiply and add with the result and addend one machine mode
119 1.1 mrg wider than the multiplicand and multiplier.
120 1.1 mrg All involved operations are saturating. */
121 1.1 mrg OTI_usmadd_widen,
122 1.1 mrg /* Signed multiply and subtract the result and minuend one machine mode
123 1.1 mrg wider than the multiplicand and multiplier. */
124 1.1 mrg OTI_smsub_widen,
125 1.1 mrg /* Unsigned multiply and subtract the result and minuend one machine mode
126 1.1 mrg wider than the multiplicand and multiplier. */
127 1.1 mrg OTI_umsub_widen,
128 1.1 mrg /* Signed multiply and subtract the result and minuend one machine mode
129 1.1 mrg wider than the multiplicand and multiplier.
130 1.1 mrg All involved operations are saturating. */
131 1.1 mrg OTI_ssmsub_widen,
132 1.1 mrg /* Unsigned multiply and subtract the result and minuend one machine mode
133 1.1 mrg wider than the multiplicand and multiplier.
134 1.1 mrg All involved operations are saturating. */
135 1.1 mrg OTI_usmsub_widen,
136 1.1 mrg
137 1.1 mrg /* Signed divide */
138 1.1 mrg OTI_sdiv,
139 1.1 mrg OTI_sdivv,
140 1.1 mrg /* Signed divide-and-remainder in one */
141 1.1 mrg OTI_sdivmod,
142 1.1 mrg OTI_udiv,
143 1.1 mrg OTI_udivmod,
144 1.1 mrg /* Signed remainder */
145 1.1 mrg OTI_smod,
146 1.1 mrg OTI_umod,
147 1.1 mrg /* Floating point remainder functions */
148 1.1 mrg OTI_fmod,
149 1.1 mrg OTI_remainder,
150 1.1 mrg /* Convert float to integer in float fmt */
151 1.1 mrg OTI_ftrunc,
152 1.1 mrg
153 1.1 mrg /* Logical and */
154 1.1 mrg OTI_and,
155 1.1 mrg /* Logical or */
156 1.1 mrg OTI_ior,
157 1.1 mrg /* Logical xor */
158 1.1 mrg OTI_xor,
159 1.1 mrg
160 1.1 mrg /* Arithmetic shift left */
161 1.1 mrg OTI_ashl,
162 1.1 mrg /* Logical shift right */
163 1.1 mrg OTI_lshr,
164 1.1 mrg /* Arithmetic shift right */
165 1.1 mrg OTI_ashr,
166 1.1 mrg /* Rotate left */
167 1.1 mrg OTI_rotl,
168 1.1 mrg /* Rotate right */
169 1.1 mrg OTI_rotr,
170 1.1 mrg
171 1.1 mrg /* Arithmetic shift left of vector by vector */
172 1.1 mrg OTI_vashl,
173 1.1 mrg /* Logical shift right of vector by vector */
174 1.1 mrg OTI_vlshr,
175 1.1 mrg /* Arithmetic shift right of vector by vector */
176 1.1 mrg OTI_vashr,
177 1.1 mrg /* Rotate left of vector by vector */
178 1.1 mrg OTI_vrotl,
179 1.1 mrg /* Rotate right of vector by vector */
180 1.1 mrg OTI_vrotr,
181 1.1 mrg
182 1.1 mrg /* Signed and floating-point minimum value */
183 1.1 mrg OTI_smin,
184 1.1 mrg /* Signed and floating-point maximum value */
185 1.1 mrg OTI_smax,
186 1.1 mrg /* Unsigned minimum value */
187 1.1 mrg OTI_umin,
188 1.1 mrg /* Unsigned maximum value */
189 1.1 mrg OTI_umax,
190 1.1 mrg /* Power */
191 1.1 mrg OTI_pow,
192 1.1 mrg /* Arc tangent of y/x */
193 1.1 mrg OTI_atan2,
194 1.1 mrg
195 1.1 mrg /* Move instruction. */
196 1.1 mrg OTI_mov,
197 1.1 mrg /* Move, preserving high part of register. */
198 1.1 mrg OTI_movstrict,
199 1.1 mrg /* Move, with a misaligned memory. */
200 1.1 mrg OTI_movmisalign,
201 1.1 mrg /* Nontemporal store. */
202 1.1 mrg OTI_storent,
203 1.1 mrg
204 1.1 mrg /* Unary operations */
205 1.1 mrg /* Negation */
206 1.1 mrg OTI_neg,
207 1.1 mrg OTI_negv,
208 1.1 mrg /* Abs value */
209 1.1 mrg OTI_abs,
210 1.1 mrg OTI_absv,
211 1.1 mrg /* Byteswap */
212 1.1 mrg OTI_bswap,
213 1.1 mrg /* Bitwise not */
214 1.1 mrg OTI_one_cmpl,
215 1.1 mrg /* Bit scanning and counting */
216 1.1 mrg OTI_ffs,
217 1.1 mrg OTI_clz,
218 1.1 mrg OTI_ctz,
219 1.1 mrg OTI_popcount,
220 1.1 mrg OTI_parity,
221 1.1 mrg /* Square root */
222 1.1 mrg OTI_sqrt,
223 1.1 mrg /* Sine-Cosine */
224 1.1 mrg OTI_sincos,
225 1.1 mrg /* Sine */
226 1.1 mrg OTI_sin,
227 1.1 mrg /* Inverse sine */
228 1.1 mrg OTI_asin,
229 1.1 mrg /* Cosine */
230 1.1 mrg OTI_cos,
231 1.1 mrg /* Inverse cosine */
232 1.1 mrg OTI_acos,
233 1.1 mrg /* Exponential */
234 1.1 mrg OTI_exp,
235 1.1 mrg /* Base-10 Exponential */
236 1.1 mrg OTI_exp10,
237 1.1 mrg /* Base-2 Exponential */
238 1.1 mrg OTI_exp2,
239 1.1 mrg /* Exponential - 1*/
240 1.1 mrg OTI_expm1,
241 1.1 mrg /* Load exponent of a floating point number */
242 1.1 mrg OTI_ldexp,
243 1.1 mrg /* Multiply floating-point number by integral power of radix */
244 1.1 mrg OTI_scalb,
245 1.1 mrg /* Mantissa of a floating-point number */
246 1.1 mrg OTI_significand,
247 1.1 mrg /* Radix-independent exponent */
248 1.1 mrg OTI_logb,
249 1.1 mrg OTI_ilogb,
250 1.1 mrg /* Natural Logarithm */
251 1.1 mrg OTI_log,
252 1.1 mrg /* Base-10 Logarithm */
253 1.1 mrg OTI_log10,
254 1.1 mrg /* Base-2 Logarithm */
255 1.1 mrg OTI_log2,
256 1.1 mrg /* logarithm of 1 plus argument */
257 1.1 mrg OTI_log1p,
258 1.1 mrg /* Rounding functions */
259 1.1 mrg OTI_floor,
260 1.1 mrg OTI_ceil,
261 1.1 mrg OTI_btrunc,
262 1.1 mrg OTI_round,
263 1.1 mrg OTI_nearbyint,
264 1.1 mrg OTI_rint,
265 1.1 mrg /* Tangent */
266 1.1 mrg OTI_tan,
267 1.1 mrg /* Inverse tangent */
268 1.1 mrg OTI_atan,
269 1.1 mrg /* Copy sign */
270 1.1 mrg OTI_copysign,
271 1.1 mrg /* Signbit */
272 1.1 mrg OTI_signbit,
273 1.1 mrg /* Test for infinite value */
274 1.1 mrg OTI_isinf,
275 1.1 mrg
276 1.1 mrg /* Compare insn; two operands. Used only for libcalls. */
277 1.1 mrg OTI_cmp,
278 1.1 mrg OTI_ucmp,
279 1.1 mrg
280 1.1 mrg /* Floating point comparison optabs - used primarily for libfuncs */
281 1.1 mrg OTI_eq,
282 1.1 mrg OTI_ne,
283 1.1 mrg OTI_gt,
284 1.1 mrg OTI_ge,
285 1.1 mrg OTI_lt,
286 1.1 mrg OTI_le,
287 1.1 mrg OTI_unord,
288 1.1 mrg
289 1.1 mrg /* String length */
290 1.1 mrg OTI_strlen,
291 1.1 mrg
292 1.1 mrg /* Combined compare & jump/move/store flags/trap operations. */
293 1.1 mrg OTI_cbranch,
294 1.1 mrg OTI_cmov,
295 1.1 mrg OTI_cstore,
296 1.1 mrg OTI_ctrap,
297 1.1 mrg
298 1.1 mrg /* Push instruction. */
299 1.1 mrg OTI_push,
300 1.1 mrg
301 1.1 mrg /* Conditional add instruction. */
302 1.1 mrg OTI_addcc,
303 1.1 mrg
304 1.1 mrg /* Reduction operations on a vector operand. */
305 1.1 mrg OTI_reduc_smax,
306 1.1 mrg OTI_reduc_umax,
307 1.1 mrg OTI_reduc_smin,
308 1.1 mrg OTI_reduc_umin,
309 1.1 mrg OTI_reduc_splus,
310 1.1 mrg OTI_reduc_uplus,
311 1.1 mrg
312 1.1 mrg /* Summation, with result machine mode one or more wider than args. */
313 1.1 mrg OTI_ssum_widen,
314 1.1 mrg OTI_usum_widen,
315 1.1 mrg
316 1.1 mrg /* Dot product, with result machine mode one or more wider than args. */
317 1.1 mrg OTI_sdot_prod,
318 1.1 mrg OTI_udot_prod,
319 1.1 mrg
320 1.1 mrg /* Set specified field of vector operand. */
321 1.1 mrg OTI_vec_set,
322 1.1 mrg /* Extract specified field of vector operand. */
323 1.1 mrg OTI_vec_extract,
324 1.1 mrg /* Extract even/odd fields of vector operands. */
325 1.1 mrg OTI_vec_extract_even,
326 1.1 mrg OTI_vec_extract_odd,
327 1.1 mrg /* Interleave fields of vector operands. */
328 1.1 mrg OTI_vec_interleave_high,
329 1.1 mrg OTI_vec_interleave_low,
330 1.1 mrg /* Initialize vector operand. */
331 1.1 mrg OTI_vec_init,
332 1.1 mrg /* Whole vector shift. The shift amount is in bits. */
333 1.1 mrg OTI_vec_shl,
334 1.1 mrg OTI_vec_shr,
335 1.1 mrg /* Extract specified elements from vectors, for vector load. */
336 1.1 mrg OTI_vec_realign_load,
337 1.1 mrg /* Widening multiplication.
338 1.1 mrg The high/low part of the resulting vector of products is returned. */
339 1.1 mrg OTI_vec_widen_umult_hi,
340 1.1 mrg OTI_vec_widen_umult_lo,
341 1.1 mrg OTI_vec_widen_smult_hi,
342 1.1 mrg OTI_vec_widen_smult_lo,
343 1.1 mrg /* Extract and widen the high/low part of a vector of signed or
344 1.1 mrg floating point elements. */
345 1.1 mrg OTI_vec_unpacks_hi,
346 1.1 mrg OTI_vec_unpacks_lo,
347 1.1 mrg /* Extract and widen the high/low part of a vector of unsigned
348 1.1 mrg elements. */
349 1.1 mrg OTI_vec_unpacku_hi,
350 1.1 mrg OTI_vec_unpacku_lo,
351 1.1 mrg
352 1.1 mrg /* Extract, convert to floating point and widen the high/low part of
353 1.1 mrg a vector of signed or unsigned integer elements. */
354 1.1 mrg OTI_vec_unpacks_float_hi,
355 1.1 mrg OTI_vec_unpacks_float_lo,
356 1.1 mrg OTI_vec_unpacku_float_hi,
357 1.1 mrg OTI_vec_unpacku_float_lo,
358 1.1 mrg
359 1.1 mrg /* Narrow (demote) and merge the elements of two vectors. */
360 1.1 mrg OTI_vec_pack_trunc,
361 1.1 mrg OTI_vec_pack_usat,
362 1.1 mrg OTI_vec_pack_ssat,
363 1.1 mrg
364 1.1 mrg /* Convert to signed/unsigned integer, narrow and merge elements
365 1.1 mrg of two vectors of floating point elements. */
366 1.1 mrg OTI_vec_pack_sfix_trunc,
367 1.1 mrg OTI_vec_pack_ufix_trunc,
368 1.1 mrg
369 1.1 mrg /* Perform a raise to the power of integer. */
370 1.1 mrg OTI_powi,
371 1.1 mrg
372 1.1 mrg OTI_MAX
373 1.1 mrg };
374 1.1 mrg
375 1.1 mrg extern struct optab_d optab_table[OTI_MAX];
376 1.1 mrg
377 1.1 mrg #define ssadd_optab (&optab_table[OTI_ssadd])
378 1.1 mrg #define usadd_optab (&optab_table[OTI_usadd])
379 1.1 mrg #define sssub_optab (&optab_table[OTI_sssub])
380 1.1 mrg #define ussub_optab (&optab_table[OTI_ussub])
381 1.1 mrg #define ssmul_optab (&optab_table[OTI_ssmul])
382 1.1 mrg #define usmul_optab (&optab_table[OTI_usmul])
383 1.1 mrg #define ssdiv_optab (&optab_table[OTI_ssdiv])
384 1.1 mrg #define usdiv_optab (&optab_table[OTI_usdiv])
385 1.1 mrg #define ssneg_optab (&optab_table[OTI_ssneg])
386 1.1 mrg #define usneg_optab (&optab_table[OTI_usneg])
387 1.1 mrg #define ssashl_optab (&optab_table[OTI_ssashl])
388 1.1 mrg #define usashl_optab (&optab_table[OTI_usashl])
389 1.1 mrg
390 1.1 mrg #define add_optab (&optab_table[OTI_add])
391 1.1 mrg #define sub_optab (&optab_table[OTI_sub])
392 1.1 mrg #define smul_optab (&optab_table[OTI_smul])
393 1.1 mrg #define addv_optab (&optab_table[OTI_addv])
394 1.1 mrg #define subv_optab (&optab_table[OTI_subv])
395 1.1 mrg #define smul_highpart_optab (&optab_table[OTI_smul_highpart])
396 1.1 mrg #define umul_highpart_optab (&optab_table[OTI_umul_highpart])
397 1.1 mrg #define smul_widen_optab (&optab_table[OTI_smul_widen])
398 1.1 mrg #define umul_widen_optab (&optab_table[OTI_umul_widen])
399 1.1 mrg #define usmul_widen_optab (&optab_table[OTI_usmul_widen])
400 1.1 mrg #define smadd_widen_optab (&optab_table[OTI_smadd_widen])
401 1.1 mrg #define umadd_widen_optab (&optab_table[OTI_umadd_widen])
402 1.1 mrg #define ssmadd_widen_optab (&optab_table[OTI_ssmadd_widen])
403 1.1 mrg #define usmadd_widen_optab (&optab_table[OTI_usmadd_widen])
404 1.1 mrg #define smsub_widen_optab (&optab_table[OTI_smsub_widen])
405 1.1 mrg #define umsub_widen_optab (&optab_table[OTI_umsub_widen])
406 1.1 mrg #define ssmsub_widen_optab (&optab_table[OTI_ssmsub_widen])
407 1.1 mrg #define usmsub_widen_optab (&optab_table[OTI_usmsub_widen])
408 1.1 mrg #define sdiv_optab (&optab_table[OTI_sdiv])
409 1.1 mrg #define smulv_optab (&optab_table[OTI_smulv])
410 1.1 mrg #define sdivv_optab (&optab_table[OTI_sdivv])
411 1.1 mrg #define sdivmod_optab (&optab_table[OTI_sdivmod])
412 1.1 mrg #define udiv_optab (&optab_table[OTI_udiv])
413 1.1 mrg #define udivmod_optab (&optab_table[OTI_udivmod])
414 1.1 mrg #define smod_optab (&optab_table[OTI_smod])
415 1.1 mrg #define umod_optab (&optab_table[OTI_umod])
416 1.1 mrg #define fmod_optab (&optab_table[OTI_fmod])
417 1.1 mrg #define remainder_optab (&optab_table[OTI_remainder])
418 1.1 mrg #define ftrunc_optab (&optab_table[OTI_ftrunc])
419 1.1 mrg #define and_optab (&optab_table[OTI_and])
420 1.1 mrg #define ior_optab (&optab_table[OTI_ior])
421 1.1 mrg #define xor_optab (&optab_table[OTI_xor])
422 1.1 mrg #define ashl_optab (&optab_table[OTI_ashl])
423 1.1 mrg #define lshr_optab (&optab_table[OTI_lshr])
424 1.1 mrg #define ashr_optab (&optab_table[OTI_ashr])
425 1.1 mrg #define rotl_optab (&optab_table[OTI_rotl])
426 1.1 mrg #define rotr_optab (&optab_table[OTI_rotr])
427 1.1 mrg #define vashl_optab (&optab_table[OTI_vashl])
428 1.1 mrg #define vlshr_optab (&optab_table[OTI_vlshr])
429 1.1 mrg #define vashr_optab (&optab_table[OTI_vashr])
430 1.1 mrg #define vrotl_optab (&optab_table[OTI_vrotl])
431 1.1 mrg #define vrotr_optab (&optab_table[OTI_vrotr])
432 1.1 mrg #define smin_optab (&optab_table[OTI_smin])
433 1.1 mrg #define smax_optab (&optab_table[OTI_smax])
434 1.1 mrg #define umin_optab (&optab_table[OTI_umin])
435 1.1 mrg #define umax_optab (&optab_table[OTI_umax])
436 1.1 mrg #define pow_optab (&optab_table[OTI_pow])
437 1.1 mrg #define atan2_optab (&optab_table[OTI_atan2])
438 1.1 mrg
439 1.1 mrg #define mov_optab (&optab_table[OTI_mov])
440 1.1 mrg #define movstrict_optab (&optab_table[OTI_movstrict])
441 1.1 mrg #define movmisalign_optab (&optab_table[OTI_movmisalign])
442 1.1 mrg #define storent_optab (&optab_table[OTI_storent])
443 1.1 mrg
444 1.1 mrg #define neg_optab (&optab_table[OTI_neg])
445 1.1 mrg #define negv_optab (&optab_table[OTI_negv])
446 1.1 mrg #define abs_optab (&optab_table[OTI_abs])
447 1.1 mrg #define absv_optab (&optab_table[OTI_absv])
448 1.1 mrg #define one_cmpl_optab (&optab_table[OTI_one_cmpl])
449 1.1 mrg #define bswap_optab (&optab_table[OTI_bswap])
450 1.1 mrg #define ffs_optab (&optab_table[OTI_ffs])
451 1.1 mrg #define clz_optab (&optab_table[OTI_clz])
452 1.1 mrg #define ctz_optab (&optab_table[OTI_ctz])
453 1.1 mrg #define popcount_optab (&optab_table[OTI_popcount])
454 1.1 mrg #define parity_optab (&optab_table[OTI_parity])
455 1.1 mrg #define sqrt_optab (&optab_table[OTI_sqrt])
456 1.1 mrg #define sincos_optab (&optab_table[OTI_sincos])
457 1.1 mrg #define sin_optab (&optab_table[OTI_sin])
458 1.1 mrg #define asin_optab (&optab_table[OTI_asin])
459 1.1 mrg #define cos_optab (&optab_table[OTI_cos])
460 1.1 mrg #define acos_optab (&optab_table[OTI_acos])
461 1.1 mrg #define exp_optab (&optab_table[OTI_exp])
462 1.1 mrg #define exp10_optab (&optab_table[OTI_exp10])
463 1.1 mrg #define exp2_optab (&optab_table[OTI_exp2])
464 1.1 mrg #define expm1_optab (&optab_table[OTI_expm1])
465 1.1 mrg #define ldexp_optab (&optab_table[OTI_ldexp])
466 1.1 mrg #define scalb_optab (&optab_table[OTI_scalb])
467 1.1 mrg #define significand_optab (&optab_table[OTI_significand])
468 1.1 mrg #define logb_optab (&optab_table[OTI_logb])
469 1.1 mrg #define ilogb_optab (&optab_table[OTI_ilogb])
470 1.1 mrg #define log_optab (&optab_table[OTI_log])
471 1.1 mrg #define log10_optab (&optab_table[OTI_log10])
472 1.1 mrg #define log2_optab (&optab_table[OTI_log2])
473 1.1 mrg #define log1p_optab (&optab_table[OTI_log1p])
474 1.1 mrg #define floor_optab (&optab_table[OTI_floor])
475 1.1 mrg #define ceil_optab (&optab_table[OTI_ceil])
476 1.1 mrg #define btrunc_optab (&optab_table[OTI_btrunc])
477 1.1 mrg #define round_optab (&optab_table[OTI_round])
478 1.1 mrg #define nearbyint_optab (&optab_table[OTI_nearbyint])
479 1.1 mrg #define rint_optab (&optab_table[OTI_rint])
480 1.1 mrg #define tan_optab (&optab_table[OTI_tan])
481 1.1 mrg #define atan_optab (&optab_table[OTI_atan])
482 1.1 mrg #define copysign_optab (&optab_table[OTI_copysign])
483 1.1 mrg #define signbit_optab (&optab_table[OTI_signbit])
484 1.1 mrg #define isinf_optab (&optab_table[OTI_isinf])
485 1.1 mrg
486 1.1 mrg #define cmp_optab (&optab_table[OTI_cmp])
487 1.1 mrg #define ucmp_optab (&optab_table[OTI_ucmp])
488 1.1 mrg
489 1.1 mrg #define eq_optab (&optab_table[OTI_eq])
490 1.1 mrg #define ne_optab (&optab_table[OTI_ne])
491 1.1 mrg #define gt_optab (&optab_table[OTI_gt])
492 1.1 mrg #define ge_optab (&optab_table[OTI_ge])
493 1.1 mrg #define lt_optab (&optab_table[OTI_lt])
494 1.1 mrg #define le_optab (&optab_table[OTI_le])
495 1.1 mrg #define unord_optab (&optab_table[OTI_unord])
496 1.1 mrg
497 1.1 mrg #define strlen_optab (&optab_table[OTI_strlen])
498 1.1 mrg
499 1.1 mrg #define cbranch_optab (&optab_table[OTI_cbranch])
500 1.1 mrg #define cmov_optab (&optab_table[OTI_cmov])
501 1.1 mrg #define cstore_optab (&optab_table[OTI_cstore])
502 1.1 mrg #define ctrap_optab (&optab_table[OTI_ctrap])
503 1.1 mrg
504 1.1 mrg #define push_optab (&optab_table[OTI_push])
505 1.1 mrg #define addcc_optab (&optab_table[OTI_addcc])
506 1.1 mrg
507 1.1 mrg #define reduc_smax_optab (&optab_table[OTI_reduc_smax])
508 1.1 mrg #define reduc_umax_optab (&optab_table[OTI_reduc_umax])
509 1.1 mrg #define reduc_smin_optab (&optab_table[OTI_reduc_smin])
510 1.1 mrg #define reduc_umin_optab (&optab_table[OTI_reduc_umin])
511 1.1 mrg #define reduc_splus_optab (&optab_table[OTI_reduc_splus])
512 1.1 mrg #define reduc_uplus_optab (&optab_table[OTI_reduc_uplus])
513 1.1 mrg
514 1.1 mrg #define ssum_widen_optab (&optab_table[OTI_ssum_widen])
515 1.1 mrg #define usum_widen_optab (&optab_table[OTI_usum_widen])
516 1.1 mrg #define sdot_prod_optab (&optab_table[OTI_sdot_prod])
517 1.1 mrg #define udot_prod_optab (&optab_table[OTI_udot_prod])
518 1.1 mrg
519 1.1 mrg #define vec_set_optab (&optab_table[OTI_vec_set])
520 1.1 mrg #define vec_extract_optab (&optab_table[OTI_vec_extract])
521 1.1 mrg #define vec_extract_even_optab (&optab_table[OTI_vec_extract_even])
522 1.1 mrg #define vec_extract_odd_optab (&optab_table[OTI_vec_extract_odd])
523 1.1 mrg #define vec_interleave_high_optab (&optab_table[OTI_vec_interleave_high])
524 1.1 mrg #define vec_interleave_low_optab (&optab_table[OTI_vec_interleave_low])
525 1.1 mrg #define vec_init_optab (&optab_table[OTI_vec_init])
526 1.1 mrg #define vec_shl_optab (&optab_table[OTI_vec_shl])
527 1.1 mrg #define vec_shr_optab (&optab_table[OTI_vec_shr])
528 1.1 mrg #define vec_realign_load_optab (&optab_table[OTI_vec_realign_load])
529 1.1 mrg #define vec_widen_umult_hi_optab (&optab_table[OTI_vec_widen_umult_hi])
530 1.1 mrg #define vec_widen_umult_lo_optab (&optab_table[OTI_vec_widen_umult_lo])
531 1.1 mrg #define vec_widen_smult_hi_optab (&optab_table[OTI_vec_widen_smult_hi])
532 1.1 mrg #define vec_widen_smult_lo_optab (&optab_table[OTI_vec_widen_smult_lo])
533 1.1 mrg #define vec_unpacks_hi_optab (&optab_table[OTI_vec_unpacks_hi])
534 1.1 mrg #define vec_unpacks_lo_optab (&optab_table[OTI_vec_unpacks_lo])
535 1.1 mrg #define vec_unpacku_hi_optab (&optab_table[OTI_vec_unpacku_hi])
536 1.1 mrg #define vec_unpacku_lo_optab (&optab_table[OTI_vec_unpacku_lo])
537 1.1 mrg #define vec_unpacks_float_hi_optab (&optab_table[OTI_vec_unpacks_float_hi])
538 1.1 mrg #define vec_unpacks_float_lo_optab (&optab_table[OTI_vec_unpacks_float_lo])
539 1.1 mrg #define vec_unpacku_float_hi_optab (&optab_table[OTI_vec_unpacku_float_hi])
540 1.1 mrg #define vec_unpacku_float_lo_optab (&optab_table[OTI_vec_unpacku_float_lo])
541 1.1 mrg #define vec_pack_trunc_optab (&optab_table[OTI_vec_pack_trunc])
542 1.1 mrg #define vec_pack_ssat_optab (&optab_table[OTI_vec_pack_ssat])
543 1.1 mrg #define vec_pack_usat_optab (&optab_table[OTI_vec_pack_usat])
544 1.1 mrg #define vec_pack_sfix_trunc_optab (&optab_table[OTI_vec_pack_sfix_trunc])
545 1.1 mrg #define vec_pack_ufix_trunc_optab (&optab_table[OTI_vec_pack_ufix_trunc])
546 1.1 mrg
547 1.1 mrg #define powi_optab (&optab_table[OTI_powi])
548 1.1 mrg
549 1.1 mrg /* Conversion optabs have their own table and indexes. */
550 1.1 mrg enum convert_optab_index
551 1.1 mrg {
552 1.1 mrg COI_sext,
553 1.1 mrg COI_zext,
554 1.1 mrg COI_trunc,
555 1.1 mrg
556 1.1 mrg COI_sfix,
557 1.1 mrg COI_ufix,
558 1.1 mrg
559 1.1 mrg COI_sfixtrunc,
560 1.1 mrg COI_ufixtrunc,
561 1.1 mrg
562 1.1 mrg COI_sfloat,
563 1.1 mrg COI_ufloat,
564 1.1 mrg
565 1.1 mrg COI_lrint,
566 1.1 mrg COI_lround,
567 1.1 mrg COI_lfloor,
568 1.1 mrg COI_lceil,
569 1.1 mrg
570 1.1 mrg COI_fract,
571 1.1 mrg COI_fractuns,
572 1.1 mrg COI_satfract,
573 1.1 mrg COI_satfractuns,
574 1.1 mrg
575 1.1 mrg COI_MAX
576 1.1 mrg };
577 1.1 mrg
578 1.1 mrg extern struct convert_optab_d convert_optab_table[COI_MAX];
579 1.1 mrg
580 1.1 mrg #define sext_optab (&convert_optab_table[COI_sext])
581 1.1 mrg #define zext_optab (&convert_optab_table[COI_zext])
582 1.1 mrg #define trunc_optab (&convert_optab_table[COI_trunc])
583 1.1 mrg #define sfix_optab (&convert_optab_table[COI_sfix])
584 1.1 mrg #define ufix_optab (&convert_optab_table[COI_ufix])
585 1.1 mrg #define sfixtrunc_optab (&convert_optab_table[COI_sfixtrunc])
586 1.1 mrg #define ufixtrunc_optab (&convert_optab_table[COI_ufixtrunc])
587 1.1 mrg #define sfloat_optab (&convert_optab_table[COI_sfloat])
588 1.1 mrg #define ufloat_optab (&convert_optab_table[COI_ufloat])
589 1.1 mrg #define lrint_optab (&convert_optab_table[COI_lrint])
590 1.1 mrg #define lround_optab (&convert_optab_table[COI_lround])
591 1.1 mrg #define lfloor_optab (&convert_optab_table[COI_lfloor])
592 1.1 mrg #define lceil_optab (&convert_optab_table[COI_lceil])
593 1.1 mrg #define fract_optab (&convert_optab_table[COI_fract])
594 1.1 mrg #define fractuns_optab (&convert_optab_table[COI_fractuns])
595 1.1 mrg #define satfract_optab (&convert_optab_table[COI_satfract])
596 1.1 mrg #define satfractuns_optab (&convert_optab_table[COI_satfractuns])
597 1.1 mrg
598 1.1 mrg /* These arrays record the insn_code of insns that may be needed to
599 1.1 mrg perform input and output reloads of special objects. They provide a
600 1.1 mrg place to pass a scratch register. */
601 1.1 mrg extern enum insn_code reload_in_optab[NUM_MACHINE_MODES];
602 1.1 mrg extern enum insn_code reload_out_optab[NUM_MACHINE_MODES];
603 1.1 mrg
604 1.1 mrg /* Contains the optab used for each rtx code. */
605 1.1 mrg extern optab code_to_optab[NUM_RTX_CODE + 1];
606 1.1 mrg
607 1.1 mrg
608 1.1 mrg typedef rtx (*rtxfun) (rtx);
610 1.1 mrg
611 1.1 mrg #ifdef HAVE_conditional_move
612 1.1 mrg /* Indexed by the machine mode, gives the insn code to make a conditional
613 1.1 mrg move insn. */
614 1.1 mrg
615 1.1 mrg extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES];
616 1.1 mrg #endif
617 1.1 mrg
618 1.1 mrg /* Indexed by the machine mode, gives the insn code for vector conditional
619 1.1 mrg operation. */
620 1.1 mrg
621 1.1 mrg extern enum insn_code vcond_gen_code[NUM_MACHINE_MODES];
622 1.1 mrg extern enum insn_code vcondu_gen_code[NUM_MACHINE_MODES];
623 1.1 mrg
624 1.1 mrg /* This array records the insn_code of insns to perform block moves. */
625 1.1 mrg extern enum insn_code movmem_optab[NUM_MACHINE_MODES];
626 1.1 mrg
627 1.1 mrg /* This array records the insn_code of insns to perform block sets. */
628 1.1 mrg extern enum insn_code setmem_optab[NUM_MACHINE_MODES];
629 1.1 mrg
630 1.1 mrg /* These arrays record the insn_code of two different kinds of insns
631 1.1 mrg to perform block compares. */
632 1.1 mrg extern enum insn_code cmpstr_optab[NUM_MACHINE_MODES];
633 1.1 mrg extern enum insn_code cmpstrn_optab[NUM_MACHINE_MODES];
634 1.1 mrg extern enum insn_code cmpmem_optab[NUM_MACHINE_MODES];
635 1.1 mrg
636 1.1 mrg /* Synchronization primitives. This first set is atomic operation for
637 1.1 mrg which we don't care about the resulting value. */
638 1.1 mrg extern enum insn_code sync_add_optab[NUM_MACHINE_MODES];
639 1.1 mrg extern enum insn_code sync_sub_optab[NUM_MACHINE_MODES];
640 1.1 mrg extern enum insn_code sync_ior_optab[NUM_MACHINE_MODES];
641 1.1 mrg extern enum insn_code sync_and_optab[NUM_MACHINE_MODES];
642 1.1 mrg extern enum insn_code sync_xor_optab[NUM_MACHINE_MODES];
643 1.1 mrg extern enum insn_code sync_nand_optab[NUM_MACHINE_MODES];
644 1.1 mrg
645 1.1 mrg /* This second set is atomic operations in which we return the value
646 1.1 mrg that existed in memory before the operation. */
647 1.1 mrg extern enum insn_code sync_old_add_optab[NUM_MACHINE_MODES];
648 1.1 mrg extern enum insn_code sync_old_sub_optab[NUM_MACHINE_MODES];
649 1.1 mrg extern enum insn_code sync_old_ior_optab[NUM_MACHINE_MODES];
650 1.1 mrg extern enum insn_code sync_old_and_optab[NUM_MACHINE_MODES];
651 1.1 mrg extern enum insn_code sync_old_xor_optab[NUM_MACHINE_MODES];
652 1.1 mrg extern enum insn_code sync_old_nand_optab[NUM_MACHINE_MODES];
653 1.1 mrg
654 1.1 mrg /* This third set is atomic operations in which we return the value
655 1.1 mrg that resulted after performing the operation. */
656 1.1 mrg extern enum insn_code sync_new_add_optab[NUM_MACHINE_MODES];
657 1.1 mrg extern enum insn_code sync_new_sub_optab[NUM_MACHINE_MODES];
658 1.1 mrg extern enum insn_code sync_new_ior_optab[NUM_MACHINE_MODES];
659 1.1 mrg extern enum insn_code sync_new_and_optab[NUM_MACHINE_MODES];
660 1.1 mrg extern enum insn_code sync_new_xor_optab[NUM_MACHINE_MODES];
661 1.1 mrg extern enum insn_code sync_new_nand_optab[NUM_MACHINE_MODES];
662 1.1 mrg
663 1.1 mrg /* Atomic compare and swap. */
664 1.1 mrg extern enum insn_code sync_compare_and_swap[NUM_MACHINE_MODES];
665 1.1 mrg
666 1.1 mrg /* Atomic exchange with acquire semantics. */
667 1.1 mrg extern enum insn_code sync_lock_test_and_set[NUM_MACHINE_MODES];
668 1.1 mrg
669 1.1 mrg /* Atomic clear with release semantics. */
670 1.1 mrg extern enum insn_code sync_lock_release[NUM_MACHINE_MODES];
671 1.1 mrg
672 1.1 mrg /* Define functions given in optabs.c. */
673 1.1 mrg
674 1.1 mrg extern rtx expand_widen_pattern_expr (sepops ops, rtx op0, rtx op1, rtx wide_op,
675 1.1 mrg rtx target, int unsignedp);
676 1.1 mrg
677 1.1 mrg extern rtx expand_ternary_op (enum machine_mode mode, optab ternary_optab,
678 1.1 mrg rtx op0, rtx op1, rtx op2, rtx target,
679 1.1 mrg int unsignedp);
680 1.1 mrg
681 1.1 mrg /* Expand a binary operation given optab and rtx operands. */
682 1.1 mrg extern rtx expand_binop (enum machine_mode, optab, rtx, rtx, rtx, int,
683 1.1 mrg enum optab_methods);
684 1.1 mrg
685 1.1 mrg extern bool force_expand_binop (enum machine_mode, optab, rtx, rtx, rtx, int,
686 1.1 mrg enum optab_methods);
687 1.1 mrg
688 1.1 mrg /* Expand a binary operation with both signed and unsigned forms. */
689 1.1 mrg extern rtx sign_expand_binop (enum machine_mode, optab, optab, rtx, rtx,
690 1.1 mrg rtx, int, enum optab_methods);
691 1.1 mrg
692 1.1 mrg /* Generate code to perform an operation on one operand with two results. */
693 1.1 mrg extern int expand_twoval_unop (optab, rtx, rtx, rtx, int);
694 1.1 mrg
695 1.1 mrg /* Generate code to perform an operation on two operands with two results. */
696 1.1 mrg extern int expand_twoval_binop (optab, rtx, rtx, rtx, rtx, int);
697 1.1 mrg
698 1.1 mrg /* Generate code to perform an operation on two operands with two
699 1.1 mrg results, using a library function. */
700 1.1 mrg extern bool expand_twoval_binop_libfunc (optab, rtx, rtx, rtx, rtx,
701 1.1 mrg enum rtx_code);
702 1.1 mrg
703 1.1 mrg /* Expand a unary arithmetic operation given optab rtx operand. */
704 1.1 mrg extern rtx expand_unop (enum machine_mode, optab, rtx, rtx, int);
705 1.1 mrg
706 1.1 mrg /* Expand the absolute value operation. */
707 1.1 mrg extern rtx expand_abs_nojump (enum machine_mode, rtx, rtx, int);
708 1.1 mrg extern rtx expand_abs (enum machine_mode, rtx, rtx, int, int);
709 1.1 mrg
710 1.1 mrg /* Expand the one's complement absolute value operation. */
711 1.1 mrg extern rtx expand_one_cmpl_abs_nojump (enum machine_mode, rtx, rtx);
712 1.1 mrg
713 1.1 mrg /* Expand the copysign operation. */
714 1.1 mrg extern rtx expand_copysign (rtx, rtx, rtx);
715 1.1 mrg
716 1.1 mrg /* Generate an instruction with a given INSN_CODE with an output and
717 1.1 mrg an input. */
718 1.1 mrg extern void emit_unop_insn (int, rtx, rtx, enum rtx_code);
719 1.1 mrg extern bool maybe_emit_unop_insn (int, rtx, rtx, enum rtx_code);
720 1.1 mrg
721 1.1 mrg /* An extra flag to control optab_for_tree_code's behavior. This is needed to
722 1.1 mrg distinguish between machines with a vector shift that takes a scalar for the
723 1.1 mrg shift amount vs. machines that take a vector for the shift amount. */
724 1.1 mrg enum optab_subtype
725 1.1 mrg {
726 1.1 mrg optab_default,
727 1.1 mrg optab_scalar,
728 1.1 mrg optab_vector
729 1.1 mrg };
730 1.1 mrg
731 1.1 mrg /* Return the optab used for computing the given operation on the type given by
732 1.1 mrg the second argument. The third argument distinguishes between the types of
733 1.1 mrg vector shifts and rotates */
734 1.1 mrg extern optab optab_for_tree_code (enum tree_code, const_tree, enum optab_subtype);
735 1.1 mrg
736 1.1 mrg /* The various uses that a comparison can have; used by can_compare_p:
737 1.1 mrg jumps, conditional moves, store flag operations. */
738 1.1 mrg enum can_compare_purpose
739 1.1 mrg {
740 1.1 mrg ccp_jump,
741 1.1 mrg ccp_cmov,
742 1.1 mrg ccp_store_flag
743 1.1 mrg };
744 1.1 mrg
745 1.1 mrg /* Nonzero if a compare of mode MODE can be done straightforwardly
746 1.1 mrg (without splitting it into pieces). */
747 1.1 mrg extern int can_compare_p (enum rtx_code, enum machine_mode,
748 1.1 mrg enum can_compare_purpose);
749 1.1 mrg
750 1.1 mrg /* Return the INSN_CODE to use for an extend operation. */
751 1.1 mrg extern enum insn_code can_extend_p (enum machine_mode, enum machine_mode, int);
752 1.1 mrg
753 1.1 mrg /* Generate the body of an insn to extend Y (with mode MFROM)
754 1.1 mrg into X (with mode MTO). Do zero-extension if UNSIGNEDP is nonzero. */
755 1.1 mrg extern rtx gen_extend_insn (rtx, rtx, enum machine_mode,
756 1.1 mrg enum machine_mode, int);
757 1.1 mrg
758 1.1 mrg /* Call this to reset the function entry for one optab. */
759 1.1 mrg extern void set_optab_libfunc (optab, enum machine_mode, const char *);
760 1.1 mrg extern void set_conv_libfunc (convert_optab, enum machine_mode,
761 1.1 mrg enum machine_mode, const char *);
762 1.1 mrg
763 1.1 mrg /* Generate code for a FIXED_CONVERT_EXPR. */
764 1.1 mrg extern void expand_fixed_convert (rtx, rtx, int, int);
765 1.1 mrg
766 1.1 mrg /* Generate code for a FLOAT_EXPR. */
767 1.1 mrg extern void expand_float (rtx, rtx, int);
768 1.1 mrg
769 1.1 mrg /* Generate code for a FIX_EXPR. */
770 1.1 mrg extern void expand_fix (rtx, rtx, int);
771 1.1 mrg
772 1.1 mrg /* Generate code for float to integral conversion. */
773 1.1 mrg extern bool expand_sfix_optab (rtx, rtx, convert_optab);
774 1.1 mrg
775 1.1 mrg /* Return tree if target supports vector operations for COND_EXPR. */
776 1.1 mrg bool expand_vec_cond_expr_p (tree, enum machine_mode);
777 1.1 mrg
778 1.1 mrg /* Generate code for VEC_COND_EXPR. */
779 1.1 mrg extern rtx expand_vec_cond_expr (tree, tree, tree, tree, rtx);
780 1.1 mrg /* Generate code for VEC_LSHIFT_EXPR and VEC_RSHIFT_EXPR. */
781 1.1 mrg extern rtx expand_vec_shift_expr (sepops, rtx);
782 1.1 mrg
783 1.1 mrg #define optab_handler(optab,mode) (&(optab)->handlers[(int) (mode)])
784 1.1 mrg #define convert_optab_handler(optab,mode,mode2) \
785 1.1 mrg (&(optab)->handlers[(int) (mode)][(int) (mode2)])
786 1.1 mrg
787 1.1 mrg extern rtx optab_libfunc (optab optab, enum machine_mode mode);
788 1.1 mrg extern rtx convert_optab_libfunc (convert_optab optab, enum machine_mode mode1,
789 1.1 mrg enum machine_mode mode2);
790 #endif /* GCC_OPTABS_H */
791