1b9ea7327SWang, Xin10//===-- X86InstrMisc.td - Misc X86 Instruction Definition -*- tablegen -*-===// 2b9ea7327SWang, Xin10// 3b9ea7327SWang, Xin10// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4b9ea7327SWang, Xin10// See https://llvm.org/LICENSE.txt for license information. 5b9ea7327SWang, Xin10// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b9ea7327SWang, Xin10// 7b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 8b9ea7327SWang, Xin10// 9b9ea7327SWang, Xin10// This file defining the misc X86 instructions. 10b9ea7327SWang, Xin10// 11b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 12b9ea7327SWang, Xin10 13b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 14b9ea7327SWang, Xin10// Instruction list. 15b9ea7327SWang, Xin10// 16b9ea7327SWang, Xin10 17b9ea7327SWang, Xin10// Nop 18b9ea7327SWang, Xin10let hasSideEffects = 0, SchedRW = [WriteNop] in { 19b9ea7327SWang, Xin10 def NOOP : I<0x90, RawFrm, (outs), (ins), "nop", []>; 20b9ea7327SWang, Xin10 def NOOPW : I<0x1f, MRMXm, (outs), (ins i16mem:$zero), 21b80ae654SShengchen Kan "nop{w}\t$zero", []>, TB, OpSize16; 22b9ea7327SWang, Xin10 def NOOPL : I<0x1f, MRMXm, (outs), (ins i32mem:$zero), 23b80ae654SShengchen Kan "nop{l}\t$zero", []>, TB, OpSize32; 24b9ea7327SWang, Xin10 def NOOPQ : RI<0x1f, MRMXm, (outs), (ins i64mem:$zero), 25b80ae654SShengchen Kan "nop{q}\t$zero", []>, TB, Requires<[In64BitMode]>; 26b9ea7327SWang, Xin10 // Also allow register so we can assemble/disassemble 27b9ea7327SWang, Xin10 def NOOPWr : I<0x1f, MRMXr, (outs), (ins GR16:$zero), 28b80ae654SShengchen Kan "nop{w}\t$zero", []>, TB, OpSize16; 29b9ea7327SWang, Xin10 def NOOPLr : I<0x1f, MRMXr, (outs), (ins GR32:$zero), 30b80ae654SShengchen Kan "nop{l}\t$zero", []>, TB, OpSize32; 31b9ea7327SWang, Xin10 def NOOPQr : RI<0x1f, MRMXr, (outs), (ins GR64:$zero), 32b80ae654SShengchen Kan "nop{q}\t$zero", []>, TB, Requires<[In64BitMode]>; 33b9ea7327SWang, Xin10} 34b9ea7327SWang, Xin10 35b9ea7327SWang, Xin10 36b9ea7327SWang, Xin10// Constructing a stack frame. 37b9ea7327SWang, Xin10def ENTER : Ii16<0xC8, RawFrmImm8, (outs), (ins i16imm:$len, i8imm:$lvl), 38b9ea7327SWang, Xin10 "enter\t$len, $lvl", []>, Sched<[WriteMicrocoded]>; 39b9ea7327SWang, Xin10 40b9ea7327SWang, Xin10let SchedRW = [WriteALU] in { 41b9ea7327SWang, Xin10let Defs = [EBP, ESP], Uses = [EBP, ESP], mayLoad = 1, hasSideEffects=0 in 42b9ea7327SWang, Xin10def LEAVE : I<0xC9, RawFrm, (outs), (ins), "leave", []>, 43b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 44b9ea7327SWang, Xin10 45b9ea7327SWang, Xin10let Defs = [RBP,RSP], Uses = [RBP,RSP], mayLoad = 1, hasSideEffects = 0 in 46b9ea7327SWang, Xin10def LEAVE64 : I<0xC9, RawFrm, (outs), (ins), "leave", []>, 47b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 48b9ea7327SWang, Xin10} // SchedRW 49b9ea7327SWang, Xin10 50b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 51b9ea7327SWang, Xin10// Miscellaneous Instructions. 52b9ea7327SWang, Xin10// 53b9ea7327SWang, Xin10 54b9ea7327SWang, Xin10let isBarrier = 1, hasSideEffects = 1, usesCustomInserter = 1, 55b9ea7327SWang, Xin10 SchedRW = [WriteSystem] in 56b9ea7327SWang, Xin10 def Int_eh_sjlj_setup_dispatch 57b9ea7327SWang, Xin10 : PseudoI<(outs), (ins), [(X86eh_sjlj_setup_dispatch)]>; 58b9ea7327SWang, Xin10 59b9ea7327SWang, Xin10let Defs = [ESP], Uses = [ESP], hasSideEffects=0 in { 60b9ea7327SWang, Xin10let mayLoad = 1, SchedRW = [WriteLoad] in { 61b9ea7327SWang, Xin10def POP16r : I<0x58, AddRegFrm, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>, 62b9ea7327SWang, Xin10 OpSize16; 63b9ea7327SWang, Xin10def POP32r : I<0x58, AddRegFrm, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>, 64b9ea7327SWang, Xin10 OpSize32, Requires<[Not64BitMode]>; 65b9ea7327SWang, Xin10// Long form for the disassembler. 66b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1 in { 67b9ea7327SWang, Xin10def POP16rmr: I<0x8F, MRM0r, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>, 68b80ae654SShengchen Kan OpSize16; 69b9ea7327SWang, Xin10def POP32rmr: I<0x8F, MRM0r, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>, 70b80ae654SShengchen Kan OpSize32, Requires<[Not64BitMode]>; 71b9ea7327SWang, Xin10} // isCodeGenOnly = 1, ForceDisassemble = 1 72b9ea7327SWang, Xin10} // mayLoad, SchedRW 73b9ea7327SWang, Xin10let mayStore = 1, mayLoad = 1, SchedRW = [WriteCopy] in { 74b9ea7327SWang, Xin10def POP16rmm: I<0x8F, MRM0m, (outs), (ins i16mem:$dst), "pop{w}\t$dst", []>, 75b9ea7327SWang, Xin10 OpSize16; 76b9ea7327SWang, Xin10def POP32rmm: I<0x8F, MRM0m, (outs), (ins i32mem:$dst), "pop{l}\t$dst", []>, 77b9ea7327SWang, Xin10 OpSize32, Requires<[Not64BitMode]>; 78b9ea7327SWang, Xin10} // mayStore, mayLoad, SchedRW 79b9ea7327SWang, Xin10 80b9ea7327SWang, Xin10let mayStore = 1, SchedRW = [WriteStore] in { 81b9ea7327SWang, Xin10def PUSH16r : I<0x50, AddRegFrm, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>, 82b9ea7327SWang, Xin10 OpSize16; 83b9ea7327SWang, Xin10def PUSH32r : I<0x50, AddRegFrm, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>, 84b9ea7327SWang, Xin10 OpSize32, Requires<[Not64BitMode]>; 85b9ea7327SWang, Xin10// Long form for the disassembler. 86b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1 in { 87b9ea7327SWang, Xin10def PUSH16rmr: I<0xFF, MRM6r, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>, 88b80ae654SShengchen Kan OpSize16; 89b9ea7327SWang, Xin10def PUSH32rmr: I<0xFF, MRM6r, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>, 90b80ae654SShengchen Kan OpSize32, Requires<[Not64BitMode]>; 91b9ea7327SWang, Xin10} // isCodeGenOnly = 1, ForceDisassemble = 1 92b9ea7327SWang, Xin10 93b9ea7327SWang, Xin10def PUSH16i8 : Ii8<0x6a, RawFrm, (outs), (ins i16i8imm:$imm), 94b9ea7327SWang, Xin10 "push{w}\t$imm", []>, OpSize16; 9589ca4eb0SShengchen Kandef PUSH16i : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm), 96b9ea7327SWang, Xin10 "push{w}\t$imm", []>, OpSize16; 97b9ea7327SWang, Xin10 98b9ea7327SWang, Xin10def PUSH32i8 : Ii8<0x6a, RawFrm, (outs), (ins i32i8imm:$imm), 99b9ea7327SWang, Xin10 "push{l}\t$imm", []>, OpSize32, 100b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 10189ca4eb0SShengchen Kandef PUSH32i : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm), 102b9ea7327SWang, Xin10 "push{l}\t$imm", []>, OpSize32, 103b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 104b9ea7327SWang, Xin10} // mayStore, SchedRW 105b9ea7327SWang, Xin10 106b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteCopy] in { 107b9ea7327SWang, Xin10def PUSH16rmm: I<0xFF, MRM6m, (outs), (ins i16mem:$src), "push{w}\t$src", []>, 108b9ea7327SWang, Xin10 OpSize16; 109b9ea7327SWang, Xin10def PUSH32rmm: I<0xFF, MRM6m, (outs), (ins i32mem:$src), "push{l}\t$src", []>, 110b9ea7327SWang, Xin10 OpSize32, Requires<[Not64BitMode]>; 111b9ea7327SWang, Xin10} // mayLoad, mayStore, SchedRW 112b9ea7327SWang, Xin10 113b9ea7327SWang, Xin10} 114b9ea7327SWang, Xin10 115b9ea7327SWang, Xin10let isPseudo = 1, mayLoad = 1, mayStore = 1, 116b9ea7327SWang, Xin10 SchedRW = [WriteRMW], Defs = [ESP] in { 117b9ea7327SWang, Xin10 let Uses = [ESP] in 118b9ea7327SWang, Xin10 def RDFLAGS32 : PseudoI<(outs GR32:$dst), (ins), 119b9ea7327SWang, Xin10 [(set GR32:$dst, (int_x86_flags_read_u32))]>, 120b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 121b9ea7327SWang, Xin10 122b9ea7327SWang, Xin10 let Uses = [RSP] in 123b9ea7327SWang, Xin10 def RDFLAGS64 : PseudoI<(outs GR64:$dst), (ins), 124b9ea7327SWang, Xin10 [(set GR64:$dst, (int_x86_flags_read_u64))]>, 125b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 126b9ea7327SWang, Xin10} 127b9ea7327SWang, Xin10 128b9ea7327SWang, Xin10let isPseudo = 1, mayLoad = 1, mayStore = 1, 129b9ea7327SWang, Xin10 SchedRW = [WriteRMW] in { 130b9ea7327SWang, Xin10 let Defs = [ESP, EFLAGS, DF], Uses = [ESP] in 131b9ea7327SWang, Xin10 def WRFLAGS32 : PseudoI<(outs), (ins GR32:$src), 132b9ea7327SWang, Xin10 [(int_x86_flags_write_u32 GR32:$src)]>, 133b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 134b9ea7327SWang, Xin10 135b9ea7327SWang, Xin10 let Defs = [RSP, EFLAGS, DF], Uses = [RSP] in 136b9ea7327SWang, Xin10 def WRFLAGS64 : PseudoI<(outs), (ins GR64:$src), 137b9ea7327SWang, Xin10 [(int_x86_flags_write_u64 GR64:$src)]>, 138b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 139b9ea7327SWang, Xin10} 140b9ea7327SWang, Xin10 141b9ea7327SWang, Xin10let Defs = [ESP, EFLAGS, DF], Uses = [ESP], mayLoad = 1, hasSideEffects=0, 142b9ea7327SWang, Xin10 SchedRW = [WriteLoad] in { 143b9ea7327SWang, Xin10def POPF16 : I<0x9D, RawFrm, (outs), (ins), "popf{w}", []>, OpSize16; 144b9ea7327SWang, Xin10def POPF32 : I<0x9D, RawFrm, (outs), (ins), "popf{l|d}", []>, OpSize32, 145b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 146b9ea7327SWang, Xin10} 147b9ea7327SWang, Xin10 148b9ea7327SWang, Xin10let Defs = [ESP], Uses = [ESP, EFLAGS, DF], mayStore = 1, hasSideEffects=0, 149b9ea7327SWang, Xin10 SchedRW = [WriteStore] in { 150b9ea7327SWang, Xin10def PUSHF16 : I<0x9C, RawFrm, (outs), (ins), "pushf{w}", []>, OpSize16; 151b9ea7327SWang, Xin10def PUSHF32 : I<0x9C, RawFrm, (outs), (ins), "pushf{l|d}", []>, OpSize32, 152b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 153b9ea7327SWang, Xin10} 154b9ea7327SWang, Xin10 155b9ea7327SWang, Xin10let Defs = [RSP], Uses = [RSP], hasSideEffects=0 in { 156b9ea7327SWang, Xin10let mayLoad = 1, SchedRW = [WriteLoad] in { 157b9ea7327SWang, Xin10def POP64r : I<0x58, AddRegFrm, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>, 158b9ea7327SWang, Xin10 OpSize32, Requires<[In64BitMode]>; 159b9ea7327SWang, Xin10// Long form for the disassembler. 160b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1 in { 161b9ea7327SWang, Xin10def POP64rmr: I<0x8F, MRM0r, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>, 162b80ae654SShengchen Kan OpSize32, Requires<[In64BitMode]>; 163b9ea7327SWang, Xin10} // isCodeGenOnly = 1, ForceDisassemble = 1 164a3cab1faSShengchen Kandef POPP64r : I<0x58, AddRegFrm, (outs GR64:$reg), (ins), "popp\t$reg", []>, 165a3cab1faSShengchen Kan REX_W, ExplicitREX2Prefix, Requires<[In64BitMode]>; 1668c2537fdSShengchen Kandef POP2: I<0x8F, MRM0r, (outs GR64:$reg1, GR64:$reg2), (ins), 1678c2537fdSShengchen Kan "pop2\t{$reg2, $reg1|$reg1, $reg2}", 1686e20df1aSShengchen Kan []>, EVEX, VVVV, EVEX_B, T_MAP4; 1698c2537fdSShengchen Kandef POP2P: I<0x8F, MRM0r, (outs GR64:$reg1, GR64:$reg2), (ins), 1708c2537fdSShengchen Kan "pop2p\t{$reg2, $reg1|$reg1, $reg2}", 1716e20df1aSShengchen Kan []>, EVEX, VVVV, EVEX_B, T_MAP4, REX_W; 1728c2537fdSShengchen Kan 173b9ea7327SWang, Xin10} // mayLoad, SchedRW 174b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteCopy] in 175b9ea7327SWang, Xin10def POP64rmm: I<0x8F, MRM0m, (outs), (ins i64mem:$dst), "pop{q}\t$dst", []>, 176b9ea7327SWang, Xin10 OpSize32, Requires<[In64BitMode]>; 177b9ea7327SWang, Xin10let mayStore = 1, SchedRW = [WriteStore] in { 178b9ea7327SWang, Xin10def PUSH64r : I<0x50, AddRegFrm, (outs), (ins GR64:$reg), "push{q}\t$reg", []>, 179b9ea7327SWang, Xin10 OpSize32, Requires<[In64BitMode]>; 180b9ea7327SWang, Xin10// Long form for the disassembler. 181b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1 in { 182b9ea7327SWang, Xin10def PUSH64rmr: I<0xFF, MRM6r, (outs), (ins GR64:$reg), "push{q}\t$reg", []>, 183b80ae654SShengchen Kan OpSize32, Requires<[In64BitMode]>; 184b9ea7327SWang, Xin10} // isCodeGenOnly = 1, ForceDisassemble = 1 185a3cab1faSShengchen Kandef PUSHP64r : I<0x50, AddRegFrm, (outs), (ins GR64:$reg), "pushp\t$reg", []>, 186a3cab1faSShengchen Kan REX_W, ExplicitREX2Prefix, Requires<[In64BitMode]>; 1878c2537fdSShengchen Kandef PUSH2: I<0xFF, MRM6r, (outs), (ins GR64:$reg1, GR64:$reg2), 1888c2537fdSShengchen Kan "push2\t{$reg2, $reg1|$reg1, $reg2}", 1896e20df1aSShengchen Kan []>, EVEX, VVVV, EVEX_B, T_MAP4; 1908c2537fdSShengchen Kandef PUSH2P: I<0xFF, MRM6r, (outs), (ins GR64:$reg1, GR64:$reg2), 1918c2537fdSShengchen Kan "push2p\t{$reg2, $reg1|$reg1, $reg2}", 1926e20df1aSShengchen Kan []>, EVEX, VVVV, EVEX_B, T_MAP4, REX_W; 193b9ea7327SWang, Xin10} // mayStore, SchedRW 194b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteCopy] in { 195b9ea7327SWang, Xin10def PUSH64rmm: I<0xFF, MRM6m, (outs), (ins i64mem:$src), "push{q}\t$src", []>, 196b9ea7327SWang, Xin10 OpSize32, Requires<[In64BitMode]>; 197b9ea7327SWang, Xin10} // mayLoad, mayStore, SchedRW 198b9ea7327SWang, Xin10} 199b9ea7327SWang, Xin10 200b9ea7327SWang, Xin10let Defs = [RSP], Uses = [RSP], hasSideEffects = 0, mayStore = 1, 201b9ea7327SWang, Xin10 SchedRW = [WriteStore] in { 202b9ea7327SWang, Xin10def PUSH64i8 : Ii8<0x6a, RawFrm, (outs), (ins i64i8imm:$imm), 203b9ea7327SWang, Xin10 "push{q}\t$imm", []>, OpSize32, 204b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 205b9ea7327SWang, Xin10def PUSH64i32 : Ii32S<0x68, RawFrm, (outs), (ins i64i32imm:$imm), 206b9ea7327SWang, Xin10 "push{q}\t$imm", []>, OpSize32, 207b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 208b9ea7327SWang, Xin10} 209b9ea7327SWang, Xin10 210b9ea7327SWang, Xin10let Defs = [RSP, EFLAGS, DF], Uses = [RSP], mayLoad = 1, hasSideEffects=0 in 211b9ea7327SWang, Xin10def POPF64 : I<0x9D, RawFrm, (outs), (ins), "popfq", []>, 212b9ea7327SWang, Xin10 OpSize32, Requires<[In64BitMode]>, Sched<[WriteLoad]>; 213b9ea7327SWang, Xin10let Defs = [RSP], Uses = [RSP, EFLAGS, DF], mayStore = 1, hasSideEffects=0 in 214b9ea7327SWang, Xin10def PUSHF64 : I<0x9C, RawFrm, (outs), (ins), "pushfq", []>, 215b9ea7327SWang, Xin10 OpSize32, Requires<[In64BitMode]>, Sched<[WriteStore]>; 216b9ea7327SWang, Xin10 217b9ea7327SWang, Xin10let Defs = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP], Uses = [ESP], 218b9ea7327SWang, Xin10 mayLoad = 1, hasSideEffects = 0, SchedRW = [WriteLoad] in { 219b9ea7327SWang, Xin10def POPA32 : I<0x61, RawFrm, (outs), (ins), "popal", []>, 220b9ea7327SWang, Xin10 OpSize32, Requires<[Not64BitMode]>; 221b9ea7327SWang, Xin10def POPA16 : I<0x61, RawFrm, (outs), (ins), "popaw", []>, 222b9ea7327SWang, Xin10 OpSize16, Requires<[Not64BitMode]>; 223b9ea7327SWang, Xin10} 224b9ea7327SWang, Xin10let Defs = [ESP], Uses = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP], 225b9ea7327SWang, Xin10 mayStore = 1, hasSideEffects = 0, SchedRW = [WriteStore] in { 226b9ea7327SWang, Xin10def PUSHA32 : I<0x60, RawFrm, (outs), (ins), "pushal", []>, 227b9ea7327SWang, Xin10 OpSize32, Requires<[Not64BitMode]>; 228b9ea7327SWang, Xin10def PUSHA16 : I<0x60, RawFrm, (outs), (ins), "pushaw", []>, 229b9ea7327SWang, Xin10 OpSize16, Requires<[Not64BitMode]>; 230b9ea7327SWang, Xin10} 231b9ea7327SWang, Xin10 23202d56801SXinWang10let Constraints = "$src = $dst", SchedRW = [WriteBSWAP32], Predicates = [NoNDD_Or_NoMOVBE] in { 233b9ea7327SWang, Xin10// This instruction is a consequence of BSWAP32r observing operand size. The 234b9ea7327SWang, Xin10// encoding is valid, but the behavior is undefined. 235b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in 236b9ea7327SWang, Xin10def BSWAP16r_BAD : I<0xC8, AddRegFrm, (outs GR16:$dst), (ins GR16:$src), 237b9ea7327SWang, Xin10 "bswap{w}\t$dst", []>, OpSize16, TB; 238b9ea7327SWang, Xin10// GR32 = bswap GR32 239b9ea7327SWang, Xin10def BSWAP32r : I<0xC8, AddRegFrm, (outs GR32:$dst), (ins GR32:$src), 240b9ea7327SWang, Xin10 "bswap{l}\t$dst", 241b9ea7327SWang, Xin10 [(set GR32:$dst, (bswap GR32:$src))]>, OpSize32, TB; 242b9ea7327SWang, Xin10 243b9ea7327SWang, Xin10let SchedRW = [WriteBSWAP64] in 244b9ea7327SWang, Xin10def BSWAP64r : RI<0xC8, AddRegFrm, (outs GR64:$dst), (ins GR64:$src), 245b9ea7327SWang, Xin10 "bswap{q}\t$dst", 246b9ea7327SWang, Xin10 [(set GR64:$dst, (bswap GR64:$src))]>, TB; 247b9ea7327SWang, Xin10} // Constraints = "$src = $dst", SchedRW 248b9ea7327SWang, Xin10 249b9ea7327SWang, Xin10// Bit scan instructions. 250*90e9895aSSimon Pilgrimlet Defs = [EFLAGS], Constraints = "$fallback = $dst" in { 251*90e9895aSSimon Pilgrimdef BSF16rr : I<0xBC, MRMSrcReg, (outs GR16:$dst), (ins GR16:$fallback, GR16:$src), 252b9ea7327SWang, Xin10 "bsf{w}\t{$src, $dst|$dst, $src}", 253*90e9895aSSimon Pilgrim [(set GR16:$dst, EFLAGS, (X86bsf GR16:$fallback, GR16:$src))]>, 2546e20df1aSShengchen Kan TB, OpSize16, Sched<[WriteBSF]>; 255*90e9895aSSimon Pilgrimdef BSF16rm : I<0xBC, MRMSrcMem, (outs GR16:$dst), (ins GR16:$fallback, i16mem:$src), 256b9ea7327SWang, Xin10 "bsf{w}\t{$src, $dst|$dst, $src}", 257*90e9895aSSimon Pilgrim [(set GR16:$dst, EFLAGS, (X86bsf GR16:$fallback, (loadi16 addr:$src)))]>, 2586e20df1aSShengchen Kan TB, OpSize16, Sched<[WriteBSFLd]>; 259*90e9895aSSimon Pilgrimdef BSF32rr : I<0xBC, MRMSrcReg, (outs GR32:$dst), (ins GR32:$fallback, GR32:$src), 260b9ea7327SWang, Xin10 "bsf{l}\t{$src, $dst|$dst, $src}", 261*90e9895aSSimon Pilgrim [(set GR32:$dst, EFLAGS, (X86bsf GR32:$fallback, GR32:$src))]>, 2626e20df1aSShengchen Kan TB, OpSize32, Sched<[WriteBSF]>; 263*90e9895aSSimon Pilgrimdef BSF32rm : I<0xBC, MRMSrcMem, (outs GR32:$dst), (ins GR32:$fallback, i32mem:$src), 264b9ea7327SWang, Xin10 "bsf{l}\t{$src, $dst|$dst, $src}", 265*90e9895aSSimon Pilgrim [(set GR32:$dst, EFLAGS, (X86bsf GR32:$fallback, (loadi32 addr:$src)))]>, 2666e20df1aSShengchen Kan TB, OpSize32, Sched<[WriteBSFLd]>; 267*90e9895aSSimon Pilgrimdef BSF64rr : RI<0xBC, MRMSrcReg, (outs GR64:$dst), (ins GR64:$fallback, GR64:$src), 268b9ea7327SWang, Xin10 "bsf{q}\t{$src, $dst|$dst, $src}", 269*90e9895aSSimon Pilgrim [(set GR64:$dst, EFLAGS, (X86bsf GR64:$fallback, GR64:$src))]>, 2706e20df1aSShengchen Kan TB, Sched<[WriteBSF]>; 271*90e9895aSSimon Pilgrimdef BSF64rm : RI<0xBC, MRMSrcMem, (outs GR64:$dst), (ins GR64:$fallback, i64mem:$src), 272b9ea7327SWang, Xin10 "bsf{q}\t{$src, $dst|$dst, $src}", 273*90e9895aSSimon Pilgrim [(set GR64:$dst, EFLAGS, (X86bsf GR64:$fallback, (loadi64 addr:$src)))]>, 2746e20df1aSShengchen Kan TB, Sched<[WriteBSFLd]>; 275b9ea7327SWang, Xin10 276*90e9895aSSimon Pilgrimdef BSR16rr : I<0xBD, MRMSrcReg, (outs GR16:$dst), (ins GR16:$fallback, GR16:$src), 277b9ea7327SWang, Xin10 "bsr{w}\t{$src, $dst|$dst, $src}", 278*90e9895aSSimon Pilgrim [(set GR16:$dst, EFLAGS, (X86bsr GR16:$fallback, GR16:$src))]>, 2796e20df1aSShengchen Kan TB, OpSize16, Sched<[WriteBSR]>; 280*90e9895aSSimon Pilgrimdef BSR16rm : I<0xBD, MRMSrcMem, (outs GR16:$dst), (ins GR16:$fallback, i16mem:$src), 281b9ea7327SWang, Xin10 "bsr{w}\t{$src, $dst|$dst, $src}", 282*90e9895aSSimon Pilgrim [(set GR16:$dst, EFLAGS, (X86bsr GR16:$fallback, (loadi16 addr:$src)))]>, 2836e20df1aSShengchen Kan TB, OpSize16, Sched<[WriteBSRLd]>; 284*90e9895aSSimon Pilgrimdef BSR32rr : I<0xBD, MRMSrcReg, (outs GR32:$dst), (ins GR32:$fallback, GR32:$src), 285b9ea7327SWang, Xin10 "bsr{l}\t{$src, $dst|$dst, $src}", 286*90e9895aSSimon Pilgrim [(set GR32:$dst, EFLAGS, (X86bsr GR32:$fallback, GR32:$src))]>, 2876e20df1aSShengchen Kan TB, OpSize32, Sched<[WriteBSR]>; 288*90e9895aSSimon Pilgrimdef BSR32rm : I<0xBD, MRMSrcMem, (outs GR32:$dst), (ins GR32:$fallback, i32mem:$src), 289b9ea7327SWang, Xin10 "bsr{l}\t{$src, $dst|$dst, $src}", 290*90e9895aSSimon Pilgrim [(set GR32:$dst, EFLAGS, (X86bsr GR32:$fallback, (loadi32 addr:$src)))]>, 2916e20df1aSShengchen Kan TB, OpSize32, Sched<[WriteBSRLd]>; 292*90e9895aSSimon Pilgrimdef BSR64rr : RI<0xBD, MRMSrcReg, (outs GR64:$dst), (ins GR64:$fallback, GR64:$src), 293b9ea7327SWang, Xin10 "bsr{q}\t{$src, $dst|$dst, $src}", 294*90e9895aSSimon Pilgrim [(set GR64:$dst, EFLAGS, (X86bsr GR64:$fallback, GR64:$src))]>, 2956e20df1aSShengchen Kan TB, Sched<[WriteBSR]>; 296*90e9895aSSimon Pilgrimdef BSR64rm : RI<0xBD, MRMSrcMem, (outs GR64:$dst), (ins GR64:$fallback, i64mem:$src), 297b9ea7327SWang, Xin10 "bsr{q}\t{$src, $dst|$dst, $src}", 298*90e9895aSSimon Pilgrim [(set GR64:$dst, EFLAGS, (X86bsr GR64:$fallback, (loadi64 addr:$src)))]>, 2996e20df1aSShengchen Kan TB, Sched<[WriteBSRLd]>; 300b9ea7327SWang, Xin10} // Defs = [EFLAGS] 301b9ea7327SWang, Xin10 302b9ea7327SWang, Xin10let SchedRW = [WriteMicrocoded] in { 303b9ea7327SWang, Xin10let Defs = [EDI,ESI], Uses = [EDI,ESI,DF] in { 304b9ea7327SWang, Xin10def MOVSB : I<0xA4, RawFrmDstSrc, (outs), (ins dstidx8:$dst, srcidx8:$src), 305b9ea7327SWang, Xin10 "movsb\t{$src, $dst|$dst, $src}", []>; 306b9ea7327SWang, Xin10def MOVSW : I<0xA5, RawFrmDstSrc, (outs), (ins dstidx16:$dst, srcidx16:$src), 307b9ea7327SWang, Xin10 "movsw\t{$src, $dst|$dst, $src}", []>, OpSize16; 308b9ea7327SWang, Xin10def MOVSL : I<0xA5, RawFrmDstSrc, (outs), (ins dstidx32:$dst, srcidx32:$src), 309b9ea7327SWang, Xin10 "movs{l|d}\t{$src, $dst|$dst, $src}", []>, OpSize32; 310b9ea7327SWang, Xin10def MOVSQ : RI<0xA5, RawFrmDstSrc, (outs), (ins dstidx64:$dst, srcidx64:$src), 311b9ea7327SWang, Xin10 "movsq\t{$src, $dst|$dst, $src}", []>, 312b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 313b9ea7327SWang, Xin10} 314b9ea7327SWang, Xin10 315b9ea7327SWang, Xin10let Defs = [EDI], Uses = [AL,EDI,DF] in 316b9ea7327SWang, Xin10def STOSB : I<0xAA, RawFrmDst, (outs), (ins dstidx8:$dst), 317b9ea7327SWang, Xin10 "stosb\t{%al, $dst|$dst, al}", []>; 318b9ea7327SWang, Xin10let Defs = [EDI], Uses = [AX,EDI,DF] in 319b9ea7327SWang, Xin10def STOSW : I<0xAB, RawFrmDst, (outs), (ins dstidx16:$dst), 320b9ea7327SWang, Xin10 "stosw\t{%ax, $dst|$dst, ax}", []>, OpSize16; 321b9ea7327SWang, Xin10let Defs = [EDI], Uses = [EAX,EDI,DF] in 322b9ea7327SWang, Xin10def STOSL : I<0xAB, RawFrmDst, (outs), (ins dstidx32:$dst), 323b9ea7327SWang, Xin10 "stos{l|d}\t{%eax, $dst|$dst, eax}", []>, OpSize32; 324b9ea7327SWang, Xin10let Defs = [RDI], Uses = [RAX,RDI,DF] in 325b9ea7327SWang, Xin10def STOSQ : RI<0xAB, RawFrmDst, (outs), (ins dstidx64:$dst), 326b9ea7327SWang, Xin10 "stosq\t{%rax, $dst|$dst, rax}", []>, 327b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 328b9ea7327SWang, Xin10 329b9ea7327SWang, Xin10let Defs = [EDI,EFLAGS], Uses = [AL,EDI,DF] in 330b9ea7327SWang, Xin10def SCASB : I<0xAE, RawFrmDst, (outs), (ins dstidx8:$dst), 331b9ea7327SWang, Xin10 "scasb\t{$dst, %al|al, $dst}", []>; 332b9ea7327SWang, Xin10let Defs = [EDI,EFLAGS], Uses = [AX,EDI,DF] in 333b9ea7327SWang, Xin10def SCASW : I<0xAF, RawFrmDst, (outs), (ins dstidx16:$dst), 334b9ea7327SWang, Xin10 "scasw\t{$dst, %ax|ax, $dst}", []>, OpSize16; 335b9ea7327SWang, Xin10let Defs = [EDI,EFLAGS], Uses = [EAX,EDI,DF] in 336b9ea7327SWang, Xin10def SCASL : I<0xAF, RawFrmDst, (outs), (ins dstidx32:$dst), 337b9ea7327SWang, Xin10 "scas{l|d}\t{$dst, %eax|eax, $dst}", []>, OpSize32; 338b9ea7327SWang, Xin10let Defs = [EDI,EFLAGS], Uses = [RAX,EDI,DF] in 339b9ea7327SWang, Xin10def SCASQ : RI<0xAF, RawFrmDst, (outs), (ins dstidx64:$dst), 340b9ea7327SWang, Xin10 "scasq\t{$dst, %rax|rax, $dst}", []>, 341b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 342b9ea7327SWang, Xin10 343b9ea7327SWang, Xin10let Defs = [EDI,ESI,EFLAGS], Uses = [EDI,ESI,DF] in { 344b9ea7327SWang, Xin10def CMPSB : I<0xA6, RawFrmDstSrc, (outs), (ins dstidx8:$dst, srcidx8:$src), 345b9ea7327SWang, Xin10 "cmpsb\t{$dst, $src|$src, $dst}", []>; 346b9ea7327SWang, Xin10def CMPSW : I<0xA7, RawFrmDstSrc, (outs), (ins dstidx16:$dst, srcidx16:$src), 347b9ea7327SWang, Xin10 "cmpsw\t{$dst, $src|$src, $dst}", []>, OpSize16; 348b9ea7327SWang, Xin10def CMPSL : I<0xA7, RawFrmDstSrc, (outs), (ins dstidx32:$dst, srcidx32:$src), 349b9ea7327SWang, Xin10 "cmps{l|d}\t{$dst, $src|$src, $dst}", []>, OpSize32; 350b9ea7327SWang, Xin10def CMPSQ : RI<0xA7, RawFrmDstSrc, (outs), (ins dstidx64:$dst, srcidx64:$src), 351b9ea7327SWang, Xin10 "cmpsq\t{$dst, $src|$src, $dst}", []>, 352b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 353b9ea7327SWang, Xin10} 354b9ea7327SWang, Xin10} // SchedRW 355b9ea7327SWang, Xin10 356b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 357b9ea7327SWang, Xin10// Move Instructions. 358b9ea7327SWang, Xin10// 359b9ea7327SWang, Xin10let SchedRW = [WriteMove] in { 360b9ea7327SWang, Xin10let hasSideEffects = 0, isMoveReg = 1 in { 361b9ea7327SWang, Xin10def MOV8rr : I<0x88, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src), 362b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", []>; 363b9ea7327SWang, Xin10def MOV16rr : I<0x89, MRMDestReg, (outs GR16:$dst), (ins GR16:$src), 364b9ea7327SWang, Xin10 "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize16; 365b9ea7327SWang, Xin10def MOV32rr : I<0x89, MRMDestReg, (outs GR32:$dst), (ins GR32:$src), 366b9ea7327SWang, Xin10 "mov{l}\t{$src, $dst|$dst, $src}", []>, OpSize32; 367b9ea7327SWang, Xin10def MOV64rr : RI<0x89, MRMDestReg, (outs GR64:$dst), (ins GR64:$src), 368b9ea7327SWang, Xin10 "mov{q}\t{$src, $dst|$dst, $src}", []>; 369b9ea7327SWang, Xin10} 370b9ea7327SWang, Xin10 371b9ea7327SWang, Xin10let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 372b9ea7327SWang, Xin10def MOV8ri : Ii8 <0xB0, AddRegFrm, (outs GR8 :$dst), (ins i8imm :$src), 373b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", 374b9ea7327SWang, Xin10 [(set GR8:$dst, imm:$src)]>; 375b9ea7327SWang, Xin10def MOV16ri : Ii16<0xB8, AddRegFrm, (outs GR16:$dst), (ins i16imm:$src), 376b9ea7327SWang, Xin10 "mov{w}\t{$src, $dst|$dst, $src}", 377b9ea7327SWang, Xin10 [(set GR16:$dst, imm:$src)]>, OpSize16; 378b9ea7327SWang, Xin10def MOV32ri : Ii32<0xB8, AddRegFrm, (outs GR32:$dst), (ins i32imm:$src), 379b9ea7327SWang, Xin10 "mov{l}\t{$src, $dst|$dst, $src}", 380b9ea7327SWang, Xin10 [(set GR32:$dst, imm:$src)]>, OpSize32; 381b9ea7327SWang, Xin10def MOV64ri32 : RIi32S<0xC7, MRM0r, (outs GR64:$dst), (ins i64i32imm:$src), 382b9ea7327SWang, Xin10 "mov{q}\t{$src, $dst|$dst, $src}", 383b9ea7327SWang, Xin10 [(set GR64:$dst, i64immSExt32:$src)]>; 384b9ea7327SWang, Xin10} 385b9ea7327SWang, Xin10let isReMaterializable = 1, isMoveImm = 1 in { 386b9ea7327SWang, Xin10def MOV64ri : RIi64<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64imm:$src), 387b9ea7327SWang, Xin10 "movabs{q}\t{$src, $dst|$dst, $src}", 388b9ea7327SWang, Xin10 [(set GR64:$dst, imm:$src)]>; 389b9ea7327SWang, Xin10} 390b9ea7327SWang, Xin10 391b9ea7327SWang, Xin10// Longer forms that use a ModR/M byte. Needed for disassembler 392b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in { 393b9ea7327SWang, Xin10def MOV8ri_alt : Ii8 <0xC6, MRM0r, (outs GR8 :$dst), (ins i8imm :$src), 3941e75ce42SShengchen Kan "mov{b}\t{$src, $dst|$dst, $src}", []>; 395b9ea7327SWang, Xin10def MOV16ri_alt : Ii16<0xC7, MRM0r, (outs GR16:$dst), (ins i16imm:$src), 3961e75ce42SShengchen Kan "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize16; 397b9ea7327SWang, Xin10def MOV32ri_alt : Ii32<0xC7, MRM0r, (outs GR32:$dst), (ins i32imm:$src), 3981e75ce42SShengchen Kan "mov{l}\t{$src, $dst|$dst, $src}", []>, OpSize32; 399b9ea7327SWang, Xin10} 400b9ea7327SWang, Xin10} // SchedRW 401b9ea7327SWang, Xin10 402b9ea7327SWang, Xin10let SchedRW = [WriteStore] in { 403b9ea7327SWang, Xin10def MOV8mi : Ii8 <0xC6, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src), 404b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", 405b9ea7327SWang, Xin10 [(store (i8 imm_su:$src), addr:$dst)]>; 406b9ea7327SWang, Xin10def MOV16mi : Ii16<0xC7, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src), 407b9ea7327SWang, Xin10 "mov{w}\t{$src, $dst|$dst, $src}", 408b9ea7327SWang, Xin10 [(store (i16 imm_su:$src), addr:$dst)]>, OpSize16; 409b9ea7327SWang, Xin10def MOV32mi : Ii32<0xC7, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src), 410b9ea7327SWang, Xin10 "mov{l}\t{$src, $dst|$dst, $src}", 411b9ea7327SWang, Xin10 [(store (i32 imm_su:$src), addr:$dst)]>, OpSize32; 412b9ea7327SWang, Xin10def MOV64mi32 : RIi32S<0xC7, MRM0m, (outs), (ins i64mem:$dst, i64i32imm:$src), 413b9ea7327SWang, Xin10 "mov{q}\t{$src, $dst|$dst, $src}", 414b9ea7327SWang, Xin10 [(store i64immSExt32_su:$src, addr:$dst)]>, 415b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 416b9ea7327SWang, Xin10} // SchedRW 417b9ea7327SWang, Xin10 418b9ea7327SWang, Xin10def : Pat<(i32 relocImm:$src), (MOV32ri relocImm:$src)>; 419b9ea7327SWang, Xin10def : Pat<(i64 relocImm:$src), (MOV64ri relocImm:$src)>; 420b9ea7327SWang, Xin10 421b9ea7327SWang, Xin10def : Pat<(store (i8 relocImm8_su:$src), addr:$dst), 422b9ea7327SWang, Xin10 (MOV8mi addr:$dst, relocImm8_su:$src)>; 423b9ea7327SWang, Xin10def : Pat<(store (i16 relocImm16_su:$src), addr:$dst), 424b9ea7327SWang, Xin10 (MOV16mi addr:$dst, relocImm16_su:$src)>; 425b9ea7327SWang, Xin10def : Pat<(store (i32 relocImm32_su:$src), addr:$dst), 426b9ea7327SWang, Xin10 (MOV32mi addr:$dst, relocImm32_su:$src)>; 427b9ea7327SWang, Xin10def : Pat<(store (i64 i64relocImmSExt32_su:$src), addr:$dst), 428b9ea7327SWang, Xin10 (MOV64mi32 addr:$dst, i64immSExt32_su:$src)>; 429b9ea7327SWang, Xin10 430b9ea7327SWang, Xin10let hasSideEffects = 0 in { 431b9ea7327SWang, Xin10 432b9ea7327SWang, Xin10/// Memory offset versions of moves. The immediate is an address mode sized 433b9ea7327SWang, Xin10/// offset from the segment base. 434b9ea7327SWang, Xin10let SchedRW = [WriteALU] in { 435b9ea7327SWang, Xin10let mayLoad = 1 in { 436b9ea7327SWang, Xin10let Defs = [AL] in 437b9ea7327SWang, Xin10def MOV8ao32 : Ii32<0xA0, RawFrmMemOffs, (outs), (ins offset32_8:$src), 438b9ea7327SWang, Xin10 "mov{b}\t{$src, %al|al, $src}", []>, 439b9ea7327SWang, Xin10 AdSize32; 440b9ea7327SWang, Xin10let Defs = [AX] in 441b9ea7327SWang, Xin10def MOV16ao32 : Ii32<0xA1, RawFrmMemOffs, (outs), (ins offset32_16:$src), 442b9ea7327SWang, Xin10 "mov{w}\t{$src, %ax|ax, $src}", []>, 443b9ea7327SWang, Xin10 OpSize16, AdSize32; 444b9ea7327SWang, Xin10let Defs = [EAX] in 445b9ea7327SWang, Xin10def MOV32ao32 : Ii32<0xA1, RawFrmMemOffs, (outs), (ins offset32_32:$src), 446b9ea7327SWang, Xin10 "mov{l}\t{$src, %eax|eax, $src}", []>, 447b9ea7327SWang, Xin10 OpSize32, AdSize32; 448b9ea7327SWang, Xin10let Defs = [RAX] in 449b9ea7327SWang, Xin10def MOV64ao32 : RIi32<0xA1, RawFrmMemOffs, (outs), (ins offset32_64:$src), 450b9ea7327SWang, Xin10 "mov{q}\t{$src, %rax|rax, $src}", []>, 451b9ea7327SWang, Xin10 AdSize32; 452b9ea7327SWang, Xin10 453b9ea7327SWang, Xin10let Defs = [AL] in 454b9ea7327SWang, Xin10def MOV8ao16 : Ii16<0xA0, RawFrmMemOffs, (outs), (ins offset16_8:$src), 455b9ea7327SWang, Xin10 "mov{b}\t{$src, %al|al, $src}", []>, AdSize16; 456b9ea7327SWang, Xin10let Defs = [AX] in 457b9ea7327SWang, Xin10def MOV16ao16 : Ii16<0xA1, RawFrmMemOffs, (outs), (ins offset16_16:$src), 458b9ea7327SWang, Xin10 "mov{w}\t{$src, %ax|ax, $src}", []>, 459b9ea7327SWang, Xin10 OpSize16, AdSize16; 460b9ea7327SWang, Xin10let Defs = [EAX] in 461b9ea7327SWang, Xin10def MOV32ao16 : Ii16<0xA1, RawFrmMemOffs, (outs), (ins offset16_32:$src), 462b9ea7327SWang, Xin10 "mov{l}\t{$src, %eax|eax, $src}", []>, 463b9ea7327SWang, Xin10 AdSize16, OpSize32; 464b9ea7327SWang, Xin10} // mayLoad 465b9ea7327SWang, Xin10let mayStore = 1 in { 466b9ea7327SWang, Xin10let Uses = [AL] in 467b9ea7327SWang, Xin10def MOV8o32a : Ii32<0xA2, RawFrmMemOffs, (outs), (ins offset32_8:$dst), 468b9ea7327SWang, Xin10 "mov{b}\t{%al, $dst|$dst, al}", []>, AdSize32; 469b9ea7327SWang, Xin10let Uses = [AX] in 470b9ea7327SWang, Xin10def MOV16o32a : Ii32<0xA3, RawFrmMemOffs, (outs), (ins offset32_16:$dst), 471b9ea7327SWang, Xin10 "mov{w}\t{%ax, $dst|$dst, ax}", []>, 472b9ea7327SWang, Xin10 OpSize16, AdSize32; 473b9ea7327SWang, Xin10let Uses = [EAX] in 474b9ea7327SWang, Xin10def MOV32o32a : Ii32<0xA3, RawFrmMemOffs, (outs), (ins offset32_32:$dst), 475b9ea7327SWang, Xin10 "mov{l}\t{%eax, $dst|$dst, eax}", []>, 476b9ea7327SWang, Xin10 OpSize32, AdSize32; 477b9ea7327SWang, Xin10let Uses = [RAX] in 478b9ea7327SWang, Xin10def MOV64o32a : RIi32<0xA3, RawFrmMemOffs, (outs), (ins offset32_64:$dst), 479b9ea7327SWang, Xin10 "mov{q}\t{%rax, $dst|$dst, rax}", []>, 480b9ea7327SWang, Xin10 AdSize32; 481b9ea7327SWang, Xin10 482b9ea7327SWang, Xin10let Uses = [AL] in 483b9ea7327SWang, Xin10def MOV8o16a : Ii16<0xA2, RawFrmMemOffs, (outs), (ins offset16_8:$dst), 484b9ea7327SWang, Xin10 "mov{b}\t{%al, $dst|$dst, al}", []>, AdSize16; 485b9ea7327SWang, Xin10let Uses = [AX] in 486b9ea7327SWang, Xin10def MOV16o16a : Ii16<0xA3, RawFrmMemOffs, (outs), (ins offset16_16:$dst), 487b9ea7327SWang, Xin10 "mov{w}\t{%ax, $dst|$dst, ax}", []>, 488b9ea7327SWang, Xin10 OpSize16, AdSize16; 489b9ea7327SWang, Xin10let Uses = [EAX] in 490b9ea7327SWang, Xin10def MOV32o16a : Ii16<0xA3, RawFrmMemOffs, (outs), (ins offset16_32:$dst), 491b9ea7327SWang, Xin10 "mov{l}\t{%eax, $dst|$dst, eax}", []>, 492b9ea7327SWang, Xin10 OpSize32, AdSize16; 493b9ea7327SWang, Xin10} // mayStore 494b9ea7327SWang, Xin10 495b9ea7327SWang, Xin10// These forms all have full 64-bit absolute addresses in their instructions 496b9ea7327SWang, Xin10// and use the movabs mnemonic to indicate this specific form. 497b9ea7327SWang, Xin10let mayLoad = 1 in { 498b9ea7327SWang, Xin10let Defs = [AL] in 499b9ea7327SWang, Xin10def MOV8ao64 : Ii64<0xA0, RawFrmMemOffs, (outs), (ins offset64_8:$src), 500b9ea7327SWang, Xin10 "movabs{b}\t{$src, %al|al, $src}", []>, 501b9ea7327SWang, Xin10 AdSize64; 502b9ea7327SWang, Xin10let Defs = [AX] in 503b9ea7327SWang, Xin10def MOV16ao64 : Ii64<0xA1, RawFrmMemOffs, (outs), (ins offset64_16:$src), 504b9ea7327SWang, Xin10 "movabs{w}\t{$src, %ax|ax, $src}", []>, 505b9ea7327SWang, Xin10 OpSize16, AdSize64; 506b9ea7327SWang, Xin10let Defs = [EAX] in 507b9ea7327SWang, Xin10def MOV32ao64 : Ii64<0xA1, RawFrmMemOffs, (outs), (ins offset64_32:$src), 508b9ea7327SWang, Xin10 "movabs{l}\t{$src, %eax|eax, $src}", []>, 509b9ea7327SWang, Xin10 OpSize32, AdSize64; 510b9ea7327SWang, Xin10let Defs = [RAX] in 511b9ea7327SWang, Xin10def MOV64ao64 : RIi64<0xA1, RawFrmMemOffs, (outs), (ins offset64_64:$src), 512b9ea7327SWang, Xin10 "movabs{q}\t{$src, %rax|rax, $src}", []>, 513b9ea7327SWang, Xin10 AdSize64; 514b9ea7327SWang, Xin10} // mayLoad 515b9ea7327SWang, Xin10 516b9ea7327SWang, Xin10let mayStore = 1 in { 517b9ea7327SWang, Xin10let Uses = [AL] in 518b9ea7327SWang, Xin10def MOV8o64a : Ii64<0xA2, RawFrmMemOffs, (outs), (ins offset64_8:$dst), 519b9ea7327SWang, Xin10 "movabs{b}\t{%al, $dst|$dst, al}", []>, 520b9ea7327SWang, Xin10 AdSize64; 521b9ea7327SWang, Xin10let Uses = [AX] in 522b9ea7327SWang, Xin10def MOV16o64a : Ii64<0xA3, RawFrmMemOffs, (outs), (ins offset64_16:$dst), 523b9ea7327SWang, Xin10 "movabs{w}\t{%ax, $dst|$dst, ax}", []>, 524b9ea7327SWang, Xin10 OpSize16, AdSize64; 525b9ea7327SWang, Xin10let Uses = [EAX] in 526b9ea7327SWang, Xin10def MOV32o64a : Ii64<0xA3, RawFrmMemOffs, (outs), (ins offset64_32:$dst), 527b9ea7327SWang, Xin10 "movabs{l}\t{%eax, $dst|$dst, eax}", []>, 528b9ea7327SWang, Xin10 OpSize32, AdSize64; 529b9ea7327SWang, Xin10let Uses = [RAX] in 530b9ea7327SWang, Xin10def MOV64o64a : RIi64<0xA3, RawFrmMemOffs, (outs), (ins offset64_64:$dst), 531b9ea7327SWang, Xin10 "movabs{q}\t{%rax, $dst|$dst, rax}", []>, 532b9ea7327SWang, Xin10 AdSize64; 533b9ea7327SWang, Xin10} // mayStore 534b9ea7327SWang, Xin10} // SchedRW 535b9ea7327SWang, Xin10} // hasSideEffects = 0 536b9ea7327SWang, Xin10 537b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, 538b9ea7327SWang, Xin10 SchedRW = [WriteMove], isMoveReg = 1 in { 539b9ea7327SWang, Xin10def MOV8rr_REV : I<0x8A, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src), 5401e75ce42SShengchen Kan "mov{b}\t{$src, $dst|$dst, $src}", []>; 541b9ea7327SWang, Xin10def MOV16rr_REV : I<0x8B, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src), 5421e75ce42SShengchen Kan "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize16; 543b9ea7327SWang, Xin10def MOV32rr_REV : I<0x8B, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src), 5441e75ce42SShengchen Kan "mov{l}\t{$src, $dst|$dst, $src}", []>, OpSize32; 545b9ea7327SWang, Xin10def MOV64rr_REV : RI<0x8B, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src), 5461e75ce42SShengchen Kan "mov{q}\t{$src, $dst|$dst, $src}", []>; 547b9ea7327SWang, Xin10} 548b9ea7327SWang, Xin10 549b9ea7327SWang, Xin10let canFoldAsLoad = 1, isReMaterializable = 1, SchedRW = [WriteLoad] in { 550b9ea7327SWang, Xin10def MOV8rm : I<0x8A, MRMSrcMem, (outs GR8 :$dst), (ins i8mem :$src), 551b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", 552b9ea7327SWang, Xin10 [(set GR8:$dst, (loadi8 addr:$src))]>; 553b9ea7327SWang, Xin10def MOV16rm : I<0x8B, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src), 554b9ea7327SWang, Xin10 "mov{w}\t{$src, $dst|$dst, $src}", 555b9ea7327SWang, Xin10 [(set GR16:$dst, (loadi16 addr:$src))]>, OpSize16; 556b9ea7327SWang, Xin10def MOV32rm : I<0x8B, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src), 557b9ea7327SWang, Xin10 "mov{l}\t{$src, $dst|$dst, $src}", 558b9ea7327SWang, Xin10 [(set GR32:$dst, (loadi32 addr:$src))]>, OpSize32; 559b9ea7327SWang, Xin10def MOV64rm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 560b9ea7327SWang, Xin10 "mov{q}\t{$src, $dst|$dst, $src}", 561b9ea7327SWang, Xin10 [(set GR64:$dst, (load addr:$src))]>; 562b9ea7327SWang, Xin10} 563b9ea7327SWang, Xin10 564b9ea7327SWang, Xin10let SchedRW = [WriteStore] in { 565b9ea7327SWang, Xin10def MOV8mr : I<0x88, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src), 566b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", 567b9ea7327SWang, Xin10 [(store GR8:$src, addr:$dst)]>; 568b9ea7327SWang, Xin10def MOV16mr : I<0x89, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src), 569b9ea7327SWang, Xin10 "mov{w}\t{$src, $dst|$dst, $src}", 570b9ea7327SWang, Xin10 [(store GR16:$src, addr:$dst)]>, OpSize16; 571b9ea7327SWang, Xin10def MOV32mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src), 572b9ea7327SWang, Xin10 "mov{l}\t{$src, $dst|$dst, $src}", 573b9ea7327SWang, Xin10 [(store GR32:$src, addr:$dst)]>, OpSize32; 574b9ea7327SWang, Xin10def MOV64mr : RI<0x89, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), 575b9ea7327SWang, Xin10 "mov{q}\t{$src, $dst|$dst, $src}", 576b9ea7327SWang, Xin10 [(store GR64:$src, addr:$dst)]>; 577b9ea7327SWang, Xin10} // SchedRW 578b9ea7327SWang, Xin10 579b9ea7327SWang, Xin10// Versions of MOV8rr, MOV8mr, and MOV8rm that use i8mem_NOREX and GR8_NOREX so 580b9ea7327SWang, Xin10// that they can be used for copying and storing h registers, which can't be 581b9ea7327SWang, Xin10// encoded when a REX prefix is present. 582b9ea7327SWang, Xin10let isCodeGenOnly = 1 in { 583b9ea7327SWang, Xin10let hasSideEffects = 0, isMoveReg = 1 in 584b9ea7327SWang, Xin10def MOV8rr_NOREX : I<0x88, MRMDestReg, 585b9ea7327SWang, Xin10 (outs GR8_NOREX:$dst), (ins GR8_NOREX:$src), 586b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", []>, 587b9ea7327SWang, Xin10 Sched<[WriteMove]>; 588b9ea7327SWang, Xin10let mayStore = 1, hasSideEffects = 0 in 589b9ea7327SWang, Xin10def MOV8mr_NOREX : I<0x88, MRMDestMem, 590b9ea7327SWang, Xin10 (outs), (ins i8mem_NOREX:$dst, GR8_NOREX:$src), 591b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", []>, 592b9ea7327SWang, Xin10 Sched<[WriteStore]>; 593b9ea7327SWang, Xin10let mayLoad = 1, hasSideEffects = 0, 594b9ea7327SWang, Xin10 canFoldAsLoad = 1, isReMaterializable = 1 in 595b9ea7327SWang, Xin10def MOV8rm_NOREX : I<0x8A, MRMSrcMem, 596b9ea7327SWang, Xin10 (outs GR8_NOREX:$dst), (ins i8mem_NOREX:$src), 597b9ea7327SWang, Xin10 "mov{b}\t{$src, $dst|$dst, $src}", []>, 598b9ea7327SWang, Xin10 Sched<[WriteLoad]>; 599b9ea7327SWang, Xin10} 600b9ea7327SWang, Xin10 601b9ea7327SWang, Xin10 602b9ea7327SWang, Xin10// Condition code ops, incl. set if equal/not equal/... 603b9ea7327SWang, Xin10let SchedRW = [WriteLAHFSAHF] in { 604b9ea7327SWang, Xin10let Defs = [EFLAGS], Uses = [AH], hasSideEffects = 0 in 605b9ea7327SWang, Xin10def SAHF : I<0x9E, RawFrm, (outs), (ins), "sahf", []>, // flags = AH 606b9ea7327SWang, Xin10 Requires<[HasLAHFSAHF]>; 607b9ea7327SWang, Xin10let Defs = [AH], Uses = [EFLAGS], hasSideEffects = 0 in 608b9ea7327SWang, Xin10def LAHF : I<0x9F, RawFrm, (outs), (ins), "lahf", []>, // AH = flags 609b9ea7327SWang, Xin10 Requires<[HasLAHFSAHF]>; 610b9ea7327SWang, Xin10} // SchedRW 611b9ea7327SWang, Xin10 612b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 613b9ea7327SWang, Xin10// Bit tests instructions: BT, BTS, BTR, BTC. 614b9ea7327SWang, Xin10 615b9ea7327SWang, Xin10let Defs = [EFLAGS] in { 616b9ea7327SWang, Xin10let SchedRW = [WriteBitTest] in { 617b9ea7327SWang, Xin10def BT16rr : I<0xA3, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2), 618b9ea7327SWang, Xin10 "bt{w}\t{$src2, $src1|$src1, $src2}", 619b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt GR16:$src1, GR16:$src2))]>, 620b80ae654SShengchen Kan OpSize16, TB; 621b9ea7327SWang, Xin10def BT32rr : I<0xA3, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2), 622b9ea7327SWang, Xin10 "bt{l}\t{$src2, $src1|$src1, $src2}", 623b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt GR32:$src1, GR32:$src2))]>, 624b80ae654SShengchen Kan OpSize32, TB; 625b9ea7327SWang, Xin10def BT64rr : RI<0xA3, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2), 626b9ea7327SWang, Xin10 "bt{q}\t{$src2, $src1|$src1, $src2}", 627b80ae654SShengchen Kan [(set EFLAGS, (X86bt GR64:$src1, GR64:$src2))]>, TB; 628b9ea7327SWang, Xin10} // SchedRW 629b9ea7327SWang, Xin10 630b9ea7327SWang, Xin10// Unlike with the register+register form, the memory+register form of the 631b9ea7327SWang, Xin10// bt instruction does not ignore the high bits of the index. From ISel's 632b9ea7327SWang, Xin10// perspective, this is pretty bizarre. Make these instructions disassembly 633b9ea7327SWang, Xin10// only for now. These instructions are also slow on modern CPUs so that's 634b9ea7327SWang, Xin10// another reason to avoid generating them. 635b9ea7327SWang, Xin10 636b9ea7327SWang, Xin10let mayLoad = 1, hasSideEffects = 0, SchedRW = [WriteBitTestRegLd] in { 637b9ea7327SWang, Xin10 def BT16mr : I<0xA3, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2), 638b9ea7327SWang, Xin10 "bt{w}\t{$src2, $src1|$src1, $src2}", 639b80ae654SShengchen Kan []>, OpSize16, TB; 640b9ea7327SWang, Xin10 def BT32mr : I<0xA3, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2), 641b9ea7327SWang, Xin10 "bt{l}\t{$src2, $src1|$src1, $src2}", 642b80ae654SShengchen Kan []>, OpSize32, TB; 643b9ea7327SWang, Xin10 def BT64mr : RI<0xA3, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), 644b9ea7327SWang, Xin10 "bt{q}\t{$src2, $src1|$src1, $src2}", 645b80ae654SShengchen Kan []>, TB; 646b9ea7327SWang, Xin10} 647b9ea7327SWang, Xin10 648b9ea7327SWang, Xin10let SchedRW = [WriteBitTest] in { 649b9ea7327SWang, Xin10def BT16ri8 : Ii8<0xBA, MRM4r, (outs), (ins GR16:$src1, i16u8imm:$src2), 650b9ea7327SWang, Xin10 "bt{w}\t{$src2, $src1|$src1, $src2}", 651b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt GR16:$src1, imm:$src2))]>, 652b9ea7327SWang, Xin10 OpSize16, TB; 653b9ea7327SWang, Xin10def BT32ri8 : Ii8<0xBA, MRM4r, (outs), (ins GR32:$src1, i32u8imm:$src2), 654b9ea7327SWang, Xin10 "bt{l}\t{$src2, $src1|$src1, $src2}", 655b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt GR32:$src1, imm:$src2))]>, 656b9ea7327SWang, Xin10 OpSize32, TB; 657b9ea7327SWang, Xin10def BT64ri8 : RIi8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64u8imm:$src2), 658b9ea7327SWang, Xin10 "bt{q}\t{$src2, $src1|$src1, $src2}", 659b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt GR64:$src1, imm:$src2))]>, TB; 660b9ea7327SWang, Xin10} // SchedRW 661b9ea7327SWang, Xin10 662b9ea7327SWang, Xin10// Note that these instructions aren't slow because that only applies when the 663b9ea7327SWang, Xin10// other operand is in a register. When it's an immediate, bt is still fast. 664b9ea7327SWang, Xin10let SchedRW = [WriteBitTestImmLd] in { 665b9ea7327SWang, Xin10def BT16mi8 : Ii8<0xBA, MRM4m, (outs), (ins i16mem:$src1, i16u8imm:$src2), 666b9ea7327SWang, Xin10 "bt{w}\t{$src2, $src1|$src1, $src2}", 667b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt (loadi16 addr:$src1), 668b9ea7327SWang, Xin10 imm:$src2))]>, 669b9ea7327SWang, Xin10 OpSize16, TB; 670b9ea7327SWang, Xin10def BT32mi8 : Ii8<0xBA, MRM4m, (outs), (ins i32mem:$src1, i32u8imm:$src2), 671b9ea7327SWang, Xin10 "bt{l}\t{$src2, $src1|$src1, $src2}", 672b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt (loadi32 addr:$src1), 673b9ea7327SWang, Xin10 imm:$src2))]>, 674b9ea7327SWang, Xin10 OpSize32, TB; 675b9ea7327SWang, Xin10def BT64mi8 : RIi8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64u8imm:$src2), 676b9ea7327SWang, Xin10 "bt{q}\t{$src2, $src1|$src1, $src2}", 677b9ea7327SWang, Xin10 [(set EFLAGS, (X86bt (loadi64 addr:$src1), 678b9ea7327SWang, Xin10 imm:$src2))]>, TB, 679b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 680b9ea7327SWang, Xin10} // SchedRW 681b9ea7327SWang, Xin10 682b9ea7327SWang, Xin10let hasSideEffects = 0 in { 683b9ea7327SWang, Xin10let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { 684b9ea7327SWang, Xin10def BTC16rr : I<0xBB, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2), 685b9ea7327SWang, Xin10 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, 686b80ae654SShengchen Kan OpSize16, TB; 687b9ea7327SWang, Xin10def BTC32rr : I<0xBB, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2), 688b9ea7327SWang, Xin10 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, 689b80ae654SShengchen Kan OpSize32, TB; 690b9ea7327SWang, Xin10def BTC64rr : RI<0xBB, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2), 691b80ae654SShengchen Kan "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 692b9ea7327SWang, Xin10} // SchedRW 693b9ea7327SWang, Xin10 694b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteBitTestSetRegRMW] in { 695b9ea7327SWang, Xin10def BTC16mr : I<0xBB, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2), 696b9ea7327SWang, Xin10 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, 697b80ae654SShengchen Kan OpSize16, TB; 698b9ea7327SWang, Xin10def BTC32mr : I<0xBB, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2), 699b9ea7327SWang, Xin10 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, 700b80ae654SShengchen Kan OpSize32, TB; 701b9ea7327SWang, Xin10def BTC64mr : RI<0xBB, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), 702b80ae654SShengchen Kan "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 703b9ea7327SWang, Xin10} 704b9ea7327SWang, Xin10 705b9ea7327SWang, Xin10let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { 706b9ea7327SWang, Xin10def BTC16ri8 : Ii8<0xBA, MRM7r, (outs GR16:$dst), (ins GR16:$src1, i16u8imm:$src2), 707b9ea7327SWang, Xin10 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; 708b9ea7327SWang, Xin10def BTC32ri8 : Ii8<0xBA, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i32u8imm:$src2), 709b9ea7327SWang, Xin10 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, OpSize32, TB; 710b9ea7327SWang, Xin10def BTC64ri8 : RIi8<0xBA, MRM7r, (outs GR64:$dst), (ins GR64:$src1, i64u8imm:$src2), 711b9ea7327SWang, Xin10 "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 712b9ea7327SWang, Xin10} // SchedRW 713b9ea7327SWang, Xin10 714b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteBitTestSetImmRMW] in { 715b9ea7327SWang, Xin10def BTC16mi8 : Ii8<0xBA, MRM7m, (outs), (ins i16mem:$src1, i16u8imm:$src2), 716b9ea7327SWang, Xin10 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; 717b9ea7327SWang, Xin10def BTC32mi8 : Ii8<0xBA, MRM7m, (outs), (ins i32mem:$src1, i32u8imm:$src2), 718b9ea7327SWang, Xin10 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, OpSize32, TB; 719b9ea7327SWang, Xin10def BTC64mi8 : RIi8<0xBA, MRM7m, (outs), (ins i64mem:$src1, i64u8imm:$src2), 720b9ea7327SWang, Xin10 "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB, 721b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 722b9ea7327SWang, Xin10} 723b9ea7327SWang, Xin10 724b9ea7327SWang, Xin10let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { 725b9ea7327SWang, Xin10def BTR16rr : I<0xB3, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2), 726b9ea7327SWang, Xin10 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, 727b80ae654SShengchen Kan OpSize16, TB; 728b9ea7327SWang, Xin10def BTR32rr : I<0xB3, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2), 729b9ea7327SWang, Xin10 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, 730b80ae654SShengchen Kan OpSize32, TB; 731b9ea7327SWang, Xin10def BTR64rr : RI<0xB3, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2), 732b80ae654SShengchen Kan "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 733b9ea7327SWang, Xin10} // SchedRW 734b9ea7327SWang, Xin10 735b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteBitTestSetRegRMW] in { 736b9ea7327SWang, Xin10def BTR16mr : I<0xB3, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2), 737b9ea7327SWang, Xin10 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, 738b80ae654SShengchen Kan OpSize16, TB; 739b9ea7327SWang, Xin10def BTR32mr : I<0xB3, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2), 740b9ea7327SWang, Xin10 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, 741b80ae654SShengchen Kan OpSize32, TB; 742b9ea7327SWang, Xin10def BTR64mr : RI<0xB3, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), 743b80ae654SShengchen Kan "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 744b9ea7327SWang, Xin10} 745b9ea7327SWang, Xin10 746b9ea7327SWang, Xin10let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { 747b9ea7327SWang, Xin10def BTR16ri8 : Ii8<0xBA, MRM6r, (outs GR16:$dst), (ins GR16:$src1, i16u8imm:$src2), 748b9ea7327SWang, Xin10 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, 749b9ea7327SWang, Xin10 OpSize16, TB; 750b9ea7327SWang, Xin10def BTR32ri8 : Ii8<0xBA, MRM6r, (outs GR32:$dst), (ins GR32:$src1, i32u8imm:$src2), 751b9ea7327SWang, Xin10 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, 752b9ea7327SWang, Xin10 OpSize32, TB; 753b9ea7327SWang, Xin10def BTR64ri8 : RIi8<0xBA, MRM6r, (outs GR64:$dst), (ins GR64:$src1, i64u8imm:$src2), 754b9ea7327SWang, Xin10 "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 755b9ea7327SWang, Xin10} // SchedRW 756b9ea7327SWang, Xin10 757b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteBitTestSetImmRMW] in { 758b9ea7327SWang, Xin10def BTR16mi8 : Ii8<0xBA, MRM6m, (outs), (ins i16mem:$src1, i16u8imm:$src2), 759b9ea7327SWang, Xin10 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, 760b9ea7327SWang, Xin10 OpSize16, TB; 761b9ea7327SWang, Xin10def BTR32mi8 : Ii8<0xBA, MRM6m, (outs), (ins i32mem:$src1, i32u8imm:$src2), 762b9ea7327SWang, Xin10 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, 763b9ea7327SWang, Xin10 OpSize32, TB; 764b9ea7327SWang, Xin10def BTR64mi8 : RIi8<0xBA, MRM6m, (outs), (ins i64mem:$src1, i64u8imm:$src2), 765b9ea7327SWang, Xin10 "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB, 766b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 767b9ea7327SWang, Xin10} 768b9ea7327SWang, Xin10 769b9ea7327SWang, Xin10let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { 770b9ea7327SWang, Xin10def BTS16rr : I<0xAB, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2), 771b9ea7327SWang, Xin10 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, 772b80ae654SShengchen Kan OpSize16, TB; 773b9ea7327SWang, Xin10def BTS32rr : I<0xAB, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2), 774b9ea7327SWang, Xin10 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, 775b80ae654SShengchen Kan OpSize32, TB; 776b9ea7327SWang, Xin10def BTS64rr : RI<0xAB, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2), 777b80ae654SShengchen Kan "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 778b9ea7327SWang, Xin10} // SchedRW 779b9ea7327SWang, Xin10 780b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteBitTestSetRegRMW] in { 781b9ea7327SWang, Xin10def BTS16mr : I<0xAB, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2), 782b9ea7327SWang, Xin10 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, 783b80ae654SShengchen Kan OpSize16, TB; 784b9ea7327SWang, Xin10def BTS32mr : I<0xAB, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2), 785b9ea7327SWang, Xin10 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, 786b80ae654SShengchen Kan OpSize32, TB; 787b9ea7327SWang, Xin10def BTS64mr : RI<0xAB, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), 788b80ae654SShengchen Kan "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 789b9ea7327SWang, Xin10} 790b9ea7327SWang, Xin10 791b9ea7327SWang, Xin10let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { 792b9ea7327SWang, Xin10def BTS16ri8 : Ii8<0xBA, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i16u8imm:$src2), 793b9ea7327SWang, Xin10 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; 794b9ea7327SWang, Xin10def BTS32ri8 : Ii8<0xBA, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i32u8imm:$src2), 795b9ea7327SWang, Xin10 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, OpSize32, TB; 796b9ea7327SWang, Xin10def BTS64ri8 : RIi8<0xBA, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i64u8imm:$src2), 797b9ea7327SWang, Xin10 "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 798b9ea7327SWang, Xin10} // SchedRW 799b9ea7327SWang, Xin10 800b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, SchedRW = [WriteBitTestSetImmRMW] in { 801b9ea7327SWang, Xin10def BTS16mi8 : Ii8<0xBA, MRM5m, (outs), (ins i16mem:$src1, i16u8imm:$src2), 802b9ea7327SWang, Xin10 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; 803b9ea7327SWang, Xin10def BTS32mi8 : Ii8<0xBA, MRM5m, (outs), (ins i32mem:$src1, i32u8imm:$src2), 804b9ea7327SWang, Xin10 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, OpSize32, TB; 805b9ea7327SWang, Xin10def BTS64mi8 : RIi8<0xBA, MRM5m, (outs), (ins i64mem:$src1, i64u8imm:$src2), 806b9ea7327SWang, Xin10 "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB, 807b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 808b9ea7327SWang, Xin10} 809b9ea7327SWang, Xin10} // hasSideEffects = 0 810b9ea7327SWang, Xin10} // Defs = [EFLAGS] 811b9ea7327SWang, Xin10 812b9ea7327SWang, Xin10 813b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 814b9ea7327SWang, Xin10// Atomic support 815b9ea7327SWang, Xin10// 816b9ea7327SWang, Xin10 817b9ea7327SWang, Xin10// Atomic swap. These are just normal xchg instructions. But since a memory 818b9ea7327SWang, Xin10// operand is referenced, the atomicity is ensured. 819b9ea7327SWang, Xin10multiclass ATOMIC_SWAP<bits<8> opc8, bits<8> opc, string mnemonic, string frag> { 820b9ea7327SWang, Xin10 let Constraints = "$val = $dst", SchedRW = [WriteALULd, WriteRMW] in { 821b9ea7327SWang, Xin10 def NAME#8rm : I<opc8, MRMSrcMem, (outs GR8:$dst), 822b9ea7327SWang, Xin10 (ins GR8:$val, i8mem:$ptr), 823b9ea7327SWang, Xin10 !strconcat(mnemonic, "{b}\t{$val, $ptr|$ptr, $val}"), 824b9ea7327SWang, Xin10 [(set 825b9ea7327SWang, Xin10 GR8:$dst, 8265c9352ebSMatt Arsenault (!cast<PatFrag>(frag # "_i8") addr:$ptr, GR8:$val))]>; 827b9ea7327SWang, Xin10 def NAME#16rm : I<opc, MRMSrcMem, (outs GR16:$dst), 828b9ea7327SWang, Xin10 (ins GR16:$val, i16mem:$ptr), 829b9ea7327SWang, Xin10 !strconcat(mnemonic, "{w}\t{$val, $ptr|$ptr, $val}"), 830b9ea7327SWang, Xin10 [(set 831b9ea7327SWang, Xin10 GR16:$dst, 8325c9352ebSMatt Arsenault (!cast<PatFrag>(frag # "_i16") addr:$ptr, GR16:$val))]>, 833b9ea7327SWang, Xin10 OpSize16; 834b9ea7327SWang, Xin10 def NAME#32rm : I<opc, MRMSrcMem, (outs GR32:$dst), 835b9ea7327SWang, Xin10 (ins GR32:$val, i32mem:$ptr), 836b9ea7327SWang, Xin10 !strconcat(mnemonic, "{l}\t{$val, $ptr|$ptr, $val}"), 837b9ea7327SWang, Xin10 [(set 838b9ea7327SWang, Xin10 GR32:$dst, 8395c9352ebSMatt Arsenault (!cast<PatFrag>(frag # "_i32") addr:$ptr, GR32:$val))]>, 840b9ea7327SWang, Xin10 OpSize32; 841b9ea7327SWang, Xin10 def NAME#64rm : RI<opc, MRMSrcMem, (outs GR64:$dst), 842b9ea7327SWang, Xin10 (ins GR64:$val, i64mem:$ptr), 843b9ea7327SWang, Xin10 !strconcat(mnemonic, "{q}\t{$val, $ptr|$ptr, $val}"), 844b9ea7327SWang, Xin10 [(set 845b9ea7327SWang, Xin10 GR64:$dst, 8465c9352ebSMatt Arsenault (!cast<PatFrag>(frag # "_i64") addr:$ptr, GR64:$val))]>; 847b9ea7327SWang, Xin10 } 848b9ea7327SWang, Xin10} 849b9ea7327SWang, Xin10 850b80ae654SShengchen Kandefm XCHG : ATOMIC_SWAP<0x86, 0x87, "xchg", "atomic_swap">; 851b9ea7327SWang, Xin10 852b9ea7327SWang, Xin10// Swap between registers. 853b9ea7327SWang, Xin10let SchedRW = [WriteXCHG] in { 854b9ea7327SWang, Xin10let Constraints = "$src1 = $dst1, $src2 = $dst2", hasSideEffects = 0 in { 855b9ea7327SWang, Xin10def XCHG8rr : I<0x86, MRMSrcReg, (outs GR8:$dst1, GR8:$dst2), 856b9ea7327SWang, Xin10 (ins GR8:$src1, GR8:$src2), 857b80ae654SShengchen Kan "xchg{b}\t{$src2, $src1|$src1, $src2}", []>; 858b9ea7327SWang, Xin10def XCHG16rr : I<0x87, MRMSrcReg, (outs GR16:$dst1, GR16:$dst2), 859b9ea7327SWang, Xin10 (ins GR16:$src1, GR16:$src2), 860b9ea7327SWang, Xin10 "xchg{w}\t{$src2, $src1|$src1, $src2}", []>, 861b80ae654SShengchen Kan OpSize16; 862b9ea7327SWang, Xin10def XCHG32rr : I<0x87, MRMSrcReg, (outs GR32:$dst1, GR32:$dst2), 863b9ea7327SWang, Xin10 (ins GR32:$src1, GR32:$src2), 864b9ea7327SWang, Xin10 "xchg{l}\t{$src2, $src1|$src1, $src2}", []>, 865b80ae654SShengchen Kan OpSize32; 866b9ea7327SWang, Xin10def XCHG64rr : RI<0x87, MRMSrcReg, (outs GR64:$dst1, GR64:$dst2), 867b9ea7327SWang, Xin10 (ins GR64:$src1 ,GR64:$src2), 868b80ae654SShengchen Kan "xchg{q}\t{$src2, $src1|$src1, $src2}", []>; 869b9ea7327SWang, Xin10} 870b9ea7327SWang, Xin10 871b9ea7327SWang, Xin10// Swap between EAX and other registers. 872b9ea7327SWang, Xin10let Constraints = "$src = $dst", hasSideEffects = 0 in { 873b9ea7327SWang, Xin10let Uses = [AX], Defs = [AX] in 874b9ea7327SWang, Xin10def XCHG16ar : I<0x90, AddRegFrm, (outs GR16:$dst), (ins GR16:$src), 875b9ea7327SWang, Xin10 "xchg{w}\t{$src, %ax|ax, $src}", []>, OpSize16; 876b9ea7327SWang, Xin10let Uses = [EAX], Defs = [EAX] in 877b9ea7327SWang, Xin10def XCHG32ar : I<0x90, AddRegFrm, (outs GR32:$dst), (ins GR32:$src), 878b9ea7327SWang, Xin10 "xchg{l}\t{$src, %eax|eax, $src}", []>, OpSize32; 879b9ea7327SWang, Xin10let Uses = [RAX], Defs = [RAX] in 880b9ea7327SWang, Xin10def XCHG64ar : RI<0x90, AddRegFrm, (outs GR64:$dst), (ins GR64:$src), 881b9ea7327SWang, Xin10 "xchg{q}\t{$src, %rax|rax, $src}", []>; 882b9ea7327SWang, Xin10} 883b9ea7327SWang, Xin10} // SchedRW 884b9ea7327SWang, Xin10 885b9ea7327SWang, Xin10let hasSideEffects = 0, Constraints = "$src1 = $dst1, $src2 = $dst2", 886b9ea7327SWang, Xin10 Defs = [EFLAGS], SchedRW = [WriteXCHG] in { 887b9ea7327SWang, Xin10def XADD8rr : I<0xC0, MRMDestReg, (outs GR8:$dst1, GR8:$dst2), 888b9ea7327SWang, Xin10 (ins GR8:$src1, GR8:$src2), 889b9ea7327SWang, Xin10 "xadd{b}\t{$src2, $src1|$src1, $src2}", []>, TB; 890b9ea7327SWang, Xin10def XADD16rr : I<0xC1, MRMDestReg, (outs GR16:$dst1, GR16:$dst2), 891b9ea7327SWang, Xin10 (ins GR16:$src1, GR16:$src2), 892b9ea7327SWang, Xin10 "xadd{w}\t{$src2, $src1|$src1, $src2}", []>, TB, OpSize16; 893b9ea7327SWang, Xin10def XADD32rr : I<0xC1, MRMDestReg, (outs GR32:$dst1, GR32:$dst2), 894b9ea7327SWang, Xin10 (ins GR32:$src1, GR32:$src2), 895b9ea7327SWang, Xin10 "xadd{l}\t{$src2, $src1|$src1, $src2}", []>, TB, OpSize32; 896b9ea7327SWang, Xin10def XADD64rr : RI<0xC1, MRMDestReg, (outs GR64:$dst1, GR64:$dst2), 897b9ea7327SWang, Xin10 (ins GR64:$src1, GR64:$src2), 898b9ea7327SWang, Xin10 "xadd{q}\t{$src2, $src1|$src1, $src2}", []>, TB; 899b9ea7327SWang, Xin10} // SchedRW 900b9ea7327SWang, Xin10 901b9ea7327SWang, Xin10let mayLoad = 1, mayStore = 1, hasSideEffects = 0, Constraints = "$val = $dst", 902b9ea7327SWang, Xin10 Defs = [EFLAGS], SchedRW = [WriteALULd, WriteRMW] in { 903b9ea7327SWang, Xin10def XADD8rm : I<0xC0, MRMSrcMem, (outs GR8:$dst), 904b9ea7327SWang, Xin10 (ins GR8:$val, i8mem:$ptr), 905b9ea7327SWang, Xin10 "xadd{b}\t{$val, $ptr|$ptr, $val}", []>, TB; 906b9ea7327SWang, Xin10def XADD16rm : I<0xC1, MRMSrcMem, (outs GR16:$dst), 907b9ea7327SWang, Xin10 (ins GR16:$val, i16mem:$ptr), 908b9ea7327SWang, Xin10 "xadd{w}\t{$val, $ptr|$ptr, $val}", []>, TB, 909b9ea7327SWang, Xin10 OpSize16; 910b9ea7327SWang, Xin10def XADD32rm : I<0xC1, MRMSrcMem, (outs GR32:$dst), 911b9ea7327SWang, Xin10 (ins GR32:$val, i32mem:$ptr), 912b9ea7327SWang, Xin10 "xadd{l}\t{$val, $ptr|$ptr, $val}", []>, TB, 913b9ea7327SWang, Xin10 OpSize32; 914b9ea7327SWang, Xin10def XADD64rm : RI<0xC1, MRMSrcMem, (outs GR64:$dst), 915b9ea7327SWang, Xin10 (ins GR64:$val, i64mem:$ptr), 916b9ea7327SWang, Xin10 "xadd{q}\t{$val, $ptr|$ptr, $val}", []>, TB; 917b9ea7327SWang, Xin10 918b9ea7327SWang, Xin10} 919b9ea7327SWang, Xin10 920b9ea7327SWang, Xin10let SchedRW = [WriteCMPXCHG], hasSideEffects = 0 in { 921b9ea7327SWang, Xin10let Defs = [AL, EFLAGS], Uses = [AL] in 922b9ea7327SWang, Xin10def CMPXCHG8rr : I<0xB0, MRMDestReg, (outs GR8:$dst), (ins GR8:$src), 923b80ae654SShengchen Kan "cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB; 924b9ea7327SWang, Xin10let Defs = [AX, EFLAGS], Uses = [AX] in 925b9ea7327SWang, Xin10def CMPXCHG16rr : I<0xB1, MRMDestReg, (outs GR16:$dst), (ins GR16:$src), 926b80ae654SShengchen Kan "cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16; 927b9ea7327SWang, Xin10let Defs = [EAX, EFLAGS], Uses = [EAX] in 928b9ea7327SWang, Xin10def CMPXCHG32rr : I<0xB1, MRMDestReg, (outs GR32:$dst), (ins GR32:$src), 929b80ae654SShengchen Kan "cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32; 930b9ea7327SWang, Xin10let Defs = [RAX, EFLAGS], Uses = [RAX] in 931b9ea7327SWang, Xin10def CMPXCHG64rr : RI<0xB1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src), 932b80ae654SShengchen Kan "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB; 933b9ea7327SWang, Xin10} // SchedRW, hasSideEffects 934b9ea7327SWang, Xin10 935b9ea7327SWang, Xin10let SchedRW = [WriteCMPXCHGRMW], mayLoad = 1, mayStore = 1, 936b9ea7327SWang, Xin10 hasSideEffects = 0 in { 937b9ea7327SWang, Xin10let Defs = [AL, EFLAGS], Uses = [AL] in 938b9ea7327SWang, Xin10def CMPXCHG8rm : I<0xB0, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src), 939b80ae654SShengchen Kan "cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB; 940b9ea7327SWang, Xin10let Defs = [AX, EFLAGS], Uses = [AX] in 941b9ea7327SWang, Xin10def CMPXCHG16rm : I<0xB1, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src), 942b80ae654SShengchen Kan "cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16; 943b9ea7327SWang, Xin10let Defs = [EAX, EFLAGS], Uses = [EAX] in 944b9ea7327SWang, Xin10def CMPXCHG32rm : I<0xB1, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src), 945b80ae654SShengchen Kan "cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32; 946b9ea7327SWang, Xin10let Defs = [RAX, EFLAGS], Uses = [RAX] in 947b9ea7327SWang, Xin10def CMPXCHG64rm : RI<0xB1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), 948b80ae654SShengchen Kan "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB; 949b9ea7327SWang, Xin10 950b9ea7327SWang, Xin10let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EBX, ECX, EDX] in 951b9ea7327SWang, Xin10def CMPXCHG8B : I<0xC7, MRM1m, (outs), (ins i64mem:$dst), 952b9ea7327SWang, Xin10 "cmpxchg8b\t$dst", []>, TB, Requires<[HasCX8]>; 953b9ea7327SWang, Xin10 954b9ea7327SWang, Xin10let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RBX, RCX, RDX] in 955b9ea7327SWang, Xin10// NOTE: In64BitMode check needed for the AssemblerPredicate. 956b9ea7327SWang, Xin10def CMPXCHG16B : RI<0xC7, MRM1m, (outs), (ins i128mem:$dst), 957b9ea7327SWang, Xin10 "cmpxchg16b\t$dst", []>, 958b9ea7327SWang, Xin10 TB, Requires<[HasCX16,In64BitMode]>; 959b9ea7327SWang, Xin10} // SchedRW, mayLoad, mayStore, hasSideEffects 960b9ea7327SWang, Xin10 961b9ea7327SWang, Xin10 962b9ea7327SWang, Xin10// Lock instruction prefix 963b9ea7327SWang, Xin10let SchedRW = [WriteMicrocoded] in 964b9ea7327SWang, Xin10def LOCK_PREFIX : I<0xF0, PrefixByte, (outs), (ins), "lock", []>; 965b9ea7327SWang, Xin10 966b9ea7327SWang, Xin10let SchedRW = [WriteNop] in { 967b9ea7327SWang, Xin10 968b9ea7327SWang, Xin10// Rex64 instruction prefix 969b9ea7327SWang, Xin10def REX64_PREFIX : I<0x48, PrefixByte, (outs), (ins), "rex64", []>, 970b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 971b9ea7327SWang, Xin10 972b9ea7327SWang, Xin10// Data16 instruction prefix 973b9ea7327SWang, Xin10def DATA16_PREFIX : I<0x66, PrefixByte, (outs), (ins), "data16", []>; 974b9ea7327SWang, Xin10} // SchedRW 975b9ea7327SWang, Xin10 976b9ea7327SWang, Xin10// Repeat string operation instruction prefixes 977b9ea7327SWang, Xin10let Defs = [ECX], Uses = [ECX,DF], SchedRW = [WriteMicrocoded] in { 978b9ea7327SWang, Xin10// Repeat (used with INS, OUTS, MOVS, LODS and STOS) 979b9ea7327SWang, Xin10def REP_PREFIX : I<0xF3, PrefixByte, (outs), (ins), "rep", []>; 980b9ea7327SWang, Xin10// Repeat while not equal (used with CMPS and SCAS) 981b9ea7327SWang, Xin10def REPNE_PREFIX : I<0xF2, PrefixByte, (outs), (ins), "repne", []>; 982b9ea7327SWang, Xin10} 983b9ea7327SWang, Xin10 984b9ea7327SWang, Xin10// String manipulation instructions 985b9ea7327SWang, Xin10let SchedRW = [WriteMicrocoded] in { 986b9ea7327SWang, Xin10let Defs = [AL,ESI], Uses = [ESI,DF] in 987b9ea7327SWang, Xin10def LODSB : I<0xAC, RawFrmSrc, (outs), (ins srcidx8:$src), 988b9ea7327SWang, Xin10 "lodsb\t{$src, %al|al, $src}", []>; 989b9ea7327SWang, Xin10let Defs = [AX,ESI], Uses = [ESI,DF] in 990b9ea7327SWang, Xin10def LODSW : I<0xAD, RawFrmSrc, (outs), (ins srcidx16:$src), 991b9ea7327SWang, Xin10 "lodsw\t{$src, %ax|ax, $src}", []>, OpSize16; 992b9ea7327SWang, Xin10let Defs = [EAX,ESI], Uses = [ESI,DF] in 993b9ea7327SWang, Xin10def LODSL : I<0xAD, RawFrmSrc, (outs), (ins srcidx32:$src), 994b9ea7327SWang, Xin10 "lods{l|d}\t{$src, %eax|eax, $src}", []>, OpSize32; 995b9ea7327SWang, Xin10let Defs = [RAX,ESI], Uses = [ESI,DF] in 996b9ea7327SWang, Xin10def LODSQ : RI<0xAD, RawFrmSrc, (outs), (ins srcidx64:$src), 997b9ea7327SWang, Xin10 "lodsq\t{$src, %rax|rax, $src}", []>, 998b9ea7327SWang, Xin10 Requires<[In64BitMode]>; 999b9ea7327SWang, Xin10} 1000b9ea7327SWang, Xin10 1001b9ea7327SWang, Xin10let SchedRW = [WriteSystem] in { 1002b9ea7327SWang, Xin10let Defs = [ESI], Uses = [DX,ESI,DF] in { 1003b9ea7327SWang, Xin10def OUTSB : I<0x6E, RawFrmSrc, (outs), (ins srcidx8:$src), 1004b9ea7327SWang, Xin10 "outsb\t{$src, %dx|dx, $src}", []>; 1005b9ea7327SWang, Xin10def OUTSW : I<0x6F, RawFrmSrc, (outs), (ins srcidx16:$src), 1006b9ea7327SWang, Xin10 "outsw\t{$src, %dx|dx, $src}", []>, OpSize16; 1007b9ea7327SWang, Xin10def OUTSL : I<0x6F, RawFrmSrc, (outs), (ins srcidx32:$src), 1008b9ea7327SWang, Xin10 "outs{l|d}\t{$src, %dx|dx, $src}", []>, OpSize32; 1009b9ea7327SWang, Xin10} 1010b9ea7327SWang, Xin10 1011b9ea7327SWang, Xin10let Defs = [EDI], Uses = [DX,EDI,DF] in { 1012b9ea7327SWang, Xin10def INSB : I<0x6C, RawFrmDst, (outs), (ins dstidx8:$dst), 1013b9ea7327SWang, Xin10 "insb\t{%dx, $dst|$dst, dx}", []>; 1014b9ea7327SWang, Xin10def INSW : I<0x6D, RawFrmDst, (outs), (ins dstidx16:$dst), 1015b9ea7327SWang, Xin10 "insw\t{%dx, $dst|$dst, dx}", []>, OpSize16; 1016b9ea7327SWang, Xin10def INSL : I<0x6D, RawFrmDst, (outs), (ins dstidx32:$dst), 1017b9ea7327SWang, Xin10 "ins{l|d}\t{%dx, $dst|$dst, dx}", []>, OpSize32; 1018b9ea7327SWang, Xin10} 1019b9ea7327SWang, Xin10} 1020b9ea7327SWang, Xin10 1021b9ea7327SWang, Xin10// EFLAGS management instructions. 1022b9ea7327SWang, Xin10let SchedRW = [WriteALU], Defs = [EFLAGS], Uses = [EFLAGS] in { 1023b9ea7327SWang, Xin10def CLC : I<0xF8, RawFrm, (outs), (ins), "clc", []>; 1024b9ea7327SWang, Xin10def STC : I<0xF9, RawFrm, (outs), (ins), "stc", []>; 1025b9ea7327SWang, Xin10def CMC : I<0xF5, RawFrm, (outs), (ins), "cmc", []>; 1026b9ea7327SWang, Xin10} 1027b9ea7327SWang, Xin10 1028b9ea7327SWang, Xin10// DF management instructions. 1029b9ea7327SWang, Xin10let SchedRW = [WriteALU], Defs = [DF] in { 1030b9ea7327SWang, Xin10def CLD : I<0xFC, RawFrm, (outs), (ins), "cld", []>; 1031b9ea7327SWang, Xin10def STD : I<0xFD, RawFrm, (outs), (ins), "std", []>; 1032b9ea7327SWang, Xin10} 1033b9ea7327SWang, Xin10 1034b9ea7327SWang, Xin10// Table lookup instructions 1035b9ea7327SWang, Xin10let Uses = [AL,EBX], Defs = [AL], hasSideEffects = 0, mayLoad = 1 in 1036b9ea7327SWang, Xin10def XLAT : I<0xD7, RawFrm, (outs), (ins), "xlatb", []>, Sched<[WriteLoad]>; 1037b9ea7327SWang, Xin10 1038b9ea7327SWang, Xin10let SchedRW = [WriteMicrocoded] in { 1039b9ea7327SWang, Xin10// ASCII Adjust After Addition 1040b9ea7327SWang, Xin10let Uses = [AL,EFLAGS], Defs = [AX,EFLAGS], hasSideEffects = 0 in 1041b9ea7327SWang, Xin10def AAA : I<0x37, RawFrm, (outs), (ins), "aaa", []>, 1042b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 1043b9ea7327SWang, Xin10 1044b9ea7327SWang, Xin10// ASCII Adjust AX Before Division 1045b9ea7327SWang, Xin10let Uses = [AX], Defs = [AX,EFLAGS], hasSideEffects = 0 in 1046b9ea7327SWang, Xin10def AAD8i8 : Ii8<0xD5, RawFrm, (outs), (ins i8imm:$src), 1047b9ea7327SWang, Xin10 "aad\t$src", []>, Requires<[Not64BitMode]>; 1048b9ea7327SWang, Xin10 1049b9ea7327SWang, Xin10// ASCII Adjust AX After Multiply 1050b9ea7327SWang, Xin10let Uses = [AL], Defs = [AX,EFLAGS], hasSideEffects = 0 in 1051b9ea7327SWang, Xin10def AAM8i8 : Ii8<0xD4, RawFrm, (outs), (ins i8imm:$src), 1052b9ea7327SWang, Xin10 "aam\t$src", []>, Requires<[Not64BitMode]>; 1053b9ea7327SWang, Xin10 1054b9ea7327SWang, Xin10// ASCII Adjust AL After Subtraction - sets 1055b9ea7327SWang, Xin10let Uses = [AL,EFLAGS], Defs = [AX,EFLAGS], hasSideEffects = 0 in 1056b9ea7327SWang, Xin10def AAS : I<0x3F, RawFrm, (outs), (ins), "aas", []>, 1057b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 1058b9ea7327SWang, Xin10 1059b9ea7327SWang, Xin10// Decimal Adjust AL after Addition 1060b9ea7327SWang, Xin10let Uses = [AL,EFLAGS], Defs = [AL,EFLAGS], hasSideEffects = 0 in 1061b9ea7327SWang, Xin10def DAA : I<0x27, RawFrm, (outs), (ins), "daa", []>, 1062b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 1063b9ea7327SWang, Xin10 1064b9ea7327SWang, Xin10// Decimal Adjust AL after Subtraction 1065b9ea7327SWang, Xin10let Uses = [AL,EFLAGS], Defs = [AL,EFLAGS], hasSideEffects = 0 in 1066b9ea7327SWang, Xin10def DAS : I<0x2F, RawFrm, (outs), (ins), "das", []>, 1067b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 1068b9ea7327SWang, Xin10} // SchedRW 1069b9ea7327SWang, Xin10 1070b9ea7327SWang, Xin10let SchedRW = [WriteSystem] in { 1071b9ea7327SWang, Xin10// Check Array Index Against Bounds 1072b9ea7327SWang, Xin10// Note: "bound" does not have reversed operands in at&t syntax. 1073b9ea7327SWang, Xin10def BOUNDS16rm : I<0x62, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src), 1074b9ea7327SWang, Xin10 "bound\t$dst, $src", []>, OpSize16, 1075b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 1076b9ea7327SWang, Xin10def BOUNDS32rm : I<0x62, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src), 1077b9ea7327SWang, Xin10 "bound\t$dst, $src", []>, OpSize32, 1078b9ea7327SWang, Xin10 Requires<[Not64BitMode]>; 1079b9ea7327SWang, Xin10 1080b9ea7327SWang, Xin10// Adjust RPL Field of Segment Selector 1081b9ea7327SWang, Xin10def ARPL16rr : I<0x63, MRMDestReg, (outs GR16:$dst), (ins GR16:$src), 1082b9ea7327SWang, Xin10 "arpl\t{$src, $dst|$dst, $src}", []>, 1083b80ae654SShengchen Kan Requires<[Not64BitMode]>; 1084b9ea7327SWang, Xin10let mayStore = 1 in 1085b9ea7327SWang, Xin10def ARPL16mr : I<0x63, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src), 1086b9ea7327SWang, Xin10 "arpl\t{$src, $dst|$dst, $src}", []>, 1087b80ae654SShengchen Kan Requires<[Not64BitMode]>; 1088b9ea7327SWang, Xin10} // SchedRW 1089b9ea7327SWang, Xin10 1090b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1091b9ea7327SWang, Xin10// MOVBE Instructions 1092b9ea7327SWang, Xin10// 109302d56801SXinWang10multiclass Movbe<bits<8> o, X86TypeInfo t, string suffix = ""> { 109402d56801SXinWang10 def rm#suffix : ITy<o, MRMSrcMem, t, (outs t.RegClass:$dst), 109502d56801SXinWang10 (ins t.MemOperand:$src1), "movbe", unaryop_ndd_args, 109602d56801SXinWang10 [(set t.RegClass:$dst, (bswap (t.LoadNode addr:$src1)))]>, 109702d56801SXinWang10 Sched<[WriteALULd]>; 109802d56801SXinWang10 def mr#suffix : ITy<!add(o, 1), MRMDestMem, t, (outs), 109902d56801SXinWang10 (ins t.MemOperand:$dst, t.RegClass:$src1), 110002d56801SXinWang10 "movbe", unaryop_ndd_args, 110102d56801SXinWang10 [(store (bswap t.RegClass:$src1), addr:$dst)]>, 110202d56801SXinWang10 Sched<[WriteStore]>; 1103b9ea7327SWang, Xin10} 110402d56801SXinWang10 110502d56801SXinWang10let Predicates = [HasMOVBE, NoEGPR] in { 110602d56801SXinWang10 defm MOVBE16 : Movbe<0xF0, Xi16>, OpSize16, T8; 110702d56801SXinWang10 defm MOVBE32 : Movbe<0xF0, Xi32>, OpSize32, T8; 110802d56801SXinWang10 defm MOVBE64 : Movbe<0xF0, Xi64>, T8; 1109b9ea7327SWang, Xin10} 111002d56801SXinWang10 111102d56801SXinWang10let Predicates = [HasMOVBE, HasEGPR, In64BitMode] in { 111202d56801SXinWang10 defm MOVBE16 : Movbe<0x60, Xi16, "_EVEX">, EVEX, T_MAP4, PD; 111302d56801SXinWang10 defm MOVBE32 : Movbe<0x60, Xi32, "_EVEX">, EVEX, T_MAP4; 111402d56801SXinWang10 defm MOVBE64 : Movbe<0x60, Xi64, "_EVEX">, EVEX, T_MAP4; 111502d56801SXinWang10} 111602d56801SXinWang10 111702d56801SXinWang10multiclass Movberr<X86TypeInfo t> { 111802d56801SXinWang10 def rr : ITy<0x61, MRMDestReg, t, (outs t.RegClass:$dst), 111902d56801SXinWang10 (ins t.RegClass:$src1), "movbe", unaryop_ndd_args, 112002d56801SXinWang10 [(set t.RegClass:$dst, (bswap t.RegClass:$src1))]>, 112102d56801SXinWang10 EVEX, T_MAP4; 112202d56801SXinWang10 def rr_REV : ITy<0x60, MRMSrcReg, t, (outs t.RegClass:$dst), 112302d56801SXinWang10 (ins t.RegClass:$src1), "movbe", unaryop_ndd_args, []>, 112402d56801SXinWang10 EVEX, T_MAP4, DisassembleOnly; 112502d56801SXinWang10} 112602d56801SXinWang10let SchedRW = [WriteALU], Predicates = [HasMOVBE, HasNDD, In64BitMode] in { 112702d56801SXinWang10 defm MOVBE16 : Movberr<Xi16>, PD; 112802d56801SXinWang10 defm MOVBE32 : Movberr<Xi32>; 112902d56801SXinWang10 defm MOVBE64 : Movberr<Xi64>; 1130b9ea7327SWang, Xin10} 1131b9ea7327SWang, Xin10 1132b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1133b9ea7327SWang, Xin10// RDRAND Instruction 1134b9ea7327SWang, Xin10// 1135b9ea7327SWang, Xin10let Predicates = [HasRDRAND], Defs = [EFLAGS], SchedRW = [WriteSystem] in { 1136b9ea7327SWang, Xin10 def RDRAND16r : I<0xC7, MRM6r, (outs GR16:$dst), (ins), 1137b9ea7327SWang, Xin10 "rdrand{w}\t$dst", [(set GR16:$dst, EFLAGS, (X86rdrand))]>, 11386e20df1aSShengchen Kan OpSize16, TB; 1139b9ea7327SWang, Xin10 def RDRAND32r : I<0xC7, MRM6r, (outs GR32:$dst), (ins), 1140b9ea7327SWang, Xin10 "rdrand{l}\t$dst", [(set GR32:$dst, EFLAGS, (X86rdrand))]>, 11416e20df1aSShengchen Kan OpSize32, TB; 1142b9ea7327SWang, Xin10 def RDRAND64r : RI<0xC7, MRM6r, (outs GR64:$dst), (ins), 1143b9ea7327SWang, Xin10 "rdrand{q}\t$dst", [(set GR64:$dst, EFLAGS, (X86rdrand))]>, 11446e20df1aSShengchen Kan TB; 1145b9ea7327SWang, Xin10} 1146b9ea7327SWang, Xin10 1147b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1148b9ea7327SWang, Xin10// RDSEED Instruction 1149b9ea7327SWang, Xin10// 1150b9ea7327SWang, Xin10let Predicates = [HasRDSEED], Defs = [EFLAGS], SchedRW = [WriteSystem] in { 1151b9ea7327SWang, Xin10 def RDSEED16r : I<0xC7, MRM7r, (outs GR16:$dst), (ins), "rdseed{w}\t$dst", 11526e20df1aSShengchen Kan [(set GR16:$dst, EFLAGS, (X86rdseed))]>, OpSize16, TB; 1153b9ea7327SWang, Xin10 def RDSEED32r : I<0xC7, MRM7r, (outs GR32:$dst), (ins), "rdseed{l}\t$dst", 11546e20df1aSShengchen Kan [(set GR32:$dst, EFLAGS, (X86rdseed))]>, OpSize32, TB; 1155b9ea7327SWang, Xin10 def RDSEED64r : RI<0xC7, MRM7r, (outs GR64:$dst), (ins), "rdseed{q}\t$dst", 11566e20df1aSShengchen Kan [(set GR64:$dst, EFLAGS, (X86rdseed))]>, TB; 1157b9ea7327SWang, Xin10} 1158b9ea7327SWang, Xin10 1159b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1160b9ea7327SWang, Xin10// LZCNT Instruction 1161b9ea7327SWang, Xin10// 1162d9e875dcSXinWang10multiclass Lzcnt<bits<8> o, string m, SDPatternOperator node, X86TypeInfo t, 1163d9e875dcSXinWang10 SchedWrite schedrr, SchedWrite schedrm, string suffix = ""> { 1164d9e875dcSXinWang10 def rr#suffix : ITy<o, MRMSrcReg, t, (outs t.RegClass:$dst), 1165d9e875dcSXinWang10 (ins t.RegClass:$src1), m, unaryop_ndd_args, 1166501a5834SSergei Barannikov [(set t.RegClass:$dst, (node t.RegClass:$src1))]>, 1167d9e875dcSXinWang10 TB, Sched<[schedrr]>; 11681395e582SShengchen Kan let mayLoad = 1 in 1169d9e875dcSXinWang10 def rm#suffix : ITy<o, MRMSrcMem, t, (outs t.RegClass:$dst), 1170d9e875dcSXinWang10 (ins t.MemOperand:$src1), m, unaryop_ndd_args, 1171501a5834SSergei Barannikov [(set t.RegClass:$dst, (node (t.LoadNode addr:$src1)))]>, 1172d9e875dcSXinWang10 TB, Sched<[schedrm]>; 1173b9ea7327SWang, Xin10} 1174b9ea7327SWang, Xin10 1175d9e875dcSXinWang10let Predicates = [HasLZCNT], Defs = [EFLAGS] in { 1176d9e875dcSXinWang10 defm LZCNT16 : Lzcnt<0xBD, "lzcnt", ctlz, Xi16, WriteLZCNT, WriteLZCNTLd>, OpSize16, XS; 1177d9e875dcSXinWang10 defm LZCNT32 : Lzcnt<0xBD, "lzcnt", ctlz, Xi32, WriteLZCNT, WriteLZCNTLd>, OpSize32, XS; 1178d9e875dcSXinWang10 defm LZCNT64 : Lzcnt<0xBD, "lzcnt", ctlz, Xi64, WriteLZCNT, WriteLZCNTLd>, XS; 1179d9e875dcSXinWang10 1180d9e875dcSXinWang10 defm LZCNT16 : Lzcnt<0xF5, "lzcnt", null_frag, Xi16, WriteLZCNT, WriteLZCNTLd, "_EVEX">, PL, PD; 1181d9e875dcSXinWang10 defm LZCNT32 : Lzcnt<0xF5, "lzcnt", null_frag, Xi32, WriteLZCNT, WriteLZCNTLd, "_EVEX">, PL; 1182d9e875dcSXinWang10 defm LZCNT64 : Lzcnt<0xF5, "lzcnt", null_frag, Xi64, WriteLZCNT, WriteLZCNTLd, "_EVEX">, PL; 1183d9e875dcSXinWang10} 1184d9e875dcSXinWang10 1185d9e875dcSXinWang10defm LZCNT16 : Lzcnt<0xF5, "lzcnt", null_frag, Xi16, WriteLZCNT, WriteLZCNTLd, "_NF">, NF, PD; 1186d9e875dcSXinWang10defm LZCNT32 : Lzcnt<0xF5, "lzcnt", null_frag, Xi32, WriteLZCNT, WriteLZCNTLd, "_NF">, NF; 1187d9e875dcSXinWang10defm LZCNT64 : Lzcnt<0xF5, "lzcnt", null_frag, Xi64, WriteLZCNT, WriteLZCNTLd, "_NF">, NF; 1188d9e875dcSXinWang10 1189b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1190b9ea7327SWang, Xin10// BMI Instructions 1191b9ea7327SWang, Xin10// 1192b9ea7327SWang, Xin10let Predicates = [HasBMI], Defs = [EFLAGS] in { 1193d9e875dcSXinWang10 defm TZCNT16 : Lzcnt<0xBC, "tzcnt", cttz, Xi16, WriteTZCNT, WriteTZCNTLd>, OpSize16, XS; 1194d9e875dcSXinWang10 defm TZCNT32 : Lzcnt<0xBC, "tzcnt", cttz, Xi32, WriteTZCNT, WriteTZCNTLd>, OpSize32, XS; 1195d9e875dcSXinWang10 defm TZCNT64 : Lzcnt<0xBC, "tzcnt", cttz, Xi64, WriteTZCNT, WriteTZCNTLd>, XS; 1196b9ea7327SWang, Xin10 1197d9e875dcSXinWang10 defm TZCNT16 : Lzcnt<0xF4, "tzcnt", null_frag, Xi16, WriteTZCNT, WriteTZCNTLd, "_EVEX">, PL, PD; 1198d9e875dcSXinWang10 defm TZCNT32 : Lzcnt<0xF4, "tzcnt", null_frag, Xi32, WriteTZCNT, WriteTZCNTLd, "_EVEX">, PL; 1199d9e875dcSXinWang10 defm TZCNT64 : Lzcnt<0xF4, "tzcnt", null_frag, Xi64, WriteTZCNT, WriteTZCNTLd, "_EVEX">, PL; 1200b9ea7327SWang, Xin10} 1201b9ea7327SWang, Xin10 1202d9e875dcSXinWang10defm TZCNT16 : Lzcnt<0xF4, "tzcnt", null_frag, Xi16, WriteTZCNT, WriteTZCNTLd, "_NF">, NF, PD; 1203d9e875dcSXinWang10defm TZCNT32 : Lzcnt<0xF4, "tzcnt", null_frag, Xi32, WriteTZCNT, WriteTZCNTLd, "_NF">, NF; 1204d9e875dcSXinWang10defm TZCNT64 : Lzcnt<0xF4, "tzcnt", null_frag, Xi64, WriteTZCNT, WriteTZCNTLd, "_NF">, NF; 1205d9e875dcSXinWang10 120689ddd945SShengchen Kanmulticlass Bls<string m, Format RegMRM, Format MemMRM, X86TypeInfo t, string Suffix = ""> { 120789ddd945SShengchen Kan let SchedRW = [WriteBLS] in { 120889ddd945SShengchen Kan def rr#Suffix : UnaryOpR<0xF3, RegMRM, m, unaryop_ndd_args, t, 120989ddd945SShengchen Kan (outs t.RegClass:$dst), []>, T8, VVVV; 1210b9ea7327SWang, Xin10 } 1211b9ea7327SWang, Xin10 121289ddd945SShengchen Kan let SchedRW = [WriteBLS.Folded] in 121389ddd945SShengchen Kan def rm#Suffix : UnaryOpM<0xF3, MemMRM, m, unaryop_ndd_args, t, 121489ddd945SShengchen Kan (outs t.RegClass:$dst), []>, T8, VVVV; 1215b9ea7327SWang, Xin10} 1216b9ea7327SWang, Xin10 1217816cc9d2SXinWang10let Defs = [EFLAGS] in { 121889ddd945SShengchen Kan defm BLSR32 : Bls<"blsr", MRM1r, MRM1m, Xi32>, VEX; 121989ddd945SShengchen Kan defm BLSR64 : Bls<"blsr", MRM1r, MRM1m, Xi64>, VEX; 122089ddd945SShengchen Kan defm BLSMSK32 : Bls<"blsmsk", MRM2r, MRM2m, Xi32>, VEX; 122189ddd945SShengchen Kan defm BLSMSK64 : Bls<"blsmsk", MRM2r, MRM2m, Xi64>, VEX; 122289ddd945SShengchen Kan defm BLSI32 : Bls<"blsi", MRM3r, MRM3m, Xi32>, VEX; 122389ddd945SShengchen Kan defm BLSI64 : Bls<"blsi", MRM3r, MRM3m, Xi64>, VEX; 122489ddd945SShengchen Kan} 122589ddd945SShengchen Kan 1226816cc9d2SXinWang10let Predicates = [In64BitMode], Defs = [EFLAGS] in { 122789ddd945SShengchen Kan defm BLSR32 : Bls<"blsr", MRM1r, MRM1m, Xi32, "_EVEX">, EVEX; 122889ddd945SShengchen Kan defm BLSR64 : Bls<"blsr", MRM1r, MRM1m, Xi64, "_EVEX">, EVEX; 122989ddd945SShengchen Kan defm BLSMSK32 : Bls<"blsmsk", MRM2r, MRM2m, Xi32, "_EVEX">, EVEX; 123089ddd945SShengchen Kan defm BLSMSK64 : Bls<"blsmsk", MRM2r, MRM2m, Xi64, "_EVEX">, EVEX; 123189ddd945SShengchen Kan defm BLSI32 : Bls<"blsi", MRM3r, MRM3m, Xi32, "_EVEX">, EVEX; 123289ddd945SShengchen Kan defm BLSI64 : Bls<"blsi", MRM3r, MRM3m, Xi64, "_EVEX">, EVEX; 1233de55a284SXinWang10} 1234de55a284SXinWang10 1235816cc9d2SXinWang10let Predicates = [In64BitMode] in { 1236816cc9d2SXinWang10 defm BLSR32 : Bls<"blsr", MRM1r, MRM1m, Xi32, "_NF">, EVEX, EVEX_NF; 1237816cc9d2SXinWang10 defm BLSR64 : Bls<"blsr", MRM1r, MRM1m, Xi64, "_NF">, EVEX, EVEX_NF; 1238816cc9d2SXinWang10 defm BLSMSK32 : Bls<"blsmsk", MRM2r, MRM2m, Xi32, "_NF">, EVEX, EVEX_NF; 1239816cc9d2SXinWang10 defm BLSMSK64 : Bls<"blsmsk", MRM2r, MRM2m, Xi64, "_NF">, EVEX, EVEX_NF; 1240816cc9d2SXinWang10 defm BLSI32 : Bls<"blsi", MRM3r, MRM3m, Xi32, "_NF">, EVEX, EVEX_NF; 1241816cc9d2SXinWang10 defm BLSI64 : Bls<"blsi", MRM3r, MRM3m, Xi64, "_NF">, EVEX, EVEX_NF; 1242816cc9d2SXinWang10} 1243816cc9d2SXinWang10 12442d92f7deSXinWang10multiclass Bls_Pats<string suffix> { 1245b9ea7327SWang, Xin10 // FIXME(1): patterns for the load versions are not implemented 1246b9ea7327SWang, Xin10 // FIXME(2): By only matching `add_su` and `ineg_su` we may emit 1247b9ea7327SWang, Xin10 // extra `mov` instructions if `src` has future uses. It may be better 1248b9ea7327SWang, Xin10 // to always match if `src` has more users. 1249b9ea7327SWang, Xin10 def : Pat<(and GR32:$src, (add_su GR32:$src, -1)), 12502d92f7deSXinWang10 (!cast<Instruction>(BLSR32rr#suffix) GR32:$src)>; 1251b9ea7327SWang, Xin10 def : Pat<(and GR64:$src, (add_su GR64:$src, -1)), 12522d92f7deSXinWang10 (!cast<Instruction>(BLSR64rr#suffix) GR64:$src)>; 1253b9ea7327SWang, Xin10 1254b9ea7327SWang, Xin10 def : Pat<(xor GR32:$src, (add_su GR32:$src, -1)), 12552d92f7deSXinWang10 (!cast<Instruction>(BLSMSK32rr#suffix) GR32:$src)>; 1256b9ea7327SWang, Xin10 def : Pat<(xor GR64:$src, (add_su GR64:$src, -1)), 12572d92f7deSXinWang10 (!cast<Instruction>(BLSMSK64rr#suffix) GR64:$src)>; 1258b9ea7327SWang, Xin10 1259b9ea7327SWang, Xin10 def : Pat<(and GR32:$src, (ineg_su GR32:$src)), 12602d92f7deSXinWang10 (!cast<Instruction>(BLSI32rr#suffix) GR32:$src)>; 1261b9ea7327SWang, Xin10 def : Pat<(and GR64:$src, (ineg_su GR64:$src)), 12622d92f7deSXinWang10 (!cast<Instruction>(BLSI64rr#suffix) GR64:$src)>; 1263b9ea7327SWang, Xin10 1264b9ea7327SWang, Xin10 // Versions to match flag producing ops. 1265b9ea7327SWang, Xin10 def : Pat<(and_flag_nocf GR32:$src, (add_su GR32:$src, -1)), 12662d92f7deSXinWang10 (!cast<Instruction>(BLSR32rr#suffix) GR32:$src)>; 1267b9ea7327SWang, Xin10 def : Pat<(and_flag_nocf GR64:$src, (add_su GR64:$src, -1)), 12682d92f7deSXinWang10 (!cast<Instruction>(BLSR64rr#suffix) GR64:$src)>; 1269b9ea7327SWang, Xin10 1270b9ea7327SWang, Xin10 def : Pat<(xor_flag_nocf GR32:$src, (add_su GR32:$src, -1)), 12712d92f7deSXinWang10 (!cast<Instruction>(BLSMSK32rr#suffix) GR32:$src)>; 1272b9ea7327SWang, Xin10 def : Pat<(xor_flag_nocf GR64:$src, (add_su GR64:$src, -1)), 12732d92f7deSXinWang10 (!cast<Instruction>(BLSMSK64rr#suffix) GR64:$src)>; 1274b9ea7327SWang, Xin10 1275b9ea7327SWang, Xin10 def : Pat<(and_flag_nocf GR32:$src, (ineg_su GR32:$src)), 12762d92f7deSXinWang10 (!cast<Instruction>(BLSI32rr#suffix) GR32:$src)>; 1277b9ea7327SWang, Xin10 def : Pat<(and_flag_nocf GR64:$src, (ineg_su GR64:$src)), 12782d92f7deSXinWang10 (!cast<Instruction>(BLSI64rr#suffix) GR64:$src)>; 1279b9ea7327SWang, Xin10} 1280b9ea7327SWang, Xin10 12812d92f7deSXinWang10let Predicates = [HasBMI, NoEGPR] in 12822d92f7deSXinWang10 defm : Bls_Pats<"">; 12832d92f7deSXinWang10 12842d92f7deSXinWang10let Predicates = [HasBMI, HasEGPR] in 12852d92f7deSXinWang10 defm : Bls_Pats<"_EVEX">; 12862d92f7deSXinWang10 128789ddd945SShengchen Kanmulticlass Bmi4VOp3<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, 128889ddd945SShengchen Kan X86FoldableSchedWrite sched, string Suffix = ""> { 128989ddd945SShengchen Kan let SchedRW = [sched], Form = MRMSrcReg4VOp3 in 129089ddd945SShengchen Kan def rr#Suffix : BinOpRR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst), 129189ddd945SShengchen Kan [(set t.RegClass:$dst, EFLAGS, 129289ddd945SShengchen Kan (node t.RegClass:$src1, t.RegClass:$src2))]>, T8; 129389ddd945SShengchen Kan let SchedRW = [sched.Folded, 129489ddd945SShengchen Kan ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault, 129589ddd945SShengchen Kan sched.ReadAfterFold], Form = MRMSrcMem4VOp3 in 129689ddd945SShengchen Kan def rm#Suffix : BinOpMR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst), 129789ddd945SShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node (t.LoadNode addr:$src1), 129889ddd945SShengchen Kan t.RegClass:$src2))]>, T8; 1299b9ea7327SWang, Xin10} 1300b9ea7327SWang, Xin10 1301de55a284SXinWang10let Predicates = [HasBMI, NoEGPR], Defs = [EFLAGS] in { 130289ddd945SShengchen Kan defm BEXTR32 : Bmi4VOp3<0xF7, "bextr", Xi32, X86bextr, WriteBEXTR>, VEX; 130389ddd945SShengchen Kan defm BEXTR64 : Bmi4VOp3<0xF7, "bextr", Xi64, X86bextr, WriteBEXTR>, VEX; 1304b9ea7327SWang, Xin10} 1305de55a284SXinWang10let Predicates = [HasBMI2, NoEGPR], Defs = [EFLAGS] in { 130689ddd945SShengchen Kan defm BZHI32 : Bmi4VOp3<0xF5, "bzhi", Xi32, X86bzhi, WriteBZHI>, VEX; 130789ddd945SShengchen Kan defm BZHI64 : Bmi4VOp3<0xF5, "bzhi", Xi64, X86bzhi, WriteBZHI>, VEX; 1308b9ea7327SWang, Xin10} 130989ddd945SShengchen Kanlet Predicates = [HasBMI, HasEGPR, In64BitMode], Defs = [EFLAGS] in { 131089ddd945SShengchen Kan defm BEXTR32 : Bmi4VOp3<0xF7, "bextr", Xi32, X86bextr, WriteBEXTR, "_EVEX">, EVEX; 131189ddd945SShengchen Kan defm BEXTR64 : Bmi4VOp3<0xF7, "bextr", Xi64, X86bextr, WriteBEXTR, "_EVEX">, EVEX; 1312de55a284SXinWang10} 131389ddd945SShengchen Kanlet Predicates = [HasBMI2, HasEGPR, In64BitMode], Defs = [EFLAGS] in { 131489ddd945SShengchen Kan defm BZHI32 : Bmi4VOp3<0xF5, "bzhi", Xi32, X86bzhi, WriteBZHI, "_EVEX">, EVEX; 131589ddd945SShengchen Kan defm BZHI64 : Bmi4VOp3<0xF5, "bzhi", Xi64, X86bzhi, WriteBZHI, "_EVEX">, EVEX; 1316de55a284SXinWang10} 1317b9ea7327SWang, Xin10 1318816cc9d2SXinWang10let Predicates = [In64BitMode] in { 1319816cc9d2SXinWang10 defm BEXTR32 : Bmi4VOp3<0xF7, "bextr", Xi32, null_frag, WriteBEXTR, "_NF">, EVEX, EVEX_NF; 1320816cc9d2SXinWang10 defm BEXTR64 : Bmi4VOp3<0xF7, "bextr", Xi64, null_frag, WriteBEXTR, "_NF">, EVEX, EVEX_NF; 1321816cc9d2SXinWang10 defm BZHI32 : Bmi4VOp3<0xF5, "bzhi", Xi32, null_frag, WriteBZHI, "_NF">, EVEX, EVEX_NF; 1322816cc9d2SXinWang10 defm BZHI64 : Bmi4VOp3<0xF5, "bzhi", Xi64, null_frag, WriteBZHI, "_NF">, EVEX, EVEX_NF; 1323816cc9d2SXinWang10} 1324816cc9d2SXinWang10 1325b9ea7327SWang, Xin10def CountTrailingOnes : SDNodeXForm<imm, [{ 1326b9ea7327SWang, Xin10 // Count the trailing ones in the immediate. 1327b9ea7327SWang, Xin10 return getI8Imm(llvm::countr_one(N->getZExtValue()), SDLoc(N)); 1328b9ea7327SWang, Xin10}]>; 1329b9ea7327SWang, Xin10 1330b9ea7327SWang, Xin10def BEXTRMaskXForm : SDNodeXForm<imm, [{ 1331b9ea7327SWang, Xin10 unsigned Length = llvm::countr_one(N->getZExtValue()); 1332b9ea7327SWang, Xin10 return getI32Imm(Length << 8, SDLoc(N)); 1333b9ea7327SWang, Xin10}]>; 1334b9ea7327SWang, Xin10 1335b9ea7327SWang, Xin10def AndMask64 : ImmLeaf<i64, [{ 1336b9ea7327SWang, Xin10 return isMask_64(Imm) && !isUInt<32>(Imm); 1337b9ea7327SWang, Xin10}]>; 1338b9ea7327SWang, Xin10 1339b9ea7327SWang, Xin10// Use BEXTR for 64-bit 'and' with large immediate 'mask'. 13402d92f7deSXinWang10let Predicates = [HasBMI, NoBMI2, NoTBM, NoEGPR] in { 1341b9ea7327SWang, Xin10 def : Pat<(and GR64:$src, AndMask64:$mask), 1342b9ea7327SWang, Xin10 (BEXTR64rr GR64:$src, 1343b9ea7327SWang, Xin10 (SUBREG_TO_REG (i64 0), 1344b9ea7327SWang, Xin10 (MOV32ri (BEXTRMaskXForm imm:$mask)), sub_32bit))>; 1345b9ea7327SWang, Xin10 def : Pat<(and (loadi64 addr:$src), AndMask64:$mask), 1346b9ea7327SWang, Xin10 (BEXTR64rm addr:$src, 1347b9ea7327SWang, Xin10 (SUBREG_TO_REG (i64 0), 1348b9ea7327SWang, Xin10 (MOV32ri (BEXTRMaskXForm imm:$mask)), sub_32bit))>; 1349b9ea7327SWang, Xin10} 1350b9ea7327SWang, Xin10 13512d92f7deSXinWang10let Predicates = [HasBMI, NoBMI2, NoTBM, HasEGPR] in { 13522d92f7deSXinWang10 def : Pat<(and GR64:$src, AndMask64:$mask), 13532d92f7deSXinWang10 (BEXTR64rr_EVEX GR64:$src, 13542d92f7deSXinWang10 (SUBREG_TO_REG (i64 0), 13552d92f7deSXinWang10 (MOV32ri (BEXTRMaskXForm imm:$mask)), sub_32bit))>; 13562d92f7deSXinWang10 def : Pat<(and (loadi64 addr:$src), AndMask64:$mask), 13572d92f7deSXinWang10 (BEXTR64rm_EVEX addr:$src, 13582d92f7deSXinWang10 (SUBREG_TO_REG (i64 0), 13592d92f7deSXinWang10 (MOV32ri (BEXTRMaskXForm imm:$mask)), sub_32bit))>; 13602d92f7deSXinWang10} 13612d92f7deSXinWang10 1362b9ea7327SWang, Xin10// Use BZHI for 64-bit 'and' with large immediate 'mask'. 13632d92f7deSXinWang10let Predicates = [HasBMI2, NoTBM, NoEGPR] in { 1364b9ea7327SWang, Xin10 def : Pat<(and GR64:$src, AndMask64:$mask), 1365b9ea7327SWang, Xin10 (BZHI64rr GR64:$src, 1366b9ea7327SWang, Xin10 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 1367b9ea7327SWang, Xin10 (MOV8ri (CountTrailingOnes imm:$mask)), sub_8bit))>; 1368b9ea7327SWang, Xin10 def : Pat<(and (loadi64 addr:$src), AndMask64:$mask), 1369b9ea7327SWang, Xin10 (BZHI64rm addr:$src, 1370b9ea7327SWang, Xin10 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 1371b9ea7327SWang, Xin10 (MOV8ri (CountTrailingOnes imm:$mask)), sub_8bit))>; 1372b9ea7327SWang, Xin10} 1373b9ea7327SWang, Xin10 13742d92f7deSXinWang10let Predicates = [HasBMI2, NoTBM, HasEGPR] in { 13752d92f7deSXinWang10 def : Pat<(and GR64:$src, AndMask64:$mask), 13762d92f7deSXinWang10 (BZHI64rr_EVEX GR64:$src, 13772d92f7deSXinWang10 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 13782d92f7deSXinWang10 (MOV8ri (CountTrailingOnes imm:$mask)), sub_8bit))>; 13792d92f7deSXinWang10 def : Pat<(and (loadi64 addr:$src), AndMask64:$mask), 13802d92f7deSXinWang10 (BZHI64rm_EVEX addr:$src, 13812d92f7deSXinWang10 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 13822d92f7deSXinWang10 (MOV8ri (CountTrailingOnes imm:$mask)), sub_8bit))>; 13832d92f7deSXinWang10} 13842d92f7deSXinWang10 1385d124b022SXinWang10multiclass PdepPext<string m, X86TypeInfo t, SDPatternOperator node, 1386d124b022SXinWang10 string suffix = ""> { 1387d124b022SXinWang10 def rr#suffix : ITy<0xF5, MRMSrcReg, t, (outs t.RegClass:$dst), 1388d124b022SXinWang10 (ins t.RegClass:$src1, t.RegClass:$src2), m, binop_ndd_args, 1389d124b022SXinWang10 [(set t.RegClass:$dst, (node t.RegClass:$src1, t.RegClass:$src2))]>, 1390d124b022SXinWang10 T8, VVVV, Sched<[WriteALU]>; 1391d124b022SXinWang10 def rm#suffix : ITy<0xF5, MRMSrcMem, t, (outs t.RegClass:$dst), 1392d124b022SXinWang10 (ins t.RegClass:$src1, t.MemOperand:$src2), m, binop_ndd_args, 1393d124b022SXinWang10 [(set t.RegClass:$dst, (node t.RegClass:$src1, (t.LoadNode addr:$src2)))]>, 1394d124b022SXinWang10 T8, VVVV, Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>; 1395b9ea7327SWang, Xin10} 1396b9ea7327SWang, Xin10 1397de55a284SXinWang10let Predicates = [HasBMI2, NoEGPR] in { 1398d124b022SXinWang10 defm PDEP32 : PdepPext<"pdep", Xi32, X86pdep>, XD, VEX; 1399d124b022SXinWang10 defm PDEP64 : PdepPext<"pdep", Xi64, X86pdep>, XD, REX_W, VEX; 1400d124b022SXinWang10 defm PEXT32 : PdepPext<"pext", Xi32, X86pext>, XS, VEX; 1401d124b022SXinWang10 defm PEXT64 : PdepPext<"pext", Xi64, X86pext>, XS, REX_W, VEX; 1402b9ea7327SWang, Xin10} 1403b9ea7327SWang, Xin10 1404de55a284SXinWang10let Predicates = [HasBMI2, HasEGPR] in { 1405d124b022SXinWang10 defm PDEP32 : PdepPext<"pdep", Xi32, X86pdep, "_EVEX">, XD, EVEX; 1406d124b022SXinWang10 defm PDEP64 : PdepPext<"pdep", Xi64, X86pdep, "_EVEX">, XD, REX_W, EVEX; 1407d124b022SXinWang10 defm PEXT32 : PdepPext<"pext", Xi32, X86pext, "_EVEX">, XS, EVEX; 1408d124b022SXinWang10 defm PEXT64 : PdepPext<"pext", Xi64, X86pext, "_EVEX">, XS, REX_W, EVEX; 1409de55a284SXinWang10} 1410de55a284SXinWang10 1411b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1412b9ea7327SWang, Xin10// Lightweight Profiling Instructions 1413b9ea7327SWang, Xin10 1414b9ea7327SWang, Xin10let Predicates = [HasLWP], SchedRW = [WriteSystem] in { 1415b9ea7327SWang, Xin10 1416b9ea7327SWang, Xin10def LLWPCB : I<0x12, MRM0r, (outs), (ins GR32:$src), "llwpcb\t$src", 1417b9ea7327SWang, Xin10 [(int_x86_llwpcb GR32:$src)]>, XOP, XOP9; 1418b9ea7327SWang, Xin10def SLWPCB : I<0x12, MRM1r, (outs GR32:$dst), (ins), "slwpcb\t$dst", 1419b9ea7327SWang, Xin10 [(set GR32:$dst, (int_x86_slwpcb))]>, XOP, XOP9; 1420b9ea7327SWang, Xin10 1421b9ea7327SWang, Xin10def LLWPCB64 : I<0x12, MRM0r, (outs), (ins GR64:$src), "llwpcb\t$src", 142234903456SShengchen Kan [(int_x86_llwpcb GR64:$src)]>, XOP, XOP9, REX_W; 1423b9ea7327SWang, Xin10def SLWPCB64 : I<0x12, MRM1r, (outs GR64:$dst), (ins), "slwpcb\t$dst", 142434903456SShengchen Kan [(set GR64:$dst, (int_x86_slwpcb))]>, XOP, XOP9, REX_W; 1425b9ea7327SWang, Xin10 1426b9ea7327SWang, Xin10multiclass lwpins_intr<RegisterClass RC> { 1427b9ea7327SWang, Xin10 def rri : Ii32<0x12, MRM0r, (outs), (ins RC:$src0, GR32:$src1, i32imm:$cntl), 1428b9ea7327SWang, Xin10 "lwpins\t{$cntl, $src1, $src0|$src0, $src1, $cntl}", 1429b9ea7327SWang, Xin10 [(set EFLAGS, (X86lwpins RC:$src0, GR32:$src1, timm:$cntl))]>, 143062d8ae0aSShengchen Kan XOP, VVVV, XOPA; 1431b9ea7327SWang, Xin10 let mayLoad = 1 in 1432b9ea7327SWang, Xin10 def rmi : Ii32<0x12, MRM0m, (outs), (ins RC:$src0, i32mem:$src1, i32imm:$cntl), 1433b9ea7327SWang, Xin10 "lwpins\t{$cntl, $src1, $src0|$src0, $src1, $cntl}", 1434b9ea7327SWang, Xin10 [(set EFLAGS, (X86lwpins RC:$src0, (loadi32 addr:$src1), timm:$cntl))]>, 143562d8ae0aSShengchen Kan XOP, VVVV, XOPA; 1436b9ea7327SWang, Xin10} 1437b9ea7327SWang, Xin10 1438b9ea7327SWang, Xin10let Defs = [EFLAGS] in { 1439b9ea7327SWang, Xin10 defm LWPINS32 : lwpins_intr<GR32>; 144034903456SShengchen Kan defm LWPINS64 : lwpins_intr<GR64>, REX_W; 1441b9ea7327SWang, Xin10} // EFLAGS 1442b9ea7327SWang, Xin10 1443b9ea7327SWang, Xin10multiclass lwpval_intr<RegisterClass RC, Intrinsic Int> { 1444b9ea7327SWang, Xin10 def rri : Ii32<0x12, MRM1r, (outs), (ins RC:$src0, GR32:$src1, i32imm:$cntl), 1445b9ea7327SWang, Xin10 "lwpval\t{$cntl, $src1, $src0|$src0, $src1, $cntl}", 144662d8ae0aSShengchen Kan [(Int RC:$src0, GR32:$src1, timm:$cntl)]>, XOP, VVVV, XOPA; 1447b9ea7327SWang, Xin10 let mayLoad = 1 in 1448b9ea7327SWang, Xin10 def rmi : Ii32<0x12, MRM1m, (outs), (ins RC:$src0, i32mem:$src1, i32imm:$cntl), 1449b9ea7327SWang, Xin10 "lwpval\t{$cntl, $src1, $src0|$src0, $src1, $cntl}", 1450b9ea7327SWang, Xin10 [(Int RC:$src0, (loadi32 addr:$src1), timm:$cntl)]>, 145162d8ae0aSShengchen Kan XOP, VVVV, XOPA; 1452b9ea7327SWang, Xin10} 1453b9ea7327SWang, Xin10 1454b9ea7327SWang, Xin10defm LWPVAL32 : lwpval_intr<GR32, int_x86_lwpval32>; 145534903456SShengchen Kandefm LWPVAL64 : lwpval_intr<GR64, int_x86_lwpval64>, REX_W; 1456b9ea7327SWang, Xin10 1457b9ea7327SWang, Xin10} // HasLWP, SchedRW 1458b9ea7327SWang, Xin10 1459b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1460b9ea7327SWang, Xin10// MONITORX/MWAITX Instructions 1461b9ea7327SWang, Xin10// 1462b9ea7327SWang, Xin10let SchedRW = [ WriteSystem ] in { 1463b9ea7327SWang, Xin10 let Uses = [ EAX, ECX, EDX ] in 1464b9ea7327SWang, Xin10 def MONITORX32rrr : I<0x01, MRM_FA, (outs), (ins), "monitorx", []>, 1465b9ea7327SWang, Xin10 TB, Requires<[ HasMWAITX, Not64BitMode ]>; 1466b9ea7327SWang, Xin10 let Uses = [ RAX, ECX, EDX ] in 1467b9ea7327SWang, Xin10 def MONITORX64rrr : I<0x01, MRM_FA, (outs), (ins), "monitorx", []>, 1468b9ea7327SWang, Xin10 TB, Requires<[ HasMWAITX, In64BitMode ]>; 1469b9ea7327SWang, Xin10 1470b9ea7327SWang, Xin10 let Uses = [ ECX, EAX, EBX ] in { 1471b9ea7327SWang, Xin10 def MWAITXrrr : I<0x01, MRM_FB, (outs), (ins), "mwaitx", 1472b9ea7327SWang, Xin10 []>, TB, Requires<[ HasMWAITX ]>; 1473b9ea7327SWang, Xin10 } 1474b9ea7327SWang, Xin10} // SchedRW 1475b9ea7327SWang, Xin10 1476b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1477b9ea7327SWang, Xin10// WAITPKG Instructions 1478b9ea7327SWang, Xin10// 1479b9ea7327SWang, Xin10let SchedRW = [WriteSystem] in { 1480b9ea7327SWang, Xin10 def UMONITOR16 : I<0xAE, MRM6r, (outs), (ins GR16:$src), 1481b9ea7327SWang, Xin10 "umonitor\t$src", [(int_x86_umonitor GR16:$src)]>, 1482ff32ab3aSShengchen Kan TB, XS, AdSize16, Requires<[HasWAITPKG, Not64BitMode]>; 1483b9ea7327SWang, Xin10 def UMONITOR32 : I<0xAE, MRM6r, (outs), (ins GR32:$src), 1484b9ea7327SWang, Xin10 "umonitor\t$src", [(int_x86_umonitor GR32:$src)]>, 1485ff32ab3aSShengchen Kan TB, XS, AdSize32, Requires<[HasWAITPKG]>; 1486b9ea7327SWang, Xin10 def UMONITOR64 : I<0xAE, MRM6r, (outs), (ins GR64:$src), 1487b9ea7327SWang, Xin10 "umonitor\t$src", [(int_x86_umonitor GR64:$src)]>, 1488ff32ab3aSShengchen Kan TB, XS, AdSize64, Requires<[HasWAITPKG, In64BitMode]>; 1489b9ea7327SWang, Xin10 let Uses = [EAX, EDX], Defs = [EFLAGS] in { 1490b9ea7327SWang, Xin10 def UMWAIT : I<0xAE, MRM6r, 1491b9ea7327SWang, Xin10 (outs), (ins GR32orGR64:$src), "umwait\t$src", 1492b9ea7327SWang, Xin10 [(set EFLAGS, (X86umwait GR32orGR64:$src, EDX, EAX))]>, 1493ff32ab3aSShengchen Kan TB, XD, Requires<[HasWAITPKG]>; 1494b9ea7327SWang, Xin10 def TPAUSE : I<0xAE, MRM6r, 1495b9ea7327SWang, Xin10 (outs), (ins GR32orGR64:$src), "tpause\t$src", 1496b9ea7327SWang, Xin10 [(set EFLAGS, (X86tpause GR32orGR64:$src, EDX, EAX))]>, 1497ff32ab3aSShengchen Kan TB, PD, Requires<[HasWAITPKG]>; 1498b9ea7327SWang, Xin10 } 1499b9ea7327SWang, Xin10} // SchedRW 1500b9ea7327SWang, Xin10 1501b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1502b9ea7327SWang, Xin10// MOVDIRI - Move doubleword/quadword as direct store 1503b9ea7327SWang, Xin10// 1504b9ea7327SWang, Xin10let SchedRW = [WriteStore] in { 1505b9ea7327SWang, Xin10def MOVDIRI32 : I<0xF9, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src), 1506b9ea7327SWang, Xin10 "movdiri\t{$src, $dst|$dst, $src}", 1507b9ea7327SWang, Xin10 [(int_x86_directstore32 addr:$dst, GR32:$src)]>, 15086e20df1aSShengchen Kan T8, Requires<[HasMOVDIRI, NoEGPR]>; 1509b9ea7327SWang, Xin10def MOVDIRI64 : RI<0xF9, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), 1510b9ea7327SWang, Xin10 "movdiri\t{$src, $dst|$dst, $src}", 1511b9ea7327SWang, Xin10 [(int_x86_directstore64 addr:$dst, GR64:$src)]>, 15126e20df1aSShengchen Kan T8, Requires<[In64BitMode, HasMOVDIRI, NoEGPR]>; 1513295415e7SXinWang10def MOVDIRI32_EVEX : I<0xF9, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src), 1514295415e7SXinWang10 "movdiri\t{$src, $dst|$dst, $src}", 1515295415e7SXinWang10 [(int_x86_directstore32 addr:$dst, GR32:$src)]>, 15166e20df1aSShengchen Kan EVEX, NoCD8, T_MAP4, Requires<[In64BitMode, HasMOVDIRI, HasEGPR]>; 1517295415e7SXinWang10def MOVDIRI64_EVEX : RI<0xF9, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), 1518295415e7SXinWang10 "movdiri\t{$src, $dst|$dst, $src}", 1519295415e7SXinWang10 [(int_x86_directstore64 addr:$dst, GR64:$src)]>, 15206e20df1aSShengchen Kan EVEX, NoCD8, T_MAP4, Requires<[In64BitMode, HasMOVDIRI, HasEGPR]>; 1521b9ea7327SWang, Xin10} // SchedRW 1522b9ea7327SWang, Xin10 1523b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1524b9ea7327SWang, Xin10// MOVDIR64B - Move 64 bytes as direct store 1525b9ea7327SWang, Xin10// 1526b9ea7327SWang, Xin10let SchedRW = [WriteStore] in { 15274dd5e9c6SWang, Xin10def MOVDIR64B16 : I<0xF8, MRMSrcMem, (outs), (ins GR16:$dst, i512mem_GR16:$src), 1528b9ea7327SWang, Xin10 "movdir64b\t{$src, $dst|$dst, $src}", []>, 1529ff32ab3aSShengchen Kan T8, PD, AdSize16, Requires<[HasMOVDIR64B, Not64BitMode]>; 15304dd5e9c6SWang, Xin10def MOVDIR64B32 : I<0xF8, MRMSrcMem, (outs), (ins GR32:$dst, i512mem_GR32:$src), 1531b9ea7327SWang, Xin10 "movdir64b\t{$src, $dst|$dst, $src}", 1532b9ea7327SWang, Xin10 [(int_x86_movdir64b GR32:$dst, addr:$src)]>, 1533ff32ab3aSShengchen Kan T8, PD, AdSize32, Requires<[HasMOVDIR64B, NoEGPR]>; 15344dd5e9c6SWang, Xin10def MOVDIR64B64 : I<0xF8, MRMSrcMem, (outs), (ins GR64:$dst, i512mem_GR64:$src), 1535b9ea7327SWang, Xin10 "movdir64b\t{$src, $dst|$dst, $src}", 1536b9ea7327SWang, Xin10 [(int_x86_movdir64b GR64:$dst, addr:$src)]>, 1537ff32ab3aSShengchen Kan T8, PD, AdSize64, Requires<[HasMOVDIR64B, NoEGPR, In64BitMode]>; 1538295415e7SXinWang10def MOVDIR64B32_EVEX : I<0xF8, MRMSrcMem, (outs), (ins GR32:$dst, i512mem_GR32:$src), 1539295415e7SXinWang10 "movdir64b\t{$src, $dst|$dst, $src}", 1540295415e7SXinWang10 [(int_x86_movdir64b GR32:$dst, addr:$src)]>, 1541ff32ab3aSShengchen Kan EVEX, NoCD8, T_MAP4, PD, AdSize32, Requires<[HasMOVDIR64B, HasEGPR, In64BitMode]>; 1542295415e7SXinWang10def MOVDIR64B64_EVEX : I<0xF8, MRMSrcMem, (outs), (ins GR64:$dst, i512mem_GR64:$src), 1543295415e7SXinWang10 "movdir64b\t{$src, $dst|$dst, $src}", 1544295415e7SXinWang10 [(int_x86_movdir64b GR64:$dst, addr:$src)]>, 1545ff32ab3aSShengchen Kan EVEX, NoCD8, T_MAP4, PD, AdSize64, Requires<[HasMOVDIR64B, HasEGPR, In64BitMode]>; 1546b9ea7327SWang, Xin10} // SchedRW 1547b9ea7327SWang, Xin10 1548b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1549b9ea7327SWang, Xin10// ENQCMD/S - Enqueue 64-byte command as user with 64-byte write atomicity 1550b9ea7327SWang, Xin10// 15516d0080b5SXinWang10multiclass Enqcmds<string suffix> { 15526d0080b5SXinWang10 def ENQCMD32#suffix : I<0xF8, MRMSrcMem, (outs), (ins GR32:$dst, i512mem_GR32:$src), 15536d0080b5SXinWang10 "enqcmd\t{$src, $dst|$dst, $src}", 15546d0080b5SXinWang10 [(set EFLAGS, (X86enqcmd GR32:$dst, addr:$src))]>, 15556d0080b5SXinWang10 NoCD8, XD, AdSize32; 15566d0080b5SXinWang10 def ENQCMD64#suffix : I<0xF8, MRMSrcMem, (outs), (ins GR64:$dst, i512mem_GR64:$src), 15576d0080b5SXinWang10 "enqcmd\t{$src, $dst|$dst, $src}", 15586d0080b5SXinWang10 [(set EFLAGS, (X86enqcmd GR64:$dst, addr:$src))]>, 15596d0080b5SXinWang10 NoCD8, XD, AdSize64; 15606d0080b5SXinWang10 15616d0080b5SXinWang10 def ENQCMDS32#suffix : I<0xF8, MRMSrcMem, (outs), (ins GR32:$dst, i512mem_GR32:$src), 15626d0080b5SXinWang10 "enqcmds\t{$src, $dst|$dst, $src}", 15636d0080b5SXinWang10 [(set EFLAGS, (X86enqcmds GR32:$dst, addr:$src))]>, 15646d0080b5SXinWang10 NoCD8, XS, AdSize32; 15656d0080b5SXinWang10 def ENQCMDS64#suffix : I<0xF8, MRMSrcMem, (outs), (ins GR64:$dst, i512mem_GR64:$src), 15666d0080b5SXinWang10 "enqcmds\t{$src, $dst|$dst, $src}", 15676d0080b5SXinWang10 [(set EFLAGS, (X86enqcmds GR64:$dst, addr:$src))]>, 15686d0080b5SXinWang10 NoCD8, XS, AdSize64; 15696d0080b5SXinWang10} 15706d0080b5SXinWang10 1571b9ea7327SWang, Xin10let SchedRW = [WriteStore], Defs = [EFLAGS] in { 15721bc4cb51SXinWang10 def ENQCMD16 : I<0xF8, MRMSrcMem, (outs), (ins GR16:$dst, i512mem_GR16:$src), 1573b9ea7327SWang, Xin10 "enqcmd\t{$src, $dst|$dst, $src}", 1574b9ea7327SWang, Xin10 [(set EFLAGS, (X86enqcmd GR16:$dst, addr:$src))]>, 1575ff32ab3aSShengchen Kan T8, XD, AdSize16, Requires<[HasENQCMD, Not64BitMode]>; 15761bc4cb51SXinWang10 def ENQCMDS16 : I<0xF8, MRMSrcMem, (outs), (ins GR16:$dst, i512mem_GR16:$src), 1577b9ea7327SWang, Xin10 "enqcmds\t{$src, $dst|$dst, $src}", 1578b9ea7327SWang, Xin10 [(set EFLAGS, (X86enqcmds GR16:$dst, addr:$src))]>, 1579ff32ab3aSShengchen Kan T8, XS, AdSize16, Requires<[HasENQCMD, Not64BitMode]>; 15806d0080b5SXinWang10 15816d0080b5SXinWang10 defm "" : Enqcmds<"">, T8, Requires<[HasENQCMD, NoEGPR]>; 15826d0080b5SXinWang10 defm "" : Enqcmds<"_EVEX">, EVEX, T_MAP4, Requires<[HasENQCMD, HasEGPR, In64BitMode]>; 15836d0080b5SXinWang10 1584b9ea7327SWang, Xin10} 1585b9ea7327SWang, Xin10 1586b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1587b9ea7327SWang, Xin10// CLZERO Instruction 1588b9ea7327SWang, Xin10// 1589b9ea7327SWang, Xin10let SchedRW = [WriteLoad] in { 1590b9ea7327SWang, Xin10 let Uses = [EAX] in 1591b9ea7327SWang, Xin10 def CLZERO32r : I<0x01, MRM_FC, (outs), (ins), "clzero", []>, 1592b9ea7327SWang, Xin10 TB, Requires<[HasCLZERO, Not64BitMode]>; 1593b9ea7327SWang, Xin10 let Uses = [RAX] in 1594b9ea7327SWang, Xin10 def CLZERO64r : I<0x01, MRM_FC, (outs), (ins), "clzero", []>, 1595b9ea7327SWang, Xin10 TB, Requires<[HasCLZERO, In64BitMode]>; 1596b9ea7327SWang, Xin10} // SchedRW 1597b9ea7327SWang, Xin10 1598b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1599b9ea7327SWang, Xin10// INVLPGB Instruction 1600b9ea7327SWang, Xin10// OPCODE 0F 01 FE 1601b9ea7327SWang, Xin10// 1602b9ea7327SWang, Xin10let SchedRW = [WriteSystem] in { 1603b9ea7327SWang, Xin10 let Uses = [EAX, EDX] in 1604b9ea7327SWang, Xin10 def INVLPGB32 : I<0x01, MRM_FE, (outs), (ins), 1605b9ea7327SWang, Xin10 "invlpgb", []>, 16066e20df1aSShengchen Kan TB, Requires<[Not64BitMode]>; 1607b9ea7327SWang, Xin10 let Uses = [RAX, EDX] in 1608b9ea7327SWang, Xin10 def INVLPGB64 : I<0x01, MRM_FE, (outs), (ins), 1609b9ea7327SWang, Xin10 "invlpgb", []>, 16106e20df1aSShengchen Kan TB, Requires<[In64BitMode]>; 1611b9ea7327SWang, Xin10} // SchedRW 1612b9ea7327SWang, Xin10 1613b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1614b9ea7327SWang, Xin10// TLBSYNC Instruction 1615b9ea7327SWang, Xin10// OPCODE 0F 01 FF 1616b9ea7327SWang, Xin10// 1617b9ea7327SWang, Xin10let SchedRW = [WriteSystem] in { 1618b9ea7327SWang, Xin10 def TLBSYNC : I<0x01, MRM_FF, (outs), (ins), 1619b9ea7327SWang, Xin10 "tlbsync", []>, 16206e20df1aSShengchen Kan TB, Requires<[]>; 1621b9ea7327SWang, Xin10} // SchedRW 1622b9ea7327SWang, Xin10 1623b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1624b9ea7327SWang, Xin10// HRESET Instruction 1625b9ea7327SWang, Xin10// 1626b9ea7327SWang, Xin10let Uses = [EAX], SchedRW = [WriteSystem] in 1627b9ea7327SWang, Xin10 def HRESET : Ii8<0xF0, MRM_C0, (outs), (ins i32u8imm:$imm), "hreset\t$imm", []>, 1628ff32ab3aSShengchen Kan Requires<[HasHRESET]>, TA, XS; 1629b9ea7327SWang, Xin10 1630b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1631b9ea7327SWang, Xin10// SERIALIZE Instruction 1632b9ea7327SWang, Xin10// 1633b9ea7327SWang, Xin10let SchedRW = [WriteSystem] in 1634b9ea7327SWang, Xin10 def SERIALIZE : I<0x01, MRM_E8, (outs), (ins), "serialize", 16356e20df1aSShengchen Kan [(int_x86_serialize)]>, TB, 1636b9ea7327SWang, Xin10 Requires<[HasSERIALIZE]>; 1637b9ea7327SWang, Xin10 1638b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1639b9ea7327SWang, Xin10// TSXLDTRK - TSX Suspend Load Address Tracking 1640b9ea7327SWang, Xin10// 1641b9ea7327SWang, Xin10let Predicates = [HasTSXLDTRK], SchedRW = [WriteSystem] in { 1642b9ea7327SWang, Xin10 def XSUSLDTRK : I<0x01, MRM_E8, (outs), (ins), "xsusldtrk", 1643ff32ab3aSShengchen Kan [(int_x86_xsusldtrk)]>, TB, XD; 1644b9ea7327SWang, Xin10 def XRESLDTRK : I<0x01, MRM_E9, (outs), (ins), "xresldtrk", 1645ff32ab3aSShengchen Kan [(int_x86_xresldtrk)]>, TB, XD; 1646b9ea7327SWang, Xin10} 1647b9ea7327SWang, Xin10 1648b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1649b9ea7327SWang, Xin10// UINTR Instructions 1650b9ea7327SWang, Xin10// 1651b9ea7327SWang, Xin10let Predicates = [HasUINTR, In64BitMode], SchedRW = [WriteSystem] in { 1652b9ea7327SWang, Xin10 def UIRET : I<0x01, MRM_EC, (outs), (ins), "uiret", 1653ff32ab3aSShengchen Kan []>, TB, XS; 1654b9ea7327SWang, Xin10 def CLUI : I<0x01, MRM_EE, (outs), (ins), "clui", 1655ff32ab3aSShengchen Kan [(int_x86_clui)]>, TB, XS; 1656b9ea7327SWang, Xin10 def STUI : I<0x01, MRM_EF, (outs), (ins), "stui", 1657ff32ab3aSShengchen Kan [(int_x86_stui)]>, TB, XS; 1658b9ea7327SWang, Xin10 1659b9ea7327SWang, Xin10 def SENDUIPI : I<0xC7, MRM6r, (outs), (ins GR64:$arg), "senduipi\t$arg", 1660ff32ab3aSShengchen Kan [(int_x86_senduipi GR64:$arg)]>, TB, XS; 1661b9ea7327SWang, Xin10 1662b9ea7327SWang, Xin10 let Defs = [EFLAGS] in 1663b9ea7327SWang, Xin10 def TESTUI : I<0x01, MRM_ED, (outs), (ins), "testui", 1664ff32ab3aSShengchen Kan [(set EFLAGS, (X86testui))]>, TB, XS; 1665b9ea7327SWang, Xin10} 1666b9ea7327SWang, Xin10 1667b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1668b9ea7327SWang, Xin10// PREFETCHIT0 and PREFETCHIT1 Instructions 1669b9ea7327SWang, Xin10// prefetch ADDR, RW, Locality, Data 1670b9ea7327SWang, Xin10let Predicates = [HasPREFETCHI, In64BitMode], SchedRW = [WriteLoad] in { 1671b9ea7327SWang, Xin10 def PREFETCHIT0 : I<0x18, MRM7m, (outs), (ins i8mem:$src), 1672b9ea7327SWang, Xin10 "prefetchit0\t$src", [(prefetch addr:$src, (i32 0), (i32 3), (i32 0))]>, TB; 1673b9ea7327SWang, Xin10 def PREFETCHIT1 : I<0x18, MRM6m, (outs), (ins i8mem:$src), 1674b9ea7327SWang, Xin10 "prefetchit1\t$src", [(prefetch addr:$src, (i32 0), (i32 2), (i32 0))]>, TB; 1675b9ea7327SWang, Xin10} 1676b9ea7327SWang, Xin10 1677b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1678b9ea7327SWang, Xin10// CMPCCXADD Instructions 1679b9ea7327SWang, Xin10// 1680b9ea7327SWang, Xin10let isCodeGenOnly = 1, ForceDisassemble = 1, mayLoad = 1, mayStore = 1, 16811d4691a2SXinWang10 Defs = [EFLAGS], Constraints = "$dstsrc1 = $dst" in { 16821d4691a2SXinWang10let Predicates = [HasCMPCCXADD, NoEGPR, In64BitMode] in { 1683b9ea7327SWang, Xin10def CMPCCXADDmr32 : I<0xe0, MRMDestMem4VOp3CC, (outs GR32:$dst), 1684b9ea7327SWang, Xin10 (ins GR32:$dstsrc1, i32mem:$dstsrc2, GR32:$src3, ccode:$cond), 1685b9ea7327SWang, Xin10 "cmp${cond}xadd\t{$src3, $dst, $dstsrc2|$dstsrc2, $dst, $src3}", 1686b9ea7327SWang, Xin10 [(set GR32:$dst, (X86cmpccxadd addr:$dstsrc2, 1687b9ea7327SWang, Xin10 GR32:$dstsrc1, GR32:$src3, timm:$cond))]>, 1688ff32ab3aSShengchen Kan VEX, VVVV, T8, PD, Sched<[WriteXCHG]>; 1689b9ea7327SWang, Xin10 1690b9ea7327SWang, Xin10def CMPCCXADDmr64 : I<0xe0, MRMDestMem4VOp3CC, (outs GR64:$dst), 1691b9ea7327SWang, Xin10 (ins GR64:$dstsrc1, i64mem:$dstsrc2, GR64:$src3, ccode:$cond), 1692b9ea7327SWang, Xin10 "cmp${cond}xadd\t{$src3, $dst, $dstsrc2|$dstsrc2, $dst, $src3}", 1693b9ea7327SWang, Xin10 [(set GR64:$dst, (X86cmpccxadd addr:$dstsrc2, 1694b9ea7327SWang, Xin10 GR64:$dstsrc1, GR64:$src3, timm:$cond))]>, 1695ff32ab3aSShengchen Kan VEX, VVVV, REX_W, T8, PD, Sched<[WriteXCHG]>; 1696b9ea7327SWang, Xin10} 1697b9ea7327SWang, Xin10 16981d4691a2SXinWang10let Predicates = [HasCMPCCXADD, HasEGPR, In64BitMode] in { 16991d4691a2SXinWang10def CMPCCXADDmr32_EVEX : I<0xe0, MRMDestMem4VOp3CC, (outs GR32:$dst), 17001d4691a2SXinWang10 (ins GR32:$dstsrc1, i32mem:$dstsrc2, GR32:$src3, ccode:$cond), 17011d4691a2SXinWang10 "cmp${cond}xadd\t{$src3, $dst, $dstsrc2|$dstsrc2, $dst, $src3}", 17021d4691a2SXinWang10 [(set GR32:$dst, (X86cmpccxadd addr:$dstsrc2, 17031d4691a2SXinWang10 GR32:$dstsrc1, GR32:$src3, timm:$cond))]>, 1704ff32ab3aSShengchen Kan EVEX, VVVV, NoCD8, T8, PD, Sched<[WriteXCHG]>; 17051d4691a2SXinWang10 17061d4691a2SXinWang10def CMPCCXADDmr64_EVEX : I<0xe0, MRMDestMem4VOp3CC, (outs GR64:$dst), 17071d4691a2SXinWang10 (ins GR64:$dstsrc1, i64mem:$dstsrc2, GR64:$src3, ccode:$cond), 17081d4691a2SXinWang10 "cmp${cond}xadd\t{$src3, $dst, $dstsrc2|$dstsrc2, $dst, $src3}", 17091d4691a2SXinWang10 [(set GR64:$dst, (X86cmpccxadd addr:$dstsrc2, 17101d4691a2SXinWang10 GR64:$dstsrc1, GR64:$src3, timm:$cond))]>, 1711ff32ab3aSShengchen Kan EVEX, VVVV, NoCD8, REX_W, T8, PD, Sched<[WriteXCHG]>; 17121d4691a2SXinWang10} 17131d4691a2SXinWang10} 17141d4691a2SXinWang10 1715b9ea7327SWang, Xin10//===----------------------------------------------------------------------===// 1716b9ea7327SWang, Xin10// Memory Instructions 1717b9ea7327SWang, Xin10// 1718b9ea7327SWang, Xin10 1719b9ea7327SWang, Xin10let Predicates = [HasCLFLUSHOPT], SchedRW = [WriteLoad] in 1720b9ea7327SWang, Xin10def CLFLUSHOPT : I<0xAE, MRM7m, (outs), (ins i8mem:$src), 1721ff32ab3aSShengchen Kan "clflushopt\t$src", [(int_x86_clflushopt addr:$src)]>, TB, PD; 1722b9ea7327SWang, Xin10 1723b9ea7327SWang, Xin10let Predicates = [HasCLWB], SchedRW = [WriteLoad] in 1724b9ea7327SWang, Xin10def CLWB : I<0xAE, MRM6m, (outs), (ins i8mem:$src), "clwb\t$src", 1725ff32ab3aSShengchen Kan [(int_x86_clwb addr:$src)]>, TB, PD; 1726b9ea7327SWang, Xin10 1727b9ea7327SWang, Xin10let Predicates = [HasCLDEMOTE], SchedRW = [WriteLoad] in 1728b9ea7327SWang, Xin10def CLDEMOTE : I<0x1C, MRM0m, (outs), (ins i8mem:$src), "cldemote\t$src", 17296e20df1aSShengchen Kan [(int_x86_cldemote addr:$src)]>, TB; 17309f06129eSMalay Sanghi 17319f06129eSMalay Sanghi//===----------------------------------------------------------------------===// 17329f06129eSMalay Sanghi// MOVRS Instructions 17339f06129eSMalay Sanghi// 17349f06129eSMalay Sanghi 17359f06129eSMalay Sanghilet SchedRW = [WriteLoad] in { 17361274bca2SPhoebe Wanglet Predicates = [HasMOVRS, NoEGPR, In64BitMode] in { 17379f06129eSMalay Sanghidef MOVRS8rm : I<0x8A, MRMSrcMem, (outs GR8 :$dst), (ins i8mem :$src), 17389f06129eSMalay Sanghi "movrs{b}\t{$src, $dst|$dst, $src}", 17399f06129eSMalay Sanghi [(set GR8:$dst, (int_x86_movrsqi addr:$src))]>, T8; 17409f06129eSMalay Sanghidef MOVRS16rm : I<0x8B, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src), 17419f06129eSMalay Sanghi "movrs{w}\t{$src, $dst|$dst, $src}", 17429f06129eSMalay Sanghi [(set GR16:$dst, (int_x86_movrshi addr:$src))]>, OpSize16, T8; 17439f06129eSMalay Sanghidef MOVRS32rm : I<0x8B, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src), 17449f06129eSMalay Sanghi "movrs{l}\t{$src, $dst|$dst, $src}", 17459f06129eSMalay Sanghi [(set GR32:$dst, (int_x86_movrssi addr:$src))]>, OpSize32, T8; 17469f06129eSMalay Sanghidef MOVRS64rm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 17479f06129eSMalay Sanghi "movrs{q}\t{$src, $dst|$dst, $src}", 17489f06129eSMalay Sanghi [(set GR64:$dst, (int_x86_movrsdi addr:$src))]>, T8; 17491274bca2SPhoebe Wang} 17501274bca2SPhoebe Wang 17511274bca2SPhoebe Wanglet Predicates = [HasMOVRS] in 17529f06129eSMalay Sanghidef PREFETCHRST2 : I<0x18, MRM4m, (outs), (ins i8mem:$src), 17539f06129eSMalay Sanghi "prefetchrst2\t$src", 17549f06129eSMalay Sanghi [(int_x86_prefetchrs addr:$src)]>, TB; 17551274bca2SPhoebe Wang 17561274bca2SPhoebe Wanglet Predicates = [HasMOVRS, HasEGPR, In64BitMode] in { 17571274bca2SPhoebe Wangdef MOVRS8rm_EVEX : I<0x8A, MRMSrcMem, (outs GR8 :$dst), (ins i8mem :$src), 17581274bca2SPhoebe Wang "movrs{b}\t{$src, $dst|$dst, $src}", 17591274bca2SPhoebe Wang [(set GR8:$dst, (int_x86_movrsqi addr:$src))]>, EVEX, NoCD8, T_MAP4; 17601274bca2SPhoebe Wangdef MOVRS16rm_EVEX : I<0x8B, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src), 17611274bca2SPhoebe Wang "movrs{w}\t{$src, $dst|$dst, $src}", 17621274bca2SPhoebe Wang [(set GR16:$dst, (int_x86_movrshi addr:$src))]>, EVEX, NoCD8, PD, T_MAP4; 17631274bca2SPhoebe Wangdef MOVRS32rm_EVEX : I<0x8B, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src), 17641274bca2SPhoebe Wang "movrs{l}\t{$src, $dst|$dst, $src}", 17651274bca2SPhoebe Wang [(set GR32:$dst, (int_x86_movrssi addr:$src))]>, EVEX, NoCD8, T_MAP4; 17661274bca2SPhoebe Wangdef MOVRS64rm_EVEX : I<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 17671274bca2SPhoebe Wang "movrs{q}\t{$src, $dst|$dst, $src}", 17681274bca2SPhoebe Wang [(set GR64:$dst, (int_x86_movrsdi addr:$src))]>, EVEX, NoCD8, T_MAP4, REX_W; 17699f06129eSMalay Sanghi} 17709f06129eSMalay Sanghi} 1771