xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86InstrSystem.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric//===-- X86InstrSystem.td - System Instructions ------------*- tablegen -*-===//
2*0b57cec5SDimitry Andric//
3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric//
7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric//
9*0b57cec5SDimitry Andric// This file describes the X86 instructions that are generally used in
10*0b57cec5SDimitry Andric// privileged modes.  These are not typically used by the compiler, but are
11*0b57cec5SDimitry Andric// supported for the assembler and disassembler.
12*0b57cec5SDimitry Andric//
13*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
14*0b57cec5SDimitry Andric
15*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
16*0b57cec5SDimitry Andriclet Defs = [RAX, RDX] in
17*0b57cec5SDimitry Andricdef RDTSC : I<0x31, RawFrm, (outs), (ins), "rdtsc", []>, TB;
18*0b57cec5SDimitry Andric
19*0b57cec5SDimitry Andriclet Defs = [RAX, RCX, RDX] in
20*0b57cec5SDimitry Andricdef RDTSCP : I<0x01, MRM_F9, (outs), (ins), "rdtscp", []>, TB;
21*0b57cec5SDimitry Andric
22*0b57cec5SDimitry Andric// CPU flow control instructions
23*0b57cec5SDimitry Andric
24*0b57cec5SDimitry Andriclet mayLoad = 1, mayStore = 0, hasSideEffects = 1, isTrap = 1 in {
25*0b57cec5SDimitry Andric  def TRAP    : I<0x0B, RawFrm, (outs), (ins), "ud2", [(trap)]>, TB;
26*0b57cec5SDimitry Andric  def UD2B    : I<0xB9, RawFrm, (outs), (ins), "ud2b", []>, TB;
27*0b57cec5SDimitry Andric}
28*0b57cec5SDimitry Andric
29*0b57cec5SDimitry Andricdef HLT : I<0xF4, RawFrm, (outs), (ins), "hlt", []>;
30*0b57cec5SDimitry Andricdef RSM : I<0xAA, RawFrm, (outs), (ins), "rsm", []>, TB;
31*0b57cec5SDimitry Andric
32*0b57cec5SDimitry Andric// Interrupt and SysCall Instructions.
33*0b57cec5SDimitry Andriclet Uses = [EFLAGS] in
34*0b57cec5SDimitry Andric  def INTO : I<0xce, RawFrm, (outs), (ins), "into", []>, Requires<[Not64BitMode]>;
35*0b57cec5SDimitry Andric
36*0b57cec5SDimitry Andricdef INT3 : I<0xcc, RawFrm, (outs), (ins), "int3", [(int_x86_int (i8 3))]>;
37*0b57cec5SDimitry Andric} // SchedRW
38*0b57cec5SDimitry Andric
39*0b57cec5SDimitry Andric// The long form of "int $3" turns into int3 as a size optimization.
40*0b57cec5SDimitry Andric// FIXME: This doesn't work because InstAlias can't match immediate constants.
41*0b57cec5SDimitry Andric//def : InstAlias<"int\t$3", (INT3)>;
42*0b57cec5SDimitry Andric
43*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
44*0b57cec5SDimitry Andric
45*0b57cec5SDimitry Andricdef INT : Ii8<0xcd, RawFrm, (outs), (ins u8imm:$trap), "int\t$trap",
46*0b57cec5SDimitry Andric              [(int_x86_int imm:$trap)]>;
47*0b57cec5SDimitry Andric
48*0b57cec5SDimitry Andric
49*0b57cec5SDimitry Andricdef SYSCALL  : I<0x05, RawFrm, (outs), (ins), "syscall", []>, TB;
50*0b57cec5SDimitry Andricdef SYSRET   : I<0x07, RawFrm, (outs), (ins), "sysret{l}", []>, TB;
51*0b57cec5SDimitry Andricdef SYSRET64 :RI<0x07, RawFrm, (outs), (ins), "sysretq", []>, TB,
52*0b57cec5SDimitry Andric               Requires<[In64BitMode]>;
53*0b57cec5SDimitry Andric
54*0b57cec5SDimitry Andricdef SYSENTER : I<0x34, RawFrm, (outs), (ins), "sysenter", []>, TB;
55*0b57cec5SDimitry Andric
56*0b57cec5SDimitry Andricdef SYSEXIT   : I<0x35, RawFrm, (outs), (ins), "sysexit{l}", []>, TB;
57*0b57cec5SDimitry Andricdef SYSEXIT64 :RI<0x35, RawFrm, (outs), (ins), "sysexitq", []>, TB,
58*0b57cec5SDimitry Andric                  Requires<[In64BitMode]>;
59*0b57cec5SDimitry Andric} // SchedRW
60*0b57cec5SDimitry Andric
61*0b57cec5SDimitry Andricdef : Pat<(debugtrap),
62*0b57cec5SDimitry Andric          (INT3)>, Requires<[NotPS4]>;
63*0b57cec5SDimitry Andricdef : Pat<(debugtrap),
64*0b57cec5SDimitry Andric          (INT (i8 0x41))>, Requires<[IsPS4]>;
65*0b57cec5SDimitry Andric
66*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
67*0b57cec5SDimitry Andric//  Input/Output Instructions.
68*0b57cec5SDimitry Andric//
69*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
70*0b57cec5SDimitry Andriclet Defs = [AL], Uses = [DX] in
71*0b57cec5SDimitry Andricdef IN8rr  : I<0xEC, RawFrm, (outs), (ins), "in{b}\t{%dx, %al|al, dx}", []>;
72*0b57cec5SDimitry Andriclet Defs = [AX], Uses = [DX] in
73*0b57cec5SDimitry Andricdef IN16rr : I<0xED, RawFrm, (outs), (ins), "in{w}\t{%dx, %ax|ax, dx}", []>,
74*0b57cec5SDimitry Andric               OpSize16;
75*0b57cec5SDimitry Andriclet Defs = [EAX], Uses = [DX] in
76*0b57cec5SDimitry Andricdef IN32rr : I<0xED, RawFrm, (outs), (ins), "in{l}\t{%dx, %eax|eax, dx}", []>,
77*0b57cec5SDimitry Andric               OpSize32;
78*0b57cec5SDimitry Andric
79*0b57cec5SDimitry Andriclet Defs = [AL] in
80*0b57cec5SDimitry Andricdef IN8ri  : Ii8<0xE4, RawFrm, (outs), (ins u8imm:$port),
81*0b57cec5SDimitry Andric                 "in{b}\t{$port, %al|al, $port}", []>;
82*0b57cec5SDimitry Andriclet Defs = [AX] in
83*0b57cec5SDimitry Andricdef IN16ri : Ii8<0xE5, RawFrm, (outs), (ins u8imm:$port),
84*0b57cec5SDimitry Andric                 "in{w}\t{$port, %ax|ax, $port}", []>, OpSize16;
85*0b57cec5SDimitry Andriclet Defs = [EAX] in
86*0b57cec5SDimitry Andricdef IN32ri : Ii8<0xE5, RawFrm, (outs), (ins u8imm:$port),
87*0b57cec5SDimitry Andric                 "in{l}\t{$port, %eax|eax, $port}", []>, OpSize32;
88*0b57cec5SDimitry Andric
89*0b57cec5SDimitry Andriclet Uses = [DX, AL] in
90*0b57cec5SDimitry Andricdef OUT8rr  : I<0xEE, RawFrm, (outs), (ins), "out{b}\t{%al, %dx|dx, al}", []>;
91*0b57cec5SDimitry Andriclet Uses = [DX, AX] in
92*0b57cec5SDimitry Andricdef OUT16rr : I<0xEF, RawFrm, (outs), (ins), "out{w}\t{%ax, %dx|dx, ax}", []>,
93*0b57cec5SDimitry Andric                OpSize16;
94*0b57cec5SDimitry Andriclet Uses = [DX, EAX] in
95*0b57cec5SDimitry Andricdef OUT32rr : I<0xEF, RawFrm, (outs), (ins), "out{l}\t{%eax, %dx|dx, eax}", []>,
96*0b57cec5SDimitry Andric                OpSize32;
97*0b57cec5SDimitry Andric
98*0b57cec5SDimitry Andriclet Uses = [AL] in
99*0b57cec5SDimitry Andricdef OUT8ir  : Ii8<0xE6, RawFrm, (outs), (ins u8imm:$port),
100*0b57cec5SDimitry Andric                   "out{b}\t{%al, $port|$port, al}", []>;
101*0b57cec5SDimitry Andriclet Uses = [AX] in
102*0b57cec5SDimitry Andricdef OUT16ir : Ii8<0xE7, RawFrm, (outs), (ins u8imm:$port),
103*0b57cec5SDimitry Andric                   "out{w}\t{%ax, $port|$port, ax}", []>, OpSize16;
104*0b57cec5SDimitry Andriclet Uses = [EAX] in
105*0b57cec5SDimitry Andricdef OUT32ir : Ii8<0xE7, RawFrm, (outs), (ins u8imm:$port),
106*0b57cec5SDimitry Andric                  "out{l}\t{%eax, $port|$port, eax}", []>, OpSize32;
107*0b57cec5SDimitry Andric
108*0b57cec5SDimitry Andric} // SchedRW
109*0b57cec5SDimitry Andric
110*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
111*0b57cec5SDimitry Andric// Moves to and from debug registers
112*0b57cec5SDimitry Andric
113*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
114*0b57cec5SDimitry Andricdef MOV32rd : I<0x21, MRMDestReg, (outs GR32:$dst), (ins DEBUG_REG:$src),
115*0b57cec5SDimitry Andric                "mov{l}\t{$src, $dst|$dst, $src}", []>, TB,
116*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
117*0b57cec5SDimitry Andricdef MOV64rd : I<0x21, MRMDestReg, (outs GR64:$dst), (ins DEBUG_REG:$src),
118*0b57cec5SDimitry Andric                "mov{q}\t{$src, $dst|$dst, $src}", []>, TB,
119*0b57cec5SDimitry Andric                Requires<[In64BitMode]>;
120*0b57cec5SDimitry Andric
121*0b57cec5SDimitry Andricdef MOV32dr : I<0x23, MRMSrcReg, (outs DEBUG_REG:$dst), (ins GR32:$src),
122*0b57cec5SDimitry Andric                "mov{l}\t{$src, $dst|$dst, $src}", []>, TB,
123*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
124*0b57cec5SDimitry Andricdef MOV64dr : I<0x23, MRMSrcReg, (outs DEBUG_REG:$dst), (ins GR64:$src),
125*0b57cec5SDimitry Andric                "mov{q}\t{$src, $dst|$dst, $src}", []>, TB,
126*0b57cec5SDimitry Andric                Requires<[In64BitMode]>;
127*0b57cec5SDimitry Andric} // SchedRW
128*0b57cec5SDimitry Andric
129*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
130*0b57cec5SDimitry Andric// Moves to and from control registers
131*0b57cec5SDimitry Andric
132*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
133*0b57cec5SDimitry Andricdef MOV32rc : I<0x20, MRMDestReg, (outs GR32:$dst), (ins CONTROL_REG:$src),
134*0b57cec5SDimitry Andric                "mov{l}\t{$src, $dst|$dst, $src}", []>, TB,
135*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
136*0b57cec5SDimitry Andricdef MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG:$src),
137*0b57cec5SDimitry Andric                "mov{q}\t{$src, $dst|$dst, $src}", []>, TB,
138*0b57cec5SDimitry Andric                Requires<[In64BitMode]>;
139*0b57cec5SDimitry Andric
140*0b57cec5SDimitry Andricdef MOV32cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR32:$src),
141*0b57cec5SDimitry Andric                "mov{l}\t{$src, $dst|$dst, $src}", []>, TB,
142*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
143*0b57cec5SDimitry Andricdef MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR64:$src),
144*0b57cec5SDimitry Andric                "mov{q}\t{$src, $dst|$dst, $src}", []>, TB,
145*0b57cec5SDimitry Andric                Requires<[In64BitMode]>;
146*0b57cec5SDimitry Andric} // SchedRW
147*0b57cec5SDimitry Andric
148*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
149*0b57cec5SDimitry Andric// Segment override instruction prefixes
150*0b57cec5SDimitry Andric
151*0b57cec5SDimitry Andriclet SchedRW = [WriteNop] in {
152*0b57cec5SDimitry Andricdef CS_PREFIX : I<0x2E, RawFrm, (outs), (ins), "cs", []>;
153*0b57cec5SDimitry Andricdef SS_PREFIX : I<0x36, RawFrm, (outs), (ins), "ss", []>;
154*0b57cec5SDimitry Andricdef DS_PREFIX : I<0x3E, RawFrm, (outs), (ins), "ds", []>;
155*0b57cec5SDimitry Andricdef ES_PREFIX : I<0x26, RawFrm, (outs), (ins), "es", []>;
156*0b57cec5SDimitry Andricdef FS_PREFIX : I<0x64, RawFrm, (outs), (ins), "fs", []>;
157*0b57cec5SDimitry Andricdef GS_PREFIX : I<0x65, RawFrm, (outs), (ins), "gs", []>;
158*0b57cec5SDimitry Andric} // SchedRW
159*0b57cec5SDimitry Andric
160*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
161*0b57cec5SDimitry Andric// Moves to and from segment registers.
162*0b57cec5SDimitry Andric//
163*0b57cec5SDimitry Andric
164*0b57cec5SDimitry Andriclet SchedRW = [WriteMove] in {
165*0b57cec5SDimitry Andricdef MOV16rs : I<0x8C, MRMDestReg, (outs GR16:$dst), (ins SEGMENT_REG:$src),
166*0b57cec5SDimitry Andric                "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize16;
167*0b57cec5SDimitry Andricdef MOV32rs : I<0x8C, MRMDestReg, (outs GR32:$dst), (ins SEGMENT_REG:$src),
168*0b57cec5SDimitry Andric                "mov{l}\t{$src, $dst|$dst, $src}", []>, OpSize32;
169*0b57cec5SDimitry Andricdef MOV64rs : RI<0x8C, MRMDestReg, (outs GR64:$dst), (ins SEGMENT_REG:$src),
170*0b57cec5SDimitry Andric                 "mov{q}\t{$src, $dst|$dst, $src}", []>;
171*0b57cec5SDimitry Andriclet mayStore = 1 in {
172*0b57cec5SDimitry Andricdef MOV16ms : I<0x8C, MRMDestMem, (outs), (ins i16mem:$dst, SEGMENT_REG:$src),
173*0b57cec5SDimitry Andric                "mov{w}\t{$src, $dst|$dst, $src}", []>;
174*0b57cec5SDimitry Andric}
175*0b57cec5SDimitry Andricdef MOV16sr : I<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR16:$src),
176*0b57cec5SDimitry Andric                "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize16;
177*0b57cec5SDimitry Andricdef MOV32sr : I<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR32:$src),
178*0b57cec5SDimitry Andric                "mov{l}\t{$src, $dst|$dst, $src}", []>, OpSize32;
179*0b57cec5SDimitry Andricdef MOV64sr : RI<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR64:$src),
180*0b57cec5SDimitry Andric                 "mov{q}\t{$src, $dst|$dst, $src}", []>;
181*0b57cec5SDimitry Andriclet mayLoad = 1 in {
182*0b57cec5SDimitry Andricdef MOV16sm : I<0x8E, MRMSrcMem, (outs SEGMENT_REG:$dst), (ins i16mem:$src),
183*0b57cec5SDimitry Andric                "mov{w}\t{$src, $dst|$dst, $src}", []>;
184*0b57cec5SDimitry Andric}
185*0b57cec5SDimitry Andric} // SchedRW
186*0b57cec5SDimitry Andric
187*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
188*0b57cec5SDimitry Andric// Segmentation support instructions.
189*0b57cec5SDimitry Andric
190*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
191*0b57cec5SDimitry Andricdef SWAPGS : I<0x01, MRM_F8, (outs), (ins), "swapgs", []>, TB;
192*0b57cec5SDimitry Andric
193*0b57cec5SDimitry Andriclet mayLoad = 1 in
194*0b57cec5SDimitry Andricdef LAR16rm : I<0x02, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
195*0b57cec5SDimitry Andric                "lar{w}\t{$src, $dst|$dst, $src}", []>, TB,
196*0b57cec5SDimitry Andric                OpSize16, NotMemoryFoldable;
197*0b57cec5SDimitry Andricdef LAR16rr : I<0x02, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
198*0b57cec5SDimitry Andric                "lar{w}\t{$src, $dst|$dst, $src}", []>, TB,
199*0b57cec5SDimitry Andric                OpSize16, NotMemoryFoldable;
200*0b57cec5SDimitry Andric
201*0b57cec5SDimitry Andric// i16mem operand in LAR32rm and GR32 operand in LAR32rr is not a typo.
202*0b57cec5SDimitry Andriclet mayLoad = 1 in
203*0b57cec5SDimitry Andricdef LAR32rm : I<0x02, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
204*0b57cec5SDimitry Andric                "lar{l}\t{$src, $dst|$dst, $src}", []>, TB,
205*0b57cec5SDimitry Andric                OpSize32, NotMemoryFoldable;
206*0b57cec5SDimitry Andricdef LAR32rr : I<0x02, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
207*0b57cec5SDimitry Andric                "lar{l}\t{$src, $dst|$dst, $src}", []>, TB,
208*0b57cec5SDimitry Andric                OpSize32, NotMemoryFoldable;
209*0b57cec5SDimitry Andric// i16mem operand in LAR64rm and GR32 operand in LAR64rr is not a typo.
210*0b57cec5SDimitry Andriclet mayLoad = 1 in
211*0b57cec5SDimitry Andricdef LAR64rm : RI<0x02, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
212*0b57cec5SDimitry Andric                 "lar{q}\t{$src, $dst|$dst, $src}", []>, TB, NotMemoryFoldable;
213*0b57cec5SDimitry Andricdef LAR64rr : RI<0x02, MRMSrcReg, (outs GR64:$dst), (ins GR32:$src),
214*0b57cec5SDimitry Andric                 "lar{q}\t{$src, $dst|$dst, $src}", []>, TB, NotMemoryFoldable;
215*0b57cec5SDimitry Andric
216*0b57cec5SDimitry Andric// i16mem operand in LSL32rm and GR32 operand in LSL32rr is not a typo.
217*0b57cec5SDimitry Andriclet mayLoad = 1 in
218*0b57cec5SDimitry Andricdef LSL16rm : I<0x03, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
219*0b57cec5SDimitry Andric                "lsl{w}\t{$src, $dst|$dst, $src}", []>, TB,
220*0b57cec5SDimitry Andric                OpSize16, NotMemoryFoldable;
221*0b57cec5SDimitry Andricdef LSL16rr : I<0x03, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
222*0b57cec5SDimitry Andric                "lsl{w}\t{$src, $dst|$dst, $src}", []>, TB,
223*0b57cec5SDimitry Andric                OpSize16, NotMemoryFoldable;
224*0b57cec5SDimitry Andric// i16mem operand in LSL64rm and GR32 operand in LSL64rr is not a typo.
225*0b57cec5SDimitry Andriclet mayLoad = 1 in
226*0b57cec5SDimitry Andricdef LSL32rm : I<0x03, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
227*0b57cec5SDimitry Andric                "lsl{l}\t{$src, $dst|$dst, $src}", []>, TB,
228*0b57cec5SDimitry Andric                OpSize32, NotMemoryFoldable;
229*0b57cec5SDimitry Andricdef LSL32rr : I<0x03, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
230*0b57cec5SDimitry Andric                "lsl{l}\t{$src, $dst|$dst, $src}", []>, TB,
231*0b57cec5SDimitry Andric                OpSize32, NotMemoryFoldable;
232*0b57cec5SDimitry Andriclet mayLoad = 1 in
233*0b57cec5SDimitry Andricdef LSL64rm : RI<0x03, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
234*0b57cec5SDimitry Andric                 "lsl{q}\t{$src, $dst|$dst, $src}", []>, TB, NotMemoryFoldable;
235*0b57cec5SDimitry Andricdef LSL64rr : RI<0x03, MRMSrcReg, (outs GR64:$dst), (ins GR32:$src),
236*0b57cec5SDimitry Andric                 "lsl{q}\t{$src, $dst|$dst, $src}", []>, TB, NotMemoryFoldable;
237*0b57cec5SDimitry Andric
238*0b57cec5SDimitry Andricdef INVLPG : I<0x01, MRM7m, (outs), (ins i8mem:$addr), "invlpg\t$addr", []>, TB;
239*0b57cec5SDimitry Andric
240*0b57cec5SDimitry Andricdef STR16r : I<0x00, MRM1r, (outs GR16:$dst), (ins),
241*0b57cec5SDimitry Andric               "str{w}\t$dst", []>, TB, OpSize16;
242*0b57cec5SDimitry Andricdef STR32r : I<0x00, MRM1r, (outs GR32:$dst), (ins),
243*0b57cec5SDimitry Andric               "str{l}\t$dst", []>, TB, OpSize32;
244*0b57cec5SDimitry Andricdef STR64r : RI<0x00, MRM1r, (outs GR64:$dst), (ins),
245*0b57cec5SDimitry Andric                "str{q}\t$dst", []>, TB;
246*0b57cec5SDimitry Andriclet mayStore = 1 in
247*0b57cec5SDimitry Andricdef STRm   : I<0x00, MRM1m, (outs), (ins i16mem:$dst), "str{w}\t$dst", []>, TB;
248*0b57cec5SDimitry Andric
249*0b57cec5SDimitry Andricdef LTRr : I<0x00, MRM3r, (outs), (ins GR16:$src), "ltr{w}\t$src", []>, TB, NotMemoryFoldable;
250*0b57cec5SDimitry Andriclet mayLoad = 1 in
251*0b57cec5SDimitry Andricdef LTRm : I<0x00, MRM3m, (outs), (ins i16mem:$src), "ltr{w}\t$src", []>, TB, NotMemoryFoldable;
252*0b57cec5SDimitry Andric
253*0b57cec5SDimitry Andricdef PUSHCS16 : I<0x0E, RawFrm, (outs), (ins), "push{w}\t{%cs|cs}", []>,
254*0b57cec5SDimitry Andric                 OpSize16, Requires<[Not64BitMode]>;
255*0b57cec5SDimitry Andricdef PUSHCS32 : I<0x0E, RawFrm, (outs), (ins), "push{l}\t{%cs|cs}", []>,
256*0b57cec5SDimitry Andric                 OpSize32, Requires<[Not64BitMode]>;
257*0b57cec5SDimitry Andricdef PUSHSS16 : I<0x16, RawFrm, (outs), (ins), "push{w}\t{%ss|ss}", []>,
258*0b57cec5SDimitry Andric                 OpSize16, Requires<[Not64BitMode]>;
259*0b57cec5SDimitry Andricdef PUSHSS32 : I<0x16, RawFrm, (outs), (ins), "push{l}\t{%ss|ss}", []>,
260*0b57cec5SDimitry Andric                 OpSize32, Requires<[Not64BitMode]>;
261*0b57cec5SDimitry Andricdef PUSHDS16 : I<0x1E, RawFrm, (outs), (ins), "push{w}\t{%ds|ds}", []>,
262*0b57cec5SDimitry Andric                 OpSize16, Requires<[Not64BitMode]>;
263*0b57cec5SDimitry Andricdef PUSHDS32 : I<0x1E, RawFrm, (outs), (ins), "push{l}\t{%ds|ds}", []>,
264*0b57cec5SDimitry Andric                 OpSize32, Requires<[Not64BitMode]>;
265*0b57cec5SDimitry Andricdef PUSHES16 : I<0x06, RawFrm, (outs), (ins), "push{w}\t{%es|es}", []>,
266*0b57cec5SDimitry Andric                 OpSize16, Requires<[Not64BitMode]>;
267*0b57cec5SDimitry Andricdef PUSHES32 : I<0x06, RawFrm, (outs), (ins), "push{l}\t{%es|es}", []>,
268*0b57cec5SDimitry Andric                 OpSize32, Requires<[Not64BitMode]>;
269*0b57cec5SDimitry Andricdef PUSHFS16 : I<0xa0, RawFrm, (outs), (ins), "push{w}\t{%fs|fs}", []>,
270*0b57cec5SDimitry Andric                 OpSize16, TB;
271*0b57cec5SDimitry Andricdef PUSHFS32 : I<0xa0, RawFrm, (outs), (ins), "push{l}\t{%fs|fs}", []>, TB,
272*0b57cec5SDimitry Andric                 OpSize32, Requires<[Not64BitMode]>;
273*0b57cec5SDimitry Andricdef PUSHGS16 : I<0xa8, RawFrm, (outs), (ins), "push{w}\t{%gs|gs}", []>,
274*0b57cec5SDimitry Andric                 OpSize16, TB;
275*0b57cec5SDimitry Andricdef PUSHGS32 : I<0xa8, RawFrm, (outs), (ins), "push{l}\t{%gs|gs}", []>, TB,
276*0b57cec5SDimitry Andric                 OpSize32, Requires<[Not64BitMode]>;
277*0b57cec5SDimitry Andricdef PUSHFS64 : I<0xa0, RawFrm, (outs), (ins), "push{q}\t{%fs|fs}", []>, TB,
278*0b57cec5SDimitry Andric                 OpSize32, Requires<[In64BitMode]>;
279*0b57cec5SDimitry Andricdef PUSHGS64 : I<0xa8, RawFrm, (outs), (ins), "push{q}\t{%gs|gs}", []>, TB,
280*0b57cec5SDimitry Andric                 OpSize32, Requires<[In64BitMode]>;
281*0b57cec5SDimitry Andric
282*0b57cec5SDimitry Andric// No "pop cs" instruction.
283*0b57cec5SDimitry Andricdef POPSS16 : I<0x17, RawFrm, (outs), (ins), "pop{w}\t{%ss|ss}", []>,
284*0b57cec5SDimitry Andric              OpSize16, Requires<[Not64BitMode]>;
285*0b57cec5SDimitry Andricdef POPSS32 : I<0x17, RawFrm, (outs), (ins), "pop{l}\t{%ss|ss}", []>,
286*0b57cec5SDimitry Andric              OpSize32, Requires<[Not64BitMode]>;
287*0b57cec5SDimitry Andric
288*0b57cec5SDimitry Andricdef POPDS16 : I<0x1F, RawFrm, (outs), (ins), "pop{w}\t{%ds|ds}", []>,
289*0b57cec5SDimitry Andric              OpSize16, Requires<[Not64BitMode]>;
290*0b57cec5SDimitry Andricdef POPDS32 : I<0x1F, RawFrm, (outs), (ins), "pop{l}\t{%ds|ds}", []>,
291*0b57cec5SDimitry Andric              OpSize32, Requires<[Not64BitMode]>;
292*0b57cec5SDimitry Andric
293*0b57cec5SDimitry Andricdef POPES16 : I<0x07, RawFrm, (outs), (ins), "pop{w}\t{%es|es}", []>,
294*0b57cec5SDimitry Andric              OpSize16, Requires<[Not64BitMode]>;
295*0b57cec5SDimitry Andricdef POPES32 : I<0x07, RawFrm, (outs), (ins), "pop{l}\t{%es|es}", []>,
296*0b57cec5SDimitry Andric              OpSize32, Requires<[Not64BitMode]>;
297*0b57cec5SDimitry Andric
298*0b57cec5SDimitry Andricdef POPFS16 : I<0xa1, RawFrm, (outs), (ins), "pop{w}\t{%fs|fs}", []>,
299*0b57cec5SDimitry Andric                OpSize16, TB;
300*0b57cec5SDimitry Andricdef POPFS32 : I<0xa1, RawFrm, (outs), (ins), "pop{l}\t{%fs|fs}", []>, TB,
301*0b57cec5SDimitry Andric                OpSize32, Requires<[Not64BitMode]>;
302*0b57cec5SDimitry Andricdef POPFS64 : I<0xa1, RawFrm, (outs), (ins), "pop{q}\t{%fs|fs}", []>, TB,
303*0b57cec5SDimitry Andric                OpSize32, Requires<[In64BitMode]>;
304*0b57cec5SDimitry Andric
305*0b57cec5SDimitry Andricdef POPGS16 : I<0xa9, RawFrm, (outs), (ins), "pop{w}\t{%gs|gs}", []>,
306*0b57cec5SDimitry Andric                OpSize16, TB;
307*0b57cec5SDimitry Andricdef POPGS32 : I<0xa9, RawFrm, (outs), (ins), "pop{l}\t{%gs|gs}", []>, TB,
308*0b57cec5SDimitry Andric                OpSize32, Requires<[Not64BitMode]>;
309*0b57cec5SDimitry Andricdef POPGS64 : I<0xa9, RawFrm, (outs), (ins), "pop{q}\t{%gs|gs}", []>, TB,
310*0b57cec5SDimitry Andric                OpSize32, Requires<[In64BitMode]>;
311*0b57cec5SDimitry Andric
312*0b57cec5SDimitry Andricdef LDS16rm : I<0xc5, MRMSrcMem, (outs GR16:$dst), (ins opaquemem:$src),
313*0b57cec5SDimitry Andric                "lds{w}\t{$src, $dst|$dst, $src}", []>, OpSize16,
314*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
315*0b57cec5SDimitry Andricdef LDS32rm : I<0xc5, MRMSrcMem, (outs GR32:$dst), (ins opaquemem:$src),
316*0b57cec5SDimitry Andric                "lds{l}\t{$src, $dst|$dst, $src}", []>, OpSize32,
317*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
318*0b57cec5SDimitry Andric
319*0b57cec5SDimitry Andricdef LSS16rm : I<0xb2, MRMSrcMem, (outs GR16:$dst), (ins opaquemem:$src),
320*0b57cec5SDimitry Andric                "lss{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16;
321*0b57cec5SDimitry Andricdef LSS32rm : I<0xb2, MRMSrcMem, (outs GR32:$dst), (ins opaquemem:$src),
322*0b57cec5SDimitry Andric                "lss{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32;
323*0b57cec5SDimitry Andricdef LSS64rm : RI<0xb2, MRMSrcMem, (outs GR64:$dst), (ins opaquemem:$src),
324*0b57cec5SDimitry Andric                 "lss{q}\t{$src, $dst|$dst, $src}", []>, TB;
325*0b57cec5SDimitry Andric
326*0b57cec5SDimitry Andricdef LES16rm : I<0xc4, MRMSrcMem, (outs GR16:$dst), (ins opaquemem:$src),
327*0b57cec5SDimitry Andric                "les{w}\t{$src, $dst|$dst, $src}", []>, OpSize16,
328*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
329*0b57cec5SDimitry Andricdef LES32rm : I<0xc4, MRMSrcMem, (outs GR32:$dst), (ins opaquemem:$src),
330*0b57cec5SDimitry Andric                "les{l}\t{$src, $dst|$dst, $src}", []>, OpSize32,
331*0b57cec5SDimitry Andric                Requires<[Not64BitMode]>;
332*0b57cec5SDimitry Andric
333*0b57cec5SDimitry Andricdef LFS16rm : I<0xb4, MRMSrcMem, (outs GR16:$dst), (ins opaquemem:$src),
334*0b57cec5SDimitry Andric                "lfs{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16;
335*0b57cec5SDimitry Andricdef LFS32rm : I<0xb4, MRMSrcMem, (outs GR32:$dst), (ins opaquemem:$src),
336*0b57cec5SDimitry Andric                "lfs{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32;
337*0b57cec5SDimitry Andricdef LFS64rm : RI<0xb4, MRMSrcMem, (outs GR64:$dst), (ins opaquemem:$src),
338*0b57cec5SDimitry Andric                 "lfs{q}\t{$src, $dst|$dst, $src}", []>, TB;
339*0b57cec5SDimitry Andric
340*0b57cec5SDimitry Andricdef LGS16rm : I<0xb5, MRMSrcMem, (outs GR16:$dst), (ins opaquemem:$src),
341*0b57cec5SDimitry Andric                "lgs{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16;
342*0b57cec5SDimitry Andricdef LGS32rm : I<0xb5, MRMSrcMem, (outs GR32:$dst), (ins opaquemem:$src),
343*0b57cec5SDimitry Andric                "lgs{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32;
344*0b57cec5SDimitry Andric
345*0b57cec5SDimitry Andricdef LGS64rm : RI<0xb5, MRMSrcMem, (outs GR64:$dst), (ins opaquemem:$src),
346*0b57cec5SDimitry Andric                 "lgs{q}\t{$src, $dst|$dst, $src}", []>, TB;
347*0b57cec5SDimitry Andric
348*0b57cec5SDimitry Andricdef VERRr : I<0x00, MRM4r, (outs), (ins GR16:$seg), "verr\t$seg", []>, TB, NotMemoryFoldable;
349*0b57cec5SDimitry Andricdef VERWr : I<0x00, MRM5r, (outs), (ins GR16:$seg), "verw\t$seg", []>, TB, NotMemoryFoldable;
350*0b57cec5SDimitry Andriclet mayLoad = 1 in {
351*0b57cec5SDimitry Andricdef VERRm : I<0x00, MRM4m, (outs), (ins i16mem:$seg), "verr\t$seg", []>, TB, NotMemoryFoldable;
352*0b57cec5SDimitry Andricdef VERWm : I<0x00, MRM5m, (outs), (ins i16mem:$seg), "verw\t$seg", []>, TB, NotMemoryFoldable;
353*0b57cec5SDimitry Andric}
354*0b57cec5SDimitry Andric} // SchedRW
355*0b57cec5SDimitry Andric
356*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
357*0b57cec5SDimitry Andric// Descriptor-table support instructions
358*0b57cec5SDimitry Andric
359*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
360*0b57cec5SDimitry Andricdef SGDT16m : I<0x01, MRM0m, (outs), (ins opaquemem:$dst),
361*0b57cec5SDimitry Andric                "sgdtw\t$dst", []>, TB, OpSize16, Requires<[Not64BitMode]>;
362*0b57cec5SDimitry Andricdef SGDT32m : I<0x01, MRM0m, (outs), (ins opaquemem:$dst),
363*0b57cec5SDimitry Andric                "sgdt{l|d}\t$dst", []>, OpSize32, TB, Requires <[Not64BitMode]>;
364*0b57cec5SDimitry Andricdef SGDT64m : I<0x01, MRM0m, (outs), (ins opaquemem:$dst),
365*0b57cec5SDimitry Andric                "sgdt{q}\t$dst", []>, TB, Requires <[In64BitMode]>;
366*0b57cec5SDimitry Andricdef SIDT16m : I<0x01, MRM1m, (outs), (ins opaquemem:$dst),
367*0b57cec5SDimitry Andric                "sidtw\t$dst", []>, TB, OpSize16, Requires<[Not64BitMode]>;
368*0b57cec5SDimitry Andricdef SIDT32m : I<0x01, MRM1m, (outs), (ins opaquemem:$dst),
369*0b57cec5SDimitry Andric                "sidt{l|d}\t$dst", []>, OpSize32, TB, Requires <[Not64BitMode]>;
370*0b57cec5SDimitry Andricdef SIDT64m : I<0x01, MRM1m, (outs), (ins opaquemem:$dst),
371*0b57cec5SDimitry Andric                "sidt{q}\t$dst", []>, TB, Requires <[In64BitMode]>;
372*0b57cec5SDimitry Andricdef SLDT16r : I<0x00, MRM0r, (outs GR16:$dst), (ins),
373*0b57cec5SDimitry Andric                "sldt{w}\t$dst", []>, TB, OpSize16;
374*0b57cec5SDimitry Andriclet mayStore = 1 in
375*0b57cec5SDimitry Andricdef SLDT16m : I<0x00, MRM0m, (outs), (ins i16mem:$dst),
376*0b57cec5SDimitry Andric                "sldt{w}\t$dst", []>, TB;
377*0b57cec5SDimitry Andricdef SLDT32r : I<0x00, MRM0r, (outs GR32:$dst), (ins),
378*0b57cec5SDimitry Andric                "sldt{l}\t$dst", []>, OpSize32, TB;
379*0b57cec5SDimitry Andric
380*0b57cec5SDimitry Andric// LLDT is not interpreted specially in 64-bit mode because there is no sign
381*0b57cec5SDimitry Andric//   extension.
382*0b57cec5SDimitry Andricdef SLDT64r : RI<0x00, MRM0r, (outs GR64:$dst), (ins),
383*0b57cec5SDimitry Andric                 "sldt{q}\t$dst", []>, TB, Requires<[In64BitMode]>;
384*0b57cec5SDimitry Andric
385*0b57cec5SDimitry Andricdef LGDT16m : I<0x01, MRM2m, (outs), (ins opaquemem:$src),
386*0b57cec5SDimitry Andric                "lgdtw\t$src", []>, TB, OpSize16, Requires<[Not64BitMode]>;
387*0b57cec5SDimitry Andricdef LGDT32m : I<0x01, MRM2m, (outs), (ins opaquemem:$src),
388*0b57cec5SDimitry Andric                "lgdt{l|d}\t$src", []>, OpSize32, TB, Requires<[Not64BitMode]>;
389*0b57cec5SDimitry Andricdef LGDT64m : I<0x01, MRM2m, (outs), (ins opaquemem:$src),
390*0b57cec5SDimitry Andric                "lgdt{q}\t$src", []>, TB, Requires<[In64BitMode]>;
391*0b57cec5SDimitry Andricdef LIDT16m : I<0x01, MRM3m, (outs), (ins opaquemem:$src),
392*0b57cec5SDimitry Andric                "lidtw\t$src", []>, TB, OpSize16, Requires<[Not64BitMode]>;
393*0b57cec5SDimitry Andricdef LIDT32m : I<0x01, MRM3m, (outs), (ins opaquemem:$src),
394*0b57cec5SDimitry Andric                "lidt{l|d}\t$src", []>, OpSize32, TB, Requires<[Not64BitMode]>;
395*0b57cec5SDimitry Andricdef LIDT64m : I<0x01, MRM3m, (outs), (ins opaquemem:$src),
396*0b57cec5SDimitry Andric                "lidt{q}\t$src", []>, TB, Requires<[In64BitMode]>;
397*0b57cec5SDimitry Andricdef LLDT16r : I<0x00, MRM2r, (outs), (ins GR16:$src),
398*0b57cec5SDimitry Andric                "lldt{w}\t$src", []>, TB, NotMemoryFoldable;
399*0b57cec5SDimitry Andriclet mayLoad = 1 in
400*0b57cec5SDimitry Andricdef LLDT16m : I<0x00, MRM2m, (outs), (ins i16mem:$src),
401*0b57cec5SDimitry Andric                "lldt{w}\t$src", []>, TB, NotMemoryFoldable;
402*0b57cec5SDimitry Andric} // SchedRW
403*0b57cec5SDimitry Andric
404*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
405*0b57cec5SDimitry Andric// Specialized register support
406*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
407*0b57cec5SDimitry Andriclet Uses = [EAX, ECX, EDX] in
408*0b57cec5SDimitry Andricdef WRMSR : I<0x30, RawFrm, (outs), (ins), "wrmsr", []>, TB;
409*0b57cec5SDimitry Andriclet Defs = [EAX, EDX], Uses = [ECX] in
410*0b57cec5SDimitry Andricdef RDMSR : I<0x32, RawFrm, (outs), (ins), "rdmsr", []>, TB;
411*0b57cec5SDimitry Andric
412*0b57cec5SDimitry Andriclet Defs = [RAX, RDX], Uses = [ECX] in
413*0b57cec5SDimitry Andricdef RDPMC : I<0x33, RawFrm, (outs), (ins), "rdpmc", []>, TB;
414*0b57cec5SDimitry Andric
415*0b57cec5SDimitry Andricdef SMSW16r : I<0x01, MRM4r, (outs GR16:$dst), (ins),
416*0b57cec5SDimitry Andric                "smsw{w}\t$dst", []>, OpSize16, TB;
417*0b57cec5SDimitry Andricdef SMSW32r : I<0x01, MRM4r, (outs GR32:$dst), (ins),
418*0b57cec5SDimitry Andric                "smsw{l}\t$dst", []>, OpSize32, TB;
419*0b57cec5SDimitry Andric// no m form encodable; use SMSW16m
420*0b57cec5SDimitry Andricdef SMSW64r : RI<0x01, MRM4r, (outs GR64:$dst), (ins),
421*0b57cec5SDimitry Andric                 "smsw{q}\t$dst", []>, TB;
422*0b57cec5SDimitry Andric
423*0b57cec5SDimitry Andric// For memory operands, there is only a 16-bit form
424*0b57cec5SDimitry Andricdef SMSW16m : I<0x01, MRM4m, (outs), (ins i16mem:$dst),
425*0b57cec5SDimitry Andric                "smsw{w}\t$dst", []>, TB;
426*0b57cec5SDimitry Andric
427*0b57cec5SDimitry Andricdef LMSW16r : I<0x01, MRM6r, (outs), (ins GR16:$src),
428*0b57cec5SDimitry Andric                "lmsw{w}\t$src", []>, TB, NotMemoryFoldable;
429*0b57cec5SDimitry Andriclet mayLoad = 1 in
430*0b57cec5SDimitry Andricdef LMSW16m : I<0x01, MRM6m, (outs), (ins i16mem:$src),
431*0b57cec5SDimitry Andric                "lmsw{w}\t$src", []>, TB, NotMemoryFoldable;
432*0b57cec5SDimitry Andric
433*0b57cec5SDimitry Andriclet Defs = [EAX, EBX, ECX, EDX], Uses = [EAX, ECX] in
434*0b57cec5SDimitry Andric  def CPUID : I<0xA2, RawFrm, (outs), (ins), "cpuid", []>, TB;
435*0b57cec5SDimitry Andric} // SchedRW
436*0b57cec5SDimitry Andric
437*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
438*0b57cec5SDimitry Andric// Cache instructions
439*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
440*0b57cec5SDimitry Andricdef INVD : I<0x08, RawFrm, (outs), (ins), "invd", []>, TB;
441*0b57cec5SDimitry Andricdef WBINVD : I<0x09, RawFrm, (outs), (ins), "wbinvd", [(int_x86_wbinvd)]>, TB;
442*0b57cec5SDimitry Andric
443*0b57cec5SDimitry Andric// wbnoinvd is like wbinvd, except without invalidation
444*0b57cec5SDimitry Andric// encoding: like wbinvd + an 0xF3 prefix
445*0b57cec5SDimitry Andricdef WBNOINVD : I<0x09, RawFrm, (outs), (ins), "wbnoinvd",
446*0b57cec5SDimitry Andric                 [(int_x86_wbnoinvd)]>, XS,
447*0b57cec5SDimitry Andric                 Requires<[HasWBNOINVD]>;
448*0b57cec5SDimitry Andric} // SchedRW
449*0b57cec5SDimitry Andric
450*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
451*0b57cec5SDimitry Andric// CET instructions
452*0b57cec5SDimitry Andric// Use with caution, availability is not predicated on features.
453*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
454*0b57cec5SDimitry Andric  let Uses = [SSP] in {
455*0b57cec5SDimitry Andric    let Defs = [SSP] in {
456*0b57cec5SDimitry Andric      def INCSSPD : I<0xAE, MRM5r, (outs), (ins GR32:$src), "incsspd\t$src",
457*0b57cec5SDimitry Andric                       [(int_x86_incsspd GR32:$src)]>, XS;
458*0b57cec5SDimitry Andric      def INCSSPQ : RI<0xAE, MRM5r, (outs), (ins GR64:$src), "incsspq\t$src",
459*0b57cec5SDimitry Andric                       [(int_x86_incsspq GR64:$src)]>, XS;
460*0b57cec5SDimitry Andric    } // Defs SSP
461*0b57cec5SDimitry Andric
462*0b57cec5SDimitry Andric    let Constraints = "$src = $dst" in {
463*0b57cec5SDimitry Andric      def RDSSPD : I<0x1E, MRM1r, (outs GR32:$dst), (ins GR32:$src),
464*0b57cec5SDimitry Andric                     "rdsspd\t$dst",
465*0b57cec5SDimitry Andric                     [(set GR32:$dst, (int_x86_rdsspd GR32:$src))]>, XS;
466*0b57cec5SDimitry Andric      def RDSSPQ : RI<0x1E, MRM1r, (outs GR64:$dst), (ins GR64:$src),
467*0b57cec5SDimitry Andric                     "rdsspq\t$dst",
468*0b57cec5SDimitry Andric                     [(set GR64:$dst, (int_x86_rdsspq GR64:$src))]>, XS;
469*0b57cec5SDimitry Andric    }
470*0b57cec5SDimitry Andric
471*0b57cec5SDimitry Andric    let Defs = [SSP] in {
472*0b57cec5SDimitry Andric      def SAVEPREVSSP : I<0x01, MRM_EA, (outs), (ins), "saveprevssp",
473*0b57cec5SDimitry Andric                       [(int_x86_saveprevssp)]>, XS;
474*0b57cec5SDimitry Andric      def RSTORSSP : I<0x01, MRM5m, (outs), (ins i32mem:$src),
475*0b57cec5SDimitry Andric                       "rstorssp\t$src",
476*0b57cec5SDimitry Andric                       [(int_x86_rstorssp addr:$src)]>, XS;
477*0b57cec5SDimitry Andric    } // Defs SSP
478*0b57cec5SDimitry Andric  } // Uses SSP
479*0b57cec5SDimitry Andric
480*0b57cec5SDimitry Andric  def WRSSD : I<0xF6, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
481*0b57cec5SDimitry Andric                "wrssd\t{$src, $dst|$dst, $src}",
482*0b57cec5SDimitry Andric                [(int_x86_wrssd GR32:$src, addr:$dst)]>, T8PS;
483*0b57cec5SDimitry Andric  def WRSSQ : RI<0xF6, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
484*0b57cec5SDimitry Andric                 "wrssq\t{$src, $dst|$dst, $src}",
485*0b57cec5SDimitry Andric                 [(int_x86_wrssq GR64:$src, addr:$dst)]>, T8PS;
486*0b57cec5SDimitry Andric  def WRUSSD : I<0xF5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
487*0b57cec5SDimitry Andric                 "wrussd\t{$src, $dst|$dst, $src}",
488*0b57cec5SDimitry Andric                 [(int_x86_wrussd GR32:$src, addr:$dst)]>, T8PD;
489*0b57cec5SDimitry Andric  def WRUSSQ : RI<0xF5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
490*0b57cec5SDimitry Andric                  "wrussq\t{$src, $dst|$dst, $src}",
491*0b57cec5SDimitry Andric                  [(int_x86_wrussq GR64:$src, addr:$dst)]>, T8PD;
492*0b57cec5SDimitry Andric
493*0b57cec5SDimitry Andric  let Defs = [SSP] in {
494*0b57cec5SDimitry Andric    let Uses = [SSP] in {
495*0b57cec5SDimitry Andric        def SETSSBSY : I<0x01, MRM_E8, (outs), (ins), "setssbsy",
496*0b57cec5SDimitry Andric                         [(int_x86_setssbsy)]>, XS;
497*0b57cec5SDimitry Andric    } // Uses SSP
498*0b57cec5SDimitry Andric
499*0b57cec5SDimitry Andric    def CLRSSBSY : I<0xAE, MRM6m, (outs), (ins i32mem:$src),
500*0b57cec5SDimitry Andric                     "clrssbsy\t$src",
501*0b57cec5SDimitry Andric                     [(int_x86_clrssbsy addr:$src)]>, XS;
502*0b57cec5SDimitry Andric  } // Defs SSP
503*0b57cec5SDimitry Andric} // SchedRW
504*0b57cec5SDimitry Andric
505*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
506*0b57cec5SDimitry Andric    def ENDBR64 : I<0x1E, MRM_FA, (outs), (ins), "endbr64", []>, XS;
507*0b57cec5SDimitry Andric    def ENDBR32 : I<0x1E, MRM_FB, (outs), (ins), "endbr32", []>, XS;
508*0b57cec5SDimitry Andric} // SchedRW
509*0b57cec5SDimitry Andric
510*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
511*0b57cec5SDimitry Andric// XSAVE instructions
512*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
513*0b57cec5SDimitry Andriclet Predicates = [HasXSAVE] in {
514*0b57cec5SDimitry Andriclet Defs = [EDX, EAX], Uses = [ECX] in
515*0b57cec5SDimitry Andric  def XGETBV : I<0x01, MRM_D0, (outs), (ins), "xgetbv", []>, TB;
516*0b57cec5SDimitry Andric
517*0b57cec5SDimitry Andriclet Uses = [EDX, EAX, ECX] in
518*0b57cec5SDimitry Andric  def XSETBV : I<0x01, MRM_D1, (outs), (ins),
519*0b57cec5SDimitry Andric                "xsetbv",
520*0b57cec5SDimitry Andric                [(int_x86_xsetbv ECX, EDX, EAX)]>, TB;
521*0b57cec5SDimitry Andric
522*0b57cec5SDimitry Andric} // HasXSAVE
523*0b57cec5SDimitry Andric
524*0b57cec5SDimitry Andriclet Uses = [EDX, EAX] in {
525*0b57cec5SDimitry Andricdef XSAVE : I<0xAE, MRM4m, (outs), (ins opaquemem:$dst),
526*0b57cec5SDimitry Andric              "xsave\t$dst",
527*0b57cec5SDimitry Andric              [(int_x86_xsave addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVE]>;
528*0b57cec5SDimitry Andricdef XSAVE64 : RI<0xAE, MRM4m, (outs), (ins opaquemem:$dst),
529*0b57cec5SDimitry Andric                 "xsave64\t$dst",
530*0b57cec5SDimitry Andric                 [(int_x86_xsave64 addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVE, In64BitMode]>;
531*0b57cec5SDimitry Andricdef XRSTOR : I<0xAE, MRM5m, (outs), (ins opaquemem:$dst),
532*0b57cec5SDimitry Andric               "xrstor\t$dst",
533*0b57cec5SDimitry Andric               [(int_x86_xrstor addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVE]>;
534*0b57cec5SDimitry Andricdef XRSTOR64 : RI<0xAE, MRM5m, (outs), (ins opaquemem:$dst),
535*0b57cec5SDimitry Andric                  "xrstor64\t$dst",
536*0b57cec5SDimitry Andric                  [(int_x86_xrstor64 addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVE, In64BitMode]>;
537*0b57cec5SDimitry Andricdef XSAVEOPT : I<0xAE, MRM6m, (outs), (ins opaquemem:$dst),
538*0b57cec5SDimitry Andric                 "xsaveopt\t$dst",
539*0b57cec5SDimitry Andric                 [(int_x86_xsaveopt addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVEOPT]>;
540*0b57cec5SDimitry Andricdef XSAVEOPT64 : RI<0xAE, MRM6m, (outs), (ins opaquemem:$dst),
541*0b57cec5SDimitry Andric                    "xsaveopt64\t$dst",
542*0b57cec5SDimitry Andric                    [(int_x86_xsaveopt64 addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVEOPT, In64BitMode]>;
543*0b57cec5SDimitry Andricdef XSAVEC : I<0xC7, MRM4m, (outs), (ins opaquemem:$dst),
544*0b57cec5SDimitry Andric               "xsavec\t$dst",
545*0b57cec5SDimitry Andric               [(int_x86_xsavec addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVEC]>;
546*0b57cec5SDimitry Andricdef XSAVEC64 : RI<0xC7, MRM4m, (outs), (ins opaquemem:$dst),
547*0b57cec5SDimitry Andric                 "xsavec64\t$dst",
548*0b57cec5SDimitry Andric                 [(int_x86_xsavec64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVEC, In64BitMode]>;
549*0b57cec5SDimitry Andricdef XSAVES : I<0xC7, MRM5m, (outs), (ins opaquemem:$dst),
550*0b57cec5SDimitry Andric               "xsaves\t$dst",
551*0b57cec5SDimitry Andric               [(int_x86_xsaves addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES]>;
552*0b57cec5SDimitry Andricdef XSAVES64 : RI<0xC7, MRM5m, (outs), (ins opaquemem:$dst),
553*0b57cec5SDimitry Andric                  "xsaves64\t$dst",
554*0b57cec5SDimitry Andric                  [(int_x86_xsaves64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVE, In64BitMode]>;
555*0b57cec5SDimitry Andricdef XRSTORS : I<0xC7, MRM3m, (outs), (ins opaquemem:$dst),
556*0b57cec5SDimitry Andric                "xrstors\t$dst",
557*0b57cec5SDimitry Andric                [(int_x86_xrstors addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES]>;
558*0b57cec5SDimitry Andricdef XRSTORS64 : RI<0xC7, MRM3m, (outs), (ins opaquemem:$dst),
559*0b57cec5SDimitry Andric                   "xrstors64\t$dst",
560*0b57cec5SDimitry Andric                   [(int_x86_xrstors64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES, In64BitMode]>;
561*0b57cec5SDimitry Andric} // Uses
562*0b57cec5SDimitry Andric} // SchedRW
563*0b57cec5SDimitry Andric
564*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
565*0b57cec5SDimitry Andric// VIA PadLock crypto instructions
566*0b57cec5SDimitry Andriclet Defs = [RAX, RDI], Uses = [RDX, RDI], SchedRW = [WriteSystem] in
567*0b57cec5SDimitry Andric  def XSTORE : I<0xa7, MRM_C0, (outs), (ins), "xstore", []>, TB;
568*0b57cec5SDimitry Andric
569*0b57cec5SDimitry Andricdef : InstAlias<"xstorerng", (XSTORE)>;
570*0b57cec5SDimitry Andric
571*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
572*0b57cec5SDimitry Andriclet Defs = [RSI, RDI], Uses = [RBX, RDX, RSI, RDI] in {
573*0b57cec5SDimitry Andric  def XCRYPTECB : I<0xa7, MRM_C8, (outs), (ins), "xcryptecb", []>, TB;
574*0b57cec5SDimitry Andric  def XCRYPTCBC : I<0xa7, MRM_D0, (outs), (ins), "xcryptcbc", []>, TB;
575*0b57cec5SDimitry Andric  def XCRYPTCTR : I<0xa7, MRM_D8, (outs), (ins), "xcryptctr", []>, TB;
576*0b57cec5SDimitry Andric  def XCRYPTCFB : I<0xa7, MRM_E0, (outs), (ins), "xcryptcfb", []>, TB;
577*0b57cec5SDimitry Andric  def XCRYPTOFB : I<0xa7, MRM_E8, (outs), (ins), "xcryptofb", []>, TB;
578*0b57cec5SDimitry Andric}
579*0b57cec5SDimitry Andric
580*0b57cec5SDimitry Andriclet Defs = [RAX, RSI, RDI], Uses = [RAX, RSI, RDI] in {
581*0b57cec5SDimitry Andric  def XSHA1 : I<0xa6, MRM_C8, (outs), (ins), "xsha1", []>, TB;
582*0b57cec5SDimitry Andric  def XSHA256 : I<0xa6, MRM_D0, (outs), (ins), "xsha256", []>, TB;
583*0b57cec5SDimitry Andric}
584*0b57cec5SDimitry Andriclet Defs = [RAX, RDX, RSI], Uses = [RAX, RSI] in
585*0b57cec5SDimitry Andric  def MONTMUL : I<0xa6, MRM_C0, (outs), (ins), "montmul", []>, TB;
586*0b57cec5SDimitry Andric} // SchedRW
587*0b57cec5SDimitry Andric
588*0b57cec5SDimitry Andric//==-----------------------------------------------------------------------===//
589*0b57cec5SDimitry Andric// PKU  - enable protection key
590*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
591*0b57cec5SDimitry Andriclet Defs = [EAX, EDX], Uses = [ECX] in
592*0b57cec5SDimitry Andric  def RDPKRUr : I<0x01, MRM_EE, (outs), (ins), "rdpkru",
593*0b57cec5SDimitry Andric                  [(set EAX, (X86rdpkru ECX)), (implicit EDX)]>, TB;
594*0b57cec5SDimitry Andriclet Uses = [EAX, ECX, EDX] in
595*0b57cec5SDimitry Andric  def WRPKRUr : I<0x01, MRM_EF, (outs), (ins), "wrpkru",
596*0b57cec5SDimitry Andric                  [(X86wrpkru EAX, EDX, ECX)]>, TB;
597*0b57cec5SDimitry Andric} // SchedRW
598*0b57cec5SDimitry Andric
599*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
600*0b57cec5SDimitry Andric// FS/GS Base Instructions
601*0b57cec5SDimitry Andriclet Predicates = [HasFSGSBase, In64BitMode], SchedRW = [WriteSystem] in {
602*0b57cec5SDimitry Andric  def RDFSBASE : I<0xAE, MRM0r, (outs GR32:$dst), (ins),
603*0b57cec5SDimitry Andric                   "rdfsbase{l}\t$dst",
604*0b57cec5SDimitry Andric                   [(set GR32:$dst, (int_x86_rdfsbase_32))]>, XS;
605*0b57cec5SDimitry Andric  def RDFSBASE64 : RI<0xAE, MRM0r, (outs GR64:$dst), (ins),
606*0b57cec5SDimitry Andric                     "rdfsbase{q}\t$dst",
607*0b57cec5SDimitry Andric                     [(set GR64:$dst, (int_x86_rdfsbase_64))]>, XS;
608*0b57cec5SDimitry Andric  def RDGSBASE : I<0xAE, MRM1r, (outs GR32:$dst), (ins),
609*0b57cec5SDimitry Andric                   "rdgsbase{l}\t$dst",
610*0b57cec5SDimitry Andric                   [(set GR32:$dst, (int_x86_rdgsbase_32))]>, XS;
611*0b57cec5SDimitry Andric  def RDGSBASE64 : RI<0xAE, MRM1r, (outs GR64:$dst), (ins),
612*0b57cec5SDimitry Andric                     "rdgsbase{q}\t$dst",
613*0b57cec5SDimitry Andric                     [(set GR64:$dst, (int_x86_rdgsbase_64))]>, XS;
614*0b57cec5SDimitry Andric  def WRFSBASE : I<0xAE, MRM2r, (outs), (ins GR32:$src),
615*0b57cec5SDimitry Andric                   "wrfsbase{l}\t$src",
616*0b57cec5SDimitry Andric                   [(int_x86_wrfsbase_32 GR32:$src)]>, XS;
617*0b57cec5SDimitry Andric  def WRFSBASE64 : RI<0xAE, MRM2r, (outs), (ins GR64:$src),
618*0b57cec5SDimitry Andric                      "wrfsbase{q}\t$src",
619*0b57cec5SDimitry Andric                      [(int_x86_wrfsbase_64 GR64:$src)]>, XS;
620*0b57cec5SDimitry Andric  def WRGSBASE : I<0xAE, MRM3r, (outs), (ins GR32:$src),
621*0b57cec5SDimitry Andric                   "wrgsbase{l}\t$src",
622*0b57cec5SDimitry Andric                   [(int_x86_wrgsbase_32 GR32:$src)]>, XS;
623*0b57cec5SDimitry Andric  def WRGSBASE64 : RI<0xAE, MRM3r, (outs), (ins GR64:$src),
624*0b57cec5SDimitry Andric                      "wrgsbase{q}\t$src",
625*0b57cec5SDimitry Andric                      [(int_x86_wrgsbase_64 GR64:$src)]>, XS;
626*0b57cec5SDimitry Andric}
627*0b57cec5SDimitry Andric
628*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
629*0b57cec5SDimitry Andric// INVPCID Instruction
630*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
631*0b57cec5SDimitry Andricdef INVPCID32 : I<0x82, MRMSrcMem, (outs), (ins GR32:$src1, i128mem:$src2),
632*0b57cec5SDimitry Andric                  "invpcid\t{$src2, $src1|$src1, $src2}",
633*0b57cec5SDimitry Andric                  [(int_x86_invpcid GR32:$src1, addr:$src2)]>, T8PD,
634*0b57cec5SDimitry Andric                  Requires<[Not64BitMode, HasINVPCID]>;
635*0b57cec5SDimitry Andricdef INVPCID64 : I<0x82, MRMSrcMem, (outs), (ins GR64:$src1, i128mem:$src2),
636*0b57cec5SDimitry Andric                  "invpcid\t{$src2, $src1|$src1, $src2}", []>, T8PD,
637*0b57cec5SDimitry Andric                  Requires<[In64BitMode, HasINVPCID]>;
638*0b57cec5SDimitry Andric} // SchedRW
639*0b57cec5SDimitry Andric
640*0b57cec5SDimitry Andriclet Predicates = [In64BitMode, HasINVPCID] in {
641*0b57cec5SDimitry Andric  // The instruction can only use a 64 bit register as the register argument
642*0b57cec5SDimitry Andric  // in 64 bit mode, while the intrinsic only accepts a 32 bit argument
643*0b57cec5SDimitry Andric  // corresponding to it.
644*0b57cec5SDimitry Andric  // The accepted values for now are 0,1,2,3 anyways (see Intel SDM -- INVCPID
645*0b57cec5SDimitry Andric  // type),/ so it doesn't hurt us that one can't supply a 64 bit value here.
646*0b57cec5SDimitry Andric  def : Pat<(int_x86_invpcid GR32:$src1, addr:$src2),
647*0b57cec5SDimitry Andric            (INVPCID64
648*0b57cec5SDimitry Andric              (SUBREG_TO_REG (i64 0), (MOV32rr GR32:$src1), sub_32bit),
649*0b57cec5SDimitry Andric              addr:$src2)>;
650*0b57cec5SDimitry Andric}
651*0b57cec5SDimitry Andric
652*0b57cec5SDimitry Andric
653*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
654*0b57cec5SDimitry Andric// SMAP Instruction
655*0b57cec5SDimitry Andriclet Defs = [EFLAGS], SchedRW = [WriteSystem] in {
656*0b57cec5SDimitry Andric  def CLAC : I<0x01, MRM_CA, (outs), (ins), "clac", []>, TB;
657*0b57cec5SDimitry Andric  def STAC : I<0x01, MRM_CB, (outs), (ins), "stac", []>, TB;
658*0b57cec5SDimitry Andric}
659*0b57cec5SDimitry Andric
660*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
661*0b57cec5SDimitry Andric// SMX Instruction
662*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
663*0b57cec5SDimitry Andriclet Uses = [RAX, RBX, RCX, RDX], Defs = [RAX, RBX, RCX] in {
664*0b57cec5SDimitry Andric  def GETSEC : I<0x37, RawFrm, (outs), (ins), "getsec", []>, TB;
665*0b57cec5SDimitry Andric} // Uses, Defs
666*0b57cec5SDimitry Andric} // SchedRW
667*0b57cec5SDimitry Andric
668*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
669*0b57cec5SDimitry Andric// TS flag control instruction.
670*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
671*0b57cec5SDimitry Andricdef CLTS : I<0x06, RawFrm, (outs), (ins), "clts", []>, TB;
672*0b57cec5SDimitry Andric}
673*0b57cec5SDimitry Andric
674*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
675*0b57cec5SDimitry Andric// IF (inside EFLAGS) management instructions.
676*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem], Uses = [EFLAGS], Defs = [EFLAGS] in {
677*0b57cec5SDimitry Andricdef CLI : I<0xFA, RawFrm, (outs), (ins), "cli", []>;
678*0b57cec5SDimitry Andricdef STI : I<0xFB, RawFrm, (outs), (ins), "sti", []>;
679*0b57cec5SDimitry Andric}
680*0b57cec5SDimitry Andric
681*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
682*0b57cec5SDimitry Andric// RDPID Instruction
683*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
684*0b57cec5SDimitry Andricdef RDPID32 : I<0xC7, MRM7r, (outs GR32:$dst), (ins),
685*0b57cec5SDimitry Andric                "rdpid\t$dst", [(set GR32:$dst, (int_x86_rdpid))]>, XS,
686*0b57cec5SDimitry Andric                Requires<[Not64BitMode, HasRDPID]>;
687*0b57cec5SDimitry Andricdef RDPID64 : I<0xC7, MRM7r, (outs GR64:$dst), (ins), "rdpid\t$dst", []>, XS,
688*0b57cec5SDimitry Andric                Requires<[In64BitMode, HasRDPID]>;
689*0b57cec5SDimitry Andric} // SchedRW
690*0b57cec5SDimitry Andric
691*0b57cec5SDimitry Andriclet Predicates = [In64BitMode, HasRDPID] in {
692*0b57cec5SDimitry Andric  // Due to silly instruction definition, we have to compensate for the
693*0b57cec5SDimitry Andric  // instruction outputing a 64-bit register.
694*0b57cec5SDimitry Andric  def : Pat<(int_x86_rdpid),
695*0b57cec5SDimitry Andric            (EXTRACT_SUBREG (RDPID64), sub_32bit)>;
696*0b57cec5SDimitry Andric}
697*0b57cec5SDimitry Andric
698*0b57cec5SDimitry Andric
699*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
700*0b57cec5SDimitry Andric// PTWRITE Instruction - Write Data to a Processor Trace Packet
701*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
702*0b57cec5SDimitry Andricdef PTWRITEm: I<0xAE, MRM4m, (outs), (ins i32mem:$dst),
703*0b57cec5SDimitry Andric                "ptwrite{l}\t$dst", [(int_x86_ptwrite32 (loadi32 addr:$dst))]>, XS,
704*0b57cec5SDimitry Andric                Requires<[HasPTWRITE]>;
705*0b57cec5SDimitry Andricdef PTWRITE64m : RI<0xAE, MRM4m, (outs), (ins i64mem:$dst),
706*0b57cec5SDimitry Andric                    "ptwrite{q}\t$dst", [(int_x86_ptwrite64 (loadi64 addr:$dst))]>, XS,
707*0b57cec5SDimitry Andric                    Requires<[In64BitMode, HasPTWRITE]>;
708*0b57cec5SDimitry Andric
709*0b57cec5SDimitry Andricdef PTWRITEr : I<0xAE, MRM4r, (outs), (ins GR32:$dst),
710*0b57cec5SDimitry Andric                 "ptwrite{l}\t$dst", [(int_x86_ptwrite32 GR32:$dst)]>, XS,
711*0b57cec5SDimitry Andric                    Requires<[HasPTWRITE]>;
712*0b57cec5SDimitry Andricdef PTWRITE64r : RI<0xAE, MRM4r, (outs), (ins GR64:$dst),
713*0b57cec5SDimitry Andric                    "ptwrite{q}\t$dst", [(int_x86_ptwrite64 GR64:$dst)]>, XS,
714*0b57cec5SDimitry Andric                    Requires<[In64BitMode, HasPTWRITE]>;
715*0b57cec5SDimitry Andric} // SchedRW
716*0b57cec5SDimitry Andric
717*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
718*0b57cec5SDimitry Andric// Platform Configuration instruction
719*0b57cec5SDimitry Andric
720*0b57cec5SDimitry Andric// From ISA docs:
721*0b57cec5SDimitry Andric//  "This instruction is used to execute functions for configuring platform
722*0b57cec5SDimitry Andric//   features.
723*0b57cec5SDimitry Andric//   EAX: Leaf function to be invoked.
724*0b57cec5SDimitry Andric//   RBX/RCX/RDX: Leaf-specific purpose."
725*0b57cec5SDimitry Andric//  "Successful execution of the leaf clears RAX (set to zero) and ZF, CF, PF,
726*0b57cec5SDimitry Andric//   AF, OF, and SF are cleared. In case of failure, the failure reason is
727*0b57cec5SDimitry Andric//   indicated in RAX with ZF set to 1 and CF, PF, AF, OF, and SF are cleared."
728*0b57cec5SDimitry Andric// Thus all these mentioned registers are considered clobbered.
729*0b57cec5SDimitry Andric
730*0b57cec5SDimitry Andriclet SchedRW = [WriteSystem] in {
731*0b57cec5SDimitry Andriclet Uses = [RAX, RBX, RCX, RDX], Defs = [RAX, RBX, RCX, RDX, EFLAGS] in
732*0b57cec5SDimitry Andric    def PCONFIG : I<0x01, MRM_C5, (outs), (ins), "pconfig", []>, TB,
733*0b57cec5SDimitry Andric                  Requires<[HasPCONFIG]>;
734*0b57cec5SDimitry Andric} // SchedRW
735