x86 indirect jump/call syntax fixes. Disassembly fix for lcall.
authorAlan Modra <amodra@gmail.com>
Mon, 27 Dec 1999 16:10:31 +0000 (16:10 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 27 Dec 1999 16:10:31 +0000 (16:10 +0000)
gas/ChangeLog
gas/config/tc-i386.c
include/opcode/ChangeLog
include/opcode/i386.h
opcodes/ChangeLog
opcodes/i386-dis.c

index 39fb31302a2db9db1522568ad715a9123f80c202..e9ad534fca68e58a5cfc264d4be1a98dc1018fd3 100644 (file)
@@ -1,3 +1,9 @@
+1999-12-27  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * config/tc-i386.c (MATCH): Relax JumpAbsolute check.  Emit a
+       warning for absolute jump/call without `*' in non-intel mode.  No
+       need to set i.types[0] JumpAbsolute in intel mode.
+
 1999-12-22  Philip Blundell  <pb@futuretv.com>
 
        * config/tc-arm.c (arm_s_text): If OBJ_ELF, call the appropriate
index 52191134bd7ed90313e73716e9882420d773a2df..2aba75256ba4f64893497e250792fecc602c06d2 100644 (file)
@@ -1255,9 +1255,8 @@ md_assemble (line)
      with the template operand types. */
 
 #define MATCH(overlap, given, template) \
-  ((overlap) \
-   && ((given) & BaseIndex) == ((overlap) & BaseIndex) \
-   && ((given) & JumpAbsolute) == ((template) & JumpAbsolute))
+  ((overlap & ~JumpAbsolute) \
+   && ((given) & (BaseIndex|JumpAbsolute)) == ((overlap) & (BaseIndex|JumpAbsolute)))
 
   /* If given types r0 and r1 are registers they must be of the same type
      unless the expected operand type register overlap is null.
@@ -1347,11 +1346,6 @@ md_assemble (line)
 
            i.types[xchg1] = temp_type;
          }
-       if (!strcmp(mnemonic,"jmp")
-           || !strcmp (mnemonic, "call"))
-         if ((i.types[0] & Reg) || i.types[0] & BaseIndex)
-           i.types[0] |= JumpAbsolute;
-
       }
     overlap0 = 0;
     overlap1 = 0;
@@ -1460,6 +1454,12 @@ md_assemble (line)
        return;
       }
 
+    if (!intel_syntax
+       && (i.types[0] & JumpAbsolute) != (t->operand_types[0] & JumpAbsolute))
+      {
+       as_warn (_("Indirect %s without `*'"), t->name);
+      }
+
     if ((t->opcode_modifier & (IsPrefix|IgnoreSize)) == (IsPrefix|IgnoreSize))
       {
        /* Warn them that a data or address size prefix doesn't affect
index f1038dccd6650bdcbc5787ffcf540c85e72200ca..fb573ccdba9581a392ea10441ea0e9a4363f5533 100644 (file)
@@ -1,3 +1,8 @@
+1999-12-27  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * i386.h: Add JumpAbsolute qualifier to all non-intel mode
+       indirect jumps and calls.  Add FF/3 call for intel mode.
+
 Wed Dec  1 03:05:25 1999  Jeffrey A Law  (law@cygnus.com)
 
        * mn10300.h: Add new operand types.  Add new instruction formats.
index 7e3a56464bb5ca74068810af2fe2d83442743704..c5f6217d4519265de7037c33061e15dcb039c55c 100644 (file)
@@ -315,17 +315,20 @@ static const template i386_optab[] = {
 {"call",   1,  0xff, 2, wl_Suf|Modrm|DefaultSize,      { WordReg|WordMem|JumpAbsolute, 0, 0} },
 /* Intel Syntax */
 {"call",   2,  0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} },
+/* Intel Syntax */
+{"call",   1,  0xff, 3, wl_Suf|Modrm|DefaultSize,      { WordMem, 0, 0} },
 {"lcall",  2,  0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} },
-{"lcall",  1,  0xff, 3, wl_Suf|Modrm|DefaultSize,      { WordMem, 0, 0} },
+{"lcall",  1,  0xff, 3, wl_Suf|Modrm|DefaultSize,      { WordMem|JumpAbsolute, 0, 0} },
 
 #define JUMP_PC_RELATIVE 0xeb
 {"jmp",           1,   0xeb, X, NoSuf|Jump,            { Disp, 0, 0} },
 {"jmp",           1,   0xff, 4, wl_Suf|Modrm,          { WordReg|WordMem|JumpAbsolute, 0, 0} },
 /* Intel Syntax */
 {"jmp",    2,  0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
+/* Intel Syntax */
 {"jmp",    1,  0xff, 5, wl_Suf|Modrm,          { WordMem, 0, 0} },
 {"ljmp",   2,  0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
-{"ljmp",   1,  0xff, 5, wl_Suf|Modrm,          { WordMem, 0, 0} },
+{"ljmp",   1,  0xff, 5, wl_Suf|Modrm,          { WordMem|JumpAbsolute, 0, 0} },
 
 {"ret",           0,   0xc3, X, wl_Suf|DefaultSize,    { 0, 0, 0} },
 {"ret",           1,   0xc2, X, wl_Suf|DefaultSize,    { Imm16, 0, 0} },
index 0b222d033f230491390ff166ca1a2d3a2a9f3f05..f5b09716fe4fbfaa0bfbe58056a679ac40ea9d23 100644 (file)
@@ -1,3 +1,7 @@
+1999-12-27  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * i386-dis.c (grps[]): Correct GRP5 FF/3 from "call" to "lcall".
+
 Wed Dec  1 03:34:53 1999  Jeffrey A Law  (law@cygnus.com)
 
        * m10300-opc.c, m10300-dis.c: Add am33 support.
index 3018b7b83a981175ecb92c8253545851ff41a779..a75d6e316c3b2cdc5a3c7725f5c5b577917f03ab 100644 (file)
@@ -1749,7 +1749,7 @@ static const struct dis386 grps[][8] = {
     { "incQ",  Ev, XX, XX },
     { "decQ",  Ev, XX, XX },
     { "callP", indirEv, XX, XX },
-    { "callP", indirEv, XX, XX },
+    { "lcallP",        indirEv, XX, XX },
     { "jmpP",  indirEv, XX, XX },
     { "ljmpP", indirEv, XX, XX },
     { "pushQ", Ev, XX, XX },