aboutsummaryrefslogtreecommitdiff
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
parent6008641eec7579d885ad251aadab19132570ad4d (diff)
downloadgdb-f5804c90c7ec45c1e5831d5f7e97ac74d61db1a6.zip
gdb-f5804c90c7ec45c1e5831d5f7e97ac74d61db1a6.tar.gz
gdb-f5804c90c7ec45c1e5831d5f7e97ac74d61db1a6.tar.bz2
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.
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/i386/x86-64-inval.l3
-rw-r--r--gas/testsuite/gas/i386/x86-64-inval.s2
-rw-r--r--gas/testsuite/gas/i386/x86_64.d2
-rw-r--r--gas/testsuite/gas/i386/x86_64.s5
-rw-r--r--opcodes/ChangeLog5
-rw-r--r--opcodes/i386-dis.c17
7 files changed, 40 insertions, 1 deletions
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 4e8b4ff..cfd50e7 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2006-12-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/3712
diff --git a/gas/testsuite/gas/i386/x86-64-inval.l b/gas/testsuite/gas/i386/x86-64-inval.l
index 2e45b46..2cbb867 100644
--- a/gas/testsuite/gas/i386/x86-64-inval.l
+++ b/gas/testsuite/gas/i386/x86-64-inval.l
@@ -49,6 +49,7 @@
.*:50: Error: .*
.*:51: Error: .*
.*:52: Error: .*
+.*:54: Error: .*
GAS LISTING .*
@@ -104,3 +105,5 @@ GAS LISTING .*
50 [ ]*popfl # can't have 32-bit stack operands
51 [ ]*retl # can't have 32-bit stack operands
52 [ ]*insertq \$4,\$2,%xmm2,%ebx # The last operand must be XMM register.
+ 53 [ ]*.intel_syntax noprefix
+ 54 [ ]*cmpxchg16b dword ptr \[rax\] # Must be xmmword
diff --git a/gas/testsuite/gas/i386/x86-64-inval.s b/gas/testsuite/gas/i386/x86-64-inval.s
index 68f4cb5..7178ede 100644
--- a/gas/testsuite/gas/i386/x86-64-inval.s
+++ b/gas/testsuite/gas/i386/x86-64-inval.s
@@ -50,3 +50,5 @@ foo: jcxz foo # No prefix exists to select CX as a counter
popfl # can't have 32-bit stack operands
retl # can't have 32-bit stack operands
insertq $4,$2,%xmm2,%ebx # The last operand must be XMM register.
+ .intel_syntax noprefix
+ cmpxchg16b dword ptr [rax] # Must be xmmword
diff --git a/gas/testsuite/gas/i386/x86_64.d b/gas/testsuite/gas/i386/x86_64.d
index cdd49ef..1289b45 100644
--- a/gas/testsuite/gas/i386/x86_64.d
+++ b/gas/testsuite/gas/i386/x86_64.d
@@ -156,4 +156,6 @@ Disassembly of section .text:
2fc: 66 89 04 25 11 22 33 ff mov[ ]+%ax,0xffffffffff332211
304: 89 04 25 11 22 33 ff mov[ ]+%eax,0xffffffffff332211
30b: 48 89 04 25 11 22 33 ff mov[ ]+%rax,0xffffffffff332211
+ 313: 48 0f c7 08[ ]+cmpxchg16b \(%rax\)
+ 317: 48 0f c7 08[ ]+cmpxchg16b \(%rax\)
#pass
diff --git a/gas/testsuite/gas/i386/x86_64.s b/gas/testsuite/gas/i386/x86_64.s
index 3e5532a..c89d393 100644
--- a/gas/testsuite/gas/i386/x86_64.s
+++ b/gas/testsuite/gas/i386/x86_64.s
@@ -188,5 +188,10 @@ movw %ax,0xffffffffff332211
movl %eax,0xffffffffff332211
movq %rax,0xffffffffff332211
+cmpxchg16b (%rax)
+
+.intel_syntax noprefix
+cmpxchg16b xmmword ptr [rax]
+
# Get a good alignment.
.p2align 4,0
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 97fcec5..9bebc48 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,8 @@
+2006-12-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-dis.c (CMPXCHG8B_Fixup): New.
+ (grps): Use CMPXCHG8B_Fixup for cmpxchg8b.
+
2006-12-11 H.J. Lu <hongjiu.lu@intel.com>
* i386-dis.c (Eq): Replaced by ...
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 8b6f532..009d0f6 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);
+}