[X86] Don't disassemble wbinvd with 0xf2 or 0x66 prefix.
authorCraig Topper <craig.topper@gmail.com>
Mon, 26 Oct 2020 03:40:45 +0000 (20:40 -0700)
committerCraig Topper <craig.topper@gmail.com>
Mon, 26 Oct 2020 03:56:01 +0000 (20:56 -0700)
The 0xf3 prefix has been defined as wbnoinvd on Icelake Server. So
the prefix isn't ignored by the CPU. AMD documentation suggests that
wbnoinvd is treated as wbinvd on older processors. Intel documentation
is not clear. Perhaps 0xf2 and 0x66 are treated the same, but its
not documented.

This patch changes TB to PS in the td file so 0xf2 and 0x66 will
be treated as errors. This matches versions of objdump after
wbnoinvd was added.

llvm/lib/Target/X86/X86InstrSystem.td
llvm/test/MC/Disassembler/X86/invalid-wbinvd.txt [new file with mode: 0644]
llvm/test/MC/Disassembler/X86/x86-32.txt
llvm/test/MC/Disassembler/X86/x86-64.txt

index 13659b5..2f48a43 100644 (file)
@@ -447,7 +447,7 @@ let Defs = [EAX, EBX, ECX, EDX], Uses = [EAX, ECX] in
 // Cache instructions
 let SchedRW = [WriteSystem] in {
 def INVD : I<0x08, RawFrm, (outs), (ins), "invd", []>, TB;
-def WBINVD : I<0x09, RawFrm, (outs), (ins), "wbinvd", [(int_x86_wbinvd)]>, TB;
+def WBINVD : I<0x09, RawFrm, (outs), (ins), "wbinvd", [(int_x86_wbinvd)]>, PS;
 
 // wbnoinvd is like wbinvd, except without invalidation
 // encoding: like wbinvd + an 0xF3 prefix
diff --git a/llvm/test/MC/Disassembler/X86/invalid-wbinvd.txt b/llvm/test/MC/Disassembler/X86/invalid-wbinvd.txt
new file mode 100644 (file)
index 0000000..c618c91
--- /dev/null
@@ -0,0 +1,4 @@
+# RUN: llvm-mc --disassemble %s -triple=x86_64 2>&1 | FileCheck %s
+
+# CHECK: invalid instruction encoding
+0xf2,0x0f,0x09
index e1c8f8f..026f4ad 100644 (file)
 # CHECK: ptwritel %eax
 0xf3 0x0f 0xae 0xe0
 
+# CHECK: wbinvd
+0x0f 0x09
+
 # CHECK: wbnoinvd
 0xf3 0x0f 0x09
 
index 23c5a6e..0c5065d 100644 (file)
 # CHECK: ptwriteq %rax
 0xf3 0x48 0x0f 0xae 0xe0
 
+# CHECK: wbinvd
+0x0f 0x09
+
 # CHECK: wbnoinvd
 0xf3 0x0f 0x09