]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/optabs.h
Add VEC_DUPLICATE_EXPR and associated optab
[thirdparty/gcc.git] / gcc / optabs.h
CommitLineData
e78d8e51 1/* Definitions for code generation pass of GNU compiler.
cbe34bb5 2 Copyright (C) 2001-2017 Free Software Foundation, Inc.
e78d8e51 3
40803cd5 4This file is part of GCC.
e78d8e51 5
40803cd5 6GCC is free software; you can redistribute it and/or modify
e78d8e51 7it under the terms of the GNU General Public License as published by
9dcd6f09 8the Free Software Foundation; either version 3, or (at your option)
e78d8e51
ZW
9any later version.
10
40803cd5 11GCC is distributed in the hope that it will be useful,
e78d8e51
ZW
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
e78d8e51
ZW
19
20#ifndef GCC_OPTABS_H
21#define GCC_OPTABS_H
22
385399a8
RS
23#include "optabs-query.h"
24#include "optabs-libfuncs.h"
e78d8e51 25
b99279f3 26/* Generate code for a widening multiply. */
ef4bddc2 27extern rtx expand_widening_mult (machine_mode, rtx, rtx, rtx, int, optab);
b99279f3 28
a5c7d693
RS
29/* Describes the type of an expand_operand. Each value is associated
30 with a create_*_operand function; see the comments above those
31 functions for details. */
32enum expand_operand_type {
33 EXPAND_FIXED,
34 EXPAND_OUTPUT,
35 EXPAND_INPUT,
36 EXPAND_CONVERT_TO,
37 EXPAND_CONVERT_FROM,
38 EXPAND_ADDRESS,
39 EXPAND_INTEGER
40};
41
42/* Information about an operand for instruction expansion. */
43struct expand_operand {
44 /* The type of operand. */
45 ENUM_BITFIELD (expand_operand_type) type : 8;
46
47 /* True if any conversion should treat VALUE as being unsigned
48 rather than signed. Only meaningful for certain types. */
49 unsigned int unsigned_p : 1;
50
f96bf49a
JW
51 /* Is the target operand. */
52 unsigned int target : 1;
53
a5c7d693 54 /* Unused; available for future use. */
f96bf49a 55 unsigned int unused : 6;
a5c7d693
RS
56
57 /* The mode passed to the convert_*_operand function. It has a
58 type-dependent meaning. */
59 ENUM_BITFIELD (machine_mode) mode : 16;
60
61 /* The value of the operand. */
62 rtx value;
63};
64
65/* Initialize OP with the given fields. Initialise the other fields
66 to their default values. */
67
68static inline void
69create_expand_operand (struct expand_operand *op,
70 enum expand_operand_type type,
ef4bddc2 71 rtx value, machine_mode mode,
a5c7d693
RS
72 bool unsigned_p)
73{
74 op->type = type;
75 op->unsigned_p = unsigned_p;
76 op->unused = 0;
77 op->mode = mode;
78 op->value = value;
79}
80
81/* Make OP describe an operand that must use rtx X, even if X is volatile. */
82
83static inline void
84create_fixed_operand (struct expand_operand *op, rtx x)
85{
86 create_expand_operand (op, EXPAND_FIXED, x, VOIDmode, false);
87}
88
89/* Make OP describe an output operand that must have mode MODE.
90 X, if nonnull, is a suggestion for where the output should be stored.
91 It is OK for VALUE to be inconsistent with MODE, although it will just
92 be ignored in that case. */
93
94static inline void
95create_output_operand (struct expand_operand *op, rtx x,
ef4bddc2 96 machine_mode mode)
a5c7d693
RS
97{
98 create_expand_operand (op, EXPAND_OUTPUT, x, mode, false);
99}
100
101/* Make OP describe an input operand that must have mode MODE and
102 value VALUE; MODE cannot be VOIDmode. The backend may request that
103 VALUE be copied into a different kind of rtx before being passed
104 as an operand. */
105
106static inline void
107create_input_operand (struct expand_operand *op, rtx value,
ef4bddc2 108 machine_mode mode)
a5c7d693
RS
109{
110 create_expand_operand (op, EXPAND_INPUT, value, mode, false);
111}
112
113/* Like create_input_operand, except that VALUE must first be converted
114 to mode MODE. UNSIGNED_P says whether VALUE is unsigned. */
115
116static inline void
117create_convert_operand_to (struct expand_operand *op, rtx value,
ef4bddc2 118 machine_mode mode, bool unsigned_p)
a5c7d693
RS
119{
120 create_expand_operand (op, EXPAND_CONVERT_TO, value, mode, unsigned_p);
121}
122
123/* Make OP describe an input operand that should have the same value
124 as VALUE, after any mode conversion that the backend might request.
125 If VALUE is a CONST_INT, it should be treated as having mode MODE.
126 UNSIGNED_P says whether VALUE is unsigned. */
127
128static inline void
129create_convert_operand_from (struct expand_operand *op, rtx value,
ef4bddc2 130 machine_mode mode, bool unsigned_p)
a5c7d693
RS
131{
132 create_expand_operand (op, EXPAND_CONVERT_FROM, value, mode, unsigned_p);
133}
134
a5c7d693
RS
135
136/* Make OP describe an input Pmode address operand. VALUE is the value
137 of the address, but it may need to be converted to Pmode first. */
138
139static inline void
140create_address_operand (struct expand_operand *op, rtx value)
141{
142 create_expand_operand (op, EXPAND_ADDRESS, value, Pmode, false);
143}
144
145/* Make OP describe an input operand that has value INTVAL and that has
146 no inherent mode. This function should only be used for operands that
147 are always expand-time constants. The backend may request that INTVAL
148 be copied into a different kind of rtx, but it must specify the mode
149 of that rtx if so. */
150
151static inline void
152create_integer_operand (struct expand_operand *op, HOST_WIDE_INT intval)
153{
154 create_expand_operand (op, EXPAND_INTEGER, GEN_INT (intval), VOIDmode, false);
155}
156
02972eaf 157
b0710fe1
AM
158/* Passed to expand_simple_binop and expand_binop to say which options
159 to try to use if the requested operation can't be open-coded on the
160 requisite mode. Either OPTAB_LIB or OPTAB_LIB_WIDEN says try using
161 a library call. Either OPTAB_WIDEN or OPTAB_LIB_WIDEN says try
162 using a wider mode. OPTAB_MUST_WIDEN says try widening and don't
163 try anything else. */
164
165enum optab_methods
166{
167 OPTAB_DIRECT,
168 OPTAB_LIB,
169 OPTAB_WIDEN,
170 OPTAB_LIB_WIDEN,
171 OPTAB_MUST_WIDEN
172};
173
b0710fe1
AM
174extern rtx expand_widen_pattern_expr (struct separate_ops *, rtx , rtx , rtx,
175 rtx, int);
176extern rtx expand_ternary_op (machine_mode mode, optab ternary_optab,
177 rtx op0, rtx op1, rtx op2, rtx target,
178 int unsignedp);
179extern rtx simplify_expand_binop (machine_mode mode, optab binoptab,
180 rtx op0, rtx op1, rtx target, int unsignedp,
181 enum optab_methods methods);
182extern bool force_expand_binop (machine_mode, optab, rtx, rtx, rtx, int,
183 enum optab_methods);
be4c1d4a 184extern rtx expand_vector_broadcast (machine_mode, rtx);
b0710fe1
AM
185
186/* Generate code for a simple binary or unary operation. "Simple" in
187 this case means "can be unambiguously described by a (mode, code)
188 pair and mapped to a single optab." */
189extern rtx expand_simple_binop (machine_mode, enum rtx_code, rtx,
190 rtx, rtx, int, enum optab_methods);
191
192/* Expand a binary operation given optab and rtx operands. */
193extern rtx expand_binop (machine_mode, optab, rtx, rtx, rtx, int,
194 enum optab_methods);
a5c7d693 195
b0710fe1
AM
196/* Expand a binary operation with both signed and unsigned forms. */
197extern rtx sign_expand_binop (machine_mode, optab, optab, rtx, rtx,
198 rtx, int, enum optab_methods);
199
200/* Generate code to perform an operation on one operand with two results. */
201extern int expand_twoval_unop (optab, rtx, rtx, rtx, int);
202
203/* Generate code to perform an operation on two operands with two results. */
204extern int expand_twoval_binop (optab, rtx, rtx, rtx, rtx, int);
205
206/* Generate code to perform an operation on two operands with two
207 results, using a library function. */
208extern bool expand_twoval_binop_libfunc (optab, rtx, rtx, rtx, rtx,
209 enum rtx_code);
210extern rtx expand_simple_unop (machine_mode, enum rtx_code, rtx, rtx,
211 int);
212
213/* Expand a unary arithmetic operation given optab rtx operand. */
214extern rtx expand_unop (machine_mode, optab, rtx, rtx, int);
215
216/* Expand the absolute value operation. */
217extern rtx expand_abs_nojump (machine_mode, rtx, rtx, int);
218extern rtx expand_abs (machine_mode, rtx, rtx, int, int);
219
220/* Expand the one's complement absolute value operation. */
221extern rtx expand_one_cmpl_abs_nojump (machine_mode, rtx, rtx);
222
223/* Expand the copysign operation. */
224extern rtx expand_copysign (rtx, rtx, rtx);
225/* Generate an instruction with a given INSN_CODE with an output and
226 an input. */
227extern bool maybe_emit_unop_insn (enum insn_code, rtx, rtx, enum rtx_code);
228extern void emit_unop_insn (enum insn_code, rtx, rtx, enum rtx_code);
229
230/* Emit code to make a call to a constant function or a library call. */
f087c773 231extern void emit_libcall_block (rtx_insn *, rtx, rtx, rtx);
b0710fe1
AM
232
233/* The various uses that a comparison can have; used by can_compare_p:
234 jumps, conditional moves, store flag operations. */
235enum can_compare_purpose
236{
237 ccp_jump,
238 ccp_cmov,
239 ccp_store_flag
240};
241
242/* Nonzero if a compare of mode MODE can be done straightforwardly
243 (without splitting it into pieces). */
244extern int can_compare_p (enum rtx_code, machine_mode,
245 enum can_compare_purpose);
ef4bddc2
RS
246extern rtx prepare_operand (enum insn_code, rtx, int, machine_mode,
247 machine_mode, int);
b0710fe1
AM
248/* Emit a pair of rtl insns to compare two rtx's and to jump
249 to a label if the comparison is true. */
250extern void emit_cmp_and_jump_insns (rtx, rtx, enum rtx_code, rtx,
357067f2
JH
251 machine_mode, int, rtx,
252 profile_probability prob
253 = profile_probability::uninitialized ());
b0710fe1
AM
254
255/* Generate code to indirectly jump to a location given in the rtx LOC. */
256extern void emit_indirect_jump (rtx);
257
258#include "insn-config.h"
259
260#ifndef GCC_INSN_CONFIG_H
261#error "insn-config.h must be included before optabs.h"
262#endif
263
b0710fe1
AM
264/* Emit a conditional move operation. */
265rtx emit_conditional_move (rtx, enum rtx_code, rtx, rtx, machine_mode,
266 rtx, rtx, machine_mode, int);
267
ce68b5cf
KT
268/* Emit a conditional negate or bitwise complement operation. */
269rtx emit_conditional_neg_or_complement (rtx, rtx_code, machine_mode, rtx,
270 rtx, rtx);
271
b0710fe1
AM
272rtx emit_conditional_add (rtx, enum rtx_code, rtx, rtx, machine_mode,
273 rtx, rtx, machine_mode, int);
274
275/* Create but don't emit one rtl instruction to perform certain operations.
276 Modes must match; operands must meet the operation's predicates.
277 Likewise for subtraction and for just copying. */
e67d1102
RS
278extern rtx_insn *gen_add2_insn (rtx, rtx);
279extern rtx_insn *gen_add3_insn (rtx, rtx, rtx);
b0710fe1 280extern int have_add2_insn (rtx, rtx);
e67d1102 281extern rtx_insn *gen_addptr3_insn (rtx, rtx, rtx);
b0710fe1 282extern int have_addptr3_insn (rtx, rtx, rtx);
e67d1102
RS
283extern rtx_insn *gen_sub2_insn (rtx, rtx);
284extern rtx_insn *gen_sub3_insn (rtx, rtx, rtx);
b0710fe1
AM
285extern int have_sub2_insn (rtx, rtx);
286
b0710fe1
AM
287/* Generate the body of an insn to extend Y (with mode MFROM)
288 into X (with mode MTO). Do zero-extension if UNSIGNEDP is nonzero. */
e67d1102 289extern rtx_insn *gen_extend_insn (rtx, rtx, machine_mode, machine_mode, int);
b0710fe1 290
b0710fe1
AM
291/* Generate code for a FLOAT_EXPR. */
292extern void expand_float (rtx, rtx, int);
293
294/* Generate code for a FIX_EXPR. */
295extern void expand_fix (rtx, rtx, int);
296
297/* Generate code for a FIXED_CONVERT_EXPR. */
298extern void expand_fixed_convert (rtx, rtx, int, int);
299
300/* Generate code for float to integral conversion. */
301extern bool expand_sfix_optab (rtx, rtx, convert_optab);
302
303/* Report whether the machine description contains an insn which can
304 perform the operation described by CODE and MODE. */
305extern int have_insn_for (enum rtx_code, machine_mode);
2ef6ce06 306
b0710fe1 307/* Generate a conditional trap instruction. */
e67d1102 308extern rtx_insn *gen_cond_trap (enum rtx_code, rtx, rtx, rtx);
b0710fe1 309
b0710fe1
AM
310/* Generate code for VEC_PERM_EXPR. */
311extern rtx expand_vec_perm (machine_mode, rtx, rtx, rtx, rtx);
312
42fd8198
IE
313/* Generate code for vector comparison. */
314extern rtx expand_vec_cmp_expr (tree, tree, rtx);
315
b0710fe1
AM
316/* Generate code for VEC_COND_EXPR. */
317extern rtx expand_vec_cond_expr (tree, tree, tree, tree, rtx);
318
b0710fe1
AM
319/* Generate code for MULT_HIGHPART_EXPR. */
320extern rtx expand_mult_highpart (machine_mode, rtx, rtx, rtx, bool);
321
b0710fe1
AM
322extern rtx expand_sync_lock_test_and_set (rtx, rtx, rtx);
323extern rtx expand_atomic_test_and_set (rtx, rtx, enum memmodel);
324extern rtx expand_atomic_exchange (rtx, rtx, rtx, enum memmodel);
325extern bool expand_atomic_compare_and_swap (rtx *, rtx *, rtx, rtx, rtx, bool,
326 enum memmodel, enum memmodel);
327/* Generate memory barriers. */
328extern void expand_mem_thread_fence (enum memmodel);
329extern void expand_mem_signal_fence (enum memmodel);
330
331rtx expand_atomic_load (rtx, rtx, enum memmodel);
332rtx expand_atomic_store (rtx, rtx, enum memmodel, bool);
333rtx expand_atomic_fetch_op (rtx, rtx, rtx, enum rtx_code, enum memmodel,
334 bool);
335
336extern bool insn_operand_matches (enum insn_code icode, unsigned int opno,
337 rtx operand);
338extern bool valid_multiword_target_p (rtx);
339extern void create_convert_operand_from_type (struct expand_operand *op,
340 rtx value, tree type);
341extern bool maybe_legitimize_operands (enum insn_code icode,
342 unsigned int opno, unsigned int nops,
343 struct expand_operand *ops);
1476d1bd
MM
344extern rtx_insn *maybe_gen_insn (enum insn_code icode, unsigned int nops,
345 struct expand_operand *ops);
b0710fe1
AM
346extern bool maybe_expand_insn (enum insn_code icode, unsigned int nops,
347 struct expand_operand *ops);
348extern bool maybe_expand_jump_insn (enum insn_code icode, unsigned int nops,
349 struct expand_operand *ops);
350extern void expand_insn (enum insn_code icode, unsigned int nops,
351 struct expand_operand *ops);
352extern void expand_jump_insn (enum insn_code icode, unsigned int nops,
353 struct expand_operand *ops);
354
2d52a3a1
ZC
355extern enum rtx_code get_rtx_code (enum tree_code tcode, bool unsignedp);
356
e78d8e51 357#endif /* GCC_OPTABS_H */