1689db42cSShengchen Kan//===-- X86InstrUtils.td - X86 Instruction Utilities --------*- tablegen -*-===// 2689db42cSShengchen Kan// 3689db42cSShengchen Kan// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4689db42cSShengchen Kan// See https://llvm.org/LICENSE.txt for license information. 5689db42cSShengchen Kan// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6689db42cSShengchen Kan// 7689db42cSShengchen Kan//===----------------------------------------------------------------------===// 8689db42cSShengchen Kan// 9689db42cSShengchen Kan// This file provides utilities for simplifying the instruction definitions. 10689db42cSShengchen Kan// 11689db42cSShengchen Kan//===----------------------------------------------------------------------===// 12689db42cSShengchen Kan 13689db42cSShengchen Kan//===----------------------------------------------------------------------===// 14689db42cSShengchen Kan// Classes for setting the fields of X86Inst 15689db42cSShengchen Kan//===----------------------------------------------------------------------===// 16689db42cSShengchen Kan 17689db42cSShengchen Kan// Prefix byte classes which are used to indicate to the ad-hoc machine code 18689db42cSShengchen Kan// emitter that various prefix bytes are required. 19689db42cSShengchen Kanclass OpSize16 { OperandSize OpSize = OpSize16; } 20689db42cSShengchen Kanclass OpSize32 { OperandSize OpSize = OpSize32; } 21689db42cSShengchen Kanclass AdSize16 { AddressSize AdSize = AdSize16; } 22689db42cSShengchen Kanclass AdSize32 { AddressSize AdSize = AdSize32; } 23689db42cSShengchen Kanclass AdSize64 { AddressSize AdSize = AdSize64; } 24689db42cSShengchen Kanclass REX_W { bit hasREX_W = 1; } 25689db42cSShengchen Kanclass LOCK { bit hasLockPrefix = 1; } 26689db42cSShengchen Kanclass REP { bit hasREPPrefix = 1; } 27689db42cSShengchen Kanclass TB { Map OpMap = TB; } 28689db42cSShengchen Kanclass T8 { Map OpMap = T8; } 29689db42cSShengchen Kanclass TA { Map OpMap = TA; } 30ff32ab3aSShengchen Kanclass T_MAP4 { Map OpMap = T_MAP4; } 31ff32ab3aSShengchen Kanclass T_MAP5 { Map OpMap = T_MAP5; } 32ff32ab3aSShengchen Kanclass T_MAP6 { Map OpMap = T_MAP6; } 33ff32ab3aSShengchen Kanclass T_MAP7 { Map OpMap = T_MAP7; } 346e20df1aSShengchen Kanclass XOP8 { Map OpMap = XOP8; } 356e20df1aSShengchen Kanclass XOP9 { Map OpMap = XOP9; } 366e20df1aSShengchen Kanclass XOPA { Map OpMap = XOPA; } 37689db42cSShengchen Kanclass ThreeDNow { Map OpMap = ThreeDNow; } 38ff32ab3aSShengchen Kanclass PS { Prefix OpPrefix = PS; } 39ff32ab3aSShengchen Kanclass PD { Prefix OpPrefix = PD; } 40ff32ab3aSShengchen Kanclass XD { Prefix OpPrefix = XD; } 41ff32ab3aSShengchen Kanclass XS { Prefix OpPrefix = XS; } 420207e9eaSShengchen Kanclass XOP { Encoding OpEnc = EncXOP; } 43689db42cSShengchen Kanclass VEX { Encoding OpEnc = EncVEX; } 440207e9eaSShengchen Kanclass EVEX { Encoding OpEnc = EncEVEX; } 45689db42cSShengchen Kanclass WIG { bit IgnoresW = 1; } 46689db42cSShengchen Kanclass VEX_L { bit hasVEX_L = 1; } 47689db42cSShengchen Kanclass VEX_LIG { bit ignoresVEX_L = 1; } 4862d8ae0aSShengchen Kanclass VVVV { bit hasVEX_4V = 1; } 49689db42cSShengchen Kanclass EVEX_K { bit hasEVEX_K = 1; } 50689db42cSShengchen Kanclass EVEX_KZ : EVEX_K { bit hasEVEX_Z = 1; } 51689db42cSShengchen Kanclass EVEX_B { bit hasEVEX_B = 1; } 52d79ccee8SShengchen Kanclass EVEX_NF { bit hasEVEX_NF = 1; } 53689db42cSShengchen Kanclass EVEX_RC { bit hasEVEX_RC = 1; } 54689db42cSShengchen Kanclass EVEX_V512 { bit hasEVEX_L2 = 1; bit hasVEX_L = 0; } 55689db42cSShengchen Kanclass EVEX_V256 { bit hasEVEX_L2 = 0; bit hasVEX_L = 1; } 56689db42cSShengchen Kanclass EVEX_V128 { bit hasEVEX_L2 = 0; bit hasVEX_L = 0; } 57689db42cSShengchen Kanclass NOTRACK { bit hasNoTrackPrefix = 1; } 58689db42cSShengchen Kanclass SIMD_EXC { list<Register> Uses = [MXCSR]; bit mayRaiseFPException = 1; } 59689db42cSShengchen Kan// Specify AVX512 8-bit compressed displacement encoding based on the vector 60689db42cSShengchen Kan// element size in bits (8, 16, 32, 64) and the CDisp8 form. 61689db42cSShengchen Kanclass EVEX_CD8<int esize, CD8VForm form> { 62689db42cSShengchen Kan int CD8_EltSize = !srl(esize, 3); 63689db42cSShengchen Kan bits<3> CD8_Form = form.Value; 64689db42cSShengchen Kan} 6561b58123SShengchen Kanclass NoCD8 { bits<7> CD8_Scale = 0; } 660207e9eaSShengchen Kan 67ff32ab3aSShengchen Kanclass AVX512BIi8Base : TB, PD { 68689db42cSShengchen Kan Domain ExeDomain = SSEPackedInt; 69689db42cSShengchen Kan ImmType ImmT = Imm8; 70689db42cSShengchen Kan} 71ff32ab3aSShengchen Kanclass AVX512XSIi8Base : TB, XS { 72689db42cSShengchen Kan Domain ExeDomain = SSEPackedInt; 73689db42cSShengchen Kan ImmType ImmT = Imm8; 74689db42cSShengchen Kan} 75ff32ab3aSShengchen Kanclass AVX512XDIi8Base : TB, XD { 76689db42cSShengchen Kan Domain ExeDomain = SSEPackedInt; 77689db42cSShengchen Kan ImmType ImmT = Imm8; 78689db42cSShengchen Kan} 796e20df1aSShengchen Kanclass AVX512PSIi8Base : TB { 80689db42cSShengchen Kan Domain ExeDomain = SSEPackedSingle; 81689db42cSShengchen Kan ImmType ImmT = Imm8; 82689db42cSShengchen Kan} 83ff32ab3aSShengchen Kanclass AVX512PDIi8Base : TB, PD { 84689db42cSShengchen Kan Domain ExeDomain = SSEPackedDouble; 85689db42cSShengchen Kan ImmType ImmT = Imm8; 86689db42cSShengchen Kan} 87689db42cSShengchen Kanclass ExplicitREX2Prefix { ExplicitOpPrefix explicitOpPrefix = ExplicitREX2; } 88689db42cSShengchen Kanclass ExplicitVEXPrefix { ExplicitOpPrefix explicitOpPrefix = ExplicitVEX; } 89689db42cSShengchen Kanclass ExplicitEVEXPrefix { ExplicitOpPrefix explicitOpPrefix = ExplicitEVEX; } 90b223aebdSShengchen Kanclass DefEFLAGS { list<Register> Defs = [EFLAGS]; } 91b223aebdSShengchen Kanclass UseEFLAGS { list<Register> Uses = [EFLAGS]; } 92b223aebdSShengchen Kanclass DisassembleOnly { 93b223aebdSShengchen Kan // The disassembler should know about this, but not the asmparser. 94b223aebdSShengchen Kan bit isCodeGenOnly = 1; 95b223aebdSShengchen Kan bit ForceDisassemble = 1; 96b223aebdSShengchen Kan} 97b223aebdSShengchen Kan 980207e9eaSShengchen Kandefvar unaryop_args = "$src1"; 990207e9eaSShengchen Kandefvar unaryop_ndd_args = "{$src1, $dst|$dst, $src1}"; 1000207e9eaSShengchen Kandefvar binop_args = "{$src2, $src1|$src1, $src2}"; 1010207e9eaSShengchen Kandefvar binop_ndd_args = "{$src2, $src1, $dst|$dst, $src1, $src2}"; 1023d682174SShengchen Kandefvar binop_cl_args = "{%cl, $src1|$src1, cl}"; 1035c68c6d7SShengchen Kandefvar binop_cl_ndd_args = "{%cl, $src1, $dst|$dst, $src1, cl}"; 1042c4a53adSShengchen Kandefvar triop_args = "{$src3, $src2, $src1|$src1, $src2, $src3}"; 1055c68c6d7SShengchen Kandefvar triop_ndd_args = "{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"; 1062c4a53adSShengchen Kandefvar triop_cl_args = "{%cl, $src2, $src1|$src1, $src2, cl}"; 1075c68c6d7SShengchen Kandefvar triop_cl_ndd_args = "{%cl, $src2, $src1, $dst|$dst, $src1, $src2, cl}"; 1080207e9eaSShengchen Kandefvar tie_dst_src1 = "$src1 = $dst"; 1090207e9eaSShengchen Kan 1100207e9eaSShengchen Kan// NDD - Helper for new data destination instructions 1115c68c6d7SShengchen Kanclass NDD<bit ndd> { 1120207e9eaSShengchen Kan string Constraints = !if(!eq(ndd, 0), tie_dst_src1, ""); 1130207e9eaSShengchen Kan Encoding OpEnc = !if(!eq(ndd, 0), EncNormal, EncEVEX); 1140207e9eaSShengchen Kan bit hasEVEX_B = ndd; 1150207e9eaSShengchen Kan bit hasVEX_4V = ndd; 1165c68c6d7SShengchen Kan Map OpMap = !if(!eq(ndd, 0), OB, T_MAP4); 1170207e9eaSShengchen Kan} 1180207e9eaSShengchen Kan// NF - Helper for NF (no flags update) instructions 119d124b022SXinWang10class NF: T_MAP4, EVEX, EVEX_NF; 1200207e9eaSShengchen Kan// PL - Helper for promoted legacy instructions 121d124b022SXinWang10class PL: T_MAP4, EVEX, ExplicitEVEXPrefix; 122db7d2439SFreddy Ye// ZU - Helper for Zero Upper instructions 123db7d2439SFreddy Yeclass ZU: T_MAP4, EVEX, EVEX_B; 1240207e9eaSShengchen Kan 125689db42cSShengchen Kan//===----------------------------------------------------------------------===// 126689db42cSShengchen Kan// X86 Type infomation definitions 127689db42cSShengchen Kan//===----------------------------------------------------------------------===// 128689db42cSShengchen Kan 129689db42cSShengchen Kan/// X86TypeInfo - This is a bunch of information that describes relevant X86 130689db42cSShengchen Kan/// information about value types. For example, it can tell you what the 131689db42cSShengchen Kan/// register class and preferred load to use. 132689db42cSShengchen Kanclass X86TypeInfo<ValueType vt, string instrsuffix, RegisterClass regclass, 133689db42cSShengchen Kan PatFrag loadnode, X86MemOperand memoperand, ImmType immkind, 134689db42cSShengchen Kan Operand immoperand, SDPatternOperator immoperator, 135689db42cSShengchen Kan SDPatternOperator immnosuoperator, Operand imm8operand, 136689db42cSShengchen Kan SDPatternOperator imm8operator, SDPatternOperator imm8nosuoperator, 13717ff25a5SShengchen Kan bit hasEvenOpcode, bit hasREX_W> { 138689db42cSShengchen Kan /// VT - This is the value type itself. 139689db42cSShengchen Kan ValueType VT = vt; 140689db42cSShengchen Kan 141689db42cSShengchen Kan /// InstrSuffix - This is the suffix used on instructions with this type. For 142689db42cSShengchen Kan /// example, i8 -> "b", i16 -> "w", i32 -> "l", i64 -> "q". 143689db42cSShengchen Kan string InstrSuffix = instrsuffix; 144689db42cSShengchen Kan 145689db42cSShengchen Kan /// RegClass - This is the register class associated with this type. For 146689db42cSShengchen Kan /// example, i8 -> GR8, i16 -> GR16, i32 -> GR32, i64 -> GR64. 147689db42cSShengchen Kan RegisterClass RegClass = regclass; 148689db42cSShengchen Kan 149689db42cSShengchen Kan /// LoadNode - This is the load node associated with this type. For 150689db42cSShengchen Kan /// example, i8 -> loadi8, i16 -> loadi16, i32 -> loadi32, i64 -> loadi64. 151689db42cSShengchen Kan PatFrag LoadNode = loadnode; 152689db42cSShengchen Kan 153689db42cSShengchen Kan /// MemOperand - This is the memory operand associated with this type. For 154689db42cSShengchen Kan /// example, i8 -> i8mem, i16 -> i16mem, i32 -> i32mem, i64 -> i64mem. 155689db42cSShengchen Kan X86MemOperand MemOperand = memoperand; 156689db42cSShengchen Kan 157689db42cSShengchen Kan /// ImmEncoding - This is the encoding of an immediate of this type. For 158689db42cSShengchen Kan /// example, i8 -> Imm8, i16 -> Imm16, i32 -> Imm32. Note that i64 -> Imm32 159689db42cSShengchen Kan /// since the immediate fields of i64 instructions is a 32-bit sign extended 160689db42cSShengchen Kan /// value. 161689db42cSShengchen Kan ImmType ImmEncoding = immkind; 162689db42cSShengchen Kan 163689db42cSShengchen Kan /// ImmOperand - This is the operand kind of an immediate of this type. For 164689db42cSShengchen Kan /// example, i8 -> i8imm, i16 -> i16imm, i32 -> i32imm. Note that i64 -> 165689db42cSShengchen Kan /// i64i32imm since the immediate fields of i64 instructions is a 32-bit sign 166689db42cSShengchen Kan /// extended value. 167689db42cSShengchen Kan Operand ImmOperand = immoperand; 168689db42cSShengchen Kan 169689db42cSShengchen Kan /// ImmOperator - This is the operator that should be used to match an 170689db42cSShengchen Kan /// immediate of this kind in a pattern (e.g. imm, or i64immSExt32). 171689db42cSShengchen Kan SDPatternOperator ImmOperator = immoperator; 172689db42cSShengchen Kan 173689db42cSShengchen Kan SDPatternOperator ImmNoSuOperator = immnosuoperator; 174689db42cSShengchen Kan 175689db42cSShengchen Kan /// Imm8Operand - This is the operand kind to use for an imm8 of this type. 176689db42cSShengchen Kan /// For example, i8 -> <invalid>, i16 -> i16i8imm, i32 -> i32i8imm. This is 177689db42cSShengchen Kan /// only used for instructions that have a sign-extended imm8 field form. 178689db42cSShengchen Kan Operand Imm8Operand = imm8operand; 179689db42cSShengchen Kan 180689db42cSShengchen Kan /// Imm8Operator - This is the operator that should be used to match an 8-bit 181689db42cSShengchen Kan /// sign extended immediate of this kind in a pattern (e.g. imm16immSExt8). 182689db42cSShengchen Kan SDPatternOperator Imm8Operator = imm8operator; 183689db42cSShengchen Kan 184689db42cSShengchen Kan SDPatternOperator Imm8NoSuOperator = imm8nosuoperator; 185689db42cSShengchen Kan 1862fe94ceaSShengchen Kan /// HasEvenOpcode - This bit is true if the instruction should have an even (as 1872fe94ceaSShengchen Kan /// opposed to odd) opcode. Operations on i8 are even, operations on 1882fe94ceaSShengchen Kan /// other datatypes are usually odd. 1892fe94ceaSShengchen Kan bit HasEvenOpcode = hasEvenOpcode; 190689db42cSShengchen Kan 191689db42cSShengchen Kan /// HasREX_W - This bit is set to true if the instruction should have 192689db42cSShengchen Kan /// the 0x40 REX prefix. This is set for i64 types. 193689db42cSShengchen Kan bit HasREX_W = hasREX_W; 194689db42cSShengchen Kan} 195689db42cSShengchen Kan 196689db42cSShengchen Kandef Xi8 : X86TypeInfo<i8, "b", GR8, loadi8, i8mem, Imm8, i8imm, 1976beaa123SSergei Barannikov imm_su, imm, i8imm, null_frag, null_frag, 19817ff25a5SShengchen Kan 1, 0>; 199689db42cSShengchen Kandef Xi16 : X86TypeInfo<i16, "w", GR16, loadi16, i16mem, Imm16, i16imm, 200689db42cSShengchen Kan imm_su, imm, i16i8imm, i16immSExt8_su, i16immSExt8, 20117ff25a5SShengchen Kan 0, 0>; 202689db42cSShengchen Kandef Xi32 : X86TypeInfo<i32, "l", GR32, loadi32, i32mem, Imm32, i32imm, 203689db42cSShengchen Kan imm_su, imm, i32i8imm, i32immSExt8_su, i32immSExt8, 20417ff25a5SShengchen Kan 0, 0>; 205689db42cSShengchen Kandef Xi64 : X86TypeInfo<i64, "q", GR64, loadi64, i64mem, Imm32S, i64i32imm, 206689db42cSShengchen Kan i64immSExt32_su, i64immSExt32, i64i8imm, i64immSExt8_su, 20717ff25a5SShengchen Kan i64immSExt8, 0, 1>; 208689db42cSShengchen Kan 209689db42cSShengchen Kan// Group template arguments that can be derived from the vector type (EltNum x 210689db42cSShengchen Kan// EltVT). These are things like the register class for the writemask, etc. 211689db42cSShengchen Kan// The idea is to pass one of these as the template argument rather than the 212689db42cSShengchen Kan// individual arguments. 213689db42cSShengchen Kan// The template is also used for scalar types, in this case numelts is 1. 214689db42cSShengchen Kanclass X86VectorVTInfo<int numelts, ValueType eltvt, RegisterClass rc, 215689db42cSShengchen Kan string suffix = ""> { 216689db42cSShengchen Kan RegisterClass RC = rc; 217689db42cSShengchen Kan ValueType EltVT = eltvt; 218689db42cSShengchen Kan int NumElts = numelts; 219689db42cSShengchen Kan 220689db42cSShengchen Kan // Corresponding mask register class. 221689db42cSShengchen Kan RegisterClass KRC = !cast<RegisterClass>("VK" # NumElts); 222689db42cSShengchen Kan 223689db42cSShengchen Kan // Corresponding mask register pair class. 224689db42cSShengchen Kan RegisterOperand KRPC = !if (!gt(NumElts, 16), ?, 225689db42cSShengchen Kan !cast<RegisterOperand>("VK" # NumElts # "Pair")); 226689db42cSShengchen Kan 227689db42cSShengchen Kan // Corresponding write-mask register class. 228689db42cSShengchen Kan RegisterClass KRCWM = !cast<RegisterClass>("VK" # NumElts # "WM"); 229689db42cSShengchen Kan 230689db42cSShengchen Kan // The mask VT. 231689db42cSShengchen Kan ValueType KVT = !cast<ValueType>("v" # NumElts # "i1"); 232689db42cSShengchen Kan 233689db42cSShengchen Kan // Suffix used in the instruction mnemonic. 234689db42cSShengchen Kan string Suffix = suffix; 235689db42cSShengchen Kan 236689db42cSShengchen Kan // VTName is a string name for vector VT. For vector types it will be 237689db42cSShengchen Kan // v # NumElts # EltVT, so for vector of 8 elements of i32 it will be v8i32 238689db42cSShengchen Kan // It is a little bit complex for scalar types, where NumElts = 1. 239689db42cSShengchen Kan // In this case we build v4f32 or v2f64 240689db42cSShengchen Kan string VTName = "v" # !if (!eq (NumElts, 1), 241689db42cSShengchen Kan !if (!eq (EltVT.Size, 16), 8, 242689db42cSShengchen Kan !if (!eq (EltVT.Size, 32), 4, 243689db42cSShengchen Kan !if (!eq (EltVT.Size, 64), 2, NumElts))), NumElts) # EltVT; 244689db42cSShengchen Kan 245689db42cSShengchen Kan // The vector VT. 246689db42cSShengchen Kan ValueType VT = !cast<ValueType>(VTName); 247689db42cSShengchen Kan 248689db42cSShengchen Kan string EltTypeName = !cast<string>(EltVT); 249689db42cSShengchen Kan // Size of the element type in bits, e.g. 32 for v16i32. 250689db42cSShengchen Kan string EltSizeName = !subst("i", "", !subst("f", "", !subst("b", "", EltTypeName))); 251689db42cSShengchen Kan int EltSize = EltVT.Size; 252689db42cSShengchen Kan 253689db42cSShengchen Kan // "i" for integer types and "f" for floating-point types 254689db42cSShengchen Kan string TypeVariantName = !subst("b", "", !subst(EltSizeName, "", EltTypeName)); 255689db42cSShengchen Kan 256689db42cSShengchen Kan // Size of RC in bits, e.g. 512 for VR512. 257689db42cSShengchen Kan int Size = VT.Size; 258689db42cSShengchen Kan 259689db42cSShengchen Kan // The corresponding memory operand, e.g. i512mem for VR512. 260689db42cSShengchen Kan X86MemOperand MemOp = !cast<X86MemOperand>(TypeVariantName # Size # "mem"); 261689db42cSShengchen Kan X86MemOperand ScalarMemOp = !cast<X86MemOperand>(!subst("b", "", EltTypeName) # "mem"); 262689db42cSShengchen Kan // FP scalar memory operand for intrinsics - ssmem/sdmem. 263689db42cSShengchen Kan Operand IntScalarMemOp = !if (!eq (EltTypeName, "f16"), !cast<Operand>("shmem"), 264689db42cSShengchen Kan !if (!eq (EltTypeName, "bf16"), !cast<Operand>("shmem"), 265689db42cSShengchen Kan !if (!eq (EltTypeName, "f32"), !cast<Operand>("ssmem"), 266689db42cSShengchen Kan !if (!eq (EltTypeName, "f64"), !cast<Operand>("sdmem"), ?)))); 267689db42cSShengchen Kan 268689db42cSShengchen Kan // Load patterns 269689db42cSShengchen Kan PatFrag LdFrag = !cast<PatFrag>("load" # VTName); 270689db42cSShengchen Kan 271689db42cSShengchen Kan PatFrag AlignedLdFrag = !cast<PatFrag>("alignedload" # VTName); 272689db42cSShengchen Kan 273689db42cSShengchen Kan PatFrag ScalarLdFrag = !cast<PatFrag>("load" # !subst("b", "", EltTypeName)); 274689db42cSShengchen Kan PatFrag BroadcastLdFrag = !cast<PatFrag>("X86VBroadcastld" # EltSizeName); 275689db42cSShengchen Kan 276689db42cSShengchen Kan PatFrags ScalarIntMemFrags = !if (!eq (EltTypeName, "f16"), !cast<PatFrags>("sse_load_f16"), 277689db42cSShengchen Kan !if (!eq (EltTypeName, "bf16"), !cast<PatFrags>("sse_load_f16"), 278689db42cSShengchen Kan !if (!eq (EltTypeName, "f32"), !cast<PatFrags>("sse_load_f32"), 279689db42cSShengchen Kan !if (!eq (EltTypeName, "f64"), !cast<PatFrags>("sse_load_f64"), ?)))); 280689db42cSShengchen Kan 281689db42cSShengchen Kan // The string to specify embedded broadcast in assembly. 282689db42cSShengchen Kan string BroadcastStr = "{1to" # NumElts # "}"; 283689db42cSShengchen Kan 284689db42cSShengchen Kan // 8-bit compressed displacement tuple/subvector format. This is only 285689db42cSShengchen Kan // defined for NumElts <= 8. 286689db42cSShengchen Kan CD8VForm CD8TupleForm = !if (!eq (!srl(NumElts, 4), 0), 287689db42cSShengchen Kan !cast<CD8VForm>("CD8VT" # NumElts), ?); 288689db42cSShengchen Kan 289689db42cSShengchen Kan SubRegIndex SubRegIdx = !if (!eq (Size, 128), sub_xmm, 290689db42cSShengchen Kan !if (!eq (Size, 256), sub_ymm, ?)); 291689db42cSShengchen Kan 292689db42cSShengchen Kan Domain ExeDomain = !if (!eq (EltTypeName, "f32"), SSEPackedSingle, 293689db42cSShengchen Kan !if (!eq (EltTypeName, "f64"), SSEPackedDouble, 294689db42cSShengchen Kan !if (!eq (EltTypeName, "f16"), SSEPackedSingle, // FIXME? 295689db42cSShengchen Kan !if (!eq (EltTypeName, "bf16"), SSEPackedSingle, // FIXME? 296689db42cSShengchen Kan SSEPackedInt)))); 297689db42cSShengchen Kan 298689db42cSShengchen Kan RegisterClass FRC = !if (!eq (EltTypeName, "f32"), FR32X, 299689db42cSShengchen Kan !if (!eq (EltTypeName, "f16"), FR16X, 300689db42cSShengchen Kan !if (!eq (EltTypeName, "bf16"), FR16X, 301689db42cSShengchen Kan FR64X))); 302689db42cSShengchen Kan 303689db42cSShengchen Kan dag ImmAllZerosV = (VT immAllZerosV); 304689db42cSShengchen Kan 305689db42cSShengchen Kan string ZSuffix = !if (!eq (Size, 128), "Z128", 306689db42cSShengchen Kan !if (!eq (Size, 256), "Z256", "Z")); 307689db42cSShengchen Kan} 308689db42cSShengchen Kan 309689db42cSShengchen Kandef v64i8_info : X86VectorVTInfo<64, i8, VR512, "b">; 310689db42cSShengchen Kandef v32i16_info : X86VectorVTInfo<32, i16, VR512, "w">; 311689db42cSShengchen Kandef v16i32_info : X86VectorVTInfo<16, i32, VR512, "d">; 312689db42cSShengchen Kandef v8i64_info : X86VectorVTInfo<8, i64, VR512, "q">; 313689db42cSShengchen Kandef v32f16_info : X86VectorVTInfo<32, f16, VR512, "ph">; 314*ee2722fcSPhoebe Wangdef v32bf16_info: X86VectorVTInfo<32, bf16, VR512, "bf16">; 315689db42cSShengchen Kandef v16f32_info : X86VectorVTInfo<16, f32, VR512, "ps">; 316689db42cSShengchen Kandef v8f64_info : X86VectorVTInfo<8, f64, VR512, "pd">; 317689db42cSShengchen Kan 318689db42cSShengchen Kan// "x" in v32i8x_info means RC = VR256X 319689db42cSShengchen Kandef v32i8x_info : X86VectorVTInfo<32, i8, VR256X, "b">; 320689db42cSShengchen Kandef v16i16x_info : X86VectorVTInfo<16, i16, VR256X, "w">; 321689db42cSShengchen Kandef v8i32x_info : X86VectorVTInfo<8, i32, VR256X, "d">; 322689db42cSShengchen Kandef v4i64x_info : X86VectorVTInfo<4, i64, VR256X, "q">; 323689db42cSShengchen Kandef v16f16x_info : X86VectorVTInfo<16, f16, VR256X, "ph">; 324*ee2722fcSPhoebe Wangdef v16bf16x_info: X86VectorVTInfo<16, bf16, VR256X, "bf16">; 325689db42cSShengchen Kandef v8f32x_info : X86VectorVTInfo<8, f32, VR256X, "ps">; 326689db42cSShengchen Kandef v4f64x_info : X86VectorVTInfo<4, f64, VR256X, "pd">; 327689db42cSShengchen Kan 328689db42cSShengchen Kandef v16i8x_info : X86VectorVTInfo<16, i8, VR128X, "b">; 329689db42cSShengchen Kandef v8i16x_info : X86VectorVTInfo<8, i16, VR128X, "w">; 330689db42cSShengchen Kandef v4i32x_info : X86VectorVTInfo<4, i32, VR128X, "d">; 331689db42cSShengchen Kandef v2i64x_info : X86VectorVTInfo<2, i64, VR128X, "q">; 332689db42cSShengchen Kandef v8f16x_info : X86VectorVTInfo<8, f16, VR128X, "ph">; 333*ee2722fcSPhoebe Wangdef v8bf16x_info : X86VectorVTInfo<8, bf16, VR128X, "bf16">; 334689db42cSShengchen Kandef v4f32x_info : X86VectorVTInfo<4, f32, VR128X, "ps">; 335689db42cSShengchen Kandef v2f64x_info : X86VectorVTInfo<2, f64, VR128X, "pd">; 336689db42cSShengchen Kan 337689db42cSShengchen Kan// We map scalar types to the smallest (128-bit) vector type 338689db42cSShengchen Kan// with the appropriate element type. This allows to use the same masking logic. 339689db42cSShengchen Kandef i32x_info : X86VectorVTInfo<1, i32, GR32, "si">; 340689db42cSShengchen Kandef i64x_info : X86VectorVTInfo<1, i64, GR64, "sq">; 341689db42cSShengchen Kandef f16x_info : X86VectorVTInfo<1, f16, VR128X, "sh">; 342689db42cSShengchen Kandef bf16x_info : X86VectorVTInfo<1, bf16, VR128X, "sbf">; 343689db42cSShengchen Kandef f32x_info : X86VectorVTInfo<1, f32, VR128X, "ss">; 344689db42cSShengchen Kandef f64x_info : X86VectorVTInfo<1, f64, VR128X, "sd">; 345689db42cSShengchen Kan 346689db42cSShengchen Kanclass AVX512VLVectorVTInfo<X86VectorVTInfo i512, X86VectorVTInfo i256, 347689db42cSShengchen Kan X86VectorVTInfo i128> { 348689db42cSShengchen Kan X86VectorVTInfo info512 = i512; 349689db42cSShengchen Kan X86VectorVTInfo info256 = i256; 350689db42cSShengchen Kan X86VectorVTInfo info128 = i128; 351689db42cSShengchen Kan} 352689db42cSShengchen Kan 353689db42cSShengchen Kandef avx512vl_i8_info : AVX512VLVectorVTInfo<v64i8_info, v32i8x_info, 354689db42cSShengchen Kan v16i8x_info>; 355689db42cSShengchen Kandef avx512vl_i16_info : AVX512VLVectorVTInfo<v32i16_info, v16i16x_info, 356689db42cSShengchen Kan v8i16x_info>; 357689db42cSShengchen Kandef avx512vl_i32_info : AVX512VLVectorVTInfo<v16i32_info, v8i32x_info, 358689db42cSShengchen Kan v4i32x_info>; 359689db42cSShengchen Kandef avx512vl_i64_info : AVX512VLVectorVTInfo<v8i64_info, v4i64x_info, 360689db42cSShengchen Kan v2i64x_info>; 361689db42cSShengchen Kandef avx512vl_f16_info : AVX512VLVectorVTInfo<v32f16_info, v16f16x_info, 362689db42cSShengchen Kan v8f16x_info>; 363689db42cSShengchen Kandef avx512vl_bf16_info : AVX512VLVectorVTInfo<v32bf16_info, v16bf16x_info, 364689db42cSShengchen Kan v8bf16x_info>; 365689db42cSShengchen Kandef avx512vl_f32_info : AVX512VLVectorVTInfo<v16f32_info, v8f32x_info, 366689db42cSShengchen Kan v4f32x_info>; 367689db42cSShengchen Kandef avx512vl_f64_info : AVX512VLVectorVTInfo<v8f64_info, v4f64x_info, 368689db42cSShengchen Kan v2f64x_info>; 369689db42cSShengchen Kan 370689db42cSShengchen Kanclass X86KVectorVTInfo<RegisterClass _krc, RegisterClass _krcwm, 371689db42cSShengchen Kan ValueType _vt> { 372689db42cSShengchen Kan RegisterClass KRC = _krc; 373689db42cSShengchen Kan RegisterClass KRCWM = _krcwm; 374689db42cSShengchen Kan ValueType KVT = _vt; 375689db42cSShengchen Kan} 376689db42cSShengchen Kan 377689db42cSShengchen Kandef v1i1_info : X86KVectorVTInfo<VK1, VK1WM, v1i1>; 378689db42cSShengchen Kandef v2i1_info : X86KVectorVTInfo<VK2, VK2WM, v2i1>; 379689db42cSShengchen Kandef v4i1_info : X86KVectorVTInfo<VK4, VK4WM, v4i1>; 380689db42cSShengchen Kandef v8i1_info : X86KVectorVTInfo<VK8, VK8WM, v8i1>; 381689db42cSShengchen Kandef v16i1_info : X86KVectorVTInfo<VK16, VK16WM, v16i1>; 382689db42cSShengchen Kandef v32i1_info : X86KVectorVTInfo<VK32, VK32WM, v32i1>; 383689db42cSShengchen Kandef v64i1_info : X86KVectorVTInfo<VK64, VK64WM, v64i1>; 384689db42cSShengchen Kan 385689db42cSShengchen Kan// Subclasses of X86Inst 386689db42cSShengchen Kanclass PseudoI<dag oops, dag iops, list<dag> pattern> 387689db42cSShengchen Kan : X86Inst<0, Pseudo, NoImm, oops, iops, ""> { 388689db42cSShengchen Kan let Pattern = pattern; 389689db42cSShengchen Kan} 390689db42cSShengchen Kan 391689db42cSShengchen Kanclass I<bits<8> o, Format f, dag outs, dag ins, string asm, 392689db42cSShengchen Kan list<dag> pattern, Domain d = GenericDomain> 393689db42cSShengchen Kan : X86Inst<o, f, NoImm, outs, ins, asm, d> { 394689db42cSShengchen Kan let Pattern = pattern; 395689db42cSShengchen Kan} 396689db42cSShengchen Kanclass Ii8<bits<8> o, Format f, dag outs, dag ins, string asm, 397689db42cSShengchen Kan list<dag> pattern, Domain d = GenericDomain> 398689db42cSShengchen Kan : X86Inst<o, f, Imm8, outs, ins, asm, d> { 399689db42cSShengchen Kan let Pattern = pattern; 400689db42cSShengchen Kan} 401689db42cSShengchen Kanclass Ii8Reg<bits<8> o, Format f, dag outs, dag ins, string asm, 402689db42cSShengchen Kan list<dag> pattern, Domain d = GenericDomain> 403689db42cSShengchen Kan : X86Inst<o, f, Imm8Reg, outs, ins, asm, d> { 404689db42cSShengchen Kan let Pattern = pattern; 405689db42cSShengchen Kan} 406689db42cSShengchen Kanclass Ii8PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 407689db42cSShengchen Kan list<dag> pattern> 408689db42cSShengchen Kan : X86Inst<o, f, Imm8PCRel, outs, ins, asm> { 409689db42cSShengchen Kan let Pattern = pattern; 410689db42cSShengchen Kan} 411689db42cSShengchen Kanclass Ii16<bits<8> o, Format f, dag outs, dag ins, string asm, 412689db42cSShengchen Kan list<dag> pattern> 413689db42cSShengchen Kan : X86Inst<o, f, Imm16, outs, ins, asm> { 414689db42cSShengchen Kan let Pattern = pattern; 415689db42cSShengchen Kan} 416689db42cSShengchen Kanclass Ii32<bits<8> o, Format f, dag outs, dag ins, string asm, 417689db42cSShengchen Kan list<dag> pattern> 418689db42cSShengchen Kan : X86Inst<o, f, Imm32, outs, ins, asm> { 419689db42cSShengchen Kan let Pattern = pattern; 420689db42cSShengchen Kan} 421689db42cSShengchen Kanclass Ii32S<bits<8> o, Format f, dag outs, dag ins, string asm, 422689db42cSShengchen Kan list<dag> pattern> 423689db42cSShengchen Kan : X86Inst<o, f, Imm32S, outs, ins, asm> { 424689db42cSShengchen Kan let Pattern = pattern; 425689db42cSShengchen Kan} 426689db42cSShengchen Kan 427689db42cSShengchen Kanclass Ii64<bits<8> o, Format f, dag outs, dag ins, string asm, 428689db42cSShengchen Kan list<dag> pattern> 429689db42cSShengchen Kan : X86Inst<o, f, Imm64, outs, ins, asm> { 430689db42cSShengchen Kan let Pattern = pattern; 431689db42cSShengchen Kan} 432689db42cSShengchen Kan 433689db42cSShengchen Kanclass Ii16PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 434689db42cSShengchen Kan list<dag> pattern> 435689db42cSShengchen Kan : X86Inst<o, f, Imm16PCRel, outs, ins, asm> { 436689db42cSShengchen Kan let Pattern = pattern; 437689db42cSShengchen Kan} 438689db42cSShengchen Kan 439689db42cSShengchen Kanclass Ii32PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 440689db42cSShengchen Kan list<dag> pattern> 441689db42cSShengchen Kan : X86Inst<o, f, Imm32PCRel, outs, ins, asm> { 442689db42cSShengchen Kan let Pattern = pattern; 443689db42cSShengchen Kan} 444689db42cSShengchen Kan 445689db42cSShengchen Kan// FPStack Instruction Templates: 446689db42cSShengchen Kan// FPI - Floating Point Instruction template. 447689db42cSShengchen Kanclass FPI<bits<8> o, Format F, dag outs, dag ins, string asm> 448689db42cSShengchen Kan : I<o, F, outs, ins, asm, []> { 449689db42cSShengchen Kan let Defs = [FPSW]; 450689db42cSShengchen Kan let Predicates = [HasX87]; 451689db42cSShengchen Kan} 452689db42cSShengchen Kan 453689db42cSShengchen Kan// FpI_ - Floating Point Pseudo Instruction template. 454689db42cSShengchen Kanclass FpI_<dag outs, dag ins, FPFormat fp, list<dag> pattern> 455689db42cSShengchen Kan : PseudoI<outs, ins, pattern> { 456689db42cSShengchen Kan let FPForm = fp; 457689db42cSShengchen Kan let Defs = [FPSW]; 458689db42cSShengchen Kan let Predicates = [HasX87]; 459689db42cSShengchen Kan} 460689db42cSShengchen Kan 461689db42cSShengchen Kan// Templates for instructions that use a 16- or 32-bit segmented address as 462689db42cSShengchen Kan// their only operand: lcall (FAR CALL) and ljmp (FAR JMP) 463689db42cSShengchen Kan// 464689db42cSShengchen Kan// Iseg16 - 16-bit segment selector, 16-bit offset 465689db42cSShengchen Kan// Iseg32 - 16-bit segment selector, 32-bit offset 466689db42cSShengchen Kan 467689db42cSShengchen Kanclass Iseg16 <bits<8> o, Format f, dag outs, dag ins, string asm, 468689db42cSShengchen Kan list<dag> pattern> 469689db42cSShengchen Kan : X86Inst<o, f, Imm16, outs, ins, asm> { 470689db42cSShengchen Kan let Pattern = pattern; 471689db42cSShengchen Kan} 472689db42cSShengchen Kan 473689db42cSShengchen Kanclass Iseg32 <bits<8> o, Format f, dag outs, dag ins, string asm, 474689db42cSShengchen Kan list<dag> pattern> 475689db42cSShengchen Kan : X86Inst<o, f, Imm32, outs, ins, asm> { 476689db42cSShengchen Kan let Pattern = pattern; 477689db42cSShengchen Kan} 478689db42cSShengchen Kan 479689db42cSShengchen Kan// SI - SSE 1 & 2 scalar instructions 480689db42cSShengchen Kanclass SI<bits<8> o, Format F, dag outs, dag ins, string asm, 481689db42cSShengchen Kan list<dag> pattern, Domain d = GenericDomain> 482689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern, d> { 483689db42cSShengchen Kan let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], 484689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), [UseAVX], 485689db42cSShengchen Kan !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1], 486689db42cSShengchen Kan !if(!eq(OpPrefix.Value, XD.Value), [UseSSE2], 487689db42cSShengchen Kan !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2], 488689db42cSShengchen Kan [UseSSE1]))))); 489689db42cSShengchen Kan 490689db42cSShengchen Kan // AVX instructions have a 'v' prefix in the mnemonic 491689db42cSShengchen Kan let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm), 492689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm), 493689db42cSShengchen Kan asm)); 494689db42cSShengchen Kan} 495689db42cSShengchen Kan 496689db42cSShengchen Kan// SI - SSE 1 & 2 scalar intrinsics - vex form available on AVX512 497689db42cSShengchen Kanclass SI_Int<bits<8> o, Format F, dag outs, dag ins, string asm, 498689db42cSShengchen Kan list<dag> pattern, Domain d = GenericDomain> 499689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern, d> { 500689db42cSShengchen Kan let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], 501689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), [UseAVX], 502689db42cSShengchen Kan !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1], 503689db42cSShengchen Kan !if(!eq(OpPrefix.Value, XD.Value), [UseSSE2], 504689db42cSShengchen Kan !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2], 505689db42cSShengchen Kan [UseSSE1]))))); 506689db42cSShengchen Kan 507689db42cSShengchen Kan // AVX instructions have a 'v' prefix in the mnemonic 508689db42cSShengchen Kan let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm), 509689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm), 510689db42cSShengchen Kan asm)); 511689db42cSShengchen Kan} 512689db42cSShengchen Kan// SIi8 - SSE 1 & 2 scalar instructions - vex form available on AVX512 513689db42cSShengchen Kanclass SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 514689db42cSShengchen Kan list<dag> pattern> 515689db42cSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern> { 516689db42cSShengchen Kan let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], 517689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX], 518689db42cSShengchen Kan !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1], 519689db42cSShengchen Kan [UseSSE2]))); 520689db42cSShengchen Kan 521689db42cSShengchen Kan // AVX instructions have a 'v' prefix in the mnemonic 522689db42cSShengchen Kan let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm), 523689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm), 524689db42cSShengchen Kan asm)); 525689db42cSShengchen Kan} 526689db42cSShengchen Kan 527689db42cSShengchen Kan// PI - SSE 1 & 2 packed instructions 528689db42cSShengchen Kanclass PI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, 529689db42cSShengchen Kan Domain d> 530689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern, d> { 531689db42cSShengchen Kan let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], 532689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX], 533689db42cSShengchen Kan !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2], 534689db42cSShengchen Kan [UseSSE1]))); 535689db42cSShengchen Kan 536689db42cSShengchen Kan // AVX instructions have a 'v' prefix in the mnemonic 537689db42cSShengchen Kan let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm), 538689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm), 539689db42cSShengchen Kan asm)); 540689db42cSShengchen Kan} 541689db42cSShengchen Kan 542689db42cSShengchen Kan// MMXPI - SSE 1 & 2 packed instructions with MMX operands 543689db42cSShengchen Kanclass MMXPI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, 544689db42cSShengchen Kan Domain d> 545689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern, d> { 546689db42cSShengchen Kan let Predicates = !if(!eq(OpPrefix.Value, PD.Value), [HasMMX, HasSSE2], 547689db42cSShengchen Kan [HasMMX, HasSSE1]); 548689db42cSShengchen Kan} 549689db42cSShengchen Kan 550689db42cSShengchen Kan// PIi8 - SSE 1 & 2 packed instructions with immediate 551689db42cSShengchen Kanclass PIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 552689db42cSShengchen Kan list<dag> pattern, Domain d> 553689db42cSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, d> { 554689db42cSShengchen Kan let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512], 555689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX], 556689db42cSShengchen Kan !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2], 557689db42cSShengchen Kan [UseSSE1]))); 558689db42cSShengchen Kan 559689db42cSShengchen Kan // AVX instructions have a 'v' prefix in the mnemonic 560689db42cSShengchen Kan let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm), 561689db42cSShengchen Kan !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm), 562689db42cSShengchen Kan asm)); 563689db42cSShengchen Kan} 564689db42cSShengchen Kan 565689db42cSShengchen Kan// SSE1 Instruction Templates: 566689db42cSShengchen Kan// 567689db42cSShengchen Kan// SSI - SSE1 instructions with XS prefix. 568689db42cSShengchen Kan// PSI - SSE1 instructions with PS prefix. 569689db42cSShengchen Kan// PSIi8 - SSE1 instructions with ImmT == Imm8 and PS prefix. 570689db42cSShengchen Kan// VSSI - SSE1 instructions with XS prefix in AVX form. 571689db42cSShengchen Kan// VPSI - SSE1 instructions with PS prefix in AVX form, packed single. 572689db42cSShengchen Kan 573689db42cSShengchen Kanclass SSI<bits<8> o, Format F, dag outs, dag ins, string asm, 574689db42cSShengchen Kan list<dag> pattern> 575ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, XS, Requires<[UseSSE1]>; 576689db42cSShengchen Kanclass SSIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 577689db42cSShengchen Kan list<dag> pattern> 578ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, TB, XS, Requires<[UseSSE1]>; 579689db42cSShengchen Kanclass PSI<bits<8> o, Format F, dag outs, dag ins, string asm, 580689db42cSShengchen Kan list<dag> pattern> 5816e20df1aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB, 582689db42cSShengchen Kan Requires<[UseSSE1]>; 583689db42cSShengchen Kanclass PSIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 584689db42cSShengchen Kan list<dag> pattern> 5856e20df1aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB, 586689db42cSShengchen Kan Requires<[UseSSE1]>; 587689db42cSShengchen Kanclass VSSI<bits<8> o, Format F, dag outs, dag ins, string asm, 588689db42cSShengchen Kan list<dag> pattern> 589ff32ab3aSShengchen Kan : I<o, F, outs, ins, !strconcat("v", asm), pattern>, TB, XS, 590689db42cSShengchen Kan Requires<[HasAVX]>; 591689db42cSShengchen Kanclass VPSI<bits<8> o, Format F, dag outs, dag ins, string asm, 592689db42cSShengchen Kan list<dag> pattern> 593ff32ab3aSShengchen Kan : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedSingle>, 5946e20df1aSShengchen Kan TB, Requires<[HasAVX]>; 595689db42cSShengchen Kan 596689db42cSShengchen Kan// SSE2 Instruction Templates: 597689db42cSShengchen Kan// 598689db42cSShengchen Kan// SDI - SSE2 instructions with XD prefix. 599689db42cSShengchen Kan// SDIi8 - SSE2 instructions with ImmT == Imm8 and XD prefix. 600689db42cSShengchen Kan// S2SI - SSE2 instructions with XS prefix. 601689db42cSShengchen Kan// SSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix. 602689db42cSShengchen Kan// PDI - SSE2 instructions with PD prefix, packed double domain. 603689db42cSShengchen Kan// PDIi8 - SSE2 instructions with ImmT == Imm8 and PD prefix. 604689db42cSShengchen Kan// VSDI - SSE2 scalar instructions with XD prefix in AVX form. 605689db42cSShengchen Kan// VPDI - SSE2 vector instructions with PD prefix in AVX form, 606689db42cSShengchen Kan// packed double domain. 607689db42cSShengchen Kan// VS2I - SSE2 scalar instructions with PD prefix in AVX form. 608689db42cSShengchen Kan// S2I - SSE2 scalar instructions with PD prefix. 609689db42cSShengchen Kan// MMXSDIi8 - SSE2 instructions with ImmT == Imm8 and XD prefix as well as 610689db42cSShengchen Kan// MMX operands. 611689db42cSShengchen Kan// MMXSSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix as well as 612689db42cSShengchen Kan// MMX operands. 613689db42cSShengchen Kan 614689db42cSShengchen Kanclass SDI<bits<8> o, Format F, dag outs, dag ins, string asm, 615689db42cSShengchen Kan list<dag> pattern> 616ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, XD, Requires<[UseSSE2]>; 617689db42cSShengchen Kanclass SDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 618689db42cSShengchen Kan list<dag> pattern> 619ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, TB, XD, Requires<[UseSSE2]>; 620689db42cSShengchen Kanclass S2SI<bits<8> o, Format F, dag outs, dag ins, string asm, 621689db42cSShengchen Kan list<dag> pattern> 622ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, XS, Requires<[UseSSE2]>; 623689db42cSShengchen Kanclass S2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 624689db42cSShengchen Kan list<dag> pattern> 625ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, TB, XS, Requires<[UseSSE2]>; 626689db42cSShengchen Kanclass PDI<bits<8> o, Format F, dag outs, dag ins, string asm, 627689db42cSShengchen Kan list<dag> pattern> 628ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, PD, 629689db42cSShengchen Kan Requires<[UseSSE2]>; 630689db42cSShengchen Kanclass PDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 631689db42cSShengchen Kan list<dag> pattern> 632ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, PD, 633689db42cSShengchen Kan Requires<[UseSSE2]>; 634689db42cSShengchen Kanclass VSDI<bits<8> o, Format F, dag outs, dag ins, string asm, 635689db42cSShengchen Kan list<dag> pattern> 636ff32ab3aSShengchen Kan : I<o, F, outs, ins, !strconcat("v", asm), pattern>, TB, XD, 637689db42cSShengchen Kan Requires<[UseAVX]>; 638689db42cSShengchen Kanclass VS2SI<bits<8> o, Format F, dag outs, dag ins, string asm, 639689db42cSShengchen Kan list<dag> pattern> 640ff32ab3aSShengchen Kan : I<o, F, outs, ins, !strconcat("v", asm), pattern>, TB, XS, 641689db42cSShengchen Kan Requires<[HasAVX]>; 642689db42cSShengchen Kanclass VPDI<bits<8> o, Format F, dag outs, dag ins, string asm, 643689db42cSShengchen Kan list<dag> pattern> 644689db42cSShengchen Kan : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedDouble>, 645ff32ab3aSShengchen Kan TB, PD, Requires<[HasAVX]>; 646689db42cSShengchen Kanclass VS2I<bits<8> o, Format F, dag outs, dag ins, string asm, 647689db42cSShengchen Kan list<dag> pattern> 648ff32ab3aSShengchen Kan : I<o, F, outs, ins, !strconcat("v", asm), pattern>, TB, PD, 649689db42cSShengchen Kan Requires<[UseAVX]>; 650689db42cSShengchen Kanclass S2I<bits<8> o, Format F, dag outs, dag ins, string asm, 651689db42cSShengchen Kan list<dag> pattern> 652ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, PD, Requires<[UseSSE2]>; 653689db42cSShengchen Kanclass MMXSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 654689db42cSShengchen Kan list<dag> pattern> 655ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, TB, XD, Requires<[HasMMX, HasSSE2]>; 656689db42cSShengchen Kanclass MMXS2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 657689db42cSShengchen Kan list<dag> pattern> 658ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, TB, XS, Requires<[HasMMX, HasSSE2]>; 659689db42cSShengchen Kan 660689db42cSShengchen Kan// SSE3 Instruction Templates: 661689db42cSShengchen Kan// 662689db42cSShengchen Kan// S3I - SSE3 instructions with PD prefixes. 663689db42cSShengchen Kan// S3SI - SSE3 instructions with XS prefix. 664689db42cSShengchen Kan// S3DI - SSE3 instructions with XD prefix. 665689db42cSShengchen Kan 666689db42cSShengchen Kanclass S3SI<bits<8> o, Format F, dag outs, dag ins, string asm, 667689db42cSShengchen Kan list<dag> pattern> 668ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB, XS, 669689db42cSShengchen Kan Requires<[UseSSE3]>; 670689db42cSShengchen Kanclass S3DI<bits<8> o, Format F, dag outs, dag ins, string asm, 671689db42cSShengchen Kan list<dag> pattern> 672ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, XD, 673689db42cSShengchen Kan Requires<[UseSSE3]>; 674689db42cSShengchen Kanclass S3I<bits<8> o, Format F, dag outs, dag ins, string asm, 675689db42cSShengchen Kan list<dag> pattern> 676ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, PD, 677689db42cSShengchen Kan Requires<[UseSSE3]>; 678689db42cSShengchen Kan 679689db42cSShengchen Kan 680689db42cSShengchen Kan// SSSE3 Instruction Templates: 681689db42cSShengchen Kan// 682689db42cSShengchen Kan// SS38I - SSSE3 instructions with T8 prefix. 683689db42cSShengchen Kan// SS3AI - SSSE3 instructions with TA prefix. 684689db42cSShengchen Kan// MMXSS38I - SSSE3 instructions with T8 prefix and MMX operands. 685689db42cSShengchen Kan// MMXSS3AI - SSSE3 instructions with TA prefix and MMX operands. 686689db42cSShengchen Kan// 687689db42cSShengchen Kan// Note: SSSE3 instructions have 64-bit and 128-bit versions. The 64-bit version 688689db42cSShengchen Kan// uses the MMX registers. The 64-bit versions are grouped with the MMX 689689db42cSShengchen Kan// classes. They need to be enabled even if AVX is enabled. 690689db42cSShengchen Kan 691689db42cSShengchen Kanclass SS38I<bits<8> o, Format F, dag outs, dag ins, string asm, 692689db42cSShengchen Kan list<dag> pattern> 693ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 694689db42cSShengchen Kan Requires<[UseSSSE3]>; 695689db42cSShengchen Kanclass SS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, 696689db42cSShengchen Kan list<dag> pattern> 697ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 698689db42cSShengchen Kan Requires<[UseSSSE3]>; 699689db42cSShengchen Kanclass MMXSS38I<bits<8> o, Format F, dag outs, dag ins, string asm, 700689db42cSShengchen Kan list<dag> pattern> 7016e20df1aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, 702689db42cSShengchen Kan Requires<[HasMMX, HasSSSE3]>; 703689db42cSShengchen Kanclass MMXSS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, 704689db42cSShengchen Kan list<dag> pattern> 7056e20df1aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, 706689db42cSShengchen Kan Requires<[HasMMX, HasSSSE3]>; 707689db42cSShengchen Kan 708689db42cSShengchen Kan// SSE4.1 Instruction Templates: 709689db42cSShengchen Kan// 710689db42cSShengchen Kan// SS48I - SSE 4.1 instructions with T8 prefix. 711689db42cSShengchen Kan// SS41AIi8 - SSE 4.1 instructions with TA prefix and ImmT == Imm8. 712689db42cSShengchen Kan// 713689db42cSShengchen Kanclass SS48I<bits<8> o, Format F, dag outs, dag ins, string asm, 714689db42cSShengchen Kan list<dag> pattern> 715ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 716689db42cSShengchen Kan Requires<[UseSSE41]>; 717689db42cSShengchen Kanclass SS4AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 718689db42cSShengchen Kan list<dag> pattern> 719ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 720689db42cSShengchen Kan Requires<[UseSSE41]>; 721689db42cSShengchen Kan 722689db42cSShengchen Kan// SSE4.2 Instruction Templates: 723689db42cSShengchen Kan// 724689db42cSShengchen Kan// SS428I - SSE 4.2 instructions with T8 prefix. 725689db42cSShengchen Kanclass SS428I<bits<8> o, Format F, dag outs, dag ins, string asm, 726689db42cSShengchen Kan list<dag> pattern> 727ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 728689db42cSShengchen Kan Requires<[UseSSE42]>; 729689db42cSShengchen Kan 730689db42cSShengchen Kan// SS42AI = SSE 4.2 instructions with TA prefix 731689db42cSShengchen Kanclass SS42AI<bits<8> o, Format F, dag outs, dag ins, string asm, 732689db42cSShengchen Kan list<dag> pattern> 733ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 734689db42cSShengchen Kan Requires<[UseSSE42]>; 735689db42cSShengchen Kan 736689db42cSShengchen Kan// AVX Instruction Templates: 737689db42cSShengchen Kan// Instructions introduced in AVX (no SSE equivalent forms) 738689db42cSShengchen Kan// 739ff32ab3aSShengchen Kan// AVX8I - AVX instructions with T8, PD prefix. 740ff32ab3aSShengchen Kan// AVXAIi8 - AVX instructions with TA, PD prefix and ImmT = Imm8. 741689db42cSShengchen Kanclass AVX8I<bits<8> o, Format F, dag outs, dag ins, string asm, 742689db42cSShengchen Kan list<dag> pattern> 743ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 744689db42cSShengchen Kan Requires<[HasAVX]>; 745689db42cSShengchen Kanclass AVXAIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 746689db42cSShengchen Kan list<dag> pattern> 747ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 748689db42cSShengchen Kan Requires<[HasAVX]>; 749689db42cSShengchen Kan 750689db42cSShengchen Kan// AVX2 Instruction Templates: 751689db42cSShengchen Kan// Instructions introduced in AVX2 (no SSE equivalent forms) 752689db42cSShengchen Kan// 753ff32ab3aSShengchen Kan// AVX28I - AVX2 instructions with T8, PD prefix. 754ff32ab3aSShengchen Kan// AVX2AIi8 - AVX2 instructions with TA, PD prefix and ImmT = Imm8. 755689db42cSShengchen Kanclass AVX28I<bits<8> o, Format F, dag outs, dag ins, string asm, 756689db42cSShengchen Kan list<dag> pattern> 757ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 758689db42cSShengchen Kan Requires<[HasAVX2]>; 759689db42cSShengchen Kanclass AVX2AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 760689db42cSShengchen Kan list<dag> pattern> 761ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 762689db42cSShengchen Kan Requires<[HasAVX2]>; 763689db42cSShengchen Kan 764689db42cSShengchen Kan 765689db42cSShengchen Kan// AVX-512 Instruction Templates: 766689db42cSShengchen Kan// Instructions introduced in AVX-512 (no SSE equivalent forms) 767689db42cSShengchen Kan// 768ff32ab3aSShengchen Kan// AVX5128I - AVX-512 instructions with T8, PD prefix. 769ff32ab3aSShengchen Kan// AVX512AIi8 - AVX-512 instructions with TA, PD prefix and ImmT = Imm8. 770689db42cSShengchen Kan// AVX512PDI - AVX-512 instructions with PD, double packed. 771689db42cSShengchen Kan// AVX512PSI - AVX-512 instructions with PS, single packed. 772689db42cSShengchen Kan// AVX512XS8I - AVX-512 instructions with T8 and XS prefixes. 773689db42cSShengchen Kan// AVX512XSI - AVX-512 instructions with XS prefix, generic domain. 774689db42cSShengchen Kan// AVX512BI - AVX-512 instructions with PD, int packed domain. 775689db42cSShengchen Kan// AVX512SI - AVX-512 scalar instructions with PD prefix. 776689db42cSShengchen Kan 777689db42cSShengchen Kanclass AVX5128I<bits<8> o, Format F, dag outs, dag ins, string asm, 778689db42cSShengchen Kan list<dag> pattern> 779ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 780689db42cSShengchen Kan Requires<[HasAVX512]>; 781ff32ab3aSShengchen Kanclass AVX5128IBase : T8, PD { 782689db42cSShengchen Kan Domain ExeDomain = SSEPackedInt; 783689db42cSShengchen Kan} 784689db42cSShengchen Kanclass AVX512XS8I<bits<8> o, Format F, dag outs, dag ins, string asm, 785689db42cSShengchen Kan list<dag> pattern> 786ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, XS, 787689db42cSShengchen Kan Requires<[HasAVX512]>; 788689db42cSShengchen Kanclass AVX512XSI<bits<8> o, Format F, dag outs, dag ins, string asm, 789689db42cSShengchen Kan list<dag> pattern> 790ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, XS, 791689db42cSShengchen Kan Requires<[HasAVX512]>; 792689db42cSShengchen Kanclass AVX512XDI<bits<8> o, Format F, dag outs, dag ins, string asm, 793689db42cSShengchen Kan list<dag> pattern> 794ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, TB, XD, 795689db42cSShengchen Kan Requires<[HasAVX512]>; 796689db42cSShengchen Kanclass AVX512BI<bits<8> o, Format F, dag outs, dag ins, string asm, 797689db42cSShengchen Kan list<dag> pattern> 798ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, TB, PD, 799689db42cSShengchen Kan Requires<[HasAVX512]>; 800ff32ab3aSShengchen Kanclass AVX512BIBase : TB, PD { 801689db42cSShengchen Kan Domain ExeDomain = SSEPackedInt; 802689db42cSShengchen Kan} 803689db42cSShengchen Kanclass AVX512BIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 804689db42cSShengchen Kan list<dag> pattern> 805ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TB, PD, 806689db42cSShengchen Kan Requires<[HasAVX512]>; 807689db42cSShengchen Kanclass AVX512AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 808689db42cSShengchen Kan list<dag> pattern> 809ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 810689db42cSShengchen Kan Requires<[HasAVX512]>; 811ff32ab3aSShengchen Kanclass AVX512AIi8Base : TA, PD { 812689db42cSShengchen Kan ImmType ImmT = Imm8; 813689db42cSShengchen Kan} 814689db42cSShengchen Kanclass AVX512Ii8<bits<8> o, Format F, dag outs, dag ins, string asm, 815689db42cSShengchen Kan list<dag> pattern> 816689db42cSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, 817689db42cSShengchen Kan Requires<[HasAVX512]>; 818689db42cSShengchen Kanclass AVX512PDI<bits<8> o, Format F, dag outs, dag ins, string asm, 819689db42cSShengchen Kan list<dag> pattern> 820ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, PD, 821689db42cSShengchen Kan Requires<[HasAVX512]>; 822689db42cSShengchen Kanclass AVX512PSI<bits<8> o, Format F, dag outs, dag ins, string asm, 823689db42cSShengchen Kan list<dag> pattern> 8246e20df1aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB, 825689db42cSShengchen Kan Requires<[HasAVX512]>; 826689db42cSShengchen Kanclass AVX512PIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 827689db42cSShengchen Kan list<dag> pattern, Domain d> 828689db42cSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, d>, Requires<[HasAVX512]>; 829689db42cSShengchen Kanclass AVX512PI<bits<8> o, Format F, dag outs, dag ins, string asm, 830689db42cSShengchen Kan list<dag> pattern, Domain d> 831689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern, d>, Requires<[HasAVX512]>; 832689db42cSShengchen Kanclass AVX512FMA3S<bits<8> o, Format F, dag outs, dag ins, string asm, 833689db42cSShengchen Kan list<dag>pattern> 834ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, T8, PD, 83562d8ae0aSShengchen Kan EVEX, VVVV, Requires<[HasAVX512]>; 836689db42cSShengchen Kan 837689db42cSShengchen Kanclass AVX512<bits<8> o, Format F, dag outs, dag ins, string asm, 838689db42cSShengchen Kan list<dag>pattern> 839689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern>, Requires<[HasAVX512]>; 840689db42cSShengchen Kan 841689db42cSShengchen Kan// AES Instruction Templates: 842689db42cSShengchen Kan// 843689db42cSShengchen Kan// AES8I 844689db42cSShengchen Kan// These use the same encoding as the SSE4.2 T8 and TA encodings. 845689db42cSShengchen Kanclass AES8I<bits<8> o, Format F, dag outs, dag ins, string asm, 846689db42cSShengchen Kan list<dag>pattern> 847ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, PD, 848689db42cSShengchen Kan Requires<[NoAVX, HasAES]>; 849689db42cSShengchen Kan 850689db42cSShengchen Kanclass AESAI<bits<8> o, Format F, dag outs, dag ins, string asm, 851689db42cSShengchen Kan list<dag> pattern> 852ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 853689db42cSShengchen Kan Requires<[NoAVX, HasAES]>; 854689db42cSShengchen Kan 855689db42cSShengchen Kan// PCLMUL Instruction Templates 856689db42cSShengchen Kanclass PCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 857689db42cSShengchen Kan list<dag>pattern> 858ff32ab3aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD; 859689db42cSShengchen Kan 860689db42cSShengchen Kan// FMA3 Instruction Templates 861689db42cSShengchen Kanclass FMA3<bits<8> o, Format F, dag outs, dag ins, string asm, 862689db42cSShengchen Kan list<dag>pattern> 863ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, T8, PD, 86462d8ae0aSShengchen Kan VEX, VVVV, FMASC, Requires<[HasFMA, NoFMA4, NoVLX]>; 865689db42cSShengchen Kanclass FMA3S<bits<8> o, Format F, dag outs, dag ins, string asm, 866689db42cSShengchen Kan list<dag>pattern> 867ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, T8, PD, 86862d8ae0aSShengchen Kan VEX, VVVV, FMASC, Requires<[HasFMA, NoFMA4, NoAVX512]>; 869689db42cSShengchen Kanclass FMA3S_Int<bits<8> o, Format F, dag outs, dag ins, string asm, 870689db42cSShengchen Kan list<dag>pattern> 871ff32ab3aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, T8, PD, 87262d8ae0aSShengchen Kan VEX, VVVV, FMASC, Requires<[HasFMA, NoAVX512]>; 873689db42cSShengchen Kan 874689db42cSShengchen Kan// FMA4 Instruction Templates 875689db42cSShengchen Kanclass FMA4<bits<8> o, Format F, dag outs, dag ins, string asm, 876689db42cSShengchen Kan list<dag>pattern> 877ff32ab3aSShengchen Kan : Ii8Reg<o, F, outs, ins, asm, pattern>, TA, PD, 87862d8ae0aSShengchen Kan VEX, VVVV, FMASC, Requires<[HasFMA4, NoVLX]>; 879689db42cSShengchen Kanclass FMA4S<bits<8> o, Format F, dag outs, dag ins, string asm, 880689db42cSShengchen Kan list<dag>pattern> 881ff32ab3aSShengchen Kan : Ii8Reg<o, F, outs, ins, asm, pattern>, TA, PD, 88262d8ae0aSShengchen Kan VEX, VVVV, FMASC, Requires<[HasFMA4, NoAVX512]>; 883689db42cSShengchen Kanclass FMA4S_Int<bits<8> o, Format F, dag outs, dag ins, string asm, 884689db42cSShengchen Kan list<dag>pattern> 885ff32ab3aSShengchen Kan : Ii8Reg<o, F, outs, ins, asm, pattern>, TA, PD, 88662d8ae0aSShengchen Kan VEX, VVVV, FMASC, Requires<[HasFMA4]>; 887689db42cSShengchen Kan 888689db42cSShengchen Kan// XOP 2, 3 and 4 Operand Instruction Template 889689db42cSShengchen Kanclass IXOP<bits<8> o, Format F, dag outs, dag ins, string asm, 890689db42cSShengchen Kan list<dag> pattern> 891689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, 892689db42cSShengchen Kan XOP9, Requires<[HasXOP]>; 893689db42cSShengchen Kan 894689db42cSShengchen Kan// XOP 2 and 3 Operand Instruction Templates with imm byte 895689db42cSShengchen Kanclass IXOPi8<bits<8> o, Format F, dag outs, dag ins, string asm, 896689db42cSShengchen Kan list<dag> pattern> 897689db42cSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern, SSEPackedDouble>, 898689db42cSShengchen Kan XOP8, Requires<[HasXOP]>; 899689db42cSShengchen Kan// XOP 4 Operand Instruction Templates with imm byte 900689db42cSShengchen Kanclass IXOPi8Reg<bits<8> o, Format F, dag outs, dag ins, string asm, 901689db42cSShengchen Kan list<dag> pattern> 902689db42cSShengchen Kan : Ii8Reg<o, F, outs, ins, asm, pattern, SSEPackedDouble>, 903689db42cSShengchen Kan XOP8, Requires<[HasXOP]>; 904689db42cSShengchen Kan 905689db42cSShengchen Kan// XOP 5 operand instruction (VEX encoding!) 906689db42cSShengchen Kanclass IXOP5<bits<8> o, Format F, dag outs, dag ins, string asm, 907689db42cSShengchen Kan list<dag>pattern> 908ff32ab3aSShengchen Kan : Ii8Reg<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, PD, 90962d8ae0aSShengchen Kan VEX, VVVV, Requires<[HasXOP]>; 910689db42cSShengchen Kan 911689db42cSShengchen Kan// X86-64 Instruction templates... 912689db42cSShengchen Kan// 913689db42cSShengchen Kan 914689db42cSShengchen Kanclass RI<bits<8> o, Format F, dag outs, dag ins, string asm, 915689db42cSShengchen Kan list<dag> pattern> 916689db42cSShengchen Kan : I<o, F, outs, ins, asm, pattern>, REX_W; 917689db42cSShengchen Kanclass RIi8 <bits<8> o, Format F, dag outs, dag ins, string asm, 918689db42cSShengchen Kan list<dag> pattern> 919689db42cSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, REX_W; 920689db42cSShengchen Kanclass RIi16 <bits<8> o, Format F, dag outs, dag ins, string asm, 921689db42cSShengchen Kan list<dag> pattern> 922689db42cSShengchen Kan : Ii16<o, F, outs, ins, asm, pattern>, REX_W; 923689db42cSShengchen Kanclass RIi32 <bits<8> o, Format F, dag outs, dag ins, string asm, 924689db42cSShengchen Kan list<dag> pattern> 925689db42cSShengchen Kan : Ii32<o, F, outs, ins, asm, pattern>, REX_W; 926689db42cSShengchen Kanclass RIi32S <bits<8> o, Format F, dag outs, dag ins, string asm, 927689db42cSShengchen Kan list<dag> pattern> 928689db42cSShengchen Kan : Ii32S<o, F, outs, ins, asm, pattern>, REX_W; 929689db42cSShengchen Kanclass RIi64<bits<8> o, Format F, dag outs, dag ins, string asm, 930689db42cSShengchen Kan list<dag> pattern> 931689db42cSShengchen Kan : Ii64<o, F, outs, ins, asm, pattern>, REX_W; 932689db42cSShengchen Kan 933689db42cSShengchen Kanclass RS2I<bits<8> o, Format F, dag outs, dag ins, string asm, 934689db42cSShengchen Kan list<dag> pattern> 935689db42cSShengchen Kan : S2I<o, F, outs, ins, asm, pattern>, REX_W; 936689db42cSShengchen Kanclass VRS2I<bits<8> o, Format F, dag outs, dag ins, string asm, 937689db42cSShengchen Kan list<dag> pattern> 938689db42cSShengchen Kan : VS2I<o, F, outs, ins, asm, pattern>, REX_W; 939689db42cSShengchen Kan 940689db42cSShengchen Kan// MMX Instruction templates 941689db42cSShengchen Kan// 942689db42cSShengchen Kan// MMXI - MMX instructions with TB prefix. 943620280c4SShengchen Kan// MMXRI - MMX instructions with TB prefix and REX.W. 944689db42cSShengchen Kan// MMXIi8 - MMX instructions with ImmT == Imm8 and PS prefix. 945689db42cSShengchen Kanclass MMXI<bits<8> o, Format F, dag outs, dag ins, string asm, 946689db42cSShengchen Kan list<dag> pattern> 9476e20df1aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, Requires<[HasMMX]>; 948689db42cSShengchen Kanclass MMXRI<bits<8> o, Format F, dag outs, dag ins, string asm, 949689db42cSShengchen Kan list<dag> pattern> 9506e20df1aSShengchen Kan : I<o, F, outs, ins, asm, pattern>, TB, REX_W, 951689db42cSShengchen Kan Requires<[HasMMX,In64BitMode]>; 952689db42cSShengchen Kanclass MMXIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 953689db42cSShengchen Kan list<dag> pattern> 9546e20df1aSShengchen Kan : Ii8<o, F, outs, ins, asm, pattern>, TB, Requires<[HasMMX]>; 955689db42cSShengchen Kan 956689db42cSShengchen Kan/// ITy - This instruction base class takes the type info for the instruction. 957689db42cSShengchen Kan/// Using this, it: 958689db42cSShengchen Kan/// 1. Concatenates together the instruction mnemonic with the appropriate 959689db42cSShengchen Kan/// suffix letter, a tab, and the arguments. 96017ff25a5SShengchen Kan/// 2. Infers whether the instruction should have a 0x40 REX_W prefix. 96117ff25a5SShengchen Kan/// 3. Infers whether the low bit of the opcode should be 0 (for i8 operations) 962689db42cSShengchen Kan/// or 1 (for i16,i32,i64 operations). 9639f4b6e1bSShengchen Kanclass ITy<bits<8> o, Format f, X86TypeInfo t, dag outs, dag ins, string m, 9649f4b6e1bSShengchen Kan string args, list<dag> p> 9659f4b6e1bSShengchen Kan : I<{o{7}, o{6}, o{5}, o{4}, o{3}, o{2}, o{1}, 9669f4b6e1bSShengchen Kan !if(!eq(t.HasEvenOpcode, 1), 0, o{0})}, f, outs, ins, 967d124b022SXinWang10 !strconcat(m, "{", t.InstrSuffix, "}\t", args), p>, NoCD8 { 968b223aebdSShengchen Kan let hasSideEffects = 0; 9699f4b6e1bSShengchen Kan let hasREX_W = t.HasREX_W; 970ffa48f0cSXinWang10 let IgnoresW = !if(!eq(t.VT, i8), 1, 0); 971689db42cSShengchen Kan} 9721479fe84SShengchen Kan 9730207e9eaSShengchen Kan// BinOpRR - Instructions that read "reg, reg". 9740207e9eaSShengchen Kanclass BinOpRR<bits<8> o, string m, string args, X86TypeInfo t, dag out, list<dag> p> 9750207e9eaSShengchen Kan : ITy<o, MRMDestReg, t, out, (ins t.RegClass:$src1, t.RegClass:$src2), m, 9760207e9eaSShengchen Kan args, p>, Sched<[WriteALU]>; 9770207e9eaSShengchen Kan// BinOpRR_F - Instructions that read "reg, reg" and write EFLAGS only. 9780207e9eaSShengchen Kanclass BinOpRR_F<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node> 9790207e9eaSShengchen Kan : BinOpRR<o, m, binop_args, t, (outs), 9800207e9eaSShengchen Kan [(set EFLAGS, (node t.RegClass:$src1, t.RegClass:$src2))]>, 9810207e9eaSShengchen Kan DefEFLAGS; 9820207e9eaSShengchen Kan// BinOpRR_F_Rev - Reversed encoding of BinOpRR_F 9830207e9eaSShengchen Kanclass BinOpRR_F_Rev<bits<8> o, string m, X86TypeInfo t> 9840207e9eaSShengchen Kan : BinOpRR_F<o, m, t, null_frag>, DisassembleOnly { 9850207e9eaSShengchen Kan let Form = MRMSrcReg; 986d79ccee8SShengchen Kan} 9870207e9eaSShengchen Kan// BinOpRR_R - Instructions that read "reg, reg" and write "reg". 9880207e9eaSShengchen Kanclass BinOpRR_R<bits<8> o, string m, X86TypeInfo t, bit ndd = 0> 9890207e9eaSShengchen Kan : BinOpRR<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, 9900207e9eaSShengchen Kan (outs t.RegClass:$dst), []>, NDD<ndd>; 9910207e9eaSShengchen Kan// BinOpRR_R_Rev - Reversed encoding of BinOpRR_R 9920207e9eaSShengchen Kanclass BinOpRR_R_Rev<bits<8> o, string m, X86TypeInfo t, bit ndd = 0> 9930207e9eaSShengchen Kan : BinOpRR_R<o, m, t, ndd>, DisassembleOnly { 9940207e9eaSShengchen Kan let Form = MRMSrcReg; 9950207e9eaSShengchen Kan} 9960207e9eaSShengchen Kan// BinOpRR_RF - Instructions that read "reg, reg", and write "reg", EFLAGS. 9970207e9eaSShengchen Kanclass BinOpRR_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, bit ndd = 0> 9980207e9eaSShengchen Kan : BinOpRR<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, 9990207e9eaSShengchen Kan (outs t.RegClass:$dst), 10000207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, 10010207e9eaSShengchen Kan (node t.RegClass:$src1, t.RegClass:$src2))]>, DefEFLAGS, NDD<ndd>; 10020207e9eaSShengchen Kan// BinOpRR_RF_Rev - Reversed encoding of BinOpRR_RF. 10030207e9eaSShengchen Kanclass BinOpRR_RF_Rev<bits<8> o, string m, X86TypeInfo t, bit ndd = 0> 10040207e9eaSShengchen Kan : BinOpRR_RF<o, m, t, null_frag, ndd>, DisassembleOnly { 10050207e9eaSShengchen Kan let Form = MRMSrcReg; 10060207e9eaSShengchen Kan} 10070207e9eaSShengchen Kan// BinOpRRF_RF - Instructions that read "reg, reg", write "reg" and read/write 10080207e9eaSShengchen Kan// EFLAGS. 1009dd9681f8SShengchen Kanclass BinOpRRF_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node = null_frag, bit ndd = 0> 10100207e9eaSShengchen Kan : BinOpRR<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, (outs t.RegClass:$dst), 10110207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, 10120207e9eaSShengchen Kan (node t.RegClass:$src1, t.RegClass:$src2, 10130207e9eaSShengchen Kan EFLAGS))]>, DefEFLAGS, UseEFLAGS, NDD<ndd> { 10140207e9eaSShengchen Kan let SchedRW = [WriteADC]; 10150207e9eaSShengchen Kan} 10160207e9eaSShengchen Kan// BinOpRRF_RF_Rev - Reversed encoding of BinOpRRF_RF 10170207e9eaSShengchen Kanclass BinOpRRF_RF_Rev<bits<8> o, string m, X86TypeInfo t, bit ndd = 0> 10180207e9eaSShengchen Kan : BinOpRRF_RF<o, m, t, null_frag, ndd>, DisassembleOnly { 10190207e9eaSShengchen Kan let Form = MRMSrcReg; 10200207e9eaSShengchen Kan} 10210207e9eaSShengchen Kan 10220207e9eaSShengchen Kan// BinOpRM - Instructions that read "reg, [mem]". 10230207e9eaSShengchen Kanclass BinOpRM<bits<8> o, string m, string args, X86TypeInfo t, dag out, list<dag> p> 10240207e9eaSShengchen Kan : ITy<o, MRMSrcMem, t, out, (ins t.RegClass:$src1, t.MemOperand:$src2), m, 10250207e9eaSShengchen Kan args, p>, 10260207e9eaSShengchen Kan Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]> { 10270207e9eaSShengchen Kan let mayLoad = 1; 10280207e9eaSShengchen Kan} 10290207e9eaSShengchen Kan// BinOpRM_F - Instructions that read "reg, [mem]" and write EFLAGS only. 10300207e9eaSShengchen Kanclass BinOpRM_F<bits<8> o, string m, X86TypeInfo t, SDNode node> 10310207e9eaSShengchen Kan : BinOpRM<o, m, binop_args, t, (outs), 10320207e9eaSShengchen Kan [(set EFLAGS, (node t.RegClass:$src1, 10330207e9eaSShengchen Kan (t.LoadNode addr:$src2)))]>, DefEFLAGS; 10340207e9eaSShengchen Kan// BinOpRM_R - Instructions that read "reg, [mem]", and write "reg". 10350207e9eaSShengchen Kanclass BinOpRM_R<bits<8> o, string m, X86TypeInfo t, bit ndd = 0> 10360207e9eaSShengchen Kan : BinOpRM<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, (outs t.RegClass:$dst), 10370207e9eaSShengchen Kan []>, NDD<ndd>; 10380207e9eaSShengchen Kan// BinOpRM_RF - Instructions that read "reg, [mem]", and write "reg", EFLAGS. 10390207e9eaSShengchen Kanclass BinOpRM_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, bit ndd = 0> 10400207e9eaSShengchen Kan : BinOpRM<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, (outs t.RegClass:$dst), 10410207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node t.RegClass:$src1, 10420207e9eaSShengchen Kan (t.LoadNode addr:$src2)))]>, DefEFLAGS, NDD<ndd>; 10430207e9eaSShengchen Kan// BinOpRMF_RF - Instructions that read "reg, [mem]", write "reg" and read/write 10440207e9eaSShengchen Kan// EFLAGS. 1045dd9681f8SShengchen Kanclass BinOpRMF_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node = null_frag, bit ndd = 0> 10460207e9eaSShengchen Kan : BinOpRM<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, (outs t.RegClass:$dst), 10470207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, 10480207e9eaSShengchen Kan (node t.RegClass:$src1, (t.LoadNode addr:$src2), EFLAGS))]>, 10490207e9eaSShengchen Kan DefEFLAGS, UseEFLAGS, NDD<ndd> { 10500207e9eaSShengchen Kan let SchedRW = [WriteADC.Folded, WriteADC.ReadAfterFold, 10510207e9eaSShengchen Kan // base, scale, index, offset, segment. 10520207e9eaSShengchen Kan ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault, 10530207e9eaSShengchen Kan // implicit register read. 10540207e9eaSShengchen Kan WriteADC.ReadAfterFold]; 10550207e9eaSShengchen Kan} 10560207e9eaSShengchen Kan 10570207e9eaSShengchen Kan// BinOpRI - Instructions that read "reg, imm". 10580207e9eaSShengchen Kanclass BinOpRI<bits<8> o, string m, string args, X86TypeInfo t, Format f, dag out, list<dag> p> 10590207e9eaSShengchen Kan : ITy<o, f, t, out, (ins t.RegClass:$src1, t.ImmOperand:$src2), m, 10600207e9eaSShengchen Kan args, p>, Sched<[WriteALU]> { 10610207e9eaSShengchen Kan let ImmT = t.ImmEncoding; 10620207e9eaSShengchen Kan} 10630207e9eaSShengchen Kan// BinOpRI_F - Instructions that read "reg, imm" and write EFLAGS only. 10640207e9eaSShengchen Kanclass BinOpRI_F<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, 10650207e9eaSShengchen Kan Format f> 10660207e9eaSShengchen Kan : BinOpRI<o, m, binop_args, t, f, (outs), 10670207e9eaSShengchen Kan [(set EFLAGS, (node t.RegClass:$src1, 10680207e9eaSShengchen Kan t.ImmOperator:$src2))]>, DefEFLAGS; 10690207e9eaSShengchen Kan// BinOpRI_R - Instructions that read "reg, imm" and write "reg". 10700207e9eaSShengchen Kanclass BinOpRI_R<bits<8> o, string m, X86TypeInfo t, Format f, bit ndd = 0> 10710207e9eaSShengchen Kan : BinOpRI<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, f, (outs t.RegClass:$dst), 10720207e9eaSShengchen Kan []>, NDD<ndd>; 10733d682174SShengchen Kan// BinOpRI8U_R - Instructions that read "reg, u8imm" and write "reg". 10745c68c6d7SShengchen Kanclass BinOpRI8U_R<string m, Format f, X86TypeInfo t, SDPatternOperator node = null_frag, bit ndd = 0> 10753d682174SShengchen Kan : ITy<0xC1, f, t, (outs t.RegClass:$dst), (ins t.RegClass:$src1, u8imm:$src2), m, 10765c68c6d7SShengchen Kan !if(!eq(ndd, 0), binop_args, binop_ndd_args), 10775c68c6d7SShengchen Kan [(set t.RegClass:$dst, (node t.RegClass:$src1, (i8 imm:$src2)))]>, NDD<ndd> { 10783d682174SShengchen Kan let ImmT = Imm8; 10793d682174SShengchen Kan} 10800207e9eaSShengchen Kan// BinOpRI_RF - Instructions that read "reg, imm" and write "reg", EFLAGS. 10810207e9eaSShengchen Kanclass BinOpRI_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, Format f, bit ndd = 0> 10820207e9eaSShengchen Kan : BinOpRI<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, f, (outs t.RegClass:$dst), 10830207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, 10840207e9eaSShengchen Kan (node t.RegClass:$src1, t.ImmOperator:$src2))]>, DefEFLAGS, NDD<ndd>; 10850207e9eaSShengchen Kan// BinOpRIF_RF - Instructions that read "reg, imm", write "reg" and read/write 10860207e9eaSShengchen Kan// EFLAGS. 10870207e9eaSShengchen Kanclass BinOpRIF_RF<bits<8> o, string m, X86TypeInfo t, SDNode node, Format f, bit ndd = 0> 10880207e9eaSShengchen Kan : BinOpRI<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, f, (outs t.RegClass:$dst), 10890207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, 10900207e9eaSShengchen Kan (node t.RegClass:$src1, t.ImmOperator:$src2, 10910207e9eaSShengchen Kan EFLAGS))]>, DefEFLAGS, UseEFLAGS, NDD<ndd> { 10920207e9eaSShengchen Kan let SchedRW = [WriteADC]; 10930207e9eaSShengchen Kan} 10940207e9eaSShengchen Kan// BinOpRI8 - Instructions that read "reg, imm8". 10950207e9eaSShengchen Kanclass BinOpRI8<bits<8> o, string m, string args, X86TypeInfo t, Format f, dag out> 10960207e9eaSShengchen Kan : ITy<o, f, t, out, (ins t.RegClass:$src1, t.Imm8Operand:$src2), m, 10970207e9eaSShengchen Kan args, []>, Sched<[WriteALU]> { 10980207e9eaSShengchen Kan let ImmT = Imm8; 10990207e9eaSShengchen Kan} 11000207e9eaSShengchen Kan// BinOpRI8_F - Instructions that read "reg, imm8" and write EFLAGS only. 11010207e9eaSShengchen Kanclass BinOpRI8_F<bits<8> o, string m, X86TypeInfo t, Format f> 11020207e9eaSShengchen Kan : BinOpRI8<o, m, binop_args, t, f, (outs)>, DefEFLAGS; 11030207e9eaSShengchen Kan// BinOpRI8_R - Instructions that read "reg, imm8" and write "reg". 11040207e9eaSShengchen Kanclass BinOpRI8_R<bits<8> o, string m, X86TypeInfo t, Format f, bit ndd = 0> 11050207e9eaSShengchen Kan : BinOpRI8<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, f, (outs t.RegClass:$dst)>, NDD<ndd>; 11060207e9eaSShengchen Kan// BinOpRI8_RF - Instructions that read "reg, imm8" and write "reg", EFLAGS. 11070207e9eaSShengchen Kanclass BinOpRI8_RF<bits<8> o, string m, X86TypeInfo t, Format f, bit ndd = 0> 11080207e9eaSShengchen Kan : BinOpRI8<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, f, (outs t.RegClass:$dst)>, DefEFLAGS, NDD<ndd>; 11090207e9eaSShengchen Kan// BinOpRI8F_RF - Instructions that read "reg, imm", write "reg" and read/write 11100207e9eaSShengchen Kan// EFLAGS. 11110207e9eaSShengchen Kanclass BinOpRI8F_RF<bits<8> o, string m, X86TypeInfo t, Format f, bit ndd = 0> 11120207e9eaSShengchen Kan : BinOpRI8<o, m, !if(!eq(ndd, 0), binop_args, binop_ndd_args), t, f, (outs t.RegClass:$dst)>, DefEFLAGS, UseEFLAGS, NDD<ndd> { 11130207e9eaSShengchen Kan let SchedRW = [WriteADC]; 11140207e9eaSShengchen Kan} 11150207e9eaSShengchen Kan 11160207e9eaSShengchen Kan// BinOpMR - Instructions that read "[mem], reg". 11170207e9eaSShengchen Kanclass BinOpMR<bits<8> o, string m, string args, X86TypeInfo t, dag out, list<dag> p> 11180207e9eaSShengchen Kan : ITy<o, MRMDestMem, t, out, (ins t.MemOperand:$src1, t.RegClass:$src2), m, 11190207e9eaSShengchen Kan args, p> { 11200207e9eaSShengchen Kan let mayLoad = 1; 11210207e9eaSShengchen Kan let SchedRW = [WriteALU.Folded, WriteALU.ReadAfterFold]; 11220207e9eaSShengchen Kan} 11230207e9eaSShengchen Kan// BinOpMR_R - Instructions that read "[mem], reg", and write "reg". 11240207e9eaSShengchen Kanclass BinOpMR_R<bits<8> o, string m, X86TypeInfo t> 11250207e9eaSShengchen Kan : BinOpMR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst), []>, NDD<1>; 11260207e9eaSShengchen Kan// BinOpMR_RF - Instructions that read "[mem], reg", and write "reg", EFLAGS. 11270207e9eaSShengchen Kanclass BinOpMR_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node> 11280207e9eaSShengchen Kan : BinOpMR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst), 11290207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node (t.LoadNode addr:$src1), 11300207e9eaSShengchen Kan t.RegClass:$src2))]>, DefEFLAGS, NDD<1>; 11310207e9eaSShengchen Kan// BinOpMR_F - Instructions that read "[mem], imm8" and write EFLAGS only. 11320207e9eaSShengchen Kanclass BinOpMR_F<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node> 11330207e9eaSShengchen Kan : BinOpMR<o, m, binop_args, t, (outs), 11340207e9eaSShengchen Kan [(set EFLAGS, (node (t.LoadNode addr:$src1), t.RegClass:$src2))]>, 11350207e9eaSShengchen Kan Sched<[WriteALU.Folded, ReadDefault, ReadDefault, ReadDefault, 11360207e9eaSShengchen Kan ReadDefault, ReadDefault, WriteALU.ReadAfterFold]>, DefEFLAGS; 11370207e9eaSShengchen Kan// BinOpMR_M - Instructions that read "[mem], reg" and write "[mem]". 11380207e9eaSShengchen Kanclass BinOpMR_M<bits<8> o, string m, X86TypeInfo t> 11390207e9eaSShengchen Kan : BinOpMR<o, m, binop_args, t, (outs), []>, 11400207e9eaSShengchen Kan Sched<[WriteALURMW, 11410207e9eaSShengchen Kan // base, scale, index, offset, segment 11420207e9eaSShengchen Kan ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault]> { 11430207e9eaSShengchen Kan let mayStore = 1; 11440207e9eaSShengchen Kan} 11450207e9eaSShengchen Kan// BinOpMR_MF - Instructions that read "[mem], reg" and write "[mem]", EFLAGS. 11460207e9eaSShengchen Kanclass BinOpMR_MF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node> 11470207e9eaSShengchen Kan : BinOpMR<o, m, binop_args, t, (outs), 1148501a5834SSergei Barannikov [(store (node (load addr:$src1), t.RegClass:$src2), addr:$src1)]>, 11490207e9eaSShengchen Kan Sched<[WriteALURMW, 11500207e9eaSShengchen Kan // base, scale, index, offset, segment 11510207e9eaSShengchen Kan ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault, 11520207e9eaSShengchen Kan WriteALU.ReadAfterFold]>, // reg 11530207e9eaSShengchen Kan DefEFLAGS { 11540207e9eaSShengchen Kan let mayStore = 1; 11550207e9eaSShengchen Kan} 11560207e9eaSShengchen Kan// BinOpMRF_RF - Instructions that read "[mem], reg", write "reg" and 11570207e9eaSShengchen Kan// read/write EFLAGS. 11580207e9eaSShengchen Kanclass BinOpMRF_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node> 11590207e9eaSShengchen Kan : BinOpMR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst), 11600207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node (load addr:$src1), 11610207e9eaSShengchen Kan t.RegClass:$src2, EFLAGS))]>, DefEFLAGS, UseEFLAGS, NDD<1>, 11620207e9eaSShengchen Kan Sched<[WriteADC.Folded, WriteADC.ReadAfterFold]>; 11630207e9eaSShengchen Kan// BinOpMRF_MF - Instructions that read "[mem], reg", write "[mem]" and 11640207e9eaSShengchen Kan// read/write EFLAGS. 11650207e9eaSShengchen Kanclass BinOpMRF_MF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node> 11660207e9eaSShengchen Kan : BinOpMR<o, m, binop_args, t, (outs), 11670207e9eaSShengchen Kan [(store (node (load addr:$src1), t.RegClass:$src2, EFLAGS), 1168501a5834SSergei Barannikov addr:$src1)]>, 11690207e9eaSShengchen Kan Sched<[WriteADCRMW, 11700207e9eaSShengchen Kan // base, scale, index, offset, segment 11710207e9eaSShengchen Kan ReadDefault, ReadDefault, ReadDefault, 11720207e9eaSShengchen Kan ReadDefault, ReadDefault, 11730207e9eaSShengchen Kan WriteALU.ReadAfterFold, // reg 11740207e9eaSShengchen Kan WriteALU.ReadAfterFold]>, // EFLAGS 11750207e9eaSShengchen Kan DefEFLAGS, UseEFLAGS { 11760207e9eaSShengchen Kan let mayStore = 1; 11770207e9eaSShengchen Kan} 11780207e9eaSShengchen Kan 11790207e9eaSShengchen Kan// BinOpMI - Instructions that read "[mem], imm". 11800207e9eaSShengchen Kanclass BinOpMI<bits<8> o, string m, string args, X86TypeInfo t, Format f, dag out, list<dag> p> 11810207e9eaSShengchen Kan : ITy<o, f, t, out, (ins t.MemOperand:$src1, t.ImmOperand:$src2), m, 11820207e9eaSShengchen Kan args, p> { 11830207e9eaSShengchen Kan let ImmT = t.ImmEncoding; 11840207e9eaSShengchen Kan let mayLoad = 1; 11850207e9eaSShengchen Kan} 11860207e9eaSShengchen Kan// BinOpMI_F - Instructions that read "[mem], imm" and write EFLAGS only. 11870207e9eaSShengchen Kanclass BinOpMI_F<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, 11880207e9eaSShengchen Kan Format f> 11890207e9eaSShengchen Kan : BinOpMI<o, m, binop_args, t, f, (outs), 11900207e9eaSShengchen Kan [(set EFLAGS, (node (t.LoadNode addr:$src1), t.ImmOperator:$src2))]>, 11910207e9eaSShengchen Kan Sched<[WriteALU.Folded]>, DefEFLAGS; 11920207e9eaSShengchen Kan// BinOpMI_R - Instructions that read "[mem], imm" and write "reg". 11930207e9eaSShengchen Kanclass BinOpMI_R<bits<8> o, string m, X86TypeInfo t, Format f> 11940207e9eaSShengchen Kan : BinOpMI<o, m, binop_ndd_args, t, f, (outs t.RegClass:$dst), []>, 11950207e9eaSShengchen Kan Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, NDD<1>; 11960207e9eaSShengchen Kan// BinOpMI_R - Instructions that read "[mem], imm" and write "reg", EFLAGS. 11970207e9eaSShengchen Kanclass BinOpMI_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, 11980207e9eaSShengchen Kan Format f> 11990207e9eaSShengchen Kan : BinOpMI<o, m, binop_ndd_args, t, f, (outs t.RegClass:$dst), 12000207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node (t.LoadNode addr:$src1), t.ImmOperator:$src2))]>, 12010207e9eaSShengchen Kan Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, DefEFLAGS, NDD<1>; 12020207e9eaSShengchen Kan// BinOpMI_M - Instructions that read "[mem], imm" and write "[mem]". 12030207e9eaSShengchen Kanclass BinOpMI_M<bits<8> o, string m, X86TypeInfo t, Format f> 12040207e9eaSShengchen Kan : BinOpMI<o, m, binop_args, t, f, (outs), []>, Sched<[WriteALURMW]> { 12050207e9eaSShengchen Kan let mayStore = 1; 12060207e9eaSShengchen Kan} 12070207e9eaSShengchen Kan// BinOpMI_MF - Instructions that read "[mem], imm" and write "[mem]", EFLAGS. 12080207e9eaSShengchen Kanclass BinOpMI_MF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node, Format f> 12090207e9eaSShengchen Kan : BinOpMI<o, m, binop_args, t, f, (outs), 12100207e9eaSShengchen Kan [(store (node (t.VT (load addr:$src1)), 1211501a5834SSergei Barannikov t.ImmOperator:$src2), addr:$src1)]>, 12120207e9eaSShengchen Kan Sched<[WriteALURMW]>, DefEFLAGS { 12130207e9eaSShengchen Kan let mayStore = 1; 12140207e9eaSShengchen Kan} 12150207e9eaSShengchen Kan// BinOpMIF_RF - Instructions that read "[mem], imm", write "reg" and 12160207e9eaSShengchen Kan// read/write EFLAGS. 12170207e9eaSShengchen Kanclass BinOpMIF_RF<bits<8> o, string m, X86TypeInfo t, SDNode node, Format f> 12180207e9eaSShengchen Kan : BinOpMI<o, m, binop_ndd_args, t, f, (outs t.RegClass:$dst), 12190207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node (t.VT (load addr:$src1)), 12200207e9eaSShengchen Kan t.ImmOperator:$src2, EFLAGS))]>, 12210207e9eaSShengchen Kan Sched<[WriteADC.Folded, WriteADC.ReadAfterFold]>, DefEFLAGS, UseEFLAGS, NDD<1>; 12220207e9eaSShengchen Kan// BinOpMIF_MF - Instructions that read "[mem], imm", write "[mem]" and 12230207e9eaSShengchen Kan// read/write EFLAGS. 12240207e9eaSShengchen Kanclass BinOpMIF_MF<bits<8> o, string m, X86TypeInfo t, SDNode node, Format f> 12250207e9eaSShengchen Kan : BinOpMI<o, m, binop_args, t, f, (outs), 12260207e9eaSShengchen Kan [(store (node (t.VT (load addr:$src1)), 1227501a5834SSergei Barannikov t.ImmOperator:$src2, EFLAGS), addr:$src1)]>, 12280207e9eaSShengchen Kan Sched<[WriteADCRMW]>, DefEFLAGS, UseEFLAGS { 12290207e9eaSShengchen Kan let mayStore = 1; 12300207e9eaSShengchen Kan} 12310207e9eaSShengchen Kan 12320207e9eaSShengchen Kan// BinOpMI8 - Instructions that read "[mem], imm8". 12330207e9eaSShengchen Kanclass BinOpMI8<string m, string args, X86TypeInfo t, Format f, dag out> 12340207e9eaSShengchen Kan : ITy<0x83, f, t, out, (ins t.MemOperand:$src1, t.Imm8Operand:$src2), m, 12350207e9eaSShengchen Kan args, []> { 12360207e9eaSShengchen Kan let ImmT = Imm8; 12370207e9eaSShengchen Kan let mayLoad = 1; 12380207e9eaSShengchen Kan} 12395c68c6d7SShengchen Kan// BinOpMI8U - Instructions that read "[mem], u8imm". 12405c68c6d7SShengchen Kanclass BinOpMI8U<string m, string args, X86TypeInfo t, Format f, dag out, list<dag> p> 12415c68c6d7SShengchen Kan : ITy<0xC1, f, t, out, (ins t.MemOperand:$src1, u8imm:$src2), m, args, p> { 12425c68c6d7SShengchen Kan let ImmT = Imm8; 12435c68c6d7SShengchen Kan let mayLoad = 1; 12445c68c6d7SShengchen Kan} 12450207e9eaSShengchen Kan// BinOpMI8_F - Instructions that read "[mem], imm8" and write EFLAGS only. 12460207e9eaSShengchen Kanclass BinOpMI8_F<string m, X86TypeInfo t, Format f> 12470207e9eaSShengchen Kan : BinOpMI8<m, binop_args, t, f, (outs)>, Sched<[WriteALU.Folded]>, DefEFLAGS; 12480207e9eaSShengchen Kan// BinOpMI8_R - Instructions that read "[mem], imm8" and write "reg". 12490207e9eaSShengchen Kanclass BinOpMI8_R<string m, X86TypeInfo t, Format f> 12500207e9eaSShengchen Kan : BinOpMI8<m, binop_ndd_args, t, f, (outs t.RegClass:$dst)>, Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, NDD<1>; 12515c68c6d7SShengchen Kan// BinOpMI8U_R - Instructions that read "[mem], u8imm" and write "reg". 12525c68c6d7SShengchen Kanclass BinOpMI8U_R<string m, Format f, X86TypeInfo t, SDPatternOperator node = null_frag> 12535c68c6d7SShengchen Kan : BinOpMI8U<m, binop_ndd_args, t, f, (outs t.RegClass:$dst), 12545c68c6d7SShengchen Kan [(set t.RegClass:$dst, (node (t.LoadNode addr:$src1), (i8 imm:$src2)))]>, NDD<1>; 12550207e9eaSShengchen Kan// BinOpMI8_RF - Instructions that read "[mem], imm8" and write "reg"/EFLAGS. 12560207e9eaSShengchen Kanclass BinOpMI8_RF<string m, X86TypeInfo t, Format f> 12570207e9eaSShengchen Kan : BinOpMI8<m, binop_ndd_args, t, f, (outs t.RegClass:$dst)>, Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, DefEFLAGS, NDD<1>; 12580207e9eaSShengchen Kan// BinOpMI8_M - Instructions that read "[mem], imm8" and write "[mem]". 12590207e9eaSShengchen Kanclass BinOpMI8_M<string m, X86TypeInfo t, Format f> 12600207e9eaSShengchen Kan : BinOpMI8<m, binop_args, t, f, (outs)>, Sched<[WriteALURMW]> { 12610207e9eaSShengchen Kan let mayStore = 1; 12620207e9eaSShengchen Kan} 12635c68c6d7SShengchen Kan// BinOpMI8U_M - Instructions that read "[mem], u8imm" and write "[mem]". 12645c68c6d7SShengchen Kanclass BinOpMI8U_M<string m, Format f, X86TypeInfo t, SDPatternOperator node = null_frag> 12655c68c6d7SShengchen Kan : BinOpMI8U<m, binop_args, t, f, (outs), 12665c68c6d7SShengchen Kan [(store (node (t.LoadNode addr:$src1), (i8 imm:$src2)), addr:$src1)]> { 12675c68c6d7SShengchen Kan let mayStore = 1; 12685c68c6d7SShengchen Kan} 12690207e9eaSShengchen Kan// BinOpMI8_MF - Instructions that read "[mem], imm8" and write "[mem]", EFLAGS. 12700207e9eaSShengchen Kanclass BinOpMI8_MF<string m, X86TypeInfo t, Format f> 12710207e9eaSShengchen Kan : BinOpMI8<m, binop_args, t, f, (outs)>, Sched<[WriteALURMW]>, DefEFLAGS { 12720207e9eaSShengchen Kan let mayStore = 1; 12730207e9eaSShengchen Kan} 12740207e9eaSShengchen Kan// BinOpMI8F_RF - Instructions that read "[mem], imm8", write "reg" and 12750207e9eaSShengchen Kan// read/write EFLAGS. 12760207e9eaSShengchen Kanclass BinOpMI8F_RF<string m, X86TypeInfo t, Format f> 12770207e9eaSShengchen Kan : BinOpMI8<m, binop_ndd_args, t, f, (outs t.RegClass:$dst)>, 12780207e9eaSShengchen Kan Sched<[WriteADC.Folded, WriteADC.ReadAfterFold]>, DefEFLAGS, UseEFLAGS, NDD<1>; 12790207e9eaSShengchen Kan// BinOpMI8F_MF - Instructions that read "[mem], imm8", write "[mem]" and 12800207e9eaSShengchen Kan// read/write EFLAGS. 12810207e9eaSShengchen Kanclass BinOpMI8F_MF<string m, X86TypeInfo t, Format f> 12820207e9eaSShengchen Kan : BinOpMI8<m, binop_args, t, f, (outs)>, Sched<[WriteADCRMW]>, DefEFLAGS, UseEFLAGS { 12830207e9eaSShengchen Kan let mayStore = 1; 12840207e9eaSShengchen Kan} 12850207e9eaSShengchen Kan 12860207e9eaSShengchen Kan// BinOpAI - Instructions that read "a-reg imm" (Accumulator register). 12870207e9eaSShengchen Kanclass BinOpAI<bits<8> o, string m, X86TypeInfo t, Register areg, string args> 12880207e9eaSShengchen Kan : ITy<o, RawFrm, t, (outs), (ins t.ImmOperand:$src), m, args, []>, 12890207e9eaSShengchen Kan Sched<[WriteALU]> { 12900207e9eaSShengchen Kan let ImmT = t.ImmEncoding; 12910207e9eaSShengchen Kan let Uses = [areg]; 12920207e9eaSShengchen Kan} 12930207e9eaSShengchen Kan// BinOpAI_F - Instructions that read "a-reg imm" and write EFLAGS only. 12940207e9eaSShengchen Kanclass BinOpAI_F<bits<8> o, string m, X86TypeInfo t, Register areg, string args> 12950207e9eaSShengchen Kan : BinOpAI<o, m, t, areg, args>, DefEFLAGS; 12960207e9eaSShengchen Kan 12970207e9eaSShengchen Kan// BinOpAI_AF - Instructions that read "a-reg imm" and write a-reg/EFLAGS. 12980207e9eaSShengchen Kanclass BinOpAI_AF<bits<8> o, string m, X86TypeInfo t, Register areg, 12990207e9eaSShengchen Kan string args> : BinOpAI<o, m, t, areg, args> { 13000207e9eaSShengchen Kan let Defs = [areg, EFLAGS]; 13010207e9eaSShengchen Kan} 13020207e9eaSShengchen Kan// BinOpAIF_AF - Instructions that read "a-reg imm", write a-reg and read/write 13030207e9eaSShengchen Kan// EFLAGS. 13040207e9eaSShengchen Kanclass BinOpAIF_AF<bits<8> o, string m, X86TypeInfo t, Register areg, 13050207e9eaSShengchen Kan string args> : BinOpAI<o, m, t, areg, args> { 13060207e9eaSShengchen Kan let Uses = [areg, EFLAGS]; 13070207e9eaSShengchen Kan let Defs = [areg, EFLAGS]; 13080207e9eaSShengchen Kan let SchedRW = [WriteADC]; 13090207e9eaSShengchen Kan} 13103d682174SShengchen Kan// BinOpRC_R - Instructions that read "reg, cl" and write reg. 13115c68c6d7SShengchen Kanclass BinOpRC_R<string m, Format f, X86TypeInfo t, SDPatternOperator node = null_frag, bit ndd = 0> 13125c68c6d7SShengchen Kan : ITy<0xD3, f, t, (outs t.RegClass:$dst), (ins t.RegClass:$src1), m, 13135c68c6d7SShengchen Kan !if(!eq(ndd, 0), binop_cl_args, binop_cl_ndd_args), 13145c68c6d7SShengchen Kan [(set t.RegClass:$dst, (node t.RegClass:$src1, CL))]>, NDD<ndd> { 13153d682174SShengchen Kan let Uses = [CL]; 13163d682174SShengchen Kan} 13173d682174SShengchen Kan// BinOpMC_M - Instructions that read "[mem], cl" and write [mem]. 13185c68c6d7SShengchen Kanclass BinOpMC_M<string m, Format f, X86TypeInfo t, SDPatternOperator node = null_frag> 13193d682174SShengchen Kan : ITy<0xD3, f, t, (outs), (ins t.MemOperand:$src1), m, binop_cl_args, 13203d682174SShengchen Kan [(store (node (t.LoadNode addr:$src1), CL), addr:$src1)]> { 13213d682174SShengchen Kan let Uses = [CL]; 13223d682174SShengchen Kan let mayLoad = 1; 13233d682174SShengchen Kan let mayStore = 1; 13243d682174SShengchen Kan} 13255c68c6d7SShengchen Kan// BinOpMC_R - Instructions that read "[mem], cl" and write reg. 13265c68c6d7SShengchen Kanclass BinOpMC_R<string m, Format f, X86TypeInfo t, SDPatternOperator node = null_frag> 13275c68c6d7SShengchen Kan : ITy<0xD3, f, t, (outs t.RegClass:$dst), (ins t.MemOperand:$src1), m, binop_cl_ndd_args, 13285c68c6d7SShengchen Kan [(set t.RegClass:$dst, (node (t.LoadNode addr:$src1), CL))]>, NDD<1> { 13295c68c6d7SShengchen Kan let Uses = [CL]; 13305c68c6d7SShengchen Kan let mayLoad = 1; 13315c68c6d7SShengchen Kan} 13320207e9eaSShengchen Kan 13330207e9eaSShengchen Kan// UnaryOpR - Instructions that read "reg". 13340207e9eaSShengchen Kanclass UnaryOpR<bits<8> o, Format f, string m, string args, X86TypeInfo t, 13350207e9eaSShengchen Kan dag out, list<dag> p> 13360207e9eaSShengchen Kan : ITy<o, f, t, out, (ins t.RegClass:$src1), m, args, p>, Sched<[WriteALU]>; 13370207e9eaSShengchen Kan// UnaryOpR_R - Instructions that read "reg" and write "reg". 13380207e9eaSShengchen Kanclass UnaryOpR_R<bits<8> o, Format f, string m, X86TypeInfo t, 13395c68c6d7SShengchen Kan SDPatternOperator node = null_frag, bit ndd = 0> 13400207e9eaSShengchen Kan : UnaryOpR<o, f, m, !if(!eq(ndd, 0), unaryop_args, unaryop_ndd_args), t, 13410207e9eaSShengchen Kan (outs t.RegClass:$dst), 13420207e9eaSShengchen Kan [(set t.RegClass:$dst, (node t.RegClass:$src1))]>, NDD<ndd>; 13430207e9eaSShengchen Kan// UnaryOpR_RF - Instructions that read "reg" and write "reg"/EFLAGS. 13440207e9eaSShengchen Kanclass UnaryOpR_RF<bits<8> o, Format f, string m, X86TypeInfo t, 13455c68c6d7SShengchen Kan SDPatternOperator node = null_frag, bit ndd = 0> 13460207e9eaSShengchen Kan : UnaryOpR<o, f, m, !if(!eq(ndd, 0), unaryop_args, unaryop_ndd_args), t, 13470207e9eaSShengchen Kan (outs t.RegClass:$dst), 1348501a5834SSergei Barannikov [(set t.RegClass:$dst, (node t.RegClass:$src1))]>, 1349501a5834SSergei Barannikov DefEFLAGS, NDD<ndd>; 13500207e9eaSShengchen Kan 13510207e9eaSShengchen Kan// UnaryOpM - Instructions that read "[mem]". 13520207e9eaSShengchen Kanclass UnaryOpM<bits<8> o, Format f, string m, string args, X86TypeInfo t, 13530207e9eaSShengchen Kan dag out, list<dag> p> 13540207e9eaSShengchen Kan : ITy<o, f, t, out, (ins t.MemOperand:$src1), m, args, p> { 13550207e9eaSShengchen Kan let mayLoad = 1; 13560207e9eaSShengchen Kan} 13570207e9eaSShengchen Kan// UnaryOpM_R - Instructions that read "[mem]" and writes "reg". 13580207e9eaSShengchen Kanclass UnaryOpM_R<bits<8> o, Format f, string m, X86TypeInfo t, 13595c68c6d7SShengchen Kan SDPatternOperator node = null_frag> 13600207e9eaSShengchen Kan : UnaryOpM<o, f, m, unaryop_ndd_args, t, (outs t.RegClass:$dst), 13610207e9eaSShengchen Kan [(set t.RegClass:$dst, (node (t.LoadNode addr:$src1)))]>, 13620207e9eaSShengchen Kan Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, NDD<1>; 13630207e9eaSShengchen Kan// UnaryOpM_RF - Instructions that read "[mem]" and writes "reg"/EFLAGS. 13640207e9eaSShengchen Kanclass UnaryOpM_RF<bits<8> o, Format f, string m, X86TypeInfo t, 13655c68c6d7SShengchen Kan SDPatternOperator node = null_frag> 13660207e9eaSShengchen Kan : UnaryOpM<o, f, m, unaryop_ndd_args, t, (outs t.RegClass:$dst), 13670207e9eaSShengchen Kan [(set t.RegClass:$dst, EFLAGS, (node (t.LoadNode addr:$src1)))]>, 13680207e9eaSShengchen Kan Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, DefEFLAGS, NDD<1>; 13690207e9eaSShengchen Kan// UnaryOpM_M - Instructions that read "[mem]" and writes "[mem]". 13700207e9eaSShengchen Kanclass UnaryOpM_M<bits<8> o, Format f, string m, X86TypeInfo t, 13715c68c6d7SShengchen Kan SDPatternOperator node = null_frag> 13720207e9eaSShengchen Kan : UnaryOpM<o, f, m, unaryop_args, t, (outs), 13730207e9eaSShengchen Kan [(store (node (t.LoadNode addr:$src1)), addr:$src1)]>, 13740207e9eaSShengchen Kan Sched<[WriteALURMW]>{ 13750207e9eaSShengchen Kan let mayStore = 1; 13760207e9eaSShengchen Kan} 13770207e9eaSShengchen Kan// UnaryOpM_MF - Instructions that read "[mem]" and writes "[mem]"/EFLAGS. 13780207e9eaSShengchen Kanclass UnaryOpM_MF<bits<8> o, Format f, string m, X86TypeInfo t, 13795c68c6d7SShengchen Kan SDPatternOperator node = null_frag> 13800207e9eaSShengchen Kan : UnaryOpM<o, f, m, unaryop_args, t, (outs), 1381501a5834SSergei Barannikov [(store (node (t.LoadNode addr:$src1)), addr:$src1)]>, 1382501a5834SSergei Barannikov Sched<[WriteALURMW]>, DefEFLAGS { 13830207e9eaSShengchen Kan let mayStore = 1; 13840207e9eaSShengchen Kan} 1385