diff options
Diffstat (limited to 'gcc/genpreds.c')
-rw-r--r-- | gcc/genpreds.c | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/gcc/genpreds.c b/gcc/genpreds.c index 8499a2a..9d9715f 100644 --- a/gcc/genpreds.c +++ b/gcc/genpreds.c @@ -110,7 +110,7 @@ process_define_predicate (md_rtx_info *info) becomes - static inline int basereg_operand_1(rtx op, machine_mode mode) + static inline bool basereg_operand_1(rtx op, machine_mode mode) { if (GET_CODE (op) == SUBREG) op = SUBREG_REG (op); @@ -151,7 +151,7 @@ write_predicate_subfunction (struct pred_data *p) p->exp = and_exp; - printf ("static inline int\n" + printf ("static inline bool\n" "%s_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)\n", p->name); rtx_reader_ptr->print_md_ptr_loc (p->c_block); @@ -651,7 +651,7 @@ write_one_predicate_function (struct pred_data *p) /* A normal predicate can legitimately not look at machine_mode if it accepts only CONST_INTs and/or CONST_WIDE_INT and/or CONST_DOUBLEs. */ - printf ("int\n%s (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n{\n", + printf ("bool\n%s (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n{\n", p->name); write_predicate_stmts (p->exp); fputs ("}\n\n", stdout); @@ -660,9 +660,9 @@ write_one_predicate_function (struct pred_data *p) /* Constraints fall into two categories: register constraints (define_register_constraint), and others (define_constraint, define_memory_constraint, define_special_memory_constraint, - define_address_constraint). We work out automatically which of the - various old-style macros they correspond to, and produce - appropriate code. They all go in the same hash table so we can + define_relaxed_memory_constraint, define_address_constraint). We work out + automatically which of the various old-style macros they correspond to, and + produce appropriate code. They all go in the same hash table so we can verify that there are no duplicate names. */ /* All data from one constraint definition. */ @@ -683,6 +683,7 @@ public: unsigned int is_extra : 1; unsigned int is_memory : 1; unsigned int is_special_memory: 1; + unsigned int is_relaxed_memory: 1; unsigned int is_address : 1; unsigned int maybe_allows_reg : 1; unsigned int maybe_allows_mem : 1; @@ -721,6 +722,7 @@ static unsigned int constraint_max_namelen; static bool have_register_constraints; static bool have_memory_constraints; static bool have_special_memory_constraints; +static bool have_relaxed_memory_constraints; static bool have_address_constraints; static bool have_extra_constraints; static bool have_const_int_constraints; @@ -732,6 +734,7 @@ static unsigned int satisfied_start; static unsigned int const_int_start, const_int_end; static unsigned int memory_start, memory_end; static unsigned int special_memory_start, special_memory_end; +static unsigned int relaxed_memory_start, relaxed_memory_end; static unsigned int address_start, address_end; static unsigned int maybe_allows_none_start, maybe_allows_none_end; static unsigned int maybe_allows_reg_start, maybe_allows_reg_end; @@ -756,16 +759,16 @@ mangle (const char *name) return XOBFINISH (rtl_obstack, const char *); } -/* Add one constraint, of any sort, to the tables. NAME is its name; - REGCLASS is the register class, if any; EXP is the expression to - test, if any; IS_MEMORY, IS_SPECIAL_MEMORY and IS_ADDRESS indicate - memory, special memory, and address constraints, respectively; LOC - is the .md file location. +/* Add one constraint, of any sort, to the tables. NAME is its name; REGCLASS + is the register class, if any; EXP is the expression to test, if any; + IS_MEMORY, IS_SPECIAL_MEMORY, IS_RELAXED_MEMORY and IS_ADDRESS indicate + memory, special memory, and address constraints, respectively; LOC is the .md + file location. - Not all combinations of arguments are valid; most importantly, - REGCLASS is mutually exclusive with EXP, and - IS_MEMORY/IS_SPECIAL_MEMORY/IS_ADDRESS are only meaningful for - constraints with EXP. + Not all combinations of arguments are valid; most importantly, REGCLASS is + mutually exclusive with EXP, and + IS_MEMORY/IS_SPECIAL_MEMORY/IS_RELAXED_MEMORY/IS_ADDRESS are only meaningful + for constraints with EXP. This function enforces all syntactic and semantic rules about what constraints can be defined. */ @@ -773,7 +776,7 @@ mangle (const char *name) static void add_constraint (const char *name, const char *regclass, rtx exp, bool is_memory, bool is_special_memory, - bool is_address, file_location loc) + bool is_relaxed_memory, bool is_address, file_location loc) { class constraint_data *c, **iter, **slot; const char *p; @@ -873,7 +876,7 @@ add_constraint (const char *name, const char *regclass, return; } - if (is_memory) + if (is_memory || is_special_memory || is_relaxed_memory) { if (name[1] == '\0') error_at (loc, "constraint letter '%c' cannot be a " @@ -884,17 +887,6 @@ add_constraint (const char *name, const char *regclass, name, name[0]); return; } - else if (is_special_memory) - { - if (name[1] == '\0') - error_at (loc, "constraint letter '%c' cannot be a " - "special memory constraint", name[0]); - else - error_at (loc, "constraint name '%s' begins with '%c', " - "and therefore cannot be a special memory constraint", - name, name[0]); - return; - } else if (is_address) { if (name[1] == '\0') @@ -922,6 +914,7 @@ add_constraint (const char *name, const char *regclass, c->is_extra = !(regclass || is_const_int || is_const_dbl); c->is_memory = is_memory; c->is_special_memory = is_special_memory; + c->is_relaxed_memory = is_relaxed_memory; c->is_address = is_address; c->maybe_allows_reg = true; c->maybe_allows_mem = true; @@ -949,19 +942,21 @@ add_constraint (const char *name, const char *regclass, have_extra_constraints |= c->is_extra; have_memory_constraints |= c->is_memory; have_special_memory_constraints |= c->is_special_memory; + have_relaxed_memory_constraints |= c->is_relaxed_memory; have_address_constraints |= c->is_address; num_constraints += 1; } /* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, - DEFINE_SPECIAL_MEMORY_CONSTRAINT, or DEFINE_ADDRESS_CONSTRAINT - expression, C. */ + DEFINE_SPECIAL_MEMORY_CONSTRAINT, DEFINE_RELAXED_MEMORY_CONSTRAINT, or + DEFINE_ADDRESS_CONSTRAINT expression, C. */ static void process_define_constraint (md_rtx_info *info) { add_constraint (XSTR (info->def, 0), 0, XEXP (info->def, 2), GET_CODE (info->def) == DEFINE_MEMORY_CONSTRAINT, GET_CODE (info->def) == DEFINE_SPECIAL_MEMORY_CONSTRAINT, + GET_CODE (info->def) == DEFINE_RELAXED_MEMORY_CONSTRAINT, GET_CODE (info->def) == DEFINE_ADDRESS_CONSTRAINT, info->loc); } @@ -971,7 +966,7 @@ static void process_define_register_constraint (md_rtx_info *info) { add_constraint (XSTR (info->def, 0), XSTR (info->def, 1), - 0, false, false, false, info->loc); + 0, false, false, false, false, info->loc); } /* Put the constraints into enum order. We want to keep constraints @@ -1011,6 +1006,12 @@ choose_enum_order (void) enum_order[next++] = c; special_memory_end = next; + relaxed_memory_start = next; + FOR_ALL_CONSTRAINTS (c) + if (c->is_relaxed_memory) + enum_order[next++] = c; + relaxed_memory_end = next; + address_start = next; FOR_ALL_CONSTRAINTS (c) if (c->is_address) @@ -1020,7 +1021,7 @@ choose_enum_order (void) maybe_allows_none_start = next; FOR_ALL_CONSTRAINTS (c) if (!c->is_register && !c->is_const_int && !c->is_memory - && !c->is_special_memory && !c->is_address + && !c->is_special_memory && !c->is_relaxed_memory && !c->is_address && !c->maybe_allows_reg && !c->maybe_allows_mem) enum_order[next++] = c; maybe_allows_none_end = next; @@ -1028,7 +1029,7 @@ choose_enum_order (void) maybe_allows_reg_start = next; FOR_ALL_CONSTRAINTS (c) if (!c->is_register && !c->is_const_int && !c->is_memory - && !c->is_special_memory && !c->is_address + && !c->is_special_memory && !c->is_relaxed_memory && !c->is_address && c->maybe_allows_reg && !c->maybe_allows_mem) enum_order[next++] = c; maybe_allows_reg_end = next; @@ -1036,14 +1037,14 @@ choose_enum_order (void) maybe_allows_mem_start = next; FOR_ALL_CONSTRAINTS (c) if (!c->is_register && !c->is_const_int && !c->is_memory - && !c->is_special_memory && !c->is_address + && !c->is_special_memory && !c->is_relaxed_memory && !c->is_address && !c->maybe_allows_reg && c->maybe_allows_mem) enum_order[next++] = c; maybe_allows_mem_end = next; FOR_ALL_CONSTRAINTS (c) if (!c->is_register && !c->is_const_int && !c->is_memory - && !c->is_special_memory && !c->is_address + && !c->is_special_memory && !c->is_relaxed_memory && !c->is_address && c->maybe_allows_reg && c->maybe_allows_mem) enum_order[next++] = c; gcc_assert (next == num_constraints); @@ -1415,7 +1416,7 @@ write_tm_preds_h (void) #ifdef HAVE_MACHINE_MODES"); FOR_ALL_PREDICATES (p) - printf ("extern int %s (rtx, machine_mode);\n", p->name); + printf ("extern bool %s (rtx, machine_mode);\n", p->name); puts ("#endif /* HAVE_MACHINE_MODES */\n"); @@ -1466,6 +1467,8 @@ write_tm_preds_h (void) memory_start, memory_end); write_range_function ("insn_extra_special_memory_constraint", special_memory_start, special_memory_end); + write_range_function ("insn_extra_relaxed_memory_constraint", + relaxed_memory_start, relaxed_memory_end); write_range_function ("insn_extra_address_constraint", address_start, address_end); write_allows_reg_mem_function (); @@ -1515,6 +1518,7 @@ write_tm_preds_h (void) " CT_CONST_INT,\n" " CT_MEMORY,\n" " CT_SPECIAL_MEMORY,\n" + " CT_RELAXED_MEMORY,\n" " CT_ADDRESS,\n" " CT_FIXED_FORM\n" "};\n" @@ -1528,7 +1532,11 @@ write_tm_preds_h (void) if (memory_start != memory_end) values.safe_push (std::make_pair (memory_start, "CT_MEMORY")); if (special_memory_start != special_memory_end) - values.safe_push (std::make_pair (special_memory_start, "CT_SPECIAL_MEMORY")); + values.safe_push (std::make_pair (special_memory_start, + "CT_SPECIAL_MEMORY")); + if (relaxed_memory_start != relaxed_memory_end) + values.safe_push (std::make_pair (relaxed_memory_start, + "CT_RELAXED_MEMORY")); if (address_start != address_end) values.safe_push (std::make_pair (address_start, "CT_ADDRESS")); if (address_end != num_constraints) @@ -1645,6 +1653,7 @@ main (int argc, const char **argv) case DEFINE_CONSTRAINT: case DEFINE_MEMORY_CONSTRAINT: case DEFINE_SPECIAL_MEMORY_CONSTRAINT: + case DEFINE_RELAXED_MEMORY_CONSTRAINT: case DEFINE_ADDRESS_CONSTRAINT: process_define_constraint (&info); break; |