]> gcc.gnu.org Git - gcc.git/blame - gcc/recog.h
invoke.texi ([Wnarrowing]): Update for non-constants in C++11.
[gcc.git] / gcc / recog.h
CommitLineData
64a93ac5 1/* Declarations for interface to insn recognizer and insn-output.c.
23a5b65a 2 Copyright (C) 1987-2014 Free Software Foundation, Inc.
64a93ac5 3
1322177d 4This file is part of GCC.
64a93ac5 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
64a93ac5 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
64a93ac5
CH
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/>. */
64a93ac5 19
e692f276
RH
20#ifndef GCC_RECOG_H
21#define GCC_RECOG_H
22
4cc8d9d2
RS
23/* Random number that should be large enough for all purposes. Also define
24 a type that has at least MAX_RECOG_ALTERNATIVES + 1 bits, with the extra
25 bit giving an invalid value that can be used to mean "uninitialized". */
f62a15e3 26#define MAX_RECOG_ALTERNATIVES 30
4cc8d9d2
RS
27typedef unsigned int alternative_mask;
28
29/* A mask of all alternatives. */
30#define ALL_ALTERNATIVES ((alternative_mask) -1)
31
32/* A mask containing just alternative X. */
33#define ALTERNATIVE_BIT(X) ((alternative_mask) 1 << (X))
f62a15e3 34
0eadeb15
BS
35/* Types of operands. */
36enum op_type {
37 OP_IN,
38 OP_OUT,
39 OP_INOUT
40};
41
f62a15e3
BS
42struct operand_alternative
43{
44 /* Pointer to the beginning of the constraint string for this alternative,
45 for easier access by alternative number. */
9b3142b3 46 const char *constraint;
f62a15e3
BS
47
48 /* The register class valid for this alternative (possibly NO_REGS). */
1145837d 49 ENUM_BITFIELD (reg_class) cl : 16;
f62a15e3
BS
50
51 /* "Badness" of this alternative, computed from number of '?' and '!'
52 characters in the constraint string. */
1145837d 53 unsigned int reject : 16;
f62a15e3
BS
54
55 /* -1 if no matching constraint was found, or an operand number. */
1145837d 56 int matches : 8;
f62a15e3
BS
57 /* The same information, but reversed: -1 if this operand is not
58 matched by any other, or the operand number of the operand that
59 matches this one. */
1145837d 60 int matched : 8;
f62a15e3
BS
61
62 /* Nonzero if '&' was found in the constraint string. */
3c4c42e8 63 unsigned int earlyclobber : 1;
a4edaf83
AK
64 /* Nonzero if TARGET_MEM_CONSTRAINT was found in the constraint
65 string. */
3c4c42e8 66 unsigned int memory_ok : 1;
541f7d56 67 /* Nonzero if 'p' was found in the constraint string. */
3c4c42e8 68 unsigned int is_address : 1;
f62a15e3
BS
69 /* Nonzero if 'X' was found in the constraint string, or if the constraint
70 string for this alternative was empty. */
3c4c42e8 71 unsigned int anything_ok : 1;
1145837d 72
3c4c42e8 73 unsigned int unused : 12;
f62a15e3
BS
74};
75
5efe5dec
RS
76/* Return the class for operand I of alternative ALT, taking matching
77 constraints into account. */
78
79static inline enum reg_class
80alternative_class (const operand_alternative *alt, int i)
81{
82 return alt[i].matches >= 0 ? alt[alt[i].matches].cl : alt[i].cl;
83}
f62a15e3 84
0c20a65f
AJ
85extern void init_recog (void);
86extern void init_recog_no_volatile (void);
0c20a65f 87extern int check_asm_operands (rtx);
eca72963 88extern int asm_operand_ok (rtx, const char *, const char **);
95e88efd
JH
89extern bool validate_change (rtx, rtx *, rtx, bool);
90extern bool validate_unshare_change (rtx, rtx *, rtx, bool);
a52b023a 91extern bool canonicalize_change_group (rtx insn, rtx x);
57ac4c34 92extern int insn_invalid_p (rtx, bool);
7d22e898 93extern int verify_changes (int);
0a634832 94extern void confirm_change_group (void);
0c20a65f
AJ
95extern int apply_change_group (void);
96extern int num_validated_changes (void);
97extern void cancel_changes (int);
98extern int constrain_operands (int);
99extern int constrain_operands_cached (int);
09e881c9
BE
100extern int memory_address_addr_space_p (enum machine_mode, rtx, addr_space_t);
101#define memory_address_p(mode,addr) \
102 memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC)
103extern int strict_memory_address_addr_space_p (enum machine_mode, rtx,
104 addr_space_t);
105#define strict_memory_address_p(mode,addr) \
106 strict_memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC)
7acf4da6 107extern int validate_replace_rtx_subexp (rtx, rtx, rtx, rtx *);
0c20a65f 108extern int validate_replace_rtx (rtx, rtx, rtx);
e855c69d
AB
109extern int validate_replace_rtx_part (rtx, rtx, rtx *, rtx);
110extern int validate_replace_rtx_part_nosimplify (rtx, rtx, rtx *, rtx);
0c20a65f 111extern void validate_replace_rtx_group (rtx, rtx, rtx);
0c20a65f 112extern void validate_replace_src_group (rtx, rtx, rtx);
8cd37d0b 113extern bool validate_simplify_insn (rtx insn);
0c20a65f 114extern int num_changes_pending (void);
523bb0ba 115#ifdef HAVE_cc0
0c20a65f 116extern int next_insn_tests_no_inequality (rtx);
523bb0ba 117#endif
abd26bfb 118extern bool reg_fits_class_p (const_rtx, reg_class_t, int, enum machine_mode);
0c20a65f 119
0c20a65f
AJ
120extern int offsettable_memref_p (rtx);
121extern int offsettable_nonstrict_memref_p (rtx);
09e881c9
BE
122extern int offsettable_address_addr_space_p (int, enum machine_mode, rtx,
123 addr_space_t);
124#define offsettable_address_p(strict,mode,addr) \
125 offsettable_address_addr_space_p ((strict), (mode), (addr), \
126 ADDR_SPACE_GENERIC)
5bfed9a9 127extern bool mode_dependent_address_p (rtx, addr_space_t);
0c20a65f
AJ
128
129extern int recog (rtx, rtx, int *);
9fcdd891 130#ifndef GENERATOR_FILE
f5523e6d 131static inline int recog_memoized (rtx insn);
9fcdd891 132#endif
0c20a65f
AJ
133extern void add_clobbers (rtx, int);
134extern int added_clobbers_hard_reg_p (int);
135extern void insn_extract (rtx);
136extern void extract_insn (rtx);
137extern void extract_constrain_insn_cached (rtx);
138extern void extract_insn_cached (rtx);
1145837d
RS
139extern void preprocess_constraints (int, int, const char **,
140 operand_alternative *);
141extern const operand_alternative *preprocess_insn_constraints (int);
142extern void preprocess_constraints (rtx);
0c20a65f
AJ
143extern rtx peep2_next_insn (int);
144extern int peep2_regno_dead_p (int, int);
145extern int peep2_reg_dead_p (int, rtx);
23280139 146#ifdef CLEAR_HARD_REG_SET
0c20a65f
AJ
147extern rtx peep2_find_free_register (int, int, const char *,
148 enum machine_mode, HARD_REG_SET *);
23280139 149#endif
0c20a65f 150extern rtx peephole2_insns (rtx, rtx, int *);
64a93ac5 151
0c20a65f
AJ
152extern int store_data_bypass_p (rtx, rtx);
153extern int if_test_bypass_p (rtx, rtx);
b37c2614 154
9fcdd891 155#ifndef GENERATOR_FILE
f5523e6d
MA
156/* Try recognizing the instruction INSN,
157 and return the code number that results.
158 Remember the code so that repeated calls do not
159 need to spend the time for actual rerecognition.
160
161 This function is the normal interface to instruction recognition.
162 The automatically-generated function `recog' is normally called
425de739 163 through this one. */
f5523e6d
MA
164
165static inline int
166recog_memoized (rtx insn)
167{
168 if (INSN_CODE (insn) < 0)
169 INSN_CODE (insn) = recog (PATTERN (insn), insn, 0);
170 return INSN_CODE (insn);
171}
9fcdd891 172#endif
f5523e6d 173
7ac28727
AK
174/* Skip chars until the next ',' or the end of the string. This is
175 useful to skip alternatives in a constraint string. */
176static inline const char *
177skip_alternative (const char *p)
178{
179 const char *r = p;
180 while (*r != '\0' && *r != ',')
181 r++;
182 if (*r == ',')
183 r++;
184 return r;
185}
186
64a93ac5 187/* Nonzero means volatile operands are recognized. */
64a93ac5
CH
188extern int volatile_ok;
189
0a578fee
BS
190/* Set by constrain_operands to the number of the alternative that
191 matched. */
192extern int which_alternative;
193
64a93ac5
CH
194/* The following vectors hold the results from insn_extract. */
195
8da2e059 196struct recog_data_d
1ccbefce
RH
197{
198 /* It is very tempting to make the 5 operand related arrays into a
199 structure and index on that. However, to be source compatible
200 with all of the existing md file insn constraints and output
201 templates, we need `operand' as a flat array. Without that
202 member, making an array for the rest seems pointless. */
64a93ac5 203
1ccbefce
RH
204 /* Gives value of operand N. */
205 rtx operand[MAX_RECOG_OPERANDS];
64a93ac5 206
1ccbefce
RH
207 /* Gives location where operand N was found. */
208 rtx *operand_loc[MAX_RECOG_OPERANDS];
64a93ac5 209
1ccbefce
RH
210 /* Gives the constraint string for operand N. */
211 const char *constraints[MAX_RECOG_OPERANDS];
64a93ac5 212
6ddfdb0f
BS
213 /* Nonzero if operand N is a match_operator or a match_parallel. */
214 char is_operator[MAX_RECOG_OPERANDS];
215
1ccbefce
RH
216 /* Gives the mode of operand N. */
217 enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
0a578fee 218
1ccbefce
RH
219 /* Gives the type (in, out, inout) for operand N. */
220 enum op_type operand_type[MAX_RECOG_OPERANDS];
0a578fee 221
1ccbefce
RH
222 /* Gives location where the Nth duplicate-appearance of an operand
223 was found. This is something that matched MATCH_DUP. */
224 rtx *dup_loc[MAX_DUP_OPERANDS];
0a578fee 225
1ccbefce
RH
226 /* Gives the operand number that was duplicated in the Nth
227 duplicate-appearance of an operand. */
88e6fdcb 228 char dup_num[MAX_DUP_OPERANDS];
0a578fee 229
88e6fdcb 230 /* ??? Note that these are `char' instead of `unsigned char' to (try to)
0c20a65f 231 avoid certain lossage from K&R C, wherein `unsigned char' default
88e6fdcb
RH
232 promotes to `unsigned int' instead of `int' as in ISO C. As of 1999,
233 the most common places to bootstrap from K&R C are SunOS and HPUX,
234 both of which have signed characters by default. The only other
235 supported natives that have both K&R C and unsigned characters are
236 ROMP and Irix 3, and neither have been seen for a while, but do
237 continue to consider unsignedness when performing arithmetic inside
238 a comparison. */
239
1ccbefce 240 /* The number of operands of the insn. */
88e6fdcb 241 char n_operands;
0a578fee 242
1ccbefce 243 /* The number of MATCH_DUPs in the insn. */
88e6fdcb 244 char n_dups;
0eadeb15 245
1ccbefce 246 /* The number of alternatives in the constraints for the insn. */
88e6fdcb 247 char n_alternatives;
d90ffc8d 248
54f044eb
JJ
249 /* True if insn is ASM_OPERANDS. */
250 bool is_asm;
251
4cc8d9d2
RS
252 /* Specifies whether an insn alternative is enabled using the `enabled'
253 attribute in the insn pattern definition. For back ends not using
254 the `enabled' attribute the bits are always set to 1 in expand_insn.
255 Bits beyond the last alternative are also set to 1. */
256 alternative_mask enabled_alternatives;
7ac28727 257
d90ffc8d
JH
258 /* In case we are caching, hold insn data was generated for. */
259 rtx insn;
1ccbefce
RH
260};
261
8da2e059 262extern struct recog_data_d recog_data;
0a578fee 263
1145837d 264extern const operand_alternative *recog_op_alt;
29d70a0f
RS
265
266/* Return a pointer to an array in which index OP describes the constraints
267 on operand OP of the current instruction alternative (which_alternative).
268 Only valid after calling preprocess_constraints and constrain_operands. */
269
5efe5dec 270inline static const operand_alternative *
29d70a0f
RS
271which_op_alt ()
272{
273 gcc_checking_assert (IN_RANGE (which_alternative, 0,
274 recog_data.n_alternatives - 1));
275 return &recog_op_alt[which_alternative * recog_data.n_operands];
276}
f62a15e3 277
a995e389 278/* A table defined in insn-output.c that give information about
64a93ac5
CH
279 each insn-code value. */
280
0c20a65f
AJ
281typedef int (*insn_operand_predicate_fn) (rtx, enum machine_mode);
282typedef const char * (*insn_output_fn) (rtx *, rtx);
eb923e54
OE
283
284struct insn_gen_fn
285{
286 typedef rtx (*f0) (void);
287 typedef rtx (*f1) (rtx);
288 typedef rtx (*f2) (rtx, rtx);
289 typedef rtx (*f3) (rtx, rtx, rtx);
290 typedef rtx (*f4) (rtx, rtx, rtx, rtx);
291 typedef rtx (*f5) (rtx, rtx, rtx, rtx, rtx);
292 typedef rtx (*f6) (rtx, rtx, rtx, rtx, rtx, rtx);
293 typedef rtx (*f7) (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
294 typedef rtx (*f8) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
295 typedef rtx (*f9) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
296 typedef rtx (*f10) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
297 typedef rtx (*f11) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
298 typedef rtx (*f12) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
299 typedef rtx (*f13) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
300 typedef rtx (*f14) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
301 typedef rtx (*f15) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
302 typedef rtx (*f16) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
303
304 typedef f0 stored_funcptr;
305
306 rtx operator () (void) const { return ((f0)func) (); }
307 rtx operator () (rtx a0) const { return ((f1)func) (a0); }
308 rtx operator () (rtx a0, rtx a1) const { return ((f2)func) (a0, a1); }
309 rtx operator () (rtx a0, rtx a1, rtx a2) const { return ((f3)func) (a0, a1, a2); }
310 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3) const { return ((f4)func) (a0, a1, a2, a3); }
311 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4) const { return ((f5)func) (a0, a1, a2, a3, a4); }
312 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5) const { return ((f6)func) (a0, a1, a2, a3, a4, a5); }
313 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6) const { return ((f7)func) (a0, a1, a2, a3, a4, a5, a6); }
314 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7) const { return ((f8)func) (a0, a1, a2, a3, a4, a5, a6, a7); }
315 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8) const { return ((f9)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8); }
316 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9) const { return ((f10)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); }
317 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10) const { return ((f11)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); }
318 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11) const { return ((f12)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); }
319 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12) const { return ((f13)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); }
320 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12, rtx a13) const { return ((f14)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); }
321 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12, rtx a13, rtx a14) const { return ((f15)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); }
322 rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12, rtx a13, rtx a14, rtx a15) const { return ((f16)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); }
323
324 // This is for compatibility of code that invokes functions like
325 // (*funcptr) (arg)
326 insn_gen_fn operator * (void) const { return *this; }
327
328 // The wrapped function pointer must be public and there must not be any
329 // constructors. Otherwise the insn_data_d struct initializers generated
330 // by genoutput.c will result in static initializer functions, which defeats
331 // the purpose of the generated insn_data_d array.
332 stored_funcptr func;
333};
64a93ac5 334
a995e389
RH
335struct insn_operand_data
336{
8b60264b 337 const insn_operand_predicate_fn predicate;
64a93ac5 338
8b60264b 339 const char *const constraint;
64a93ac5 340
7e7c843f 341 ENUM_BITFIELD(machine_mode) const mode : 16;
a995e389 342
8b60264b 343 const char strict_low;
dfac187e 344
6ddfdb0f
BS
345 const char is_operator;
346
8b60264b 347 const char eliminable;
4fd3a105
RS
348
349 const char allows_mem;
a995e389 350};
64a93ac5 351
4bbf910e
RH
352/* Legal values for insn_data.output_format. Indicate what type of data
353 is stored in insn_data.output. */
354#define INSN_OUTPUT_FORMAT_NONE 0 /* abort */
355#define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */
356#define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */
357#define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */
358
f12c802a 359struct insn_data_d
a995e389 360{
8b60264b 361 const char *const name;
9ca1483b 362#if HAVE_DESIGNATED_UNION_INITIALIZERS
3897f229
JM
363 union {
364 const char *single;
365 const char *const *multi;
366 insn_output_fn function;
367 } output;
368#else
369 struct {
370 const char *single;
371 const char *const *multi;
372 insn_output_fn function;
373 } output;
374#endif
8b60264b
KG
375 const insn_gen_fn genfun;
376 const struct insn_operand_data *const operand;
64a93ac5 377
b29387ee 378 const char n_generator_args;
8b60264b
KG
379 const char n_operands;
380 const char n_dups;
381 const char n_alternatives;
382 const char output_format;
a995e389 383};
64a93ac5 384
f12c802a 385extern const struct insn_data_d insn_data[];
0cd6c85a 386extern int peep2_current_count;
e692f276 387
4cc8d9d2
RS
388#ifndef GENERATOR_FILE
389#include "insn-codes.h"
390
391/* Target-dependent globals. */
392struct target_recog {
393 bool x_initialized;
394 alternative_mask x_enabled_alternatives[LAST_INSN_CODE];
1145837d 395 operand_alternative *x_op_alt[LAST_INSN_CODE];
4cc8d9d2
RS
396};
397
398extern struct target_recog default_target_recog;
399#if SWITCHABLE_TARGET
400extern struct target_recog *this_target_recog;
401#else
402#define this_target_recog (&default_target_recog)
403#endif
404
405alternative_mask get_enabled_alternatives (rtx);
406
407void recog_init ();
408#endif
409
e692f276 410#endif /* GCC_RECOG_H */
This page took 6.840615 seconds and 5 git commands to generate.