Add support for & | << >> ~ arithmetic operators in Intel mode
authorNick Clifton <nickc@redhat.com>
Tue, 13 Jul 2004 17:31:15 +0000 (17:31 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 13 Jul 2004 17:31:15 +0000 (17:31 +0000)
gas/ChangeLog
gas/NEWS
gas/config/tc-i386.c
gas/testsuite/ChangeLog
gas/testsuite/gas/i386/intel.d
gas/testsuite/gas/i386/intel.s

index 777979b196489dea0dd820033ae90462655bdbc5..271e8c911a3bfe867273a41fd0f9f6fd1f00de05 100644 (file)
@@ -1,3 +1,18 @@
+2004-07-13  Thomas Nystrom  <thn@saeab.se>
+
+       * config/tc-i386.c (T_SHIFTOP): New constant.
+       (intel_e05_1): Handle '&', '|' and T_SHIFTOP.
+       (intel_el1): Handle '~'.
+       (intel_get_token): Handle '<>', '&', '|' and '~'.
+
+2004-07-13  Nick Clifton <nickc@redhat.com>
+
+       (md_assemble): Remove spurious newline from end of as_bad error
+       message.
+       (intel_e05_1): Likewise.
+       (intel_e11): Likewise.
+       (intel_match_token): Likewise.
+
 2004-07-11  Andreas Schwab  <schwab@suse.de>
 
        * config/tc-m68k.c: Convert to C90.  Remove redundant
index 19cbc6067effcbf62fc69419761b0144e7990b1a..87ed8c067b34348c6532fcc96953f9dccabbbdf1 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -12,6 +12,8 @@
 * Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC
   instrucitons.
 
+Changes in 2.15:
+
 * The MIPS -membedded-pic option (Embedded-PIC code generation) is
   deprecated and will be removed in a future release.
 
index cc95843662f8b6ef6e41c2ad197768acf11aa4d5..2dd834e492e2c85ddb307dd77c9a1f6779620244 100644 (file)
@@ -1476,7 +1476,7 @@ md_assemble (line)
            {
              /* In case it is "hi" register, give up.  */
              if (i.op[x].regs->reg_num > 3)
-               as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix.\n"),
+               as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix."),
                        i.op[x].regs->reg_name);
 
              /* Otherwise it is equivalent to the extended register.
@@ -5350,7 +5350,7 @@ tc_gen_reloc (section, fixp)
 
    Initial production is 'expr'.
 
-    addOp              + | -
+    addOp              + | - | & | \| | << | >>
 
     alpha              [a-zA-Z]
 
@@ -5387,6 +5387,7 @@ tc_gen_reloc (section, fixp)
                        | id
                        | $
                        | register
+                       | ~
 
  => expr               SHORT e05
                        | e05
@@ -5455,6 +5456,7 @@ tc_gen_reloc (section, fixp)
                | $
                | register
                | id
+               | ~
                | constant  */
 
 /* Parsing structure for the intel syntax parser. Used to implement the
@@ -5496,6 +5498,7 @@ static struct intel_token cur_token, prev_token;
 #define T_OFFSET       9
 #define T_PTR          10
 #define T_ID           11
+#define T_SHIFTOP      12
 
 /* Prototypes for intel parser functions.  */
 static int intel_match_token   PARAMS ((int code));
@@ -5615,7 +5618,9 @@ static int
 intel_e05_1 ()
 {
   /* e05'  addOp e06 e05'  */
-  if (cur_token.code == '+' || cur_token.code == '-')
+  if (cur_token.code == '+' || cur_token.code == '-'
+      || cur_token.code == '&' || cur_token.code == '|'
+      || cur_token.code == T_SHIFTOP)
     {
       strcat (intel_parser.disp, cur_token.str);
       intel_match_token (cur_token.code);
@@ -5717,7 +5722,7 @@ intel_e09_1 ()
 
       else
        {
-         as_bad (_("Unknown operand modifier `%s'\n"), prev_token.str);
+         as_bad (_("Unknown operand modifier `%s'"), prev_token.str);
          return 0;
        }
 
@@ -5801,6 +5806,7 @@ intel_e10_1 ()
        | .
        | register
        | id
+       | ~
        | constant  */
 static int
 intel_e11 ()
@@ -5820,6 +5826,15 @@ intel_e11 ()
        return 0;
     }
 
+  /* e11 ~ expr */
+  else if (cur_token.code == '~')
+   {
+     strcat (intel_parser.disp, "~");
+     intel_match_token ('~');
+
+     return (intel_e11 ());
+   }
+
   /* e11  [ expr ] */
   else if (cur_token.code == '[')
     {
@@ -5965,7 +5980,7 @@ intel_e11 ()
        {
          if (i.base_reg && i.index_reg)
            {
-             as_bad (_("Too many register references in memory operand.\n"));
+             as_bad (_("Too many register references in memory operand."));
              return 0;
            }
 
@@ -6034,7 +6049,7 @@ intel_e11 ()
          intel_match_token (cur_token.code);
          if (cur_token.code != T_CONST)
            {
-             as_bad (_("Syntax error. Expecting a constant. Got `%s'.\n"),
+             as_bad (_("Syntax error. Expecting a constant. Got `%s'."),
                      cur_token.str);
              return 0;
            }
@@ -6121,7 +6136,7 @@ intel_match_token (code)
     }
   else
     {
-      as_bad (_("Unexpected token `%s'\n"), cur_token.str);
+      as_bad (_("Unexpected token `%s'"), cur_token.str);
       return 0;
     }
 }
@@ -6182,7 +6197,16 @@ intel_get_token ()
        new_token.code = T_ID;
     }
 
-  else if (strchr ("+-/*:[]()", *intel_parser.op_string))
+  else if (strchr ("<>", *intel_parser.op_string)
+          && *intel_parser.op_string == *(intel_parser.op_string + 1))
+    {
+      new_token.code = T_SHIFTOP;
+      new_token.str[0] = *intel_parser.op_string;
+      new_token.str[1] = *intel_parser.op_string;
+      new_token.str[2] = '\0';
+    }
+
+  else if (strchr ("+-/*&|:[]()~", *intel_parser.op_string))
     {
       new_token.code = *intel_parser.op_string;
       new_token.str[0] = *intel_parser.op_string;
@@ -6265,7 +6289,7 @@ intel_get_token ()
     }
 
   else
-    as_bad (_("Unrecognized token `%s'\n"), intel_parser.op_string);
+    as_bad (_("Unrecognized token `%s'"), intel_parser.op_string);
 
   intel_parser.op_string += strlen (new_token.str);
   cur_token = new_token;
index 880a52ac697fe48bf575fdc8c74b26c8557f1f7c..5e61334b36f98d3ed46e5b723ba1c382e9a12f77 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-13  Nick Clifton  <nickc@redhat.com>
+
+       * gas/i386/intel.s: Add test of newly expand arithmetic support
+       for Intel mode assembler.
+       * gas/i386/intel.d: Add expected disassmbly.
+
 2004-07-13  Nick Clifton  <nickc@redhat.com>
 
        * gas/vtable: Delete directory.  These tests are no longer needed
index 7365dbaf1a284e5475b44103c15e3ca706378a89..66fd1d733b8d7193207098744ee586fb3c4efc0f 100644 (file)
@@ -620,4 +620,11 @@ Disassembly of section .text:
  a6a:  ff 20 [         ]*jmp    \*\(%eax\)
  a6c:  ff 25 d2 09 00 00 [     ]*jmp    \*0x9d2
  a72:  e9 5b ff ff ff [        ]*jmp    9d2 <bar>
+ a77:  b8 12 00 00 00 [        ]*mov    \$0x12,%eax
+ a7c:  25 ff ff fb ff [        ]*and    \$0xfffbffff,%eax
+ a81:  25 ff ff fb ff [        ]*and    \$0xfffbffff,%eax
+ a86:  b0 11 [         ]*mov    \$0x11,%al
+ a88:  b0 11 [         ]*mov    \$0x11,%al
+ a8a:  b3 47 [         ]*mov    \$0x47,%bl
+ a8c:  b3 47 [         ]*mov    \$0x47,%bl
 [      ]*...
index 2a4afb27cbb40a0b53177b944b111fb4585ade31..b713369266fa55ef388c844b20a17bd711633f8c 100644 (file)
@@ -615,4 +615,14 @@ rot5:
  jmp   [eax]
  jmp   [bar]
  jmp   bar
+
+       # Check arithmetic operators
+       mov     %eax,(( 17 ) + 1) 
+       and     %eax,~(1 << ( 18 )) 
+       and     %eax,0xFFFBFFFF
+       mov     %al, (( 0x4711  ) & 0xff) 
+       mov     %al, 0x11
+       mov     %bl, ((( 0x4711  ) >> 8) & 0xff) 
+       mov     %bl, 0x47
+       
  .p2align 4,0