PR gas/11972
authorNick Clifton <nickc@redhat.com>
Thu, 9 Sep 2010 07:40:11 +0000 (07:40 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 9 Sep 2010 07:40:11 +0000 (07:40 +0000)
        * config/tc-arm.c (parse_big_immediate): Allow for bignums being
        extended to the size of a .octa.

gas/ChangeLog
gas/config/tc-arm.c

index fd7989743b6caa38f7db3d47ce72d55ad42e78e4..cef0c184b41aad46afac9fcb126aba246ab8a54b 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-09  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/11972
+       * config/tc-arm.c (parse_big_immediate): Allow for bignums being
+       extended to the size of a .octa.
+
 2010-09-08  Julian Brown  <julian@codesourcery.com>
 
        * config/tc-arm.c (create_neon_reg_alias): Deal with case
index 87b2b856e3c1e4af983a39fc9b592acd0a38ddd8..ce32aef54e077047427cadeb5b45127e22885569 100644 (file)
@@ -4420,14 +4420,32 @@ parse_big_immediate (char **str, int i)
        }
     }
   else if (exp.X_op == O_big
-           && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32
-           && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number <= 64)
+          && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
     {
       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
+
       /* Bignums have their least significant bits in
          generic_bignum[0]. Make sure we put 32 bits in imm and
          32 bits in reg,  in a (hopefully) portable way.  */
       gas_assert (parts != 0);
+
+      /* Make sure that the number is not too big.
+        PR 11972: Bignums can now be sign-extended to the
+        size of a .octa so check that the out of range bits
+        are all zero or all one.  */
+      if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
+       {
+         LITTLENUM_TYPE m = -1;
+
+         if (generic_bignum[parts * 2] != 0
+             && generic_bignum[parts * 2] != m)
+           return FAIL;
+
+         for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
+           if (generic_bignum[j] != generic_bignum[j-1])
+             return FAIL;
+       }
+
       inst.operands[i].imm = 0;
       for (j = 0; j < parts; j++, idx++)
         inst.operands[i].imm |= generic_bignum[idx]