* config/tc-mips.c (md_parse_option): Accept -mcpu=4400, 4600, and

orion.
This commit is contained in:
Ian Lance Taylor 1994-08-09 15:18:26 +00:00
parent 3cdf590141
commit 55933a587a
2 changed files with 88 additions and 46 deletions

View file

@ -1,3 +1,14 @@
Tue Aug 9 11:12:13 1994 Ian Lance Taylor (ian@sanguine.cygnus.com)
* config/tc-mips.c (md_parse_option): Accept -mcpu=4400, 4600, and
orion.
Mon Aug 8 16:28:08 1994 Steve Chamberlain (sac@jonny.cygnus.com)
* as.h: Remove FOPEN_WB patch of Aug 6.
* configure.in: Configure for ho-go32 correctly.
* config/ho-go32.h: Fix copyright.
Mon Aug 8 11:59:51 1994 Jeff Law (law@snake.cs.utah.edu) Mon Aug 8 11:59:51 1994 Jeff Law (law@snake.cs.utah.edu)
* gas/config/tc-hppa.c (md_pseudo_table): Delete redundant * gas/config/tc-hppa.c (md_pseudo_table): Delete redundant

View file

@ -1726,6 +1726,7 @@ macro (ip)
offsetT maxnum; offsetT maxnum;
bfd_reloc_code_real_type r; bfd_reloc_code_real_type r;
char *p; char *p;
int hold_mips_optimize;
treg = (ip->insn_opcode >> 16) & 0x1f; treg = (ip->insn_opcode >> 16) & 0x1f;
dreg = (ip->insn_opcode >> 11) & 0x1f; dreg = (ip->insn_opcode >> 11) & 0x1f;
@ -2542,7 +2543,13 @@ macro (ip)
off1 = -8; off1 = -8;
} }
/* Set mips_optimize around the lui instruction to avoid
inserting an unnecessary nop after the lw. */
hold_mips_optimize = mips_optimize;
mips_optimize = 2;
macro_build_lui ((char *) NULL, &icnt, &expr1, AT); macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
mips_optimize = hold_mips_optimize;
macro_build ((char *) NULL, &icnt, &expr1, macro_build ((char *) NULL, &icnt, &expr1,
mips_isa < 3 ? "addiu" : "daddiu", mips_isa < 3 ? "addiu" : "daddiu",
"t,r,j", AT, AT, (int) BFD_RELOC_LO16); "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
@ -2989,7 +2996,14 @@ macro (ip)
return; return;
case M_LI_SS: case M_LI_SS:
if (mips_pic == NO_PIC) if (imm_expr.X_op == O_constant)
{
load_register (&icnt, AT, &imm_expr);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
"mtc1", "t,G", AT, treg);
break;
}
else
{ {
assert (offset_expr.X_op == O_symbol assert (offset_expr.X_op == O_symbol
&& strcmp (segment_name (S_GET_SEGMENT && strcmp (segment_name (S_GET_SEGMENT
@ -3000,20 +3014,6 @@ macro (ip)
treg, (int) BFD_RELOC_MIPS_LITERAL, GP); treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
return; return;
} }
else if (mips_pic == SVR4_PIC
|| mips_pic == EMBEDDED_PIC)
{
assert (imm_expr.X_op == O_constant);
load_register (&icnt, AT, &imm_expr);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
"mtc1", "t,G", AT, treg);
break;
}
else
{
abort ();
return;
}
case M_LI_D: case M_LI_D:
/* We know that sym is in the .rdata section. First we get the /* We know that sym is in the .rdata section. First we get the
@ -3068,15 +3068,11 @@ macro (ip)
break; break;
case M_LI_DD: case M_LI_DD:
if (mips_pic == NO_PIC
|| mips_pic == EMBEDDED_PIC)
{
/* Load a floating point number from the .lit8 section. */
assert (offset_expr.X_op == O_symbol assert (offset_expr.X_op == O_symbol
&& strcmp (segment_name (S_GET_SEGMENT
(offset_expr.X_add_symbol)),
".lit8") == 0
&& offset_expr.X_add_number == 0); && offset_expr.X_add_number == 0);
s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
if (strcmp (s, ".lit8") == 0)
{
if (mips_isa >= 2) if (mips_isa >= 2)
{ {
macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1", macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
@ -3087,24 +3083,29 @@ macro (ip)
r = BFD_RELOC_MIPS_LITERAL; r = BFD_RELOC_MIPS_LITERAL;
goto dob; goto dob;
} }
else if (mips_pic == SVR4_PIC) else
{ {
/* Load the double from the .rdata section. */ assert (strcmp (s, RDATA_SECTION_NAME) == 0);
if (mips_pic == SVR4_PIC)
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
mips_isa < 3 ? "lw" : "ld", mips_isa < 3 ? "lw" : "ld",
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
else
{
/* FIXME: This won't work for a 64 bit address. */
macro_build_lui ((char *) NULL, &icnt, &offset_expr, AT);
}
if (mips_isa >= 2) if (mips_isa >= 2)
{ {
macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1", macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
"T,o(b)", treg, (int) BFD_RELOC_LO16, GP); "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
break; break;
} }
breg = AT; breg = AT;
r = BFD_RELOC_LO16; r = BFD_RELOC_LO16;
goto dob; goto dob;
} }
else
abort ();
case M_L_DOB: case M_L_DOB:
/* Even on a big endian machine $fn comes before $fn+1. We have /* Even on a big endian machine $fn comes before $fn+1. We have
@ -3249,9 +3250,16 @@ macro (ip)
coproc ? treg + 1 : treg, coproc ? treg + 1 : treg,
(int) BFD_RELOC_MIPS_GPREL, tempreg); (int) BFD_RELOC_MIPS_GPREL, tempreg);
offset_expr.X_add_number += 4; offset_expr.X_add_number += 4;
/* Set mips_optimize to 2 to avoid inserting an
undesired nop. */
hold_mips_optimize = mips_optimize;
mips_optimize = 2;
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
coproc ? treg : treg + 1, coproc ? treg : treg + 1,
(int) BFD_RELOC_MIPS_GPREL, tempreg); (int) BFD_RELOC_MIPS_GPREL, tempreg);
mips_optimize = hold_mips_optimize;
p = frag_var (rs_machine_dependent, 12 + off, 0, p = frag_var (rs_machine_dependent, 12 + off, 0,
RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1, RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
used_at && mips_noat), used_at && mips_noat),
@ -3331,9 +3339,16 @@ macro (ip)
coproc ? treg + 1 : treg, coproc ? treg + 1 : treg,
(int) BFD_RELOC_LO16, AT); (int) BFD_RELOC_LO16, AT);
expr1.X_add_number += 4; expr1.X_add_number += 4;
/* Set mips_optimize to 2 to avoid inserting an undesired
nop. */
hold_mips_optimize = mips_optimize;
mips_optimize = 2;
macro_build ((char *) NULL, &icnt, &expr1, s, fmt, macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
coproc ? treg : treg + 1, coproc ? treg : treg + 1,
(int) BFD_RELOC_LO16, AT); (int) BFD_RELOC_LO16, AT);
mips_optimize = hold_mips_optimize;
(void) frag_var (rs_machine_dependent, 0, 0, (void) frag_var (rs_machine_dependent, 0, 0,
RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0), RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
offset_expr.X_add_symbol, (long) 0, offset_expr.X_add_symbol, (long) 0,
@ -4449,15 +4464,15 @@ mips_ip (str, ip)
f -- immediate value f -- immediate value
l -- .lit4 l -- .lit4
When generating SVR4 PIC code, we do not use the The .lit4 and .lit8 sections are only used if
.lit8 or .lit4 sections at all, in order to permitted by the -G argument.
reserve the entire global offset table. When
generating embedded PIC code, we use the .lit8 When generating embedded PIC code, we use the
section but not the .lit4 section (we can do .lit4 .lit8 section but not the .lit4 section (we can do
inline easily; we need to put .lit8 somewhere in .lit4 inline easily; we need to put .lit8
the data segment, and using .lit8 permits the somewhere in the data segment, and using .lit8
linker to eventually combine identical .lit8 permits the linker to eventually combine identical
entries). */ .lit8 entries). */
f64 = *args == 'F' || *args == 'L'; f64 = *args == 'F' || *args == 'L';
@ -4477,7 +4492,12 @@ mips_ip (str, ip)
assert (length == (f64 ? 8 : 4)); assert (length == (f64 ? 8 : 4));
if (*args == 'f' if (*args == 'f'
|| (mips_pic != NO_PIC && *args == 'l')) || (*args == 'l'
&& (mips_pic == EMBEDDED_PIC
#ifdef GPOPT
|| g_switch_value < 4
#endif
)))
{ {
imm_expr.X_op = O_constant; imm_expr.X_op = O_constant;
if (byte_order == LITTLE_ENDIAN) if (byte_order == LITTLE_ENDIAN)
@ -4505,15 +4525,19 @@ mips_ip (str, ip)
{ {
default: /* unused default case avoids warnings. */ default: /* unused default case avoids warnings. */
case 'L': case 'L':
newname = (mips_pic != SVR4_PIC newname = ".lit8";
? ".lit8" #ifdef GPOPT
: RDATA_SECTION_NAME); if (g_switch_value < 8)
newname = RDATA_SECTION_NAME;
#endif
break; break;
case 'F': case 'F':
newname = RDATA_SECTION_NAME; newname = RDATA_SECTION_NAME;
break; break;
case 'l': case 'l':
assert (mips_pic == NO_PIC); #ifdef GPOPT
assert (g_switch_value >= 4);
#endif
newname = ".lit4"; newname = ".lit4";
break; break;
} }
@ -5019,7 +5043,9 @@ md_parse_option (c, arg)
case '4': case '4':
if (strcmp (p, "4000") == 0 if (strcmp (p, "4000") == 0
|| strcmp (p, "4k") == 0 || strcmp (p, "4k") == 0
|| strcmp (p, "4K") == 0) || strcmp (p, "4K") == 0
|| strcmp (p, "4400") == 0
|| strcmp (p, "4600") == 0)
mips_isa = 3; mips_isa = 3;
break; break;
@ -5029,6 +5055,11 @@ md_parse_option (c, arg)
|| strcmp (p, "6K") == 0) || strcmp (p, "6K") == 0)
mips_isa = 2; mips_isa = 2;
break; break;
case 'o':
if (strcmp (p, "orion") == 0)
mips_isa = 3;
break;
} }
if (mips_isa == -1) if (mips_isa == -1)