diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2006-12-14 20:13:28 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2006-12-14 20:13:28 +0000 |
commit | f5804c90c7ec45c1e5831d5f7e97ac74d61db1a6 (patch) | |
tree | 784c143f83408de4aea18d777deb6b13c3df2086 /opcodes/i386-dis.c | |
parent | 6008641eec7579d885ad251aadab19132570ad4d (diff) | |
download | binutils-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.c | 17 |
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); +} |