* expr.c (operand): Handle the "~", "-", and "!" operators applied
authorMark Mitchell <mark@codesourcery.com>
Wed, 11 Aug 2004 02:11:58 +0000 (02:11 +0000)
committerMark Mitchell <mark@codesourcery.com>
Wed, 11 Aug 2004 02:11:58 +0000 (02:11 +0000)
to bignums.

* gas/arm/bignum1.s: New test.
* gas/arm/arm.exp: Run it.

gas/ChangeLog
gas/expr.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/arm.exp
gas/testsuite/gas/arm/bignum1.s [new file with mode: 0644]

index 4361aa3a16b689b801b6eb084fa6053af4dea8d6..bbd1ec2306059ad9243158bf8dbc098f0deb997d 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-10  Mark Mitchell  <mark@codesourcery.com>
+
+       * expr.c (operand): Handle the "~", "-", and "!" operators applied
+       to bignums.
+
 2004-08-06  Paul Brook  <paul@codesourcery.com>
 
        * config/tc-arm.c (md_apply_fix3, tc_gen_reloc, arm_parse_reloc):
index d520a04bcd302118f7bb86284d480a47decbb468..460a8372dd232c932cf92362e6b27d6e140d59f1 100644 (file)
@@ -1076,6 +1076,35 @@ operand (expressionS *expressionP)
            else
              generic_floating_point_number.sign = 'N';
          }
+       else if (expressionP->X_op == O_big
+                && expressionP->X_add_number > 0)
+         {
+           int i;
+
+           if (c == '~' || c == '-')
+             {
+               for (i = 0; i < expressionP->X_add_number; ++i)
+                 generic_bignum[i] = ~generic_bignum[i];
+               if (c == '-')
+                 for (i = 0; i < expressionP->X_add_number; ++i)
+                   {
+                     generic_bignum[i] += 1;
+                     if (generic_bignum[i])
+                       break;
+                   }
+             }
+           else if (c == '!')
+             {
+               int nonzero = 0;
+               for (i = 0; i < expressionP->X_add_number; ++i)
+                 {
+                   if (generic_bignum[i])
+                     nonzero = 1;
+                   generic_bignum[i] = 0;
+                 }
+               generic_bignum[0] = nonzero;
+             }
+         }
        else if (expressionP->X_op != O_illegal
                 && expressionP->X_op != O_absent)
          {
index f91cf6d1b1618be78e7526d3396db2d75dc1c481..e61fd49f0478e80a168b3b7ae131f3b801e45274 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-10  Mark Mitchell  <mark@codesourcery.com>
+
+       * gas/arm/bignum1.s: New test.
+       * gas/arm/arm.exp: Run it.
+
 2004-08-06  Paul Brook  <paul@codesourcery.com>
 
        * gas/arm/pic.s,d: Test RELABS and SBREL relocations.
index 36045e6c1ef20fe2ce99cb04a726a0264ec6f3ec..1681ab984c20c4efb7147837b50df180c0997421 100644 (file)
@@ -35,6 +35,7 @@ if {[istarget *arm*-*-*] || [istarget "xscale-*-*"]} then {
     gas_test "immed.s" "" $stdoptlist "immediate expressions"
     gas_test "float.s" "-mcpu=arm7tdmi -mfpu=fpa" $stdoptlist "Core floating point instructions"
     gas_test "offset.s" "" $stdoptlist "OFFSET_IMM regression"
+    gas_test "bignum1.s" "" $stdoptlist "bignums"
 
     run_dump_test "armv1"
     run_dump_test "arch5tej"
diff --git a/gas/testsuite/gas/arm/bignum1.s b/gas/testsuite/gas/arm/bignum1.s
new file mode 100644 (file)
index 0000000..3c45d23
--- /dev/null
@@ -0,0 +1 @@
+       .8byte  -9223372036854775808