xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86InstrSystem.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- X86InstrSystem.td - System Instructions ------------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the X86 instructions that are generally used in
11*9880d681SAndroid Build Coastguard Worker// privileged modes.  These are not typically used by the compiler, but are
12*9880d681SAndroid Build Coastguard Worker// supported for the assembler and disassembler.
13*9880d681SAndroid Build Coastguard Worker//
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
17*9880d681SAndroid Build Coastguard Workerlet Defs = [RAX, RDX] in
18*9880d681SAndroid Build Coastguard Worker  def RDTSC : I<0x31, RawFrm, (outs), (ins), "rdtsc", [(X86rdtsc)], IIC_RDTSC>,
19*9880d681SAndroid Build Coastguard Worker              TB;
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerlet Defs = [RAX, RCX, RDX] in
22*9880d681SAndroid Build Coastguard Worker  def RDTSCP : I<0x01, MRM_F9, (outs), (ins), "rdtscp", [(X86rdtscp)]>, TB;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker// CPU flow control instructions
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, isBarrier = 1, hasCtrlDep = 1 in {
27*9880d681SAndroid Build Coastguard Worker  def TRAP    : I<0x0B, RawFrm, (outs), (ins), "ud2", [(trap)]>, TB;
28*9880d681SAndroid Build Coastguard Worker  def UD2B    : I<0xB9, RawFrm, (outs), (ins), "ud2b", []>, TB;
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdef HLT : I<0xF4, RawFrm, (outs), (ins), "hlt", [], IIC_HLT>;
32*9880d681SAndroid Build Coastguard Workerdef RSM : I<0xAA, RawFrm, (outs), (ins), "rsm", [], IIC_RSM>, TB;
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker// Interrupt and SysCall Instructions.
35*9880d681SAndroid Build Coastguard Workerlet Uses = [EFLAGS] in
36*9880d681SAndroid Build Coastguard Worker  def INTO : I<0xce, RawFrm, (outs), (ins), "into", []>;
37*9880d681SAndroid Build Coastguard Workerdef INT3 : I<0xcc, RawFrm, (outs), (ins), "int3",
38*9880d681SAndroid Build Coastguard Worker              [(int_x86_int (i8 3))], IIC_INT3>;
39*9880d681SAndroid Build Coastguard Worker} // SchedRW
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker// The long form of "int $3" turns into int3 as a size optimization.
42*9880d681SAndroid Build Coastguard Worker// FIXME: This doesn't work because InstAlias can't match immediate constants.
43*9880d681SAndroid Build Coastguard Worker//def : InstAlias<"int\t$3", (INT3)>;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdef INT : Ii8<0xcd, RawFrm, (outs), (ins u8imm:$trap), "int\t$trap",
48*9880d681SAndroid Build Coastguard Worker              [(int_x86_int imm:$trap)], IIC_INT>;
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdef SYSCALL  : I<0x05, RawFrm, (outs), (ins), "syscall", [], IIC_SYSCALL>, TB;
52*9880d681SAndroid Build Coastguard Workerdef SYSRET   : I<0x07, RawFrm, (outs), (ins), "sysret{l}", [], IIC_SYSCALL>, TB;
53*9880d681SAndroid Build Coastguard Workerdef SYSRET64 :RI<0x07, RawFrm, (outs), (ins), "sysret{q}", [], IIC_SYSCALL>, TB,
54*9880d681SAndroid Build Coastguard Worker               Requires<[In64BitMode]>;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdef SYSENTER : I<0x34, RawFrm, (outs), (ins), "sysenter", [],
57*9880d681SAndroid Build Coastguard Worker                 IIC_SYS_ENTER_EXIT>, TB;
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdef SYSEXIT   : I<0x35, RawFrm, (outs), (ins), "sysexit{l}", [],
60*9880d681SAndroid Build Coastguard Worker                 IIC_SYS_ENTER_EXIT>, TB;
61*9880d681SAndroid Build Coastguard Workerdef SYSEXIT64 :RI<0x35, RawFrm, (outs), (ins), "sysexit{q}", [],
62*9880d681SAndroid Build Coastguard Worker                 IIC_SYS_ENTER_EXIT>, TB, Requires<[In64BitMode]>;
63*9880d681SAndroid Build Coastguard Worker} // SchedRW
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdef : Pat<(debugtrap),
66*9880d681SAndroid Build Coastguard Worker          (INT3)>, Requires<[NotPS4]>;
67*9880d681SAndroid Build Coastguard Workerdef : Pat<(debugtrap),
68*9880d681SAndroid Build Coastguard Worker          (INT (i8 0x41))>, Requires<[IsPS4]>;
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
71*9880d681SAndroid Build Coastguard Worker//  Input/Output Instructions.
72*9880d681SAndroid Build Coastguard Worker//
73*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
74*9880d681SAndroid Build Coastguard Workerlet Defs = [AL], Uses = [DX] in
75*9880d681SAndroid Build Coastguard Workerdef IN8rr  : I<0xEC, RawFrm, (outs), (ins),
76*9880d681SAndroid Build Coastguard Worker               "in{b}\t{%dx, %al|al, dx}", [], IIC_IN_RR>;
77*9880d681SAndroid Build Coastguard Workerlet Defs = [AX], Uses = [DX] in
78*9880d681SAndroid Build Coastguard Workerdef IN16rr : I<0xED, RawFrm, (outs), (ins),
79*9880d681SAndroid Build Coastguard Worker               "in{w}\t{%dx, %ax|ax, dx}", [], IIC_IN_RR>,  OpSize16;
80*9880d681SAndroid Build Coastguard Workerlet Defs = [EAX], Uses = [DX] in
81*9880d681SAndroid Build Coastguard Workerdef IN32rr : I<0xED, RawFrm, (outs), (ins),
82*9880d681SAndroid Build Coastguard Worker               "in{l}\t{%dx, %eax|eax, dx}", [], IIC_IN_RR>, OpSize32;
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerlet Defs = [AL] in
85*9880d681SAndroid Build Coastguard Workerdef IN8ri  : Ii8<0xE4, RawFrm, (outs), (ins u8imm:$port),
86*9880d681SAndroid Build Coastguard Worker                  "in{b}\t{$port, %al|al, $port}", [], IIC_IN_RI>;
87*9880d681SAndroid Build Coastguard Workerlet Defs = [AX] in
88*9880d681SAndroid Build Coastguard Workerdef IN16ri : Ii8<0xE5, RawFrm, (outs), (ins u8imm:$port),
89*9880d681SAndroid Build Coastguard Worker                  "in{w}\t{$port, %ax|ax, $port}", [], IIC_IN_RI>, OpSize16;
90*9880d681SAndroid Build Coastguard Workerlet Defs = [EAX] in
91*9880d681SAndroid Build Coastguard Workerdef IN32ri : Ii8<0xE5, RawFrm, (outs), (ins u8imm:$port),
92*9880d681SAndroid Build Coastguard Worker                  "in{l}\t{$port, %eax|eax, $port}", [], IIC_IN_RI>, OpSize32;
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerlet Uses = [DX, AL] in
95*9880d681SAndroid Build Coastguard Workerdef OUT8rr  : I<0xEE, RawFrm, (outs), (ins),
96*9880d681SAndroid Build Coastguard Worker                "out{b}\t{%al, %dx|dx, al}", [], IIC_OUT_RR>;
97*9880d681SAndroid Build Coastguard Workerlet Uses = [DX, AX] in
98*9880d681SAndroid Build Coastguard Workerdef OUT16rr : I<0xEF, RawFrm, (outs), (ins),
99*9880d681SAndroid Build Coastguard Worker                "out{w}\t{%ax, %dx|dx, ax}", [], IIC_OUT_RR>, OpSize16;
100*9880d681SAndroid Build Coastguard Workerlet Uses = [DX, EAX] in
101*9880d681SAndroid Build Coastguard Workerdef OUT32rr : I<0xEF, RawFrm, (outs), (ins),
102*9880d681SAndroid Build Coastguard Worker                "out{l}\t{%eax, %dx|dx, eax}", [], IIC_OUT_RR>, OpSize32;
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerlet Uses = [AL] in
105*9880d681SAndroid Build Coastguard Workerdef OUT8ir  : Ii8<0xE6, RawFrm, (outs), (ins u8imm:$port),
106*9880d681SAndroid Build Coastguard Worker                   "out{b}\t{%al, $port|$port, al}", [], IIC_OUT_IR>;
107*9880d681SAndroid Build Coastguard Workerlet Uses = [AX] in
108*9880d681SAndroid Build Coastguard Workerdef OUT16ir : Ii8<0xE7, RawFrm, (outs), (ins u8imm:$port),
109*9880d681SAndroid Build Coastguard Worker                   "out{w}\t{%ax, $port|$port, ax}", [], IIC_OUT_IR>, OpSize16;
110*9880d681SAndroid Build Coastguard Workerlet Uses = [EAX] in
111*9880d681SAndroid Build Coastguard Workerdef OUT32ir : Ii8<0xE7, RawFrm, (outs), (ins u8imm:$port),
112*9880d681SAndroid Build Coastguard Worker                  "out{l}\t{%eax, $port|$port, eax}", [], IIC_OUT_IR>, OpSize32;
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker} // SchedRW
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
117*9880d681SAndroid Build Coastguard Worker// Moves to and from debug registers
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
120*9880d681SAndroid Build Coastguard Workerdef MOV32rd : I<0x21, MRMDestReg, (outs GR32:$dst), (ins DEBUG_REG:$src),
121*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_DR>, TB,
122*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
123*9880d681SAndroid Build Coastguard Workerdef MOV64rd : I<0x21, MRMDestReg, (outs GR64:$dst), (ins DEBUG_REG:$src),
124*9880d681SAndroid Build Coastguard Worker                "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_DR>, TB,
125*9880d681SAndroid Build Coastguard Worker                Requires<[In64BitMode]>;
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdef MOV32dr : I<0x23, MRMSrcReg, (outs DEBUG_REG:$dst), (ins GR32:$src),
128*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_DR_REG>, TB,
129*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
130*9880d681SAndroid Build Coastguard Workerdef MOV64dr : I<0x23, MRMSrcReg, (outs DEBUG_REG:$dst), (ins GR64:$src),
131*9880d681SAndroid Build Coastguard Worker                "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_DR_REG>, TB,
132*9880d681SAndroid Build Coastguard Worker                Requires<[In64BitMode]>;
133*9880d681SAndroid Build Coastguard Worker} // SchedRW
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
136*9880d681SAndroid Build Coastguard Worker// Moves to and from control registers
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
139*9880d681SAndroid Build Coastguard Workerdef MOV32rc : I<0x20, MRMDestReg, (outs GR32:$dst), (ins CONTROL_REG:$src),
140*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_CR>, TB,
141*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
142*9880d681SAndroid Build Coastguard Workerdef MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG:$src),
143*9880d681SAndroid Build Coastguard Worker                "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_CR>, TB,
144*9880d681SAndroid Build Coastguard Worker                Requires<[In64BitMode]>;
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdef MOV32cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR32:$src),
147*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_CR_REG>, TB,
148*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
149*9880d681SAndroid Build Coastguard Workerdef MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR64:$src),
150*9880d681SAndroid Build Coastguard Worker                "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_CR_REG>, TB,
151*9880d681SAndroid Build Coastguard Worker                Requires<[In64BitMode]>;
152*9880d681SAndroid Build Coastguard Worker} // SchedRW
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
155*9880d681SAndroid Build Coastguard Worker// Segment override instruction prefixes
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdef CS_PREFIX : I<0x2E, RawFrm, (outs), (ins), "cs", []>;
158*9880d681SAndroid Build Coastguard Workerdef SS_PREFIX : I<0x36, RawFrm, (outs), (ins), "ss", []>;
159*9880d681SAndroid Build Coastguard Workerdef DS_PREFIX : I<0x3E, RawFrm, (outs), (ins), "ds", []>;
160*9880d681SAndroid Build Coastguard Workerdef ES_PREFIX : I<0x26, RawFrm, (outs), (ins), "es", []>;
161*9880d681SAndroid Build Coastguard Workerdef FS_PREFIX : I<0x64, RawFrm, (outs), (ins), "fs", []>;
162*9880d681SAndroid Build Coastguard Workerdef GS_PREFIX : I<0x65, RawFrm, (outs), (ins), "gs", []>;
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
166*9880d681SAndroid Build Coastguard Worker// Moves to and from segment registers.
167*9880d681SAndroid Build Coastguard Worker//
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteMove] in {
170*9880d681SAndroid Build Coastguard Workerdef MOV16rs : I<0x8C, MRMDestReg, (outs GR16:$dst), (ins SEGMENT_REG:$src),
171*9880d681SAndroid Build Coastguard Worker                "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_SR>, OpSize16;
172*9880d681SAndroid Build Coastguard Workerdef MOV32rs : I<0x8C, MRMDestReg, (outs GR32:$dst), (ins SEGMENT_REG:$src),
173*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_SR>, OpSize32;
174*9880d681SAndroid Build Coastguard Workerdef MOV64rs : RI<0x8C, MRMDestReg, (outs GR64:$dst), (ins SEGMENT_REG:$src),
175*9880d681SAndroid Build Coastguard Worker                 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_SR>;
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdef MOV16ms : I<0x8C, MRMDestMem, (outs), (ins i16mem:$dst, SEGMENT_REG:$src),
178*9880d681SAndroid Build Coastguard Worker                "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_MEM_SR>, OpSize16;
179*9880d681SAndroid Build Coastguard Workerdef MOV32ms : I<0x8C, MRMDestMem, (outs), (ins i32mem:$dst, SEGMENT_REG:$src),
180*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_MEM_SR>, OpSize32;
181*9880d681SAndroid Build Coastguard Workerdef MOV64ms : RI<0x8C, MRMDestMem, (outs), (ins i64mem:$dst, SEGMENT_REG:$src),
182*9880d681SAndroid Build Coastguard Worker                 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_MEM_SR>;
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdef MOV16sr : I<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR16:$src),
185*9880d681SAndroid Build Coastguard Worker                "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_REG>, OpSize16;
186*9880d681SAndroid Build Coastguard Workerdef MOV32sr : I<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR32:$src),
187*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_REG>, OpSize32;
188*9880d681SAndroid Build Coastguard Workerdef MOV64sr : RI<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR64:$src),
189*9880d681SAndroid Build Coastguard Worker                 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_REG>;
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdef MOV16sm : I<0x8E, MRMSrcMem, (outs SEGMENT_REG:$dst), (ins i16mem:$src),
192*9880d681SAndroid Build Coastguard Worker                "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_MEM>, OpSize16;
193*9880d681SAndroid Build Coastguard Workerdef MOV32sm : I<0x8E, MRMSrcMem, (outs SEGMENT_REG:$dst), (ins i32mem:$src),
194*9880d681SAndroid Build Coastguard Worker                "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_MEM>, OpSize32;
195*9880d681SAndroid Build Coastguard Workerdef MOV64sm : RI<0x8E, MRMSrcMem, (outs SEGMENT_REG:$dst), (ins i64mem:$src),
196*9880d681SAndroid Build Coastguard Worker                 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_MEM>;
197*9880d681SAndroid Build Coastguard Worker} // SchedRW
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
200*9880d681SAndroid Build Coastguard Worker// Segmentation support instructions.
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
203*9880d681SAndroid Build Coastguard Workerdef SWAPGS : I<0x01, MRM_F8, (outs), (ins), "swapgs", [], IIC_SWAPGS>, TB;
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdef LAR16rm : I<0x02, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
206*9880d681SAndroid Build Coastguard Worker                "lar{w}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RM>, TB,
207*9880d681SAndroid Build Coastguard Worker                OpSize16;
208*9880d681SAndroid Build Coastguard Workerdef LAR16rr : I<0x02, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
209*9880d681SAndroid Build Coastguard Worker                "lar{w}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RR>, TB,
210*9880d681SAndroid Build Coastguard Worker                OpSize16;
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker// i16mem operand in LAR32rm and GR32 operand in LAR32rr is not a typo.
213*9880d681SAndroid Build Coastguard Workerdef LAR32rm : I<0x02, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
214*9880d681SAndroid Build Coastguard Worker                "lar{l}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RM>, TB,
215*9880d681SAndroid Build Coastguard Worker                OpSize32;
216*9880d681SAndroid Build Coastguard Workerdef LAR32rr : I<0x02, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
217*9880d681SAndroid Build Coastguard Worker                "lar{l}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RR>, TB,
218*9880d681SAndroid Build Coastguard Worker                OpSize32;
219*9880d681SAndroid Build Coastguard Worker// i16mem operand in LAR64rm and GR32 operand in LAR32rr is not a typo.
220*9880d681SAndroid Build Coastguard Workerdef LAR64rm : RI<0x02, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
221*9880d681SAndroid Build Coastguard Worker                 "lar{q}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RM>, TB;
222*9880d681SAndroid Build Coastguard Workerdef LAR64rr : RI<0x02, MRMSrcReg, (outs GR64:$dst), (ins GR32:$src),
223*9880d681SAndroid Build Coastguard Worker                 "lar{q}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RR>, TB;
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdef LSL16rm : I<0x03, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
226*9880d681SAndroid Build Coastguard Worker                "lsl{w}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RM>, TB,
227*9880d681SAndroid Build Coastguard Worker                OpSize16;
228*9880d681SAndroid Build Coastguard Workerdef LSL16rr : I<0x03, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
229*9880d681SAndroid Build Coastguard Worker                "lsl{w}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RR>, TB,
230*9880d681SAndroid Build Coastguard Worker                OpSize16;
231*9880d681SAndroid Build Coastguard Workerdef LSL32rm : I<0x03, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
232*9880d681SAndroid Build Coastguard Worker                "lsl{l}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RM>, TB,
233*9880d681SAndroid Build Coastguard Worker                OpSize32;
234*9880d681SAndroid Build Coastguard Workerdef LSL32rr : I<0x03, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
235*9880d681SAndroid Build Coastguard Worker                "lsl{l}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RR>, TB,
236*9880d681SAndroid Build Coastguard Worker                OpSize32;
237*9880d681SAndroid Build Coastguard Workerdef LSL64rm : RI<0x03, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
238*9880d681SAndroid Build Coastguard Worker                 "lsl{q}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RM>, TB;
239*9880d681SAndroid Build Coastguard Workerdef LSL64rr : RI<0x03, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
240*9880d681SAndroid Build Coastguard Worker                 "lsl{q}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RR>, TB;
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Workerdef INVLPG : I<0x01, MRM7m, (outs), (ins i8mem:$addr), "invlpg\t$addr",
243*9880d681SAndroid Build Coastguard Worker               [], IIC_INVLPG>, TB;
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdef STR16r : I<0x00, MRM1r, (outs GR16:$dst), (ins),
246*9880d681SAndroid Build Coastguard Worker               "str{w}\t$dst", [], IIC_STR>, TB, OpSize16;
247*9880d681SAndroid Build Coastguard Workerdef STR32r : I<0x00, MRM1r, (outs GR32:$dst), (ins),
248*9880d681SAndroid Build Coastguard Worker               "str{l}\t$dst", [], IIC_STR>, TB, OpSize32;
249*9880d681SAndroid Build Coastguard Workerdef STR64r : RI<0x00, MRM1r, (outs GR64:$dst), (ins),
250*9880d681SAndroid Build Coastguard Worker                "str{q}\t$dst", [], IIC_STR>, TB;
251*9880d681SAndroid Build Coastguard Workerdef STRm   : I<0x00, MRM1m, (outs), (ins i16mem:$dst),
252*9880d681SAndroid Build Coastguard Worker               "str{w}\t$dst", [], IIC_STR>, TB;
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerdef LTRr : I<0x00, MRM3r, (outs), (ins GR16:$src),
255*9880d681SAndroid Build Coastguard Worker             "ltr{w}\t$src", [], IIC_LTR>, TB;
256*9880d681SAndroid Build Coastguard Workerdef LTRm : I<0x00, MRM3m, (outs), (ins i16mem:$src),
257*9880d681SAndroid Build Coastguard Worker             "ltr{w}\t$src", [], IIC_LTR>, TB;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdef PUSHCS16 : I<0x0E, RawFrm, (outs), (ins),
260*9880d681SAndroid Build Coastguard Worker                 "push{w}\t{%cs|cs}", [], IIC_PUSH_SR>,
261*9880d681SAndroid Build Coastguard Worker                 OpSize16, Requires<[Not64BitMode]>;
262*9880d681SAndroid Build Coastguard Workerdef PUSHCS32 : I<0x0E, RawFrm, (outs), (ins),
263*9880d681SAndroid Build Coastguard Worker                 "push{l}\t{%cs|cs}", [], IIC_PUSH_CS>,
264*9880d681SAndroid Build Coastguard Worker                 OpSize32, Requires<[Not64BitMode]>;
265*9880d681SAndroid Build Coastguard Workerdef PUSHSS16 : I<0x16, RawFrm, (outs), (ins),
266*9880d681SAndroid Build Coastguard Worker                 "push{w}\t{%ss|ss}", [], IIC_PUSH_SR>,
267*9880d681SAndroid Build Coastguard Worker                 OpSize16, Requires<[Not64BitMode]>;
268*9880d681SAndroid Build Coastguard Workerdef PUSHSS32 : I<0x16, RawFrm, (outs), (ins),
269*9880d681SAndroid Build Coastguard Worker                 "push{l}\t{%ss|ss}", [], IIC_PUSH_SR>,
270*9880d681SAndroid Build Coastguard Worker                 OpSize32, Requires<[Not64BitMode]>;
271*9880d681SAndroid Build Coastguard Workerdef PUSHDS16 : I<0x1E, RawFrm, (outs), (ins),
272*9880d681SAndroid Build Coastguard Worker                 "push{w}\t{%ds|ds}", [], IIC_PUSH_SR>,
273*9880d681SAndroid Build Coastguard Worker                 OpSize16, Requires<[Not64BitMode]>;
274*9880d681SAndroid Build Coastguard Workerdef PUSHDS32 : I<0x1E, RawFrm, (outs), (ins),
275*9880d681SAndroid Build Coastguard Worker                 "push{l}\t{%ds|ds}", [], IIC_PUSH_SR>,
276*9880d681SAndroid Build Coastguard Worker                 OpSize32, Requires<[Not64BitMode]>;
277*9880d681SAndroid Build Coastguard Workerdef PUSHES16 : I<0x06, RawFrm, (outs), (ins),
278*9880d681SAndroid Build Coastguard Worker                 "push{w}\t{%es|es}", [], IIC_PUSH_SR>,
279*9880d681SAndroid Build Coastguard Worker                 OpSize16, Requires<[Not64BitMode]>;
280*9880d681SAndroid Build Coastguard Workerdef PUSHES32 : I<0x06, RawFrm, (outs), (ins),
281*9880d681SAndroid Build Coastguard Worker                 "push{l}\t{%es|es}", [], IIC_PUSH_SR>,
282*9880d681SAndroid Build Coastguard Worker                 OpSize32, Requires<[Not64BitMode]>;
283*9880d681SAndroid Build Coastguard Workerdef PUSHFS16 : I<0xa0, RawFrm, (outs), (ins),
284*9880d681SAndroid Build Coastguard Worker                 "push{w}\t{%fs|fs}", [], IIC_PUSH_SR>, OpSize16, TB;
285*9880d681SAndroid Build Coastguard Workerdef PUSHFS32 : I<0xa0, RawFrm, (outs), (ins),
286*9880d681SAndroid Build Coastguard Worker                 "push{l}\t{%fs|fs}", [], IIC_PUSH_SR>, TB,
287*9880d681SAndroid Build Coastguard Worker               OpSize32, Requires<[Not64BitMode]>;
288*9880d681SAndroid Build Coastguard Workerdef PUSHGS16 : I<0xa8, RawFrm, (outs), (ins),
289*9880d681SAndroid Build Coastguard Worker                 "push{w}\t{%gs|gs}", [], IIC_PUSH_SR>, OpSize16, TB;
290*9880d681SAndroid Build Coastguard Workerdef PUSHGS32 : I<0xa8, RawFrm, (outs), (ins),
291*9880d681SAndroid Build Coastguard Worker                 "push{l}\t{%gs|gs}", [], IIC_PUSH_SR>, TB,
292*9880d681SAndroid Build Coastguard Worker               OpSize32, Requires<[Not64BitMode]>;
293*9880d681SAndroid Build Coastguard Workerdef PUSHFS64 : I<0xa0, RawFrm, (outs), (ins),
294*9880d681SAndroid Build Coastguard Worker                 "push{q}\t{%fs|fs}", [], IIC_PUSH_SR>, TB,
295*9880d681SAndroid Build Coastguard Worker               OpSize32, Requires<[In64BitMode]>;
296*9880d681SAndroid Build Coastguard Workerdef PUSHGS64 : I<0xa8, RawFrm, (outs), (ins),
297*9880d681SAndroid Build Coastguard Worker                 "push{q}\t{%gs|gs}", [], IIC_PUSH_SR>, TB,
298*9880d681SAndroid Build Coastguard Worker               OpSize32, Requires<[In64BitMode]>;
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker// No "pop cs" instruction.
301*9880d681SAndroid Build Coastguard Workerdef POPSS16 : I<0x17, RawFrm, (outs), (ins),
302*9880d681SAndroid Build Coastguard Worker                "pop{w}\t{%ss|ss}", [], IIC_POP_SR_SS>,
303*9880d681SAndroid Build Coastguard Worker              OpSize16, Requires<[Not64BitMode]>;
304*9880d681SAndroid Build Coastguard Workerdef POPSS32 : I<0x17, RawFrm, (outs), (ins),
305*9880d681SAndroid Build Coastguard Worker                "pop{l}\t{%ss|ss}", [], IIC_POP_SR_SS>,
306*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[Not64BitMode]>;
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Workerdef POPDS16 : I<0x1F, RawFrm, (outs), (ins),
309*9880d681SAndroid Build Coastguard Worker                "pop{w}\t{%ds|ds}", [], IIC_POP_SR>,
310*9880d681SAndroid Build Coastguard Worker              OpSize16, Requires<[Not64BitMode]>;
311*9880d681SAndroid Build Coastguard Workerdef POPDS32 : I<0x1F, RawFrm, (outs), (ins),
312*9880d681SAndroid Build Coastguard Worker                "pop{l}\t{%ds|ds}", [], IIC_POP_SR>,
313*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[Not64BitMode]>;
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdef POPES16 : I<0x07, RawFrm, (outs), (ins),
316*9880d681SAndroid Build Coastguard Worker                "pop{w}\t{%es|es}", [], IIC_POP_SR>,
317*9880d681SAndroid Build Coastguard Worker              OpSize16, Requires<[Not64BitMode]>;
318*9880d681SAndroid Build Coastguard Workerdef POPES32 : I<0x07, RawFrm, (outs), (ins),
319*9880d681SAndroid Build Coastguard Worker                "pop{l}\t{%es|es}", [], IIC_POP_SR>,
320*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[Not64BitMode]>;
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Workerdef POPFS16 : I<0xa1, RawFrm, (outs), (ins),
323*9880d681SAndroid Build Coastguard Worker                "pop{w}\t{%fs|fs}", [], IIC_POP_SR>, OpSize16, TB;
324*9880d681SAndroid Build Coastguard Workerdef POPFS32 : I<0xa1, RawFrm, (outs), (ins),
325*9880d681SAndroid Build Coastguard Worker                "pop{l}\t{%fs|fs}", [], IIC_POP_SR>, TB,
326*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[Not64BitMode]>;
327*9880d681SAndroid Build Coastguard Workerdef POPFS64 : I<0xa1, RawFrm, (outs), (ins),
328*9880d681SAndroid Build Coastguard Worker                "pop{q}\t{%fs|fs}", [], IIC_POP_SR>, TB,
329*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[In64BitMode]>;
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workerdef POPGS16 : I<0xa9, RawFrm, (outs), (ins),
332*9880d681SAndroid Build Coastguard Worker                "pop{w}\t{%gs|gs}", [], IIC_POP_SR>, OpSize16, TB;
333*9880d681SAndroid Build Coastguard Workerdef POPGS32 : I<0xa9, RawFrm, (outs), (ins),
334*9880d681SAndroid Build Coastguard Worker                "pop{l}\t{%gs|gs}", [], IIC_POP_SR>, TB,
335*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[Not64BitMode]>;
336*9880d681SAndroid Build Coastguard Workerdef POPGS64 : I<0xa9, RawFrm, (outs), (ins),
337*9880d681SAndroid Build Coastguard Worker                "pop{q}\t{%gs|gs}", [], IIC_POP_SR>, TB,
338*9880d681SAndroid Build Coastguard Worker              OpSize32, Requires<[In64BitMode]>;
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Workerdef LDS16rm : I<0xc5, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
342*9880d681SAndroid Build Coastguard Worker                "lds{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize16,
343*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
344*9880d681SAndroid Build Coastguard Workerdef LDS32rm : I<0xc5, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
345*9880d681SAndroid Build Coastguard Worker                "lds{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize32,
346*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Workerdef LSS16rm : I<0xb2, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
349*9880d681SAndroid Build Coastguard Worker                "lss{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize16;
350*9880d681SAndroid Build Coastguard Workerdef LSS32rm : I<0xb2, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
351*9880d681SAndroid Build Coastguard Worker                "lss{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize32;
352*9880d681SAndroid Build Coastguard Workerdef LSS64rm : RI<0xb2, MRMSrcMem, (outs GR64:$dst), (ins opaque80mem:$src),
353*9880d681SAndroid Build Coastguard Worker                 "lss{q}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB;
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdef LES16rm : I<0xc4, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
356*9880d681SAndroid Build Coastguard Worker                "les{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize16,
357*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
358*9880d681SAndroid Build Coastguard Workerdef LES32rm : I<0xc4, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
359*9880d681SAndroid Build Coastguard Worker                "les{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize32,
360*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerdef LFS16rm : I<0xb4, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
363*9880d681SAndroid Build Coastguard Worker                "lfs{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize16;
364*9880d681SAndroid Build Coastguard Workerdef LFS32rm : I<0xb4, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
365*9880d681SAndroid Build Coastguard Worker                "lfs{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize32;
366*9880d681SAndroid Build Coastguard Workerdef LFS64rm : RI<0xb4, MRMSrcMem, (outs GR64:$dst), (ins opaque80mem:$src),
367*9880d681SAndroid Build Coastguard Worker                 "lfs{q}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB;
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerdef LGS16rm : I<0xb5, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
370*9880d681SAndroid Build Coastguard Worker                "lgs{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize16;
371*9880d681SAndroid Build Coastguard Workerdef LGS32rm : I<0xb5, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
372*9880d681SAndroid Build Coastguard Worker                "lgs{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize32;
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Workerdef LGS64rm : RI<0xb5, MRMSrcMem, (outs GR64:$dst), (ins opaque80mem:$src),
375*9880d681SAndroid Build Coastguard Worker                 "lgs{q}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB;
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerdef VERRr : I<0x00, MRM4r, (outs), (ins GR16:$seg),
379*9880d681SAndroid Build Coastguard Worker              "verr\t$seg", [], IIC_VERR>, TB;
380*9880d681SAndroid Build Coastguard Workerdef VERRm : I<0x00, MRM4m, (outs), (ins i16mem:$seg),
381*9880d681SAndroid Build Coastguard Worker              "verr\t$seg", [], IIC_VERR>, TB;
382*9880d681SAndroid Build Coastguard Workerdef VERWr : I<0x00, MRM5r, (outs), (ins GR16:$seg),
383*9880d681SAndroid Build Coastguard Worker              "verw\t$seg", [], IIC_VERW_MEM>, TB;
384*9880d681SAndroid Build Coastguard Workerdef VERWm : I<0x00, MRM5m, (outs), (ins i16mem:$seg),
385*9880d681SAndroid Build Coastguard Worker              "verw\t$seg", [], IIC_VERW_REG>, TB;
386*9880d681SAndroid Build Coastguard Worker} // SchedRW
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
389*9880d681SAndroid Build Coastguard Worker// Descriptor-table support instructions
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
392*9880d681SAndroid Build Coastguard Workerdef SGDT16m : I<0x01, MRM0m, (outs), (ins opaque48mem:$dst),
393*9880d681SAndroid Build Coastguard Worker              "sgdt{w}\t$dst", [], IIC_SGDT>, TB, OpSize16, Requires<[Not64BitMode]>;
394*9880d681SAndroid Build Coastguard Workerdef SGDT32m : I<0x01, MRM0m, (outs), (ins opaque48mem:$dst),
395*9880d681SAndroid Build Coastguard Worker              "sgdt{l}\t$dst", [], IIC_SGDT>, OpSize32, TB, Requires <[Not64BitMode]>;
396*9880d681SAndroid Build Coastguard Workerdef SGDT64m : I<0x01, MRM0m, (outs), (ins opaque80mem:$dst),
397*9880d681SAndroid Build Coastguard Worker              "sgdt{q}\t$dst", [], IIC_SGDT>, TB, Requires <[In64BitMode]>;
398*9880d681SAndroid Build Coastguard Workerdef SIDT16m : I<0x01, MRM1m, (outs), (ins opaque48mem:$dst),
399*9880d681SAndroid Build Coastguard Worker              "sidt{w}\t$dst", [], IIC_SIDT>, TB, OpSize16, Requires<[Not64BitMode]>;
400*9880d681SAndroid Build Coastguard Workerdef SIDT32m : I<0x01, MRM1m, (outs), (ins opaque48mem:$dst),
401*9880d681SAndroid Build Coastguard Worker              "sidt{l}\t$dst", []>, OpSize32, TB, Requires <[Not64BitMode]>;
402*9880d681SAndroid Build Coastguard Workerdef SIDT64m : I<0x01, MRM1m, (outs), (ins opaque80mem:$dst),
403*9880d681SAndroid Build Coastguard Worker              "sidt{q}\t$dst", []>, TB, Requires <[In64BitMode]>;
404*9880d681SAndroid Build Coastguard Workerdef SLDT16r : I<0x00, MRM0r, (outs GR16:$dst), (ins),
405*9880d681SAndroid Build Coastguard Worker                "sldt{w}\t$dst", [], IIC_SLDT>, TB, OpSize16;
406*9880d681SAndroid Build Coastguard Workerdef SLDT16m : I<0x00, MRM0m, (outs), (ins i16mem:$dst),
407*9880d681SAndroid Build Coastguard Worker                "sldt{w}\t$dst", [], IIC_SLDT>, TB;
408*9880d681SAndroid Build Coastguard Workerdef SLDT32r : I<0x00, MRM0r, (outs GR32:$dst), (ins),
409*9880d681SAndroid Build Coastguard Worker                "sldt{l}\t$dst", [], IIC_SLDT>, OpSize32, TB;
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker// LLDT is not interpreted specially in 64-bit mode because there is no sign
412*9880d681SAndroid Build Coastguard Worker//   extension.
413*9880d681SAndroid Build Coastguard Workerdef SLDT64r : RI<0x00, MRM0r, (outs GR64:$dst), (ins),
414*9880d681SAndroid Build Coastguard Worker                 "sldt{q}\t$dst", [], IIC_SLDT>, TB;
415*9880d681SAndroid Build Coastguard Workerdef SLDT64m : RI<0x00, MRM0m, (outs), (ins i16mem:$dst),
416*9880d681SAndroid Build Coastguard Worker                 "sldt{q}\t$dst", [], IIC_SLDT>, TB;
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Workerdef LGDT16m : I<0x01, MRM2m, (outs), (ins opaque48mem:$src),
419*9880d681SAndroid Build Coastguard Worker              "lgdt{w}\t$src", [], IIC_LGDT>, TB, OpSize16, Requires<[Not64BitMode]>;
420*9880d681SAndroid Build Coastguard Workerdef LGDT32m : I<0x01, MRM2m, (outs), (ins opaque48mem:$src),
421*9880d681SAndroid Build Coastguard Worker              "lgdt{l}\t$src", [], IIC_LGDT>, OpSize32, TB, Requires<[Not64BitMode]>;
422*9880d681SAndroid Build Coastguard Workerdef LGDT64m : I<0x01, MRM2m, (outs), (ins opaque80mem:$src),
423*9880d681SAndroid Build Coastguard Worker              "lgdt{q}\t$src", [], IIC_LGDT>, TB, Requires<[In64BitMode]>;
424*9880d681SAndroid Build Coastguard Workerdef LIDT16m : I<0x01, MRM3m, (outs), (ins opaque48mem:$src),
425*9880d681SAndroid Build Coastguard Worker              "lidt{w}\t$src", [], IIC_LIDT>, TB, OpSize16, Requires<[Not64BitMode]>;
426*9880d681SAndroid Build Coastguard Workerdef LIDT32m : I<0x01, MRM3m, (outs), (ins opaque48mem:$src),
427*9880d681SAndroid Build Coastguard Worker              "lidt{l}\t$src", [], IIC_LIDT>, OpSize32, TB, Requires<[Not64BitMode]>;
428*9880d681SAndroid Build Coastguard Workerdef LIDT64m : I<0x01, MRM3m, (outs), (ins opaque80mem:$src),
429*9880d681SAndroid Build Coastguard Worker              "lidt{q}\t$src", [], IIC_LIDT>, TB, Requires<[In64BitMode]>;
430*9880d681SAndroid Build Coastguard Workerdef LLDT16r : I<0x00, MRM2r, (outs), (ins GR16:$src),
431*9880d681SAndroid Build Coastguard Worker                "lldt{w}\t$src", [], IIC_LLDT_REG>, TB;
432*9880d681SAndroid Build Coastguard Workerdef LLDT16m : I<0x00, MRM2m, (outs), (ins i16mem:$src),
433*9880d681SAndroid Build Coastguard Worker                "lldt{w}\t$src", [], IIC_LLDT_MEM>, TB;
434*9880d681SAndroid Build Coastguard Worker} // SchedRW
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
437*9880d681SAndroid Build Coastguard Worker// Specialized register support
438*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
439*9880d681SAndroid Build Coastguard Workerlet Uses = [EAX, ECX, EDX] in
440*9880d681SAndroid Build Coastguard Workerdef WRMSR : I<0x30, RawFrm, (outs), (ins), "wrmsr", [], IIC_WRMSR>, TB;
441*9880d681SAndroid Build Coastguard Workerlet Defs = [EAX, EDX], Uses = [ECX] in
442*9880d681SAndroid Build Coastguard Workerdef RDMSR : I<0x32, RawFrm, (outs), (ins), "rdmsr", [], IIC_RDMSR>, TB;
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Workerlet Defs = [RAX, RDX], Uses = [ECX] in
445*9880d681SAndroid Build Coastguard Worker  def RDPMC : I<0x33, RawFrm, (outs), (ins), "rdpmc", [(X86rdpmc)], IIC_RDPMC>,
446*9880d681SAndroid Build Coastguard Worker              TB;
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Workerdef SMSW16r : I<0x01, MRM4r, (outs GR16:$dst), (ins),
449*9880d681SAndroid Build Coastguard Worker                "smsw{w}\t$dst", [], IIC_SMSW>, OpSize16, TB;
450*9880d681SAndroid Build Coastguard Workerdef SMSW32r : I<0x01, MRM4r, (outs GR32:$dst), (ins),
451*9880d681SAndroid Build Coastguard Worker                "smsw{l}\t$dst", [], IIC_SMSW>, OpSize32, TB;
452*9880d681SAndroid Build Coastguard Worker// no m form encodable; use SMSW16m
453*9880d681SAndroid Build Coastguard Workerdef SMSW64r : RI<0x01, MRM4r, (outs GR64:$dst), (ins),
454*9880d681SAndroid Build Coastguard Worker                 "smsw{q}\t$dst", [], IIC_SMSW>, TB;
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker// For memory operands, there is only a 16-bit form
457*9880d681SAndroid Build Coastguard Workerdef SMSW16m : I<0x01, MRM4m, (outs), (ins i16mem:$dst),
458*9880d681SAndroid Build Coastguard Worker                "smsw{w}\t$dst", [], IIC_SMSW>, TB;
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Workerdef LMSW16r : I<0x01, MRM6r, (outs), (ins GR16:$src),
461*9880d681SAndroid Build Coastguard Worker                "lmsw{w}\t$src", [], IIC_LMSW_MEM>, TB;
462*9880d681SAndroid Build Coastguard Workerdef LMSW16m : I<0x01, MRM6m, (outs), (ins i16mem:$src),
463*9880d681SAndroid Build Coastguard Worker                "lmsw{w}\t$src", [], IIC_LMSW_REG>, TB;
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Workerlet Defs = [EAX, EBX, ECX, EDX], Uses = [EAX, ECX] in
466*9880d681SAndroid Build Coastguard Worker  def CPUID : I<0xA2, RawFrm, (outs), (ins), "cpuid", [], IIC_CPUID>, TB;
467*9880d681SAndroid Build Coastguard Worker} // SchedRW
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
470*9880d681SAndroid Build Coastguard Worker// Cache instructions
471*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
472*9880d681SAndroid Build Coastguard Workerdef INVD : I<0x08, RawFrm, (outs), (ins), "invd", [], IIC_INVD>, TB;
473*9880d681SAndroid Build Coastguard Workerdef WBINVD : I<0x09, RawFrm, (outs), (ins), "wbinvd", [], IIC_INVD>, TB;
474*9880d681SAndroid Build Coastguard Worker} // SchedRW
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
477*9880d681SAndroid Build Coastguard Worker// XSAVE instructions
478*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSystem] in {
479*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasXSAVE] in {
480*9880d681SAndroid Build Coastguard Workerlet Defs = [EDX, EAX], Uses = [ECX] in
481*9880d681SAndroid Build Coastguard Worker  def XGETBV : I<0x01, MRM_D0, (outs), (ins), "xgetbv", []>, TB;
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerlet Uses = [EDX, EAX, ECX] in
484*9880d681SAndroid Build Coastguard Worker  def XSETBV : I<0x01, MRM_D1, (outs), (ins), "xsetbv", []>, TB;
485*9880d681SAndroid Build Coastguard Worker}
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Workerlet Uses = [EDX, EAX] in {
488*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasXSAVE] in {
489*9880d681SAndroid Build Coastguard Worker  def XSAVE : I<0xAE, MRM4m, (outs), (ins opaque512mem:$dst),
490*9880d681SAndroid Build Coastguard Worker                "xsave\t$dst",
491*9880d681SAndroid Build Coastguard Worker                [(int_x86_xsave addr:$dst, EDX, EAX)]>, TB;
492*9880d681SAndroid Build Coastguard Worker  def XSAVE64 : RI<0xAE, MRM4m, (outs), (ins opaque512mem:$dst),
493*9880d681SAndroid Build Coastguard Worker                   "xsave64\t$dst",
494*9880d681SAndroid Build Coastguard Worker                   [(int_x86_xsave64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
495*9880d681SAndroid Build Coastguard Worker  def XRSTOR : I<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),
496*9880d681SAndroid Build Coastguard Worker                 "xrstor\t$dst",
497*9880d681SAndroid Build Coastguard Worker                 [(int_x86_xrstor addr:$dst, EDX, EAX)]>, TB;
498*9880d681SAndroid Build Coastguard Worker  def XRSTOR64 : RI<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),
499*9880d681SAndroid Build Coastguard Worker                    "xrstor64\t$dst",
500*9880d681SAndroid Build Coastguard Worker                    [(int_x86_xrstor64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
501*9880d681SAndroid Build Coastguard Worker}
502*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasXSAVEOPT] in {
503*9880d681SAndroid Build Coastguard Worker  def XSAVEOPT : I<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
504*9880d681SAndroid Build Coastguard Worker                   "xsaveopt\t$dst",
505*9880d681SAndroid Build Coastguard Worker                   [(int_x86_xsaveopt addr:$dst, EDX, EAX)]>, PS;
506*9880d681SAndroid Build Coastguard Worker  def XSAVEOPT64 : RI<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
507*9880d681SAndroid Build Coastguard Worker                      "xsaveopt64\t$dst",
508*9880d681SAndroid Build Coastguard Worker                      [(int_x86_xsaveopt64 addr:$dst, EDX, EAX)]>, PS, Requires<[In64BitMode]>;
509*9880d681SAndroid Build Coastguard Worker}
510*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasXSAVEC] in {
511*9880d681SAndroid Build Coastguard Worker  def XSAVEC : I<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
512*9880d681SAndroid Build Coastguard Worker                 "xsavec\t$dst",
513*9880d681SAndroid Build Coastguard Worker                 [(int_x86_xsavec addr:$dst, EDX, EAX)]>, TB;
514*9880d681SAndroid Build Coastguard Worker  def XSAVEC64 : RI<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
515*9880d681SAndroid Build Coastguard Worker                   "xsavec64\t$dst",
516*9880d681SAndroid Build Coastguard Worker                   [(int_x86_xsavec64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
517*9880d681SAndroid Build Coastguard Worker}
518*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasXSAVES] in {
519*9880d681SAndroid Build Coastguard Worker  def XSAVES : I<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
520*9880d681SAndroid Build Coastguard Worker                 "xsaves\t$dst",
521*9880d681SAndroid Build Coastguard Worker                 [(int_x86_xsaves addr:$dst, EDX, EAX)]>, TB;
522*9880d681SAndroid Build Coastguard Worker  def XSAVES64 : RI<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
523*9880d681SAndroid Build Coastguard Worker                    "xsaves64\t$dst",
524*9880d681SAndroid Build Coastguard Worker                    [(int_x86_xsaves64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
525*9880d681SAndroid Build Coastguard Worker  def XRSTORS : I<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
526*9880d681SAndroid Build Coastguard Worker                  "xrstors\t$dst",
527*9880d681SAndroid Build Coastguard Worker                  [(int_x86_xrstors addr:$dst, EDX, EAX)]>, TB;
528*9880d681SAndroid Build Coastguard Worker  def XRSTORS64 : RI<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
529*9880d681SAndroid Build Coastguard Worker                     "xrstors64\t$dst",
530*9880d681SAndroid Build Coastguard Worker                     [(int_x86_xrstors64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
531*9880d681SAndroid Build Coastguard Worker}
532*9880d681SAndroid Build Coastguard Worker} // Uses
533*9880d681SAndroid Build Coastguard Worker} // SchedRW
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
536*9880d681SAndroid Build Coastguard Worker// VIA PadLock crypto instructions
537*9880d681SAndroid Build Coastguard Workerlet Defs = [RAX, RDI], Uses = [RDX, RDI] in
538*9880d681SAndroid Build Coastguard Worker  def XSTORE : I<0xa7, MRM_C0, (outs), (ins), "xstore", []>, TB;
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xstorerng", (XSTORE)>;
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Workerlet Defs = [RSI, RDI], Uses = [RBX, RDX, RSI, RDI] in {
543*9880d681SAndroid Build Coastguard Worker  def XCRYPTECB : I<0xa7, MRM_C8, (outs), (ins), "xcryptecb", []>, TB;
544*9880d681SAndroid Build Coastguard Worker  def XCRYPTCBC : I<0xa7, MRM_D0, (outs), (ins), "xcryptcbc", []>, TB;
545*9880d681SAndroid Build Coastguard Worker  def XCRYPTCTR : I<0xa7, MRM_D8, (outs), (ins), "xcryptctr", []>, TB;
546*9880d681SAndroid Build Coastguard Worker  def XCRYPTCFB : I<0xa7, MRM_E0, (outs), (ins), "xcryptcfb", []>, TB;
547*9880d681SAndroid Build Coastguard Worker  def XCRYPTOFB : I<0xa7, MRM_E8, (outs), (ins), "xcryptofb", []>, TB;
548*9880d681SAndroid Build Coastguard Worker}
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Workerlet Defs = [RAX, RSI, RDI], Uses = [RAX, RSI, RDI] in {
551*9880d681SAndroid Build Coastguard Worker  def XSHA1 : I<0xa6, MRM_C8, (outs), (ins), "xsha1", []>, TB;
552*9880d681SAndroid Build Coastguard Worker  def XSHA256 : I<0xa6, MRM_D0, (outs), (ins), "xsha256", []>, TB;
553*9880d681SAndroid Build Coastguard Worker}
554*9880d681SAndroid Build Coastguard Workerlet Defs = [RAX, RDX, RSI], Uses = [RAX, RSI] in
555*9880d681SAndroid Build Coastguard Worker  def MONTMUL : I<0xa6, MRM_C0, (outs), (ins), "montmul", []>, TB;
556*9880d681SAndroid Build Coastguard Worker//==-----------------------------------------------------------------------===//
557*9880d681SAndroid Build Coastguard Worker// PKU  - enable protection key
558*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in {
559*9880d681SAndroid Build Coastguard Worker  def WRPKRU : PseudoI<(outs), (ins GR32:$src),
560*9880d681SAndroid Build Coastguard Worker                [(int_x86_wrpkru GR32:$src)]>;
561*9880d681SAndroid Build Coastguard Worker  def RDPKRU : PseudoI<(outs GR32:$dst), (ins),
562*9880d681SAndroid Build Coastguard Worker                [(set GR32:$dst, (int_x86_rdpkru))]>;
563*9880d681SAndroid Build Coastguard Worker}
564*9880d681SAndroid Build Coastguard Worker
565*9880d681SAndroid Build Coastguard Workerlet Defs = [EAX, EDX], Uses = [ECX] in
566*9880d681SAndroid Build Coastguard Worker  def RDPKRUr : I<0x01, MRM_EE, (outs), (ins), "rdpkru", []>, TB;
567*9880d681SAndroid Build Coastguard Workerlet Uses = [EAX, ECX, EDX] in
568*9880d681SAndroid Build Coastguard Worker  def WRPKRUr : I<0x01, MRM_EF, (outs), (ins), "wrpkru", []>, TB;
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
571*9880d681SAndroid Build Coastguard Worker// FS/GS Base Instructions
572*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasFSGSBase, In64BitMode] in {
573*9880d681SAndroid Build Coastguard Worker  def RDFSBASE : I<0xAE, MRM0r, (outs GR32:$dst), (ins),
574*9880d681SAndroid Build Coastguard Worker                   "rdfsbase{l}\t$dst",
575*9880d681SAndroid Build Coastguard Worker                   [(set GR32:$dst, (int_x86_rdfsbase_32))]>, XS;
576*9880d681SAndroid Build Coastguard Worker  def RDFSBASE64 : RI<0xAE, MRM0r, (outs GR64:$dst), (ins),
577*9880d681SAndroid Build Coastguard Worker                     "rdfsbase{q}\t$dst",
578*9880d681SAndroid Build Coastguard Worker                     [(set GR64:$dst, (int_x86_rdfsbase_64))]>, XS;
579*9880d681SAndroid Build Coastguard Worker  def RDGSBASE : I<0xAE, MRM1r, (outs GR32:$dst), (ins),
580*9880d681SAndroid Build Coastguard Worker                   "rdgsbase{l}\t$dst",
581*9880d681SAndroid Build Coastguard Worker                   [(set GR32:$dst, (int_x86_rdgsbase_32))]>, XS;
582*9880d681SAndroid Build Coastguard Worker  def RDGSBASE64 : RI<0xAE, MRM1r, (outs GR64:$dst), (ins),
583*9880d681SAndroid Build Coastguard Worker                     "rdgsbase{q}\t$dst",
584*9880d681SAndroid Build Coastguard Worker                     [(set GR64:$dst, (int_x86_rdgsbase_64))]>, XS;
585*9880d681SAndroid Build Coastguard Worker  def WRFSBASE : I<0xAE, MRM2r, (outs), (ins GR32:$src),
586*9880d681SAndroid Build Coastguard Worker                   "wrfsbase{l}\t$src",
587*9880d681SAndroid Build Coastguard Worker                   [(int_x86_wrfsbase_32 GR32:$src)]>, XS;
588*9880d681SAndroid Build Coastguard Worker  def WRFSBASE64 : RI<0xAE, MRM2r, (outs), (ins GR64:$src),
589*9880d681SAndroid Build Coastguard Worker                      "wrfsbase{q}\t$src",
590*9880d681SAndroid Build Coastguard Worker                      [(int_x86_wrfsbase_64 GR64:$src)]>, XS;
591*9880d681SAndroid Build Coastguard Worker  def WRGSBASE : I<0xAE, MRM3r, (outs), (ins GR32:$src),
592*9880d681SAndroid Build Coastguard Worker                   "wrgsbase{l}\t$src",
593*9880d681SAndroid Build Coastguard Worker                   [(int_x86_wrgsbase_32 GR32:$src)]>, XS;
594*9880d681SAndroid Build Coastguard Worker  def WRGSBASE64 : RI<0xAE, MRM3r, (outs), (ins GR64:$src),
595*9880d681SAndroid Build Coastguard Worker                      "wrgsbase{q}\t$src",
596*9880d681SAndroid Build Coastguard Worker                      [(int_x86_wrgsbase_64 GR64:$src)]>, XS;
597*9880d681SAndroid Build Coastguard Worker}
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
600*9880d681SAndroid Build Coastguard Worker// INVPCID Instruction
601*9880d681SAndroid Build Coastguard Workerdef INVPCID32 : I<0x82, MRMSrcMem, (outs), (ins GR32:$src1, i128mem:$src2),
602*9880d681SAndroid Build Coastguard Worker                "invpcid\t{$src2, $src1|$src1, $src2}", []>, T8PD,
603*9880d681SAndroid Build Coastguard Worker                Requires<[Not64BitMode]>;
604*9880d681SAndroid Build Coastguard Workerdef INVPCID64 : I<0x82, MRMSrcMem, (outs), (ins GR64:$src1, i128mem:$src2),
605*9880d681SAndroid Build Coastguard Worker                "invpcid\t{$src2, $src1|$src1, $src2}", []>, T8PD,
606*9880d681SAndroid Build Coastguard Worker                Requires<[In64BitMode]>;
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
609*9880d681SAndroid Build Coastguard Worker// SMAP Instruction
610*9880d681SAndroid Build Coastguard Workerlet Defs = [EFLAGS] in {
611*9880d681SAndroid Build Coastguard Worker  def CLAC : I<0x01, MRM_CA, (outs), (ins), "clac", []>, TB;
612*9880d681SAndroid Build Coastguard Worker  def STAC : I<0x01, MRM_CB, (outs), (ins), "stac", []>, TB;
613*9880d681SAndroid Build Coastguard Worker}
614*9880d681SAndroid Build Coastguard Worker
615*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
616*9880d681SAndroid Build Coastguard Worker// SMX Instruction
617*9880d681SAndroid Build Coastguard Workerlet Uses = [RAX, RBX, RCX, RDX], Defs = [RAX, RBX, RCX] in {
618*9880d681SAndroid Build Coastguard Worker  def GETSEC : I<0x37, RawFrm, (outs), (ins), "getsec", []>, TB;
619*9880d681SAndroid Build Coastguard Worker}
620