This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[PATCH] Unbreak MIPS gas 32bit constants overflow check
- From: Thiemo Seufer <ica2_ts at csv dot ica dot uni-stuttgart dot de>
- To: binutils at sources dot redhat dot com
- Date: Wed, 1 Oct 2003 20:57:50 +0200
- Subject: [PATCH] Unbreak MIPS gas 32bit constants overflow check
Hello All,
this patch fixes (I hope for real this time) the overflow checks
for 32bit constants.
Thiemo
2003-10-01 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
/gas/ChangeLog
* config/tc-mips.c (macro_build_ldst_constoffset,load_register,macro):
Unbreak overflow checks.
diff -burpNX /bigdisk/src/gcc-exclude source-orig/gas/config/tc-mips.c source/gas/config/tc-mips.c
--- source-orig/gas/config/tc-mips.c Wed Oct 1 04:18:18 2003
+++ source/gas/config/tc-mips.c Wed Oct 1 15:24:39 2003
@@ -3267,10 +3274,10 @@ macro_build_ldst_constoffset (char *plac
assert (ep->X_op == O_constant);
/* Sign-extending 32-bit constants makes their handling easier. */
- if (! dbl)
+ if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
+ == ~((bfd_vma) 0x7fffffff)))
{
- if (ep->X_add_number & ~((bfd_vma) 0x7fffffff)
- && ~(ep->X_add_number | 0x7fffffff))
+ if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
as_bad (_("too large constant specified"));
ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
@@ -3431,10 +3441,10 @@ load_register (int *counter, int reg, ex
assert (ep->X_op == O_constant);
/* Sign-extending 32-bit constants makes their handling easier. */
- if (! dbl)
+ if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
+ == ~((bfd_vma) 0x7fffffff)))
{
- if (ep->X_add_number & ~((bfd_vma) 0x7fffffff)
- && ~(ep->X_add_number | 0x7fffffff))
+ if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
as_bad (_("too large constant specified"));
ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
@@ -5941,10 +5951,11 @@ macro (struct mips_cl_insn *ip)
described below. */
if ((! HAVE_64BIT_ADDRESSES
&& (! HAVE_64BIT_GPRS && offset_expr.X_op == O_constant))
- && (offset_expr.X_op == O_constant))
+ && (offset_expr.X_op == O_constant)
+ && ! ((offset_expr.X_add_number & ~((bfd_vma) 0x7fffffff))
+ == ~((bfd_vma) 0x7fffffff)))
{
- if (offset_expr.X_add_number & ~((bfd_vma) 0x7fffffff)
- && ~(offset_expr.X_add_number | 0x7fffffff))
+ if (offset_expr.X_add_number & ~((bfd_vma) 0xffffffff))
as_bad (_("too large constant specified"));
offset_expr.X_add_number = (((offset_expr.X_add_number & 0xffffffff)