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-2025 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),
189 result_flags (0),
190 should_unshare (shared_p),
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/* True for inline asm operands with - constraint modifier. */
366extern bool raw_constraint_p;
367
368/* The following vectors hold the results from insn_extract. */
369
371{
372 /* It is very tempting to make the 5 operand related arrays into a
373 structure and index on that. However, to be source compatible
374 with all of the existing md file insn constraints and output
375 templates, we need `operand' as a flat array. Without that
376 member, making an array for the rest seems pointless. */
377
378 /* Gives value of operand N. */
379 rtx operand[MAX_RECOG_OPERANDS];
380
381 /* Gives location where operand N was found. */
382 rtx *operand_loc[MAX_RECOG_OPERANDS];
383
384 /* Gives the constraint string for operand N. */
385 const char *constraints[MAX_RECOG_OPERANDS];
386
387 /* Nonzero if operand N is a match_operator or a match_parallel. */
388 char is_operator[MAX_RECOG_OPERANDS];
389
390 /* Gives the mode of operand N. */
391 machine_mode operand_mode[MAX_RECOG_OPERANDS];
392
393 /* Gives the type (in, out, inout) for operand N. */
394 enum op_type operand_type[MAX_RECOG_OPERANDS];
395
396 /* Gives location where the Nth duplicate-appearance of an operand
397 was found. This is something that matched MATCH_DUP. */
398 rtx *dup_loc[MAX_DUP_OPERANDS];
399
400 /* Gives the operand number that was duplicated in the Nth
401 duplicate-appearance of an operand. */
402 char dup_num[MAX_DUP_OPERANDS];
403
404 /* ??? Note that these are `char' instead of `unsigned char' to (try to)
405 avoid certain lossage from K&R C, wherein `unsigned char' default
406 promotes to `unsigned int' instead of `int' as in ISO C. As of 1999,
407 the most common places to bootstrap from K&R C are SunOS and HPUX,
408 both of which have signed characters by default. The only other
409 supported natives that have both K&R C and unsigned characters are
410 ROMP and Irix 3, and neither have been seen for a while, but do
411 continue to consider unsignedness when performing arithmetic inside
412 a comparison. */
413
414 /* The number of operands of the insn. */
416
417 /* The number of MATCH_DUPs in the insn. */
418 char n_dups;
419
420 /* The number of alternatives in the constraints for the insn. */
422
423 /* True if insn is ASM_OPERANDS. */
424 bool is_asm;
425
426 /* In case we are caching, hold insn data was generated for. */
428};
429
430extern struct recog_data_d recog_data;
431
432/* RAII class for saving/restoring recog_data. */
433
441
442#ifndef GENERATOR_FILE
444
445/* Return a pointer to an array in which index OP describes the constraints
446 on operand OP of the current instruction alternative (which_alternative).
447 Only valid after calling preprocess_constraints and constrain_operands. */
448
449inline const operand_alternative *
451{
453 recog_data.n_alternatives - 1));
454 return &recog_op_alt[which_alternative * recog_data.n_operands];
455}
456#endif
457
458/* A table defined in insn-output.cc that give information about
459 each insn-code value. */
460
461typedef bool (*insn_operand_predicate_fn) (rtx, machine_mode);
462typedef const char * (*insn_output_fn) (rtx *, rtx_insn *);
463
465{
466 typedef void (*stored_funcptr) (void);
467
468 template<typename ...Ts>
469 rtx_insn *operator() (Ts... args) const
470 {
471 typedef rtx_insn *(*funcptr) (decltype ((void) args, NULL_RTX)...);
472 return ((funcptr) func) (args...);
473 }
474
475 // This is for compatibility of code that invokes functions like
476 // (*funcptr) (arg)
477 insn_gen_fn operator * (void) const { return *this; }
478
479 // The wrapped function pointer must be public and there must not be any
480 // constructors. Otherwise the insn_data_d struct initializers generated
481 // by genoutput.cc will result in static initializer functions, which defeats
482 // the purpose of the generated insn_data_d array.
484};
485
487{
489
490 const char *const constraint;
491
492 ENUM_BITFIELD(machine_mode) const mode : 16;
493
494 const char strict_low;
495
496 const char is_operator;
497
498 const char eliminable;
499
500 const char allows_mem;
501};
502
503/* Legal values for insn_data.output_format. Indicate what type of data
504 is stored in insn_data.output. */
505#define INSN_OUTPUT_FORMAT_NONE 0 /* abort */
506#define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */
507#define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */
508#define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */
509
511{
512 const char *const name;
513#if HAVE_DESIGNATED_UNION_INITIALIZERS
514 union {
515 const char *single;
516 const char *const *multi;
518 } output;
519#else
520 struct {
521 const char *single;
522 const char *const *multi;
525#endif
527 const struct insn_operand_data *const operand;
528
530 const char n_operands;
531 const char n_dups;
532 const char n_alternatives;
533 const char output_format;
534};
535
536extern const struct insn_data_d insn_data[];
537extern int peep2_current_count;
538
539#ifndef GENERATOR_FILE
540#include "insn-codes.h"
541
542/* An enum of boolean attributes that may only depend on the current
543 subtarget, not on things like operands or compiler phase. */
550
551/* Target-dependent globals. */
557
559#if SWITCHABLE_TARGET
560extern struct target_recog *this_target_recog;
561#else
562#define this_target_recog (&default_target_recog)
563#endif
564
569
570void recog_init ();
571
572/* This RAII class can help to undo tentative insn changes on failure.
573 When an object of the class goes out of scope, it undoes all group
574 changes that have been made via the validate_change machinery and
575 not yet confirmed via confirm_change_group.
576
577 For example:
578
579 insn_change_watermark watermark;
580 validate_change (..., true); // A
581 ...
582 if (test)
583 // Undoes change A.
584 return false;
585 ...
586 validate_change (..., true); // B
587 ...
588 if (test)
589 // Undoes changes A and B.
590 return false;
591 ...
592 confirm_change_group ();
593
594 Code that wants to avoid this behavior can use keep ():
595
596 insn_change_watermark watermark;
597 validate_change (..., true); // A
598 ...
599 if (test)
600 // Undoes change A.
601 return false;
602 ...
603 watermark.keep ();
604 validate_change (..., true); // B
605 ...
606 if (test)
607 // Undoes change B, but not A.
608 return false;
609 ...
610 confirm_change_group (); */
621
627
628#endif
629
630#endif /* GCC_RECOG_H */
Definition tree.h:81
int m_old_num_changes
Definition recog.h:619
void keep()
Definition recog.h:616
insn_change_watermark()
Definition recog.h:614
~insn_change_watermark()
Definition recog.h:622
rtx from
Definition recog.h:153
bool apply_to_rvalue(rtx *)
Definition recog.cc:1453
virtual bool check_mem(int, rtx)
Definition recog.h:129
bool apply_to_mem_1(rtx)
Definition recog.cc:1026
rtx_insn * insn
Definition recog.h:149
bool apply_to_rvalue_1(rtx *)
Definition recog.cc:1047
rtx to
Definition recog.h:154
bool apply_to_note(rtx *)
Definition recog.cc:1466
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:1342
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:1440
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:1379
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
recog_data_saver()
Definition recog.h:438
~recog_data_saver()
Definition recog.h:439
recog_data_d m_saved_data
Definition recog.h:436
Definition rtl.h:3438
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
undo_recog_changes(int)
Definition recog.cc:633
~undo_recog_changes()
Definition recog.cc:642
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 basic_block_def * basic_block
Definition coretypes.h:355
struct rtx_def * rtx
Definition coretypes.h:57
unsigned char addr_space_t
Definition coretypes.h:184
const struct rtx_def * const_rtx
Definition coretypes.h:58
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
const operand_alternative * recog_op_alt
Definition recog.cc:78
int which_alternative
Definition recog.cc:87
int peep2_current_count
Definition recog.cc:3659
struct recog_data_d recog_data
Definition recog.cc:73
int volatile_ok
Definition recog.cc:71
bool raw_constraint_p
Definition recog.cc:90
struct target_recog default_target_recog
Definition recog.cc:58
rtx peep2_find_free_register(int from, int to, const char *class_str, machine_mode mode, HARD_REG_SET *reg_set)
Definition recog.cc:3737
const struct insn_data_d insn_data[]
int recog_memoized(rtx_insn *insn)
Definition recog.h:320
bool valid_insn_p(rtx_insn *)
Definition recog.cc:1478
bool offsettable_memref_p(rtx)
Definition recog.cc:2487
void extract_constrain_insn_cached(rtx_insn *)
Definition recog.cc:2789
rtx_insn * peephole2_insns(rtx, rtx_insn *, int *)
bool validate_replace_rtx_subexp(rtx, rtx, rtx_insn *, rtx *)
Definition recog.cc:898
bool canonicalize_change_group(rtx_insn *insn, rtx x)
Definition recog.cc:325
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:3045
bool constrain_operands(int, alternative_mask)
Definition recog.cc:3130
bool validate_change_xveclen(rtx, rtx *, int, bool)
Definition recog.cc:314
void cancel_changes(int)
Definition recog.cc:596
alternative_mask get_enabled_alternatives(rtx_insn *)
Definition recog.cc:2709
bool mode_dependent_address_p(rtx, addr_space_t)
Definition recog.cc:2609
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:4374
bool validate_simplify_insn(rtx_insn *insn)
Definition recog.cc:987
void validate_replace_rtx_group(rtx, rtx, rtx_insn *)
Definition recog.cc:941
void recog_init()
Definition recog.cc:4732
unsigned int alternative_register_filters(const operand_alternative *alt, int i)
Definition recog.h:96
#define this_target_recog
Definition recog.h:562
int asm_operand_ok(rtx, const char *, const char **)
Definition recog.cc:2272
rtx_insn * peep2_next_insn(int)
Definition recog.cc:3680
bool validate_replace_rtx_part(rtx, rtx, rtx *, rtx_insn *)
Definition recog.cc:921
void confirm_change_group(void)
Definition recog.cc:537
const operand_alternative * which_op_alt()
Definition recog.h:450
void extract_constrain_insn(rtx_insn *insn)
Definition recog.cc:2779
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:3879
void init_recog(void)
Definition recog.cc:112
bool added_clobbers_hard_reg_p(int)
bool validate_replace_rtx(rtx, rtx, rtx_insn *)
Definition recog.cc:908
bool verify_changes(int)
Definition recog.cc:435
bool validate_replace_rtx_part_nosimplify(rtx, rtx, rtx *, rtx_insn *)
Definition recog.cc:929
bool peep2_reg_dead_p(int, rtx)
Definition recog.cc:3707
int recog(rtx, rtx_insn *, int *)
void validate_replace_src_group(rtx, rtx, rtx_insn *)
Definition recog.cc:972
int num_validated_changes(void)
Definition recog.cc:588
int num_changes_pending(void)
Definition recog.cc:426
bool memory_address_addr_space_p(machine_mode, rtx, addr_space_t, code_helper=ERROR_MARK)
Definition recog.cc:1878
alternative_mask get_preferred_alternatives(rtx_insn *)
Definition recog.cc:2719
bool constrain_operands_cached(rtx_insn *, int)
Definition recog.cc:2800
bool_attr
Definition recog.h:544
@ BA_PREFERRED_FOR_SPEED
Definition recog.h:546
@ BA_PREFERRED_FOR_SIZE
Definition recog.h:547
@ BA_ENABLED
Definition recog.h:545
@ BA_LAST
Definition recog.h:548
bool validate_unshare_change(rtx, rtx *, rtx, bool)
Definition recog.cc:305
bool check_asm_operands(rtx)
Definition recog.cc:141
bool store_data_bypass_p(rtx_insn *, rtx_insn *)
Definition recog.cc:4342
bool insn_invalid_p(rtx_insn *, bool)
Definition recog.cc:361
bool validate_change(rtx, rtx *, rtx, bool)
Definition recog.cc:296
bool offsettable_address_addr_space_p(int, machine_mode, rtx, addr_space_t)
Definition recog.cc:2516
void extract_insn_cached(rtx_insn *)
Definition recog.cc:2767
void extract_insn(rtx_insn *)
Definition recog.cc:2811
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:462
bool offsettable_nonstrict_memref_p(rtx)
Definition recog.cc:2498
bool apply_change_group(void)
Definition recog.cc:570
bool check_bool_attrs(rtx_insn *)
Definition recog.cc:2748
void init_recog_no_volatile(void)
Definition recog.cc:106
bool reg_fits_class_p(const_rtx, reg_class_t, int, machine_mode)
Definition recog.cc:3455
bool peep2_regno_dead_p(int, int)
Definition recog.cc:3693
void preprocess_constraints(int, int, const char **, operand_alternative *, rtx **)
Definition recog.cc:2922
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:461
#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 recog.h:511
const struct insn_operand_data *const operand
Definition recog.h:527
const char *const * multi
Definition recog.h:522
const char n_alternatives
Definition recog.h:532
struct insn_data_d::@203104213312346317206066302163117071010065246205 output
const char n_generator_args
Definition recog.h:529
insn_output_fn function
Definition recog.h:523
const char n_operands
Definition recog.h:530
const insn_gen_fn genfun
Definition recog.h:526
const char n_dups
Definition recog.h:531
const char *const name
Definition recog.h:512
const char * single
Definition recog.h:521
const char output_format
Definition recog.h:533
Definition recog.h:465
stored_funcptr func
Definition recog.h:483
rtx_insn * operator()(Ts... args) const
Definition recog.h:469
void(* stored_funcptr)(void)
Definition recog.h:466
insn_gen_fn operator*(void) const
Definition recog.h:477
Definition recog.h:487
const char eliminable
Definition recog.h:498
enum machine_mode const mode
Definition recog.h:492
const insn_operand_predicate_fn predicate
Definition recog.h:488
const char strict_low
Definition recog.h:494
const char *const constraint
Definition recog.h:490
const char allows_mem
Definition recog.h:500
const char is_operator
Definition recog.h:496
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:371
char dup_num[MAX_DUP_OPERANDS]
Definition recog.h:402
rtx * operand_loc[MAX_RECOG_OPERANDS]
Definition recog.h:382
machine_mode operand_mode[MAX_RECOG_OPERANDS]
Definition recog.h:391
char is_operator[MAX_RECOG_OPERANDS]
Definition recog.h:388
rtx_insn * insn
Definition recog.h:427
char n_dups
Definition recog.h:418
char n_alternatives
Definition recog.h:421
enum op_type operand_type[MAX_RECOG_OPERANDS]
Definition recog.h:394
bool is_asm
Definition recog.h:424
const char * constraints[MAX_RECOG_OPERANDS]
Definition recog.h:385
rtx operand[MAX_RECOG_OPERANDS]
Definition recog.h:379
rtx * dup_loc[MAX_DUP_OPERANDS]
Definition recog.h:398
char n_operands
Definition recog.h:415
Definition rtl.h:546
Definition recog.h:552
operand_alternative * x_op_alt[NUM_INSN_CODES]
Definition recog.h:555
alternative_mask x_bool_attr_masks[NUM_INSN_CODES][BA_LAST+1]
Definition recog.h:554
bool x_initialized
Definition recog.h:553
#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