aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorAmit Pawar <Amit.Pawar@amd.com>2015-06-30 12:11:52 +0530
committerH.J. Lu <hjl.tools@gmail.com>2015-06-30 07:50:12 -0700
commit9916071f8df180400e39d1783d4a878cf57c61fe (patch)
tree852b09185d1208ac9f77d41e811300d55629fc0e /gas
parent54f66250d79ec304ea427915bfd8b535ec249c3b (diff)
downloadfsf-binutils-gdb-9916071f8df180400e39d1783d4a878cf57c61fe.zip
fsf-binutils-gdb-9916071f8df180400e39d1783d4a878cf57c61fe.tar.gz
fsf-binutils-gdb-9916071f8df180400e39d1783d4a878cf57c61fe.tar.bz2
Add support for monitorx/mwaitx instructions
gas/ * config/tc-i386.c (cpu_arch): Add .mwaitx. (process_immext): Check operands for monitorx/mwaitx instructions. * doc/c-i386.texi: Document mwaitx. gas/testsuite/ * gas/i386/i386.exp: Add new mwaitx test cases. * gas/i386/mwaitx.s: New. * gas/i386/mwaitx-bdver4.d: New. * gas/i386/x86-64-mwaitx.s: New. * gas/i386/x86-64-mwaitx-bdver4.d: New. * gas/i386/mwaitx-reg.s: New. * gas/i386/mwaitx-reg.l: New. * gas/i386/x86-64-mwaitx-reg.l: New. * gas/i386/x86-64-mwaitx-reg.s: New. * gas/i386/arch-13.s: Updated. * gas/i386/arch-13.d: Updated. * gas/i386/arch-13-znver1.d: Updated. * gas/i386/x86-64-arch-3.s: Updated. * gas/i386/x86-64-arch-3.d: Updated. * gas/i386/x86-64-arch-3-znver1.d: Updated. opcodes/ * i386-dis.c (OP_Mwaitx): New. (rm_table): Add monitorx/mwaitx. * i386-gen.c (cpu_flag_init): Add CpuMWAITX to CPU_BDVER4_FLAGS and CPU_ZNVER1_FLAGS. Add CPU_MWAITX_FLAGS. (operand_type_init): Add CpuMWAITX. * i386-opc.h (CpuMWAITX): New. (i386_cpu_flags): Add cpumwaitx. * i386-opc.tbl: Add monitorx and mwaitx. * i386-init.h: Regenerated. * i386-tbl.h: Likewise.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-i386.c30
-rw-r--r--gas/doc/c-i386.texi3
-rw-r--r--gas/testsuite/ChangeLog18
-rw-r--r--gas/testsuite/gas/i386/arch-13-znver1.d5
-rw-r--r--gas/testsuite/gas/i386/arch-13.d7
-rw-r--r--gas/testsuite/gas/i386/arch-13.s6
-rw-r--r--gas/testsuite/gas/i386/i386.exp4
-rw-r--r--gas/testsuite/gas/i386/mwaitx-bdver4.d17
-rw-r--r--gas/testsuite/gas/i386/mwaitx-reg.l59
-rw-r--r--gas/testsuite/gas/i386/mwaitx-reg.s8
-rw-r--r--gas/testsuite/gas/i386/mwaitx.s9
-rw-r--r--gas/testsuite/gas/i386/x86-64-arch-3-znver1.d5
-rw-r--r--gas/testsuite/gas/i386/x86-64-arch-3.d7
-rw-r--r--gas/testsuite/gas/i386/x86-64-arch-3.s6
-rw-r--r--gas/testsuite/gas/i386/x86-64-mwaitx-bdver4.d17
-rw-r--r--gas/testsuite/gas/i386/x86-64-mwaitx-reg.l123
-rw-r--r--gas/testsuite/gas/i386/x86-64-mwaitx-reg.s8
-rw-r--r--gas/testsuite/gas/i386/x86-64-mwaitx.s9
19 files changed, 342 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 7c49ea6..7796577 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-30 Amit Pawar <Amit.Pawar@amd.com>
+
+ * config/tc-i386.c (cpu_arch): Add .mwaitx.
+ (process_immext): Check operands for monitorx/mwaitx instructions.
+ * doc/c-i386.texi: Document mwaitx.
+
2015-06-28 H.J. Lu <hongjiu.lu@intel.com>
* as.c (parse_args): Replace COMPRESS_DEBUG_ZLIB with
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index d8405b5..5a1e2b3 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -954,6 +954,8 @@ static const arch_entry cpu_arch[] =
CPU_AVX512VBMI_FLAGS, 0, 0 },
{ STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
CPU_CLZERO_FLAGS, 0, 0 },
+ { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
+ CPU_MWAITX_FLAGS, 0, 0 },
};
#ifdef I386COFF
@@ -3347,6 +3349,34 @@ process_immext (void)
i.operands = 0;
}
+ if (i.tm.cpu_flags.bitfield.cpumwaitx && i.operands > 0)
+ {
+ /* MONITORX/MWAITX instructions have fixed operands with an opcode
+ suffix which is coded in the same place as an 8-bit immediate
+ field would be.
+ Here we check those operands and remove them afterwards. */
+ unsigned int x;
+
+ if (i.operands != 3)
+ abort();
+
+ for (x = 0; x < 2; x++)
+ if (register_number (i.op[x].regs) != x)
+ goto bad_register_operand;
+
+ /* Check for third operand for mwaitx/monitorx insn. */
+ if (register_number (i.op[x].regs)
+ != (x + (i.tm.extension_opcode == 0xfb)))
+ {
+bad_register_operand:
+ as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
+ register_prefix, i.op[x].regs->reg_name, x+1,
+ i.tm.name);
+ }
+
+ i.operands = 0;
+ }
+
/* These AMD 3DNow! and SSE2 instructions have an opcode suffix
which is coded in the same place as an 8-bit immediate field
would be. Here we fake an 8-bit immediate operand from the
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 6118987..4af05e3 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -189,6 +189,7 @@ accept various extension mnemonics. For example,
@code{rtm},
@code{invpcid},
@code{clflush},
+@code{mwaitx},
@code{clzero},
@code{lwp},
@code{fma4},
@@ -1112,7 +1113,7 @@ supported on the CPU specified. The choices for @var{cpu_type} are:
@item @samp{.3dnow} @tab @samp{.3dnowa} @tab @samp{.sse4a} @tab @samp{.sse5}
@item @samp{.syscall} @tab @samp{.rdtscp} @tab @samp{.svme} @tab @samp{.abm}
@item @samp{.lwp} @tab @samp{.fma4} @tab @samp{.xop} @tab @samp{.cx16}
-@item @samp{.padlock} @tab @samp{.clzero}
+@item @samp{.padlock} @tab @samp{.clzero} @tab @samp{.mwaitx}
@end multitable
Apart from the warning, there are only two other effects on
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index e7ab1cf..3d4848b 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,21 @@
+2015-06-30 Amit Pawar <Amit.Pawar@amd.com>
+
+ * gas/i386/i386.exp: Add new mwaitx test cases.
+ * gas/i386/mwaitx.s: New.
+ * gas/i386/mwaitx-bdver4.d: New.
+ * gas/i386/x86-64-mwaitx.s: New.
+ * gas/i386/x86-64-mwaitx-bdver4.d: New.
+ * gas/i386/mwaitx-reg.s: New.
+ * gas/i386/mwaitx-reg.l: New.
+ * gas/i386/x86-64-mwaitx-reg.l: New.
+ * gas/i386/x86-64-mwaitx-reg.s: New.
+ * gas/i386/arch-13.s: Updated.
+ * gas/i386/arch-13.d: Updated.
+ * gas/i386/arch-13-znver1.d: Updated.
+ * gas/i386/x86-64-arch-3.s: Updated.
+ * gas/i386/x86-64-arch-3.d: Updated.
+ * gas/i386/x86-64-arch-3-znver1.d: Updated.
+
2015-06-27 H.J. Lu <hongjiu.lu@intel.com>
* gas/ia64/psn.d: Updated.
diff --git a/gas/testsuite/gas/i386/arch-13-znver1.d b/gas/testsuite/gas/i386/arch-13-znver1.d
index bafe606..b76cfab 100644
--- a/gas/testsuite/gas/i386/arch-13-znver1.d
+++ b/gas/testsuite/gas/i386/arch-13-znver1.d
@@ -17,4 +17,9 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 0f c7 21 xsavec \(%ecx\)
[ ]*[a-f0-9]+: 0f c7 29 xsaves \(%ecx\)
[ ]*[a-f0-9]+: 66 0f ae 39 clflushopt \(%ecx\)
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %eax,%ecx,%edx
+[ ]*[a-f0-9]+: 67 0f 01 fa monitorx %ax,%ecx,%edx
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %eax,%ecx,%edx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx,%ebx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx,%ebx
#pass
diff --git a/gas/testsuite/gas/i386/arch-13.d b/gas/testsuite/gas/i386/arch-13.d
index 370e641..6296ab7 100644
--- a/gas/testsuite/gas/i386/arch-13.d
+++ b/gas/testsuite/gas/i386/arch-13.d
@@ -1,4 +1,4 @@
-#as: -march=i686+smap+adx+rdseed+clzero+xsavec+xsaves+clflushopt
+#as: -march=i686+smap+adx+rdseed+clzero+xsavec+xsaves+clflushopt+mwaitx
#objdump: -dw
#name: i386 arch 13
@@ -16,4 +16,9 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 0f c7 21 xsavec \(%ecx\)
[ ]*[a-f0-9]+: 0f c7 29 xsaves \(%ecx\)
[ ]*[a-f0-9]+: 66 0f ae 39 clflushopt \(%ecx\)
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %eax,%ecx,%edx
+[ ]*[a-f0-9]+: 67 0f 01 fa monitorx %ax,%ecx,%edx
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %eax,%ecx,%edx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx,%ebx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx,%ebx
#pass
diff --git a/gas/testsuite/gas/i386/arch-13.s b/gas/testsuite/gas/i386/arch-13.s
index 5e1969f..4e82ff6 100644
--- a/gas/testsuite/gas/i386/arch-13.s
+++ b/gas/testsuite/gas/i386/arch-13.s
@@ -16,4 +16,8 @@ xsavec (%ecx)
xsaves (%ecx)
#CLFLUSHOPT
clflushopt (%ecx)
-
+monitorx %eax, %ecx, %edx
+monitorx %ax, %ecx, %edx
+monitorx
+mwaitx %eax, %ecx, %ebx
+mwaitx
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 9ff38d3..d36d5c6 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -340,6 +340,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "avx512vbmi_vl-intel"
run_dump_test "clzero"
run_dump_test "disassem"
+ run_dump_test "mwaitx-bdver4"
+ run_list_test "mwaitx-reg"
# These tests require support for 8 and 16 bit relocs,
# so we only run them for ELF and COFF targets.
@@ -721,6 +723,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
run_dump_test "x86-64-avx512vbmi_vl"
run_dump_test "x86-64-avx512vbmi_vl-intel"
run_dump_test "x86-64-clzero"
+ run_dump_test "x86-64-mwaitx-bdver4"
+ run_list_test "x86-64-mwaitx-reg"
if { ![istarget "*-*-aix*"]
&& ![istarget "*-*-beos*"]
diff --git a/gas/testsuite/gas/i386/mwaitx-bdver4.d b/gas/testsuite/gas/i386/mwaitx-bdver4.d
new file mode 100644
index 0000000..7a09db6
--- /dev/null
+++ b/gas/testsuite/gas/i386/mwaitx-bdver4.d
@@ -0,0 +1,17 @@
+#source: mwaitx.s
+#as: -march=bdver4
+#objdump: -dw
+#name: i386 monitorx and mwaitx insn
+
+.*: +file format .*
+
+
+Disassembly of section \.text:
+
+00000000 <_start>:
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %eax,%ecx,%edx
+[ ]*[a-f0-9]+: 67 0f 01 fa monitorx %ax,%ecx,%edx
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %eax,%ecx,%edx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx,%ebx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx,%ebx
+#pass
diff --git a/gas/testsuite/gas/i386/mwaitx-reg.l b/gas/testsuite/gas/i386/mwaitx-reg.l
new file mode 100644
index 0000000..68ea6e9
--- /dev/null
+++ b/gas/testsuite/gas/i386/mwaitx-reg.l
@@ -0,0 +1,59 @@
+#as: -march=mwaitx
+.*: Assembler messages:
+#eax
+.*:[0-9]*: Error: .*eax.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*eax.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*eax.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*eax.* 3 .*mwaitx.*
+
+#ebx
+.*:[0-9]*: Error: .*ebx.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*ebx.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*ebx.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*ebx.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*ebx.* 2 .*mwaitx.*
+
+#ecx
+.*:[0-9]*: Error: .*ecx.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*ecx.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*ecx.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*ecx.* 3 .*mwaitx.*
+
+#edx
+.*:[0-9]*: Error: .*edx.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*edx.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*edx.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*edx.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*edx.* 3 .*mwaitx.*
+
+#esp
+.*:[0-9]*: Error: .*esp.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*esp.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*esp.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*esp.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*esp.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*esp.* 3 .*mwaitx.*
+
+#ebp
+.*:[0-9]*: Error: .*ebp.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*ebp.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*ebp.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*ebp.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*ebp.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*ebp.* 3 .*mwaitx.*
+
+#esi
+.*:[0-9]*: Error: .*esi.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*esi.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*esi.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*esi.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*esi.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*esi.* 3 .*mwaitx.*
+
+#edi
+.*:[0-9]*: Error: .*edi.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*edi.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*edi.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*edi.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*edi.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*edi.* 3 .*mwaitx.*
diff --git a/gas/testsuite/gas/i386/mwaitx-reg.s b/gas/testsuite/gas/i386/mwaitx-reg.s
new file mode 100644
index 0000000..aa2e229
--- /dev/null
+++ b/gas/testsuite/gas/i386/mwaitx-reg.s
@@ -0,0 +1,8 @@
+.irp reg ax,bx,cx,dx,sp,bp,si,di
+ monitorx %e\reg, %ecx, %edx
+ monitorx %eax, %e\reg, %edx
+ monitorx %eax, %ecx, %e\reg
+ mwaitx %e\reg, %ecx, %ebx
+ mwaitx %eax, %e\reg, %ebx
+ mwaitx %eax, %ecx, %e\reg
+.endr
diff --git a/gas/testsuite/gas/i386/mwaitx.s b/gas/testsuite/gas/i386/mwaitx.s
new file mode 100644
index 0000000..7bd7a3a
--- /dev/null
+++ b/gas/testsuite/gas/i386/mwaitx.s
@@ -0,0 +1,9 @@
+# Check monitorx and mwaitx instructions
+
+ .text
+_start:
+ monitorx %eax, %ecx, %edx
+ monitorx %ax, %ecx, %edx
+ monitorx
+ mwaitx %eax, %ecx, %ebx
+ mwaitx
diff --git a/gas/testsuite/gas/i386/x86-64-arch-3-znver1.d b/gas/testsuite/gas/i386/x86-64-arch-3-znver1.d
index 9066855..2fc0a1f 100644
--- a/gas/testsuite/gas/i386/x86-64-arch-3-znver1.d
+++ b/gas/testsuite/gas/i386/x86-64-arch-3-znver1.d
@@ -18,4 +18,9 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 48 0f c7 21 xsavec64 \(%rcx\)
[ ]*[a-f0-9]+: 48 0f c7 29 xsaves64 \(%rcx\)
[ ]*[a-f0-9]+: 66 0f ae 39 clflushopt \(%rcx\)
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %rax,%rcx,%rdx
+[ ]*[a-f0-9]+: 67 0f 01 fa monitorx %eax,%rcx,%rdx
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %rax,%rcx,%rdx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx,%rbx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx,%rbx
#pass
diff --git a/gas/testsuite/gas/i386/x86-64-arch-3.d b/gas/testsuite/gas/i386/x86-64-arch-3.d
index 7b0792a..6a7fb00 100644
--- a/gas/testsuite/gas/i386/x86-64-arch-3.d
+++ b/gas/testsuite/gas/i386/x86-64-arch-3.d
@@ -1,4 +1,4 @@
-#as: -march=generic64+smap+adx+rdseed+clzero+sha+xsavec+xsaves+clflushopt
+#as: -march=generic64+smap+adx+rdseed+clzero+sha+xsavec+xsaves+clflushopt+mwaitx
#objdump: -dw
#name: x86-64 arch 3
@@ -17,4 +17,9 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 48 0f c7 21 xsavec64 \(%rcx\)
[ ]*[a-f0-9]+: 48 0f c7 29 xsaves64 \(%rcx\)
[ ]*[a-f0-9]+: 66 0f ae 39 clflushopt \(%rcx\)
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %rax,%rcx,%rdx
+[ ]*[a-f0-9]+: 67 0f 01 fa monitorx %eax,%rcx,%rdx
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %rax,%rcx,%rdx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx,%rbx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx,%rbx
#pass
diff --git a/gas/testsuite/gas/i386/x86-64-arch-3.s b/gas/testsuite/gas/i386/x86-64-arch-3.s
index 76c4226..2096efc 100644
--- a/gas/testsuite/gas/i386/x86-64-arch-3.s
+++ b/gas/testsuite/gas/i386/x86-64-arch-3.s
@@ -18,4 +18,8 @@ xsavec64 (%rcx)
xsaves64 (%rcx)
#CLFLUSHOPT
clflushopt (%rcx)
-
+monitorx %rax,%rcx,%rdx
+monitorx %eax,%rcx,%rdx
+monitorx
+mwaitx %rax,%rcx,%rbx
+mwaitx
diff --git a/gas/testsuite/gas/i386/x86-64-mwaitx-bdver4.d b/gas/testsuite/gas/i386/x86-64-mwaitx-bdver4.d
new file mode 100644
index 0000000..f35ad11
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-mwaitx-bdver4.d
@@ -0,0 +1,17 @@
+#source: x86-64-mwaitx.s
+#as: -march=bdver4
+#objdump: -dw
+#name: x86_64 monitorx and mwaitx insn
+
+.*: +file format .*
+
+
+Disassembly of section \.text:
+
+0000000000000000 <_start>:
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %rax,%rcx,%rdx
+[ ]*[a-f0-9]+: 67 0f 01 fa monitorx %eax,%rcx,%rdx
+[ ]*[a-f0-9]+: 0f 01 fa monitorx %rax,%rcx,%rdx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx,%rbx
+[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx,%rbx
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-mwaitx-reg.l b/gas/testsuite/gas/i386/x86-64-mwaitx-reg.l
new file mode 100644
index 0000000..ea1fef0
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-mwaitx-reg.l
@@ -0,0 +1,123 @@
+#as: -march=mwaitx
+.*: Assembler messages:
+#rax
+.*:[0-9]*: Error: .*rax.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rax.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rax.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*rax.* 3 .*mwaitx.*
+
+#rbx
+.*:[0-9]*: Error: .*rbx.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rbx.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rbx.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rbx.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rbx.* 2 .*mwaitx.*
+
+#rcx
+.*:[0-9]*: Error: .*rcx.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rcx.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rcx.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rcx.* 3 .*mwaitx.*
+
+#rdx
+.*:[0-9]*: Error: .*rdx.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rdx.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rdx.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rdx.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*rdx.* 3 .*mwaitx.*
+
+#rsp
+.*:[0-9]*: Error: .*rsp.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rsp.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rsp.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rsp.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rsp.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*rsp.* 3 .*mwaitx.*
+
+#rbp
+.*:[0-9]*: Error: .*rbp.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rbp.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rbp.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rbp.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rbp.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*rbp.* 3 .*mwaitx.*
+
+#rsi
+.*:[0-9]*: Error: .*rsi.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rsi.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rsi.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rsi.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rsi.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*rsi.* 3 .*mwaitx.*
+
+#rdi
+.*:[0-9]*: Error: .*rdi.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*rdi.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*rdi.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*rdi.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*rdi.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*rdi.* 3 .*mwaitx.*
+
+#r8
+.*:[0-9]*: Error: .*r8.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r8.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r8.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r8.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r8.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r8.* 3 .*mwaitx.*
+
+#r9
+.*:[0-9]*: Error: .*r9.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r9.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r9.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r9.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r9.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r9.* 3 .*mwaitx.*
+
+#r10
+.*:[0-9]*: Error: .*r10.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r10.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r10.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r10.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r10.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r10.* 3 .*mwaitx.*
+
+#r11
+.*:[0-9]*: Error: .*r11.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r11.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r11.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r11.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r11.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r11.* 3 .*mwaitx.*
+
+#r12
+.*:[0-9]*: Error: .*r12.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r12.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r12.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r12.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r12.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r12.* 3 .*mwaitx.*
+
+#r13
+.*:[0-9]*: Error: .*r13.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r13.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r13.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r13.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r13.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r13.* 3 .*mwaitx.*
+
+#r14
+.*:[0-9]*: Error: .*r14.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r14.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r14.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r14.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r14.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r14.* 3 .*mwaitx.*
+
+#r15
+.*:[0-9]*: Error: .*r15.* 1 .*monitorx.*
+.*:[0-9]*: Error: .*r15.* 2 .*monitorx.*
+.*:[0-9]*: Error: .*r15.* 3 .*monitorx.*
+.*:[0-9]*: Error: .*r15.* 1 .*mwaitx.*
+.*:[0-9]*: Error: .*r15.* 2 .*mwaitx.*
+.*:[0-9]*: Error: .*r15.* 3 .*mwaitx.*
diff --git a/gas/testsuite/gas/i386/x86-64-mwaitx-reg.s b/gas/testsuite/gas/i386/x86-64-mwaitx-reg.s
new file mode 100644
index 0000000..5df5f8c
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-mwaitx-reg.s
@@ -0,0 +1,8 @@
+.irp reg ax,bx,cx,dx,sp,bp,si,di,8,9,10,11,12,13,14,15
+ monitorx %r\reg, %rcx, %rdx
+ monitorx %rax, %r\reg, %rdx
+ monitorx %rax, %rcx, %r\reg
+ mwaitx %r\reg, %rcx, %rbx
+ mwaitx %rax, %r\reg, %rbx
+ mwaitx %rax, %rcx, %r\reg
+.endr
diff --git a/gas/testsuite/gas/i386/x86-64-mwaitx.s b/gas/testsuite/gas/i386/x86-64-mwaitx.s
new file mode 100644
index 0000000..0f58d3c
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-mwaitx.s
@@ -0,0 +1,9 @@
+# Check monitorx and mwaitx instructions
+
+ .text
+_start:
+ monitorx %rax, %rcx, %rdx
+ monitorx %eax, %rcx, %rdx
+ monitorx
+ mwaitx %rax, %rcx, %rbx
+ mwaitx