* config/tc-mips.c: Replace GP in comments by $gp.

(mips_big_got): Initialize.
	(mips_trap): Initialize.
	(load_address): Use mips_gp_register instead of hardcoded value.
	Remove dbl parameter, use HAVE_32BIT_ADDRESSES instead.
	(macro): Use mips_gp_register instead of hardcoded value.
	(macro2): Change load_address calls.
	(md_pcrel_from): Comment formatting.
	(s_cpload): Use mips_gp_register instead of hardcoded value.
	(s_cprestore): Likewise. Comment formatting.
	(s_gpword): Fix data type.
	(s_cpadd): Use mips_gp_register instead of hardcoded value.
	(nopic_need_relax): Replace GP in comments by $gp.
	(mips_elf_final_processing): Better comment.
This commit is contained in:
Thiemo Seufer 2002-05-28 19:23:09 +00:00
parent 485721b1e7
commit c99147661e
2 changed files with 94 additions and 67 deletions

View File

@ -1,3 +1,20 @@
2002-05-28 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* config/tc-mips.c: Replace GP in comments by $gp.
(mips_big_got): Initialize.
(mips_trap): Initialize.
(load_address): Use mips_gp_register instead of hardcoded value.
Remove dbl parameter, use HAVE_32BIT_ADDRESSES instead.
(macro): Use mips_gp_register instead of hardcoded value.
(macro2): Change load_address calls.
(md_pcrel_from): Comment formatting.
(s_cpload): Use mips_gp_register instead of hardcoded value.
(s_cprestore): Likewise. Comment formatting.
(s_gpword): Fix data type.
(s_cpadd): Use mips_gp_register instead of hardcoded value.
(nopic_need_relax): Replace GP in comments by $gp.
(mips_elf_final_processing): Better comment.
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net> 2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net>
* configure.in: Add DLX configuraton * configure.in: Add DLX configuraton

View File

@ -326,13 +326,13 @@ static enum mips_pic_level mips_pic;
/* Warn about all NOPS that the assembler generates. */ /* Warn about all NOPS that the assembler generates. */
static int warn_nops = 0; static int warn_nops = 0;
/* 1 if we should generate 32 bit offsets from the GP register in /* 1 if we should generate 32 bit offsets from the $gp register in
SVR4_PIC mode. Currently has no meaning in other modes. */ SVR4_PIC mode. Currently has no meaning in other modes. */
static int mips_big_got; static int mips_big_got = 0;
/* 1 if trap instructions should used for overflow rather than break /* 1 if trap instructions should used for overflow rather than break
instructions. */ instructions. */
static int mips_trap; static int mips_trap = 0;
/* 1 if double width floating point constants should not be constructed /* 1 if double width floating point constants should not be constructed
by assembling two single width halves into two single width floating by assembling two single width halves into two single width floating
@ -702,7 +702,7 @@ static void set_at PARAMS ((int *counter, int reg, int unsignedp));
static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip, static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
expressionS *)); expressionS *));
static void load_register PARAMS ((int *, int, expressionS *, int)); static void load_register PARAMS ((int *, int, expressionS *, int));
static void load_address PARAMS ((int *, int, expressionS *, int, int *)); static void load_address PARAMS ((int *, int, expressionS *, int *));
static void move_register PARAMS ((int *, int, int)); static void move_register PARAMS ((int *, int, int));
static void macro PARAMS ((struct mips_cl_insn * ip)); static void macro PARAMS ((struct mips_cl_insn * ip));
static void mips16_macro PARAMS ((struct mips_cl_insn * ip)); static void mips16_macro PARAMS ((struct mips_cl_insn * ip));
@ -3660,11 +3660,10 @@ load_register (counter, reg, ep, dbl)
/* Load an address into a register. */ /* Load an address into a register. */
static void static void
load_address (counter, reg, ep, dbl, used_at) load_address (counter, reg, ep, used_at)
int *counter; int *counter;
int reg; int reg;
expressionS *ep; expressionS *ep;
int dbl;
int *used_at; int *used_at;
{ {
char *p = NULL; char *p = NULL;
@ -3678,7 +3677,7 @@ load_address (counter, reg, ep, dbl, used_at)
if (ep->X_op == O_constant) if (ep->X_op == O_constant)
{ {
load_register (counter, reg, ep, dbl); load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
return; return;
} }
@ -3708,7 +3707,7 @@ load_address (counter, reg, ep, dbl, used_at)
dsll $reg,16 dsll $reg,16
daddiu $reg,<sym> (BFD_RELOC_LO16) daddiu $reg,<sym> (BFD_RELOC_LO16)
*/ */
if (dbl) if (HAVE_64BIT_ADDRESSES)
{ {
/* We don't do GP optimization for now because RELAX_ENCODE can't /* We don't do GP optimization for now because RELAX_ENCODE can't
hold the data for such large chunks. */ hold the data for such large chunks. */
@ -3752,8 +3751,8 @@ load_address (counter, reg, ep, dbl, used_at)
{ {
frag_grow (20); frag_grow (20);
macro_build ((char *) NULL, counter, ep, macro_build ((char *) NULL, counter, ep,
dbl ? "daddiu" : "addiu", "t,r,j", reg, GP, HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
(int) BFD_RELOC_GPREL16); reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
p = frag_var (rs_machine_dependent, 8, 0, p = frag_var (rs_machine_dependent, 8, 0,
RELAX_ENCODE (4, 8, 0, 4, 0, RELAX_ENCODE (4, 8, 0, 4, 0,
mips_opts.warn_about_macros), mips_opts.warn_about_macros),
@ -3762,7 +3761,8 @@ load_address (counter, reg, ep, dbl, used_at)
macro_build_lui (p, counter, ep, reg); macro_build_lui (p, counter, ep, reg);
if (p != NULL) if (p != NULL)
p += 4; p += 4;
macro_build (p, counter, ep, dbl ? "daddiu" : "addiu", macro_build (p, counter, ep,
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
"t,r,j", reg, reg, (int) BFD_RELOC_LO16); "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
} }
} }
@ -3781,8 +3781,8 @@ load_address (counter, reg, ep, dbl, used_at)
ep->X_add_number = 0; ep->X_add_number = 0;
frag_grow (20); frag_grow (20);
macro_build ((char *) NULL, counter, ep, macro_build ((char *) NULL, counter, ep,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
"t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP); reg, (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", ""); macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
p = frag_var (rs_machine_dependent, 4, 0, p = frag_var (rs_machine_dependent, 4, 0,
RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros), RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
@ -3862,8 +3862,9 @@ load_address (counter, reg, ep, dbl, used_at)
/* We always do /* We always do
addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16) addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
*/ */
macro_build ((char *) NULL, counter, ep, dbl ? "daddiu" : "addiu", macro_build ((char *) NULL, counter, ep,
"t,r,j", reg, GP, (int) BFD_RELOC_GPREL16); HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
"t,r,j", reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
} }
else else
abort (); abort ();
@ -4744,7 +4745,8 @@ macro (ip)
{ {
frag_grow (20); frag_grow (20);
macro_build ((char *) NULL, &icnt, &offset_expr, "addiu", macro_build ((char *) NULL, &icnt, &offset_expr, "addiu",
"t,r,j", tempreg, GP, (int) BFD_RELOC_GPREL16); "t,r,j", tempreg, mips_gp_register,
(int) BFD_RELOC_GPREL16);
p = frag_var (rs_machine_dependent, 8, 0, p = frag_var (rs_machine_dependent, 8, 0,
RELAX_ENCODE (4, 8, 0, 4, 0, RELAX_ENCODE (4, 8, 0, 4, 0,
mips_opts.warn_about_macros), mips_opts.warn_about_macros),
@ -4796,7 +4798,7 @@ macro (ip)
lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16; lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", tempreg, lw_reloc_type, GP); "t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
if (expr1.X_add_number == 0) if (expr1.X_add_number == 0)
{ {
int off; int off;
@ -4950,7 +4952,7 @@ macro (ip)
tempreg, lui_reloc_type); tempreg, lui_reloc_type);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", tempreg, tempreg, GP); "d,v,t", tempreg, tempreg, mips_gp_register);
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", tempreg, lw_reloc_type, tempreg); "t,o(b)", tempreg, lw_reloc_type, tempreg);
@ -5056,7 +5058,8 @@ macro (ip)
} }
macro_build (p, &icnt, &offset_expr, macro_build (p, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP); "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
mips_gp_register);
p += 4; p += 4;
if (expr1.X_add_number >= -0x8000 if (expr1.X_add_number >= -0x8000
&& expr1.X_add_number < 0x8000) && expr1.X_add_number < 0x8000)
@ -5109,8 +5112,8 @@ macro (ip)
addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16) addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
*/ */
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
"t,r,j", tempreg, GP, (int) BFD_RELOC_GPREL16); tempreg, mips_gp_register, (int) BFD_RELOC_GPREL16);
} }
else else
abort (); abort ();
@ -5182,7 +5185,8 @@ macro (ip)
expr1.X_add_number = mips_cprestore_offset; expr1.X_add_number = mips_cprestore_offset;
macro_build ((char *) NULL, &icnt, &expr1, macro_build ((char *) NULL, &icnt, &expr1,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
GP, (int) BFD_RELOC_LO16, mips_frame_reg); mips_gp_register, (int) BFD_RELOC_LO16,
mips_frame_reg);
} }
} }
} }
@ -5300,7 +5304,8 @@ macro (ip)
expr1.X_add_number = mips_cprestore_offset; expr1.X_add_number = mips_cprestore_offset;
macro_build ((char *) NULL, &icnt, &expr1, macro_build ((char *) NULL, &icnt, &expr1,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
GP, (int) BFD_RELOC_LO16, mips_frame_reg); mips_gp_register, (int) BFD_RELOC_LO16,
mips_frame_reg);
} }
} }
} }
@ -5663,7 +5668,8 @@ macro (ip)
{ {
frag_grow (20); frag_grow (20);
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
treg, (int) BFD_RELOC_GPREL16, GP); treg, (int) BFD_RELOC_GPREL16,
mips_gp_register);
p = frag_var (rs_machine_dependent, 8, 0, p = frag_var (rs_machine_dependent, 8, 0,
RELAX_ENCODE (4, 8, 0, 4, 0, RELAX_ENCODE (4, 8, 0, 4, 0,
(mips_opts.warn_about_macros (mips_opts.warn_about_macros
@ -5688,7 +5694,7 @@ macro (ip)
frag_grow (28); frag_grow (28);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", tempreg, breg, GP); "d,v,t", tempreg, breg, mips_gp_register);
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
treg, (int) BFD_RELOC_GPREL16, tempreg); treg, (int) BFD_RELOC_GPREL16, tempreg);
p = frag_var (rs_machine_dependent, 12, 0, p = frag_var (rs_machine_dependent, 12, 0,
@ -5734,8 +5740,8 @@ macro (ip)
as_bad (_("PIC code offset overflow (max 16 signed bits)")); as_bad (_("PIC code offset overflow (max 16 signed bits)"));
frag_grow (20); frag_grow (20);
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", tempreg,
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP); (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", ""); macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
p = frag_var (rs_machine_dependent, 4, 0, p = frag_var (rs_machine_dependent, 4, 0,
RELAX_ENCODE (0, 4, -8, 0, 0, 0), RELAX_ENCODE (0, 4, -8, 0, 0, 0),
@ -5786,7 +5792,7 @@ macro (ip)
tempreg, (int) BFD_RELOC_MIPS_GOT_HI16); tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", tempreg, tempreg, GP); "d,v,t", tempreg, tempreg, mips_gp_register);
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16, "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
@ -5801,7 +5807,8 @@ macro (ip)
} }
macro_build (p, &icnt, &offset_expr, macro_build (p, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP); "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
mips_gp_register);
p += 4; p += 4;
macro_build (p, &icnt, (expressionS *) NULL, "nop", ""); macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
p += 4; p += 4;
@ -5827,14 +5834,14 @@ macro (ip)
if (breg == 0) if (breg == 0)
{ {
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
treg, (int) BFD_RELOC_GPREL16, GP); treg, (int) BFD_RELOC_GPREL16, mips_gp_register);
used_at = 0; used_at = 0;
} }
else else
{ {
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", tempreg, breg, GP); "d,v,t", tempreg, breg, mips_gp_register);
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
treg, (int) BFD_RELOC_GPREL16, tempreg); treg, (int) BFD_RELOC_GPREL16, tempreg);
} }
@ -5872,7 +5879,7 @@ macro (ip)
".lit4") == 0 ".lit4") == 0
&& offset_expr.X_add_number == 0); && offset_expr.X_add_number == 0);
macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)", macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
treg, (int) BFD_RELOC_MIPS_LITERAL, GP); treg, (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
return; return;
} }
@ -5926,15 +5933,16 @@ macro (ip)
{ {
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
mips_gp_register);
} }
else if (mips_pic == EMBEDDED_PIC) else if (mips_pic == EMBEDDED_PIC)
{ {
/* For embedded PIC we pick up the entire address off $gp in /* For embedded PIC we pick up the entire address off $gp in
a single instruction. */ a single instruction. */
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j", AT,
"t,r,j", AT, GP, (int) BFD_RELOC_GPREL16); mips_gp_register, (int) BFD_RELOC_GPREL16);
offset_expr.X_op = O_constant; offset_expr.X_op = O_constant;
offset_expr.X_add_number = 0; offset_expr.X_add_number = 0;
} }
@ -6007,10 +6015,11 @@ macro (ip)
if (mips_opts.isa != ISA_MIPS1) if (mips_opts.isa != ISA_MIPS1)
{ {
macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1", macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
"T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL, GP); "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL,
mips_gp_register);
return; return;
} }
breg = GP; breg = mips_gp_register;
r = BFD_RELOC_MIPS_LITERAL; r = BFD_RELOC_MIPS_LITERAL;
goto dob; goto dob;
} }
@ -6020,7 +6029,8 @@ macro (ip)
if (mips_pic == SVR4_PIC) if (mips_pic == SVR4_PIC)
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
mips_gp_register);
else else
{ {
/* FIXME: This won't work for a 64 bit address. */ /* FIXME: This won't work for a 64 bit address. */
@ -6195,7 +6205,7 @@ macro (ip)
if (breg == 0) if (breg == 0)
{ {
frag_grow (28); frag_grow (28);
tempreg = GP; tempreg = mips_gp_register;
off = 0; off = 0;
used_at = 0; used_at = 0;
} }
@ -6204,7 +6214,7 @@ macro (ip)
frag_grow (36); frag_grow (36);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", AT, breg, GP); "d,v,t", AT, breg, mips_gp_register);
tempreg = AT; tempreg = AT;
off = 4; off = 4;
used_at = 1; used_at = 1;
@ -6305,8 +6315,8 @@ macro (ip)
off = 4; off = 4;
frag_grow (24 + off); frag_grow (24 + off);
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", AT,
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", ""); macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
if (breg != 0) if (breg != 0)
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
@ -6358,7 +6368,7 @@ macro (ip)
if (expr1.X_add_number < -0x8000 if (expr1.X_add_number < -0x8000
|| expr1.X_add_number >= 0x8000 - 4) || expr1.X_add_number >= 0x8000 - 4)
as_bad (_("PIC code offset overflow (max 16 signed bits)")); as_bad (_("PIC code offset overflow (max 16 signed bits)"));
if (reg_needs_delay (GP)) if (reg_needs_delay (mips_gp_register))
gpdel = 4; gpdel = 4;
else else
gpdel = 0; gpdel = 0;
@ -6371,7 +6381,7 @@ macro (ip)
AT, (int) BFD_RELOC_MIPS_GOT_HI16); AT, (int) BFD_RELOC_MIPS_GOT_HI16);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", AT, AT, GP); "d,v,t", AT, AT, mips_gp_register);
macro_build ((char *) NULL, &icnt, &offset_expr, macro_build ((char *) NULL, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT); "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
@ -6408,7 +6418,8 @@ macro (ip)
} }
macro_build (p, &icnt, &offset_expr, macro_build (p, &icnt, &offset_expr,
HAVE_32BIT_ADDRESSES ? "lw" : "ld", HAVE_32BIT_ADDRESSES ? "lw" : "ld",
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
mips_gp_register);
p += 4; p += 4;
macro_build (p, &icnt, (expressionS *) NULL, "nop", ""); macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
p += 4; p += 4;
@ -6448,14 +6459,14 @@ macro (ip)
*/ */
if (breg == 0) if (breg == 0)
{ {
tempreg = GP; tempreg = mips_gp_register;
used_at = 0; used_at = 0;
} }
else else
{ {
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", AT, breg, GP); "d,v,t", AT, breg, mips_gp_register);
tempreg = AT; tempreg = AT;
used_at = 1; used_at = 1;
} }
@ -7225,7 +7236,7 @@ macro2 (ip)
off = 3; off = 3;
ulwa: ulwa:
used_at = 1; used_at = 1;
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at); load_address (&icnt, AT, &offset_expr, &used_at);
if (breg != 0) if (breg != 0)
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
@ -7247,7 +7258,7 @@ macro2 (ip)
case M_ULH_A: case M_ULH_A:
case M_ULHU_A: case M_ULHU_A:
used_at = 1; used_at = 1;
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at); load_address (&icnt, AT, &offset_expr, &used_at);
if (breg != 0) if (breg != 0)
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
@ -7321,7 +7332,7 @@ macro2 (ip)
off = 3; off = 3;
uswa: uswa:
used_at = 1; used_at = 1;
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at); load_address (&icnt, AT, &offset_expr, &used_at);
if (breg != 0) if (breg != 0)
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
@ -7342,7 +7353,7 @@ macro2 (ip)
case M_USH_A: case M_USH_A:
used_at = 1; used_at = 1;
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at); load_address (&icnt, AT, &offset_expr, &used_at);
if (breg != 0) if (breg != 0)
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
@ -10402,7 +10413,7 @@ md_pcrel_from (fixP)
return 1; return 1;
} }
/* return the address of the delay slot */ /* Return the address of the delay slot. */
return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address; return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
} }
@ -11568,12 +11579,12 @@ s_cpload (ignore)
/* In ELF, this symbol is implicitly an STT_OBJECT symbol. */ /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT; symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
macro_build_lui (NULL, &icnt, &ex, GP); macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j", GP, GP, macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j",
(int) BFD_RELOC_LO16); mips_gp_register, mips_gp_register, (int) BFD_RELOC_LO16);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t", macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
GP, GP, tc_get_register (0)); mips_gp_register, mips_gp_register, tc_get_register (0));
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
@ -11715,9 +11726,8 @@ s_cprestore (ignore)
ex.X_op_symbol = NULL; ex.X_op_symbol = NULL;
ex.X_add_number = mips_cprestore_offset; ex.X_add_number = mips_cprestore_offset;
macro_build ((char *) NULL, &icnt, &ex, macro_build ((char *) NULL, &icnt, &ex, HAVE_32BIT_ADDRESSES ? "sw" : "sd",
HAVE_32BIT_ADDRESSES ? "sw" : "sd", "t,o(b)", mips_gp_register, (int) BFD_RELOC_LO16, SP);
"t,o(b)", GP, (int) BFD_RELOC_LO16, SP);
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
@ -11815,7 +11825,7 @@ s_gpword (ignore)
p = frag_more (4); p = frag_more (4);
md_number_to_chars (p, (valueT) 0, 4); md_number_to_chars (p, (valueT) 0, 4);
fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, 0, fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, false,
BFD_RELOC_GPREL32); BFD_RELOC_GPREL32);
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
@ -11843,7 +11853,7 @@ s_cpadd (ignore)
reg = tc_get_register (0); reg = tc_get_register (0);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
HAVE_32BIT_ADDRESSES ? "addu" : "daddu", HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
"d,v,t", reg, reg, GP); "d,v,t", reg, reg, mips_gp_register);
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
@ -12021,10 +12031,10 @@ nopic_need_relax (sym, before_relaxing)
const char *symname; const char *symname;
int change; int change;
/* Find out whether this symbol can be referenced off the GP /* Find out whether this symbol can be referenced off the $gp
register. It can be if it is smaller than the -G size or if register. It can be if it is smaller than the -G size or if
it is in the .sdata or .sbss section. Certain symbols can it is in the .sdata or .sbss section. Certain symbols can
not be referenced off the GP, although it appears as though not be referenced off the $gp, although it appears as though
they can. */ they can. */
symname = S_GET_NAME (sym); symname = S_GET_NAME (sym);
if (symname != (const char *) NULL if (symname != (const char *) NULL
@ -12071,7 +12081,7 @@ nopic_need_relax (sym, before_relaxing)
return change; return change;
} }
else else
/* We are not optimizing for the GP register. */ /* We are not optimizing for the $gp register. */
return 1; return 1;
} }
@ -12914,7 +12924,7 @@ mips_elf_final_processing ()
else if (file_mips_abi == N32_ABI) else if (file_mips_abi == N32_ABI)
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2; elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
/* Nothing to do for "64". */ /* Nothing to do for N64_ABI. */
if (mips_32bitmode) if (mips_32bitmode)
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE; elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;