diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2016-01-29 18:47:17 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2016-01-29 18:47:17 +0000 |
commit | 9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a (patch) | |
tree | f72efae70813e3fdbe36d5a4563ab3bf55869ca0 /gcc/genpreds.c | |
parent | 6bbacdb54436ea71d77f70f625c4a97f5c245329 (diff) | |
download | gcc-9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a.zip gcc-9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a.tar.gz gcc-9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a.tar.bz2 |
re PR target/69299 (-mavx performance degradation with r232088)
2016-01-29 Vladimir Makarov <vmakarov@redhat.com>
PR target/69299
* config/i386/constraints.md (Bm): Describe as special memory
constraint.
* doc/md.texi (DEFINE_SPECIAL_MEMORY_CONSTRAINT): Describe it.
* genoutput.c (main): Process DEFINE_SPECIAL_MEMORY_CONSTRAINT.
* genpreds.c (struct constraint_data): Add is_special_memory.
(have_special_memory_constraints, special_memory_start): New
static vars.
(special_memory_end): Ditto.
(add_constraint): Add new arg is_special_memory. Add code to
process its true value. Update have_special_memory_constraints.
(process_define_constraint): Pass the new arg.
(process_define_register_constraint): Ditto.
(choose_enum_order): Process special memory.
(write_tm_preds_h): Generate enum const CT_SPECIAL_MEMORY and
function insn_extra_special_memory_constraint.
(main): Process DEFINE_SPECIAL_MEMORY_CONSTRAINT.
* gensupport.c (process_rtx): Process
DEFINE_SPECIAL_MEMORY_CONSTRAINT.
* ira-costs.c (record_reg_classes): Process CT_SPECIAL_MEMORY.
* ira-lives.c (single_reg_class): Use
insn_extra_special_memory_constraint.
* ira.c (ira_setup_alts): Process CT_SPECIAL_MEMORY.
* lra-constraints.c (process_alt_operands): Ditto.
(curr_insn_transform): Use insn_extra_special_memory_constraint.
* recog.c (asm_operand_ok, preprocess_constraints): Process
CT_SPECIAL_MEMORY.
* reload.c (find_reloads): Ditto.
* rtl.def (DEFINE_SPECIFAL_MEMORY_CONSTRAINT): New.
* stmt.c (parse_input_constraint): Use
insn_extra_special_memory_constraint.
From-SVN: r232993
Diffstat (limited to 'gcc/genpreds.c')
-rw-r--r-- | gcc/genpreds.c | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/gcc/genpreds.c b/gcc/genpreds.c index 84c41a1..c0d7ce4 100644 --- a/gcc/genpreds.c +++ b/gcc/genpreds.c @@ -659,11 +659,11 @@ 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_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. */ + 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 + verify that there are no duplicate names. */ /* All data from one constraint definition. */ struct constraint_data @@ -681,6 +681,7 @@ struct constraint_data unsigned int is_const_dbl : 1; unsigned int is_extra : 1; unsigned int is_memory : 1; + unsigned int is_special_memory: 1; unsigned int is_address : 1; unsigned int maybe_allows_reg : 1; unsigned int maybe_allows_mem : 1; @@ -718,6 +719,7 @@ static const char const_dbl_constraints[] = "GH"; 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_address_constraints; static bool have_extra_constraints; static bool have_const_int_constraints; @@ -728,6 +730,7 @@ static unsigned int register_start, register_end; 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 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; @@ -754,20 +757,22 @@ mangle (const char *name) /* 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 and IS_ADDRESS indicate memory and address - constraints, respectively; LOC is the .md file location. + 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. - Not all combinations of arguments are valid; most importantly, REGCLASS - is mutually exclusive with EXP, and IS_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_ADDRESS are only meaningful for + constraints with EXP. This function enforces all syntactic and semantic rules about what constraints can be defined. */ static void add_constraint (const char *name, const char *regclass, - rtx exp, bool is_memory, bool is_address, - file_location loc) + rtx exp, bool is_memory, bool is_special_memory, + bool is_address, file_location loc) { struct constraint_data *c, **iter, **slot; const char *p; @@ -878,6 +883,17 @@ 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') @@ -904,6 +920,7 @@ add_constraint (const char *name, const char *regclass, c->is_const_dbl = is_const_dbl; c->is_extra = !(regclass || is_const_int || is_const_dbl); c->is_memory = is_memory; + c->is_special_memory = is_special_memory; c->is_address = is_address; c->maybe_allows_reg = true; c->maybe_allows_mem = true; @@ -930,17 +947,20 @@ add_constraint (const char *name, const char *regclass, have_const_int_constraints |= c->is_const_int; have_extra_constraints |= c->is_extra; have_memory_constraints |= c->is_memory; + have_special_memory_constraints |= c->is_special_memory; have_address_constraints |= c->is_address; num_constraints += 1; } -/* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, or - DEFINE_ADDRESS_CONSTRAINT expression, C. */ +/* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, + DEFINE_SPECIAL_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_ADDRESS_CONSTRAINT, info->loc); } @@ -950,7 +970,7 @@ static void process_define_register_constraint (md_rtx_info *info) { add_constraint (XSTR (info->def, 0), XSTR (info->def, 1), - 0, false, false, info->loc); + 0, false, false, false, info->loc); } /* Put the constraints into enum order. We want to keep constraints @@ -984,6 +1004,12 @@ choose_enum_order (void) enum_order[next++] = c; memory_end = next; + special_memory_start = next; + FOR_ALL_CONSTRAINTS (c) + if (c->is_special_memory) + enum_order[next++] = c; + special_memory_end = next; + address_start = next; FOR_ALL_CONSTRAINTS (c) if (c->is_address) @@ -992,27 +1018,31 @@ 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_address + if (!c->is_register && !c->is_const_int && !c->is_memory + && !c->is_special_memory && !c->is_address && !c->maybe_allows_reg && !c->maybe_allows_mem) enum_order[next++] = c; maybe_allows_none_end = next; maybe_allows_reg_start = next; FOR_ALL_CONSTRAINTS (c) - if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address + if (!c->is_register && !c->is_const_int && !c->is_memory + && !c->is_special_memory && !c->is_address && c->maybe_allows_reg && !c->maybe_allows_mem) enum_order[next++] = c; maybe_allows_reg_end = next; maybe_allows_mem_start = next; FOR_ALL_CONSTRAINTS (c) - if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address + if (!c->is_register && !c->is_const_int && !c->is_memory + && !c->is_special_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_address + if (!c->is_register && !c->is_const_int && !c->is_memory + && !c->is_special_memory && !c->is_address && c->maybe_allows_reg && c->maybe_allows_mem) enum_order[next++] = c; gcc_assert (next == num_constraints); @@ -1431,6 +1461,8 @@ write_tm_preds_h (void) register_start, register_end); write_range_function ("insn_extra_memory_constraint", memory_start, memory_end); + write_range_function ("insn_extra_special_memory_constraint", + special_memory_start, special_memory_end); write_range_function ("insn_extra_address_constraint", address_start, address_end); write_allows_reg_mem_function (); @@ -1479,6 +1511,7 @@ write_tm_preds_h (void) " CT_REGISTER,\n" " CT_CONST_INT,\n" " CT_MEMORY,\n" + " CT_SPECIAL_MEMORY,\n" " CT_ADDRESS,\n" " CT_FIXED_FORM\n" "};\n" @@ -1491,6 +1524,8 @@ write_tm_preds_h (void) values.safe_push (std::make_pair (const_int_start, "CT_CONST_INT")); 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")); if (address_start != address_end) values.safe_push (std::make_pair (address_start, "CT_ADDRESS")); if (address_end != num_constraints) @@ -1602,6 +1637,7 @@ main (int argc, char **argv) case DEFINE_CONSTRAINT: case DEFINE_MEMORY_CONSTRAINT: + case DEFINE_SPECIAL_MEMORY_CONSTRAINT: case DEFINE_ADDRESS_CONSTRAINT: process_define_constraint (&info); break; |