* cgen-ibld.in (insert_normal): Cope with attempts to insert a signed 32-bit
authorNick Clifton <nickc@redhat.com>
Sun, 5 Mar 2006 08:38:53 +0000 (08:38 +0000)
committerNick Clifton <nickc@redhat.com>
Sun, 5 Mar 2006 08:38:53 +0000 (08:38 +0000)
  value into an unsigned 32-bit field when the host is a 64-bit machine.

12 files changed:
opcodes/ChangeLog
opcodes/cgen-ibld.in
opcodes/fr30-ibld.c
opcodes/frv-ibld.c
opcodes/ip2k-ibld.c
opcodes/iq2000-asm.c
opcodes/iq2000-ibld.c
opcodes/m32c-ibld.c
opcodes/m32r-ibld.c
opcodes/openrisc-ibld.c
opcodes/xc16x-ibld.c
opcodes/xstormy16-ibld.c

index 8d9094a2c50f495368965f9dc36921c7970b456a..62bcc352222b51d0039f2f289ff2dde8d769d838 100644 (file)
@@ -1,8 +1,23 @@
+2006-03-05  Nick Clifton  <nickc@redhat.com>
+
+       * cgen-ibld.in (insert_normal): Cope with attempts to insert a
+       signed 32-bit value into an unsigned 32-bit field when the host is
+       a 64-bit machine.
+       * fr30-ibld.c: Regenerate.
+       * frv-ibld.c: Regenerate.
+       * ip2k-ibld.c: Regenerate.
+       * iq2000-asm.c: Regenerate.
+       * iq2000-ibld.c: Regenerate.
+       * m32c-ibld.c: Regenerate.
+       * m32r-ibld.c: Regenerate.
+       * openrisc-ibld.c: Regenerate.
+       * xc16x-ibld.c: Regenerate.
+       * xstormy16-ibld.c: Regenerate.
+
 2006-03-03 Shrirang Khisti <shrirangk@kpitcummins.com)
 
        * xc16x-asm.c: Regenerate.
        * xc16x-dis.c: Regenerate.
-       * xc16x-ibld.c: Regenerate.
 
 2006-02-27  Carlos O'Donell  <carlos@codesourcery.com>
 
index 77deeed55d210b14c7b47264e012647b16ebee2c..626e655fef7c4b3633097a181bcb1b1f4bfa7740 100644 (file)
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
index 48dad67d0088b14cb2243c661154090d581afda9..15be3f376a25d02d7b465a5c737ab6ec03df6fbe 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
index 9fe25316009e05cc77e86a45f14107af5da9bbb1..2283371fc1af0191d81fe2c59dee854ffd9b7c4e 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
index cd39392c98a94acb8695bdc073c8f4bf3b142467..fb080275c64633b86046903885a56255e14b5810 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
index 0ec59ce324343efff805457e90cf61d981ff2ab0..92590867d14b96327169e29e027edf1a7d358d39 100644 (file)
@@ -213,8 +213,8 @@ parse_hi16 (CGEN_CPU_DESC cd,
             1 to the resultant %hi value.  */
          if (value & 0x8000)
            value += 0x10000;
-         value &= 0xffff;
          value >>= 16;
+         value &= 0xffff;
        }
       *valuep = value;
 
index 9be3f0f5c6840c05d8cb79418b0ca4f82d1ad9d7..eadf0a33b47a55b768295154a09540b28a1d3403 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
index 62c753b93452651f667a9d93b69f123611ed3b58..7601128c634a347afff6e3478c9225927a4caa4d 100644 (file)
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
index ffd47dd447c7fad138264dc8ca48efd1d35e826e..fee130d00fdd6a51c9473c2bf261d204f66b9def 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
index 035f43854ca11572659785bd5ffe9d28fab4df9f..1225ad4ee2c7e08e76fc98ad4bc83e7de6098385 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
index 97e6bbca283309494f409046c1c65376edac51eb..de82f3f2642081cf8fbfeae4701b73bd994f24cf 100644 (file)
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
index 57ef85cdf0c02f5c2a6589bbe50e080e6c7cd0ad..51aee9da2d32d132da014e8e363a672eeffd33d4 100644 (file)
@@ -3,7 +3,7 @@
    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
    - the resultant file is machine generated, cgen-ibld.in isn't
 
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils and GDB, the GNU debugger.
@@ -168,13 +168,21 @@ insert_normal (CGEN_CPU_DESC cd,
   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
     {
       unsigned long maxval = mask;
-      
-      if ((unsigned long) value > maxval)
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+        extended beyond 32 bits.  If so then ignore these higher sign bits
+        as the user is attempting to store a 32-bit signed value into an
+        unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+       val &= 0xFFFFFFFF;
+
+      if (val > maxval)
        {
          /* xgettext:c-format */
          sprintf (errbuf,
-                  _("operand out of range (%lu not between 0 and %lu)"),
-                  value, maxval);
+                  _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+                  val, maxval);
          return errbuf;
        }
     }
@@ -440,9 +448,8 @@ extract_normal (CGEN_CPU_DESC cd,
      word_length may be too big.  */
   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
     {
-      if (word_offset == 0
-         && word_length > total_length)
-       word_length = total_length;
+      if (word_offset + word_length > total_length)
+       word_length = total_length - word_offset;
     }
 
   /* Does the value reside in INSN_VALUE, and at the right alignment?  */