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 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 recog_data_d () = default;
389 recog_data_d (const recog_data_d &) = delete;
390 recog_data_d (const recog_data_d &&) = delete;
391
392 /* It is very tempting to make the 5 operand related arrays into a
393 structure and index on that. However, to be source compatible
394 with all of the existing md file insn constraints and output
395 templates, we need `operand' as a flat array. Without that
396 member, making an array for the rest seems pointless. */
397
398 /* Gives value of operand N. */
399 rtx operand[MAX_RECOG_OPERANDS];
400
401 /* Gives location where operand N was found. */
402 rtx *operand_loc[MAX_RECOG_OPERANDS];
403
404 /* Gives the constraint string for operand N. */
405 const char *constraints[MAX_RECOG_OPERANDS];
406
407 /* Nonzero if operand N is a match_operator or a match_parallel. */
408 char is_operator[MAX_RECOG_OPERANDS];
409
410 /* Gives the mode of operand N. */
411 machine_mode operand_mode[MAX_RECOG_OPERANDS];
412
413 /* Gives the type (in, out, inout) for operand N. */
414 enum op_type operand_type[MAX_RECOG_OPERANDS];
415
416 /* Gives location where the Nth duplicate-appearance of an operand
417 was found. This is something that matched MATCH_DUP. */
418 rtx *dup_loc[MAX_DUP_OPERANDS];
419
420 /* Gives the operand number that was duplicated in the Nth
421 duplicate-appearance of an operand. */
422 char dup_num[MAX_DUP_OPERANDS];
423
424 /* ??? Note that these are `char' instead of `unsigned char' to (try to)
425 avoid certain lossage from K&R C, wherein `unsigned char' default
426 promotes to `unsigned int' instead of `int' as in ISO C. As of 1999,
427 the most common places to bootstrap from K&R C are SunOS and HPUX,
428 both of which have signed characters by default. The only other
429 supported natives that have both K&R C and unsigned characters are
430 ROMP and Irix 3, and neither have been seen for a while, but do
431 continue to consider unsignedness when performing arithmetic inside
432 a comparison. */
433
434 /* The number of operands of the insn. */
436
437 /* The number of MATCH_DUPs in the insn. */
438 char n_dups;
439
440 /* The number of alternatives in the constraints for the insn. */
442
443 /* True if insn is ASM_OPERANDS. */
444 bool is_asm;
445
446 /* In case we are caching, hold insn data was generated for. */
448};
449
450extern struct recog_data_d *recog_data_ptr;
451#define recog_data (*recog_data_ptr)
452
453#ifndef GENERATOR_FILE
454/* RAII class for saving/restoring recog_data. */
455
466
474
480
482
483/* Return a pointer to an array in which index OP describes the constraints
484 on operand OP of the current instruction alternative (which_alternative).
485 Only valid after calling preprocess_constraints and constrain_operands. */
486
487inline const operand_alternative *
489{
491 recog_data.n_alternatives - 1));
492 return &recog_op_alt[which_alternative * recog_data.n_operands];
493}
494#endif
495
496/* A table defined in insn-output.cc that give information about
497 each insn-code value. */
498
499typedef bool (*insn_operand_predicate_fn) (rtx, machine_mode);
500typedef const char * (*insn_output_fn) (rtx *, rtx_insn *);
501
503{
504 typedef void (*stored_funcptr) (void);
505
506 template<typename ...Ts>
507 rtx_insn *operator() (Ts... args) const
508 {
509 typedef rtx_insn *(*funcptr) (decltype ((void) args, NULL_RTX)...);
510 return ((funcptr) func) (args...);
511 }
512
513 // This is for compatibility of code that invokes functions like
514 // (*funcptr) (arg)
515 insn_gen_fn operator * (void) const { return *this; }
516
517 // The wrapped function pointer must be public and there must not be any
518 // constructors. Otherwise the insn_data_d struct initializers generated
519 // by genoutput.cc will result in static initializer functions, which defeats
520 // the purpose of the generated insn_data_d array.
522};
523
525{
527
528 const char *const constraint;
529
530 machine_mode const mode : 16;
531
532 const char strict_low;
533
534 const char is_operator;
535
536 const char eliminable;
537
538 const char allows_mem;
539};
540
541/* Legal values for insn_data.output_format. Indicate what type of data
542 is stored in insn_data.output. */
543#define INSN_OUTPUT_FORMAT_NONE 0 /* abort */
544#define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */
545#define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */
546#define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */
547
549{
550 const char *const name;
551
552 /* How to print the insn. OUTPUT_FORMAT says which member is live. The
553 constructors let genoutput write the member's value directly, and pick
554 the member from its type. */
556 {
557 const char *single;
558 const char *const *multi;
560
561 constexpr insn_output_u () : single (nullptr) {}
562 constexpr insn_output_u (const char *s) : single (s) {}
563 constexpr insn_output_u (const char *const *m) : multi (m) {}
564 constexpr insn_output_u (insn_output_fn f) : function (f) {}
567 const struct insn_operand_data *const operand;
568
570 const char n_operands;
571 const char n_dups;
572 const char n_alternatives;
573 const char output_format;
574};
575
576extern const struct insn_data_d insn_data[];
577extern int peep2_current_count;
578
579#ifndef GENERATOR_FILE
580#include "insn-codes.h"
581
582/* An enum of boolean attributes that may only depend on the current
583 subtarget, not on things like operands or compiler phase. */
590
591/* Target-dependent globals. */
597
599#if SWITCHABLE_TARGET
600extern struct target_recog *this_target_recog;
601#else
602#define this_target_recog (&default_target_recog)
603#endif
604
609
610void recog_init ();
611
612/* This RAII class can help to undo tentative insn changes on failure.
613 When an object of the class goes out of scope, it undoes all group
614 changes that have been made via the validate_change machinery and
615 not yet confirmed via confirm_change_group.
616
617 For example:
618
619 insn_change_watermark watermark;
620 validate_change (..., true); // A
621 ...
622 if (test)
623 // Undoes change A.
624 return false;
625 ...
626 validate_change (..., true); // B
627 ...
628 if (test)
629 // Undoes changes A and B.
630 return false;
631 ...
632 confirm_change_group ();
633
634 Code that wants to avoid this behavior can use keep ():
635
636 insn_change_watermark watermark;
637 validate_change (..., true); // A
638 ...
639 if (test)
640 // Undoes change A.
641 return false;
642 ...
643 watermark.keep ();
644 validate_change (..., true); // B
645 ...
646 if (test)
647 // Undoes change B, but not A.
648 return false;
649 ...
650 confirm_change_group (); */
661
667
668#endif
669
670#endif /* GCC_RECOG_H */
Definition tree.h:82
Definition recog.h:652
int m_old_num_changes
Definition recog.h:659
void keep()
Definition recog.h:656
insn_change_watermark()
Definition recog.h:654
~insn_change_watermark()
Definition recog.h:662
rtx from
Definition recog.h:169
bool apply_to_rvalue(rtx *)
Definition recog.cc:1461
virtual bool check_mem(int, rtx)
Definition recog.h:145
bool apply_to_mem_1(rtx)
Definition recog.cc:1034
rtx_insn * insn
Definition recog.h:165
bool apply_to_rvalue_1(rtx *)
Definition recog.cc:1055
rtx to
Definition recog.h:170
bool apply_to_note(rtx *)
Definition recog.cc:1474
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:1350
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:1448
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:1387
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
int saved_alternative
Definition recog.h:464
recog_state_saver()
Definition recog.h:467
~recog_state_saver()
Definition recog.h:475
recog_data_d * saved_recog_data_ptr
Definition recog.h:463
recog_data_d m_tmp_recog_data
Definition recog.h:458
Definition rtl.h:3501
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:641
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:245
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
bool peep2_regno_dead_p(int ofs, int regno)
Definition recog.cc:3752
bool validate_change_xveclen(rtx object, rtx *loc, int new_len, bool in_group)
Definition recog.cc:318
rtx_insn * peep2_next_insn(int n)
Definition recog.cc:3739
const operand_alternative * recog_op_alt
Definition recog.cc:80
int which_alternative
Definition recog.cc:89
const operand_alternative * preprocess_insn_constraints(unsigned int icode)
Definition recog.cc:3062
bool canonicalize_change_group(rtx_insn *insn, rtx x)
Definition recog.cc:329
bool offsettable_nonstrict_memref_p(rtx op)
Definition recog.cc:2511
alternative_mask get_preferred_alternatives(rtx_insn *insn)
Definition recog.cc:2732
void preprocess_constraints(int n_operands, int n_alternatives, const char **constraints, operand_alternative *op_alt_base, rtx **oploc)
Definition recog.cc:2935
bool validate_replace_rtx_part_nosimplify(rtx from, rtx to, rtx *where, rtx_insn *insn)
Definition recog.cc:937
bool validate_unshare_change(rtx object, rtx *loc, rtx new_rtx, bool in_group)
Definition recog.cc:309
bool validate_simplify_insn(rtx_insn *insn)
Definition recog.cc:995
void validate_replace_rtx_group(rtx from, rtx to, rtx_insn *insn)
Definition recog.cc:949
void recog_init()
Definition recog.cc:4792
bool check_bool_attrs(rtx_insn *insn)
Definition recog.cc:2761
bool validate_change(rtx object, rtx *loc, rtx new_rtx, bool in_group)
Definition recog.cc:300
void copy_frame_info_to_split_insn(rtx_insn *old_insn, rtx_insn *new_insn)
Definition recog.cc:3938
void confirm_change_group(void)
Definition recog.cc:541
bool offsettable_address_addr_space_p(int strictp, machine_mode mode, rtx y, addr_space_t as)
Definition recog.cc:2529
void extract_constrain_insn(rtx_insn *insn)
Definition recog.cc:2792
struct recog_data_d * recog_data_ptr
Definition recog.cc:75
bool offsettable_memref_p(rtx op)
Definition recog.cc:2500
bool reg_fits_class_p(const_rtx operand, reg_class_t cl, int offset, machine_mode mode)
Definition recog.cc:3505
bool store_data_bypass_p(rtx_insn *out_insn, rtx_insn *in_insn)
Definition recog.cc:4402
void init_recog(void)
Definition recog.cc:116
int asm_operand_ok(rtx op, const char *constraint, const char **constraints)
Definition recog.cc:2284
void extract_constrain_insn_cached(rtx_insn *insn)
Definition recog.cc:2802
int num_validated_changes(void)
Definition recog.cc:592
bool constrain_operands(int strict, alternative_mask alternatives)
Definition recog.cc:3170
int num_changes_pending(void)
Definition recog.cc:430
bool if_test_bypass_p(rtx_insn *out_insn, rtx_insn *in_insn)
Definition recog.cc:4434
bool insn_invalid_p(rtx_insn *insn, bool in_group)
Definition recog.cc:365
void extract_insn(rtx_insn *insn)
Definition recog.cc:2824
int peep2_current_count
Definition recog.cc:3718
bool check_asm_operands(rtx x)
Definition recog.cc:145
bool validate_replace_rtx_subexp(rtx from, rtx to, rtx_insn *insn, rtx *loc)
Definition recog.cc:906
bool mode_dependent_address_p(rtx addr, addr_space_t addrspace)
Definition recog.cc:2622
alternative_mask get_enabled_alternatives(rtx_insn *insn)
Definition recog.cc:2722
bool validate_replace_rtx(rtx from, rtx to, rtx_insn *insn)
Definition recog.cc:916
bool memory_address_addr_space_p(machine_mode mode, rtx addr, addr_space_t as, code_helper ch)
Definition recog.cc:1890
int volatile_ok
Definition recog.cc:72
bool apply_change_group(void)
Definition recog.cc:574
bool constrain_operands_cached(rtx_insn *insn, int strict)
Definition recog.cc:2813
void init_recog_no_volatile(void)
Definition recog.cc:110
bool valid_insn_p(rtx_insn *insn)
Definition recog.cc:1486
bool raw_constraint_p
Definition recog.cc:92
void validate_replace_src_group(rtx from, rtx to, rtx_insn *insn)
Definition recog.cc:980
void cancel_changes(int num)
Definition recog.cc:600
bool validate_replace_rtx_part(rtx from, rtx to, rtx *where, rtx_insn *insn)
Definition recog.cc:929
bool verify_changes(int num)
Definition recog.cc:439
void extract_insn_cached(rtx_insn *insn)
Definition recog.cc:2780
bool peep2_reg_dead_p(int ofs, rtx reg)
Definition recog.cc:3766
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:3796
const struct insn_data_d insn_data[]
unsigned int alternative_dependent_filters(const operand_alternative *alt, int i)
Definition recog.h:112
bool(*) insn_operand_predicate_fn(rtx, machine_mode)
Definition recog.h:499
int recog_memoized(rtx_insn *insn)
Definition recog.h:336
int which_alternative
Definition recog.cc:89
rtx_insn * peephole2_insns(rtx, rtx_insn *, int *)
#define recog_data
Definition recog.h:451
op_type
Definition recog.h:39
@ OP_IN
Definition recog.h:40
@ OP_INOUT
Definition recog.h:42
@ OP_OUT
Definition recog.h:41
void cancel_changes(int)
Definition recog.cc:600
bool strict_memory_address_addr_space_p(machine_mode, rtx, addr_space_t, code_helper=ERROR_MARK)
Definition reload.cc:2162
unsigned int alternative_register_filters(const operand_alternative *alt, int i)
Definition recog.h:100
#define this_target_recog
Definition recog.h:602
const char *(*) insn_output_fn(rtx *, rtx_insn *)
Definition recog.h:500
const operand_alternative * which_op_alt()
Definition recog.h:488
struct recog_data_d * recog_data_ptr
Definition recog.cc:75
enum reg_class alternative_class(const operand_alternative *alt, int i)
Definition recog.h:91
bool added_clobbers_hard_reg_p(int)
int recog(rtx, rtx_insn *, int *)
int num_validated_changes(void)
Definition recog.cc:592
bool_attr
Definition recog.h:584
@ BA_PREFERRED_FOR_SPEED
Definition recog.h:586
@ BA_PREFERRED_FOR_SIZE
Definition recog.h:587
@ BA_ENABLED
Definition recog.h:585
@ BA_LAST
Definition recog.h:588
void insn_extract(rtx_insn *)
int volatile_ok
Definition recog.cc:72
const char * skip_alternative(const char *p)
Definition recog.h:347
void add_clobbers(rtx, int)
#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:549
const struct insn_operand_data *const operand
Definition recog.h:567
const char n_alternatives
Definition recog.h:572
const char n_generator_args
Definition recog.h:569
const char n_operands
Definition recog.h:570
const insn_gen_fn genfun
Definition recog.h:566
const char n_dups
Definition recog.h:571
const char *const name
Definition recog.h:550
const char output_format
Definition recog.h:573
union insn_data_d::insn_output_u output
Definition recog.h:503
void(*) stored_funcptr(void)
Definition recog.h:504
stored_funcptr func
Definition recog.h:521
rtx_insn * operator()(Ts... args) const
Definition recog.h:507
insn_gen_fn operator*(void) const
Definition recog.h:515
Definition recog.h:525
const char eliminable
Definition recog.h:536
const insn_operand_predicate_fn predicate
Definition recog.h:526
const char strict_low
Definition recog.h:532
const char *const constraint
Definition recog.h:528
const char allows_mem
Definition recog.h:538
machine_mode const mode
Definition recog.h:530
const char is_operator
Definition recog.h:534
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:422
rtx * operand_loc[MAX_RECOG_OPERANDS]
Definition recog.h:402
machine_mode operand_mode[MAX_RECOG_OPERANDS]
Definition recog.h:411
char is_operator[MAX_RECOG_OPERANDS]
Definition recog.h:408
rtx_insn * insn
Definition recog.h:447
recog_data_d()=default
char n_dups
Definition recog.h:438
char n_alternatives
Definition recog.h:441
enum op_type operand_type[MAX_RECOG_OPERANDS]
Definition recog.h:414
bool is_asm
Definition recog.h:444
const char * constraints[MAX_RECOG_OPERANDS]
Definition recog.h:405
recog_data_d(const recog_data_d &&)=delete
rtx operand[MAX_RECOG_OPERANDS]
Definition recog.h:399
rtx * dup_loc[MAX_DUP_OPERANDS]
Definition recog.h:418
char n_operands
Definition recog.h:435
recog_data_d(const recog_data_d &)=delete
Definition rtl.h:549
Definition recog.h:592
operand_alternative * x_op_alt[NUM_INSN_CODES]
Definition recog.h:595
alternative_mask x_bool_attr_masks[NUM_INSN_CODES][BA_LAST+1]
Definition recog.h:594
bool x_initialized
Definition recog.h:593
#define false
Definition system.h:893
#define IN_RANGE(VALUE, LOWER, UPPER)
Definition system.h:338
#define bool
Definition system.h:891
#define gcc_checking_assert(EXPR)
Definition system.h:826
#define MAX(X, Y)
Definition system.h:411
const char * single
Definition recog.h:557
constexpr insn_output_u(const char *const *m)
Definition recog.h:563
constexpr insn_output_u()
Definition recog.h:561
const char *const * multi
Definition recog.h:558
constexpr insn_output_u(const char *s)
Definition recog.h:562
constexpr insn_output_u(insn_output_fn f)
Definition recog.h:564
insn_output_fn function
Definition recog.h:559