From b0e6f033d5ed4fae744d864b001fa0bba0f5e8db Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 19 Aug 2013 19:58:47 +0000 Subject: [PATCH] gas/ * config/tc-mips.c (imm_expr): Expand comment. (set_at, macro, mips16_macro): Expect imm_expr to be O_constant when populated. --- gas/ChangeLog | 6 +++ gas/config/tc-mips.c | 120 +++++++++++++++---------------------------- 2 files changed, 48 insertions(+), 78 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 87c4013bf3..10955f6474 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2013-08-19 Richard Sandiford + + * 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 * config/tc-mips.c (imm2_expr): Delete. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index a98e443ffe..3e7ab62d7c 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -1763,7 +1763,7 @@ mips_mark_labels (void) static char *expr_end; /* 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; @@ -8067,8 +8067,7 @@ macro_build_ldst_constoffset (expressionS *ep, const char *op, static void set_at (int reg, int unsignedp) { - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= -0x8000 + if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000) macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j", AT, reg, BFD_RELOC_LO16); @@ -9083,11 +9082,11 @@ macro (struct mips_cl_insn *ip, char *str) s2 = "dadd"; if (!mips_opts.micromips) goto do_addi; - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= -0x200 + if (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; } goto do_addi_i; @@ -9096,8 +9095,7 @@ macro (struct mips_cl_insn *ip, char *str) s = "daddiu"; s2 = "daddu"; do_addi: - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= -0x8000 + if (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); @@ -9125,8 +9123,7 @@ macro (struct mips_cl_insn *ip, char *str) s = "xori"; s2 = "xor"; do_bit: - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= 0 + if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000) { if (mask != M_NOR_I) @@ -9179,7 +9176,7 @@ macro (struct mips_cl_insn *ip, char *str) case M_BEQL_I: case M_BNE_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; else { @@ -9222,7 +9219,7 @@ macro (struct mips_cl_insn *ip, char *str) likely = 1; case M_BGT_I: /* 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: /* 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); break; } - if (imm_expr.X_op != O_constant) - as_bad (_("Unsupported large constant")); ++imm_expr.X_add_number; /* FALLTHROUGH */ case M_BGE_I: case M_BGEL_I: if (mask == M_BGEL_I) 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, &offset_expr, op[0]); 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, &offset_expr, op[0]); 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: /* result is always true */ @@ -9288,20 +9283,17 @@ macro (struct mips_cl_insn *ip, char *str) case M_BGTU_I: if (op[0] == 0 || (HAVE_32BIT_GPRS - && imm_expr.X_op == O_constant && imm_expr.X_add_number == -1)) goto do_false; - if (imm_expr.X_op != O_constant) - as_bad (_("Unsupported large constant")); ++imm_expr.X_add_number; /* FALLTHROUGH */ case M_BGEU_I: case M_BGEUL_I: if (mask == M_BGEUL_I) 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; - 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, &offset_expr, op[0], ZERO); else @@ -9365,19 +9357,17 @@ macro (struct mips_cl_insn *ip, char *str) case M_BLEL_I: likely = 1; 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; - if (imm_expr.X_op != O_constant) - as_bad (_("Unsupported large constant")); ++imm_expr.X_add_number; /* FALLTHROUGH */ case M_BLT_I: case M_BLTL_I: if (mask == M_BLTL_I) 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]); - 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]); else { @@ -9410,20 +9400,17 @@ macro (struct mips_cl_insn *ip, char *str) case M_BLEU_I: if (op[0] == 0 || (HAVE_32BIT_GPRS - && imm_expr.X_op == O_constant && imm_expr.X_add_number == -1)) goto do_true; - if (imm_expr.X_op != O_constant) - as_bad (_("Unsupported large constant")); ++imm_expr.X_add_number; /* FALLTHROUGH */ case M_BLTU_I: case M_BLTUL_I: if (mask == M_BLTUL_I) 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; - 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, &offset_expr, op[0], ZERO); else @@ -9588,7 +9575,7 @@ macro (struct mips_cl_insn *ip, char *str) s = "ddivu"; s2 = "mfhi"; 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.")); if (mips_trap) @@ -9597,7 +9584,7 @@ macro (struct mips_cl_insn *ip, char *str) macro_build (NULL, "break", BRK_FMT, 7); 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) move_register (op[0], op[1]); @@ -9605,9 +9592,7 @@ macro (struct mips_cl_insn *ip, char *str) move_register (op[0], ZERO); break; } - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number == -1 - && s[strlen (s) - 1] != 'u') + if (imm_expr.X_add_number == -1 && s[strlen (s) - 1] != 'u') { if (strcmp (s2, "mflo") == 0) 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 { - 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 (offset_expr.X_add_symbol)), ".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 order 32 bits of the value and the low order 32 bits are either 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) load_register (op[0], &imm_expr, 1); @@ -11373,6 +11359,7 @@ macro (struct mips_cl_insn *ip, char *str) } break; } + gas_assert (imm_expr.X_op == O_absent); /* We know that sym is in the .rdata section. First we get the 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 the value and the low order 32 bits are either 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) { used_at = 1; load_register (AT, &imm_expr, HAVE_64BIT_FPRS); @@ -11441,7 +11428,8 @@ macro (struct mips_cl_insn *ip, char *str) 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); s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol)); if (strcmp (s, ".lit8") == 0) @@ -12005,8 +11993,6 @@ macro (struct mips_cl_insn *ip, char *str) char *l; char *rr; - if (imm_expr.X_op != O_constant) - as_bad (_("Improper rotate count")); rot = imm_expr.X_add_number & 0x3f; 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; - if (imm_expr.X_op != O_constant) - as_bad (_("Improper rotate count")); rot = imm_expr.X_add_number & 0x1f; 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 *rr; - if (imm_expr.X_op != O_constant) - as_bad (_("Improper rotate count")); rot = imm_expr.X_add_number & 0x3f; 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; - if (imm_expr.X_op != O_constant) - as_bad (_("Improper rotate count")); rot = imm_expr.X_add_number & 0x1f; 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; 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); break; @@ -12172,12 +12152,10 @@ macro (struct mips_cl_insn *ip, char *str) (int) imm_expr.X_add_number); break; } - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= 0 + if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000) macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1], BFD_RELOC_LO16); - else if (imm_expr.X_op == O_constant - && imm_expr.X_add_number > -0x8000 + else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0) { 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_SGEU_I: - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= -0x8000 + if (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", op[0], op[1], BFD_RELOC_LO16); @@ -12270,8 +12247,7 @@ macro (struct mips_cl_insn *ip, char *str) break; case M_SLT_I: - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= -0x8000 + if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000) { 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; case M_SLTU_I: - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= -0x8000 + if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000) { 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; 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]); break; @@ -12331,15 +12306,13 @@ macro (struct mips_cl_insn *ip, char *str) (int) imm_expr.X_add_number); break; } - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number >= 0 + if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000) { macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1], BFD_RELOC_LO16); } - else if (imm_expr.X_op == O_constant - && imm_expr.X_add_number > -0x8000 + else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0) { imm_expr.X_add_number = -imm_expr.X_add_number; @@ -12376,11 +12349,11 @@ macro (struct mips_cl_insn *ip, char *str) s2 = "dsub"; if (!mips_opts.micromips) goto do_subi; - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number > -0x200 + if (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; } goto do_subi_i; @@ -12389,8 +12362,7 @@ macro (struct mips_cl_insn *ip, char *str) s = "daddiu"; s2 = "dsubu"; do_subi: - if (imm_expr.X_op == O_constant - && imm_expr.X_add_number > -0x8000 + if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000) { imm_expr.X_add_number = -imm_expr.X_add_number; @@ -12708,22 +12680,16 @@ mips16_macro (struct mips_cl_insn *ip) goto do_subu; case M_SUBU_I: do_subu: - if (imm_expr.X_op != O_constant) - as_bad (_("Unsupported large constant")); imm_expr.X_add_number = -imm_expr.X_add_number; macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", op[0], op[1]); break; 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; macro_build (&imm_expr, "addiu", "x,k", op[0]); break; 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; macro_build (&imm_expr, "daddiu", "y,j", op[0]); break; @@ -12829,8 +12795,6 @@ mips16_macro (struct mips_cl_insn *ip) s3 = "x,8"; do_addone_branch_i: - if (imm_expr.X_op != O_constant) - as_bad (_("Unsupported large constant")); ++imm_expr.X_add_number; do_branch_i: