From 13757d0cbbd8ac12fde8a36df42d5acd6370b401 Mon Sep 17 00:00:00 2001 From: Thiemo Seufer Date: Sun, 19 Oct 2003 21:50:43 +0000 Subject: [PATCH] * config/tc-mips.c (normalize_constant_expr): New function to fix sign extensions broken by gas' expression evaluation of constants. (check_absolute_expr): Use it. (mips_ip): Likewise. --- gas/ChangeLog | 7 +++++++ gas/config/tc-mips.c | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index 59d59286104..669faad248a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2003-10-19 Thiemo Seufer + + * config/tc-mips.c (normalize_constant_expr): New function to fix sign + extensions broken by gas' expression evaluation of constants. + (check_absolute_expr): Use it. + (mips_ip): Likewise. + 2003-10-18 Hans-Peter Nilsson Generate BFD_RELOC_MMIX_PUSHJ_STUBBABLE for PUSHJ when possible. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index a7767659e4c..c34197223e2 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -3329,6 +3329,14 @@ set_at (int *counter, int reg, int unsignedp) } } +static void +normalize_constant_expr (expressionS *ex) +{ + if (ex->X_op == O_constant && HAVE_32BIT_GPRS) + ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000) + - 0x80000000); +} + /* Warn if an expression is not a constant. */ static void @@ -3338,6 +3346,8 @@ check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex) as_bad (_("unsupported large constant")); else if (ex->X_op != O_constant) as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name); + + normalize_constant_expr (ex); } /* Count the leading zeroes by performing a binary chop. This is a @@ -8562,6 +8572,7 @@ do_msbd: if (imm2_expr.X_op != O_big && imm2_expr.X_op != O_constant) insn_error = _("absolute expression required"); + normalize_constant_expr (&imm2_expr); s = expr_end; continue; @@ -9050,6 +9061,7 @@ do_msbd: if (imm_expr.X_op != O_big && imm_expr.X_op != O_constant) insn_error = _("absolute expression required"); + normalize_constant_expr (&imm_expr); s = expr_end; continue; -- 2.30.2