summaryrefslogtreecommitdiff
path: root/opcodes/i386-dis.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2006-12-14 20:13:28 +0000
committerH.J. Lu <hjl.tools@gmail.com>2006-12-14 20:13:28 +0000
commitf5804c90c7ec45c1e5831d5f7e97ac74d61db1a6 (patch)
tree784c143f83408de4aea18d777deb6b13c3df2086 /opcodes/i386-dis.c
parent6008641eec7579d885ad251aadab19132570ad4d (diff)
downloadbinutils-gdb-f5804c90c7ec45c1e5831d5f7e97ac74d61db1a6.tar.gz
gas/testsuite/
2006-12-14 H.J. Lu <hongjiu.lu@intel.com> * gas/i386/x86-64-inval.s: Add cmpxchg16b. * gas/i386/x86_64.s: Likewise. * gas/i386/x86-64-inval.l: Updated. * gas/i386/x86_64.d: Likewise. opcodes/ 2006-12-14 H.J. Lu <hongjiu.lu@intel.com> * i386-dis.c (CMPXCHG8B_Fixup): New. (grps): Use CMPXCHG8B_Fixup for cmpxchg8b.
Diffstat (limited to 'opcodes/i386-dis.c')
-rw-r--r--opcodes/i386-dis.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 8b6f532aabe..009d0f63589 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -104,6 +104,7 @@ static void INVLPG_Fixup (int, int);
static void BadOp (void);
static void VMX_Fixup (int, int);
static void REP_Fixup (int, int);
+static void CMPXCHG8B_Fixup (int, int);
struct dis_private {
/* Points to first byte not fetched. */
@@ -1638,7 +1639,7 @@ static const struct dis386 grps[][8] = {
/* GRP9 */
{
{ "(bad)", XX, XX, XX, XX },
- { "cmpxchg8b", Mq, XX, XX, XX },
+ { "cmpxchg8b", CMPXCHG8B_Fixup, q_mode, XX, XX, XX },
{ "(bad)", XX, XX, XX, XX },
{ "(bad)", XX, XX, XX, XX },
{ "(bad)", XX, XX, XX, XX },
@@ -5767,3 +5768,17 @@ REP_Fixup (int bytemode, int sizeflag)
break;
}
}
+
+static void
+CMPXCHG8B_Fixup (int bytemode, int sizeflag)
+{
+ USED_REX (REX_MODE64);
+ if (rex & REX_MODE64)
+ {
+ /* Change cmpxchg8b to cmpxchg16b. */
+ char *p = obuf + strlen (obuf) - 2;
+ strcpy (p, "16b");
+ bytemode = x_mode;
+ }
+ OP_M (bytemode, sizeflag);
+}