GCC Middle and Back End API Reference
recog.h
Go to the documentation of this file.
1/* Declarations for interface to insn recognizer and insn-output.cc.
2 Copyright (C) 1987-2024 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
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
8Software Foundation; either version 3, or (at your option) any later
9version.
10
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.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef GCC_RECOG_H
21#define GCC_RECOG_H
22
23/* For enum tree_code ERROR_MARK. */
24#include "tree.h"
25
26/* Random number that should be large enough for all purposes. Also define
27 a type that has at least MAX_RECOG_ALTERNATIVES + 1 bits, with the extra
28 bit giving an invalid value that can be used to mean "uninitialized". */
29#define MAX_RECOG_ALTERNATIVES 35
30typedef uint64_t alternative_mask; /* Keep in sync with genattrtab.cc. */
31
32/* A mask of all alternatives. */
33#define ALL_ALTERNATIVES ((alternative_mask) -1)
34
35/* A mask containing just alternative X. */
36#define ALTERNATIVE_BIT(X) ((alternative_mask) 1 << (X))
37
38/* Types of operands. */
44
45#ifndef GENERATOR_FILE
47{
48 /* Pointer to the beginning of the constraint string for this alternative,
49 for easier access by alternative number. */
50 const char *constraint;
51
52 /* The register class valid for this alternative (possibly NO_REGS). */
53 ENUM_BITFIELD (reg_class) cl : 16;
54
55 /* "Badness" of this alternative, computed from number of '?' and '!'
56 characters in the constraint string. */
57 unsigned int reject : 16;
58
59 /* -1 if no matching constraint was found, or an operand number. */
60 int matches : 8;
61 /* The same information, but reversed: -1 if this operand is not
62 matched by any other, or the operand number of the operand that
63 matches this one. */
64 int matched : 8;
65
66 /* Bit ID is set if the constraint string includes a register constraint with
67 register filter ID. Use test_register_filters (REGISTER_FILTERS, REGNO)
68 to test whether REGNO is a valid start register for the operand. */
69 unsigned int register_filters : MAX (NUM_REGISTER_FILTERS, 1);
70
71 /* Nonzero if '&' was found in the constraint string. */
72 unsigned int earlyclobber : 1;
73 /* Nonzero if TARGET_MEM_CONSTRAINT was found in the constraint
74 string. */
75 unsigned int memory_ok : 1;
76 /* Nonzero if 'p' was found in the constraint string. */
77 unsigned int is_address : 1;
78 /* Nonzero if 'X' was found in the constraint string, or if the constraint
79 string for this alternative was empty. */
80 unsigned int anything_ok : 1;
81};
82
83/* Return the class for operand I of alternative ALT, taking matching
84 constraints into account. */
85
86inline enum reg_class
88{
89 return alt[i].matches >= 0 ? alt[alt[i].matches].cl : alt[i].cl;
90}
91
92/* Return the mask of register filters that should be applied to operand I
93 of alternative ALT, taking matching constraints into account. */
94
95inline unsigned int
97{
98 return (alt[i].matches >= 0
99 ? alt[alt[i].matches].register_filters
100 : alt[i].register_filters);
101}
102#endif
103
104/* A class for substituting one rtx for another within an instruction,
105 or for recursively simplifying the instruction as-is. Derived classes
106 can record or filter certain decisions. */
107
109{
110public:
111 /* Assignments for RESULT_FLAGS.
112
113 UNSIMPLIFIED is true if a substitution has been made inside an rtx
114 X and if neither X nor its parent expressions could be simplified.
115
116 FIRST_SPARE_RESULT is the first flag available for derived classes. */
117 static const uint16_t UNSIMPLIFIED = 1U << 0;
118 static const uint16_t FIRST_SPARE_RESULT = 1U << 1;
119
121 insn_propagation (rtx_insn *, rtx, rtx, bool = true);
122 bool apply_to_pattern (rtx *);
123 bool apply_to_rvalue (rtx *);
124 bool apply_to_note (rtx *);
125
126 /* Return true if we should accept a substitution into the address of
127 memory expression MEM. Undoing changes OLD_NUM_CHANGES and up restores
128 MEM's original address. */
129 virtual bool check_mem (int /*old_num_changes*/,
130 rtx /*mem*/) { return true; }
131
132 /* Note that we've simplified OLD_RTX into NEW_RTX. When substituting,
133 this only happens if a substitution occured within OLD_RTX.
134 Undoing OLD_NUM_CHANGES and up will restore the old form of OLD_RTX.
135 OLD_RESULT_FLAGS is the value that RESULT_FLAGS had before processing
136 OLD_RTX. */
137 virtual void note_simplification (int /*old_num_changes*/,
138 uint16_t /*old_result_flags*/,
139 rtx /*old_rtx*/, rtx /*new_rtx*/) {}
140
141private:
142 bool apply_to_mem_1 (rtx);
143 bool apply_to_lvalue_1 (rtx);
144 bool apply_to_rvalue_1 (rtx *);
145 bool apply_to_pattern_1 (rtx *);
146
147public:
148 /* The instruction that we are simplifying or propagating into. */
150
151 /* If FROM is nonnull, we're replacing FROM with TO, otherwise we're
152 just doing a recursive simplification. */
155
156 /* The number of times that we have replaced FROM with TO. */
157 unsigned int num_replacements;
158
159 /* A bitmask of flags that describe the result of the simplificiation;
160 see above for details. */
161 uint16_t result_flags : 16;
162
163 /* True if we should unshare TO when making the next substitution,
164 false if we can use TO itself. */
165 uint16_t should_unshare : 1;
166
167 /* True if we should call check_mem after substituting into a memory. */
168 uint16_t should_check_mems : 1;
169
170 /* True if we should call note_simplification after each simplification. */
172
173 /* For future expansion. */
174 uint16_t spare : 13;
175
176 /* Gives the reason that a substitution failed, for debug purposes. */
177 const char *failure_reason;
178};
179
180/* Try to replace FROM with TO in INSN. SHARED_P is true if TO is shared
181 with other instructions, false if INSN can use TO directly. */
182
184 bool shared_p)
185 : insn (insn),
186 from (from),
187 to (to),
188 num_replacements (0),
189 result_flags (0),
190 should_unshare (shared_p),
191 should_check_mems (false),
192 should_note_simplifications (false),
193 spare (0),
194 failure_reason (nullptr)
195{
196}
197
198/* Try to simplify INSN without performing a substitution. */
199
204
205/* An RAII class that temporarily undoes part of the current change group.
206 The sequence:
207
208 {
209 ...;
210 undo_recog_changes undo (NUM);
211 STMTS;
212 }
213
214 executes STMTS with all the changes numbered NUM and up temporarily
215 reverted. STMTS must not try to add to the current change group.
216
217 Nested uses are supported, but each nested NUM must be no greater than
218 outer NUMs. */
219
221{
222public:
223 undo_recog_changes (int);
225
226 static bool is_active () { return s_num_changes != 0; }
227
228private:
230
231 static int s_num_changes;
232};
233
234extern void init_recog (void);
235extern void init_recog_no_volatile (void);
236extern bool check_asm_operands (rtx);
237extern int asm_operand_ok (rtx, const char *, const char **);
238extern bool validate_change (rtx, rtx *, rtx, bool);
239extern bool validate_unshare_change (rtx, rtx *, rtx, bool);
240extern bool validate_change_xveclen (rtx, rtx *, int, bool);
241extern bool canonicalize_change_group (rtx_insn *insn, rtx x);
242extern bool insn_invalid_p (rtx_insn *, bool);
243extern bool verify_changes (int);
244extern void confirm_change_group (void);
245extern bool apply_change_group (void);
246extern int num_validated_changes (void);
247extern void cancel_changes (int);
248extern bool constrain_operands (int, alternative_mask);
249extern bool constrain_operands_cached (rtx_insn *, int);
250extern bool memory_address_addr_space_p (machine_mode, rtx, addr_space_t,
251 code_helper = ERROR_MARK);
252#define memory_address_p(mode,addr) \
253 memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC)
254extern bool strict_memory_address_addr_space_p (machine_mode, rtx, addr_space_t,
255 code_helper = ERROR_MARK);
256#define strict_memory_address_p(mode,addr) \
257 strict_memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC)
258extern bool validate_replace_rtx_subexp (rtx, rtx, rtx_insn *, rtx *);
259extern bool validate_replace_rtx (rtx, rtx, rtx_insn *);
260extern bool validate_replace_rtx_part (rtx, rtx, rtx *, rtx_insn *);
264extern bool validate_simplify_insn (rtx_insn *insn);
265extern int num_changes_pending (void);
266extern bool reg_fits_class_p (const_rtx, reg_class_t, int, machine_mode);
267extern bool valid_insn_p (rtx_insn *);
268
269extern bool offsettable_memref_p (rtx);
271extern bool offsettable_address_addr_space_p (int, machine_mode, rtx,
273#define offsettable_address_p(strict,mode,addr) \
274 offsettable_address_addr_space_p ((strict), (mode), (addr), \
275 ADDR_SPACE_GENERIC)
277
278extern int recog (rtx, rtx_insn *, int *);
279#ifndef GENERATOR_FILE
280inline int recog_memoized (rtx_insn *insn);
281#endif
282extern void add_clobbers (rtx, int);
284extern void insn_extract (rtx_insn *);
285extern void extract_insn (rtx_insn *);
286extern void extract_constrain_insn (rtx_insn *insn);
288extern void extract_insn_cached (rtx_insn *);
289#ifndef GENERATOR_FILE
290extern void preprocess_constraints (int, int, const char **,
292extern const operand_alternative *preprocess_insn_constraints (unsigned int);
293#endif
294extern void preprocess_constraints (rtx_insn *);
295extern rtx_insn *peep2_next_insn (int);
296extern bool peep2_regno_dead_p (int, int);
297extern bool peep2_reg_dead_p (int, rtx);
298#ifdef HARD_CONST
299extern rtx peep2_find_free_register (int, int, const char *,
300 machine_mode, HARD_REG_SET *);
301#endif
303
304extern bool store_data_bypass_p (rtx_insn *, rtx_insn *);
305extern bool if_test_bypass_p (rtx_insn *, rtx_insn *);
306
308
309#ifndef GENERATOR_FILE
310/* Try recognizing the instruction INSN,
311 and return the code number that results.
312 Remember the code so that repeated calls do not
313 need to spend the time for actual rerecognition.
314
315 This function is the normal interface to instruction recognition.
316 The automatically-generated function `recog' is normally called
317 through this one. */
318
319inline int
321{
322 if (INSN_CODE (insn) < 0)
323 INSN_CODE (insn) = recog (PATTERN (insn), insn, 0);
324 return INSN_CODE (insn);
325}
326#endif
327
328/* Skip chars until the next ',' or the end of the string. This is
329 useful to skip alternatives in a constraint string. */
330inline const char *
331skip_alternative (const char *p)
332{
333 const char *r = p;
334 while (*r != '\0' && *r != ',')
335 r++;
336 if (*r == ',')
337 r++;
338 return r;
339}
340
341/* Nonzero means volatile operands are recognized. */
342extern int volatile_ok;
343
344/* RAII class for temporarily setting volatile_ok. */
345
360
361/* Set by constrain_operands to the number of the alternative that
362 matched. */
363extern int which_alternative;
364
365/* The following vectors hold the results from insn_extract. */
366
368{
369 /* It is very tempting to make the 5 operand related arrays into a
370 structure and index on that. However, to be source compatible
371 with all of the existing md file insn constraints and output
372 templates, we need `operand' as a flat array. Without that
373 member, making an array for the rest seems pointless. */
374
375 /* Gives value of operand N. */
376 rtx operand[MAX_RECOG_OPERANDS];
377
378 /* Gives location where operand N was found. */
379 rtx *operand_loc[MAX_RECOG_OPERANDS];
380
381 /* Gives the constraint string for operand N. */
382 const char *constraints[MAX_RECOG_OPERANDS];
383
384 /* Nonzero if operand N is a match_operator or a match_parallel. */
385 char is_operator[MAX_RECOG_OPERANDS];
386
387 /* Gives the mode of operand N. */
388 machine_mode operand_mode[MAX_RECOG_OPERANDS];
389
390 /* Gives the type (in, out, inout) for operand N. */
391 enum op_type operand_type[MAX_RECOG_OPERANDS];
392
393 /* Gives location where the Nth duplicate-appearance of an operand
394 was found. This is something that matched MATCH_DUP. */
395 rtx *dup_loc[MAX_DUP_OPERANDS];
396
397 /* Gives the operand number that was duplicated in the Nth
398 duplicate-appearance of an operand. */
399 char dup_num[MAX_DUP_OPERANDS];
400
401 /* ??? Note that these are `char' instead of `unsigned char' to (try to)
402 avoid certain lossage from K&R C, wherein `unsigned char' default
403 promotes to `unsigned int' instead of `int' as in ISO C. As of 1999,
404 the most common places to bootstrap from K&R C are SunOS and HPUX,
405 both of which have signed characters by default. The only other
406 supported natives that have both K&R C and unsigned characters are
407 ROMP and Irix 3, and neither have been seen for a while, but do
408 continue to consider unsignedness when performing arithmetic inside
409 a comparison. */
410
411 /* The number of operands of the insn. */
413
414 /* The number of MATCH_DUPs in the insn. */
415 char n_dups;
416
417 /* The number of alternatives in the constraints for the insn. */
419
420 /* True if insn is ASM_OPERANDS. */
421 bool is_asm;
422
423 /* In case we are caching, hold insn data was generated for. */
425};
426
427extern struct recog_data_d recog_data;
428
429/* RAII class for saving/restoring recog_data. */
430
438
439#ifndef GENERATOR_FILE
441
442/* Return a pointer to an array in which index OP describes the constraints
443 on operand OP of the current instruction alternative (which_alternative).
444 Only valid after calling preprocess_constraints and constrain_operands. */
445
446inline const operand_alternative *
453#endif
454
455/* A table defined in insn-output.cc that give information about
456 each insn-code value. */
457
458typedef bool (*insn_operand_predicate_fn) (rtx, machine_mode);
459typedef const char * (*insn_output_fn) (rtx *, rtx_insn *);
460
462{
463 typedef void (*stored_funcptr) (void);
464
465 template<typename ...Ts>
466 rtx_insn *operator() (Ts... args) const
467 {
468 typedef rtx_insn *(*funcptr) (decltype ((void) args, NULL_RTX)...);
469 return ((funcptr) func) (args...);
470 }
471
472 // This is for compatibility of code that invokes functions like
473 // (*funcptr) (arg)
474 insn_gen_fn operator * (void) const { return *this; }
475
476 // The wrapped function pointer must be public and there must not be any
477 // constructors. Otherwise the insn_data_d struct initializers generated
478 // by genoutput.cc will result in static initializer functions, which defeats
479 // the purpose of the generated insn_data_d array.
481};
482
484{
486
487 const char *const constraint;
488
489 ENUM_BITFIELD(machine_mode) const mode : 16;
490
491 const char strict_low;
492
493 const char is_operator;
494
495 const char eliminable;
496
497 const char allows_mem;
498};
499
500/* Legal values for insn_data.output_format. Indicate what type of data
501 is stored in insn_data.output. */
502#define INSN_OUTPUT_FORMAT_NONE 0 /* abort */
503#define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */
504#define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */
505#define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */
506
508{
509 const char *const name;
510#if HAVE_DESIGNATED_UNION_INITIALIZERS
511 union {
512 const char *single;
513 const char *const *multi;
515 } output;
516#else
517 struct {
518 const char *single;
519 const char *const *multi;
522#endif
524 const struct insn_operand_data *const operand;
525
527 const char n_operands;
528 const char n_dups;
529 const char n_alternatives;
530 const char output_format;
531};
532
533extern const struct insn_data_d insn_data[];
534extern int peep2_current_count;
535
536#ifndef GENERATOR_FILE
537#include "insn-codes.h"
538
539/* An enum of boolean attributes that may only depend on the current
540 subtarget, not on things like operands or compiler phase. */
547
548/* Target-dependent globals. */
554
556#if SWITCHABLE_TARGET
557extern struct target_recog *this_target_recog;
558#else
559#define this_target_recog (&default_target_recog)
560#endif
561
566
567void recog_init ();
568
569/* This RAII class can help to undo tentative insn changes on failure.
570 When an object of the class goes out of scope, it undoes all group
571 changes that have been made via the validate_change machinery and
572 not yet confirmed via confirm_change_group.
573
574 For example:
575
576 insn_change_watermark watermark;
577 validate_change (..., true); // A
578 ...
579 if (test)
580 // Undoes change A.
581 return false;
582 ...
583 validate_change (..., true); // B
584 ...
585 if (test)
586 // Undoes changes A and B.
587 return false;
588 ...
589 confirm_change_group ();
590
591 Code that wants to avoid this behavior can use keep ():
592
593 insn_change_watermark watermark;
594 validate_change (..., true); // A
595 ...
596 if (test)
597 // Undoes change A.
598 return false;
599 ...
600 watermark.keep ();
601 validate_change (..., true); // B
602 ...
603 if (test)
604 // Undoes change B, but not A.
605 return false;
606 ...
607 confirm_change_group (); */
618
624
625#endif
626
627#endif /* GCC_RECOG_H */
Definition tree.h:81
Definition recog.h:609
int m_old_num_changes
Definition recog.h:616
void keep()
Definition recog.h:613
insn_change_watermark()
Definition recog.h:611
~insn_change_watermark()
Definition recog.h:619
Definition recog.h:109
rtx from
Definition recog.h:153
bool apply_to_rvalue(rtx *)
Definition recog.cc:1450
virtual bool check_mem(int, rtx)
Definition recog.h:129
bool apply_to_mem_1(rtx)
Definition recog.cc:1023
rtx_insn * insn
Definition recog.h:149
bool apply_to_rvalue_1(rtx *)
Definition recog.cc:1044
rtx to
Definition recog.h:154
bool apply_to_note(rtx *)
Definition recog.cc:1463
uint16_t result_flags
Definition recog.h:161
unsigned int num_replacements
Definition recog.h:157
static const uint16_t FIRST_SPARE_RESULT
Definition recog.h:118
bool apply_to_lvalue_1(rtx)
Definition recog.cc:1339
static const uint16_t UNSIMPLIFIED
Definition recog.h:117
uint16_t should_check_mems
Definition recog.h:168
bool apply_to_pattern(rtx *)
Definition recog.cc:1437
const char * failure_reason
Definition recog.h:177
uint16_t should_unshare
Definition recog.h:165
uint16_t should_note_simplifications
Definition recog.h:171
bool apply_to_pattern_1(rtx *)
Definition recog.cc:1376
insn_propagation(rtx_insn *)
Definition recog.h:200
uint16_t spare
Definition recog.h:174
virtual void note_simplification(int, uint16_t, rtx, rtx)
Definition recog.h:137
Definition genmatch.cc:1468
Definition recog.h:432
recog_data_saver()
Definition recog.h:435
~recog_data_saver()
Definition recog.h:436
recog_data_d m_saved_data
Definition recog.h:433
Definition rtl.h:3438
Definition recog.h:347
temporary_volatile_ok(const temporary_volatile_ok &)
int save_volatile_ok
Definition recog.h:358
temporary_volatile_ok(int value)
Definition recog.h:349
~temporary_volatile_ok()
Definition recog.h:354
Definition recog.h:221
undo_recog_changes(int)
Definition recog.cc:630
~undo_recog_changes()
Definition recog.cc:639
static int s_num_changes
Definition recog.h:231
static bool is_active()
Definition recog.h:226
int m_old_num_changes
Definition recog.h:229
struct rtx_def * rtx
Definition coretypes.h:57
unsigned char addr_space_t
Definition coretypes.h:184
int reg_class_t
Definition coretypes.h:376
uint64_t alternative_mask
Definition genattrtab.cc:236
vec< const char * > register_filters
Definition gensupport.cc:408
HARD_REG_ELT_TYPE HARD_REG_SET
Definition hard-reg-set.h:47
poly_int< N, C > r
Definition poly-int.h:774
i
Definition poly-int.h:776
rtx peep2_find_free_register(int from, int to, const char *class_str, machine_mode mode, HARD_REG_SET *reg_set)
Definition recog.cc:3720
const struct insn_data_d insn_data[]
int recog_memoized(rtx_insn *insn)
Definition recog.h:320
const operand_alternative * recog_op_alt
Definition recog.cc:78
bool valid_insn_p(rtx_insn *)
Definition recog.cc:1475
bool offsettable_memref_p(rtx)
Definition recog.cc:2474
void extract_constrain_insn_cached(rtx_insn *)
Definition recog.cc:2776
int which_alternative
Definition recog.cc:87
rtx_insn * peephole2_insns(rtx, rtx_insn *, int *)
bool validate_replace_rtx_subexp(rtx, rtx, rtx_insn *, rtx *)
Definition recog.cc:895
bool canonicalize_change_group(rtx_insn *insn, rtx x)
Definition recog.cc:322
op_type
Definition recog.h:39
@ OP_IN
Definition recog.h:40
@ OP_INOUT
Definition recog.h:42
@ OP_OUT
Definition recog.h:41
const operand_alternative * preprocess_insn_constraints(unsigned int)
Definition recog.cc:3032
bool constrain_operands(int, alternative_mask)
Definition recog.cc:3117
bool validate_change_xveclen(rtx, rtx *, int, bool)
Definition recog.cc:311
void cancel_changes(int)
Definition recog.cc:593
alternative_mask get_enabled_alternatives(rtx_insn *)
Definition recog.cc:2696
bool mode_dependent_address_p(rtx, addr_space_t)
Definition recog.cc:2596
bool strict_memory_address_addr_space_p(machine_mode, rtx, addr_space_t, code_helper=ERROR_MARK)
Definition reload.cc:2164
bool if_test_bypass_p(rtx_insn *, rtx_insn *)
Definition recog.cc:4357
bool validate_simplify_insn(rtx_insn *insn)
Definition recog.cc:984
void validate_replace_rtx_group(rtx, rtx, rtx_insn *)
Definition recog.cc:938
void recog_init()
Definition recog.cc:4715
unsigned int alternative_register_filters(const operand_alternative *alt, int i)
Definition recog.h:96
#define this_target_recog
Definition recog.h:559
int asm_operand_ok(rtx, const char *, const char **)
Definition recog.cc:2269
rtx_insn * peep2_next_insn(int)
Definition recog.cc:3663
bool validate_replace_rtx_part(rtx, rtx, rtx *, rtx_insn *)
Definition recog.cc:918
void confirm_change_group(void)
Definition recog.cc:534
const operand_alternative * which_op_alt()
Definition recog.h:447
void extract_constrain_insn(rtx_insn *insn)
Definition recog.cc:2766
enum reg_class alternative_class(const operand_alternative *alt, int i)
Definition recog.h:87
void copy_frame_info_to_split_insn(rtx_insn *, rtx_insn *)
Definition recog.cc:3862
void init_recog(void)
Definition recog.cc:109
bool added_clobbers_hard_reg_p(int)
bool validate_replace_rtx(rtx, rtx, rtx_insn *)
Definition recog.cc:905
bool verify_changes(int)
Definition recog.cc:432
bool validate_replace_rtx_part_nosimplify(rtx, rtx, rtx *, rtx_insn *)
Definition recog.cc:926
bool peep2_reg_dead_p(int, rtx)
Definition recog.cc:3690
int recog(rtx, rtx_insn *, int *)
void validate_replace_src_group(rtx, rtx, rtx_insn *)
Definition recog.cc:969
int num_validated_changes(void)
Definition recog.cc:585
int num_changes_pending(void)
Definition recog.cc:423
bool memory_address_addr_space_p(machine_mode, rtx, addr_space_t, code_helper=ERROR_MARK)
Definition recog.cc:1875
alternative_mask get_preferred_alternatives(rtx_insn *)
Definition recog.cc:2706
bool constrain_operands_cached(rtx_insn *, int)
Definition recog.cc:2787
bool_attr
Definition recog.h:541
@ BA_PREFERRED_FOR_SPEED
Definition recog.h:543
@ BA_PREFERRED_FOR_SIZE
Definition recog.h:544
@ BA_ENABLED
Definition recog.h:542
@ BA_LAST
Definition recog.h:545
bool validate_unshare_change(rtx, rtx *, rtx, bool)
Definition recog.cc:302
bool check_asm_operands(rtx)
Definition recog.cc:138
bool store_data_bypass_p(rtx_insn *, rtx_insn *)
Definition recog.cc:4325
int peep2_current_count
Definition recog.cc:3642
bool insn_invalid_p(rtx_insn *, bool)
Definition recog.cc:358
bool validate_change(rtx, rtx *, rtx, bool)
Definition recog.cc:293
bool offsettable_address_addr_space_p(int, machine_mode, rtx, addr_space_t)
Definition recog.cc:2503
void extract_insn_cached(rtx_insn *)
Definition recog.cc:2754
void extract_insn(rtx_insn *)
Definition recog.cc:2798
struct recog_data_d recog_data
Definition recog.cc:73
void insn_extract(rtx_insn *)
int volatile_ok
Definition recog.cc:71
const char *(* insn_output_fn)(rtx *, rtx_insn *)
Definition recog.h:459
bool offsettable_nonstrict_memref_p(rtx)
Definition recog.cc:2485
bool apply_change_group(void)
Definition recog.cc:567
bool check_bool_attrs(rtx_insn *)
Definition recog.cc:2735
void init_recog_no_volatile(void)
Definition recog.cc:103
bool reg_fits_class_p(const_rtx, reg_class_t, int, machine_mode)
Definition recog.cc:3438
bool peep2_regno_dead_p(int, int)
Definition recog.cc:3676
void preprocess_constraints(int, int, const char **, operand_alternative *, rtx **)
Definition recog.cc:2909
const char * skip_alternative(const char *p)
Definition recog.h:331
void add_clobbers(rtx, int)
bool(* insn_operand_predicate_fn)(rtx, machine_mode)
Definition recog.h:458
struct target_recog default_target_recog
Definition recog.cc:58
#define INSN_CODE(INSN)
Definition rtl.h:1538
#define NULL_RTX
Definition rtl.h:706
rtx PATTERN(const_rtx insn)
Definition rtl.h:1506
Definition basic-block.h:117
Definition recog.h:508
const struct insn_operand_data *const operand
Definition recog.h:524
const char *const * multi
Definition recog.h:519
const char n_alternatives
Definition recog.h:529
const char n_generator_args
Definition recog.h:526
insn_output_fn function
Definition recog.h:520
const char n_operands
Definition recog.h:527
const insn_gen_fn genfun
Definition recog.h:523
const char n_dups
Definition recog.h:528
struct insn_data_d::@56 output
const char *const name
Definition recog.h:509
const char * single
Definition recog.h:518
const char output_format
Definition recog.h:530
Definition recog.h:462
void(*) stored_funcptr(void)
Definition recog.h:463
stored_funcptr func
Definition recog.h:480
rtx_insn * operator()(Ts... args) const
Definition recog.h:466
insn_gen_fn operator*(void) const
Definition recog.h:474
Definition recog.h:484
const char eliminable
Definition recog.h:495
enum machine_mode const mode
Definition recog.h:489
const insn_operand_predicate_fn predicate
Definition recog.h:485
const char strict_low
Definition recog.h:491
const char *const constraint
Definition recog.h:487
const char allows_mem
Definition recog.h:497
const char is_operator
Definition recog.h:493
Definition recog.h:47
const char * constraint
Definition recog.h:50
unsigned int register_filters
Definition recog.h:69
unsigned int memory_ok
Definition recog.h:75
enum reg_class cl
Definition recog.h:53
int matched
Definition recog.h:64
int matches
Definition recog.h:60
unsigned int unsigned int earlyclobber
Definition recog.h:72
unsigned int anything_ok
Definition recog.h:80
unsigned int reject
Definition recog.h:57
unsigned int is_address
Definition recog.h:77
Definition recog.h:368
char dup_num[MAX_DUP_OPERANDS]
Definition recog.h:399
rtx * operand_loc[MAX_RECOG_OPERANDS]
Definition recog.h:379
machine_mode operand_mode[MAX_RECOG_OPERANDS]
Definition recog.h:388
char is_operator[MAX_RECOG_OPERANDS]
Definition recog.h:385
rtx_insn * insn
Definition recog.h:424
char n_dups
Definition recog.h:415
char n_alternatives
Definition recog.h:418
enum op_type operand_type[MAX_RECOG_OPERANDS]
Definition recog.h:391
bool is_asm
Definition recog.h:421
const char * constraints[MAX_RECOG_OPERANDS]
Definition recog.h:382
rtx * dup_loc[MAX_DUP_OPERANDS]
Definition recog.h:395
char n_operands
Definition recog.h:412
Definition rtl.h:312
Definition rtl.h:546
Definition recog.h:549
operand_alternative * x_op_alt[NUM_INSN_CODES]
Definition recog.h:552
alternative_mask x_bool_attr_masks[NUM_INSN_CODES][BA_LAST+1]
Definition recog.h:551
bool x_initialized
Definition recog.h:550
#define false
Definition system.h:888
#define IN_RANGE(VALUE, LOWER, UPPER)
Definition system.h:324
#define bool
Definition system.h:886
#define gcc_checking_assert(EXPR)
Definition system.h:821
#define MAX(X, Y)
Definition system.h:397