gas/
* config/tc-mips.c (imm_expr): Expand comment. (set_at, macro, mips16_macro): Expect imm_expr to be O_constant when populated.
This commit is contained in:
parent
e423441da4
commit
b0e6f033d5
@ -1,3 +1,9 @@
|
|||||||
|
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
|
* config/tc-mips.c (imm_expr): Expand comment.
|
||||||
|
(set_at, macro, mips16_macro): Expect imm_expr to be O_constant
|
||||||
|
when populated.
|
||||||
|
|
||||||
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
|
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
* config/tc-mips.c (imm2_expr): Delete.
|
* config/tc-mips.c (imm2_expr): Delete.
|
||||||
|
@ -1763,7 +1763,7 @@ mips_mark_labels (void)
|
|||||||
static char *expr_end;
|
static char *expr_end;
|
||||||
|
|
||||||
/* An expression in a macro instruction. This is set by mips_ip and
|
/* An expression in a macro instruction. This is set by mips_ip and
|
||||||
mips16_ip. */
|
mips16_ip and when populated is always an O_constant. */
|
||||||
|
|
||||||
static expressionS imm_expr;
|
static expressionS imm_expr;
|
||||||
|
|
||||||
@ -8067,8 +8067,7 @@ macro_build_ldst_constoffset (expressionS *ep, const char *op,
|
|||||||
static void
|
static void
|
||||||
set_at (int reg, int unsignedp)
|
set_at (int reg, int unsignedp)
|
||||||
{
|
{
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= -0x8000
|
||||||
&& imm_expr.X_add_number >= -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0x8000)
|
&& imm_expr.X_add_number < 0x8000)
|
||||||
macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
|
macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
|
||||||
AT, reg, BFD_RELOC_LO16);
|
AT, reg, BFD_RELOC_LO16);
|
||||||
@ -9083,11 +9082,11 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
s2 = "dadd";
|
s2 = "dadd";
|
||||||
if (!mips_opts.micromips)
|
if (!mips_opts.micromips)
|
||||||
goto do_addi;
|
goto do_addi;
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= -0x200
|
||||||
&& imm_expr.X_add_number >= -0x200
|
|
||||||
&& imm_expr.X_add_number < 0x200)
|
&& imm_expr.X_add_number < 0x200)
|
||||||
{
|
{
|
||||||
macro_build (NULL, s, "t,r,.", op[0], op[1], imm_expr.X_add_number);
|
macro_build (NULL, s, "t,r,.", op[0], op[1],
|
||||||
|
(int) imm_expr.X_add_number);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
goto do_addi_i;
|
goto do_addi_i;
|
||||||
@ -9096,8 +9095,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
s = "daddiu";
|
s = "daddiu";
|
||||||
s2 = "daddu";
|
s2 = "daddu";
|
||||||
do_addi:
|
do_addi:
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= -0x8000
|
||||||
&& imm_expr.X_add_number >= -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0x8000)
|
&& imm_expr.X_add_number < 0x8000)
|
||||||
{
|
{
|
||||||
macro_build (&imm_expr, s, "t,r,j", op[0], op[1], BFD_RELOC_LO16);
|
macro_build (&imm_expr, s, "t,r,j", op[0], op[1], BFD_RELOC_LO16);
|
||||||
@ -9125,8 +9123,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
s = "xori";
|
s = "xori";
|
||||||
s2 = "xor";
|
s2 = "xor";
|
||||||
do_bit:
|
do_bit:
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= 0
|
||||||
&& imm_expr.X_add_number >= 0
|
|
||||||
&& imm_expr.X_add_number < 0x10000)
|
&& imm_expr.X_add_number < 0x10000)
|
||||||
{
|
{
|
||||||
if (mask != M_NOR_I)
|
if (mask != M_NOR_I)
|
||||||
@ -9179,7 +9176,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
case M_BEQL_I:
|
case M_BEQL_I:
|
||||||
case M_BNE_I:
|
case M_BNE_I:
|
||||||
case M_BNEL_I:
|
case M_BNEL_I:
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
op[1] = 0;
|
op[1] = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -9222,7 +9219,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
likely = 1;
|
likely = 1;
|
||||||
case M_BGT_I:
|
case M_BGT_I:
|
||||||
/* Check for > max integer. */
|
/* Check for > max integer. */
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
|
if (imm_expr.X_add_number >= GPR_SMAX)
|
||||||
{
|
{
|
||||||
do_false:
|
do_false:
|
||||||
/* Result is always false. */
|
/* Result is always false. */
|
||||||
@ -9232,27 +9229,25 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
|
macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
++imm_expr.X_add_number;
|
++imm_expr.X_add_number;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case M_BGE_I:
|
case M_BGE_I:
|
||||||
case M_BGEL_I:
|
case M_BGEL_I:
|
||||||
if (mask == M_BGEL_I)
|
if (mask == M_BGEL_I)
|
||||||
likely = 1;
|
likely = 1;
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
{
|
{
|
||||||
macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
|
macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
|
||||||
&offset_expr, op[0]);
|
&offset_expr, op[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
|
if (imm_expr.X_add_number == 1)
|
||||||
{
|
{
|
||||||
macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
|
macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
|
||||||
&offset_expr, op[0]);
|
&offset_expr, op[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number <= GPR_SMIN)
|
if (imm_expr.X_add_number <= GPR_SMIN)
|
||||||
{
|
{
|
||||||
do_true:
|
do_true:
|
||||||
/* result is always true */
|
/* result is always true */
|
||||||
@ -9288,20 +9283,17 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
case M_BGTU_I:
|
case M_BGTU_I:
|
||||||
if (op[0] == 0
|
if (op[0] == 0
|
||||||
|| (HAVE_32BIT_GPRS
|
|| (HAVE_32BIT_GPRS
|
||||||
&& imm_expr.X_op == O_constant
|
|
||||||
&& imm_expr.X_add_number == -1))
|
&& imm_expr.X_add_number == -1))
|
||||||
goto do_false;
|
goto do_false;
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
++imm_expr.X_add_number;
|
++imm_expr.X_add_number;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case M_BGEU_I:
|
case M_BGEU_I:
|
||||||
case M_BGEUL_I:
|
case M_BGEUL_I:
|
||||||
if (mask == M_BGEUL_I)
|
if (mask == M_BGEUL_I)
|
||||||
likely = 1;
|
likely = 1;
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
goto do_true;
|
goto do_true;
|
||||||
else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
|
else if (imm_expr.X_add_number == 1)
|
||||||
macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
|
macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
|
||||||
&offset_expr, op[0], ZERO);
|
&offset_expr, op[0], ZERO);
|
||||||
else
|
else
|
||||||
@ -9365,19 +9357,17 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
case M_BLEL_I:
|
case M_BLEL_I:
|
||||||
likely = 1;
|
likely = 1;
|
||||||
case M_BLE_I:
|
case M_BLE_I:
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
|
if (imm_expr.X_add_number >= GPR_SMAX)
|
||||||
goto do_true;
|
goto do_true;
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
++imm_expr.X_add_number;
|
++imm_expr.X_add_number;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case M_BLT_I:
|
case M_BLT_I:
|
||||||
case M_BLTL_I:
|
case M_BLTL_I:
|
||||||
if (mask == M_BLTL_I)
|
if (mask == M_BLTL_I)
|
||||||
likely = 1;
|
likely = 1;
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, op[0]);
|
macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, op[0]);
|
||||||
else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
|
else if (imm_expr.X_add_number == 1)
|
||||||
macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, op[0]);
|
macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, op[0]);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -9410,20 +9400,17 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
case M_BLEU_I:
|
case M_BLEU_I:
|
||||||
if (op[0] == 0
|
if (op[0] == 0
|
||||||
|| (HAVE_32BIT_GPRS
|
|| (HAVE_32BIT_GPRS
|
||||||
&& imm_expr.X_op == O_constant
|
|
||||||
&& imm_expr.X_add_number == -1))
|
&& imm_expr.X_add_number == -1))
|
||||||
goto do_true;
|
goto do_true;
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
++imm_expr.X_add_number;
|
++imm_expr.X_add_number;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case M_BLTU_I:
|
case M_BLTU_I:
|
||||||
case M_BLTUL_I:
|
case M_BLTUL_I:
|
||||||
if (mask == M_BLTUL_I)
|
if (mask == M_BLTUL_I)
|
||||||
likely = 1;
|
likely = 1;
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
goto do_false;
|
goto do_false;
|
||||||
else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
|
else if (imm_expr.X_add_number == 1)
|
||||||
macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
|
macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
|
||||||
&offset_expr, op[0], ZERO);
|
&offset_expr, op[0], ZERO);
|
||||||
else
|
else
|
||||||
@ -9588,7 +9575,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
s = "ddivu";
|
s = "ddivu";
|
||||||
s2 = "mfhi";
|
s2 = "mfhi";
|
||||||
do_divi:
|
do_divi:
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
{
|
{
|
||||||
as_warn (_("Divide by zero."));
|
as_warn (_("Divide by zero."));
|
||||||
if (mips_trap)
|
if (mips_trap)
|
||||||
@ -9597,7 +9584,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
macro_build (NULL, "break", BRK_FMT, 7);
|
macro_build (NULL, "break", BRK_FMT, 7);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
|
if (imm_expr.X_add_number == 1)
|
||||||
{
|
{
|
||||||
if (strcmp (s2, "mflo") == 0)
|
if (strcmp (s2, "mflo") == 0)
|
||||||
move_register (op[0], op[1]);
|
move_register (op[0], op[1]);
|
||||||
@ -9605,9 +9592,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
move_register (op[0], ZERO);
|
move_register (op[0], ZERO);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number == -1 && s[strlen (s) - 1] != 'u')
|
||||||
&& imm_expr.X_add_number == -1
|
|
||||||
&& s[strlen (s) - 1] != 'u')
|
|
||||||
{
|
{
|
||||||
if (strcmp (s2, "mflo") == 0)
|
if (strcmp (s2, "mflo") == 0)
|
||||||
macro_build (NULL, dbl ? "dneg" : "neg", "d,w", op[0], op[1]);
|
macro_build (NULL, dbl ? "dneg" : "neg", "d,w", op[0], op[1]);
|
||||||
@ -11324,7 +11309,8 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gas_assert (offset_expr.X_op == O_symbol
|
gas_assert (imm_expr.X_op == O_absent
|
||||||
|
&& offset_expr.X_op == O_symbol
|
||||||
&& strcmp (segment_name (S_GET_SEGMENT
|
&& strcmp (segment_name (S_GET_SEGMENT
|
||||||
(offset_expr.X_add_symbol)),
|
(offset_expr.X_add_symbol)),
|
||||||
".lit4") == 0
|
".lit4") == 0
|
||||||
@ -11339,7 +11325,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
|
wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
|
||||||
order 32 bits of the value and the low order 32 bits are either
|
order 32 bits of the value and the low order 32 bits are either
|
||||||
zero or in OFFSET_EXPR. */
|
zero or in OFFSET_EXPR. */
|
||||||
if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
|
if (imm_expr.X_op == O_constant)
|
||||||
{
|
{
|
||||||
if (HAVE_64BIT_GPRS)
|
if (HAVE_64BIT_GPRS)
|
||||||
load_register (op[0], &imm_expr, 1);
|
load_register (op[0], &imm_expr, 1);
|
||||||
@ -11373,6 +11359,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
gas_assert (imm_expr.X_op == O_absent);
|
||||||
|
|
||||||
/* 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
|
||||||
upper 16 bits of the address. */
|
upper 16 bits of the address. */
|
||||||
@ -11417,7 +11404,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
|
bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
|
||||||
the value and the low order 32 bits are either zero or in
|
the value and the low order 32 bits are either zero or in
|
||||||
OFFSET_EXPR. */
|
OFFSET_EXPR. */
|
||||||
if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
|
if (imm_expr.X_op == O_constant)
|
||||||
{
|
{
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
|
load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
|
||||||
@ -11441,7 +11428,8 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
gas_assert (offset_expr.X_op == O_symbol
|
gas_assert (imm_expr.X_op == O_absent
|
||||||
|
&& offset_expr.X_op == O_symbol
|
||||||
&& offset_expr.X_add_number == 0);
|
&& offset_expr.X_add_number == 0);
|
||||||
s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
|
s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
|
||||||
if (strcmp (s, ".lit8") == 0)
|
if (strcmp (s, ".lit8") == 0)
|
||||||
@ -12005,8 +11993,6 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
char *l;
|
char *l;
|
||||||
char *rr;
|
char *rr;
|
||||||
|
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Improper rotate count"));
|
|
||||||
rot = imm_expr.X_add_number & 0x3f;
|
rot = imm_expr.X_add_number & 0x3f;
|
||||||
if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
|
if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
|
||||||
{
|
{
|
||||||
@ -12036,8 +12022,6 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
{
|
{
|
||||||
unsigned int rot;
|
unsigned int rot;
|
||||||
|
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Improper rotate count"));
|
|
||||||
rot = imm_expr.X_add_number & 0x1f;
|
rot = imm_expr.X_add_number & 0x1f;
|
||||||
if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
|
if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
|
||||||
{
|
{
|
||||||
@ -12089,8 +12073,6 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
char *l;
|
char *l;
|
||||||
char *rr;
|
char *rr;
|
||||||
|
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Improper rotate count"));
|
|
||||||
rot = imm_expr.X_add_number & 0x3f;
|
rot = imm_expr.X_add_number & 0x3f;
|
||||||
if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
|
if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
|
||||||
{
|
{
|
||||||
@ -12119,8 +12101,6 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
{
|
{
|
||||||
unsigned int rot;
|
unsigned int rot;
|
||||||
|
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Improper rotate count"));
|
|
||||||
rot = imm_expr.X_add_number & 0x1f;
|
rot = imm_expr.X_add_number & 0x1f;
|
||||||
if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
|
if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
|
||||||
{
|
{
|
||||||
@ -12152,7 +12132,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case M_SEQ_I:
|
case M_SEQ_I:
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
{
|
{
|
||||||
macro_build (&expr1, "sltiu", "t,r,j", op[0], op[1], BFD_RELOC_LO16);
|
macro_build (&expr1, "sltiu", "t,r,j", op[0], op[1], BFD_RELOC_LO16);
|
||||||
break;
|
break;
|
||||||
@ -12172,12 +12152,10 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
(int) imm_expr.X_add_number);
|
(int) imm_expr.X_add_number);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= 0
|
||||||
&& imm_expr.X_add_number >= 0
|
|
||||||
&& imm_expr.X_add_number < 0x10000)
|
&& imm_expr.X_add_number < 0x10000)
|
||||||
macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1], BFD_RELOC_LO16);
|
macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1], BFD_RELOC_LO16);
|
||||||
else if (imm_expr.X_op == O_constant
|
else if (imm_expr.X_add_number > -0x8000
|
||||||
&& imm_expr.X_add_number > -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0)
|
&& imm_expr.X_add_number < 0)
|
||||||
{
|
{
|
||||||
imm_expr.X_add_number = -imm_expr.X_add_number;
|
imm_expr.X_add_number = -imm_expr.X_add_number;
|
||||||
@ -12212,8 +12190,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
|
|
||||||
case M_SGE_I: /* X >= I <==> not (X < I) */
|
case M_SGE_I: /* X >= I <==> not (X < I) */
|
||||||
case M_SGEU_I:
|
case M_SGEU_I:
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= -0x8000
|
||||||
&& imm_expr.X_add_number >= -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0x8000)
|
&& imm_expr.X_add_number < 0x8000)
|
||||||
macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
|
macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
|
||||||
op[0], op[1], BFD_RELOC_LO16);
|
op[0], op[1], BFD_RELOC_LO16);
|
||||||
@ -12270,8 +12247,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case M_SLT_I:
|
case M_SLT_I:
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= -0x8000
|
||||||
&& imm_expr.X_add_number >= -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0x8000)
|
&& imm_expr.X_add_number < 0x8000)
|
||||||
{
|
{
|
||||||
macro_build (&imm_expr, "slti", "t,r,j", op[0], op[1],
|
macro_build (&imm_expr, "slti", "t,r,j", op[0], op[1],
|
||||||
@ -12284,8 +12260,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case M_SLTU_I:
|
case M_SLTU_I:
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= -0x8000
|
||||||
&& imm_expr.X_add_number >= -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0x8000)
|
&& imm_expr.X_add_number < 0x8000)
|
||||||
{
|
{
|
||||||
macro_build (&imm_expr, "sltiu", "t,r,j", op[0], op[1],
|
macro_build (&imm_expr, "sltiu", "t,r,j", op[0], op[1],
|
||||||
@ -12310,7 +12285,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case M_SNE_I:
|
case M_SNE_I:
|
||||||
if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
|
if (imm_expr.X_add_number == 0)
|
||||||
{
|
{
|
||||||
macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[1]);
|
macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[1]);
|
||||||
break;
|
break;
|
||||||
@ -12331,15 +12306,13 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
(int) imm_expr.X_add_number);
|
(int) imm_expr.X_add_number);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number >= 0
|
||||||
&& imm_expr.X_add_number >= 0
|
|
||||||
&& imm_expr.X_add_number < 0x10000)
|
&& imm_expr.X_add_number < 0x10000)
|
||||||
{
|
{
|
||||||
macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1],
|
macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1],
|
||||||
BFD_RELOC_LO16);
|
BFD_RELOC_LO16);
|
||||||
}
|
}
|
||||||
else if (imm_expr.X_op == O_constant
|
else if (imm_expr.X_add_number > -0x8000
|
||||||
&& imm_expr.X_add_number > -0x8000
|
|
||||||
&& imm_expr.X_add_number < 0)
|
&& imm_expr.X_add_number < 0)
|
||||||
{
|
{
|
||||||
imm_expr.X_add_number = -imm_expr.X_add_number;
|
imm_expr.X_add_number = -imm_expr.X_add_number;
|
||||||
@ -12376,11 +12349,11 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
s2 = "dsub";
|
s2 = "dsub";
|
||||||
if (!mips_opts.micromips)
|
if (!mips_opts.micromips)
|
||||||
goto do_subi;
|
goto do_subi;
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number > -0x200
|
||||||
&& imm_expr.X_add_number > -0x200
|
|
||||||
&& imm_expr.X_add_number <= 0x200)
|
&& imm_expr.X_add_number <= 0x200)
|
||||||
{
|
{
|
||||||
macro_build (NULL, s, "t,r,.", op[0], op[1], -imm_expr.X_add_number);
|
macro_build (NULL, s, "t,r,.", op[0], op[1],
|
||||||
|
(int) -imm_expr.X_add_number);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
goto do_subi_i;
|
goto do_subi_i;
|
||||||
@ -12389,8 +12362,7 @@ macro (struct mips_cl_insn *ip, char *str)
|
|||||||
s = "daddiu";
|
s = "daddiu";
|
||||||
s2 = "dsubu";
|
s2 = "dsubu";
|
||||||
do_subi:
|
do_subi:
|
||||||
if (imm_expr.X_op == O_constant
|
if (imm_expr.X_add_number > -0x8000
|
||||||
&& imm_expr.X_add_number > -0x8000
|
|
||||||
&& imm_expr.X_add_number <= 0x8000)
|
&& imm_expr.X_add_number <= 0x8000)
|
||||||
{
|
{
|
||||||
imm_expr.X_add_number = -imm_expr.X_add_number;
|
imm_expr.X_add_number = -imm_expr.X_add_number;
|
||||||
@ -12708,22 +12680,16 @@ mips16_macro (struct mips_cl_insn *ip)
|
|||||||
goto do_subu;
|
goto do_subu;
|
||||||
case M_SUBU_I:
|
case M_SUBU_I:
|
||||||
do_subu:
|
do_subu:
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
imm_expr.X_add_number = -imm_expr.X_add_number;
|
imm_expr.X_add_number = -imm_expr.X_add_number;
|
||||||
macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", op[0], op[1]);
|
macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", op[0], op[1]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case M_SUBU_I_2:
|
case M_SUBU_I_2:
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
imm_expr.X_add_number = -imm_expr.X_add_number;
|
imm_expr.X_add_number = -imm_expr.X_add_number;
|
||||||
macro_build (&imm_expr, "addiu", "x,k", op[0]);
|
macro_build (&imm_expr, "addiu", "x,k", op[0]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case M_DSUBU_I_2:
|
case M_DSUBU_I_2:
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
imm_expr.X_add_number = -imm_expr.X_add_number;
|
imm_expr.X_add_number = -imm_expr.X_add_number;
|
||||||
macro_build (&imm_expr, "daddiu", "y,j", op[0]);
|
macro_build (&imm_expr, "daddiu", "y,j", op[0]);
|
||||||
break;
|
break;
|
||||||
@ -12829,8 +12795,6 @@ mips16_macro (struct mips_cl_insn *ip)
|
|||||||
s3 = "x,8";
|
s3 = "x,8";
|
||||||
|
|
||||||
do_addone_branch_i:
|
do_addone_branch_i:
|
||||||
if (imm_expr.X_op != O_constant)
|
|
||||||
as_bad (_("Unsupported large constant"));
|
|
||||||
++imm_expr.X_add_number;
|
++imm_expr.X_add_number;
|
||||||
|
|
||||||
do_branch_i:
|
do_branch_i:
|
||||||
|
Loading…
Reference in New Issue
Block a user