blob: d21d344db3814fa21c9af01c2cafb9ac3b63adac [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- X86InstrSystem.td - System Instructions ------------*- tablegen -*-===//
2//
Chris Lattnerdec85b82010-10-05 05:32:15 +00003// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Jia Liub22310f2012-02-18 12:03:15 +00007//
Chris Lattnerdec85b82010-10-05 05:32:15 +00008//===----------------------------------------------------------------------===//
9//
10// This file describes the X86 instructions that are generally used in
11// privileged modes. These are not typically used by the compiler, but are
12// supported for the assembler and disassembler.
13//
14//===----------------------------------------------------------------------===//
15
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +000016let SchedRW = [WriteSystem] in {
Chris Lattnerdec85b82010-10-05 05:32:15 +000017let Defs = [RAX, RDX] in
Preston Gurdd6c440c2012-05-04 19:26:37 +000018 def RDTSC : I<0x31, RawFrm, (outs), (ins), "rdtsc", [(X86rdtsc)], IIC_RDTSC>,
19 TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +000020
21let Defs = [RAX, RCX, RDX] in
Andrea Di Biagiod1ab8662014-04-24 17:18:27 +000022 def RDTSCP : I<0x01, MRM_F9, (outs), (ins), "rdtscp", [(X86rdtscp)]>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +000023
24// CPU flow control instructions
25
David Majnemeradc688c2016-08-09 17:55:12 +000026let mayLoad = 1, mayStore = 0, hasSideEffects = 1 in {
Chris Lattnerae33f5d2010-10-05 06:04:14 +000027 def TRAP : I<0x0B, RawFrm, (outs), (ins), "ud2", [(trap)]>, TB;
Kevin Enderby5e7cb5f2010-10-27 20:46:49 +000028 def UD2B : I<0xB9, RawFrm, (outs), (ins), "ud2b", []>, TB;
29}
Chris Lattnerdec85b82010-10-05 05:32:15 +000030
Preston Gurdd6c440c2012-05-04 19:26:37 +000031def HLT : I<0xF4, RawFrm, (outs), (ins), "hlt", [], IIC_HLT>;
32def RSM : I<0xAA, RawFrm, (outs), (ins), "rsm", [], IIC_RSM>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +000033
34// Interrupt and SysCall Instructions.
35let Uses = [EFLAGS] in
Andrew V. Tischenko92980ce2017-09-20 08:17:17 +000036 def INTO : I<0xce, RawFrm, (outs), (ins), "into", []>, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000037def INT3 : I<0xcc, RawFrm, (outs), (ins), "int3",
Preston Gurdd6c440c2012-05-04 19:26:37 +000038 [(int_x86_int (i8 3))], IIC_INT3>;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +000039} // SchedRW
Chris Lattnerfc4fe002011-04-09 19:41:05 +000040
41// The long form of "int $3" turns into int3 as a size optimization.
42// FIXME: This doesn't work because InstAlias can't match immediate constants.
43//def : InstAlias<"int\t$3", (INT3)>;
44
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +000045let SchedRW = [WriteSystem] in {
Chris Lattnerfc4fe002011-04-09 19:41:05 +000046
Craig Topper87990ee2015-10-11 18:27:24 +000047def INT : Ii8<0xcd, RawFrm, (outs), (ins u8imm:$trap), "int\t$trap",
Preston Gurdd6c440c2012-05-04 19:26:37 +000048 [(int_x86_int imm:$trap)], IIC_INT>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000049
Chris Lattnerfc4fe002011-04-09 19:41:05 +000050
Preston Gurdd6c440c2012-05-04 19:26:37 +000051def SYSCALL : I<0x05, RawFrm, (outs), (ins), "syscall", [], IIC_SYSCALL>, TB;
52def SYSRET : I<0x07, RawFrm, (outs), (ins), "sysret{l}", [], IIC_SYSCALL>, TB;
53def SYSRET64 :RI<0x07, RawFrm, (outs), (ins), "sysret{q}", [], IIC_SYSCALL>, TB,
Chris Lattnerae33f5d2010-10-05 06:04:14 +000054 Requires<[In64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000055
Preston Gurdd6c440c2012-05-04 19:26:37 +000056def SYSENTER : I<0x34, RawFrm, (outs), (ins), "sysenter", [],
57 IIC_SYS_ENTER_EXIT>, TB;
58
59def SYSEXIT : I<0x35, RawFrm, (outs), (ins), "sysexit{l}", [],
60 IIC_SYS_ENTER_EXIT>, TB;
Craig Topper9df497e2014-02-26 06:50:27 +000061def SYSEXIT64 :RI<0x35, RawFrm, (outs), (ins), "sysexit{q}", [],
62 IIC_SYS_ENTER_EXIT>, TB, Requires<[In64BitMode]>;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +000063} // SchedRW
Chris Lattnerdec85b82010-10-05 05:32:15 +000064
Alex Rosenbergb9fefdd2015-01-26 19:09:27 +000065def : Pat<(debugtrap),
66 (INT3)>, Requires<[NotPS4]>;
67def : Pat<(debugtrap),
68 (INT (i8 0x41))>, Requires<[IsPS4]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000069
70//===----------------------------------------------------------------------===//
71// Input/Output Instructions.
72//
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +000073let SchedRW = [WriteSystem] in {
Chris Lattnerdec85b82010-10-05 05:32:15 +000074let Defs = [AL], Uses = [DX] in
75def IN8rr : I<0xEC, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +000076 "in{b}\t{%dx, %al|al, dx}", [], IIC_IN_RR>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000077let Defs = [AX], Uses = [DX] in
78def IN16rr : I<0xED, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +000079 "in{w}\t{%dx, %ax|ax, dx}", [], IIC_IN_RR>, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +000080let Defs = [EAX], Uses = [DX] in
81def IN32rr : I<0xED, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +000082 "in{l}\t{%dx, %eax|eax, dx}", [], IIC_IN_RR>, OpSize32;
Chris Lattnerdec85b82010-10-05 05:32:15 +000083
84let Defs = [AL] in
Craig Topper5be914e2015-10-12 04:17:55 +000085def IN8ri : Ii8<0xE4, RawFrm, (outs), (ins u8imm:$port),
Craig Topperefd67d42013-07-31 02:47:52 +000086 "in{b}\t{$port, %al|al, $port}", [], IIC_IN_RI>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000087let Defs = [AX] in
Craig Topper5be914e2015-10-12 04:17:55 +000088def IN16ri : Ii8<0xE5, RawFrm, (outs), (ins u8imm:$port),
Craig Topperfa6298a2014-02-02 09:25:09 +000089 "in{w}\t{$port, %ax|ax, $port}", [], IIC_IN_RI>, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +000090let Defs = [EAX] in
Craig Topper5be914e2015-10-12 04:17:55 +000091def IN32ri : Ii8<0xE5, RawFrm, (outs), (ins u8imm:$port),
Craig Topperfa6298a2014-02-02 09:25:09 +000092 "in{l}\t{$port, %eax|eax, $port}", [], IIC_IN_RI>, OpSize32;
Chris Lattnerdec85b82010-10-05 05:32:15 +000093
94let Uses = [DX, AL] in
95def OUT8rr : I<0xEE, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +000096 "out{b}\t{%al, %dx|dx, al}", [], IIC_OUT_RR>;
Chris Lattnerdec85b82010-10-05 05:32:15 +000097let Uses = [DX, AX] in
98def OUT16rr : I<0xEF, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +000099 "out{w}\t{%ax, %dx|dx, ax}", [], IIC_OUT_RR>, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000100let Uses = [DX, EAX] in
101def OUT32rr : I<0xEF, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000102 "out{l}\t{%eax, %dx|dx, eax}", [], IIC_OUT_RR>, OpSize32;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000103
104let Uses = [AL] in
Craig Topper5be914e2015-10-12 04:17:55 +0000105def OUT8ir : Ii8<0xE6, RawFrm, (outs), (ins u8imm:$port),
Craig Topperefd67d42013-07-31 02:47:52 +0000106 "out{b}\t{%al, $port|$port, al}", [], IIC_OUT_IR>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000107let Uses = [AX] in
Craig Topper5be914e2015-10-12 04:17:55 +0000108def OUT16ir : Ii8<0xE7, RawFrm, (outs), (ins u8imm:$port),
Craig Topperfa6298a2014-02-02 09:25:09 +0000109 "out{w}\t{%ax, $port|$port, ax}", [], IIC_OUT_IR>, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000110let Uses = [EAX] in
Craig Topper5be914e2015-10-12 04:17:55 +0000111def OUT32ir : Ii8<0xE7, RawFrm, (outs), (ins u8imm:$port),
Craig Topperfa6298a2014-02-02 09:25:09 +0000112 "out{l}\t{%eax, $port|$port, eax}", [], IIC_OUT_IR>, OpSize32;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000113
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000114} // SchedRW
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000115
116//===----------------------------------------------------------------------===//
117// Moves to and from debug registers
118
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000119let SchedRW = [WriteSystem] in {
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000120def MOV32rd : I<0x21, MRMDestReg, (outs GR32:$dst), (ins DEBUG_REG:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000121 "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_DR>, TB,
122 Requires<[Not64BitMode]>;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000123def MOV64rd : I<0x21, MRMDestReg, (outs GR64:$dst), (ins DEBUG_REG:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000124 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_DR>, TB,
125 Requires<[In64BitMode]>;
126
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000127def MOV32dr : I<0x23, MRMSrcReg, (outs DEBUG_REG:$dst), (ins GR32:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000128 "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_DR_REG>, TB,
129 Requires<[Not64BitMode]>;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000130def MOV64dr : I<0x23, MRMSrcReg, (outs DEBUG_REG:$dst), (ins GR64:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000131 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_DR_REG>, TB,
132 Requires<[In64BitMode]>;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000133} // SchedRW
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000134
135//===----------------------------------------------------------------------===//
136// Moves to and from control registers
137
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000138let SchedRW = [WriteSystem] in {
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000139def MOV32rc : I<0x20, MRMDestReg, (outs GR32:$dst), (ins CONTROL_REG:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000140 "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_CR>, TB,
141 Requires<[Not64BitMode]>;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000142def MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000143 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_CR>, TB,
144 Requires<[In64BitMode]>;
145
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000146def MOV32cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR32:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000147 "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_CR_REG>, TB,
148 Requires<[Not64BitMode]>;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000149def MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR64:$src),
Craig Topperbc281ad82014-01-04 22:29:41 +0000150 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_CR_REG>, TB,
151 Requires<[In64BitMode]>;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000152} // SchedRW
Chris Lattnerdec85b82010-10-05 05:32:15 +0000153
154//===----------------------------------------------------------------------===//
155// Segment override instruction prefixes
156
Simon Pilgrimdf702102017-12-09 16:58:34 +0000157let SchedRW = [WriteNop] in {
158def CS_PREFIX : I<0x2E, RawFrm, (outs), (ins), "cs", [], IIC_NOP>;
159def SS_PREFIX : I<0x36, RawFrm, (outs), (ins), "ss", [], IIC_NOP>;
160def DS_PREFIX : I<0x3E, RawFrm, (outs), (ins), "ds", [], IIC_NOP>;
161def ES_PREFIX : I<0x26, RawFrm, (outs), (ins), "es", [], IIC_NOP>;
162def FS_PREFIX : I<0x64, RawFrm, (outs), (ins), "fs", [], IIC_NOP>;
163def GS_PREFIX : I<0x65, RawFrm, (outs), (ins), "gs", [], IIC_NOP>;
164} // SchedRW
Chris Lattnerdec85b82010-10-05 05:32:15 +0000165
166//===----------------------------------------------------------------------===//
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000167// Moves to and from segment registers.
168//
169
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000170let SchedRW = [WriteMove] in {
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000171def MOV16rs : I<0x8C, MRMDestReg, (outs GR16:$dst), (ins SEGMENT_REG:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000172 "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_SR>, OpSize16;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000173def MOV32rs : I<0x8C, MRMDestReg, (outs GR32:$dst), (ins SEGMENT_REG:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000174 "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_SR>, OpSize32;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000175def MOV64rs : RI<0x8C, MRMDestReg, (outs GR64:$dst), (ins SEGMENT_REG:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000176 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_REG_SR>;
Ayman Musa62d1c712017-04-13 10:03:45 +0000177let mayStore = 1 in {
Craig Topper955308f2016-03-13 02:56:31 +0000178def MOV16ms : I<0x8C, MRMDestMem, (outs), (ins i16mem:$dst, SEGMENT_REG:$src),
Nirav Dave61ffc9c2017-11-21 19:28:13 +0000179 "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_MEM_SR>, OpSizeIgnore;
Ayman Musa62d1c712017-04-13 10:03:45 +0000180}
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000181def MOV16sr : I<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR16:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000182 "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_REG>, OpSize16;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000183def MOV32sr : I<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR32:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000184 "mov{l}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_REG>, OpSize32;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000185def MOV64sr : RI<0x8E, MRMSrcReg, (outs SEGMENT_REG:$dst), (ins GR64:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000186 "mov{q}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_REG>;
Ayman Musa62d1c712017-04-13 10:03:45 +0000187let mayLoad = 1 in {
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000188def MOV16sm : I<0x8E, MRMSrcMem, (outs SEGMENT_REG:$dst), (ins i16mem:$src),
Nirav Dave61ffc9c2017-11-21 19:28:13 +0000189 "mov{w}\t{$src, $dst|$dst, $src}", [], IIC_MOV_SR_MEM>, OpSizeIgnore;
Ayman Musa62d1c712017-04-13 10:03:45 +0000190}
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000191} // SchedRW
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000192
193//===----------------------------------------------------------------------===//
Chris Lattnerdec85b82010-10-05 05:32:15 +0000194// Segmentation support instructions.
195
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000196let SchedRW = [WriteSystem] in {
Preston Gurdd6c440c2012-05-04 19:26:37 +0000197def SWAPGS : I<0x01, MRM_F8, (outs), (ins), "swapgs", [], IIC_SWAPGS>, TB;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000198
Ayman Musa62d1c712017-04-13 10:03:45 +0000199let mayLoad = 1 in
Michael Liao5bf95782014-12-04 05:20:33 +0000200def LAR16rm : I<0x02, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000201 "lar{w}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RM>, TB,
202 OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000203def LAR16rr : I<0x02, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000204 "lar{w}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RR>, TB,
205 OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000206
207// i16mem operand in LAR32rm and GR32 operand in LAR32rr is not a typo.
Ayman Musa62d1c712017-04-13 10:03:45 +0000208let mayLoad = 1 in
Michael Liao5bf95782014-12-04 05:20:33 +0000209def LAR32rm : I<0x02, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
David Woodhouse956965c2014-01-08 12:57:40 +0000210 "lar{l}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RM>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000211 OpSize32;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000212def LAR32rr : I<0x02, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
David Woodhouse956965c2014-01-08 12:57:40 +0000213 "lar{l}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RR>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000214 OpSize32;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000215// i16mem operand in LAR64rm and GR32 operand in LAR32rr is not a typo.
Ayman Musa62d1c712017-04-13 10:03:45 +0000216let mayLoad = 1 in
Michael Liao5bf95782014-12-04 05:20:33 +0000217def LAR64rm : RI<0x02, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000218 "lar{q}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RM>, TB;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000219def LAR64rr : RI<0x02, MRMSrcReg, (outs GR64:$dst), (ins GR32:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000220 "lar{q}\t{$src, $dst|$dst, $src}", [], IIC_LAR_RR>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000221
Ayman Musa62d1c712017-04-13 10:03:45 +0000222let mayLoad = 1 in
Chris Lattnerdec85b82010-10-05 05:32:15 +0000223def LSL16rm : I<0x03, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000224 "lsl{w}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RM>, TB,
225 OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000226def LSL16rr : I<0x03, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000227 "lsl{w}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RR>, TB,
228 OpSize16;
Ayman Musa62d1c712017-04-13 10:03:45 +0000229let mayLoad = 1 in
Chris Lattnerdec85b82010-10-05 05:32:15 +0000230def LSL32rm : I<0x03, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
David Woodhouse956965c2014-01-08 12:57:40 +0000231 "lsl{l}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RM>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000232 OpSize32;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000233def LSL32rr : I<0x03, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
David Woodhouse956965c2014-01-08 12:57:40 +0000234 "lsl{l}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RR>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000235 OpSize32;
Ayman Musa62d1c712017-04-13 10:03:45 +0000236let mayLoad = 1 in
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000237def LSL64rm : RI<0x03, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
Michael Liao5bf95782014-12-04 05:20:33 +0000238 "lsl{q}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RM>, TB;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000239def LSL64rr : RI<0x03, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000240 "lsl{q}\t{$src, $dst|$dst, $src}", [], IIC_LSL_RR>, TB;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000241
Preston Gurdd6c440c2012-05-04 19:26:37 +0000242def INVLPG : I<0x01, MRM7m, (outs), (ins i8mem:$addr), "invlpg\t$addr",
243 [], IIC_INVLPG>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000244
Eli Friedmanf63614a2011-03-04 00:10:17 +0000245def STR16r : I<0x00, MRM1r, (outs GR16:$dst), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000246 "str{w}\t$dst", [], IIC_STR>, TB, OpSize16;
Eli Friedmanf63614a2011-03-04 00:10:17 +0000247def STR32r : I<0x00, MRM1r, (outs GR32:$dst), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000248 "str{l}\t$dst", [], IIC_STR>, TB, OpSize32;
Eli Friedmanf63614a2011-03-04 00:10:17 +0000249def STR64r : RI<0x00, MRM1r, (outs GR64:$dst), (ins),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000250 "str{q}\t$dst", [], IIC_STR>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000251let mayStore = 1 in
Craig Topper955308f2016-03-13 02:56:31 +0000252def STRm : I<0x00, MRM1m, (outs), (ins i16mem:$dst),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000253 "str{w}\t$dst", [], IIC_STR>, TB;
Eli Friedmanf63614a2011-03-04 00:10:17 +0000254
Chris Lattnerdec85b82010-10-05 05:32:15 +0000255def LTRr : I<0x00, MRM3r, (outs), (ins GR16:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000256 "ltr{w}\t$src", [], IIC_LTR>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000257let mayLoad = 1 in
Chris Lattnerdec85b82010-10-05 05:32:15 +0000258def LTRm : I<0x00, MRM3m, (outs), (ins i16mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000259 "ltr{w}\t$src", [], IIC_LTR>, TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000260
Chris Lattnerdec85b82010-10-05 05:32:15 +0000261def PUSHCS16 : I<0x0E, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000262 "push{w}\t{%cs|cs}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000263 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000264def PUSHCS32 : I<0x0E, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000265 "push{l}\t{%cs|cs}", [], IIC_PUSH_CS>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000266 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000267def PUSHSS16 : I<0x16, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000268 "push{w}\t{%ss|ss}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000269 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000270def PUSHSS32 : I<0x16, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000271 "push{l}\t{%ss|ss}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000272 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000273def PUSHDS16 : I<0x1E, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000274 "push{w}\t{%ds|ds}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000275 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000276def PUSHDS32 : I<0x1E, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000277 "push{l}\t{%ds|ds}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000278 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000279def PUSHES16 : I<0x06, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000280 "push{w}\t{%es|es}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000281 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000282def PUSHES32 : I<0x06, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000283 "push{l}\t{%es|es}", [], IIC_PUSH_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000284 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000285def PUSHFS16 : I<0xa0, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000286 "push{w}\t{%fs|fs}", [], IIC_PUSH_SR>, OpSize16, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000287def PUSHFS32 : I<0xa0, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000288 "push{l}\t{%fs|fs}", [], IIC_PUSH_SR>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000289 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000290def PUSHGS16 : I<0xa8, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000291 "push{w}\t{%gs|gs}", [], IIC_PUSH_SR>, OpSize16, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000292def PUSHGS32 : I<0xa8, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000293 "push{l}\t{%gs|gs}", [], IIC_PUSH_SR>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000294 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000295def PUSHFS64 : I<0xa0, RawFrm, (outs), (ins),
Craig Topper6872fd32014-02-18 08:18:29 +0000296 "push{q}\t{%fs|fs}", [], IIC_PUSH_SR>, TB,
297 OpSize32, Requires<[In64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000298def PUSHGS64 : I<0xa8, RawFrm, (outs), (ins),
Craig Topper6872fd32014-02-18 08:18:29 +0000299 "push{q}\t{%gs|gs}", [], IIC_PUSH_SR>, TB,
300 OpSize32, Requires<[In64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000301
302// No "pop cs" instruction.
303def POPSS16 : I<0x17, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +0000304 "pop{w}\t{%ss|ss}", [], IIC_POP_SR_SS>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000305 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000306def POPSS32 : I<0x17, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +0000307 "pop{l}\t{%ss|ss}", [], IIC_POP_SR_SS>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000308 OpSize32, Requires<[Not64BitMode]>;
309
Chris Lattnerdec85b82010-10-05 05:32:15 +0000310def POPDS16 : I<0x1F, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +0000311 "pop{w}\t{%ds|ds}", [], IIC_POP_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000312 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000313def POPDS32 : I<0x1F, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +0000314 "pop{l}\t{%ds|ds}", [], IIC_POP_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000315 OpSize32, Requires<[Not64BitMode]>;
316
Chris Lattnerdec85b82010-10-05 05:32:15 +0000317def POPES16 : I<0x07, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +0000318 "pop{w}\t{%es|es}", [], IIC_POP_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000319 OpSize16, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000320def POPES32 : I<0x07, RawFrm, (outs), (ins),
Craig Topperefd67d42013-07-31 02:47:52 +0000321 "pop{l}\t{%es|es}", [], IIC_POP_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000322 OpSize32, Requires<[Not64BitMode]>;
323
Chris Lattnerdec85b82010-10-05 05:32:15 +0000324def POPFS16 : I<0xa1, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000325 "pop{w}\t{%fs|fs}", [], IIC_POP_SR>, OpSize16, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000326def POPFS32 : I<0xa1, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000327 "pop{l}\t{%fs|fs}", [], IIC_POP_SR>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000328 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000329def POPFS64 : I<0xa1, RawFrm, (outs), (ins),
Craig Topper6872fd32014-02-18 08:18:29 +0000330 "pop{q}\t{%fs|fs}", [], IIC_POP_SR>, TB,
331 OpSize32, Requires<[In64BitMode]>;
332
Chris Lattnerdec85b82010-10-05 05:32:15 +0000333def POPGS16 : I<0xa9, RawFrm, (outs), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000334 "pop{w}\t{%gs|gs}", [], IIC_POP_SR>, OpSize16, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000335def POPGS32 : I<0xa9, RawFrm, (outs), (ins),
David Woodhouse956965c2014-01-08 12:57:40 +0000336 "pop{l}\t{%gs|gs}", [], IIC_POP_SR>, TB,
Craig Topperfa6298a2014-02-02 09:25:09 +0000337 OpSize32, Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000338def POPGS64 : I<0xa9, RawFrm, (outs), (ins),
Craig Topper6872fd32014-02-18 08:18:29 +0000339 "pop{q}\t{%gs|gs}", [], IIC_POP_SR>, TB,
340 OpSize32, Requires<[In64BitMode]>;
341
Chris Lattnerdec85b82010-10-05 05:32:15 +0000342
343def LDS16rm : I<0xc5, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
Craig Topperb9c932f2016-01-26 06:10:15 +0000344 "lds{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize16,
345 Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000346def LDS32rm : I<0xc5, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
Craig Topperb9c932f2016-01-26 06:10:15 +0000347 "lds{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize32,
348 Requires<[Not64BitMode]>;
Michael Liao5bf95782014-12-04 05:20:33 +0000349
Chris Lattnerdec85b82010-10-05 05:32:15 +0000350def LSS16rm : I<0xb2, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000351 "lss{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000352def LSS32rm : I<0xb2, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000353 "lss{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize32;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000354def LSS64rm : RI<0xb2, MRMSrcMem, (outs GR64:$dst), (ins opaque80mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000355 "lss{q}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000356
Chris Lattnerdec85b82010-10-05 05:32:15 +0000357def LES16rm : I<0xc4, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
Craig Topperb9c932f2016-01-26 06:10:15 +0000358 "les{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize16,
359 Requires<[Not64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000360def LES32rm : I<0xc4, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
Craig Topperb9c932f2016-01-26 06:10:15 +0000361 "les{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, OpSize32,
362 Requires<[Not64BitMode]>;
Michael Liao5bf95782014-12-04 05:20:33 +0000363
Chris Lattnerdec85b82010-10-05 05:32:15 +0000364def LFS16rm : I<0xb4, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000365 "lfs{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000366def LFS32rm : I<0xb4, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000367 "lfs{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize32;
Chris Lattnerae33f5d2010-10-05 06:04:14 +0000368def LFS64rm : RI<0xb4, MRMSrcMem, (outs GR64:$dst), (ins opaque80mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000369 "lfs{q}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000370
Chris Lattnerdec85b82010-10-05 05:32:15 +0000371def LGS16rm : I<0xb5, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000372 "lgs{w}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize16;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000373def LGS32rm : I<0xb5, MRMSrcMem, (outs GR32:$dst), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000374 "lgs{l}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB, OpSize32;
Michael Liao5bf95782014-12-04 05:20:33 +0000375
Chris Lattnerdec85b82010-10-05 05:32:15 +0000376def LGS64rm : RI<0xb5, MRMSrcMem, (outs GR64:$dst), (ins opaque80mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000377 "lgs{q}\t{$src, $dst|$dst, $src}", [], IIC_LXS>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000378
379
380def VERRr : I<0x00, MRM4r, (outs), (ins GR16:$seg),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000381 "verr\t$seg", [], IIC_VERR>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000382def VERWr : I<0x00, MRM5r, (outs), (ins GR16:$seg),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000383 "verw\t$seg", [], IIC_VERW_MEM>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000384let mayLoad = 1 in {
385def VERRm : I<0x00, MRM4m, (outs), (ins i16mem:$seg),
386 "verr\t$seg", [], IIC_VERR>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000387def VERWm : I<0x00, MRM5m, (outs), (ins i16mem:$seg),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000388 "verw\t$seg", [], IIC_VERW_REG>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000389}
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000390} // SchedRW
Chris Lattnerdec85b82010-10-05 05:32:15 +0000391
392//===----------------------------------------------------------------------===//
393// Descriptor-table support instructions
394
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000395let SchedRW = [WriteSystem] in {
Craig Topper955308f2016-03-13 02:56:31 +0000396def SGDT16m : I<0x01, MRM0m, (outs), (ins opaque48mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000397 "sgdt{w}\t$dst", [], IIC_SGDT>, TB, OpSize16, Requires<[Not64BitMode]>;
Craig Topper955308f2016-03-13 02:56:31 +0000398def SGDT32m : I<0x01, MRM0m, (outs), (ins opaque48mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000399 "sgdt{l}\t$dst", [], IIC_SGDT>, OpSize32, TB, Requires <[Not64BitMode]>;
Craig Topper955308f2016-03-13 02:56:31 +0000400def SGDT64m : I<0x01, MRM0m, (outs), (ins opaque80mem:$dst),
David Woodhousec178fbe2014-01-08 12:57:55 +0000401 "sgdt{q}\t$dst", [], IIC_SGDT>, TB, Requires <[In64BitMode]>;
Craig Topper955308f2016-03-13 02:56:31 +0000402def SIDT16m : I<0x01, MRM1m, (outs), (ins opaque48mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000403 "sidt{w}\t$dst", [], IIC_SIDT>, TB, OpSize16, Requires<[Not64BitMode]>;
Craig Topper955308f2016-03-13 02:56:31 +0000404def SIDT32m : I<0x01, MRM1m, (outs), (ins opaque48mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000405 "sidt{l}\t$dst", []>, OpSize32, TB, Requires <[Not64BitMode]>;
Craig Topper955308f2016-03-13 02:56:31 +0000406def SIDT64m : I<0x01, MRM1m, (outs), (ins opaque80mem:$dst),
David Woodhousec178fbe2014-01-08 12:57:55 +0000407 "sidt{q}\t$dst", []>, TB, Requires <[In64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000408def SLDT16r : I<0x00, MRM0r, (outs GR16:$dst), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000409 "sldt{w}\t$dst", [], IIC_SLDT>, TB, OpSize16;
Ayman Musa62d1c712017-04-13 10:03:45 +0000410let mayStore = 1 in
Craig Topper955308f2016-03-13 02:56:31 +0000411def SLDT16m : I<0x00, MRM0m, (outs), (ins i16mem:$dst),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000412 "sldt{w}\t$dst", [], IIC_SLDT>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000413def SLDT32r : I<0x00, MRM0r, (outs GR32:$dst), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000414 "sldt{l}\t$dst", [], IIC_SLDT>, OpSize32, TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000415
Chris Lattnerc184a572010-10-05 06:22:35 +0000416// LLDT is not interpreted specially in 64-bit mode because there is no sign
417// extension.
418def SLDT64r : RI<0x00, MRM0r, (outs GR64:$dst), (ins),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000419 "sldt{q}\t$dst", [], IIC_SLDT>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000420let mayStore = 1 in
Craig Topper955308f2016-03-13 02:56:31 +0000421def SLDT64m : RI<0x00, MRM0m, (outs), (ins i16mem:$dst),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000422 "sldt{q}\t$dst", [], IIC_SLDT>, TB;
Chris Lattnerc184a572010-10-05 06:22:35 +0000423
Kevin Enderby49843c02010-10-19 00:01:44 +0000424def LGDT16m : I<0x01, MRM2m, (outs), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000425 "lgdt{w}\t$src", [], IIC_LGDT>, TB, OpSize16, Requires<[Not64BitMode]>;
David Woodhousec178fbe2014-01-08 12:57:55 +0000426def LGDT32m : I<0x01, MRM2m, (outs), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000427 "lgdt{l}\t$src", [], IIC_LGDT>, OpSize32, TB, Requires<[Not64BitMode]>;
David Woodhousec178fbe2014-01-08 12:57:55 +0000428def LGDT64m : I<0x01, MRM2m, (outs), (ins opaque80mem:$src),
429 "lgdt{q}\t$src", [], IIC_LGDT>, TB, Requires<[In64BitMode]>;
Kevin Enderby49843c02010-10-19 00:01:44 +0000430def LIDT16m : I<0x01, MRM3m, (outs), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000431 "lidt{w}\t$src", [], IIC_LIDT>, TB, OpSize16, Requires<[Not64BitMode]>;
David Woodhousec178fbe2014-01-08 12:57:55 +0000432def LIDT32m : I<0x01, MRM3m, (outs), (ins opaque48mem:$src),
Craig Topperfa6298a2014-02-02 09:25:09 +0000433 "lidt{l}\t$src", [], IIC_LIDT>, OpSize32, TB, Requires<[Not64BitMode]>;
David Woodhousec178fbe2014-01-08 12:57:55 +0000434def LIDT64m : I<0x01, MRM3m, (outs), (ins opaque80mem:$src),
435 "lidt{q}\t$src", [], IIC_LIDT>, TB, Requires<[In64BitMode]>;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000436def LLDT16r : I<0x00, MRM2r, (outs), (ins GR16:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000437 "lldt{w}\t$src", [], IIC_LLDT_REG>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000438let mayLoad = 1 in
Chris Lattnerdec85b82010-10-05 05:32:15 +0000439def LLDT16m : I<0x00, MRM2m, (outs), (ins i16mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000440 "lldt{w}\t$src", [], IIC_LLDT_MEM>, TB;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000441} // SchedRW
442
Chris Lattnerdec85b82010-10-05 05:32:15 +0000443//===----------------------------------------------------------------------===//
444// Specialized register support
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000445let SchedRW = [WriteSystem] in {
Craig Toppere169c572015-02-07 23:36:51 +0000446let Uses = [EAX, ECX, EDX] in
Preston Gurdd6c440c2012-05-04 19:26:37 +0000447def WRMSR : I<0x30, RawFrm, (outs), (ins), "wrmsr", [], IIC_WRMSR>, TB;
Craig Toppere169c572015-02-07 23:36:51 +0000448let Defs = [EAX, EDX], Uses = [ECX] in
Preston Gurdd6c440c2012-05-04 19:26:37 +0000449def RDMSR : I<0x32, RawFrm, (outs), (ins), "rdmsr", [], IIC_RDMSR>, TB;
Andrea Di Biagio53b68302014-06-30 17:14:21 +0000450
451let Defs = [RAX, RDX], Uses = [ECX] in
452 def RDPMC : I<0x33, RawFrm, (outs), (ins), "rdpmc", [(X86rdpmc)], IIC_RDPMC>,
453 TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000454
Michael Liao5bf95782014-12-04 05:20:33 +0000455def SMSW16r : I<0x01, MRM4r, (outs GR16:$dst), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000456 "smsw{w}\t$dst", [], IIC_SMSW>, OpSize16, TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000457def SMSW32r : I<0x01, MRM4r, (outs GR32:$dst), (ins),
Craig Topperfa6298a2014-02-02 09:25:09 +0000458 "smsw{l}\t$dst", [], IIC_SMSW>, OpSize32, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000459// no m form encodable; use SMSW16m
Michael Liao5bf95782014-12-04 05:20:33 +0000460def SMSW64r : RI<0x01, MRM4r, (outs GR64:$dst), (ins),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000461 "smsw{q}\t$dst", [], IIC_SMSW>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000462
463// For memory operands, there is only a 16-bit form
Craig Topper955308f2016-03-13 02:56:31 +0000464def SMSW16m : I<0x01, MRM4m, (outs), (ins i16mem:$dst),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000465 "smsw{w}\t$dst", [], IIC_SMSW>, TB;
Chris Lattnerdec85b82010-10-05 05:32:15 +0000466
467def LMSW16r : I<0x01, MRM6r, (outs), (ins GR16:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000468 "lmsw{w}\t$src", [], IIC_LMSW_MEM>, TB;
Ayman Musa62d1c712017-04-13 10:03:45 +0000469let mayLoad = 1 in
Chris Lattnerdec85b82010-10-05 05:32:15 +0000470def LMSW16m : I<0x01, MRM6m, (outs), (ins i16mem:$src),
Preston Gurdd6c440c2012-05-04 19:26:37 +0000471 "lmsw{w}\t$src", [], IIC_LMSW_REG>, TB;
Reid Klecknerb2340d42014-01-28 02:08:22 +0000472
473let Defs = [EAX, EBX, ECX, EDX], Uses = [EAX, ECX] in
Reid Kleckneraedf0d72014-09-04 16:58:25 +0000474 def CPUID : I<0xA2, RawFrm, (outs), (ins), "cpuid", [], IIC_CPUID>, TB;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000475} // SchedRW
Chris Lattnerdec85b82010-10-05 05:32:15 +0000476
477//===----------------------------------------------------------------------===//
478// Cache instructions
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000479let SchedRW = [WriteSystem] in {
Preston Gurdd6c440c2012-05-04 19:26:37 +0000480def INVD : I<0x08, RawFrm, (outs), (ins), "invd", [], IIC_INVD>, TB;
481def WBINVD : I<0x09, RawFrm, (outs), (ins), "wbinvd", [], IIC_INVD>, TB;
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000482} // SchedRW
Chris Lattnerdec85b82010-10-05 05:32:15 +0000483
Craig Topperd9cfddc2011-10-07 07:02:24 +0000484//===----------------------------------------------------------------------===//
Oren Ben Simhonfa582b02017-11-26 13:02:45 +0000485// CET instructions
486let SchedRW = [WriteSystem], Predicates = [HasSHSTK] in{
487 let Uses = [SSP] in {
488 let Defs = [SSP] in {
489 def INCSSPD : I<0xAE, MRM5r, (outs), (ins GR32:$src), "incsspd\t$src",
490 [(int_x86_incsspd GR32:$src)]>, XS;
491 def INCSSPQ : RI<0xAE, MRM5r, (outs), (ins GR64:$src), "incsspq\t$src",
492 [(int_x86_incsspq GR64:$src)]>, XS,
493 Requires<[In64BitMode]>;
494 } // Defs SSP
495
496 let Constraints = "$src = $dst" in {
497 def RDSSPD : I<0x1E, MRM1r, (outs GR32:$dst), (ins GR32:$src),
498 "rdsspd\t$dst",
499 [(set GR32:$dst, (int_x86_rdsspd GR32:$src))]>, XS;
500 def RDSSPQ : RI<0x1E, MRM1r, (outs GR64:$dst), (ins GR64:$src),
501 "rdsspq\t$dst",
502 [(set GR64:$dst, (int_x86_rdsspq GR64:$src))]>, XS,
503 Requires<[In64BitMode]>;
504 }
505
506 let Defs = [SSP] in {
507 def SAVEPREVSSP : I<0x01, MRM_EA, (outs), (ins), "saveprevssp",
508 [(int_x86_saveprevssp)]>, XS;
509 def RSTORSSP : I<0x01, MRM5m, (outs), (ins i32mem:$src),
510 "rstorssp\t$src",
511 [(int_x86_rstorssp addr:$src)]>, XS;
512 } // Defs SSP
513 } // Uses SSP
514
515 def WRSSD : I<0xF6, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
516 "wrssd\t{$src, $dst|$dst, $src}",
517 [(int_x86_wrssd GR32:$src, addr:$dst)]>, T8;
518 def WRSSQ : RI<0xF6, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
519 "wrssq\t{$src, $dst|$dst, $src}",
520 [(int_x86_wrssq GR64:$src, addr:$dst)]>, T8,
521 Requires<[In64BitMode]>;
522 def WRUSSD : I<0xF5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
523 "wrussd\t{$src, $dst|$dst, $src}",
524 [(int_x86_wrussd GR32:$src, addr:$dst)]>, T8PD;
525 def WRUSSQ : RI<0xF5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
526 "wrussq\t{$src, $dst|$dst, $src}",
527 [(int_x86_wrussq GR64:$src, addr:$dst)]>, T8PD,
528 Requires<[In64BitMode]>;
529
530 let Defs = [SSP] in {
531 let Uses = [SSP] in {
532 def SETSSBSY : I<0x01, MRM_E8, (outs), (ins), "setssbsy",
533 [(int_x86_setssbsy)]>, XS;
534 } // Uses SSP
535
536 def CLRSSBSY : I<0xAE, MRM6m, (outs), (ins i32mem:$src),
537 "clrssbsy\t$src",
538 [(int_x86_clrssbsy addr:$src)]>, XS;
539 } // Defs SSP
540} // SchedRW && HasSHSTK
541
542//===----------------------------------------------------------------------===//
Craig Topperd9cfddc2011-10-07 07:02:24 +0000543// XSAVE instructions
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000544let SchedRW = [WriteSystem] in {
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000545let Predicates = [HasXSAVE] in {
Reid Kleckneraedf0d72014-09-04 16:58:25 +0000546let Defs = [EDX, EAX], Uses = [ECX] in
Rafael Espindolae3906212011-02-22 00:35:18 +0000547 def XGETBV : I<0x01, MRM_D0, (outs), (ins), "xgetbv", []>, TB;
548
Reid Kleckneraedf0d72014-09-04 16:58:25 +0000549let Uses = [EDX, EAX, ECX] in
Guy Blank722caeb2016-08-16 06:41:00 +0000550 def XSETBV : I<0x01, MRM_D1, (outs), (ins),
551 "xsetbv",
552 [(int_x86_xsetbv ECX, EDX, EAX)]>, TB;
553
554} // HasXSAVE
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000555
556let Uses = [EDX, EAX] in {
557let Predicates = [HasXSAVE] in {
558 def XSAVE : I<0xAE, MRM4m, (outs), (ins opaque512mem:$dst),
559 "xsave\t$dst",
Craig Topper8f182fd2017-10-23 15:53:21 +0000560 [(int_x86_xsave addr:$dst, EDX, EAX)]>, PS;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000561 def XSAVE64 : RI<0xAE, MRM4m, (outs), (ins opaque512mem:$dst),
562 "xsave64\t$dst",
Craig Topper8f182fd2017-10-23 15:53:21 +0000563 [(int_x86_xsave64 addr:$dst, EDX, EAX)]>, PS, Requires<[In64BitMode]>;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000564 def XRSTOR : I<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),
565 "xrstor\t$dst",
Craig Topper4d93adf2017-10-23 16:11:33 +0000566 [(int_x86_xrstor addr:$dst, EDX, EAX)]>, PS;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000567 def XRSTOR64 : RI<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),
568 "xrstor64\t$dst",
Craig Topper4d93adf2017-10-23 16:11:33 +0000569 [(int_x86_xrstor64 addr:$dst, EDX, EAX)]>, PS, Requires<[In64BitMode]>;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000570}
571let Predicates = [HasXSAVEOPT] in {
572 def XSAVEOPT : I<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
573 "xsaveopt\t$dst",
Craig Topper1b94d9a2016-01-06 06:18:41 +0000574 [(int_x86_xsaveopt addr:$dst, EDX, EAX)]>, PS;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000575 def XSAVEOPT64 : RI<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
576 "xsaveopt64\t$dst",
Craig Topper1b94d9a2016-01-06 06:18:41 +0000577 [(int_x86_xsaveopt64 addr:$dst, EDX, EAX)]>, PS, Requires<[In64BitMode]>;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000578}
579let Predicates = [HasXSAVEC] in {
580 def XSAVEC : I<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
581 "xsavec\t$dst",
582 [(int_x86_xsavec addr:$dst, EDX, EAX)]>, TB;
583 def XSAVEC64 : RI<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
584 "xsavec64\t$dst",
585 [(int_x86_xsavec64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
586}
587let Predicates = [HasXSAVES] in {
588 def XSAVES : I<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
589 "xsaves\t$dst",
590 [(int_x86_xsaves addr:$dst, EDX, EAX)]>, TB;
591 def XSAVES64 : RI<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
592 "xsaves64\t$dst",
593 [(int_x86_xsaves64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
594 def XRSTORS : I<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
595 "xrstors\t$dst",
596 [(int_x86_xrstors addr:$dst, EDX, EAX)]>, TB;
597 def XRSTORS64 : RI<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
598 "xrstors64\t$dst",
599 [(int_x86_xrstors64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;
600}
601} // Uses
Jakob Stoklund Olesen5b535c92013-03-20 23:09:50 +0000602} // SchedRW
Craig Topperbf136762011-10-07 05:53:50 +0000603
Joerg Sonnenbergerfc4789d2011-04-04 16:58:13 +0000604//===----------------------------------------------------------------------===//
605// VIA PadLock crypto instructions
Simon Pilgrim4ba33142017-12-08 16:06:40 +0000606let Defs = [RAX, RDI], Uses = [RDX, RDI], SchedRW = [WriteSystem] in
Craig Topper0d1fd552014-02-19 05:34:21 +0000607 def XSTORE : I<0xa7, MRM_C0, (outs), (ins), "xstore", []>, TB;
Joerg Sonnenbergerfc4789d2011-04-04 16:58:13 +0000608
Joerg Sonnenberger91e56622011-06-30 01:38:03 +0000609def : InstAlias<"xstorerng", (XSTORE)>;
610
Simon Pilgrim4ba33142017-12-08 16:06:40 +0000611let SchedRW = [WriteSystem] in {
Joerg Sonnenbergerfc4789d2011-04-04 16:58:13 +0000612let Defs = [RSI, RDI], Uses = [RBX, RDX, RSI, RDI] in {
Craig Topper0d1fd552014-02-19 05:34:21 +0000613 def XCRYPTECB : I<0xa7, MRM_C8, (outs), (ins), "xcryptecb", []>, TB;
614 def XCRYPTCBC : I<0xa7, MRM_D0, (outs), (ins), "xcryptcbc", []>, TB;
615 def XCRYPTCTR : I<0xa7, MRM_D8, (outs), (ins), "xcryptctr", []>, TB;
616 def XCRYPTCFB : I<0xa7, MRM_E0, (outs), (ins), "xcryptcfb", []>, TB;
617 def XCRYPTOFB : I<0xa7, MRM_E8, (outs), (ins), "xcryptofb", []>, TB;
Joerg Sonnenbergerfc4789d2011-04-04 16:58:13 +0000618}
619
620let Defs = [RAX, RSI, RDI], Uses = [RAX, RSI, RDI] in {
Craig Topper0d1fd552014-02-19 05:34:21 +0000621 def XSHA1 : I<0xa6, MRM_C8, (outs), (ins), "xsha1", []>, TB;
622 def XSHA256 : I<0xa6, MRM_D0, (outs), (ins), "xsha256", []>, TB;
Joerg Sonnenbergerfc4789d2011-04-04 16:58:13 +0000623}
624let Defs = [RAX, RDX, RSI], Uses = [RAX, RSI] in
Craig Topper0d1fd552014-02-19 05:34:21 +0000625 def MONTMUL : I<0xa6, MRM_C0, (outs), (ins), "montmul", []>, TB;
Simon Pilgrim4ba33142017-12-08 16:06:40 +0000626} // SchedRW
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000627
Asaf Badouh9a5a83a2015-12-24 08:25:00 +0000628//==-----------------------------------------------------------------------===//
629// PKU - enable protection key
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000630let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in {
Asaf Badouhaf6569a2015-12-31 08:31:13 +0000631 def WRPKRU : PseudoI<(outs), (ins GR32:$src),
632 [(int_x86_wrpkru GR32:$src)]>;
633 def RDPKRU : PseudoI<(outs GR32:$dst), (ins),
634 [(set GR32:$dst, (int_x86_rdpkru))]>;
635}
636
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000637let SchedRW = [WriteSystem] in {
Zvi Rackoverb346eaa2016-06-18 19:13:38 +0000638let Defs = [EAX, EDX], Uses = [ECX] in
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000639 def RDPKRUr : I<0x01, MRM_EE, (outs), (ins), "rdpkru", [], IIC_PKU>, TB;
Asaf Badouh9a5a83a2015-12-24 08:25:00 +0000640let Uses = [EAX, ECX, EDX] in
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000641 def WRPKRUr : I<0x01, MRM_EF, (outs), (ins), "wrpkru", [], IIC_PKU>, TB;
642} // SchedRW
Craig Topperd9cfddc2011-10-07 07:02:24 +0000643
644//===----------------------------------------------------------------------===//
645// FS/GS Base Instructions
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000646let Predicates = [HasFSGSBase, In64BitMode], SchedRW = [WriteSystem] in {
Craig Topperd9cfddc2011-10-07 07:02:24 +0000647 def RDFSBASE : I<0xAE, MRM0r, (outs GR32:$dst), (ins),
Craig Topper228d9132011-10-30 19:57:21 +0000648 "rdfsbase{l}\t$dst",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000649 [(set GR32:$dst, (int_x86_rdfsbase_32))],
650 IIC_SEGMENT_BASE_R>, XS;
Craig Topperd9cfddc2011-10-07 07:02:24 +0000651 def RDFSBASE64 : RI<0xAE, MRM0r, (outs GR64:$dst), (ins),
Craig Topper228d9132011-10-30 19:57:21 +0000652 "rdfsbase{q}\t$dst",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000653 [(set GR64:$dst, (int_x86_rdfsbase_64))],
654 IIC_SEGMENT_BASE_R>, XS;
Craig Topperd9cfddc2011-10-07 07:02:24 +0000655 def RDGSBASE : I<0xAE, MRM1r, (outs GR32:$dst), (ins),
Craig Topper228d9132011-10-30 19:57:21 +0000656 "rdgsbase{l}\t$dst",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000657 [(set GR32:$dst, (int_x86_rdgsbase_32))],
658 IIC_SEGMENT_BASE_R>, XS;
Craig Topperd9cfddc2011-10-07 07:02:24 +0000659 def RDGSBASE64 : RI<0xAE, MRM1r, (outs GR64:$dst), (ins),
Craig Topper228d9132011-10-30 19:57:21 +0000660 "rdgsbase{q}\t$dst",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000661 [(set GR64:$dst, (int_x86_rdgsbase_64))],
662 IIC_SEGMENT_BASE_R>, XS;
Craig Topper228d9132011-10-30 19:57:21 +0000663 def WRFSBASE : I<0xAE, MRM2r, (outs), (ins GR32:$src),
664 "wrfsbase{l}\t$src",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000665 [(int_x86_wrfsbase_32 GR32:$src)],
666 IIC_SEGMENT_BASE_W>, XS;
Craig Topper228d9132011-10-30 19:57:21 +0000667 def WRFSBASE64 : RI<0xAE, MRM2r, (outs), (ins GR64:$src),
668 "wrfsbase{q}\t$src",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000669 [(int_x86_wrfsbase_64 GR64:$src)],
670 IIC_SEGMENT_BASE_W>, XS;
Craig Topper228d9132011-10-30 19:57:21 +0000671 def WRGSBASE : I<0xAE, MRM3r, (outs), (ins GR32:$src),
672 "wrgsbase{l}\t$src",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000673 [(int_x86_wrgsbase_32 GR32:$src)], IIC_SEGMENT_BASE_W>, XS;
Craig Topper228d9132011-10-30 19:57:21 +0000674 def WRGSBASE64 : RI<0xAE, MRM3r, (outs), (ins GR64:$src),
675 "wrgsbase{q}\t$src",
Simon Pilgrim7e636cc2017-12-09 20:42:27 +0000676 [(int_x86_wrgsbase_64 GR64:$src)],
677 IIC_SEGMENT_BASE_W>, XS;
Craig Topperd9cfddc2011-10-07 07:02:24 +0000678}
Craig Topper0ae8d4d2011-10-16 07:05:40 +0000679
680//===----------------------------------------------------------------------===//
681// INVPCID Instruction
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000682let SchedRW = [WriteSystem] in {
Craig Topper0ae8d4d2011-10-16 07:05:40 +0000683def INVPCID32 : I<0x82, MRMSrcMem, (outs), (ins GR32:$src1, i128mem:$src2),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000684 "invpcid\t{$src2, $src1|$src1, $src2}", [], IIC_INVPCID>, T8PD,
Eric Christopherc0a5aae2013-12-20 02:04:49 +0000685 Requires<[Not64BitMode]>;
Craig Topper0ae8d4d2011-10-16 07:05:40 +0000686def INVPCID64 : I<0x82, MRMSrcMem, (outs), (ins GR64:$src1, i128mem:$src2),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000687 "invpcid\t{$src2, $src1|$src1, $src2}", [], IIC_INVPCID>, T8PD,
Craig Topper0ae8d4d2011-10-16 07:05:40 +0000688 Requires<[In64BitMode]>;
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000689} // SchedRW
Michael Liao95d944032013-04-11 04:52:28 +0000690
691//===----------------------------------------------------------------------===//
692// SMAP Instruction
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000693let Defs = [EFLAGS], SchedRW = [WriteSystem] in {
694 def CLAC : I<0x01, MRM_CA, (outs), (ins), "clac", [], IIC_SMAP>, TB;
695 def STAC : I<0x01, MRM_CB, (outs), (ins), "stac", [], IIC_SMAP>, TB;
Michael Liao95d944032013-04-11 04:52:28 +0000696}
Craig Topper1d472db2015-02-07 23:36:36 +0000697
698//===----------------------------------------------------------------------===//
699// SMX Instruction
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000700let SchedRW = [WriteSystem] in {
Craig Topper1d472db2015-02-07 23:36:36 +0000701let Uses = [RAX, RBX, RCX, RDX], Defs = [RAX, RBX, RCX] in {
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000702 def GETSEC : I<0x37, RawFrm, (outs), (ins), "getsec", [], IIC_SMX>, TB;
703} // Uses, Defs
704} // SchedRW
Craig Topper5f0339d2017-10-23 15:53:16 +0000705
706//===----------------------------------------------------------------------===//
707// RDPID Instruction
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000708let SchedRW = [WriteSystem] in {
Craig Topper5f0339d2017-10-23 15:53:16 +0000709def RDPID32 : I<0xC7, MRM7r, (outs GR32:$src), (ins),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000710 "rdpid\t$src", [], IIC_RDPID>, XS,
Craig Topper5f0339d2017-10-23 15:53:16 +0000711 Requires<[Not64BitMode]>;
712def RDPID64 : I<0xC7, MRM7r, (outs GR64:$src), (ins),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000713 "rdpid\t$src", [], IIC_RDPID>, XS,
Craig Topper5f0339d2017-10-23 15:53:16 +0000714 Requires<[In64BitMode]>;
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000715} // SchedRW
Craig Topper8f182fd2017-10-23 15:53:21 +0000716
717//===----------------------------------------------------------------------===//
718// PTWRITE Instruction
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000719let SchedRW = [WriteSystem] in {
720
Craig Topper8f182fd2017-10-23 15:53:21 +0000721def PTWRITEm: I<0xAE, MRM4m, (outs), (ins i32mem:$dst),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000722 "ptwrite{l}\t$dst", [], IIC_PTWRITE>, XS;
Craig Topper8f182fd2017-10-23 15:53:21 +0000723def PTWRITE64m : RI<0xAE, MRM4m, (outs), (ins i64mem:$dst),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000724 "ptwrite{q}\t$dst", [], IIC_PTWRITE>, XS,
725 Requires<[In64BitMode]>;
Craig Topper8f182fd2017-10-23 15:53:21 +0000726
727def PTWRITEr : I<0xAE, MRM4r, (outs), (ins GR32:$dst),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000728 "ptwrite{l}\t$dst", [], IIC_PTWRITE>, XS;
Craig Topper8f182fd2017-10-23 15:53:21 +0000729def PTWRITE64r : RI<0xAE, MRM4r, (outs), (ins GR64:$dst),
Simon Pilgrim1ddcae62017-12-08 15:48:37 +0000730 "ptwrite{q}\t$dst", [], IIC_PTWRITE>, XS,
731 Requires<[In64BitMode]>;
732} // SchedRW