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