X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-mips.c;h=b538ff01238452d82cd6311012e916a40cfb28e6;hb=42e58860e260edf7d92734c01b95fccf9ddb2431;hp=118b91dfe61e090f2b3f982b982591d0e5ec705e;hpb=991f40a9fa668eb65159ee9884bf89c8cbc09f02;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 118b91dfe6..b538ff0123 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -1410,6 +1410,8 @@ enum options OPTION_NO_SMARTMIPS, OPTION_DSPR2, OPTION_NO_DSPR2, + OPTION_DSPR3, + OPTION_NO_DSPR3, OPTION_EVA, OPTION_NO_EVA, OPTION_XPA, @@ -1522,6 +1524,8 @@ struct option md_longopts[] = {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS}, {"mdspr2", no_argument, NULL, OPTION_DSPR2}, {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2}, + {"mdspr3", no_argument, NULL, OPTION_DSPR3}, + {"mno-dspr3", no_argument, NULL, OPTION_NO_DSPR3}, {"meva", no_argument, NULL, OPTION_EVA}, {"mno-eva", no_argument, NULL, OPTION_NO_EVA}, {"mmicromips", no_argument, NULL, OPTION_MICROMIPS}, @@ -1663,6 +1667,11 @@ static const struct mips_ase mips_ases[] = { 2, 2, 2, 2, -1 }, + { "dspr3", ASE_DSP | ASE_DSPR2 | ASE_DSPR3, 0, + OPTION_DSPR3, OPTION_NO_DSPR3, + 6, 6, -1, -1, + -1 }, + { "eva", ASE_EVA, 0, OPTION_EVA, OPTION_NO_EVA, 2, 2, 2, 2, @@ -1716,7 +1725,7 @@ static const struct mips_ase mips_ases[] = { /* Groups of ASE_* flags that represent different revisions of an ASE. */ static const unsigned int mips_ase_groups[] = { - ASE_DSP | ASE_DSPR2 + ASE_DSP | ASE_DSPR2 | ASE_DSPR3 }; /* Pseudo-op table. @@ -3601,21 +3610,20 @@ md_begin (void) for (i = 0; i < 32; i++) { - char regname[7]; + char regname[6]; /* R5900 VU0 floating-point register. */ - regname[sizeof (rename) - 1] = 0; - snprintf (regname, sizeof (regname) - 1, "$vf%d", i); + sprintf (regname, "$vf%d", i); symbol_table_insert (symbol_new (regname, reg_section, RTYPE_VF | i, &zero_address_frag)); /* R5900 VU0 integer register. */ - snprintf (regname, sizeof (regname) - 1, "$vi%d", i); + sprintf (regname, "$vi%d", i); symbol_table_insert (symbol_new (regname, reg_section, RTYPE_VI | i, &zero_address_frag)); /* MSA register. */ - snprintf (regname, sizeof (regname) - 1, "$w%d", i); + sprintf (regname, "$w%d", i); symbol_table_insert (symbol_new (regname, reg_section, RTYPE_MSA | i, &zero_address_frag)); } @@ -15514,10 +15522,29 @@ struct mips_option_stack static struct mips_option_stack *mips_opts_stack; -static bfd_boolean +/* Return status for .set/.module option handling. */ + +enum code_option_type +{ + /* Unrecognized option. */ + OPTION_TYPE_BAD = -1, + + /* Ordinary option. */ + OPTION_TYPE_NORMAL, + + /* ISA changing option. */ + OPTION_TYPE_ISA +}; + +/* Handle common .set/.module options. Return status indicating option + type. */ + +static enum code_option_type parse_code_option (char * name) { + bfd_boolean isa_set = FALSE; const struct mips_ase *ase; + if (strncmp (name, "at=", 3) == 0) { char *s = name + 3; @@ -15590,6 +15617,7 @@ parse_code_option (char * name) { mips_opts.arch = p->cpu; mips_opts.isa = p->isa; + isa_set = TRUE; } } else if (strncmp (name, "mips", 4) == 0) @@ -15603,6 +15631,7 @@ parse_code_option (char * name) { mips_opts.arch = p->cpu; mips_opts.isa = p->isa; + isa_set = TRUE; } } else @@ -15621,8 +15650,9 @@ parse_code_option (char * name) else if (strcmp (name, "nosym32") == 0) mips_opts.sym32 = FALSE; else - return FALSE; - return TRUE; + return OPTION_TYPE_BAD; + + return isa_set ? OPTION_TYPE_ISA : OPTION_TYPE_NORMAL; } /* Handle the .set pseudo-op. */ @@ -15630,8 +15660,8 @@ parse_code_option (char * name) static void s_mipsset (int x ATTRIBUTE_UNUSED) { + enum code_option_type type = OPTION_TYPE_NORMAL; char *name = input_line_pointer, ch; - int prev_isa = mips_opts.isa; file_mips_check_options (); @@ -15708,12 +15738,16 @@ s_mipsset (int x ATTRIBUTE_UNUSED) free (s); } } - else if (!parse_code_option (name)) - as_warn (_("tried to set unrecognized symbol: %s\n"), name); + else + { + type = parse_code_option (name); + if (type == OPTION_TYPE_BAD) + as_warn (_("tried to set unrecognized symbol: %s\n"), name); + } /* The use of .set [arch|cpu]= historically 'fixes' the width of gp and fp registers based on what is supported by the arch/cpu. */ - if (mips_opts.isa != prev_isa) + if (type == OPTION_TYPE_ISA) { switch (mips_opts.isa) { @@ -15780,7 +15814,7 @@ s_module (int ignore ATTRIBUTE_UNUSED) if (!file_mips_opts_checked) { - if (!parse_code_option (name)) + if (parse_code_option (name) == OPTION_TYPE_BAD) as_bad (_(".module used with unrecognized symbol: %s\n"), name); /* Update module level settings from mips_opts. */ @@ -17929,6 +17963,8 @@ mips_convert_ase_flags (int ase) ext_ases |= AFL_ASE_DSP; if (ase & ASE_DSPR2) ext_ases |= AFL_ASE_DSPR2; + if (ase & ASE_DSPR3) + ext_ases |= AFL_ASE_DSPR3; if (ase & ASE_EVA) ext_ases |= AFL_ASE_EVA; if (ase & ASE_MCU) @@ -18938,6 +18974,9 @@ MIPS options:\n\ -mdspr2 generate DSP R2 instructions\n\ -mno-dspr2 do not generate DSP R2 instructions\n")); fprintf (stream, _("\ +-mdspr3 generate DSP R3 instructions\n\ +-mno-dspr3 do not generate DSP R3 instructions\n")); + fprintf (stream, _("\ -mmt generate MT instructions\n\ -mno-mt do not generate MT instructions\n")); fprintf (stream, _("\