diff --git a/gas/ChangeLog b/gas/ChangeLog index dd2f446..c5d2bc8 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2015-05-28 Amit Pawar + + * config/tc-i386.c: Updated to handle monitorx/mwaitx instruction. + * doc/c-i386.texi: Add mwaitx cpu. + 2015-06-01 Matthew Wahab * config/tc-aarch64.c (parse_sys_reg): New parameter. Check target diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 34b5c28..581370a 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 @@ -3329,7 +3331,8 @@ process_immext (void) { expressionS *exp; - if ((i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpusvme) + if ((i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpusvme || + i.tm.cpu_flags.bitfield.cpumwaitx) && i.operands > 0) { /* MONITOR/MWAIT as well as SVME instructions have fixed operands 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 233e138..71bbd01 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2015-05-29 Amit Pawar + + * gas/i386/i386.exp: Add new mwaitx test cases. + * gas/i386/x86-64-mwaitx-znver1.d: New. + * gas/i386/x86-64-mwaitx-reg.l: New. + * gas/i386/mwaitx-znver1.d: New. + * gas/i386/x86-64-mwaitx-reg.s: New. + * gas/i386/mwaitx-bdver4.d: New. + * gas/i386/x86-64-mwaitx-bdver4.d: New. + * gas/i386/mwaitx.s: New. + * gas/i386/mwaitx-reg.s: New. + * gas/i386/x86-64-mwaitx.s: New. + * gas/i386/mwaitx-reg.l: New. + 2015-06-01 Matthew Wahab * pan-directive.d: New. diff --git a/gas/testsuite/gas/i386/mwaitx-bdver4.d b/gas/testsuite/gas/i386/mwaitx-bdver4.d new file mode 100644 index 0000000..5c4c891 --- /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 +[ ]*[a-f0-9]+: 0f 01 fb mwaitx %eax,%ecx +#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..b5c212a --- /dev/null +++ b/gas/testsuite/gas/i386/mwaitx-reg.l @@ -0,0 +1,52 @@ +#as: -march=mwaitx +.*: Assembler messages: +#eax +.*:[0-9]*: Error: .*eax.* 2 .*monitorx.* +.*:[0-9]*: Error: .*eax.* 3 .*monitorx.* +.*:[0-9]*: Error: .*eax.* 2 .*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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* diff --git a/gas/testsuite/gas/i386/mwaitx-reg.s b/gas/testsuite/gas/i386/mwaitx-reg.s new file mode 100644 index 0000000..91f34d2 --- /dev/null +++ b/gas/testsuite/gas/i386/mwaitx-reg.s @@ -0,0 +1,7 @@ +.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 + mwaitx %eax, %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..dddc684 --- /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 + 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..d75ec3b --- /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 +[ ]*[a-f0-9]+: 0f 01 fb mwaitx %rax,%rcx +#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..6be79c1 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-mwaitx-reg.l @@ -0,0 +1,108 @@ +#as: -march=mwaitx +.*: Assembler messages: +#rax +.*:[0-9]*: Error: .*rax.* 2 .*monitorx.* +.*:[0-9]*: Error: .*rax.* 3 .*monitorx.* +.*:[0-9]*: Error: .*rax.* 2 .*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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* + +#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.* 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..3108adc --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-mwaitx-reg.s @@ -0,0 +1,7 @@ +.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 + mwaitx %rax, %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..889218c --- /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 + mwaitx diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index f4688c8..26e2daa 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,12 @@ +2015-05-29 Amit Pawar + + * i386-dis.c (rm_table): Add monitorx/mwaitx. + * i386-gen.c (cpu_flag_init): Add new CPU_MWAITX_FLAGS. + * i386-opc.h: Add CpuMWAITX. + * i386-opc.tbl: Add monitorx and mwaitx. + * i386-init.h: Re-generated. + * i386-tbl.h: Re-generated. + 2015-06-01 Matthew Wahab * aarch64-opc.c (F_ARCHEXT): New. diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 767bab3..7212993 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -12072,8 +12072,8 @@ static const struct dis386 rm_table[][8] = { /* RM_0F01_REG_7 */ { "swapgs", { Skip_MODRM }, 0 }, { "rdtscp", { Skip_MODRM }, 0 }, - { Bad_Opcode }, - { Bad_Opcode }, + { "monitorx", { { OP_Monitor, 0 } }, 0 }, + { "mwaitx", { { OP_Mwait, 0 } }, 0 }, { "clzero", { Skip_MODRM }, 0 }, }, { diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c index 0523936..5aca18a 100644 --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -94,9 +94,9 @@ static initializer cpu_flag_init[] = { "CPU_BDVER3_FLAGS", "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase" }, { "CPU_BDVER4_FLAGS", - "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd" }, + "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd|CpuMWAITX" }, { "CPU_ZNVER1_FLAGS", - "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuBMI|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd|CpuADX|CpuRdSeed|CpuSMAP|CpuSHA|CpuXSAVEC|CpuXSAVES|CpuClflushOpt|CpuCLZERO" }, + "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuBMI|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd|CpuADX|CpuRdSeed|CpuSMAP|CpuSHA|CpuXSAVEC|CpuXSAVES|CpuClflushOpt|CpuCLZERO|CpuMWAITX" }, { "CPU_BTVER1_FLAGS", "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4a|CpuABM|CpuLM|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" }, { "CPU_BTVER2_FLAGS", @@ -253,6 +253,8 @@ static initializer cpu_flag_init[] = "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VBMI" }, { "CPU_CLZERO_FLAGS", "CpuCLZERO" }, + { "CPU_MWAITX_FLAGS", + "CpuMWAITX" }, }; static initializer operand_type_init[] = @@ -457,6 +459,7 @@ static bitfield cpu_flags[] = BITFIELD (CpuMPX), BITFIELD (CpuAVX512IFMA), BITFIELD (CpuAVX512VBMI), + BITFIELD (CpuMWAITX), BITFIELD (CpuCLZERO), BITFIELD (CpuAMD64), BITFIELD (CpuIntel64), diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h index 62ac42a..d598ce5 100644 --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -194,6 +194,8 @@ enum CpuAVX512IFMA, /* Intel AVX-512 VBMI Instructions support required. */ CpuAVX512VBMI, + /* mwaitx instruction required */ + CpuMWAITX, /* Clzero instruction required */ CpuCLZERO, /* 64bit support required */ @@ -304,6 +306,7 @@ typedef union i386_cpu_flags unsigned int cpupcommit:1; unsigned int cpuavx512ifma:1; unsigned int cpuavx512vbmi:1; + unsigned int cpumwaitx:1; unsigned int cpuclzero:1; unsigned int cpu64:1; unsigned int cpuno64:1; diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl index a3bd7de..00a1bb0 100644 --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -5938,3 +5938,16 @@ clzero, 0, 0xf01fc, None, 3, CpuCLZERO, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf| // CLZERO instructions end +// MONITORX/MWAITX instructions +monitorx, 0, 0xf01, 0xfa, 2, CpuMWAITX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt, { 0 } +// Need to ensure only "monitorx %eax/%ax,%ecx,%edx" is accepted. +monitorx, 3, 0xf01, 0xfa, 2, CpuMWAITX|CpuNo64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt|AddrPrefixOp0, { Reg16|Reg32, Reg32, Reg32 } +// Need to ensure only "monitorx %rax/%eax,%rcx,%rdx" is accepted. +monitorx, 3, 0xf01, 0xfa, 2, CpuMWAITX|Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt|AddrPrefixOp0|NoRex64, { Reg32|Reg64, Reg64, Reg64 } + +mwaitx, 0, 0xf01, 0xfb, 2, CpuMWAITX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt, { 0 } +// Need to ensure only "mwaitx %eax,%ecx" is accepted. +mwaitx, 2, 0xf01, 0xfb, 2, CpuMWAITX|CpuNo64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt|NoAVX, { Reg32, Reg32 } +// Need to ensure only "mwaitx %rax,%rcx" is accepted. +mwaitx, 2, 0xf01, 0xfb, 2, CpuMWAITX|Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt|NoRex64|NoAVX, { Reg64, Reg64 } +// MONITORX/MWAITX instructions end