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