This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

SSE2 disassembler


Hi
This patch adds the SSE2 disassembler except for the cflush and pause
instructions.  These are somewhat irregural so I would rather add them by
separate patch (Karsten is having patch for swapgs that will havndle the
cflush as well).

Honza

Tue Jan  9 13:45:43 MET 2001  Jan Hubicka  <hj@suse.cz>
	* i386-dis.c (PREGRP15 - PREGRP24): New.
	(dis386_twobyt): Add SSE2 instructions.
	(twobyte_uses_SSE_prefix: Rename from ... ; add new SSE instructions.
	(twobyte_uses_f3_prefix): ... this one.
	(grps): Add SSE instructions.
	(prefix_user_table): Add two new slots; add SSE2 instructions.
	(print_insn_i386): Rename uses_f3_prefix to uses_SSE_prefix;
	Handle the REPNZ and Data16 prefixes as well; do proper lookup
	to prefix_user_table.
	(OP_E): Accept mfence and lfence as well.
	(OP_MMX): Data16 prefix turns MMX to SSE; support REX extensions.
	(OP_XMM): Support REX extensions.
	(OP_EM): Likewise.
	(OP_EX): Likewise.
Index: src//opcodes/i386-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/i386-dis.c,v
retrieving revision 1.11
diff -u -p -r1.11 i386-dis.c
--- i386-dis.c	2001/01/05 11:11:54	1.11
+++ i386-dis.c	2001/01/09 12:32:35
@@ -398,6 +398,16 @@ static void BadOp PARAMS ((void));
 #define PREGRP12 NULL, NULL, 12, NULL, USE_PREFIX_USER_TABLE, NULL, 0
 #define PREGRP13 NULL, NULL, 13, NULL, USE_PREFIX_USER_TABLE, NULL, 0
 #define PREGRP14 NULL, NULL, 14, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP15 NULL, NULL, 15, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP16 NULL, NULL, 16, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP17 NULL, NULL, 17, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP18 NULL, NULL, 18, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP19 NULL, NULL, 19, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP20 NULL, NULL, 20, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP21 NULL, NULL, 21, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP22 NULL, NULL, 22, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP23 NULL, NULL, 23, NULL, USE_PREFIX_USER_TABLE, NULL, 0
+#define PREGRP24 NULL, NULL, 24, NULL, USE_PREFIX_USER_TABLE, NULL, 0
 
 #define FLOATCODE 50
 #define FLOAT NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
@@ -426,6 +436,7 @@ struct dis386 {
    'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always is true
    'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
    'S' => print 'w', 'l' or 'q' if suffix_always is true
+   'X' => print 's', 'd' depending on data16 prefix (for XMM)
    'W' => print 'b' or 'w' ("w" or "de" in intel mode)
 */
 
@@ -594,6 +605,7 @@ static const struct dis386 dis386_att[] 
   { "popQ",	Ev, XX, XX },
   /* 90 */
   { "nop",	XX, XX, XX },
+  /* FIXME: NOP with REPz prefix is called PAUSE.  */
   { "xchgS",	RMeCX, eAX, XX },
   { "xchgS",	RMeDX, eAX, XX },
   { "xchgS",	RMeBX, eAX, XX },
@@ -885,6 +897,7 @@ static const struct dis386 dis386_intel[
   { "pop",	Ev, XX, XX },
   /* 90 */
   { "nop",	XX, XX, XX },
+  /* FIXME: NOP with REPz prefix is called PAUSE.  */
   { "xchg",	RMeCX, eAX, XX },
   { "xchg",	RMeDX, eAX, XX },
   { "xchg",	RMeBX, eAX, XX },
@@ -1178,6 +1191,7 @@ static const struct dis386 disx86_64_att
   { "popI",	Ev, XX, XX },
   /* 90 */
   { "nop",	XX, XX, XX },
+  /* FIXME: NOP with REPz prefix is called PAUSE.  */
   { "xchgS",	RMeCX, eAX, XX },
   { "xchgS",	RMeDX, eAX, XX },
   { "xchgS",	RMeBX, eAX, XX },
@@ -1255,7 +1269,7 @@ static const struct dis386 disx86_64_att
   { GRP2S_cl },
   { "(bad)",	XX, XX, XX },   /* reserved.  */
   { "(bad)",	XX, XX, XX },   /* reserved.  */
-  { "(bad)",	XX, XX, XX },
+  { "(bad)",	XX, XX, XX },   /* reserved.  */
   { "xlat",	DSBX, XX, XX },
   /* d8 */
   { FLOAT },
@@ -1469,6 +1483,7 @@ static const struct dis386 dis386_64_int
   { "pop",	Ev, XX, XX },
   /* 90 */
   { "nop",	XX, XX, XX },
+  /* FIXME: NOP with REPz prefix is called PAUSE.  */
   { "xchg",	RMeCX, eAX, XX },
   { "xchg",	RMeDX, eAX, XX },
   { "xchg",	RMeBX, eAX, XX },
@@ -1546,7 +1561,7 @@ static const struct dis386 dis386_64_int
   { GRP2S_cl },
   { "(bad)",	XX, XX, XX },   /* Reserved.  */
   { "(bad)",	XX, XX, XX },   /* Reserved.  */
-  { "(bad)",	XX, XX, XX },
+  { "(bad)",	XX, XX, XX },   /* Reserved.  */
   { "xlat",	DSBX, XX, XX },
   /* d8 */
   { FLOAT },
@@ -1617,12 +1632,12 @@ static const struct dis386 dis386_twobyt
   /* 10 */
   { PREGRP8 },
   { PREGRP9 },
-  { "movlps", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
-  { "movlps", EX, XM, SIMD_Fixup, 'h' },
-  { "unpcklps", XM, EX, XX },
-  { "unpckhps", XM, EX, XX },
-  { "movhps", XM, EX, SIMD_Fixup, 'l' },
-  { "movhps", EX, XM, SIMD_Fixup, 'l' },
+  { "movlpX", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
+  { "movlpX", EX, XM, SIMD_Fixup, 'h' },
+  { "unpcklpX", XM, EX, XX },
+  { "unpckhpX", XM, EX, XX },
+  { "movhpX", XM, EX, SIMD_Fixup, 'l' },
+  { "movhpX", EX, XM, SIMD_Fixup, 'l' },
   /* 18 */
   { GRP14 },
   { "(bad)", XX, XX, XX },
@@ -1643,14 +1658,14 @@ static const struct dis386 dis386_twobyt
   { "movL", Td, Rd, XX },
   { "(bad)", XX, XX, XX },
   /* 28 */
-  { "movaps", XM, EX, XX },
-  { "movaps", EX, XM, XX },
+  { "movapX", XM, EX, XX },
+  { "movapX", EX, XM, XX },
   { PREGRP2 },
-  { "movntps", Ev, XM, XX },
+  { "movntpX", Ev, XM, XX },
   { PREGRP4 },
   { PREGRP3 },
-  { "ucomiss", XM, EX, XX },
-  { "comiss", XM, EX, XX },
+  { "ucomisX", XM,EX, XX },
+  { "comisX", XM,EX, XX },
   /* 30 */
   { "wrmsr", XX, XX, XX },
   { "rdtsc", XX, XX, XX },
@@ -1688,19 +1703,19 @@ static const struct dis386 dis386_twobyt
   { "cmovle", Gv, Ev, XX },
   { "cmovg", Gv, Ev, XX },
   /* 50 */
-  { "movmskps", Gv, EX, XX },
+  { "movmskpX", Gv, EX, XX },
   { PREGRP13 },
   { PREGRP12 },
   { PREGRP11 },
-  { "andps", XM, EX, XX },
-  { "andnps", XM, EX, XX },
-  { "orps", XM, EX, XX },
-  { "xorps", XM, EX, XX },
+  { "andpX", XM, EX, XX },
+  { "andnpX", XM, EX, XX },
+  { "orpX", XM, EX, XX },
+  { "xorpX", XM, EX, XX },
   /* 58 */
   { PREGRP0 },
   { PREGRP10 },
-  { "(bad)", XX, XX, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP17 },
+  { PREGRP16 },
   { PREGRP14 },
   { PREGRP7 },
   { PREGRP5 },
@@ -1720,11 +1735,11 @@ static const struct dis386 dis386_twobyt
   { "punpckhdq", MX, EM, XX },
   { "packssdw", MX, EM, XX },
   { "(bad)", XX, XX, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP24 },
   { "movd", MX, Ed, XX },
-  { "movq", MX, EM, XX },
+  { PREGRP19 },
   /* 70 */
-  { "pshufw", MX, EM, Ib },
+  { PREGRP22 },
   { GRP10 },
   { GRP11 },
   { GRP12 },
@@ -1739,8 +1754,8 @@ static const struct dis386 dis386_twobyt
   { "(bad)", XX, XX, XX },
   { "(bad)", XX, XX, XX },
   { "(bad)", XX, XX, XX },
-  { "movd", Ed, MX, XX },
-  { "movq", EM, MX, XX },
+  { PREGRP23 },
+  { PREGRP20 },
   /* 80 */
   { "jo", Jv, XX, XX },
   { "jno", Jv, XX, XX },
@@ -1817,10 +1832,10 @@ static const struct dis386 dis386_twobyt
   { "xaddB", Eb, Gb, XX },
   { "xaddS", Ev, Gv, XX },
   { PREGRP1 },
-  { "(bad)", XX, XX, XX },
+  { "movntiS", Ev, Gv, XX },
   { "pinsrw", MX, Ev, Ib },
   { "pextrw", Ev, MX, Ib },
-  { "shufps", XM, EX, Ib },
+  { "shufpX", XM, EX, Ib },
   { GRP9 },
   /* c8 */
   { "bswap", RMeAX, XX, XX },	/* bswap doesn't support 16 bit regs */
@@ -1838,7 +1853,7 @@ static const struct dis386 dis386_twobyt
   { "psrlq", MX, EM, XX },
   { "(bad)", XX, XX, XX },
   { "pmullw", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP21 },
   { "pmovmskb", Ev, MX, XX },
   /* d8 */
   { "psubusb", MX, EM, XX },
@@ -1856,7 +1871,7 @@ static const struct dis386 dis386_twobyt
   { "pavgw", MX, EM, XX },
   { "pmulhuw", MX, EM, XX },
   { "pmulhw", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP15 },
   { "movntq", Ev, MX, XX },
   /* e8 */
   { "psubsb", MX, EM, XX },
@@ -1872,10 +1887,10 @@ static const struct dis386 dis386_twobyt
   { "psllw", MX, EM, XX },
   { "pslld", MX, EM, XX },
   { "psllq", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
+  { "pmuludq", MX, EM, XX },
   { "pmaddwd", MX, EM, XX },
   { "psadbw", MX, EM, XX },
-  { "maskmovq", MX, EM, XX },
+  { PREGRP18 },
   /* f8 */
   { "psubb", MX, EM, XX },
   { "psubw", MX, EM, XX },
@@ -1907,14 +1922,12 @@ static const struct dis386 dis386_twobyt
   { "femms" , XX, XX, XX},
   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
   /* 10 */
-  { PREGRP8 },
-  { PREGRP9 },
-  { "movlps", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
-  { "movlps", EX, XM, SIMD_Fixup, 'h' },
-  { "unpcklps", XM, EX, XX },
-  { "unpckhps", XM, EX, XX },
-  { "movhps", XM, EX, SIMD_Fixup, 'l' },
-  { "movhps", EX, XM, SIMD_Fixup, 'l' },
+  { "movlpX", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
+  { "movlpX", EX, XM, SIMD_Fixup, 'h' },
+  { "unpcklpX", XM, EX, XX },
+  { "unpckhpX", XM, EX, XX },
+  { "movhpX", XM, EX, SIMD_Fixup, 'l' },
+  { "movhpX", EX, XM, SIMD_Fixup, 'l' },
   /* 18 */
   { GRP14 },
   { "(bad)", XX, XX, XX },
@@ -1935,14 +1948,14 @@ static const struct dis386 dis386_twobyt
   { "mov", Td, Rd, XX },
   { "(bad)", XX, XX, XX },
   /* 28 */
-  { "movaps", XM, EX, XX },
-  { "movaps", EX, XM, XX },
+  { "movapX", XM, EX, XX },
+  { "movapX", EX, XM, XX },
   { PREGRP2 },
-  { "movntps", Ev, XM, XX },
+  { "movntpX", Ev, XM, XX },
   { PREGRP4 },
   { PREGRP3 },
-  { "ucomiss", XM, EX, XX },
-  { "comiss", XM, EX, XX },
+  { "ucomisX", XM,EX, XX },
+  { "comisX", XM,EX, XX },
   /* 30 */
   { "wrmsr", XX, XX, XX },
   { "rdtsc", XX, XX, XX },
@@ -1980,19 +1993,19 @@ static const struct dis386 dis386_twobyt
   { "cmovle", Gv, Ev, XX },
   { "cmovg", Gv, Ev, XX },
   /* 50 */
-  { "movmskps", Gv, EX, XX },
+  { "movmskpX", Gv, EX, XX },
   { PREGRP13 },
   { PREGRP12 },
   { PREGRP11 },
-  { "andps", XM, EX, XX },
-  { "andnps", XM, EX, XX },
-  { "orps", XM, EX, XX },
-  { "xorps", XM, EX, XX },
+  { "andpX", XM, EX, XX },
+  { "andnpX", XM, EX, XX },
+  { "orpX", XM, EX, XX },
+  { "xorpX", XM, EX, XX },
   /* 58 */
   { PREGRP0 },
   { PREGRP10 },
-  { "(bad)", XX, XX, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP17 },
+  { PREGRP16 },
   { PREGRP14 },
   { PREGRP7 },
   { PREGRP5 },
@@ -2011,12 +2024,12 @@ static const struct dis386 dis386_twobyt
   { "punpckhwd", MX, EM, XX },
   { "punpckhdq", MX, EM, XX },
   { "packssdw", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
   { "(bad)", XX, XX, XX },
+  { PREGRP24 },
   { "movd", MX, Ed, XX },
-  { "movq", MX, EM, XX },
+  { PREGRP19 },
   /* 70 */
-  { "pshufw", MX, EM, Ib },
+  { PREGRP22 },
   { GRP10 },
   { GRP11 },
   { GRP12 },
@@ -2031,8 +2044,8 @@ static const struct dis386 dis386_twobyt
   { "(bad)", XX, XX, XX },
   { "(bad)", XX, XX, XX },
   { "(bad)", XX, XX, XX },
-  { "movd", Ed, MX, XX },
-  { "movq", EM, MX, XX },
+  { PREGRP23 },
+  { PREGRP20 },
   /* 80 */
   { "jo", Jv, XX, XX },
   { "jno", Jv, XX, XX },
@@ -2109,10 +2122,10 @@ static const struct dis386 dis386_twobyt
   { "xadd", Eb, Gb, XX },
   { "xadd", Ev, Gv, XX },
   { PREGRP1 },
-  { "(bad)", XX, XX, XX },
+  { "movnti", Ev, Gv, XX },
   { "pinsrw", MX, Ev, Ib },
   { "pextrw", Ev, MX, Ib },
-  { "shufps", XM, EX, Ib },
+  { "shufpX", XM, EX, Ib },
   { GRP9 },
   /* c8 */
   { "bswap", RMeAX, XX, XX },	/* bswap doesn't support 16 bit regs */
@@ -2130,7 +2143,7 @@ static const struct dis386 dis386_twobyt
   { "psrlq", MX, EM, XX },
   { "(bad)", XX, XX, XX },
   { "pmullw", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP21 },
   { "pmovmskb", Ev, MX, XX },
   /* d8 */
   { "psubusb", MX, EM, XX },
@@ -2148,7 +2161,7 @@ static const struct dis386 dis386_twobyt
   { "pavgw", MX, EM, XX },
   { "pmulhuw", MX, EM, XX },
   { "pmulhw", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
+  { PREGRP15 },
   { "movntq", Ev, MX, XX },
   /* e8 */
   { "psubsb", MX, EM, XX },
@@ -2164,10 +2177,10 @@ static const struct dis386 dis386_twobyt
   { "psllw", MX, EM, XX },
   { "pslld", MX, EM, XX },
   { "psllq", MX, EM, XX },
-  { "(bad)", XX, XX, XX },
+  { "pmuludq", MX, EM, XX },
   { "pmaddwd", MX, EM, XX },
   { "psadbw", MX, EM, XX },
-  { "maskmovq", MX, EM, XX },
+  { PREGRP18 },
   /* f8 */
   { "psubb", MX, EM, XX },
   { "psubw", MX, EM, XX },
@@ -2225,7 +2238,7 @@ static const unsigned char twobyte_has_m
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
 };
 
-static const unsigned char twobyte_uses_f3_prefix[256] = {
+static const unsigned char twobyte_uses_SSE_prefix[256] = {
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   /*       -------------------------------        */
   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
@@ -2233,17 +2246,17 @@ static const unsigned char twobyte_uses_
   /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */
   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
-  /* 50 */ 0,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1, /* 5f */
-  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
-  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
+  /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
+  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */
+  /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */
   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
-  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
-  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
-  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  /* ff */
+  /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
+  /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
+  /* f0 */ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0  /* ff */
   /*       -------------------------------        */
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
 };
@@ -2501,11 +2514,11 @@ static const struct dis386 grps[][8] = {
     { "(bad)",	XX, XX, XX },
     { "(bad)",	XX, XX, XX },
     { "psrlq",	MS, Ib, XX },
-    { "(bad)",	XX, XX, XX },
+    { "psrldq",	MS, Ib, XX },
     { "(bad)",	XX, XX, XX },
     { "(bad)",	XX, XX, XX },
     { "psllq",	MS, Ib, XX },
-    { "(bad)",	XX, XX, XX },
+    { "pslldq",	MS, Ib, XX },
   },
   /* GRP13 */
   {
@@ -2513,10 +2526,11 @@ static const struct dis386 grps[][8] = {
     { "fxrstor", Ev, XX, XX },
     { "ldmxcsr", Ev, XX, XX },
     { "stmxcsr", Ev, XX, XX },
-    { "(bad)",	XX, XX, XX },
-    { "(bad)",	XX, XX, XX },
     { "(bad)",	XX, XX, XX },
+    { "lfence", None, XX, XX },
+    { "mfence", None, XX, XX },
     { "sfence", None, XX, XX },
+    /* FIXME: the sfence with memory operand is clflush! */
   },
   /* GRP14 */
   {
@@ -2543,82 +2557,182 @@ static const struct dis386 grps[][8] = {
 
 };
 
-static const struct dis386 prefix_user_table[][2] = {
+static const struct dis386 prefix_user_table[][4] = {
   /* PREGRP0 */
   {
     { "addps", XM, EX, XX },
     { "addss", XM, EX, XX },
+    { "addpd", XM, EX, XX },
+    { "addsd", XM, EX, XX },
   },
   /* PREGRP1 */
   {
     { "", XM, EX, OPSIMD },	/* See OP_SIMD_SUFFIX */
     { "", XM, EX, OPSIMD },
+    { "", XM, EX, OPSIMD },
+    { "", XM, EX, OPSIMD },
   },
   /* PREGRP2 */
   {
     { "cvtpi2ps", XM, EM, XX },
     { "cvtsi2ss", XM, Ev, XX },
+    { "cvtpi2pd", XM, EM, XX },
+    { "cvtsi2sd", XM, Ev, XX },
   },
   /* PREGRP3 */
   {
     { "cvtps2pi", MX, EX, XX },
     { "cvtss2si", Gv, EX, XX },
+    { "cvtpd2pi", MX, EX, XX },
+    { "cvtsd2si", Gv, EX, XX },
   },
   /* PREGRP4 */
   {
     { "cvttps2pi", MX, EX, XX },
     { "cvttss2si", Gv, EX, XX },
+    { "cvttpd2pi", MX, EX, XX },
+    { "cvttsd2si", Gv, EX, XX },
   },
   /* PREGRP5 */
   {
     { "divps", XM, EX, XX },
     { "divss", XM, EX, XX },
+    { "divpd", XM, EX, XX },
+    { "divsd", XM, EX, XX },
   },
   /* PREGRP6 */
   {
     { "maxps", XM, EX, XX },
     { "maxss", XM, EX, XX },
+    { "maxpd", XM, EX, XX },
+    { "maxsd", XM, EX, XX },
   },
   /* PREGRP7 */
   {
     { "minps", XM, EX, XX },
     { "minss", XM, EX, XX },
+    { "minpd", XM, EX, XX },
+    { "minsd", XM, EX, XX },
   },
   /* PREGRP8 */
   {
     { "movups", XM, EX, XX },
     { "movss", XM, EX, XX },
+    { "movupd", XM, EX, XX },
+    { "movsd", XM, EX, XX },
   },
   /* PREGRP9 */
   {
     { "movups", EX, XM, XX },
     { "movss", EX, XM, XX },
+    { "movupd", EX, XM, XX },
+    { "movsd", EX, XM, XX },
   },
   /* PREGRP10 */
   {
     { "mulps", XM, EX, XX },
     { "mulss", XM, EX, XX },
+    { "mulpd", XM, EX, XX },
+    { "mulsd", XM, EX, XX },
   },
   /* PREGRP11 */
   {
     { "rcpps", XM, EX, XX },
     { "rcpss", XM, EX, XX },
+    { "(bad)", XM, EX, XX },
+    { "(bad)", XM, EX, XX },
   },
   /* PREGRP12 */
   {
     { "rsqrtps", XM, EX, XX },
     { "rsqrtss", XM, EX, XX },
+    { "(bad)", XM, EX, XX },
+    { "(bad)", XM, EX, XX },
   },
   /* PREGRP13 */
   {
     { "sqrtps", XM, EX, XX },
     { "sqrtss", XM, EX, XX },
+    { "sqrtpd", XM, EX, XX },
+    { "sqrtsd", XM, EX, XX },
   },
   /* PREGRP14 */
   {
     { "subps", XM, EX, XX },
     { "subss", XM, EX, XX },
-  }
+    { "subpd", XM, EX, XX },
+    { "subsd", XM, EX, XX },
+  },
+  /* PREGRP15 */
+  {
+    { "(bad)", XM, EX, XX },
+    { "cvtdq2pd", XM, EX, XX },
+    { "cvttpd2dq", XM, EX, XX },
+    { "cvtpd2dq", XM, EX, XX },
+  },
+  /* PREGRP16 */
+  {
+    { "cvtdq2ps", XM, EX, XX },
+    { "cvttps2dq",XM, EX, XX },
+    { "cvtps2dq",XM, EX, XX },
+    { "(bad)", XM, EX, XX },
+  },
+  /* PREGRP17 */
+  {
+    { "cvtps2pd", XM, EX, XX },
+    { "cvtss2sd", XM, EX, XX },
+    { "cvtpd2ps", XM, EX, XX },
+    { "cvtsd2ss", XM, EX, XX },
+  },
+  /* PREGRP18 */
+  {
+    { "maskmovq", MX, EM, XX },
+    { "(bad)", XM, EX, XX },
+    { "maskmovdqu", MX, EX, XX },
+    { "(bad)", XM, EX, XX },
+  },
+  /* PREGRP19 */
+  {
+    { "movq", MX, EM, XX },
+    { "movdqu", XM, EX, XX },
+    { "movdqa", XM, EX, XX },
+    { "(bad)", XM, EX, XX },
+  },
+  /* PREGRP20 */
+  {
+    { "movq", EM, MX, XX },
+    { "movdqu", EX, XM, XX },
+    { "movdqa", EX, XM, XX },
+    { "(bad)", EX, XM, XX },
+  },
+  /* PREGRP21 */
+  {
+    { "(bad)", EX, XM, XX },
+    { "movq2dq", EX, EM, XX },
+    { "movq", EX, XM, XX },
+    { "movdq2q", EM, MX, XX },
+  },
+  /* PREGRP22 */
+  {
+    { "pshufw", MX, EM, Ib },
+    { "pshufhw", XM, EX, Ib },
+    { "pshufd", XM, EX, Ib },
+    { "pshuflw", XM, EX, Ib },
+  },
+  /* PREGRP23 */
+  {
+    { "movd", Ed, MX, XX },
+    { "movq", Ed, XM, XX },
+    { "movd", Ed, XM, XX },
+    { "(bad)", EX, XM, XX },
+  },
+  /* PREGRP24 */
+  {
+    { "(bad)", EX, XM, XX },
+    { "(bad)", EX, XM, XX },
+    { "punpckhqdq", XM, EX, XX },
+    { "(bad)", EX, XM, XX },
+  },
 };
 
 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
@@ -2854,7 +2968,7 @@ print_insn_i386 (pc, info)
   char *first, *second, *third;
   int needcomma;
   unsigned char need_modrm;
-  unsigned char uses_f3_prefix;
+  unsigned char uses_SSE_prefix;
   VOLATILE int sizeflag;
   VOLATILE int orig_sizeflag;
 
@@ -2950,7 +3064,7 @@ print_insn_i386 (pc, info)
       else
         dp = &dis386_twobyte_att[*++codep];
       need_modrm = twobyte_has_modrm[*codep];
-      uses_f3_prefix = twobyte_uses_f3_prefix[*codep];
+      uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
     }
   else
     {
@@ -2965,16 +3079,16 @@ print_insn_i386 (pc, info)
 	else
 	  dp = &dis386_att[*codep];
       need_modrm = onebyte_has_modrm[*codep];
-      uses_f3_prefix = 0;
+      uses_SSE_prefix = 0;
     }
   codep++;
 
-  if (!uses_f3_prefix && (prefixes & PREFIX_REPZ))
+  if (!uses_SSE_prefix && (prefixes & PREFIX_REPZ))
     {
       oappend ("repz ");
       used_prefixes |= PREFIX_REPZ;
     }
-  if (prefixes & PREFIX_REPNZ)
+  if (!uses_SSE_prefix && (prefixes & PREFIX_REPNZ))
     {
       oappend ("repnz ");
       used_prefixes |= PREFIX_REPNZ;
@@ -2985,7 +3099,7 @@ print_insn_i386 (pc, info)
       used_prefixes |= PREFIX_LOCK;
     }
 
-  if (prefixes & PREFIX_DATA)
+  if (!uses_SSE_prefix && (prefixes & PREFIX_DATA))
     sizeflag ^= DFLAG;
 
   if (prefixes & PREFIX_ADDR)
@@ -3012,6 +3126,7 @@ print_insn_i386 (pc, info)
     }
   else
     {
+      int index;
       if (dp->name == NULL)
 	{
 	  switch(dp->bytemode2)
@@ -3020,8 +3135,24 @@ print_insn_i386 (pc, info)
 	        dp = &grps[dp->bytemode1][reg];
 		break;
 	      case USE_PREFIX_USER_TABLE:
-		dp = &prefix_user_table[dp->bytemode1][prefixes & PREFIX_REPZ ? 1 : 0];
+		index = 0;
 		used_prefixes |= (prefixes & PREFIX_REPZ);
+		if (prefixes & PREFIX_REPZ)
+		  index = 1;
+		else
+		  {
+		    used_prefixes |= (prefixes & PREFIX_DATA);
+		    if (prefixes & PREFIX_DATA)
+		      index = 2;
+		    else
+		      {
+			used_prefixes |= (prefixes & PREFIX_REPNZ);
+			if (prefixes & PREFIX_REPNZ)
+			  index = 3;
+			
+		      }
+		  }
+		dp = &prefix_user_table[dp->bytemode1][index];
 		break;
 	      default:
 		oappend (INTERNAL_DISASSEMBLER_ERROR);
@@ -3670,6 +3801,13 @@ putop (template, sizeflag)
 	    }
 #endif
 	  break;
+	case 'X':
+	  if (prefixes & PREFIX_DATA)
+	    *obufp++ = 'd';
+	  else
+	    *obufp++ = 's';
+          used_prefixes |= (prefixes & PREFIX_DATA);
+	  break;
 	  /* implicit operand size 'l' for i386 or 'q' for x86-64 */
 	case 'I':
 	  if (mode_64bit)
@@ -3889,7 +4027,9 @@ OP_E (bytemode, sizeflag)
 	  used_prefixes |= (prefixes & PREFIX_DATA);
 	  break;
 	case 0:
-	  if ( !(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */))
+	  if ( !(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */)
+	      && !(codep[-2] == 0xAE && codep[-1] == 0xF0 /* mfence */)
+	      && !(codep[-2] == 0xAE && codep[-1] == 0xe8 /* lfence */))
 	    BadOp();	/* bad sfence,lea,lds,les,lfs,lgs,lss modrm */
 	  break;
 	default:
@@ -4697,7 +4837,15 @@ OP_MMX (ignore, sizeflag)
      int ignore ATTRIBUTE_UNUSED;
      int sizeflag ATTRIBUTE_UNUSED;
 {
-  sprintf (scratchbuf, "%%mm%d", reg);
+  int add = 0;
+  USED_REX (REX_EXTX);
+  if (rex & REX_EXTX)
+    add = 8;
+  used_prefixes |= (prefixes & PREFIX_DATA);
+  if (prefixes & PREFIX_DATA)
+    sprintf (scratchbuf, "%%xmm%d", reg + add);
+  else
+    sprintf (scratchbuf, "%%mm%d", reg + add);
   oappend (scratchbuf);
 }
 
@@ -4706,7 +4854,11 @@ OP_XMM (bytemode, sizeflag)
      int bytemode ATTRIBUTE_UNUSED;
      int sizeflag ATTRIBUTE_UNUSED;
 {
-  sprintf (scratchbuf, "%%xmm%d", reg);
+  int add = 0;
+  USED_REX (REX_EXTX);
+  if (rex & REX_EXTX)
+    add = 8;
+  sprintf (scratchbuf, "%%xmm%d", reg + add);
   oappend (scratchbuf);
 }
 
@@ -4715,14 +4867,22 @@ OP_EM (bytemode, sizeflag)
      int bytemode;
      int sizeflag;
 {
+  int add = 0;
   if (mod != 3)
     {
       OP_E (bytemode, sizeflag);
       return;
     }
+  USED_REX (REX_EXTZ);
+  if (rex & REX_EXTZ)
+    add = 8;
 
   codep++;
-  sprintf (scratchbuf, "%%mm%d", rm);
+  used_prefixes |= (prefixes & PREFIX_DATA);
+  if (prefixes & PREFIX_DATA)
+    sprintf (scratchbuf, "%%xmm%d", rm + add);
+  else
+    sprintf (scratchbuf, "%%mm%d", rm + add);
   oappend (scratchbuf);
 }
 
@@ -4731,14 +4891,18 @@ OP_EX (bytemode, sizeflag)
      int bytemode;
      int sizeflag;
 {
+  int add = 0;
   if (mod != 3)
     {
       OP_E (bytemode, sizeflag);
       return;
     }
+  USED_REX (REX_EXTZ);
+  if (rex & REX_EXTZ)
+    add = 8;
 
   codep++;
-  sprintf (scratchbuf, "%%xmm%d", rm);
+  sprintf (scratchbuf, "%%xmm%d", rm + add);
   oappend (scratchbuf);
 }
 
@@ -4871,9 +5035,24 @@ OP_SIMD_Suffix (bytemode, sizeflag)
   cmp_type = *codep++ & 0xff;
   if (cmp_type < 8)
     {
-      sprintf (scratchbuf, "cmp%s%cs",
-	       simd_cmp_op[cmp_type],
-	       prefixes & PREFIX_REPZ ? 's' : 'p');
+      char suffix1 = 'p', suffix2 = 's';
+      used_prefixes |= (prefixes & PREFIX_REPZ);
+      if (prefixes & PREFIX_REPZ)
+	suffix1 = 's';
+      else
+	{
+	  used_prefixes |= (prefixes & PREFIX_DATA);
+	  if (prefixes & PREFIX_DATA)
+	    suffix2 = 'd';
+	  else
+	    {
+	      used_prefixes |= (prefixes & PREFIX_REPNZ);
+	      if (prefixes & PREFIX_REPNZ)
+		suffix1 = 's', suffix2 = 'd';
+	    }
+	}
+      sprintf (scratchbuf, "cmp%s%c%c",
+	       simd_cmp_op[cmp_type], suffix1, suffix2);
       used_prefixes |= (prefixes & PREFIX_REPZ);
       oappend (scratchbuf);
     }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]