Wed Feb 14 19:01:27 1996 Alan Modra <alan@spri.levels.unisa.edu.au>
authorIan Lance Taylor <ian@airs.com>
Thu, 15 Feb 1996 00:08:45 +0000 (00:08 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 15 Feb 1996 00:08:45 +0000 (00:08 +0000)
* i386-dis.c (onebyte_has_modrm): New static array.
(twobyte_has_modrm): New static array.
(print_insn_i386): Only fetch the mod/reg/rm byte if it is needed.

opcodes/ChangeLog
opcodes/i386-dis.c

index 7fa9e9d187214cb0e78f5862f832b8d70a3f624a..911502199c703095dabcec1fda458c97123db0a2 100644 (file)
@@ -1,3 +1,14 @@
+Wed Feb 14 19:01:27 1996  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * i386-dis.c (onebyte_has_modrm): New static array.
+       (twobyte_has_modrm): New static array.
+       (print_insn_i386): Only fetch the mod/reg/rm byte if it is needed.
+
+Tue Feb 13 15:15:01 1996  Ian Lance Taylor  <ian@cygnus.com>
+
+       * Makefile.in ($(SHLINK)): Check ts against $(SHLIB), not
+       $(SHLINK).
+
 Mon Feb 12 16:26:06 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * ppc-opc.c (PPC): Undef, so default defination on Windows NT
index 4628a1fd368ed0325224fec24981f526efef3df2..b21e27622df2867cd802a41d51a434099e5a01dc 100644 (file)
@@ -348,23 +348,23 @@ struct dis386 dis386[] = {
   { "outsb",   indirDX, Xb },
   { "outsS",   indirDX, Xv },
   /* 70 */
-  { "jo",              Jb },
+  { "jo",      Jb },
   { "jno",     Jb },
-  { "jb",              Jb },
+  { "jb",      Jb },
   { "jae",     Jb },
-  { "je",              Jb },
+  { "je",      Jb },
   { "jne",     Jb },
   { "jbe",     Jb },
-  { "ja",              Jb },
+  { "ja",      Jb },
   /* 78 */
-  { "js",              Jb },
+  { "js",      Jb },
   { "jns",     Jb },
-  { "jp",              Jb },
+  { "jp",      Jb },
   { "jnp",     Jb },
-  { "jl",              Jb },
+  { "jl",      Jb },
   { "jnl",     Jb },
   { "jle",     Jb },
-  { "jg",              Jb },
+  { "jg",      Jb },
   /* 80 */
   { GRP1b },
   { GRP1S },
@@ -685,6 +685,44 @@ struct dis386 dis386_twobyte[] = {
   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },  
 };
 
+static const unsigned char onebyte_has_modrm[256] = {
+  1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,
+  1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,
+  1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,
+  1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
+  1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1
+};
+
+static const unsigned char twobyte_has_modrm[256] = {
+  1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
 static char obuf[100];
 static char *obufp;
 static char scratchbuf[100];
@@ -993,7 +1031,8 @@ print_insn_i386 (pc, info)
   int enter_instruction;
   char *first, *second, *third;
   int needcomma;
-  
+  unsigned char need_modrm;
+
   struct dis_private priv;
   bfd_byte *inbuf = priv.the_buffer;
 
@@ -1058,20 +1097,22 @@ print_insn_i386 (pc, info)
     {
       FETCH_DATA (info, codep + 2);
       dp = &dis386_twobyte[*++codep];
+      need_modrm = twobyte_has_modrm[*codep];
     }
   else
-    dp = &dis386[*codep];
+    {
+      dp = &dis386[*codep];
+      need_modrm = onebyte_has_modrm[*codep];
+    }
   codep++;
 
-  /* Fetch the mod/reg/rm byte.  FIXME: We should be only fetching
-     this if we need it.  As it is, this code loses if there is a
-     one-byte instruction (without a mod/reg/rm byte) at the end of
-     the address space.  */
-
-  FETCH_DATA (info, codep + 1);
-  mod = (*codep >> 6) & 3;
-  reg = (*codep >> 3) & 7;
-  rm = *codep & 7;
+  if (need_modrm)
+    {
+      FETCH_DATA (info, codep + 1);
+      mod = (*codep >> 6) & 3;
+      reg = (*codep >> 3) & 7;
+      rm = *codep & 7;
+    }
 
   if (dp->name == NULL && dp->bytemode1 == FLOATCODE)
     {