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-2026 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 /* Bit ID is set if the constraint string includes a dependent
72 register constraint with dependent-filter id ID. */
73 unsigned int dependent_filters : MAX (NUM_DEPENDENT_FILTERS, 1);
74
75 /* Nonzero if '&' was found in the constraint string. */
76 unsigned int earlyclobber : 1;
77 /* Nonzero if TARGET_MEM_CONSTRAINT was found in the constraint
78 string. */
79 unsigned int memory_ok : 1;
80 /* Nonzero if 'p' was found in the constraint string. */
81 unsigned int is_address : 1;
82 /* Nonzero if 'X' was found in the constraint string, or if the constraint
83 string for this alternative was empty. */
84 unsigned int anything_ok : 1;
85};
86
87/* Return the class for operand I of alternative ALT, taking matching
88 constraints into account. */
89
90inline enum reg_class
92{
93 return alt[i].matches >= 0 ? alt[alt[i].matches].cl : alt[i].cl;
94}
95
96/* Return the mask of register filters that should be applied to operand I
97 of alternative ALT, taking matching constraints into account. */
98
99inline unsigned int
101{
102 return (alt[i].matches >= 0
103 ? alt[alt[i].matches].register_filters
104 : alt[i].register_filters);
105}
106
107/* Return the mask of dynamic register filters that should be applied to
108 operand I of alternative ALT, taking matching constraints into
109 account. */
110
111inline unsigned int
113{
114 return (alt[i].matches >= 0
115 ? alt[alt[i].matches].dependent_filters
116 : alt[i].dependent_filters);
117}
118#endif
119
120/* A class for substituting one rtx for another within an instruction,
121 or for recursively simplifying the instruction as-is. Derived classes
122 can record or filter certain decisions. */
123
125{
126public:
127 /* Assignments for RESULT_FLAGS.
128
129 UNSIMPLIFIED is true if a substitution has been made inside an rtx
130 X and if neither X nor its parent expressions could be simplified.
131
132 FIRST_SPARE_RESULT is the first flag available for derived classes. */
133 static const uint16_t UNSIMPLIFIED = 1U << 0;
134 static const uint16_t FIRST_SPARE_RESULT = 1U << 1;
135
137 insn_propagation (rtx_insn *, rtx, rtx, bool = true);
138 bool apply_to_pattern (rtx *);
139 bool apply_to_rvalue (rtx *);
140 bool apply_to_note (rtx *);
141
142 /* Return true if we should accept a substitution into the address of
143 memory expression MEM. Undoing changes OLD_NUM_CHANGES and up restores
144 MEM's original address. */
145 virtual bool check_mem (int /*old_num_changes*/,
146 rtx /*mem*/) { return true; }
147
148 /* Note that we've simplified OLD_RTX into NEW_RTX. When substituting,
149 this only happens if a substitution occurred within OLD_RTX.
150 Undoing OLD_NUM_CHANGES and up will restore the old form of OLD_RTX.
151 OLD_RESULT_FLAGS is the value that RESULT_FLAGS had before processing
152 OLD_RTX. */
153 virtual void note_simplification (int /*old_num_changes*/,
154 uint16_t /*old_result_flags*/,
155 rtx /*old_rtx*/, rtx /*new_rtx*/) {}
156
157private:
158 bool apply_to_mem_1 (rtx);
159 bool apply_to_lvalue_1 (rtx);
160 bool apply_to_rvalue_1 (rtx *);
161 bool apply_to_pattern_1 (rtx *);
162
163public:
164 /* The instruction that we are simplifying or propagating into. */
166
167 /* If FROM is nonnull, we're replacing FROM with TO, otherwise we're
168 just doing a recursive simplification. */
171
172 /* The number of times that we have replaced FROM with TO. */
173 unsigned int num_replacements;
174
175 /* A bitmask of flags that describe the result of the simplificiation;
176 see above for details. */
177 uint16_t result_flags : 16;
178
179 /* True if we should unshare TO when making the next substitution,
180 false if we can use TO itself. */
181 uint16_t should_unshare : 1;
182
183 /* True if we should call check_mem after substituting into a memory. */
184 uint16_t should_check_mems : 1;
185
186 /* True if we should call note_simplification after each simplification. */
188
189 /* For future expansion. */
190 uint16_t spare : 13;
191
192 /* Gives the reason that a substitution failed, for debug purposes. */
193 const char *failure_reason;
194};
195
196/* Try to replace FROM with TO in INSN. SHARED_P is true if TO is shared
197 with other instructions, false if INSN can use TO directly. */
198
200 bool shared_p)
201 : insn (insn),
202 from (from),
203 to (to),
205 result_flags (0),
206 should_unshare (shared_p),
209 spare (0),
210 failure_reason (nullptr)
211{
212}
213
214/* Try to simplify INSN without performing a substitution. */
215
220
221/* An RAII class that temporarily undoes part of the current change group.
222 The sequence:
223
224 {
225 ...;
226 undo_recog_changes undo (NUM);
227 STMTS;
228 }
229
230 executes STMTS with all the changes numbered NUM and up temporarily
231 reverted. STMTS must not try to add to the current change group.
232
233 Nested uses are supported, but each nested NUM must be no greater than
234 outer NUMs. */
235
237{
238public:
239 undo_recog_changes (int);
241
242 static bool is_active () { return s_num_changes != 0; }
243
244private:
246
247 static int s_num_changes;
248};
249
250extern void init_recog (void);
251extern void init_recog_no_volatile (void);
252extern bool check_asm_operands (rtx);
253extern int asm_operand_ok (rtx, const char *, const char **);
254extern bool validate_change (rtx, rtx *, rtx, bool);
255extern bool validate_unshare_change (rtx, rtx *, rtx, bool);
256extern bool validate_change_xveclen (rtx, rtx *, int, bool);
257extern bool canonicalize_change_group (rtx_insn *insn, rtx x);
258extern bool insn_invalid_p (rtx_insn *, bool);
259extern bool verify_changes (int);
260extern void confirm_change_group (void);
261extern bool apply_change_group (void);
262extern int num_validated_changes (void);
263extern void cancel_changes (int);
264extern bool constrain_operands (int, alternative_mask);
265extern bool constrain_operands_cached (rtx_insn *, int);
266extern bool memory_address_addr_space_p (machine_mode, rtx, addr_space_t,
267 code_helper = ERROR_MARK);
268#define memory_address_p(mode,addr) \
269 memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC)
270extern bool strict_memory_address_addr_space_p (machine_mode, rtx, addr_space_t,
271 code_helper = ERROR_MARK);
272#define strict_memory_address_p(mode,addr) \
273 strict_memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC)
274extern bool validate_replace_rtx_subexp (rtx, rtx, rtx_insn *, rtx *);
275extern bool validate_replace_rtx (rtx, rtx, rtx_insn *);
276extern bool validate_replace_rtx_part (rtx, rtx, rtx *, rtx_insn *);
280extern bool validate_simplify_insn (rtx_insn *insn);
281extern int num_changes_pending (void);
282extern bool reg_fits_class_p (const_rtx, reg_class_t, int, machine_mode);
283extern bool valid_insn_p (rtx_insn *);
284
285extern bool offsettable_memref_p (rtx);
287extern bool offsettable_address_addr_space_p (int, machine_mode, rtx,
289#define offsettable_address_p(strict,mode,addr) \
290 offsettable_address_addr_space_p ((strict), (mode), (addr), \
291 ADDR_SPACE_GENERIC)
293
294extern int recog (rtx, rtx_insn *, int *);
295#ifndef GENERATOR_FILE
296inline int recog_memoized (rtx_insn *insn);
297#endif
298extern void add_clobbers (rtx, int);
300extern void insn_extract (rtx_insn *);
301extern void extract_insn (rtx_insn *);
302extern void extract_constrain_insn (rtx_insn *insn);
304extern void extract_insn_cached (rtx_insn *);
305#ifndef GENERATOR_FILE
306extern void preprocess_constraints (int, int, const char **,
308extern const operand_alternative *preprocess_insn_constraints (unsigned int);
309#endif
310extern void preprocess_constraints (rtx_insn *);
311extern rtx_insn *peep2_next_insn (int);
312extern bool peep2_regno_dead_p (int, int);
313extern bool peep2_reg_dead_p (int, rtx);
314#ifdef HARD_CONST
315extern rtx peep2_find_free_register (int, int, const char *,
316 machine_mode, HARD_REG_SET *);
317#endif
319
320extern bool store_data_bypass_p (rtx_insn *, rtx_insn *);
321extern bool if_test_bypass_p (rtx_insn *, rtx_insn *);
322
324
325#ifndef GENERATOR_FILE
326/* Try recognizing the instruction INSN,
327 and return the code number that results.
328 Remember the code so that repeated calls do not
329 need to spend the time for actual rerecognition.
330
331 This function is the normal interface to instruction recognition.
332 The automatically-generated function `recog' is normally called
333 through this one. */
334
335inline int
337{
338 if (INSN_CODE (insn) < 0)
339 INSN_CODE (insn) = recog (PATTERN (insn), insn, 0);
340 return INSN_CODE (insn);
341}
342#endif
343
344/* Skip chars until the next ',' or the end of the string. This is
345 useful to skip alternatives in a constraint string. */
346inline const char *
347skip_alternative (const char *p)
348{
349 const char *r = p;
350 while (*r != '\0' && *r != ',')
351 r++;
352 if (*r == ',')
353 r++;
354 return r;
355}
356
357/* Nonzero means volatile operands are recognized. */
358extern int volatile_ok;
359
360/* RAII class for temporarily setting volatile_ok. */
361
376
377/* Set by constrain_operands to the number of the alternative that
378 matched. */
379extern int which_alternative;
380
381/* True for inline asm operands with - constraint modifier. */
382extern bool raw_constraint_p;
383
384/* The following vectors hold the results from insn_extract. */
385
387{
388 /* It is very tempting to make the 5 operand related arrays into a
389 structure and index on that. However, to be source compatible
390 with all of the existing md file insn constraints and output
391 templates, we need `operand' as a flat array. Without that
392 member, making an array for the rest seems pointless. */
393
394 /* Gives value of operand N. */
395 rtx operand[MAX_RECOG_OPERANDS];
396
397 /* Gives location where operand N was found. */
398 rtx *operand_loc[MAX_RECOG_OPERANDS];
399
400 /* Gives the constraint string for operand N. */
401 const char *constraints[MAX_RECOG_OPERANDS];
402
403 /* Nonzero if operand N is a match_operator or a match_parallel. */
404 char is_operator[MAX_RECOG_OPERANDS];
405
406 /* Gives the mode of operand N. */
407 machine_mode operand_mode[MAX_RECOG_OPERANDS];
408
409 /* Gives the type (in, out, inout) for operand N. */
410 enum op_type operand_type[MAX_RECOG_OPERANDS];
411
412 /* Gives location where the Nth duplicate-appearance of an operand
413 was found. This is something that matched MATCH_DUP. */
414 rtx *dup_loc[MAX_DUP_OPERANDS];
415
416 /* Gives the operand number that was duplicated in the Nth
417 duplicate-appearance of an operand. */
418 char dup_num[MAX_DUP_OPERANDS];
419
420 /* ??? Note that these are `char' instead of `unsigned char' to (try to)
421 avoid certain lossage from K&R C, wherein `unsigned char' default
422 promotes to `unsigned int' instead of `int' as in ISO C. As of 1999,
423 the most common places to bootstrap from K&R C are SunOS and HPUX,
424 both of which have signed characters by default. The only other
425 supported natives that have both K&R C and unsigned characters are
426 ROMP and Irix 3, and neither have been seen for a while, but do
427 continue to consider unsignedness when performing arithmetic inside
428 a comparison. */
429
430 /* The number of operands of the insn. */
432
433 /* The number of MATCH_DUPs in the insn. */
434 char n_dups;
435
436 /* The number of alternatives in the constraints for the insn. */
438
439 /* True if insn is ASM_OPERANDS. */
440 bool is_asm;
441
442 /* In case we are caching, hold insn data was generated for. */
444};
445
446extern struct recog_data_d recog_data;
447
448/* RAII class for saving/restoring recog_data. */
449
457
458#ifndef GENERATOR_FILE
460
461/* Return a pointer to an array in which index OP describes the constraints
462 on operand OP of the current instruction alternative (which_alternative).
463 Only valid after calling preprocess_constraints and constrain_operands. */
464
465inline const operand_alternative *
467{
469 recog_data.n_alternatives - 1));
470 return &recog_op_alt[which_alternative * recog_data.n_operands];
471}
472#endif
473
474/* A table defined in insn-output.cc that give information about
475 each insn-code value. */
476
477typedef bool (*insn_operand_predicate_fn) (rtx, machine_mode);
478typedef const char * (*insn_output_fn) (rtx *, rtx_insn *);
479
481{
482 typedef void (*stored_funcptr) (void);
483
484 template<typename ...Ts>
485 rtx_insn *operator() (Ts... args) const
486 {
487 typedef rtx_insn *(*funcptr) (decltype ((void) args, NULL_RTX)...);
488 return ((funcptr) func) (args...);
489 }
490
491 // This is for compatibility of code that invokes functions like
492 // (*funcptr) (arg)
493 insn_gen_fn operator * (void) const { return *this; }
494
495 // The wrapped function pointer must be public and there must not be any
496 // constructors. Otherwise the insn_data_d struct initializers generated
497 // by genoutput.cc will result in static initializer functions, which defeats
498 // the purpose of the generated insn_data_d array.
500};
501
503{
505
506 const char *const constraint;
507
508 ENUM_BITFIELD(machine_mode) const mode : 16;
509
510 const char strict_low;
511
512 const char is_operator;
513
514 const char eliminable;
515
516 const char allows_mem;
517};
518
519/* Legal values for insn_data.output_format. Indicate what type of data
520 is stored in insn_data.output. */
521#define INSN_OUTPUT_FORMAT_NONE 0 /* abort */
522#define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */
523#define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */
524#define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */
525
527{
528 const char *const name;
529#if HAVE_DESIGNATED_UNION_INITIALIZERS
530 union {
531 const char *single;
532 const char *const *multi;
534 } output;
535#else
536 struct {
537 const char *single;
538 const char *const *multi;
541#endif
543 const struct insn_operand_data *const operand;
544
546 const char n_operands;
547 const char n_dups;
548 const char n_alternatives;
549 const char output_format;
550};
551
552extern const struct insn_data_d insn_data[];
553extern int peep2_current_count;
554
555#ifndef GENERATOR_FILE
556#include "insn-codes.h"
557
558/* An enum of boolean attributes that may only depend on the current
559 subtarget, not on things like operands or compiler phase. */
566
567/* Target-dependent globals. */
573
575#if SWITCHABLE_TARGET
576extern struct target_recog *this_target_recog;
577#else
578#define this_target_recog (&default_target_recog)
579#endif
580
585
586void recog_init ();
587
588/* This RAII class can help to undo tentative insn changes on failure.
589 When an object of the class goes out of scope, it undoes all group
590 changes that have been made via the validate_change machinery and
591 not yet confirmed via confirm_change_group.
592
593 For example:
594
595 insn_change_watermark watermark;
596 validate_change (..., true); // A
597 ...
598 if (test)
599 // Undoes change A.
600 return false;
601 ...
602 validate_change (..., true); // B
603 ...
604 if (test)
605 // Undoes changes A and B.
606 return false;
607 ...
608 confirm_change_group ();
609
610 Code that wants to avoid this behavior can use keep ():
611
612 insn_change_watermark watermark;
613 validate_change (..., true); // A
614 ...
615 if (test)
616 // Undoes change A.
617 return false;
618 ...
619 watermark.keep ();
620 validate_change (..., true); // B
621 ...
622 if (test)
623 // Undoes change B, but not A.
624 return false;
625 ...
626 confirm_change_group (); */
637
643
644#endif
645
646#endif /* GCC_RECOG_H */
Definition tree.h:82
int m_old_num_changes
Definition recog.h:635
void keep()
Definition recog.h:632
insn_change_watermark()
Definition recog.h:630
~insn_change_watermark()
Definition recog.h:638
rtx from
Definition recog.h:169
bool apply_to_rvalue(rtx *)
Definition recog.cc:1460
virtual bool check_mem(int, rtx)
Definition recog.h:145
bool apply_to_mem_1(rtx)
Definition recog.cc:1033
rtx_insn * insn
Definition recog.h:165
bool apply_to_rvalue_1(rtx *)
Definition recog.cc:1054
rtx to
Definition recog.h:170
bool apply_to_note(rtx *)
Definition recog.cc:1473
uint16_t result_flags
Definition recog.h:177
unsigned int num_replacements
Definition recog.h:173
static const uint16_t FIRST_SPARE_RESULT
Definition recog.h:134
bool apply_to_lvalue_1(rtx)
Definition recog.cc:1349
static const uint16_t UNSIMPLIFIED
Definition recog.h:133
uint16_t should_check_mems
Definition recog.h:184
bool apply_to_pattern(rtx *)
Definition recog.cc:1447
const char * failure_reason
Definition recog.h:193
uint16_t should_unshare
Definition recog.h:181
uint16_t should_note_simplifications
Definition recog.h:187
bool apply_to_pattern_1(rtx *)
Definition recog.cc:1386
insn_propagation(rtx_insn *)
Definition recog.h:216
uint16_t spare
Definition recog.h:190
virtual void note_simplification(int, uint16_t, rtx, rtx)
Definition recog.h:153
recog_data_saver()
Definition recog.h:454
~recog_data_saver()
Definition recog.h:455
recog_data_d m_saved_data
Definition recog.h:452
Definition rtl.h:3500
temporary_volatile_ok(const temporary_volatile_ok &)
int save_volatile_ok
Definition recog.h:374
temporary_volatile_ok(int value)
Definition recog.h:365
~temporary_volatile_ok()
Definition recog.h:370
undo_recog_changes(int)
Definition recog.cc:640
~undo_recog_changes()
Definition recog.cc:649
static int s_num_changes
Definition recog.h:247
static bool is_active()
Definition recog.h:242
int m_old_num_changes
Definition recog.h:245
struct basic_block_def * basic_block
Definition coretypes.h:351
struct rtx_def * rtx
Definition coretypes.h:57
unsigned char addr_space_t
Definition coretypes.h:191
const struct rtx_def * const_rtx
Definition coretypes.h:58
int reg_class_t
Definition coretypes.h:372
uint64_t alternative_mask
Definition genattrtab.cc:236
static vec< class constraint_data * > dependent_filters
Definition genpreds.cc:698
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:79
int which_alternative
Definition recog.cc:88
int peep2_current_count
Definition recog.cc:3717
struct recog_data_d recog_data
Definition recog.cc:74
int volatile_ok
Definition recog.cc:72
bool raw_constraint_p
Definition recog.cc:91
struct target_recog default_target_recog
Definition recog.cc:59
rtx peep2_find_free_register(int from, int to, const char *class_str, machine_mode mode, HARD_REG_SET *reg_set)
Definition recog.cc:3795
const struct insn_data_d insn_data[]
unsigned int alternative_dependent_filters(const operand_alternative *alt, int i)
Definition recog.h:112
int recog_memoized(rtx_insn *insn)
Definition recog.h:336
bool valid_insn_p(rtx_insn *)
Definition recog.cc:1485
bool offsettable_memref_p(rtx)
Definition recog.cc:2499
void extract_constrain_insn_cached(rtx_insn *)
Definition recog.cc:2801
rtx_insn * peephole2_insns(rtx, rtx_insn *, int *)
bool validate_replace_rtx_subexp(rtx, rtx, rtx_insn *, rtx *)
Definition recog.cc:905
bool canonicalize_change_group(rtx_insn *insn, rtx x)
Definition recog.cc:328
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:3061
bool constrain_operands(int, alternative_mask)
Definition recog.cc:3169
bool validate_change_xveclen(rtx, rtx *, int, bool)
Definition recog.cc:317
void cancel_changes(int)
Definition recog.cc:599
alternative_mask get_enabled_alternatives(rtx_insn *)
Definition recog.cc:2721
bool mode_dependent_address_p(rtx, addr_space_t)
Definition recog.cc:2621
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:4433
bool validate_simplify_insn(rtx_insn *insn)
Definition recog.cc:994
void validate_replace_rtx_group(rtx, rtx, rtx_insn *)
Definition recog.cc:948
void recog_init()
Definition recog.cc:4791
unsigned int alternative_register_filters(const operand_alternative *alt, int i)
Definition recog.h:100
#define this_target_recog
Definition recog.h:578
int asm_operand_ok(rtx, const char *, const char **)
Definition recog.cc:2283
rtx_insn * peep2_next_insn(int)
Definition recog.cc:3738
bool validate_replace_rtx_part(rtx, rtx, rtx *, rtx_insn *)
Definition recog.cc:928
void confirm_change_group(void)
Definition recog.cc:540
const operand_alternative * which_op_alt()
Definition recog.h:466
void extract_constrain_insn(rtx_insn *insn)
Definition recog.cc:2791
enum reg_class alternative_class(const operand_alternative *alt, int i)
Definition recog.h:91
void copy_frame_info_to_split_insn(rtx_insn *, rtx_insn *)
Definition recog.cc:3937
void init_recog(void)
Definition recog.cc:115
bool added_clobbers_hard_reg_p(int)
bool validate_replace_rtx(rtx, rtx, rtx_insn *)
Definition recog.cc:915
bool verify_changes(int)
Definition recog.cc:438
bool validate_replace_rtx_part_nosimplify(rtx, rtx, rtx *, rtx_insn *)
Definition recog.cc:936
bool peep2_reg_dead_p(int, rtx)
Definition recog.cc:3765
int recog(rtx, rtx_insn *, int *)
void validate_replace_src_group(rtx, rtx, rtx_insn *)
Definition recog.cc:979
int num_validated_changes(void)
Definition recog.cc:591
int num_changes_pending(void)
Definition recog.cc:429
bool memory_address_addr_space_p(machine_mode, rtx, addr_space_t, code_helper=ERROR_MARK)
Definition recog.cc:1889
alternative_mask get_preferred_alternatives(rtx_insn *)
Definition recog.cc:2731
bool constrain_operands_cached(rtx_insn *, int)
Definition recog.cc:2812
bool_attr
Definition recog.h:560
@ BA_PREFERRED_FOR_SPEED
Definition recog.h:562
@ BA_PREFERRED_FOR_SIZE
Definition recog.h:563
@ BA_ENABLED
Definition recog.h:561
@ BA_LAST
Definition recog.h:564
bool validate_unshare_change(rtx, rtx *, rtx, bool)
Definition recog.cc:308
bool check_asm_operands(rtx)
Definition recog.cc:144
bool store_data_bypass_p(rtx_insn *, rtx_insn *)
Definition recog.cc:4401
bool insn_invalid_p(rtx_insn *, bool)
Definition recog.cc:364
bool validate_change(rtx, rtx *, rtx, bool)
Definition recog.cc:299
bool offsettable_address_addr_space_p(int, machine_mode, rtx, addr_space_t)
Definition recog.cc:2528
void extract_insn_cached(rtx_insn *)
Definition recog.cc:2779
void extract_insn(rtx_insn *)
Definition recog.cc:2823
struct recog_data_d recog_data
Definition recog.cc:74
void insn_extract(rtx_insn *)
int volatile_ok
Definition recog.cc:72
const char *(* insn_output_fn)(rtx *, rtx_insn *)
Definition recog.h:478
bool offsettable_nonstrict_memref_p(rtx)
Definition recog.cc:2510
bool apply_change_group(void)
Definition recog.cc:573
bool check_bool_attrs(rtx_insn *)
Definition recog.cc:2760
void init_recog_no_volatile(void)
Definition recog.cc:109
bool reg_fits_class_p(const_rtx, reg_class_t, int, machine_mode)
Definition recog.cc:3504
bool peep2_regno_dead_p(int, int)
Definition recog.cc:3751
void preprocess_constraints(int, int, const char **, operand_alternative *, rtx **)
Definition recog.cc:2934
const char * skip_alternative(const char *p)
Definition recog.h:347
void add_clobbers(rtx, int)
bool(* insn_operand_predicate_fn)(rtx, machine_mode)
Definition recog.h:477
#define INSN_CODE(INSN)
Definition rtl.h:1549
#define NULL_RTX
Definition rtl.h:709
rtx PATTERN(const_rtx insn)
Definition rtl.h:1517
Definition recog.h:527
const struct insn_operand_data *const operand
Definition recog.h:543
const char *const * multi
Definition recog.h:538
const char n_alternatives
Definition recog.h:548
struct insn_data_d::@203104213312346317206066302163117071010065246205 output
const char n_generator_args
Definition recog.h:545
insn_output_fn function
Definition recog.h:539
const char n_operands
Definition recog.h:546
const insn_gen_fn genfun
Definition recog.h:542
const char n_dups
Definition recog.h:547
const char *const name
Definition recog.h:528
const char * single
Definition recog.h:537
const char output_format
Definition recog.h:549
Definition recog.h:481
stored_funcptr func
Definition recog.h:499
rtx_insn * operator()(Ts... args) const
Definition recog.h:485
void(* stored_funcptr)(void)
Definition recog.h:482
insn_gen_fn operator*(void) const
Definition recog.h:493
Definition recog.h:503
const char eliminable
Definition recog.h:514
enum machine_mode const mode
Definition recog.h:508
const insn_operand_predicate_fn predicate
Definition recog.h:504
const char strict_low
Definition recog.h:510
const char *const constraint
Definition recog.h:506
const char allows_mem
Definition recog.h:516
const char is_operator
Definition recog.h:512
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:79
enum reg_class cl
Definition recog.h:53
int matched
Definition recog.h:64
unsigned int unsigned int dependent_filters
Definition recog.h:73
int matches
Definition recog.h:60
unsigned int unsigned int unsigned int earlyclobber
Definition recog.h:76
unsigned int anything_ok
Definition recog.h:84
unsigned int reject
Definition recog.h:57
unsigned int is_address
Definition recog.h:81
Definition recog.h:387
char dup_num[MAX_DUP_OPERANDS]
Definition recog.h:418
rtx * operand_loc[MAX_RECOG_OPERANDS]
Definition recog.h:398
machine_mode operand_mode[MAX_RECOG_OPERANDS]
Definition recog.h:407
char is_operator[MAX_RECOG_OPERANDS]
Definition recog.h:404
rtx_insn * insn
Definition recog.h:443
char n_dups
Definition recog.h:434
char n_alternatives
Definition recog.h:437
enum op_type operand_type[MAX_RECOG_OPERANDS]
Definition recog.h:410
bool is_asm
Definition recog.h:440
const char * constraints[MAX_RECOG_OPERANDS]
Definition recog.h:401
rtx operand[MAX_RECOG_OPERANDS]
Definition recog.h:395
rtx * dup_loc[MAX_DUP_OPERANDS]
Definition recog.h:414
char n_operands
Definition recog.h:431
Definition rtl.h:549
Definition recog.h:568
operand_alternative * x_op_alt[NUM_INSN_CODES]
Definition recog.h:571
alternative_mask x_bool_attr_masks[NUM_INSN_CODES][BA_LAST+1]
Definition recog.h:570
bool x_initialized
Definition recog.h:569
#define false
Definition system.h:894
#define IN_RANGE(VALUE, LOWER, UPPER)
Definition system.h:330
#define bool
Definition system.h:892
#define gcc_checking_assert(EXPR)
Definition system.h:827
#define MAX(X, Y)
Definition system.h:403