This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]