1*9880d681SAndroid Build Coastguard Worker//===-- X86InstrAVX512.td - AVX512 Instruction Set ---------*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes the X86 AVX512 instruction set, defining the 11*9880d681SAndroid Build Coastguard Worker// instructions, and properties of the instructions which are needed for code 12*9880d681SAndroid Build Coastguard Worker// generation, machine code emission, and analysis. 13*9880d681SAndroid Build Coastguard Worker// 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker// Group template arguments that can be derived from the vector type (EltNum x 17*9880d681SAndroid Build Coastguard Worker// EltVT). These are things like the register class for the writemask, etc. 18*9880d681SAndroid Build Coastguard Worker// The idea is to pass one of these as the template argument rather than the 19*9880d681SAndroid Build Coastguard Worker// individual arguments. 20*9880d681SAndroid Build Coastguard Worker// The template is also used for scalar types, in this case numelts is 1. 21*9880d681SAndroid Build Coastguard Workerclass X86VectorVTInfo<int numelts, ValueType eltvt, RegisterClass rc, 22*9880d681SAndroid Build Coastguard Worker string suffix = ""> { 23*9880d681SAndroid Build Coastguard Worker RegisterClass RC = rc; 24*9880d681SAndroid Build Coastguard Worker ValueType EltVT = eltvt; 25*9880d681SAndroid Build Coastguard Worker int NumElts = numelts; 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker // Corresponding mask register class. 28*9880d681SAndroid Build Coastguard Worker RegisterClass KRC = !cast<RegisterClass>("VK" # NumElts); 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker // Corresponding write-mask register class. 31*9880d681SAndroid Build Coastguard Worker RegisterClass KRCWM = !cast<RegisterClass>("VK" # NumElts # "WM"); 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker // The mask VT. 34*9880d681SAndroid Build Coastguard Worker ValueType KVT = !cast<ValueType>(!if (!eq (NumElts, 1), "i1", 35*9880d681SAndroid Build Coastguard Worker "v" # NumElts # "i1")); 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker // The GPR register class that can hold the write mask. Use GR8 for fewer 38*9880d681SAndroid Build Coastguard Worker // than 8 elements. Use shift-right and equal to work around the lack of 39*9880d681SAndroid Build Coastguard Worker // !lt in tablegen. 40*9880d681SAndroid Build Coastguard Worker RegisterClass MRC = 41*9880d681SAndroid Build Coastguard Worker !cast<RegisterClass>("GR" # 42*9880d681SAndroid Build Coastguard Worker !if (!eq (!srl(NumElts, 3), 0), 8, NumElts)); 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker // Suffix used in the instruction mnemonic. 45*9880d681SAndroid Build Coastguard Worker string Suffix = suffix; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker // VTName is a string name for vector VT. For vector types it will be 48*9880d681SAndroid Build Coastguard Worker // v # NumElts # EltVT, so for vector of 8 elements of i32 it will be v8i32 49*9880d681SAndroid Build Coastguard Worker // It is a little bit complex for scalar types, where NumElts = 1. 50*9880d681SAndroid Build Coastguard Worker // In this case we build v4f32 or v2f64 51*9880d681SAndroid Build Coastguard Worker string VTName = "v" # !if (!eq (NumElts, 1), 52*9880d681SAndroid Build Coastguard Worker !if (!eq (EltVT.Size, 32), 4, 53*9880d681SAndroid Build Coastguard Worker !if (!eq (EltVT.Size, 64), 2, NumElts)), NumElts) # EltVT; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker // The vector VT. 56*9880d681SAndroid Build Coastguard Worker ValueType VT = !cast<ValueType>(VTName); 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker string EltTypeName = !cast<string>(EltVT); 59*9880d681SAndroid Build Coastguard Worker // Size of the element type in bits, e.g. 32 for v16i32. 60*9880d681SAndroid Build Coastguard Worker string EltSizeName = !subst("i", "", !subst("f", "", EltTypeName)); 61*9880d681SAndroid Build Coastguard Worker int EltSize = EltVT.Size; 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker // "i" for integer types and "f" for floating-point types 64*9880d681SAndroid Build Coastguard Worker string TypeVariantName = !subst(EltSizeName, "", EltTypeName); 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker // Size of RC in bits, e.g. 512 for VR512. 67*9880d681SAndroid Build Coastguard Worker int Size = VT.Size; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker // The corresponding memory operand, e.g. i512mem for VR512. 70*9880d681SAndroid Build Coastguard Worker X86MemOperand MemOp = !cast<X86MemOperand>(TypeVariantName # Size # "mem"); 71*9880d681SAndroid Build Coastguard Worker X86MemOperand ScalarMemOp = !cast<X86MemOperand>(EltVT # "mem"); 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker // Load patterns 74*9880d681SAndroid Build Coastguard Worker // Note: For 128/256-bit integer VT we choose loadv2i64/loadv4i64 75*9880d681SAndroid Build Coastguard Worker // due to load promotion during legalization 76*9880d681SAndroid Build Coastguard Worker PatFrag LdFrag = !cast<PatFrag>("load" # 77*9880d681SAndroid Build Coastguard Worker !if (!eq (TypeVariantName, "i"), 78*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 128), "v2i64", 79*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 256), "v4i64", 80*9880d681SAndroid Build Coastguard Worker VTName)), VTName)); 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker PatFrag AlignedLdFrag = !cast<PatFrag>("alignedload" # 83*9880d681SAndroid Build Coastguard Worker !if (!eq (TypeVariantName, "i"), 84*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 128), "v2i64", 85*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 256), "v4i64", 86*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 512), 87*9880d681SAndroid Build Coastguard Worker !if (!eq (EltSize, 64), "v8i64", "v16i32"), 88*9880d681SAndroid Build Coastguard Worker VTName))), VTName)); 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker PatFrag ScalarLdFrag = !cast<PatFrag>("load" # EltVT); 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker // The corresponding float type, e.g. v16f32 for v16i32 93*9880d681SAndroid Build Coastguard Worker // Note: For EltSize < 32, FloatVT is illegal and TableGen 94*9880d681SAndroid Build Coastguard Worker // fails to compile, so we choose FloatVT = VT 95*9880d681SAndroid Build Coastguard Worker ValueType FloatVT = !cast<ValueType>( 96*9880d681SAndroid Build Coastguard Worker !if (!eq (!srl(EltSize,5),0), 97*9880d681SAndroid Build Coastguard Worker VTName, 98*9880d681SAndroid Build Coastguard Worker !if (!eq(TypeVariantName, "i"), 99*9880d681SAndroid Build Coastguard Worker "v" # NumElts # "f" # EltSize, 100*9880d681SAndroid Build Coastguard Worker VTName))); 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker ValueType IntVT = !cast<ValueType>( 103*9880d681SAndroid Build Coastguard Worker !if (!eq (!srl(EltSize,5),0), 104*9880d681SAndroid Build Coastguard Worker VTName, 105*9880d681SAndroid Build Coastguard Worker !if (!eq(TypeVariantName, "f"), 106*9880d681SAndroid Build Coastguard Worker "v" # NumElts # "i" # EltSize, 107*9880d681SAndroid Build Coastguard Worker VTName))); 108*9880d681SAndroid Build Coastguard Worker // The string to specify embedded broadcast in assembly. 109*9880d681SAndroid Build Coastguard Worker string BroadcastStr = "{1to" # NumElts # "}"; 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker // 8-bit compressed displacement tuple/subvector format. This is only 112*9880d681SAndroid Build Coastguard Worker // defined for NumElts <= 8. 113*9880d681SAndroid Build Coastguard Worker CD8VForm CD8TupleForm = !if (!eq (!srl(NumElts, 4), 0), 114*9880d681SAndroid Build Coastguard Worker !cast<CD8VForm>("CD8VT" # NumElts), ?); 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker SubRegIndex SubRegIdx = !if (!eq (Size, 128), sub_xmm, 117*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 256), sub_ymm, ?)); 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker Domain ExeDomain = !if (!eq (EltTypeName, "f32"), SSEPackedSingle, 120*9880d681SAndroid Build Coastguard Worker !if (!eq (EltTypeName, "f64"), SSEPackedDouble, 121*9880d681SAndroid Build Coastguard Worker SSEPackedInt)); 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker RegisterClass FRC = !if (!eq (EltTypeName, "f32"), FR32X, FR64X); 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker // A vector type of the same width with element type i32. This is used to 126*9880d681SAndroid Build Coastguard Worker // create the canonical constant zero node ImmAllZerosV. 127*9880d681SAndroid Build Coastguard Worker ValueType i32VT = !cast<ValueType>("v" # !srl(Size, 5) # "i32"); 128*9880d681SAndroid Build Coastguard Worker dag ImmAllZerosV = (VT (bitconvert (i32VT immAllZerosV))); 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker string ZSuffix = !if (!eq (Size, 128), "Z128", 131*9880d681SAndroid Build Coastguard Worker !if (!eq (Size, 256), "Z256", "Z")); 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdef v64i8_info : X86VectorVTInfo<64, i8, VR512, "b">; 135*9880d681SAndroid Build Coastguard Workerdef v32i16_info : X86VectorVTInfo<32, i16, VR512, "w">; 136*9880d681SAndroid Build Coastguard Workerdef v16i32_info : X86VectorVTInfo<16, i32, VR512, "d">; 137*9880d681SAndroid Build Coastguard Workerdef v8i64_info : X86VectorVTInfo<8, i64, VR512, "q">; 138*9880d681SAndroid Build Coastguard Workerdef v16f32_info : X86VectorVTInfo<16, f32, VR512, "ps">; 139*9880d681SAndroid Build Coastguard Workerdef v8f64_info : X86VectorVTInfo<8, f64, VR512, "pd">; 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker// "x" in v32i8x_info means RC = VR256X 142*9880d681SAndroid Build Coastguard Workerdef v32i8x_info : X86VectorVTInfo<32, i8, VR256X, "b">; 143*9880d681SAndroid Build Coastguard Workerdef v16i16x_info : X86VectorVTInfo<16, i16, VR256X, "w">; 144*9880d681SAndroid Build Coastguard Workerdef v8i32x_info : X86VectorVTInfo<8, i32, VR256X, "d">; 145*9880d681SAndroid Build Coastguard Workerdef v4i64x_info : X86VectorVTInfo<4, i64, VR256X, "q">; 146*9880d681SAndroid Build Coastguard Workerdef v8f32x_info : X86VectorVTInfo<8, f32, VR256X, "ps">; 147*9880d681SAndroid Build Coastguard Workerdef v4f64x_info : X86VectorVTInfo<4, f64, VR256X, "pd">; 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdef v16i8x_info : X86VectorVTInfo<16, i8, VR128X, "b">; 150*9880d681SAndroid Build Coastguard Workerdef v8i16x_info : X86VectorVTInfo<8, i16, VR128X, "w">; 151*9880d681SAndroid Build Coastguard Workerdef v4i32x_info : X86VectorVTInfo<4, i32, VR128X, "d">; 152*9880d681SAndroid Build Coastguard Workerdef v2i64x_info : X86VectorVTInfo<2, i64, VR128X, "q">; 153*9880d681SAndroid Build Coastguard Workerdef v4f32x_info : X86VectorVTInfo<4, f32, VR128X, "ps">; 154*9880d681SAndroid Build Coastguard Workerdef v2f64x_info : X86VectorVTInfo<2, f64, VR128X, "pd">; 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker// We map scalar types to the smallest (128-bit) vector type 157*9880d681SAndroid Build Coastguard Worker// with the appropriate element type. This allows to use the same masking logic. 158*9880d681SAndroid Build Coastguard Workerdef i32x_info : X86VectorVTInfo<1, i32, GR32, "si">; 159*9880d681SAndroid Build Coastguard Workerdef i64x_info : X86VectorVTInfo<1, i64, GR64, "sq">; 160*9880d681SAndroid Build Coastguard Workerdef f32x_info : X86VectorVTInfo<1, f32, VR128X, "ss">; 161*9880d681SAndroid Build Coastguard Workerdef f64x_info : X86VectorVTInfo<1, f64, VR128X, "sd">; 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerclass AVX512VLVectorVTInfo<X86VectorVTInfo i512, X86VectorVTInfo i256, 164*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo i128> { 165*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo info512 = i512; 166*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo info256 = i256; 167*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo info128 = i128; 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdef avx512vl_i8_info : AVX512VLVectorVTInfo<v64i8_info, v32i8x_info, 171*9880d681SAndroid Build Coastguard Worker v16i8x_info>; 172*9880d681SAndroid Build Coastguard Workerdef avx512vl_i16_info : AVX512VLVectorVTInfo<v32i16_info, v16i16x_info, 173*9880d681SAndroid Build Coastguard Worker v8i16x_info>; 174*9880d681SAndroid Build Coastguard Workerdef avx512vl_i32_info : AVX512VLVectorVTInfo<v16i32_info, v8i32x_info, 175*9880d681SAndroid Build Coastguard Worker v4i32x_info>; 176*9880d681SAndroid Build Coastguard Workerdef avx512vl_i64_info : AVX512VLVectorVTInfo<v8i64_info, v4i64x_info, 177*9880d681SAndroid Build Coastguard Worker v2i64x_info>; 178*9880d681SAndroid Build Coastguard Workerdef avx512vl_f32_info : AVX512VLVectorVTInfo<v16f32_info, v8f32x_info, 179*9880d681SAndroid Build Coastguard Worker v4f32x_info>; 180*9880d681SAndroid Build Coastguard Workerdef avx512vl_f64_info : AVX512VLVectorVTInfo<v8f64_info, v4f64x_info, 181*9880d681SAndroid Build Coastguard Worker v2f64x_info>; 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker// This multiclass generates the masking variants from the non-masking 184*9880d681SAndroid Build Coastguard Worker// variant. It only provides the assembly pieces for the masking variants. 185*9880d681SAndroid Build Coastguard Worker// It assumes custom ISel patterns for masking which can be provided as 186*9880d681SAndroid Build Coastguard Worker// template arguments. 187*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_custom<bits<8> O, Format F, 188*9880d681SAndroid Build Coastguard Worker dag Outs, 189*9880d681SAndroid Build Coastguard Worker dag Ins, dag MaskingIns, dag ZeroMaskingIns, 190*9880d681SAndroid Build Coastguard Worker string OpcodeStr, 191*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 192*9880d681SAndroid Build Coastguard Worker list<dag> Pattern, 193*9880d681SAndroid Build Coastguard Worker list<dag> MaskingPattern, 194*9880d681SAndroid Build Coastguard Worker list<dag> ZeroMaskingPattern, 195*9880d681SAndroid Build Coastguard Worker string MaskingConstraint = "", 196*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary, 197*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 198*9880d681SAndroid Build Coastguard Worker let isCommutable = IsCommutable in 199*9880d681SAndroid Build Coastguard Worker def NAME: AVX512<O, F, Outs, Ins, 200*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{"#AttSrcAsm#", $dst|"# 201*9880d681SAndroid Build Coastguard Worker "$dst, "#IntelSrcAsm#"}", 202*9880d681SAndroid Build Coastguard Worker Pattern, itin>; 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker // Prefer over VMOV*rrk Pat<> 205*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 20 in 206*9880d681SAndroid Build Coastguard Worker def NAME#k: AVX512<O, F, Outs, MaskingIns, 207*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{"#AttSrcAsm#", $dst {${mask}}|"# 208*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, "#IntelSrcAsm#"}", 209*9880d681SAndroid Build Coastguard Worker MaskingPattern, itin>, 210*9880d681SAndroid Build Coastguard Worker EVEX_K { 211*9880d681SAndroid Build Coastguard Worker // In case of the 3src subclass this is overridden with a let. 212*9880d681SAndroid Build Coastguard Worker string Constraints = MaskingConstraint; 213*9880d681SAndroid Build Coastguard Worker } 214*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 30 in // Prefer over VMOV*rrkz Pat<> 215*9880d681SAndroid Build Coastguard Worker def NAME#kz: AVX512<O, F, Outs, ZeroMaskingIns, 216*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{"#AttSrcAsm#", $dst {${mask}} {z}|"# 217*9880d681SAndroid Build Coastguard Worker "$dst {${mask}} {z}, "#IntelSrcAsm#"}", 218*9880d681SAndroid Build Coastguard Worker ZeroMaskingPattern, 219*9880d681SAndroid Build Coastguard Worker itin>, 220*9880d681SAndroid Build Coastguard Worker EVEX_KZ; 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker// Common base class of AVX512_maskable and AVX512_maskable_3src. 225*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_common<bits<8> O, Format F, X86VectorVTInfo _, 226*9880d681SAndroid Build Coastguard Worker dag Outs, 227*9880d681SAndroid Build Coastguard Worker dag Ins, dag MaskingIns, dag ZeroMaskingIns, 228*9880d681SAndroid Build Coastguard Worker string OpcodeStr, 229*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 230*9880d681SAndroid Build Coastguard Worker dag RHS, dag MaskingRHS, 231*9880d681SAndroid Build Coastguard Worker SDNode Select = vselect, 232*9880d681SAndroid Build Coastguard Worker string MaskingConstraint = "", 233*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary, 234*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> : 235*9880d681SAndroid Build Coastguard Worker AVX512_maskable_custom<O, F, Outs, Ins, MaskingIns, ZeroMaskingIns, OpcodeStr, 236*9880d681SAndroid Build Coastguard Worker AttSrcAsm, IntelSrcAsm, 237*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, RHS)], 238*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, MaskingRHS)], 239*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, 240*9880d681SAndroid Build Coastguard Worker (Select _.KRCWM:$mask, RHS, _.ImmAllZerosV))], 241*9880d681SAndroid Build Coastguard Worker MaskingConstraint, NoItinerary, IsCommutable>; 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker// This multiclass generates the unconditional/non-masking, the masking and 244*9880d681SAndroid Build Coastguard Worker// the zero-masking variant of the vector instruction. In the masking case, the 245*9880d681SAndroid Build Coastguard Worker// perserved vector elements come from a new dummy input operand tied to $dst. 246*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable<bits<8> O, Format F, X86VectorVTInfo _, 247*9880d681SAndroid Build Coastguard Worker dag Outs, dag Ins, string OpcodeStr, 248*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 249*9880d681SAndroid Build Coastguard Worker dag RHS, 250*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary, 251*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0, SDNode Select = vselect> : 252*9880d681SAndroid Build Coastguard Worker AVX512_maskable_common<O, F, _, Outs, Ins, 253*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src0, _.KRCWM:$mask), Ins), 254*9880d681SAndroid Build Coastguard Worker !con((ins _.KRCWM:$mask), Ins), 255*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, 256*9880d681SAndroid Build Coastguard Worker (Select _.KRCWM:$mask, RHS, _.RC:$src0), Select, 257*9880d681SAndroid Build Coastguard Worker "$src0 = $dst", itin, IsCommutable>; 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker// This multiclass generates the unconditional/non-masking, the masking and 260*9880d681SAndroid Build Coastguard Worker// the zero-masking variant of the scalar instruction. 261*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_scalar<bits<8> O, Format F, X86VectorVTInfo _, 262*9880d681SAndroid Build Coastguard Worker dag Outs, dag Ins, string OpcodeStr, 263*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 264*9880d681SAndroid Build Coastguard Worker dag RHS, 265*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary, 266*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> : 267*9880d681SAndroid Build Coastguard Worker AVX512_maskable_common<O, F, _, Outs, Ins, 268*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src0, _.KRCWM:$mask), Ins), 269*9880d681SAndroid Build Coastguard Worker !con((ins _.KRCWM:$mask), Ins), 270*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, 271*9880d681SAndroid Build Coastguard Worker (X86selects _.KRCWM:$mask, RHS, _.RC:$src0), 272*9880d681SAndroid Build Coastguard Worker X86selects, "$src0 = $dst", itin, IsCommutable>; 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker// Similar to AVX512_maskable but in this case one of the source operands 275*9880d681SAndroid Build Coastguard Worker// ($src1) is already tied to $dst so we just use that for the preserved 276*9880d681SAndroid Build Coastguard Worker// vector elements. NOTE that the NonTiedIns (the ins dag) should exclude 277*9880d681SAndroid Build Coastguard Worker// $src1. 278*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_3src<bits<8> O, Format F, X86VectorVTInfo _, 279*9880d681SAndroid Build Coastguard Worker dag Outs, dag NonTiedIns, string OpcodeStr, 280*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 281*9880d681SAndroid Build Coastguard Worker dag RHS> : 282*9880d681SAndroid Build Coastguard Worker AVX512_maskable_common<O, F, _, Outs, 283*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src1), NonTiedIns), 284*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src1, _.KRCWM:$mask), NonTiedIns), 285*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src1, _.KRCWM:$mask), NonTiedIns), 286*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, 287*9880d681SAndroid Build Coastguard Worker (vselect _.KRCWM:$mask, RHS, _.RC:$src1)>; 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Worker// Similar to AVX512_maskable_3rc but in this case the input VT for the tied 290*9880d681SAndroid Build Coastguard Worker// operand differs from the output VT. This requires a bitconvert on 291*9880d681SAndroid Build Coastguard Worker// the preserved vector going into the vselect. 292*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_3src_cast<bits<8> O, Format F, X86VectorVTInfo OutVT, 293*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo InVT, 294*9880d681SAndroid Build Coastguard Worker dag Outs, dag NonTiedIns, string OpcodeStr, 295*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 296*9880d681SAndroid Build Coastguard Worker dag RHS> : 297*9880d681SAndroid Build Coastguard Worker AVX512_maskable_common<O, F, OutVT, Outs, 298*9880d681SAndroid Build Coastguard Worker !con((ins InVT.RC:$src1), NonTiedIns), 299*9880d681SAndroid Build Coastguard Worker !con((ins InVT.RC:$src1, InVT.KRCWM:$mask), NonTiedIns), 300*9880d681SAndroid Build Coastguard Worker !con((ins InVT.RC:$src1, InVT.KRCWM:$mask), NonTiedIns), 301*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, 302*9880d681SAndroid Build Coastguard Worker (vselect InVT.KRCWM:$mask, RHS, 303*9880d681SAndroid Build Coastguard Worker (bitconvert InVT.RC:$src1))>; 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_3src_scalar<bits<8> O, Format F, X86VectorVTInfo _, 306*9880d681SAndroid Build Coastguard Worker dag Outs, dag NonTiedIns, string OpcodeStr, 307*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 308*9880d681SAndroid Build Coastguard Worker dag RHS> : 309*9880d681SAndroid Build Coastguard Worker AVX512_maskable_common<O, F, _, Outs, 310*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src1), NonTiedIns), 311*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src1, _.KRCWM:$mask), NonTiedIns), 312*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src1, _.KRCWM:$mask), NonTiedIns), 313*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, 314*9880d681SAndroid Build Coastguard Worker (X86selects _.KRCWM:$mask, RHS, _.RC:$src1), 315*9880d681SAndroid Build Coastguard Worker X86selects>; 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_in_asm<bits<8> O, Format F, X86VectorVTInfo _, 318*9880d681SAndroid Build Coastguard Worker dag Outs, dag Ins, 319*9880d681SAndroid Build Coastguard Worker string OpcodeStr, 320*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 321*9880d681SAndroid Build Coastguard Worker list<dag> Pattern> : 322*9880d681SAndroid Build Coastguard Worker AVX512_maskable_custom<O, F, Outs, Ins, 323*9880d681SAndroid Build Coastguard Worker !con((ins _.RC:$src0, _.KRCWM:$mask), Ins), 324*9880d681SAndroid Build Coastguard Worker !con((ins _.KRCWM:$mask), Ins), 325*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, Pattern, [], [], 326*9880d681SAndroid Build Coastguard Worker "$src0 = $dst">; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker// Instruction with mask that puts result in mask register, 330*9880d681SAndroid Build Coastguard Worker// like "compare" and "vptest" 331*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_custom_cmp<bits<8> O, Format F, 332*9880d681SAndroid Build Coastguard Worker dag Outs, 333*9880d681SAndroid Build Coastguard Worker dag Ins, dag MaskingIns, 334*9880d681SAndroid Build Coastguard Worker string OpcodeStr, 335*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 336*9880d681SAndroid Build Coastguard Worker list<dag> Pattern, 337*9880d681SAndroid Build Coastguard Worker list<dag> MaskingPattern> { 338*9880d681SAndroid Build Coastguard Worker def NAME: AVX512<O, F, Outs, Ins, 339*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{"#AttSrcAsm#", $dst|"# 340*9880d681SAndroid Build Coastguard Worker "$dst, "#IntelSrcAsm#"}", 341*9880d681SAndroid Build Coastguard Worker Pattern, NoItinerary>; 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker def NAME#k: AVX512<O, F, Outs, MaskingIns, 344*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{"#AttSrcAsm#", $dst {${mask}}|"# 345*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, "#IntelSrcAsm#"}", 346*9880d681SAndroid Build Coastguard Worker MaskingPattern, NoItinerary>, EVEX_K; 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_common_cmp<bits<8> O, Format F, X86VectorVTInfo _, 350*9880d681SAndroid Build Coastguard Worker dag Outs, 351*9880d681SAndroid Build Coastguard Worker dag Ins, dag MaskingIns, 352*9880d681SAndroid Build Coastguard Worker string OpcodeStr, 353*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 354*9880d681SAndroid Build Coastguard Worker dag RHS, dag MaskingRHS> : 355*9880d681SAndroid Build Coastguard Worker AVX512_maskable_custom_cmp<O, F, Outs, Ins, MaskingIns, OpcodeStr, 356*9880d681SAndroid Build Coastguard Worker AttSrcAsm, IntelSrcAsm, 357*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, RHS)], 358*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, MaskingRHS)]>; 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_cmp<bits<8> O, Format F, X86VectorVTInfo _, 361*9880d681SAndroid Build Coastguard Worker dag Outs, dag Ins, string OpcodeStr, 362*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm, 363*9880d681SAndroid Build Coastguard Worker dag RHS> : 364*9880d681SAndroid Build Coastguard Worker AVX512_maskable_common_cmp<O, F, _, Outs, Ins, 365*9880d681SAndroid Build Coastguard Worker !con((ins _.KRCWM:$mask), Ins), 366*9880d681SAndroid Build Coastguard Worker OpcodeStr, AttSrcAsm, IntelSrcAsm, RHS, 367*9880d681SAndroid Build Coastguard Worker (and _.KRCWM:$mask, RHS)>; 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workermulticlass AVX512_maskable_cmp_alt<bits<8> O, Format F, X86VectorVTInfo _, 370*9880d681SAndroid Build Coastguard Worker dag Outs, dag Ins, string OpcodeStr, 371*9880d681SAndroid Build Coastguard Worker string AttSrcAsm, string IntelSrcAsm> : 372*9880d681SAndroid Build Coastguard Worker AVX512_maskable_custom_cmp<O, F, Outs, 373*9880d681SAndroid Build Coastguard Worker Ins, !con((ins _.KRCWM:$mask),Ins), OpcodeStr, 374*9880d681SAndroid Build Coastguard Worker AttSrcAsm, IntelSrcAsm, [],[]>; 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Worker// Bitcasts between 512-bit vector types. Return the original type since 377*9880d681SAndroid Build Coastguard Worker// no instruction is needed for the conversion. 378*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (bitconvert (v8i64 VR512:$src))), (v8f64 VR512:$src)>; 379*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (bitconvert (v16i32 VR512:$src))), (v8f64 VR512:$src)>; 380*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (bitconvert (v32i16 VR512:$src))), (v8f64 VR512:$src)>; 381*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (bitconvert (v64i8 VR512:$src))), (v8f64 VR512:$src)>; 382*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (bitconvert (v16f32 VR512:$src))), (v8f64 VR512:$src)>; 383*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (bitconvert (v8i64 VR512:$src))), (v16f32 VR512:$src)>; 384*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (bitconvert (v16i32 VR512:$src))), (v16f32 VR512:$src)>; 385*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (bitconvert (v32i16 VR512:$src))), (v16f32 VR512:$src)>; 386*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (bitconvert (v64i8 VR512:$src))), (v16f32 VR512:$src)>; 387*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (bitconvert (v8f64 VR512:$src))), (v16f32 VR512:$src)>; 388*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (bitconvert (v16i32 VR512:$src))), (v8i64 VR512:$src)>; 389*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (bitconvert (v32i16 VR512:$src))), (v8i64 VR512:$src)>; 390*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (bitconvert (v64i8 VR512:$src))), (v8i64 VR512:$src)>; 391*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (bitconvert (v8f64 VR512:$src))), (v8i64 VR512:$src)>; 392*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (bitconvert (v16f32 VR512:$src))), (v8i64 VR512:$src)>; 393*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (bitconvert (v8i64 VR512:$src))), (v16i32 VR512:$src)>; 394*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (bitconvert (v16f32 VR512:$src))), (v16i32 VR512:$src)>; 395*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (bitconvert (v32i16 VR512:$src))), (v16i32 VR512:$src)>; 396*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (bitconvert (v64i8 VR512:$src))), (v16i32 VR512:$src)>; 397*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (bitconvert (v8f64 VR512:$src))), (v16i32 VR512:$src)>; 398*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (bitconvert (v8i64 VR512:$src))), (v32i16 VR512:$src)>; 399*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (bitconvert (v16i32 VR512:$src))), (v32i16 VR512:$src)>; 400*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (bitconvert (v64i8 VR512:$src))), (v32i16 VR512:$src)>; 401*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (bitconvert (v8f64 VR512:$src))), (v32i16 VR512:$src)>; 402*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (bitconvert (v16f32 VR512:$src))), (v32i16 VR512:$src)>; 403*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (bitconvert (v16f32 VR512:$src))), (v32i16 VR512:$src)>; 404*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (bitconvert (v8i64 VR512:$src))), (v64i8 VR512:$src)>; 405*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (bitconvert (v16i32 VR512:$src))), (v64i8 VR512:$src)>; 406*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (bitconvert (v32i16 VR512:$src))), (v64i8 VR512:$src)>; 407*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (bitconvert (v8f64 VR512:$src))), (v64i8 VR512:$src)>; 408*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (bitconvert (v16f32 VR512:$src))), (v64i8 VR512:$src)>; 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker// Alias instruction that maps zero vector to pxor / xorp* for AVX-512. 411*9880d681SAndroid Build Coastguard Worker// This is expanded by ExpandPostRAPseudos to an xorps / vxorps, and then 412*9880d681SAndroid Build Coastguard Worker// swizzled by ExecutionDepsFix to pxor. 413*9880d681SAndroid Build Coastguard Worker// We set canFoldAsLoad because this can be converted to a constant-pool 414*9880d681SAndroid Build Coastguard Worker// load of an all-zeros value if folding it would be beneficial. 415*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1, 416*9880d681SAndroid Build Coastguard Worker isPseudo = 1, Predicates = [HasAVX512], SchedRW = [WriteZero] in { 417*9880d681SAndroid Build Coastguard Workerdef AVX512_512_SET0 : I<0, Pseudo, (outs VR512:$dst), (ins), "", 418*9880d681SAndroid Build Coastguard Worker [(set VR512:$dst, (v16i32 immAllZerosV))]>; 419*9880d681SAndroid Build Coastguard Workerdef AVX512_512_SETALLONES : I<0, Pseudo, (outs VR512:$dst), (ins), "", 420*9880d681SAndroid Build Coastguard Worker [(set VR512:$dst, (v16i32 immAllOnesV))]>; 421*9880d681SAndroid Build Coastguard Worker} 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1, 424*9880d681SAndroid Build Coastguard Worker isPseudo = 1, Predicates = [HasVLX], SchedRW = [WriteZero] in { 425*9880d681SAndroid Build Coastguard Workerdef AVX512_128_SET0 : I<0, Pseudo, (outs VR128X:$dst), (ins), "", 426*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (v4i32 immAllZerosV))]>; 427*9880d681SAndroid Build Coastguard Workerdef AVX512_256_SET0 : I<0, Pseudo, (outs VR256X:$dst), (ins), "", 428*9880d681SAndroid Build Coastguard Worker [(set VR256X:$dst, (v8i32 immAllZerosV))]>; 429*9880d681SAndroid Build Coastguard Worker} 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 432*9880d681SAndroid Build Coastguard Worker// AVX-512 - VECTOR INSERT 433*9880d681SAndroid Build Coastguard Worker// 434*9880d681SAndroid Build Coastguard Workermulticlass vinsert_for_size<int Opcode, X86VectorVTInfo From, X86VectorVTInfo To, 435*9880d681SAndroid Build Coastguard Worker PatFrag vinsert_insert> { 436*9880d681SAndroid Build Coastguard Worker let ExeDomain = To.ExeDomain in { 437*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<Opcode, MRMSrcReg, To, (outs To.RC:$dst), 438*9880d681SAndroid Build Coastguard Worker (ins To.RC:$src1, From.RC:$src2, i32u8imm:$src3), 439*9880d681SAndroid Build Coastguard Worker "vinsert" # From.EltTypeName # "x" # From.NumElts, 440*9880d681SAndroid Build Coastguard Worker "$src3, $src2, $src1", "$src1, $src2, $src3", 441*9880d681SAndroid Build Coastguard Worker (vinsert_insert:$src3 (To.VT To.RC:$src1), 442*9880d681SAndroid Build Coastguard Worker (From.VT From.RC:$src2), 443*9880d681SAndroid Build Coastguard Worker (iPTR imm))>, AVX512AIi8Base, EVEX_4V; 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<Opcode, MRMSrcMem, To, (outs To.RC:$dst), 446*9880d681SAndroid Build Coastguard Worker (ins To.RC:$src1, From.MemOp:$src2, i32u8imm:$src3), 447*9880d681SAndroid Build Coastguard Worker "vinsert" # From.EltTypeName # "x" # From.NumElts, 448*9880d681SAndroid Build Coastguard Worker "$src3, $src2, $src1", "$src1, $src2, $src3", 449*9880d681SAndroid Build Coastguard Worker (vinsert_insert:$src3 (To.VT To.RC:$src1), 450*9880d681SAndroid Build Coastguard Worker (From.VT (bitconvert (From.LdFrag addr:$src2))), 451*9880d681SAndroid Build Coastguard Worker (iPTR imm))>, AVX512AIi8Base, EVEX_4V, 452*9880d681SAndroid Build Coastguard Worker EVEX_CD8<From.EltSize, From.CD8TupleForm>; 453*9880d681SAndroid Build Coastguard Worker } 454*9880d681SAndroid Build Coastguard Worker} 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workermulticlass vinsert_for_size_lowering<string InstrStr, X86VectorVTInfo From, 457*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo To, PatFrag vinsert_insert, 458*9880d681SAndroid Build Coastguard Worker SDNodeXForm INSERT_get_vinsert_imm , list<Predicate> p> { 459*9880d681SAndroid Build Coastguard Worker let Predicates = p in { 460*9880d681SAndroid Build Coastguard Worker def : Pat<(vinsert_insert:$ins 461*9880d681SAndroid Build Coastguard Worker (To.VT To.RC:$src1), (From.VT From.RC:$src2), (iPTR imm)), 462*9880d681SAndroid Build Coastguard Worker (To.VT (!cast<Instruction>(InstrStr#"rr") 463*9880d681SAndroid Build Coastguard Worker To.RC:$src1, From.RC:$src2, 464*9880d681SAndroid Build Coastguard Worker (INSERT_get_vinsert_imm To.RC:$ins)))>; 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Worker def : Pat<(vinsert_insert:$ins 467*9880d681SAndroid Build Coastguard Worker (To.VT To.RC:$src1), 468*9880d681SAndroid Build Coastguard Worker (From.VT (bitconvert (From.LdFrag addr:$src2))), 469*9880d681SAndroid Build Coastguard Worker (iPTR imm)), 470*9880d681SAndroid Build Coastguard Worker (To.VT (!cast<Instruction>(InstrStr#"rm") 471*9880d681SAndroid Build Coastguard Worker To.RC:$src1, addr:$src2, 472*9880d681SAndroid Build Coastguard Worker (INSERT_get_vinsert_imm To.RC:$ins)))>; 473*9880d681SAndroid Build Coastguard Worker } 474*9880d681SAndroid Build Coastguard Worker} 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Workermulticlass vinsert_for_type<ValueType EltVT32, int Opcode128, 477*9880d681SAndroid Build Coastguard Worker ValueType EltVT64, int Opcode256> { 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in 480*9880d681SAndroid Build Coastguard Worker defm NAME # "32x4Z256" : vinsert_for_size<Opcode128, 481*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT32, VR128X>, 482*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT32, VR256X>, 483*9880d681SAndroid Build Coastguard Worker vinsert128_insert>, EVEX_V256; 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker defm NAME # "32x4Z" : vinsert_for_size<Opcode128, 486*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT32, VR128X>, 487*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo<16, EltVT32, VR512>, 488*9880d681SAndroid Build Coastguard Worker vinsert128_insert>, EVEX_V512; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker defm NAME # "64x4Z" : vinsert_for_size<Opcode256, 491*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT64, VR256X>, 492*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT64, VR512>, 493*9880d681SAndroid Build Coastguard Worker vinsert256_insert>, VEX_W, EVEX_V512; 494*9880d681SAndroid Build Coastguard Worker 495*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasDQI] in 496*9880d681SAndroid Build Coastguard Worker defm NAME # "64x2Z256" : vinsert_for_size<Opcode128, 497*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 2, EltVT64, VR128X>, 498*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT64, VR256X>, 499*9880d681SAndroid Build Coastguard Worker vinsert128_insert>, VEX_W, EVEX_V256; 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 502*9880d681SAndroid Build Coastguard Worker defm NAME # "64x2Z" : vinsert_for_size<Opcode128, 503*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 2, EltVT64, VR128X>, 504*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT64, VR512>, 505*9880d681SAndroid Build Coastguard Worker vinsert128_insert>, VEX_W, EVEX_V512; 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Worker defm NAME # "32x8Z" : vinsert_for_size<Opcode256, 508*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT32, VR256X>, 509*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo<16, EltVT32, VR512>, 510*9880d681SAndroid Build Coastguard Worker vinsert256_insert>, EVEX_V512; 511*9880d681SAndroid Build Coastguard Worker } 512*9880d681SAndroid Build Coastguard Worker} 513*9880d681SAndroid Build Coastguard Worker 514*9880d681SAndroid Build Coastguard Workerdefm VINSERTF : vinsert_for_type<f32, 0x18, f64, 0x1a>; 515*9880d681SAndroid Build Coastguard Workerdefm VINSERTI : vinsert_for_type<i32, 0x38, i64, 0x3a>; 516*9880d681SAndroid Build Coastguard Worker 517*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types, 518*9880d681SAndroid Build Coastguard Worker// Only add this if 64x2 and its friends are not supported natively via AVX512DQ. 519*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTF32x4Z256", v2f64x_info, v4f64x_info, 520*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasVLX, NoDQI]>; 521*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI32x4Z256", v2i64x_info, v4i64x_info, 522*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasVLX, NoDQI]>; 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTF32x4Z", v2f64x_info, v8f64_info, 525*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512, NoDQI]>; 526*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI32x4Z", v2i64x_info, v8i64_info, 527*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512, NoDQI]>; 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTF64x4Z", v8f32x_info, v16f32_info, 530*9880d681SAndroid Build Coastguard Worker vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512, NoDQI]>; 531*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI64x4Z", v8i32x_info, v16i32_info, 532*9880d681SAndroid Build Coastguard Worker vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512, NoDQI]>; 533*9880d681SAndroid Build Coastguard Worker 534*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types insert VEC128 into VEC256 535*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI32x4Z256", v8i16x_info, v16i16x_info, 536*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasVLX]>; 537*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI32x4Z256", v16i8x_info, v32i8x_info, 538*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasVLX]>; 539*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types insert VEC128 into VEC512 540*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI32x4Z", v8i16x_info, v32i16_info, 541*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512]>; 542*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI32x4Z", v16i8x_info, v64i8_info, 543*9880d681SAndroid Build Coastguard Worker vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512]>; 544*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types insert VEC256 into VEC512 545*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI64x4Z", v16i16x_info, v32i16_info, 546*9880d681SAndroid Build Coastguard Worker vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512]>; 547*9880d681SAndroid Build Coastguard Workerdefm : vinsert_for_size_lowering<"VINSERTI64x4Z", v32i8x_info, v64i8_info, 548*9880d681SAndroid Build Coastguard Worker vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512]>; 549*9880d681SAndroid Build Coastguard Worker 550*9880d681SAndroid Build Coastguard Worker// vinsertps - insert f32 to XMM 551*9880d681SAndroid Build Coastguard Workerdef VINSERTPSzrr : AVX512AIi8<0x21, MRMSrcReg, (outs VR128X:$dst), 552*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src1, VR128X:$src2, u8imm:$src3), 553*9880d681SAndroid Build Coastguard Worker "vinsertps\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}", 554*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (X86insertps VR128X:$src1, VR128X:$src2, imm:$src3))]>, 555*9880d681SAndroid Build Coastguard Worker EVEX_4V; 556*9880d681SAndroid Build Coastguard Workerdef VINSERTPSzrm: AVX512AIi8<0x21, MRMSrcMem, (outs VR128X:$dst), 557*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src1, f32mem:$src2, u8imm:$src3), 558*9880d681SAndroid Build Coastguard Worker "vinsertps\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}", 559*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (X86insertps VR128X:$src1, 560*9880d681SAndroid Build Coastguard Worker (v4f32 (scalar_to_vector (loadf32 addr:$src2))), 561*9880d681SAndroid Build Coastguard Worker imm:$src3))]>, EVEX_4V, EVEX_CD8<32, CD8VT1>; 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 564*9880d681SAndroid Build Coastguard Worker// AVX-512 VECTOR EXTRACT 565*9880d681SAndroid Build Coastguard Worker//--- 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Workermulticlass vextract_for_size<int Opcode, 568*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo From, X86VectorVTInfo To, 569*9880d681SAndroid Build Coastguard Worker PatFrag vextract_extract> { 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, ExeDomain = To.ExeDomain in { 572*9880d681SAndroid Build Coastguard Worker // use AVX512_maskable_in_asm (AVX512_maskable can't be used due to 573*9880d681SAndroid Build Coastguard Worker // vextract_extract), we interesting only in patterns without mask, 574*9880d681SAndroid Build Coastguard Worker // intrinsics pattern match generated bellow. 575*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable_in_asm<Opcode, MRMDestReg, To, (outs To.RC:$dst), 576*9880d681SAndroid Build Coastguard Worker (ins From.RC:$src1, i32u8imm:$idx), 577*9880d681SAndroid Build Coastguard Worker "vextract" # To.EltTypeName # "x" # To.NumElts, 578*9880d681SAndroid Build Coastguard Worker "$idx, $src1", "$src1, $idx", 579*9880d681SAndroid Build Coastguard Worker [(set To.RC:$dst, (vextract_extract:$idx (From.VT From.RC:$src1), 580*9880d681SAndroid Build Coastguard Worker (iPTR imm)))]>, 581*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX; 582*9880d681SAndroid Build Coastguard Worker def mr : AVX512AIi8<Opcode, MRMDestMem, (outs), 583*9880d681SAndroid Build Coastguard Worker (ins To.MemOp:$dst, From.RC:$src1, i32u8imm:$idx), 584*9880d681SAndroid Build Coastguard Worker "vextract" # To.EltTypeName # "x" # To.NumElts # 585*9880d681SAndroid Build Coastguard Worker "\t{$idx, $src1, $dst|$dst, $src1, $idx}", 586*9880d681SAndroid Build Coastguard Worker [(store (To.VT (vextract_extract:$idx 587*9880d681SAndroid Build Coastguard Worker (From.VT From.RC:$src1), (iPTR imm))), 588*9880d681SAndroid Build Coastguard Worker addr:$dst)]>, EVEX; 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Worker let mayStore = 1, hasSideEffects = 0 in 591*9880d681SAndroid Build Coastguard Worker def mrk : AVX512AIi8<Opcode, MRMDestMem, (outs), 592*9880d681SAndroid Build Coastguard Worker (ins To.MemOp:$dst, To.KRCWM:$mask, 593*9880d681SAndroid Build Coastguard Worker From.RC:$src1, i32u8imm:$idx), 594*9880d681SAndroid Build Coastguard Worker "vextract" # To.EltTypeName # "x" # To.NumElts # 595*9880d681SAndroid Build Coastguard Worker "\t{$idx, $src1, $dst {${mask}}|" 596*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $idx}", 597*9880d681SAndroid Build Coastguard Worker []>, EVEX_K, EVEX; 598*9880d681SAndroid Build Coastguard Worker } 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker // Intrinsic call with masking. 601*9880d681SAndroid Build Coastguard Worker def : Pat<(!cast<Intrinsic>("int_x86_avx512_mask_vextract" # To.EltTypeName # 602*9880d681SAndroid Build Coastguard Worker "x" # To.NumElts # "_" # From.Size) 603*9880d681SAndroid Build Coastguard Worker From.RC:$src1, (iPTR imm:$idx), To.RC:$src0, To.MRC:$mask), 604*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # To.EltSize # "x" # To.NumElts # 605*9880d681SAndroid Build Coastguard Worker From.ZSuffix # "rrk") 606*9880d681SAndroid Build Coastguard Worker To.RC:$src0, 607*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS To.MRC:$mask, To.KRCWM), 608*9880d681SAndroid Build Coastguard Worker From.RC:$src1, imm:$idx)>; 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Worker // Intrinsic call with zero-masking. 611*9880d681SAndroid Build Coastguard Worker def : Pat<(!cast<Intrinsic>("int_x86_avx512_mask_vextract" # To.EltTypeName # 612*9880d681SAndroid Build Coastguard Worker "x" # To.NumElts # "_" # From.Size) 613*9880d681SAndroid Build Coastguard Worker From.RC:$src1, (iPTR imm:$idx), To.ImmAllZerosV, To.MRC:$mask), 614*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # To.EltSize # "x" # To.NumElts # 615*9880d681SAndroid Build Coastguard Worker From.ZSuffix # "rrkz") 616*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS To.MRC:$mask, To.KRCWM), 617*9880d681SAndroid Build Coastguard Worker From.RC:$src1, imm:$idx)>; 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Worker // Intrinsic call without masking. 620*9880d681SAndroid Build Coastguard Worker def : Pat<(!cast<Intrinsic>("int_x86_avx512_mask_vextract" # To.EltTypeName # 621*9880d681SAndroid Build Coastguard Worker "x" # To.NumElts # "_" # From.Size) 622*9880d681SAndroid Build Coastguard Worker From.RC:$src1, (iPTR imm:$idx), To.ImmAllZerosV, (i8 -1)), 623*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # To.EltSize # "x" # To.NumElts # 624*9880d681SAndroid Build Coastguard Worker From.ZSuffix # "rr") 625*9880d681SAndroid Build Coastguard Worker From.RC:$src1, imm:$idx)>; 626*9880d681SAndroid Build Coastguard Worker} 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Worker// Codegen pattern for the alternative types 629*9880d681SAndroid Build Coastguard Workermulticlass vextract_for_size_lowering<string InstrStr, X86VectorVTInfo From, 630*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo To, PatFrag vextract_extract, 631*9880d681SAndroid Build Coastguard Worker SDNodeXForm EXTRACT_get_vextract_imm, list<Predicate> p> { 632*9880d681SAndroid Build Coastguard Worker let Predicates = p in { 633*9880d681SAndroid Build Coastguard Worker def : Pat<(vextract_extract:$ext (From.VT From.RC:$src1), (iPTR imm)), 634*9880d681SAndroid Build Coastguard Worker (To.VT (!cast<Instruction>(InstrStr#"rr") 635*9880d681SAndroid Build Coastguard Worker From.RC:$src1, 636*9880d681SAndroid Build Coastguard Worker (EXTRACT_get_vextract_imm To.RC:$ext)))>; 637*9880d681SAndroid Build Coastguard Worker def : Pat<(store (To.VT (vextract_extract:$ext (From.VT From.RC:$src1), 638*9880d681SAndroid Build Coastguard Worker (iPTR imm))), addr:$dst), 639*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(InstrStr#"mr") addr:$dst, From.RC:$src1, 640*9880d681SAndroid Build Coastguard Worker (EXTRACT_get_vextract_imm To.RC:$ext))>; 641*9880d681SAndroid Build Coastguard Worker } 642*9880d681SAndroid Build Coastguard Worker} 643*9880d681SAndroid Build Coastguard Worker 644*9880d681SAndroid Build Coastguard Workermulticlass vextract_for_type<ValueType EltVT32, int Opcode128, 645*9880d681SAndroid Build Coastguard Worker ValueType EltVT64, int Opcode256> { 646*9880d681SAndroid Build Coastguard Worker defm NAME # "32x4Z" : vextract_for_size<Opcode128, 647*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo<16, EltVT32, VR512>, 648*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT32, VR128X>, 649*9880d681SAndroid Build Coastguard Worker vextract128_extract>, 650*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VT4>; 651*9880d681SAndroid Build Coastguard Worker defm NAME # "64x4Z" : vextract_for_size<Opcode256, 652*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT64, VR512>, 653*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT64, VR256X>, 654*9880d681SAndroid Build Coastguard Worker vextract256_extract>, 655*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_V512, EVEX_CD8<64, CD8VT4>; 656*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in 657*9880d681SAndroid Build Coastguard Worker defm NAME # "32x4Z256" : vextract_for_size<Opcode128, 658*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT32, VR256X>, 659*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT32, VR128X>, 660*9880d681SAndroid Build Coastguard Worker vextract128_extract>, 661*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<32, CD8VT4>; 662*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasDQI] in 663*9880d681SAndroid Build Coastguard Worker defm NAME # "64x2Z256" : vextract_for_size<Opcode128, 664*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 4, EltVT64, VR256X>, 665*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 2, EltVT64, VR128X>, 666*9880d681SAndroid Build Coastguard Worker vextract128_extract>, 667*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_V256, EVEX_CD8<64, CD8VT2>; 668*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 669*9880d681SAndroid Build Coastguard Worker defm NAME # "64x2Z" : vextract_for_size<Opcode128, 670*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT64, VR512>, 671*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 2, EltVT64, VR128X>, 672*9880d681SAndroid Build Coastguard Worker vextract128_extract>, 673*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_V512, EVEX_CD8<64, CD8VT2>; 674*9880d681SAndroid Build Coastguard Worker defm NAME # "32x8Z" : vextract_for_size<Opcode256, 675*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo<16, EltVT32, VR512>, 676*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo< 8, EltVT32, VR256X>, 677*9880d681SAndroid Build Coastguard Worker vextract256_extract>, 678*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VT8>; 679*9880d681SAndroid Build Coastguard Worker } 680*9880d681SAndroid Build Coastguard Worker} 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Workerdefm VEXTRACTF : vextract_for_type<f32, 0x19, f64, 0x1b>; 683*9880d681SAndroid Build Coastguard Workerdefm VEXTRACTI : vextract_for_type<i32, 0x39, i64, 0x3b>; 684*9880d681SAndroid Build Coastguard Worker 685*9880d681SAndroid Build Coastguard Worker// extract_subvector codegen patterns with the alternative types. 686*9880d681SAndroid Build Coastguard Worker// Only add this if 64x2 and its friends are not supported natively via AVX512DQ. 687*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTF32x4Z", v8f64_info, v2f64x_info, 688*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasAVX512, NoDQI]>; 689*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI32x4Z", v8i64_info, v2i64x_info, 690*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasAVX512, NoDQI]>; 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTF64x4Z", v16f32_info, v8f32x_info, 693*9880d681SAndroid Build Coastguard Worker vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512, NoDQI]>; 694*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI64x4Z", v16i32_info, v8i32x_info, 695*9880d681SAndroid Build Coastguard Worker vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512, NoDQI]>; 696*9880d681SAndroid Build Coastguard Worker 697*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTF32x4Z256", v4f64x_info, v2f64x_info, 698*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasVLX, NoDQI]>; 699*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI32x4Z256", v4i64x_info, v2i64x_info, 700*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasVLX, NoDQI]>; 701*9880d681SAndroid Build Coastguard Worker 702*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types extract VEC128 from VEC256 703*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI32x4Z256", v16i16x_info, v8i16x_info, 704*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasVLX]>; 705*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI32x4Z256", v32i8x_info, v16i8x_info, 706*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasVLX]>; 707*9880d681SAndroid Build Coastguard Worker 708*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types extract VEC128 from VEC512 709*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI32x4Z", v32i16_info, v8i16x_info, 710*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasAVX512]>; 711*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI32x4Z", v64i8_info, v16i8x_info, 712*9880d681SAndroid Build Coastguard Worker vextract128_extract, EXTRACT_get_vextract128_imm, [HasAVX512]>; 713*9880d681SAndroid Build Coastguard Worker// Codegen pattern with the alternative types extract VEC256 from VEC512 714*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI64x4Z", v32i16_info, v16i16x_info, 715*9880d681SAndroid Build Coastguard Worker vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512]>; 716*9880d681SAndroid Build Coastguard Workerdefm : vextract_for_size_lowering<"VEXTRACTI64x4Z", v64i8_info, v32i8x_info, 717*9880d681SAndroid Build Coastguard Worker vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512]>; 718*9880d681SAndroid Build Coastguard Worker 719*9880d681SAndroid Build Coastguard Worker// A 128-bit subvector extract from the first 256-bit vector position 720*9880d681SAndroid Build Coastguard Worker// is a subregister copy that needs no instruction. 721*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (extract_subvector (v8i64 VR512:$src), (iPTR 0))), 722*9880d681SAndroid Build Coastguard Worker (v2i64 (EXTRACT_SUBREG (v8i64 VR512:$src), sub_xmm))>; 723*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (extract_subvector (v8f64 VR512:$src), (iPTR 0))), 724*9880d681SAndroid Build Coastguard Worker (v2f64 (EXTRACT_SUBREG (v8f64 VR512:$src), sub_xmm))>; 725*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (extract_subvector (v16i32 VR512:$src), (iPTR 0))), 726*9880d681SAndroid Build Coastguard Worker (v4i32 (EXTRACT_SUBREG (v16i32 VR512:$src), sub_xmm))>; 727*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (extract_subvector (v16f32 VR512:$src), (iPTR 0))), 728*9880d681SAndroid Build Coastguard Worker (v4f32 (EXTRACT_SUBREG (v16f32 VR512:$src), sub_xmm))>; 729*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (extract_subvector (v32i16 VR512:$src), (iPTR 0))), 730*9880d681SAndroid Build Coastguard Worker (v8i16 (EXTRACT_SUBREG (v32i16 VR512:$src), sub_xmm))>; 731*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (extract_subvector (v64i8 VR512:$src), (iPTR 0))), 732*9880d681SAndroid Build Coastguard Worker (v16i8 (EXTRACT_SUBREG (v64i8 VR512:$src), sub_xmm))>; 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Worker// A 256-bit subvector extract from the first 256-bit vector position 735*9880d681SAndroid Build Coastguard Worker// is a subregister copy that needs no instruction. 736*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i64 (extract_subvector (v8i64 VR512:$src), (iPTR 0))), 737*9880d681SAndroid Build Coastguard Worker (v4i64 (EXTRACT_SUBREG (v8i64 VR512:$src), sub_ymm))>; 738*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (extract_subvector (v8f64 VR512:$src), (iPTR 0))), 739*9880d681SAndroid Build Coastguard Worker (v4f64 (EXTRACT_SUBREG (v8f64 VR512:$src), sub_ymm))>; 740*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i32 (extract_subvector (v16i32 VR512:$src), (iPTR 0))), 741*9880d681SAndroid Build Coastguard Worker (v8i32 (EXTRACT_SUBREG (v16i32 VR512:$src), sub_ymm))>; 742*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f32 (extract_subvector (v16f32 VR512:$src), (iPTR 0))), 743*9880d681SAndroid Build Coastguard Worker (v8f32 (EXTRACT_SUBREG (v16f32 VR512:$src), sub_ymm))>; 744*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i16 (extract_subvector (v32i16 VR512:$src), (iPTR 0))), 745*9880d681SAndroid Build Coastguard Worker (v16i16 (EXTRACT_SUBREG (v32i16 VR512:$src), sub_ymm))>; 746*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i8 (extract_subvector (v64i8 VR512:$src), (iPTR 0))), 747*9880d681SAndroid Build Coastguard Worker (v32i8 (EXTRACT_SUBREG (v64i8 VR512:$src), sub_ymm))>; 748*9880d681SAndroid Build Coastguard Worker 749*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 25 in { // to give priority over vinsertf128rm 750*9880d681SAndroid Build Coastguard Worker// A 128-bit subvector insert to the first 512-bit vector position 751*9880d681SAndroid Build Coastguard Worker// is a subregister copy that needs no instruction. 752*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (insert_subvector undef, (v2i64 VR128X:$src), (iPTR 0))), 753*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src, sub_xmm)>; 754*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (insert_subvector undef, (v2f64 VR128X:$src), (iPTR 0))), 755*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8f64 (IMPLICIT_DEF)), VR128X:$src, sub_xmm)>; 756*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (insert_subvector undef, (v4i32 VR128X:$src), (iPTR 0))), 757*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i32 (IMPLICIT_DEF)), VR128X:$src, sub_xmm)>; 758*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (insert_subvector undef, (v4f32 VR128X:$src), (iPTR 0))), 759*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16f32 (IMPLICIT_DEF)), VR128X:$src, sub_xmm)>; 760*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (insert_subvector undef, (v8i16 VR128X:$src), (iPTR 0))), 761*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v32i16 (IMPLICIT_DEF)), VR128X:$src, sub_xmm)>; 762*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (insert_subvector undef, (v16i8 VR128X:$src), (iPTR 0))), 763*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v64i8 (IMPLICIT_DEF)), VR128X:$src, sub_xmm)>; 764*9880d681SAndroid Build Coastguard Worker 765*9880d681SAndroid Build Coastguard Worker// A 256-bit subvector insert to the first 512-bit vector position 766*9880d681SAndroid Build Coastguard Worker// is a subregister copy that needs no instruction. 767*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (insert_subvector undef, (v4i64 VR256X:$src), (iPTR 0))), 768*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$src, sub_ymm)>; 769*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (insert_subvector undef, (v4f64 VR256X:$src), (iPTR 0))), 770*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8f64 (IMPLICIT_DEF)), VR256X:$src, sub_ymm)>; 771*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (insert_subvector undef, (v8i32 VR256X:$src), (iPTR 0))), 772*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i32 (IMPLICIT_DEF)), VR256X:$src, sub_ymm)>; 773*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (insert_subvector undef, (v8f32 VR256X:$src), (iPTR 0))), 774*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16f32 (IMPLICIT_DEF)), VR256X:$src, sub_ymm)>; 775*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i16 (insert_subvector undef, (v16i16 VR256X:$src), (iPTR 0))), 776*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v32i16 (IMPLICIT_DEF)), VR256X:$src, sub_ymm)>; 777*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i8 (insert_subvector undef, (v32i8 VR256X:$src), (iPTR 0))), 778*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v64i8 (IMPLICIT_DEF)), VR256X:$src, sub_ymm)>; 779*9880d681SAndroid Build Coastguard Worker} 780*9880d681SAndroid Build Coastguard Worker 781*9880d681SAndroid Build Coastguard Worker// vextractps - extract 32 bits from XMM 782*9880d681SAndroid Build Coastguard Workerdef VEXTRACTPSZrr : AVX512AIi8<0x17, MRMDestReg, (outs GR32:$dst), 783*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src1, u8imm:$src2), 784*9880d681SAndroid Build Coastguard Worker "vextractps\t{$src2, $src1, $dst|$dst, $src1, $src2}", 785*9880d681SAndroid Build Coastguard Worker [(set GR32:$dst, (extractelt (bc_v4i32 (v4f32 VR128X:$src1)), imm:$src2))]>, 786*9880d681SAndroid Build Coastguard Worker EVEX; 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard Workerdef VEXTRACTPSZmr : AVX512AIi8<0x17, MRMDestMem, (outs), 789*9880d681SAndroid Build Coastguard Worker (ins f32mem:$dst, VR128X:$src1, u8imm:$src2), 790*9880d681SAndroid Build Coastguard Worker "vextractps\t{$src2, $src1, $dst|$dst, $src1, $src2}", 791*9880d681SAndroid Build Coastguard Worker [(store (extractelt (bc_v4i32 (v4f32 VR128X:$src1)), imm:$src2), 792*9880d681SAndroid Build Coastguard Worker addr:$dst)]>, EVEX, EVEX_CD8<32, CD8VT1>; 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 795*9880d681SAndroid Build Coastguard Worker// AVX-512 BROADCAST 796*9880d681SAndroid Build Coastguard Worker//--- 797*9880d681SAndroid Build Coastguard Worker// broadcast with a scalar argument. 798*9880d681SAndroid Build Coastguard Workermulticlass avx512_broadcast_scalar<bits<8> opc, string OpcodeStr, 799*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfo, X86VectorVTInfo SrcInfo> { 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 802*9880d681SAndroid Build Coastguard Worker def r_s : I< opc, MRMSrcReg, (outs DestInfo.RC:$dst), 803*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.FRC:$src), OpcodeStr#"\t{$src, $dst|$dst, $src}", 804*9880d681SAndroid Build Coastguard Worker [(set DestInfo.RC:$dst, (DestInfo.VT (X86VBroadcast SrcInfo.FRC:$src)))]>, 805*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512]>, T8PD, EVEX; 806*9880d681SAndroid Build Coastguard Worker 807*9880d681SAndroid Build Coastguard Worker let Constraints = "$src0 = $dst" in 808*9880d681SAndroid Build Coastguard Worker def rk_s : I< opc, MRMSrcReg, (outs DestInfo.RC:$dst), 809*9880d681SAndroid Build Coastguard Worker (ins DestInfo.RC:$src0, DestInfo.KRCWM:$mask, SrcInfo.FRC:$src), 810*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src, $dst {${mask}} |$dst {${mask}}, $src}", 811*9880d681SAndroid Build Coastguard Worker [(set DestInfo.RC:$dst, 812*9880d681SAndroid Build Coastguard Worker (vselect DestInfo.KRCWM:$mask, 813*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (X86VBroadcast SrcInfo.FRC:$src)), 814*9880d681SAndroid Build Coastguard Worker DestInfo.RC:$src0))]>, 815*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512]>, T8PD, EVEX, EVEX_K; 816*9880d681SAndroid Build Coastguard Worker 817*9880d681SAndroid Build Coastguard Worker def rkz_s : I< opc, MRMSrcReg, (outs DestInfo.RC:$dst), 818*9880d681SAndroid Build Coastguard Worker (ins DestInfo.KRCWM:$mask, SrcInfo.FRC:$src), 819*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src, $dst {${mask}} {z}|$dst {${mask}} {z}, $src}", 820*9880d681SAndroid Build Coastguard Worker [(set DestInfo.RC:$dst, 821*9880d681SAndroid Build Coastguard Worker (vselect DestInfo.KRCWM:$mask, 822*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (X86VBroadcast SrcInfo.FRC:$src)), 823*9880d681SAndroid Build Coastguard Worker DestInfo.ImmAllZerosV))]>, 824*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512]>, T8PD, EVEX, EVEX_KZ; 825*9880d681SAndroid Build Coastguard Worker } // let isCodeGenOnly = 1 in 826*9880d681SAndroid Build Coastguard Worker} 827*9880d681SAndroid Build Coastguard Worker 828*9880d681SAndroid Build Coastguard Workermulticlass avx512_broadcast_rm<bits<8> opc, string OpcodeStr, 829*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfo, X86VectorVTInfo SrcInfo> { 830*9880d681SAndroid Build Coastguard Worker 831*9880d681SAndroid Build Coastguard Worker defm r : AVX512_maskable<opc, MRMSrcReg, DestInfo, (outs DestInfo.RC:$dst), 832*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.RC:$src), OpcodeStr, "$src", "$src", 833*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (X86VBroadcast (SrcInfo.VT SrcInfo.RC:$src)))>, 834*9880d681SAndroid Build Coastguard Worker T8PD, EVEX; 835*9880d681SAndroid Build Coastguard Worker defm m : AVX512_maskable<opc, MRMSrcMem, DestInfo, (outs DestInfo.RC:$dst), 836*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.ScalarMemOp:$src), OpcodeStr, "$src", "$src", 837*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (X86VBroadcast 838*9880d681SAndroid Build Coastguard Worker (SrcInfo.ScalarLdFrag addr:$src)))>, 839*9880d681SAndroid Build Coastguard Worker T8PD, EVEX, EVEX_CD8<SrcInfo.EltSize, CD8VT1>; 840*9880d681SAndroid Build Coastguard Worker 841*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 842*9880d681SAndroid Build Coastguard Worker defm m_Int : AVX512_maskable<opc, MRMSrcMem, DestInfo, (outs DestInfo.RC:$dst), 843*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.ScalarMemOp:$src), OpcodeStr, "$src", "$src", 844*9880d681SAndroid Build Coastguard Worker (DestInfo.VT 845*9880d681SAndroid Build Coastguard Worker (X86VBroadcast 846*9880d681SAndroid Build Coastguard Worker (SrcInfo.VT (scalar_to_vector 847*9880d681SAndroid Build Coastguard Worker (SrcInfo.ScalarLdFrag addr:$src)))))>, 848*9880d681SAndroid Build Coastguard Worker T8PD, EVEX, EVEX_CD8<SrcInfo.EltSize, CD8VT1>; 849*9880d681SAndroid Build Coastguard Worker} 850*9880d681SAndroid Build Coastguard Worker 851*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_broadcast_vl<bits<8> opc, string OpcodeStr, 852*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _> { 853*9880d681SAndroid Build Coastguard Worker defm Z : avx512_broadcast_rm<opc, OpcodeStr, _.info512, _.info128>, 854*9880d681SAndroid Build Coastguard Worker avx512_broadcast_scalar<opc, OpcodeStr, _.info512, _.info128>, 855*9880d681SAndroid Build Coastguard Worker EVEX_V512; 856*9880d681SAndroid Build Coastguard Worker 857*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 858*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_broadcast_rm<opc, OpcodeStr, _.info256, _.info128>, 859*9880d681SAndroid Build Coastguard Worker avx512_broadcast_scalar<opc, OpcodeStr, _.info256, _.info128>, 860*9880d681SAndroid Build Coastguard Worker EVEX_V256; 861*9880d681SAndroid Build Coastguard Worker } 862*9880d681SAndroid Build Coastguard Worker} 863*9880d681SAndroid Build Coastguard Worker 864*9880d681SAndroid Build Coastguard Workerlet ExeDomain = SSEPackedSingle in { 865*9880d681SAndroid Build Coastguard Worker defm VBROADCASTSS : avx512_fp_broadcast_vl<0x18, "vbroadcastss", 866*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info>; 867*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 868*9880d681SAndroid Build Coastguard Worker defm VBROADCASTSSZ128 : 869*9880d681SAndroid Build Coastguard Worker avx512_broadcast_rm<0x18, "vbroadcastss", v4f32x_info, v4f32x_info>, 870*9880d681SAndroid Build Coastguard Worker avx512_broadcast_scalar<0x18, "vbroadcastss", v4f32x_info, v4f32x_info>, 871*9880d681SAndroid Build Coastguard Worker EVEX_V128; 872*9880d681SAndroid Build Coastguard Worker } 873*9880d681SAndroid Build Coastguard Worker} 874*9880d681SAndroid Build Coastguard Worker 875*9880d681SAndroid Build Coastguard Workerlet ExeDomain = SSEPackedDouble in { 876*9880d681SAndroid Build Coastguard Worker defm VBROADCASTSD : avx512_fp_broadcast_vl<0x19, "vbroadcastsd", 877*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info>, VEX_W; 878*9880d681SAndroid Build Coastguard Worker} 879*9880d681SAndroid Build Coastguard Worker 880*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_avx512_vbroadcast_ss_512 addr:$src), 881*9880d681SAndroid Build Coastguard Worker (VBROADCASTSSZm addr:$src)>; 882*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_avx512_vbroadcast_sd_512 addr:$src), 883*9880d681SAndroid Build Coastguard Worker (VBROADCASTSDZm addr:$src)>; 884*9880d681SAndroid Build Coastguard Worker 885*9880d681SAndroid Build Coastguard Workermulticlass avx512_int_broadcast_reg<bits<8> opc, X86VectorVTInfo _, 886*9880d681SAndroid Build Coastguard Worker RegisterClass SrcRC> { 887*9880d681SAndroid Build Coastguard Worker defm r : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 888*9880d681SAndroid Build Coastguard Worker (ins SrcRC:$src), 889*9880d681SAndroid Build Coastguard Worker "vpbroadcast"##_.Suffix, "$src", "$src", 890*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast SrcRC:$src))>, T8PD, EVEX; 891*9880d681SAndroid Build Coastguard Worker} 892*9880d681SAndroid Build Coastguard Worker 893*9880d681SAndroid Build Coastguard Workermulticlass avx512_int_broadcast_reg_vl<bits<8> opc, AVX512VLVectorVTInfo _, 894*9880d681SAndroid Build Coastguard Worker RegisterClass SrcRC, Predicate prd> { 895*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 896*9880d681SAndroid Build Coastguard Worker defm Z : avx512_int_broadcast_reg<opc, _.info512, SrcRC>, EVEX_V512; 897*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 898*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_int_broadcast_reg<opc, _.info256, SrcRC>, EVEX_V256; 899*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_int_broadcast_reg<opc, _.info128, SrcRC>, EVEX_V128; 900*9880d681SAndroid Build Coastguard Worker } 901*9880d681SAndroid Build Coastguard Worker} 902*9880d681SAndroid Build Coastguard Worker 903*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 904*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTBr : avx512_int_broadcast_reg_vl<0x7A, avx512vl_i8_info, GR8, 905*9880d681SAndroid Build Coastguard Worker HasBWI>; 906*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTWr : avx512_int_broadcast_reg_vl<0x7B, avx512vl_i16_info, GR16, 907*9880d681SAndroid Build Coastguard Worker HasBWI>; 908*9880d681SAndroid Build Coastguard Worker} 909*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in { 910*9880d681SAndroid Build Coastguard Worker defm VPBROADCASTBr_Alt : avx512_int_broadcast_reg_vl<0x7A, avx512vl_i8_info, 911*9880d681SAndroid Build Coastguard Worker GR32, HasBWI>; 912*9880d681SAndroid Build Coastguard Worker defm VPBROADCASTWr_Alt : avx512_int_broadcast_reg_vl<0x7B, avx512vl_i16_info, 913*9880d681SAndroid Build Coastguard Worker GR32, HasBWI>; 914*9880d681SAndroid Build Coastguard Worker} 915*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTDr : avx512_int_broadcast_reg_vl<0x7C, avx512vl_i32_info, GR32, 916*9880d681SAndroid Build Coastguard Worker HasAVX512>; 917*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTQr : avx512_int_broadcast_reg_vl<0x7C, avx512vl_i64_info, GR64, 918*9880d681SAndroid Build Coastguard Worker HasAVX512>, VEX_W; 919*9880d681SAndroid Build Coastguard Worker 920*9880d681SAndroid Build Coastguard Workerdef : Pat <(v16i32 (X86vzext VK16WM:$mask)), 921*9880d681SAndroid Build Coastguard Worker (VPBROADCASTDrZrkz VK16WM:$mask, (i32 (MOV32ri 0x1)))>; 922*9880d681SAndroid Build Coastguard Workerdef : Pat <(v8i64 (X86vzext VK8WM:$mask)), 923*9880d681SAndroid Build Coastguard Worker (VPBROADCASTQrZrkz VK8WM:$mask, (i64 (MOV64ri 0x1)))>; 924*9880d681SAndroid Build Coastguard Worker 925*9880d681SAndroid Build Coastguard Worker// Provide aliases for broadcast from the same register class that 926*9880d681SAndroid Build Coastguard Worker// automatically does the extract. 927*9880d681SAndroid Build Coastguard Workermulticlass avx512_int_broadcast_rm_lowering<X86VectorVTInfo DestInfo, 928*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo SrcInfo> { 929*9880d681SAndroid Build Coastguard Worker def : Pat<(DestInfo.VT (X86VBroadcast (SrcInfo.VT SrcInfo.RC:$src))), 930*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#DestInfo.ZSuffix#"r") 931*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (SrcInfo.VT SrcInfo.RC:$src), sub_xmm))>; 932*9880d681SAndroid Build Coastguard Worker} 933*9880d681SAndroid Build Coastguard Worker 934*9880d681SAndroid Build Coastguard Workermulticlass avx512_int_broadcast_rm_vl<bits<8> opc, string OpcodeStr, 935*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, Predicate prd> { 936*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 937*9880d681SAndroid Build Coastguard Worker defm Z : avx512_broadcast_rm<opc, OpcodeStr, _.info512, _.info128>, 938*9880d681SAndroid Build Coastguard Worker avx512_int_broadcast_rm_lowering<_.info512, _.info256>, 939*9880d681SAndroid Build Coastguard Worker EVEX_V512; 940*9880d681SAndroid Build Coastguard Worker // Defined separately to avoid redefinition. 941*9880d681SAndroid Build Coastguard Worker defm Z_Alt : avx512_int_broadcast_rm_lowering<_.info512, _.info512>; 942*9880d681SAndroid Build Coastguard Worker } 943*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 944*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_broadcast_rm<opc, OpcodeStr, _.info256, _.info128>, 945*9880d681SAndroid Build Coastguard Worker avx512_int_broadcast_rm_lowering<_.info256, _.info256>, 946*9880d681SAndroid Build Coastguard Worker EVEX_V256; 947*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_broadcast_rm<opc, OpcodeStr, _.info128, _.info128>, 948*9880d681SAndroid Build Coastguard Worker EVEX_V128; 949*9880d681SAndroid Build Coastguard Worker } 950*9880d681SAndroid Build Coastguard Worker} 951*9880d681SAndroid Build Coastguard Worker 952*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTB : avx512_int_broadcast_rm_vl<0x78, "vpbroadcastb", 953*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, HasBWI>; 954*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTW : avx512_int_broadcast_rm_vl<0x79, "vpbroadcastw", 955*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, HasBWI>; 956*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTD : avx512_int_broadcast_rm_vl<0x58, "vpbroadcastd", 957*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, HasAVX512>; 958*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTQ : avx512_int_broadcast_rm_vl<0x59, "vpbroadcastq", 959*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, HasAVX512>, VEX_W; 960*9880d681SAndroid Build Coastguard Worker 961*9880d681SAndroid Build Coastguard Workermulticlass avx512_subvec_broadcast_rm<bits<8> opc, string OpcodeStr, 962*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Dst, X86VectorVTInfo _Src> { 963*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), 964*9880d681SAndroid Build Coastguard Worker (ins _Src.MemOp:$src), OpcodeStr, "$src", "$src", 965*9880d681SAndroid Build Coastguard Worker (_Dst.VT (X86SubVBroadcast 966*9880d681SAndroid Build Coastguard Worker (_Src.VT (bitconvert (_Src.LdFrag addr:$src)))))>, 967*9880d681SAndroid Build Coastguard Worker AVX5128IBase, EVEX; 968*9880d681SAndroid Build Coastguard Worker} 969*9880d681SAndroid Build Coastguard Worker 970*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTI32X4 : avx512_subvec_broadcast_rm<0x5a, "vbroadcasti32x4", 971*9880d681SAndroid Build Coastguard Worker v16i32_info, v4i32x_info>, 972*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VT4>; 973*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTF32X4 : avx512_subvec_broadcast_rm<0x1a, "vbroadcastf32x4", 974*9880d681SAndroid Build Coastguard Worker v16f32_info, v4f32x_info>, 975*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VT4>; 976*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTI64X4 : avx512_subvec_broadcast_rm<0x5b, "vbroadcasti64x4", 977*9880d681SAndroid Build Coastguard Worker v8i64_info, v4i64x_info>, VEX_W, 978*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<64, CD8VT4>; 979*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTF64X4 : avx512_subvec_broadcast_rm<0x1b, "vbroadcastf64x4", 980*9880d681SAndroid Build Coastguard Worker v8f64_info, v4f64x_info>, VEX_W, 981*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<64, CD8VT4>; 982*9880d681SAndroid Build Coastguard Worker 983*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 984*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTI32X4Z256 : avx512_subvec_broadcast_rm<0x5a, "vbroadcasti32x4", 985*9880d681SAndroid Build Coastguard Worker v8i32x_info, v4i32x_info>, 986*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<32, CD8VT4>; 987*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTF32X4Z256 : avx512_subvec_broadcast_rm<0x1a, "vbroadcastf32x4", 988*9880d681SAndroid Build Coastguard Worker v8f32x_info, v4f32x_info>, 989*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<32, CD8VT4>; 990*9880d681SAndroid Build Coastguard Worker} 991*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX, HasDQI] in { 992*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTI64X2Z128 : avx512_subvec_broadcast_rm<0x5a, "vbroadcasti64x2", 993*9880d681SAndroid Build Coastguard Worker v4i64x_info, v2i64x_info>, VEX_W, 994*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<64, CD8VT2>; 995*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTF64X2Z128 : avx512_subvec_broadcast_rm<0x1a, "vbroadcastf64x2", 996*9880d681SAndroid Build Coastguard Worker v4f64x_info, v2f64x_info>, VEX_W, 997*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<64, CD8VT2>; 998*9880d681SAndroid Build Coastguard Worker} 999*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDQI] in { 1000*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTI64X2 : avx512_subvec_broadcast_rm<0x5a, "vbroadcasti64x2", 1001*9880d681SAndroid Build Coastguard Worker v8i64_info, v2i64x_info>, VEX_W, 1002*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<64, CD8VT2>; 1003*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTI32X8 : avx512_subvec_broadcast_rm<0x5b, "vbroadcasti32x8", 1004*9880d681SAndroid Build Coastguard Worker v16i32_info, v8i32x_info>, 1005*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VT8>; 1006*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTF64X2 : avx512_subvec_broadcast_rm<0x1a, "vbroadcastf64x2", 1007*9880d681SAndroid Build Coastguard Worker v8f64_info, v2f64x_info>, VEX_W, 1008*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<64, CD8VT2>; 1009*9880d681SAndroid Build Coastguard Workerdefm VBROADCASTF32X8 : avx512_subvec_broadcast_rm<0x1b, "vbroadcastf32x8", 1010*9880d681SAndroid Build Coastguard Worker v16f32_info, v8f32x_info>, 1011*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VT8>; 1012*9880d681SAndroid Build Coastguard Worker} 1013*9880d681SAndroid Build Coastguard Worker 1014*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_broadcast_32x2<bits<8> opc, string OpcodeStr, 1015*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _Dst, AVX512VLVectorVTInfo _Src> { 1016*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in 1017*9880d681SAndroid Build Coastguard Worker defm Z : avx512_broadcast_rm<opc, OpcodeStr, _Dst.info512, _Src.info128>, 1018*9880d681SAndroid Build Coastguard Worker EVEX_V512; 1019*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in 1020*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_broadcast_rm<opc, OpcodeStr, _Dst.info256, _Src.info128>, 1021*9880d681SAndroid Build Coastguard Worker EVEX_V256; 1022*9880d681SAndroid Build Coastguard Worker} 1023*9880d681SAndroid Build Coastguard Worker 1024*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_broadcast_i32x2<bits<8> opc, string OpcodeStr, 1025*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _Dst, AVX512VLVectorVTInfo _Src> : 1026*9880d681SAndroid Build Coastguard Worker avx512_common_broadcast_32x2<opc, OpcodeStr, _Dst, _Src> { 1027*9880d681SAndroid Build Coastguard Worker 1028*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in 1029*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_broadcast_rm<opc, OpcodeStr, _Dst.info128, _Src.info128>, 1030*9880d681SAndroid Build Coastguard Worker EVEX_V128; 1031*9880d681SAndroid Build Coastguard Worker} 1032*9880d681SAndroid Build Coastguard Worker 1033*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTI32X2 : avx512_common_broadcast_i32x2<0x59, "vbroadcasti32x2", 1034*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, avx512vl_i64_info>; 1035*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTF32X2 : avx512_common_broadcast_32x2<0x19, "vbroadcastf32x2", 1036*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info, avx512vl_f64_info>; 1037*9880d681SAndroid Build Coastguard Worker 1038*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (X86VBroadcast (v16f32 VR512:$src))), 1039*9880d681SAndroid Build Coastguard Worker (VBROADCASTSSZr (EXTRACT_SUBREG (v16f32 VR512:$src), sub_xmm))>; 1040*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (X86VBroadcast (v8f32 VR256X:$src))), 1041*9880d681SAndroid Build Coastguard Worker (VBROADCASTSSZr (EXTRACT_SUBREG (v8f32 VR256X:$src), sub_xmm))>; 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (X86VBroadcast (v8f64 VR512:$src))), 1044*9880d681SAndroid Build Coastguard Worker (VBROADCASTSDZr (EXTRACT_SUBREG (v8f64 VR512:$src), sub_xmm))>; 1045*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (X86VBroadcast (v4f64 VR256X:$src))), 1046*9880d681SAndroid Build Coastguard Worker (VBROADCASTSDZr (EXTRACT_SUBREG (v4f64 VR256X:$src), sub_xmm))>; 1047*9880d681SAndroid Build Coastguard Worker 1048*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1049*9880d681SAndroid Build Coastguard Worker// AVX-512 BROADCAST MASK TO VECTOR REGISTER 1050*9880d681SAndroid Build Coastguard Worker//--- 1051*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_broadcastm<bits<8> opc, string OpcodeStr, 1052*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, RegisterClass KRC> { 1053*9880d681SAndroid Build Coastguard Worker def rr : AVX512XS8I<opc, MRMSrcReg, (outs _.RC:$dst), (ins KRC:$src), 1054*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 1055*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT (X86VBroadcastm KRC:$src)))]>, EVEX; 1056*9880d681SAndroid Build Coastguard Worker} 1057*9880d681SAndroid Build Coastguard Worker 1058*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_broadcast<bits<8> opc, string OpcodeStr, 1059*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, RegisterClass KRC> { 1060*9880d681SAndroid Build Coastguard Worker let Predicates = [HasCDI] in 1061*9880d681SAndroid Build Coastguard Worker defm Z : avx512_mask_broadcastm<opc, OpcodeStr, VTInfo.info512, KRC>, EVEX_V512; 1062*9880d681SAndroid Build Coastguard Worker let Predicates = [HasCDI, HasVLX] in { 1063*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_mask_broadcastm<opc, OpcodeStr, VTInfo.info256, KRC>, EVEX_V256; 1064*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_mask_broadcastm<opc, OpcodeStr, VTInfo.info128, KRC>, EVEX_V128; 1065*9880d681SAndroid Build Coastguard Worker } 1066*9880d681SAndroid Build Coastguard Worker} 1067*9880d681SAndroid Build Coastguard Worker 1068*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTMW2D : avx512_mask_broadcast<0x3A, "vpbroadcastmw2d", 1069*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, VK16>; 1070*9880d681SAndroid Build Coastguard Workerdefm VPBROADCASTMB2Q : avx512_mask_broadcast<0x2A, "vpbroadcastmb2q", 1071*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, VK8>, VEX_W; 1072*9880d681SAndroid Build Coastguard Worker 1073*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1074*9880d681SAndroid Build Coastguard Worker// -- VPERMI2 - 3 source operands form -- 1075*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_i<bits<8> opc, string OpcodeStr, 1076*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, X86VectorVTInfo IdxVT> { 1077*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 1078*9880d681SAndroid Build Coastguard Worker defm rr: AVX512_maskable_3src_cast<opc, MRMSrcReg, _, IdxVT, (outs _.RC:$dst), 1079*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3), 1080*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 1081*9880d681SAndroid Build Coastguard Worker (_.VT (X86VPermi2X IdxVT.RC:$src1, _.RC:$src2, _.RC:$src3))>, EVEX_4V, 1082*9880d681SAndroid Build Coastguard Worker AVX5128IBase; 1083*9880d681SAndroid Build Coastguard Worker 1084*9880d681SAndroid Build Coastguard Worker defm rm: AVX512_maskable_3src_cast<opc, MRMSrcMem, _, IdxVT, (outs _.RC:$dst), 1085*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.MemOp:$src3), 1086*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 1087*9880d681SAndroid Build Coastguard Worker (_.VT (X86VPermi2X IdxVT.RC:$src1, _.RC:$src2, 1088*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src3)))))>, 1089*9880d681SAndroid Build Coastguard Worker EVEX_4V, AVX5128IBase; 1090*9880d681SAndroid Build Coastguard Worker } 1091*9880d681SAndroid Build Coastguard Worker} 1092*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_i_mb<bits<8> opc, string OpcodeStr, 1093*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, X86VectorVTInfo IdxVT> { 1094*9880d681SAndroid Build Coastguard Worker let Constraints = "$src1 = $dst" in 1095*9880d681SAndroid Build Coastguard Worker defm rmb: AVX512_maskable_3src_cast<opc, MRMSrcMem, _, IdxVT, (outs _.RC:$dst), 1096*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3), 1097*9880d681SAndroid Build Coastguard Worker OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), 1098*9880d681SAndroid Build Coastguard Worker !strconcat("$src2, ${src3}", _.BroadcastStr ), 1099*9880d681SAndroid Build Coastguard Worker (_.VT (X86VPermi2X IdxVT.RC:$src1, 1100*9880d681SAndroid Build Coastguard Worker _.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3)))))>, 1101*9880d681SAndroid Build Coastguard Worker AVX5128IBase, EVEX_4V, EVEX_B; 1102*9880d681SAndroid Build Coastguard Worker} 1103*9880d681SAndroid Build Coastguard Worker 1104*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_i_sizes<bits<8> opc, string OpcodeStr, 1105*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, 1106*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo ShuffleMask> { 1107*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_perm_i<opc, OpcodeStr, VTInfo.info512, 1108*9880d681SAndroid Build Coastguard Worker ShuffleMask.info512>, 1109*9880d681SAndroid Build Coastguard Worker avx512_perm_i_mb<opc, OpcodeStr, VTInfo.info512, 1110*9880d681SAndroid Build Coastguard Worker ShuffleMask.info512>, EVEX_V512; 1111*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 1112*9880d681SAndroid Build Coastguard Worker defm NAME#128: avx512_perm_i<opc, OpcodeStr, VTInfo.info128, 1113*9880d681SAndroid Build Coastguard Worker ShuffleMask.info128>, 1114*9880d681SAndroid Build Coastguard Worker avx512_perm_i_mb<opc, OpcodeStr, VTInfo.info128, 1115*9880d681SAndroid Build Coastguard Worker ShuffleMask.info128>, EVEX_V128; 1116*9880d681SAndroid Build Coastguard Worker defm NAME#256: avx512_perm_i<opc, OpcodeStr, VTInfo.info256, 1117*9880d681SAndroid Build Coastguard Worker ShuffleMask.info256>, 1118*9880d681SAndroid Build Coastguard Worker avx512_perm_i_mb<opc, OpcodeStr, VTInfo.info256, 1119*9880d681SAndroid Build Coastguard Worker ShuffleMask.info256>, EVEX_V256; 1120*9880d681SAndroid Build Coastguard Worker } 1121*9880d681SAndroid Build Coastguard Worker} 1122*9880d681SAndroid Build Coastguard Worker 1123*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_i_sizes_bw<bits<8> opc, string OpcodeStr, 1124*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, 1125*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo Idx, 1126*9880d681SAndroid Build Coastguard Worker Predicate Prd> { 1127*9880d681SAndroid Build Coastguard Worker let Predicates = [Prd] in 1128*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_perm_i<opc, OpcodeStr, VTInfo.info512, 1129*9880d681SAndroid Build Coastguard Worker Idx.info512>, EVEX_V512; 1130*9880d681SAndroid Build Coastguard Worker let Predicates = [Prd, HasVLX] in { 1131*9880d681SAndroid Build Coastguard Worker defm NAME#128: avx512_perm_i<opc, OpcodeStr, VTInfo.info128, 1132*9880d681SAndroid Build Coastguard Worker Idx.info128>, EVEX_V128; 1133*9880d681SAndroid Build Coastguard Worker defm NAME#256: avx512_perm_i<opc, OpcodeStr, VTInfo.info256, 1134*9880d681SAndroid Build Coastguard Worker Idx.info256>, EVEX_V256; 1135*9880d681SAndroid Build Coastguard Worker } 1136*9880d681SAndroid Build Coastguard Worker} 1137*9880d681SAndroid Build Coastguard Worker 1138*9880d681SAndroid Build Coastguard Workerdefm VPERMI2D : avx512_perm_i_sizes<0x76, "vpermi2d", 1139*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, avx512vl_i32_info>, EVEX_CD8<32, CD8VF>; 1140*9880d681SAndroid Build Coastguard Workerdefm VPERMI2Q : avx512_perm_i_sizes<0x76, "vpermi2q", 1141*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, avx512vl_i64_info>, VEX_W, EVEX_CD8<64, CD8VF>; 1142*9880d681SAndroid Build Coastguard Workerdefm VPERMI2W : avx512_perm_i_sizes_bw<0x75, "vpermi2w", 1143*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, avx512vl_i16_info, HasBWI>, 1144*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_CD8<16, CD8VF>; 1145*9880d681SAndroid Build Coastguard Workerdefm VPERMI2B : avx512_perm_i_sizes_bw<0x75, "vpermi2b", 1146*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, avx512vl_i8_info, HasVBMI>, 1147*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VF>; 1148*9880d681SAndroid Build Coastguard Workerdefm VPERMI2PS : avx512_perm_i_sizes<0x77, "vpermi2ps", 1149*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info, avx512vl_i32_info>, EVEX_CD8<32, CD8VF>; 1150*9880d681SAndroid Build Coastguard Workerdefm VPERMI2PD : avx512_perm_i_sizes<0x77, "vpermi2pd", 1151*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info, avx512vl_i64_info>, VEX_W, EVEX_CD8<64, CD8VF>; 1152*9880d681SAndroid Build Coastguard Worker 1153*9880d681SAndroid Build Coastguard Worker// VPERMT2 1154*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_t<bits<8> opc, string OpcodeStr, 1155*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, X86VectorVTInfo IdxVT> { 1156*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 1157*9880d681SAndroid Build Coastguard Worker defm rr: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 1158*9880d681SAndroid Build Coastguard Worker (ins IdxVT.RC:$src2, _.RC:$src3), 1159*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 1160*9880d681SAndroid Build Coastguard Worker (_.VT (X86VPermt2 _.RC:$src1, IdxVT.RC:$src2, _.RC:$src3))>, EVEX_4V, 1161*9880d681SAndroid Build Coastguard Worker AVX5128IBase; 1162*9880d681SAndroid Build Coastguard Worker 1163*9880d681SAndroid Build Coastguard Worker defm rm: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 1164*9880d681SAndroid Build Coastguard Worker (ins IdxVT.RC:$src2, _.MemOp:$src3), 1165*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 1166*9880d681SAndroid Build Coastguard Worker (_.VT (X86VPermt2 _.RC:$src1, IdxVT.RC:$src2, 1167*9880d681SAndroid Build Coastguard Worker (bitconvert (_.LdFrag addr:$src3))))>, 1168*9880d681SAndroid Build Coastguard Worker EVEX_4V, AVX5128IBase; 1169*9880d681SAndroid Build Coastguard Worker } 1170*9880d681SAndroid Build Coastguard Worker} 1171*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_t_mb<bits<8> opc, string OpcodeStr, 1172*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, X86VectorVTInfo IdxVT> { 1173*9880d681SAndroid Build Coastguard Worker let Constraints = "$src1 = $dst" in 1174*9880d681SAndroid Build Coastguard Worker defm rmb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 1175*9880d681SAndroid Build Coastguard Worker (ins IdxVT.RC:$src2, _.ScalarMemOp:$src3), 1176*9880d681SAndroid Build Coastguard Worker OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), 1177*9880d681SAndroid Build Coastguard Worker !strconcat("$src2, ${src3}", _.BroadcastStr ), 1178*9880d681SAndroid Build Coastguard Worker (_.VT (X86VPermt2 _.RC:$src1, 1179*9880d681SAndroid Build Coastguard Worker IdxVT.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3)))))>, 1180*9880d681SAndroid Build Coastguard Worker AVX5128IBase, EVEX_4V, EVEX_B; 1181*9880d681SAndroid Build Coastguard Worker} 1182*9880d681SAndroid Build Coastguard Worker 1183*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_t_sizes<bits<8> opc, string OpcodeStr, 1184*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, 1185*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo ShuffleMask> { 1186*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_perm_t<opc, OpcodeStr, VTInfo.info512, 1187*9880d681SAndroid Build Coastguard Worker ShuffleMask.info512>, 1188*9880d681SAndroid Build Coastguard Worker avx512_perm_t_mb<opc, OpcodeStr, VTInfo.info512, 1189*9880d681SAndroid Build Coastguard Worker ShuffleMask.info512>, EVEX_V512; 1190*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 1191*9880d681SAndroid Build Coastguard Worker defm NAME#128: avx512_perm_t<opc, OpcodeStr, VTInfo.info128, 1192*9880d681SAndroid Build Coastguard Worker ShuffleMask.info128>, 1193*9880d681SAndroid Build Coastguard Worker avx512_perm_t_mb<opc, OpcodeStr, VTInfo.info128, 1194*9880d681SAndroid Build Coastguard Worker ShuffleMask.info128>, EVEX_V128; 1195*9880d681SAndroid Build Coastguard Worker defm NAME#256: avx512_perm_t<opc, OpcodeStr, VTInfo.info256, 1196*9880d681SAndroid Build Coastguard Worker ShuffleMask.info256>, 1197*9880d681SAndroid Build Coastguard Worker avx512_perm_t_mb<opc, OpcodeStr, VTInfo.info256, 1198*9880d681SAndroid Build Coastguard Worker ShuffleMask.info256>, EVEX_V256; 1199*9880d681SAndroid Build Coastguard Worker } 1200*9880d681SAndroid Build Coastguard Worker} 1201*9880d681SAndroid Build Coastguard Worker 1202*9880d681SAndroid Build Coastguard Workermulticlass avx512_perm_t_sizes_bw<bits<8> opc, string OpcodeStr, 1203*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, 1204*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo Idx, 1205*9880d681SAndroid Build Coastguard Worker Predicate Prd> { 1206*9880d681SAndroid Build Coastguard Worker let Predicates = [Prd] in 1207*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_perm_t<opc, OpcodeStr, VTInfo.info512, 1208*9880d681SAndroid Build Coastguard Worker Idx.info512>, EVEX_V512; 1209*9880d681SAndroid Build Coastguard Worker let Predicates = [Prd, HasVLX] in { 1210*9880d681SAndroid Build Coastguard Worker defm NAME#128: avx512_perm_t<opc, OpcodeStr, VTInfo.info128, 1211*9880d681SAndroid Build Coastguard Worker Idx.info128>, EVEX_V128; 1212*9880d681SAndroid Build Coastguard Worker defm NAME#256: avx512_perm_t<opc, OpcodeStr, VTInfo.info256, 1213*9880d681SAndroid Build Coastguard Worker Idx.info256>, EVEX_V256; 1214*9880d681SAndroid Build Coastguard Worker } 1215*9880d681SAndroid Build Coastguard Worker} 1216*9880d681SAndroid Build Coastguard Worker 1217*9880d681SAndroid Build Coastguard Workerdefm VPERMT2D : avx512_perm_t_sizes<0x7E, "vpermt2d", 1218*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, avx512vl_i32_info>, EVEX_CD8<32, CD8VF>; 1219*9880d681SAndroid Build Coastguard Workerdefm VPERMT2Q : avx512_perm_t_sizes<0x7E, "vpermt2q", 1220*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, avx512vl_i64_info>, VEX_W, EVEX_CD8<64, CD8VF>; 1221*9880d681SAndroid Build Coastguard Workerdefm VPERMT2W : avx512_perm_t_sizes_bw<0x7D, "vpermt2w", 1222*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, avx512vl_i16_info, HasBWI>, 1223*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_CD8<16, CD8VF>; 1224*9880d681SAndroid Build Coastguard Workerdefm VPERMT2B : avx512_perm_t_sizes_bw<0x7D, "vpermt2b", 1225*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, avx512vl_i8_info, HasVBMI>, 1226*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VF>; 1227*9880d681SAndroid Build Coastguard Workerdefm VPERMT2PS : avx512_perm_t_sizes<0x7F, "vpermt2ps", 1228*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info, avx512vl_i32_info>, EVEX_CD8<32, CD8VF>; 1229*9880d681SAndroid Build Coastguard Workerdefm VPERMT2PD : avx512_perm_t_sizes<0x7F, "vpermt2pd", 1230*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info, avx512vl_i64_info>, VEX_W, EVEX_CD8<64, CD8VF>; 1231*9880d681SAndroid Build Coastguard Worker 1232*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1233*9880d681SAndroid Build Coastguard Worker// AVX-512 - BLEND using mask 1234*9880d681SAndroid Build Coastguard Worker// 1235*9880d681SAndroid Build Coastguard Workermulticlass avx512_blendmask<bits<8> opc, string OpcodeStr, X86VectorVTInfo _> { 1236*9880d681SAndroid Build Coastguard Worker let ExeDomain = _.ExeDomain in { 1237*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in 1238*9880d681SAndroid Build Coastguard Worker def rr : AVX5128I<opc, MRMSrcReg, (outs _.RC:$dst), 1239*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), 1240*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1241*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, ${dst}|${dst}, $src1, $src2}"), 1242*9880d681SAndroid Build Coastguard Worker []>, EVEX_4V; 1243*9880d681SAndroid Build Coastguard Worker def rrk : AVX5128I<opc, MRMSrcReg, (outs _.RC:$dst), 1244*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, _.RC:$src2), 1245*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1246*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, ${dst} {${mask}}|${dst} {${mask}}, $src1, $src2}"), 1247*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (vselect _.KRCWM:$mask, 1248*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 1249*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src1)))]>, EVEX_4V, EVEX_K; 1250*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in 1251*9880d681SAndroid Build Coastguard Worker def rrkz : AVX5128I<opc, MRMSrcReg, (outs _.RC:$dst), 1252*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, _.RC:$src2), 1253*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1254*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, ${dst} {${mask}} {z}|${dst} {${mask}} {z}, $src1, $src2}"), 1255*9880d681SAndroid Build Coastguard Worker []>, EVEX_4V, EVEX_KZ; 1256*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, hasSideEffects = 0 in 1257*9880d681SAndroid Build Coastguard Worker def rm : AVX5128I<opc, MRMSrcMem, (outs _.RC:$dst), 1258*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2), 1259*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1260*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, ${dst}|${dst}, $src1, $src2}"), 1261*9880d681SAndroid Build Coastguard Worker []>, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; 1262*9880d681SAndroid Build Coastguard Worker def rmk : AVX5128I<opc, MRMSrcMem, (outs _.RC:$dst), 1263*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, _.MemOp:$src2), 1264*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1265*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, ${dst} {${mask}}|${dst} {${mask}}, $src1, $src2}"), 1266*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (vselect _.KRCWM:$mask, 1267*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))), 1268*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src1)))]>, 1269*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_K, EVEX_CD8<_.EltSize, CD8VF>; 1270*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, hasSideEffects = 0 in 1271*9880d681SAndroid Build Coastguard Worker def rmkz : AVX5128I<opc, MRMSrcMem, (outs _.RC:$dst), 1272*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, _.MemOp:$src2), 1273*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1274*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, ${dst} {${mask}} {z}|${dst} {${mask}} {z}, $src1, $src2}"), 1275*9880d681SAndroid Build Coastguard Worker []>, EVEX_4V, EVEX_KZ, EVEX_CD8<_.EltSize, CD8VF>; 1276*9880d681SAndroid Build Coastguard Worker } 1277*9880d681SAndroid Build Coastguard Worker} 1278*9880d681SAndroid Build Coastguard Workermulticlass avx512_blendmask_rmb<bits<8> opc, string OpcodeStr, X86VectorVTInfo _> { 1279*9880d681SAndroid Build Coastguard Worker 1280*9880d681SAndroid Build Coastguard Worker def rmbk : AVX5128I<opc, MRMSrcMem, (outs _.RC:$dst), 1281*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, _.ScalarMemOp:$src2), 1282*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1283*9880d681SAndroid Build Coastguard Worker "\t{${src2}", _.BroadcastStr, ", $src1, $dst {${mask}}|", 1284*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, ${src2}", _.BroadcastStr, "}"), 1285*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst,(vselect _.KRCWM:$mask, 1286*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src2)), 1287*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src1)))]>, 1288*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_K, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>; 1289*9880d681SAndroid Build Coastguard Worker 1290*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, hasSideEffects = 0 in 1291*9880d681SAndroid Build Coastguard Worker def rmb : AVX5128I<opc, MRMSrcMem, (outs _.RC:$dst), 1292*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), 1293*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1294*9880d681SAndroid Build Coastguard Worker "\t{${src2}", _.BroadcastStr, ", $src1, $dst|", 1295*9880d681SAndroid Build Coastguard Worker "$dst, $src1, ${src2}", _.BroadcastStr, "}"), 1296*9880d681SAndroid Build Coastguard Worker []>, EVEX_4V, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>; 1297*9880d681SAndroid Build Coastguard Worker 1298*9880d681SAndroid Build Coastguard Worker} 1299*9880d681SAndroid Build Coastguard Worker 1300*9880d681SAndroid Build Coastguard Workermulticlass blendmask_dq <bits<8> opc, string OpcodeStr, 1301*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 1302*9880d681SAndroid Build Coastguard Worker defm Z : avx512_blendmask <opc, OpcodeStr, VTInfo.info512>, 1303*9880d681SAndroid Build Coastguard Worker avx512_blendmask_rmb <opc, OpcodeStr, VTInfo.info512>, EVEX_V512; 1304*9880d681SAndroid Build Coastguard Worker 1305*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 1306*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_blendmask<opc, OpcodeStr, VTInfo.info256>, 1307*9880d681SAndroid Build Coastguard Worker avx512_blendmask_rmb <opc, OpcodeStr, VTInfo.info256>, EVEX_V256; 1308*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_blendmask<opc, OpcodeStr, VTInfo.info128>, 1309*9880d681SAndroid Build Coastguard Worker avx512_blendmask_rmb <opc, OpcodeStr, VTInfo.info128>, EVEX_V128; 1310*9880d681SAndroid Build Coastguard Worker } 1311*9880d681SAndroid Build Coastguard Worker} 1312*9880d681SAndroid Build Coastguard Worker 1313*9880d681SAndroid Build Coastguard Workermulticlass blendmask_bw <bits<8> opc, string OpcodeStr, 1314*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 1315*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 1316*9880d681SAndroid Build Coastguard Worker defm Z : avx512_blendmask <opc, OpcodeStr, VTInfo.info512>, EVEX_V512; 1317*9880d681SAndroid Build Coastguard Worker 1318*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI, HasVLX] in { 1319*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_blendmask <opc, OpcodeStr, VTInfo.info256>, EVEX_V256; 1320*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_blendmask <opc, OpcodeStr, VTInfo.info128>, EVEX_V128; 1321*9880d681SAndroid Build Coastguard Worker } 1322*9880d681SAndroid Build Coastguard Worker} 1323*9880d681SAndroid Build Coastguard Worker 1324*9880d681SAndroid Build Coastguard Worker 1325*9880d681SAndroid Build Coastguard Workerdefm VBLENDMPS : blendmask_dq <0x65, "vblendmps", avx512vl_f32_info>; 1326*9880d681SAndroid Build Coastguard Workerdefm VBLENDMPD : blendmask_dq <0x65, "vblendmpd", avx512vl_f64_info>, VEX_W; 1327*9880d681SAndroid Build Coastguard Workerdefm VPBLENDMD : blendmask_dq <0x64, "vpblendmd", avx512vl_i32_info>; 1328*9880d681SAndroid Build Coastguard Workerdefm VPBLENDMQ : blendmask_dq <0x64, "vpblendmq", avx512vl_i64_info>, VEX_W; 1329*9880d681SAndroid Build Coastguard Workerdefm VPBLENDMB : blendmask_bw <0x66, "vpblendmb", avx512vl_i8_info>; 1330*9880d681SAndroid Build Coastguard Workerdefm VPBLENDMW : blendmask_bw <0x66, "vpblendmw", avx512vl_i16_info>, VEX_W; 1331*9880d681SAndroid Build Coastguard Worker 1332*9880d681SAndroid Build Coastguard Worker 1333*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512, NoVLX] in { 1334*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f32 (vselect (v8i1 VK8WM:$mask), (v8f32 VR256X:$src1), 1335*9880d681SAndroid Build Coastguard Worker (v8f32 VR256X:$src2))), 1336*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 1337*9880d681SAndroid Build Coastguard Worker (v16f32 (VBLENDMPSZrrk (COPY_TO_REGCLASS VK8WM:$mask, VK16WM), 1338*9880d681SAndroid Build Coastguard Worker (v16f32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm)), 1339*9880d681SAndroid Build Coastguard Worker (v16f32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)))), sub_ymm)>; 1340*9880d681SAndroid Build Coastguard Worker 1341*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i32 (vselect (v8i1 VK8WM:$mask), (v8i32 VR256X:$src1), 1342*9880d681SAndroid Build Coastguard Worker (v8i32 VR256X:$src2))), 1343*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 1344*9880d681SAndroid Build Coastguard Worker (v16i32 (VPBLENDMDZrrk (COPY_TO_REGCLASS VK8WM:$mask, VK16WM), 1345*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm)), 1346*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)))), sub_ymm)>; 1347*9880d681SAndroid Build Coastguard Worker} 1348*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1349*9880d681SAndroid Build Coastguard Worker// Compare Instructions 1350*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1351*9880d681SAndroid Build Coastguard Worker 1352*9880d681SAndroid Build Coastguard Worker// avx512_cmp_scalar - AVX512 CMPSS and CMPSD 1353*9880d681SAndroid Build Coastguard Worker 1354*9880d681SAndroid Build Coastguard Workermulticlass avx512_cmp_scalar<X86VectorVTInfo _, SDNode OpNode, SDNode OpNodeRnd>{ 1355*9880d681SAndroid Build Coastguard Worker 1356*9880d681SAndroid Build Coastguard Worker defm rr_Int : AVX512_maskable_cmp<0xC2, MRMSrcReg, _, 1357*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1358*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, AVXCC:$cc), 1359*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1360*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 1361*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1362*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 1363*9880d681SAndroid Build Coastguard Worker imm:$cc)>, EVEX_4V; 1364*9880d681SAndroid Build Coastguard Worker defm rm_Int : AVX512_maskable_cmp<0xC2, MRMSrcMem, _, 1365*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1366*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, AVXCC:$cc), 1367*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1368*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 1369*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1370*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector (_.ScalarLdFrag addr:$src2))), 1371*9880d681SAndroid Build Coastguard Worker imm:$cc)>, EVEX_4V, EVEX_CD8<_.EltSize, CD8VT1>; 1372*9880d681SAndroid Build Coastguard Worker 1373*9880d681SAndroid Build Coastguard Worker defm rrb_Int : AVX512_maskable_cmp<0xC2, MRMSrcReg, _, 1374*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1375*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, AVXCC:$cc), 1376*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1377*9880d681SAndroid Build Coastguard Worker "{sae}, $src2, $src1", "$src1, $src2, {sae}", 1378*9880d681SAndroid Build Coastguard Worker (OpNodeRnd (_.VT _.RC:$src1), 1379*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 1380*9880d681SAndroid Build Coastguard Worker imm:$cc, 1381*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_4V, EVEX_B; 1382*9880d681SAndroid Build Coastguard Worker // Accept explicit immediate argument form instead of comparison code. 1383*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1, hasSideEffects = 0 in { 1384*9880d681SAndroid Build Coastguard Worker defm rri_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcReg, _, 1385*9880d681SAndroid Build Coastguard Worker (outs VK1:$dst), 1386*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, u8imm:$cc), 1387*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1388*9880d681SAndroid Build Coastguard Worker "$cc, $src2, $src1", "$src1, $src2, $cc">, EVEX_4V; 1389*9880d681SAndroid Build Coastguard Worker defm rmi_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcMem, _, 1390*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1391*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, u8imm:$cc), 1392*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1393*9880d681SAndroid Build Coastguard Worker "$cc, $src2, $src1", "$src1, $src2, $cc">, 1394*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_CD8<_.EltSize, CD8VT1>; 1395*9880d681SAndroid Build Coastguard Worker 1396*9880d681SAndroid Build Coastguard Worker defm rrb_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcReg, _, 1397*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1398*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, u8imm:$cc), 1399*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1400*9880d681SAndroid Build Coastguard Worker "$cc, {sae}, $src2, $src1","$src1, $src2, {sae}, $cc">, 1401*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_B; 1402*9880d681SAndroid Build Coastguard Worker }// let isAsmParserOnly = 1, hasSideEffects = 0 1403*9880d681SAndroid Build Coastguard Worker 1404*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 1405*9880d681SAndroid Build Coastguard Worker def rr : AVX512Ii8<0xC2, MRMSrcReg, 1406*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.FRC:$src1, _.FRC:$src2, AVXCC:$cc), 1407*9880d681SAndroid Build Coastguard Worker !strconcat("vcmp${cc}", _.Suffix, 1408*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 1409*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode _.FRC:$src1, 1410*9880d681SAndroid Build Coastguard Worker _.FRC:$src2, 1411*9880d681SAndroid Build Coastguard Worker imm:$cc))], 1412*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32S_RR>, EVEX_4V; 1413*9880d681SAndroid Build Coastguard Worker def rm : AVX512Ii8<0xC2, MRMSrcMem, 1414*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1415*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.ScalarMemOp:$src2, AVXCC:$cc), 1416*9880d681SAndroid Build Coastguard Worker !strconcat("vcmp${cc}", _.Suffix, 1417*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 1418*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode _.FRC:$src1, 1419*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2), 1420*9880d681SAndroid Build Coastguard Worker imm:$cc))], 1421*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_CD8<_.EltSize, CD8VT1>; 1422*9880d681SAndroid Build Coastguard Worker } 1423*9880d681SAndroid Build Coastguard Worker} 1424*9880d681SAndroid Build Coastguard Worker 1425*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 1426*9880d681SAndroid Build Coastguard Worker defm VCMPSSZ : avx512_cmp_scalar<f32x_info, X86cmpms, X86cmpmsRnd>, 1427*9880d681SAndroid Build Coastguard Worker AVX512XSIi8Base; 1428*9880d681SAndroid Build Coastguard Worker defm VCMPSDZ : avx512_cmp_scalar<f64x_info, X86cmpms, X86cmpmsRnd>, 1429*9880d681SAndroid Build Coastguard Worker AVX512XDIi8Base, VEX_W; 1430*9880d681SAndroid Build Coastguard Worker} 1431*9880d681SAndroid Build Coastguard Worker 1432*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_packed<bits<8> opc, string OpcodeStr, SDNode OpNode, 1433*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 1434*9880d681SAndroid Build Coastguard Worker def rr : AVX512BI<opc, MRMSrcReg, 1435*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.RC:$src2), 1436*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 1437*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2)))], 1438*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RR>, EVEX_4V; 1439*9880d681SAndroid Build Coastguard Worker def rm : AVX512BI<opc, MRMSrcMem, 1440*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.MemOp:$src2), 1441*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 1442*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode (_.VT _.RC:$src1), 1443*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2)))))], 1444*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V; 1445*9880d681SAndroid Build Coastguard Worker def rrk : AVX512BI<opc, MRMSrcReg, 1446*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, _.RC:$src2), 1447*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst {${mask}}|", 1448*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $src2}"), 1449*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (and _.KRCWM:$mask, 1450*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2))))], 1451*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RR>, EVEX_4V, EVEX_K; 1452*9880d681SAndroid Build Coastguard Worker def rmk : AVX512BI<opc, MRMSrcMem, 1453*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, _.MemOp:$src2), 1454*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst {${mask}}|", 1455*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $src2}"), 1456*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (and _.KRCWM:$mask, 1457*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1458*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert 1459*9880d681SAndroid Build Coastguard Worker (_.LdFrag addr:$src2))))))], 1460*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_K; 1461*9880d681SAndroid Build Coastguard Worker} 1462*9880d681SAndroid Build Coastguard Worker 1463*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_packed_rmb<bits<8> opc, string OpcodeStr, SDNode OpNode, 1464*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> : 1465*9880d681SAndroid Build Coastguard Worker avx512_icmp_packed<opc, OpcodeStr, OpNode, _> { 1466*9880d681SAndroid Build Coastguard Worker def rmb : AVX512BI<opc, MRMSrcMem, 1467*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.ScalarMemOp:$src2), 1468*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{${src2}", _.BroadcastStr, ", $src1, $dst", 1469*9880d681SAndroid Build Coastguard Worker "|$dst, $src1, ${src2}", _.BroadcastStr, "}"), 1470*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode (_.VT _.RC:$src1), 1471*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src2))))], 1472*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_B; 1473*9880d681SAndroid Build Coastguard Worker def rmbk : AVX512BI<opc, MRMSrcMem, 1474*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, 1475*9880d681SAndroid Build Coastguard Worker _.ScalarMemOp:$src2), 1476*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 1477*9880d681SAndroid Build Coastguard Worker "\t{${src2}", _.BroadcastStr, ", $src1, $dst {${mask}}|", 1478*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, ${src2}", _.BroadcastStr, "}"), 1479*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (and _.KRCWM:$mask, 1480*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1481*9880d681SAndroid Build Coastguard Worker (X86VBroadcast 1482*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2)))))], 1483*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_K, EVEX_B; 1484*9880d681SAndroid Build Coastguard Worker} 1485*9880d681SAndroid Build Coastguard Worker 1486*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_packed_vl<bits<8> opc, string OpcodeStr, SDNode OpNode, 1487*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 1488*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 1489*9880d681SAndroid Build Coastguard Worker defm Z : avx512_icmp_packed<opc, OpcodeStr, OpNode, VTInfo.info512>, 1490*9880d681SAndroid Build Coastguard Worker EVEX_V512; 1491*9880d681SAndroid Build Coastguard Worker 1492*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 1493*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_icmp_packed<opc, OpcodeStr, OpNode, VTInfo.info256>, 1494*9880d681SAndroid Build Coastguard Worker EVEX_V256; 1495*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_icmp_packed<opc, OpcodeStr, OpNode, VTInfo.info128>, 1496*9880d681SAndroid Build Coastguard Worker EVEX_V128; 1497*9880d681SAndroid Build Coastguard Worker } 1498*9880d681SAndroid Build Coastguard Worker} 1499*9880d681SAndroid Build Coastguard Worker 1500*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_packed_rmb_vl<bits<8> opc, string OpcodeStr, 1501*9880d681SAndroid Build Coastguard Worker SDNode OpNode, AVX512VLVectorVTInfo VTInfo, 1502*9880d681SAndroid Build Coastguard Worker Predicate prd> { 1503*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 1504*9880d681SAndroid Build Coastguard Worker defm Z : avx512_icmp_packed_rmb<opc, OpcodeStr, OpNode, VTInfo.info512>, 1505*9880d681SAndroid Build Coastguard Worker EVEX_V512; 1506*9880d681SAndroid Build Coastguard Worker 1507*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 1508*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_icmp_packed_rmb<opc, OpcodeStr, OpNode, VTInfo.info256>, 1509*9880d681SAndroid Build Coastguard Worker EVEX_V256; 1510*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_icmp_packed_rmb<opc, OpcodeStr, OpNode, VTInfo.info128>, 1511*9880d681SAndroid Build Coastguard Worker EVEX_V128; 1512*9880d681SAndroid Build Coastguard Worker } 1513*9880d681SAndroid Build Coastguard Worker} 1514*9880d681SAndroid Build Coastguard Worker 1515*9880d681SAndroid Build Coastguard Workerdefm VPCMPEQB : avx512_icmp_packed_vl<0x74, "vpcmpeqb", X86pcmpeqm, 1516*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, HasBWI>, 1517*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VF>; 1518*9880d681SAndroid Build Coastguard Worker 1519*9880d681SAndroid Build Coastguard Workerdefm VPCMPEQW : avx512_icmp_packed_vl<0x75, "vpcmpeqw", X86pcmpeqm, 1520*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, HasBWI>, 1521*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VF>; 1522*9880d681SAndroid Build Coastguard Worker 1523*9880d681SAndroid Build Coastguard Workerdefm VPCMPEQD : avx512_icmp_packed_rmb_vl<0x76, "vpcmpeqd", X86pcmpeqm, 1524*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, HasAVX512>, 1525*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 1526*9880d681SAndroid Build Coastguard Worker 1527*9880d681SAndroid Build Coastguard Workerdefm VPCMPEQQ : avx512_icmp_packed_rmb_vl<0x29, "vpcmpeqq", X86pcmpeqm, 1528*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, HasAVX512>, 1529*9880d681SAndroid Build Coastguard Worker T8PD, VEX_W, EVEX_CD8<64, CD8VF>; 1530*9880d681SAndroid Build Coastguard Worker 1531*9880d681SAndroid Build Coastguard Workerdefm VPCMPGTB : avx512_icmp_packed_vl<0x64, "vpcmpgtb", X86pcmpgtm, 1532*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, HasBWI>, 1533*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VF>; 1534*9880d681SAndroid Build Coastguard Worker 1535*9880d681SAndroid Build Coastguard Workerdefm VPCMPGTW : avx512_icmp_packed_vl<0x65, "vpcmpgtw", X86pcmpgtm, 1536*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, HasBWI>, 1537*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VF>; 1538*9880d681SAndroid Build Coastguard Worker 1539*9880d681SAndroid Build Coastguard Workerdefm VPCMPGTD : avx512_icmp_packed_rmb_vl<0x66, "vpcmpgtd", X86pcmpgtm, 1540*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, HasAVX512>, 1541*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 1542*9880d681SAndroid Build Coastguard Worker 1543*9880d681SAndroid Build Coastguard Workerdefm VPCMPGTQ : avx512_icmp_packed_rmb_vl<0x37, "vpcmpgtq", X86pcmpgtm, 1544*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, HasAVX512>, 1545*9880d681SAndroid Build Coastguard Worker T8PD, VEX_W, EVEX_CD8<64, CD8VF>; 1546*9880d681SAndroid Build Coastguard Worker 1547*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (X86pcmpgtm (v8i32 VR256X:$src1), (v8i32 VR256X:$src2))), 1548*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VPCMPGTDZrr 1549*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)), 1550*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm))), VK8)>; 1551*9880d681SAndroid Build Coastguard Worker 1552*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (X86pcmpeqm (v8i32 VR256X:$src1), (v8i32 VR256X:$src2))), 1553*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VPCMPEQDZrr 1554*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)), 1555*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm))), VK8)>; 1556*9880d681SAndroid Build Coastguard Worker 1557*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_cc<bits<8> opc, string Suffix, SDNode OpNode, 1558*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 1559*9880d681SAndroid Build Coastguard Worker def rri : AVX512AIi8<opc, MRMSrcReg, 1560*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.RC:$src2, AVX512ICC:$cc), 1561*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp${cc}", Suffix, 1562*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 1563*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 1564*9880d681SAndroid Build Coastguard Worker imm:$cc))], 1565*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RR>, EVEX_4V; 1566*9880d681SAndroid Build Coastguard Worker def rmi : AVX512AIi8<opc, MRMSrcMem, 1567*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.MemOp:$src2, AVX512ICC:$cc), 1568*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp${cc}", Suffix, 1569*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 1570*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode (_.VT _.RC:$src1), 1571*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))), 1572*9880d681SAndroid Build Coastguard Worker imm:$cc))], 1573*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V; 1574*9880d681SAndroid Build Coastguard Worker def rrik : AVX512AIi8<opc, MRMSrcReg, 1575*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, _.RC:$src2, 1576*9880d681SAndroid Build Coastguard Worker AVX512ICC:$cc), 1577*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp${cc}", Suffix, 1578*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst {${mask}}|", 1579*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $src2}"), 1580*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (and _.KRCWM:$mask, 1581*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 1582*9880d681SAndroid Build Coastguard Worker imm:$cc)))], 1583*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RR>, EVEX_4V, EVEX_K; 1584*9880d681SAndroid Build Coastguard Worker def rmik : AVX512AIi8<opc, MRMSrcMem, 1585*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, _.MemOp:$src2, 1586*9880d681SAndroid Build Coastguard Worker AVX512ICC:$cc), 1587*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp${cc}", Suffix, 1588*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst {${mask}}|", 1589*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $src2}"), 1590*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (and _.KRCWM:$mask, 1591*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1592*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))), 1593*9880d681SAndroid Build Coastguard Worker imm:$cc)))], 1594*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_K; 1595*9880d681SAndroid Build Coastguard Worker 1596*9880d681SAndroid Build Coastguard Worker // Accept explicit immediate argument form instead of comparison code. 1597*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1, hasSideEffects = 0 in { 1598*9880d681SAndroid Build Coastguard Worker def rri_alt : AVX512AIi8<opc, MRMSrcReg, 1599*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.RC:$src2, u8imm:$cc), 1600*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp", Suffix, "\t{$cc, $src2, $src1, $dst|", 1601*9880d681SAndroid Build Coastguard Worker "$dst, $src1, $src2, $cc}"), 1602*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_ALU_F32P_RR>, EVEX_4V; 1603*9880d681SAndroid Build Coastguard Worker let mayLoad = 1 in 1604*9880d681SAndroid Build Coastguard Worker def rmi_alt : AVX512AIi8<opc, MRMSrcMem, 1605*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.MemOp:$src2, u8imm:$cc), 1606*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp", Suffix, "\t{$cc, $src2, $src1, $dst|", 1607*9880d681SAndroid Build Coastguard Worker "$dst, $src1, $src2, $cc}"), 1608*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_ALU_F32P_RM>, EVEX_4V; 1609*9880d681SAndroid Build Coastguard Worker def rrik_alt : AVX512AIi8<opc, MRMSrcReg, 1610*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, _.RC:$src2, 1611*9880d681SAndroid Build Coastguard Worker u8imm:$cc), 1612*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp", Suffix, 1613*9880d681SAndroid Build Coastguard Worker "\t{$cc, $src2, $src1, $dst {${mask}}|", 1614*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $src2, $cc}"), 1615*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_ALU_F32P_RR>, EVEX_4V, EVEX_K; 1616*9880d681SAndroid Build Coastguard Worker let mayLoad = 1 in 1617*9880d681SAndroid Build Coastguard Worker def rmik_alt : AVX512AIi8<opc, MRMSrcMem, 1618*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, _.MemOp:$src2, 1619*9880d681SAndroid Build Coastguard Worker u8imm:$cc), 1620*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp", Suffix, 1621*9880d681SAndroid Build Coastguard Worker "\t{$cc, $src2, $src1, $dst {${mask}}|", 1622*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, $src2, $cc}"), 1623*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_K; 1624*9880d681SAndroid Build Coastguard Worker } 1625*9880d681SAndroid Build Coastguard Worker} 1626*9880d681SAndroid Build Coastguard Worker 1627*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_cc_rmb<bits<8> opc, string Suffix, SDNode OpNode, 1628*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> : 1629*9880d681SAndroid Build Coastguard Worker avx512_icmp_cc<opc, Suffix, OpNode, _> { 1630*9880d681SAndroid Build Coastguard Worker def rmib : AVX512AIi8<opc, MRMSrcMem, 1631*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.ScalarMemOp:$src2, 1632*9880d681SAndroid Build Coastguard Worker AVX512ICC:$cc), 1633*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp${cc}", Suffix, 1634*9880d681SAndroid Build Coastguard Worker "\t{${src2}", _.BroadcastStr, ", $src1, $dst|", 1635*9880d681SAndroid Build Coastguard Worker "$dst, $src1, ${src2}", _.BroadcastStr, "}"), 1636*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (OpNode (_.VT _.RC:$src1), 1637*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src2)), 1638*9880d681SAndroid Build Coastguard Worker imm:$cc))], 1639*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_B; 1640*9880d681SAndroid Build Coastguard Worker def rmibk : AVX512AIi8<opc, MRMSrcMem, 1641*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, 1642*9880d681SAndroid Build Coastguard Worker _.ScalarMemOp:$src2, AVX512ICC:$cc), 1643*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp${cc}", Suffix, 1644*9880d681SAndroid Build Coastguard Worker "\t{${src2}", _.BroadcastStr, ", $src1, $dst {${mask}}|", 1645*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, ${src2}", _.BroadcastStr, "}"), 1646*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (and _.KRCWM:$mask, 1647*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1648*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src2)), 1649*9880d681SAndroid Build Coastguard Worker imm:$cc)))], 1650*9880d681SAndroid Build Coastguard Worker IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_K, EVEX_B; 1651*9880d681SAndroid Build Coastguard Worker 1652*9880d681SAndroid Build Coastguard Worker // Accept explicit immediate argument form instead of comparison code. 1653*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1, hasSideEffects = 0, mayLoad = 1 in { 1654*9880d681SAndroid Build Coastguard Worker def rmib_alt : AVX512AIi8<opc, MRMSrcMem, 1655*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.ScalarMemOp:$src2, 1656*9880d681SAndroid Build Coastguard Worker u8imm:$cc), 1657*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp", Suffix, 1658*9880d681SAndroid Build Coastguard Worker "\t{$cc, ${src2}", _.BroadcastStr, ", $src1, $dst|", 1659*9880d681SAndroid Build Coastguard Worker "$dst, $src1, ${src2}", _.BroadcastStr, ", $cc}"), 1660*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_B; 1661*9880d681SAndroid Build Coastguard Worker def rmibk_alt : AVX512AIi8<opc, MRMSrcMem, 1662*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.KRCWM:$mask, _.RC:$src1, 1663*9880d681SAndroid Build Coastguard Worker _.ScalarMemOp:$src2, u8imm:$cc), 1664*9880d681SAndroid Build Coastguard Worker !strconcat("vpcmp", Suffix, 1665*9880d681SAndroid Build Coastguard Worker "\t{$cc, ${src2}", _.BroadcastStr, ", $src1, $dst {${mask}}|", 1666*9880d681SAndroid Build Coastguard Worker "$dst {${mask}}, $src1, ${src2}", _.BroadcastStr, ", $cc}"), 1667*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_ALU_F32P_RM>, EVEX_4V, EVEX_K, EVEX_B; 1668*9880d681SAndroid Build Coastguard Worker } 1669*9880d681SAndroid Build Coastguard Worker} 1670*9880d681SAndroid Build Coastguard Worker 1671*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_cc_vl<bits<8> opc, string Suffix, SDNode OpNode, 1672*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 1673*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 1674*9880d681SAndroid Build Coastguard Worker defm Z : avx512_icmp_cc<opc, Suffix, OpNode, VTInfo.info512>, EVEX_V512; 1675*9880d681SAndroid Build Coastguard Worker 1676*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 1677*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_icmp_cc<opc, Suffix, OpNode, VTInfo.info256>, EVEX_V256; 1678*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_icmp_cc<opc, Suffix, OpNode, VTInfo.info128>, EVEX_V128; 1679*9880d681SAndroid Build Coastguard Worker } 1680*9880d681SAndroid Build Coastguard Worker} 1681*9880d681SAndroid Build Coastguard Worker 1682*9880d681SAndroid Build Coastguard Workermulticlass avx512_icmp_cc_rmb_vl<bits<8> opc, string Suffix, SDNode OpNode, 1683*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 1684*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 1685*9880d681SAndroid Build Coastguard Worker defm Z : avx512_icmp_cc_rmb<opc, Suffix, OpNode, VTInfo.info512>, 1686*9880d681SAndroid Build Coastguard Worker EVEX_V512; 1687*9880d681SAndroid Build Coastguard Worker 1688*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 1689*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_icmp_cc_rmb<opc, Suffix, OpNode, VTInfo.info256>, 1690*9880d681SAndroid Build Coastguard Worker EVEX_V256; 1691*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_icmp_cc_rmb<opc, Suffix, OpNode, VTInfo.info128>, 1692*9880d681SAndroid Build Coastguard Worker EVEX_V128; 1693*9880d681SAndroid Build Coastguard Worker } 1694*9880d681SAndroid Build Coastguard Worker} 1695*9880d681SAndroid Build Coastguard Worker 1696*9880d681SAndroid Build Coastguard Workerdefm VPCMPB : avx512_icmp_cc_vl<0x3F, "b", X86cmpm, avx512vl_i8_info, 1697*9880d681SAndroid Build Coastguard Worker HasBWI>, EVEX_CD8<8, CD8VF>; 1698*9880d681SAndroid Build Coastguard Workerdefm VPCMPUB : avx512_icmp_cc_vl<0x3E, "ub", X86cmpmu, avx512vl_i8_info, 1699*9880d681SAndroid Build Coastguard Worker HasBWI>, EVEX_CD8<8, CD8VF>; 1700*9880d681SAndroid Build Coastguard Worker 1701*9880d681SAndroid Build Coastguard Workerdefm VPCMPW : avx512_icmp_cc_vl<0x3F, "w", X86cmpm, avx512vl_i16_info, 1702*9880d681SAndroid Build Coastguard Worker HasBWI>, VEX_W, EVEX_CD8<16, CD8VF>; 1703*9880d681SAndroid Build Coastguard Workerdefm VPCMPUW : avx512_icmp_cc_vl<0x3E, "uw", X86cmpmu, avx512vl_i16_info, 1704*9880d681SAndroid Build Coastguard Worker HasBWI>, VEX_W, EVEX_CD8<16, CD8VF>; 1705*9880d681SAndroid Build Coastguard Worker 1706*9880d681SAndroid Build Coastguard Workerdefm VPCMPD : avx512_icmp_cc_rmb_vl<0x1F, "d", X86cmpm, avx512vl_i32_info, 1707*9880d681SAndroid Build Coastguard Worker HasAVX512>, EVEX_CD8<32, CD8VF>; 1708*9880d681SAndroid Build Coastguard Workerdefm VPCMPUD : avx512_icmp_cc_rmb_vl<0x1E, "ud", X86cmpmu, avx512vl_i32_info, 1709*9880d681SAndroid Build Coastguard Worker HasAVX512>, EVEX_CD8<32, CD8VF>; 1710*9880d681SAndroid Build Coastguard Worker 1711*9880d681SAndroid Build Coastguard Workerdefm VPCMPQ : avx512_icmp_cc_rmb_vl<0x1F, "q", X86cmpm, avx512vl_i64_info, 1712*9880d681SAndroid Build Coastguard Worker HasAVX512>, VEX_W, EVEX_CD8<64, CD8VF>; 1713*9880d681SAndroid Build Coastguard Workerdefm VPCMPUQ : avx512_icmp_cc_rmb_vl<0x1E, "uq", X86cmpmu, avx512vl_i64_info, 1714*9880d681SAndroid Build Coastguard Worker HasAVX512>, VEX_W, EVEX_CD8<64, CD8VF>; 1715*9880d681SAndroid Build Coastguard Worker 1716*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcmp_common<X86VectorVTInfo _> { 1717*9880d681SAndroid Build Coastguard Worker 1718*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable_cmp<0xC2, MRMSrcReg, _, 1719*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), (ins _.RC:$src1, _.RC:$src2,AVXCC:$cc), 1720*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1721*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 1722*9880d681SAndroid Build Coastguard Worker (X86cmpm (_.VT _.RC:$src1), 1723*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 1724*9880d681SAndroid Build Coastguard Worker imm:$cc)>; 1725*9880d681SAndroid Build Coastguard Worker 1726*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable_cmp<0xC2, MRMSrcMem, _, 1727*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst),(ins _.RC:$src1, _.MemOp:$src2, AVXCC:$cc), 1728*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1729*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 1730*9880d681SAndroid Build Coastguard Worker (X86cmpm (_.VT _.RC:$src1), 1731*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))), 1732*9880d681SAndroid Build Coastguard Worker imm:$cc)>; 1733*9880d681SAndroid Build Coastguard Worker 1734*9880d681SAndroid Build Coastguard Worker defm rmbi : AVX512_maskable_cmp<0xC2, MRMSrcMem, _, 1735*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1736*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, AVXCC:$cc), 1737*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1738*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 1739*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 1740*9880d681SAndroid Build Coastguard Worker (X86cmpm (_.VT _.RC:$src1), 1741*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src2))), 1742*9880d681SAndroid Build Coastguard Worker imm:$cc)>,EVEX_B; 1743*9880d681SAndroid Build Coastguard Worker // Accept explicit immediate argument form instead of comparison code. 1744*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1, hasSideEffects = 0 in { 1745*9880d681SAndroid Build Coastguard Worker defm rri_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcReg, _, 1746*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1747*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, u8imm:$cc), 1748*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1749*9880d681SAndroid Build Coastguard Worker "$cc, $src2, $src1", "$src1, $src2, $cc">; 1750*9880d681SAndroid Build Coastguard Worker 1751*9880d681SAndroid Build Coastguard Worker let mayLoad = 1 in { 1752*9880d681SAndroid Build Coastguard Worker defm rmi_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcMem, _, 1753*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1754*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2, u8imm:$cc), 1755*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1756*9880d681SAndroid Build Coastguard Worker "$cc, $src2, $src1", "$src1, $src2, $cc">; 1757*9880d681SAndroid Build Coastguard Worker 1758*9880d681SAndroid Build Coastguard Worker defm rmbi_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcMem, _, 1759*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1760*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, u8imm:$cc), 1761*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1762*9880d681SAndroid Build Coastguard Worker "$cc, ${src2}"##_.BroadcastStr##", $src1", 1763*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr##", $cc">,EVEX_B; 1764*9880d681SAndroid Build Coastguard Worker } 1765*9880d681SAndroid Build Coastguard Worker } 1766*9880d681SAndroid Build Coastguard Worker} 1767*9880d681SAndroid Build Coastguard Worker 1768*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcmp_sae<X86VectorVTInfo _> { 1769*9880d681SAndroid Build Coastguard Worker // comparison code form (VCMP[EQ/LT/LE/...] 1770*9880d681SAndroid Build Coastguard Worker defm rrib : AVX512_maskable_cmp<0xC2, MRMSrcReg, _, 1771*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst),(ins _.RC:$src1, _.RC:$src2, AVXCC:$cc), 1772*9880d681SAndroid Build Coastguard Worker "vcmp${cc}"#_.Suffix, 1773*9880d681SAndroid Build Coastguard Worker "{sae}, $src2, $src1", "$src1, $src2, {sae}", 1774*9880d681SAndroid Build Coastguard Worker (X86cmpmRnd (_.VT _.RC:$src1), 1775*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 1776*9880d681SAndroid Build Coastguard Worker imm:$cc, 1777*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 1778*9880d681SAndroid Build Coastguard Worker 1779*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1, hasSideEffects = 0 in { 1780*9880d681SAndroid Build Coastguard Worker defm rrib_alt : AVX512_maskable_cmp_alt<0xC2, MRMSrcReg, _, 1781*9880d681SAndroid Build Coastguard Worker (outs _.KRC:$dst), 1782*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, u8imm:$cc), 1783*9880d681SAndroid Build Coastguard Worker "vcmp"#_.Suffix, 1784*9880d681SAndroid Build Coastguard Worker "$cc, {sae}, $src2, $src1", 1785*9880d681SAndroid Build Coastguard Worker "$src1, $src2, {sae}, $cc">, EVEX_B; 1786*9880d681SAndroid Build Coastguard Worker } 1787*9880d681SAndroid Build Coastguard Worker} 1788*9880d681SAndroid Build Coastguard Worker 1789*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcmp<AVX512VLVectorVTInfo _> { 1790*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 1791*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcmp_common<_.info512>, 1792*9880d681SAndroid Build Coastguard Worker avx512_vcmp_sae<_.info512>, EVEX_V512; 1793*9880d681SAndroid Build Coastguard Worker 1794*9880d681SAndroid Build Coastguard Worker } 1795*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512,HasVLX] in { 1796*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcmp_common<_.info128>, EVEX_V128; 1797*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcmp_common<_.info256>, EVEX_V256; 1798*9880d681SAndroid Build Coastguard Worker } 1799*9880d681SAndroid Build Coastguard Worker} 1800*9880d681SAndroid Build Coastguard Worker 1801*9880d681SAndroid Build Coastguard Workerdefm VCMPPD : avx512_vcmp<avx512vl_f64_info>, 1802*9880d681SAndroid Build Coastguard Worker AVX512PDIi8Base, EVEX_4V, EVEX_CD8<64, CD8VF>, VEX_W; 1803*9880d681SAndroid Build Coastguard Workerdefm VCMPPS : avx512_vcmp<avx512vl_f32_info>, 1804*9880d681SAndroid Build Coastguard Worker AVX512PSIi8Base, EVEX_4V, EVEX_CD8<32, CD8VF>; 1805*9880d681SAndroid Build Coastguard Worker 1806*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (X86cmpm (v8f32 VR256X:$src1), (v8f32 VR256X:$src2), imm:$cc)), 1807*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VCMPPSZrri 1808*9880d681SAndroid Build Coastguard Worker (v16f32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)), 1809*9880d681SAndroid Build Coastguard Worker (v16f32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm)), 1810*9880d681SAndroid Build Coastguard Worker imm:$cc), VK8)>; 1811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (X86cmpm (v8i32 VR256X:$src1), (v8i32 VR256X:$src2), imm:$cc)), 1812*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VPCMPDZrri 1813*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)), 1814*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm)), 1815*9880d681SAndroid Build Coastguard Worker imm:$cc), VK8)>; 1816*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (X86cmpmu (v8i32 VR256X:$src1), (v8i32 VR256X:$src2), imm:$cc)), 1817*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VPCMPUDZrri 1818*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)), 1819*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src2, sub_ymm)), 1820*9880d681SAndroid Build Coastguard Worker imm:$cc), VK8)>; 1821*9880d681SAndroid Build Coastguard Worker 1822*9880d681SAndroid Build Coastguard Worker// ---------------------------------------------------------------- 1823*9880d681SAndroid Build Coastguard Worker// FPClass 1824*9880d681SAndroid Build Coastguard Worker//handle fpclass instruction mask = op(reg_scalar,imm) 1825*9880d681SAndroid Build Coastguard Worker// op(mem_scalar,imm) 1826*9880d681SAndroid Build Coastguard Workermulticlass avx512_scalar_fpclass<bits<8> opc, string OpcodeStr, SDNode OpNode, 1827*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, Predicate prd> { 1828*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 1829*9880d681SAndroid Build Coastguard Worker def rr : AVX512<opc, MRMSrcReg, (outs _.KRC:$dst),//_.KRC:$dst), 1830*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, i32u8imm:$src2), 1831*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 1832*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(OpNode (_.VT _.RC:$src1), 1833*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2)))], NoItinerary>; 1834*9880d681SAndroid Build Coastguard Worker def rrk : AVX512<opc, MRMSrcReg, (outs _.KRC:$dst), 1835*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, i32u8imm:$src2), 1836*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix# 1837*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst {${mask}}|$dst {${mask}}, $src1, $src2}", 1838*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(or _.KRCWM:$mask, 1839*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1840*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2))))], NoItinerary>, EVEX_K; 1841*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 20 in { 1842*9880d681SAndroid Build Coastguard Worker def rm : AVX512<opc, MRMSrcMem, (outs _.KRC:$dst), 1843*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src1, i32u8imm:$src2), 1844*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix## 1845*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}", 1846*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, 1847*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT (bitconvert (_.LdFrag addr:$src1))), 1848*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2)))], NoItinerary>; 1849*9880d681SAndroid Build Coastguard Worker def rmk : AVX512<opc, MRMSrcMem, (outs _.KRC:$dst), 1850*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.MemOp:$src1, i32u8imm:$src2), 1851*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix## 1852*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst {${mask}}|$dst {${mask}}, $src1, $src2}", 1853*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(or _.KRCWM:$mask, 1854*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT (bitconvert (_.LdFrag addr:$src1))), 1855*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2))))], NoItinerary>, EVEX_K; 1856*9880d681SAndroid Build Coastguard Worker } 1857*9880d681SAndroid Build Coastguard Worker } 1858*9880d681SAndroid Build Coastguard Worker} 1859*9880d681SAndroid Build Coastguard Worker 1860*9880d681SAndroid Build Coastguard Worker//handle fpclass instruction mask = fpclass(reg_vec, reg_vec, imm) 1861*9880d681SAndroid Build Coastguard Worker// fpclass(reg_vec, mem_vec, imm) 1862*9880d681SAndroid Build Coastguard Worker// fpclass(reg_vec, broadcast(eltVt), imm) 1863*9880d681SAndroid Build Coastguard Workermulticlass avx512_vector_fpclass<bits<8> opc, string OpcodeStr, SDNode OpNode, 1864*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, string mem, string broadcast>{ 1865*9880d681SAndroid Build Coastguard Worker def rr : AVX512<opc, MRMSrcReg, (outs _.KRC:$dst), 1866*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, i32u8imm:$src2), 1867*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 1868*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(OpNode (_.VT _.RC:$src1), 1869*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2)))], NoItinerary>; 1870*9880d681SAndroid Build Coastguard Worker def rrk : AVX512<opc, MRMSrcReg, (outs _.KRC:$dst), 1871*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src1, i32u8imm:$src2), 1872*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix# 1873*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst {${mask}}|$dst {${mask}}, $src1, $src2}", 1874*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(or _.KRCWM:$mask, 1875*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 1876*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2))))], NoItinerary>, EVEX_K; 1877*9880d681SAndroid Build Coastguard Worker def rm : AVX512<opc, MRMSrcMem, (outs _.KRC:$dst), 1878*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src1, i32u8imm:$src2), 1879*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix##mem# 1880*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}", 1881*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(OpNode 1882*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src1))), 1883*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2)))], NoItinerary>; 1884*9880d681SAndroid Build Coastguard Worker def rmk : AVX512<opc, MRMSrcMem, (outs _.KRC:$dst), 1885*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.MemOp:$src1, i32u8imm:$src2), 1886*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix##mem# 1887*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst {${mask}}|$dst {${mask}}, $src1, $src2}", 1888*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (or _.KRCWM:$mask, (OpNode 1889*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src1))), 1890*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2))))], NoItinerary>, EVEX_K; 1891*9880d681SAndroid Build Coastguard Worker def rmb : AVX512<opc, MRMSrcMem, (outs _.KRC:$dst), 1892*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src1, i32u8imm:$src2), 1893*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix##broadcast##"\t{$src2, ${src1}"## 1894*9880d681SAndroid Build Coastguard Worker _.BroadcastStr##", $dst|$dst, ${src1}" 1895*9880d681SAndroid Build Coastguard Worker ##_.BroadcastStr##", $src2}", 1896*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(OpNode 1897*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast 1898*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src1))), 1899*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2)))], NoItinerary>,EVEX_B; 1900*9880d681SAndroid Build Coastguard Worker def rmbk : AVX512<opc, MRMSrcMem, (outs _.KRC:$dst), 1901*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.ScalarMemOp:$src1, i32u8imm:$src2), 1902*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix##broadcast##"\t{$src2, ${src1}"## 1903*9880d681SAndroid Build Coastguard Worker _.BroadcastStr##", $dst {${mask}}|$dst {${mask}}, ${src1}"## 1904*9880d681SAndroid Build Coastguard Worker _.BroadcastStr##", $src2}", 1905*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst,(or _.KRCWM:$mask, (OpNode 1906*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast 1907*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src1))), 1908*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2))))], NoItinerary>, 1909*9880d681SAndroid Build Coastguard Worker EVEX_B, EVEX_K; 1910*9880d681SAndroid Build Coastguard Worker} 1911*9880d681SAndroid Build Coastguard Worker 1912*9880d681SAndroid Build Coastguard Workermulticlass avx512_vector_fpclass_all<string OpcodeStr, 1913*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, bits<8> opc, SDNode OpNode, Predicate prd, 1914*9880d681SAndroid Build Coastguard Worker string broadcast>{ 1915*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 1916*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vector_fpclass<opc, OpcodeStr, OpNode, _.info512, "{z}", 1917*9880d681SAndroid Build Coastguard Worker broadcast>, EVEX_V512; 1918*9880d681SAndroid Build Coastguard Worker } 1919*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 1920*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vector_fpclass<opc, OpcodeStr, OpNode, _.info128, "{x}", 1921*9880d681SAndroid Build Coastguard Worker broadcast>, EVEX_V128; 1922*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vector_fpclass<opc, OpcodeStr, OpNode, _.info256, "{y}", 1923*9880d681SAndroid Build Coastguard Worker broadcast>, EVEX_V256; 1924*9880d681SAndroid Build Coastguard Worker } 1925*9880d681SAndroid Build Coastguard Worker} 1926*9880d681SAndroid Build Coastguard Worker 1927*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_fpclass_all<string OpcodeStr, bits<8> opcVec, 1928*9880d681SAndroid Build Coastguard Worker bits<8> opcScalar, SDNode VecOpNode, SDNode ScalarOpNode, Predicate prd>{ 1929*9880d681SAndroid Build Coastguard Worker defm PS : avx512_vector_fpclass_all<OpcodeStr, avx512vl_f32_info, opcVec, 1930*9880d681SAndroid Build Coastguard Worker VecOpNode, prd, "{l}">, EVEX_CD8<32, CD8VF>; 1931*9880d681SAndroid Build Coastguard Worker defm PD : avx512_vector_fpclass_all<OpcodeStr, avx512vl_f64_info, opcVec, 1932*9880d681SAndroid Build Coastguard Worker VecOpNode, prd, "{q}">,EVEX_CD8<64, CD8VF> , VEX_W; 1933*9880d681SAndroid Build Coastguard Worker defm SS : avx512_scalar_fpclass<opcScalar, OpcodeStr, ScalarOpNode, 1934*9880d681SAndroid Build Coastguard Worker f32x_info, prd>, EVEX_CD8<32, CD8VT1>; 1935*9880d681SAndroid Build Coastguard Worker defm SD : avx512_scalar_fpclass<opcScalar, OpcodeStr, ScalarOpNode, 1936*9880d681SAndroid Build Coastguard Worker f64x_info, prd>, EVEX_CD8<64, CD8VT1>, VEX_W; 1937*9880d681SAndroid Build Coastguard Worker} 1938*9880d681SAndroid Build Coastguard Worker 1939*9880d681SAndroid Build Coastguard Workerdefm VFPCLASS : avx512_fp_fpclass_all<"vfpclass", 0x66, 0x67, X86Vfpclass, 1940*9880d681SAndroid Build Coastguard Worker X86Vfpclasss, HasDQI>, AVX512AIi8Base,EVEX; 1941*9880d681SAndroid Build Coastguard Worker 1942*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------- 1943*9880d681SAndroid Build Coastguard Worker// Mask register copy, including 1944*9880d681SAndroid Build Coastguard Worker// - copy between mask registers 1945*9880d681SAndroid Build Coastguard Worker// - load/store mask registers 1946*9880d681SAndroid Build Coastguard Worker// - copy from GPR to mask register and vice versa 1947*9880d681SAndroid Build Coastguard Worker// 1948*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_mov<bits<8> opc_kk, bits<8> opc_km, bits<8> opc_mk, 1949*9880d681SAndroid Build Coastguard Worker string OpcodeStr, RegisterClass KRC, 1950*9880d681SAndroid Build Coastguard Worker ValueType vvt, X86MemOperand x86memop> { 1951*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in 1952*9880d681SAndroid Build Coastguard Worker def kk : I<opc_kk, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src), 1953*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>; 1954*9880d681SAndroid Build Coastguard Worker def km : I<opc_km, MRMSrcMem, (outs KRC:$dst), (ins x86memop:$src), 1955*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 1956*9880d681SAndroid Build Coastguard Worker [(set KRC:$dst, (vvt (load addr:$src)))]>; 1957*9880d681SAndroid Build Coastguard Worker def mk : I<opc_mk, MRMDestMem, (outs), (ins x86memop:$dst, KRC:$src), 1958*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 1959*9880d681SAndroid Build Coastguard Worker [(store KRC:$src, addr:$dst)]>; 1960*9880d681SAndroid Build Coastguard Worker} 1961*9880d681SAndroid Build Coastguard Worker 1962*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_mov_gpr<bits<8> opc_kr, bits<8> opc_rk, 1963*9880d681SAndroid Build Coastguard Worker string OpcodeStr, 1964*9880d681SAndroid Build Coastguard Worker RegisterClass KRC, RegisterClass GRC> { 1965*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in { 1966*9880d681SAndroid Build Coastguard Worker def kr : I<opc_kr, MRMSrcReg, (outs KRC:$dst), (ins GRC:$src), 1967*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>; 1968*9880d681SAndroid Build Coastguard Worker def rk : I<opc_rk, MRMSrcReg, (outs GRC:$dst), (ins KRC:$src), 1969*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>; 1970*9880d681SAndroid Build Coastguard Worker } 1971*9880d681SAndroid Build Coastguard Worker} 1972*9880d681SAndroid Build Coastguard Worker 1973*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDQI] in 1974*9880d681SAndroid Build Coastguard Worker defm KMOVB : avx512_mask_mov<0x90, 0x90, 0x91, "kmovb", VK8, v8i1, i8mem>, 1975*9880d681SAndroid Build Coastguard Worker avx512_mask_mov_gpr<0x92, 0x93, "kmovb", VK8, GR32>, 1976*9880d681SAndroid Build Coastguard Worker VEX, PD; 1977*9880d681SAndroid Build Coastguard Worker 1978*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in 1979*9880d681SAndroid Build Coastguard Worker defm KMOVW : avx512_mask_mov<0x90, 0x90, 0x91, "kmovw", VK16, v16i1, i16mem>, 1980*9880d681SAndroid Build Coastguard Worker avx512_mask_mov_gpr<0x92, 0x93, "kmovw", VK16, GR32>, 1981*9880d681SAndroid Build Coastguard Worker VEX, PS; 1982*9880d681SAndroid Build Coastguard Worker 1983*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in { 1984*9880d681SAndroid Build Coastguard Worker defm KMOVD : avx512_mask_mov<0x90, 0x90, 0x91, "kmovd", VK32, v32i1,i32mem>, 1985*9880d681SAndroid Build Coastguard Worker VEX, PD, VEX_W; 1986*9880d681SAndroid Build Coastguard Worker defm KMOVD : avx512_mask_mov_gpr<0x92, 0x93, "kmovd", VK32, GR32>, 1987*9880d681SAndroid Build Coastguard Worker VEX, XD; 1988*9880d681SAndroid Build Coastguard Worker defm KMOVQ : avx512_mask_mov<0x90, 0x90, 0x91, "kmovq", VK64, v64i1, i64mem>, 1989*9880d681SAndroid Build Coastguard Worker VEX, PS, VEX_W; 1990*9880d681SAndroid Build Coastguard Worker defm KMOVQ : avx512_mask_mov_gpr<0x92, 0x93, "kmovq", VK64, GR64>, 1991*9880d681SAndroid Build Coastguard Worker VEX, XD, VEX_W; 1992*9880d681SAndroid Build Coastguard Worker} 1993*9880d681SAndroid Build Coastguard Worker 1994*9880d681SAndroid Build Coastguard Worker// GR from/to mask register 1995*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDQI] in { 1996*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i1 (bitconvert (i8 GR8:$src))), 1997*9880d681SAndroid Build Coastguard Worker (KMOVBkr (SUBREG_TO_REG (i32 0), GR8:$src, sub_8bit))>; 1998*9880d681SAndroid Build Coastguard Worker def : Pat<(i8 (bitconvert (v8i1 VK8:$src))), 1999*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (KMOVBrk VK8:$src), sub_8bit)>; 2000*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (zext (i8 (bitconvert (v8i1 VK8:$src))))), 2001*9880d681SAndroid Build Coastguard Worker (KMOVBrk VK8:$src)>; 2002*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (anyext (i8 (bitconvert (v8i1 VK8:$src))))), 2003*9880d681SAndroid Build Coastguard Worker (KMOVBrk VK8:$src)>; 2004*9880d681SAndroid Build Coastguard Worker} 2005*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 2006*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i1 (bitconvert (i16 GR16:$src))), 2007*9880d681SAndroid Build Coastguard Worker (KMOVWkr (SUBREG_TO_REG (i32 0), GR16:$src, sub_16bit))>; 2008*9880d681SAndroid Build Coastguard Worker def : Pat<(i16 (bitconvert (v16i1 VK16:$src))), 2009*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (KMOVWrk VK16:$src), sub_16bit)>; 2010*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (zext (i16 (bitconvert (v16i1 VK16:$src))))), 2011*9880d681SAndroid Build Coastguard Worker (KMOVWrk VK16:$src)>; 2012*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (anyext (i16 (bitconvert (v16i1 VK16:$src))))), 2013*9880d681SAndroid Build Coastguard Worker (KMOVWrk VK16:$src)>; 2014*9880d681SAndroid Build Coastguard Worker} 2015*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in { 2016*9880d681SAndroid Build Coastguard Worker def : Pat<(v32i1 (bitconvert (i32 GR32:$src))), (KMOVDkr GR32:$src)>; 2017*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (bitconvert (v32i1 VK32:$src))), (KMOVDrk VK32:$src)>; 2018*9880d681SAndroid Build Coastguard Worker} 2019*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in { 2020*9880d681SAndroid Build Coastguard Worker def : Pat<(v64i1 (bitconvert (i64 GR64:$src))), (KMOVQkr GR64:$src)>; 2021*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (bitconvert (v64i1 VK64:$src))), (KMOVQrk VK64:$src)>; 2022*9880d681SAndroid Build Coastguard Worker} 2023*9880d681SAndroid Build Coastguard Worker 2024*9880d681SAndroid Build Coastguard Worker// Load/store kreg 2025*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDQI] in { 2026*9880d681SAndroid Build Coastguard Worker def : Pat<(store (i8 (bitconvert (v8i1 VK8:$src))), addr:$dst), 2027*9880d681SAndroid Build Coastguard Worker (KMOVBmk addr:$dst, VK8:$src)>; 2028*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i1 (bitconvert (i8 (load addr:$src)))), 2029*9880d681SAndroid Build Coastguard Worker (KMOVBkm addr:$src)>; 2030*9880d681SAndroid Build Coastguard Worker 2031*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK4:$src, addr:$dst), 2032*9880d681SAndroid Build Coastguard Worker (KMOVBmk addr:$dst, (COPY_TO_REGCLASS VK4:$src, VK8))>; 2033*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK2:$src, addr:$dst), 2034*9880d681SAndroid Build Coastguard Worker (KMOVBmk addr:$dst, (COPY_TO_REGCLASS VK2:$src, VK8))>; 2035*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK1:$src, addr:$dst), 2036*9880d681SAndroid Build Coastguard Worker (KMOVBmk addr:$dst, (COPY_TO_REGCLASS VK1:$src, VK8))>; 2037*9880d681SAndroid Build Coastguard Worker 2038*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i1 (load addr:$src)), 2039*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KMOVBkm addr:$src), VK2)>; 2040*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i1 (load addr:$src)), 2041*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KMOVBkm addr:$src), VK4)>; 2042*9880d681SAndroid Build Coastguard Worker} 2043*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512, NoDQI] in { 2044*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK1:$src, addr:$dst), 2045*9880d681SAndroid Build Coastguard Worker (MOV8mr addr:$dst, 2046*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (KMOVWrk (COPY_TO_REGCLASS VK1:$src, VK16)), 2047*9880d681SAndroid Build Coastguard Worker sub_8bit))>; 2048*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK2:$src, addr:$dst), 2049*9880d681SAndroid Build Coastguard Worker (MOV8mr addr:$dst, 2050*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (KMOVWrk (COPY_TO_REGCLASS VK2:$src, VK16)), 2051*9880d681SAndroid Build Coastguard Worker sub_8bit))>; 2052*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK4:$src, addr:$dst), 2053*9880d681SAndroid Build Coastguard Worker (MOV8mr addr:$dst, 2054*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (KMOVWrk (COPY_TO_REGCLASS VK4:$src, VK16)), 2055*9880d681SAndroid Build Coastguard Worker sub_8bit))>; 2056*9880d681SAndroid Build Coastguard Worker def : Pat<(store VK8:$src, addr:$dst), 2057*9880d681SAndroid Build Coastguard Worker (MOV8mr addr:$dst, 2058*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (KMOVWrk (COPY_TO_REGCLASS VK8:$src, VK16)), 2059*9880d681SAndroid Build Coastguard Worker sub_8bit))>; 2060*9880d681SAndroid Build Coastguard Worker 2061*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i1 (load addr:$src)), 2062*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (MOVZX32rm8 addr:$src), VK8)>; 2063*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i1 (load addr:$src)), 2064*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (MOVZX32rm8 addr:$src), VK2)>; 2065*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i1 (load addr:$src)), 2066*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (MOVZX32rm8 addr:$src), VK4)>; 2067*9880d681SAndroid Build Coastguard Worker} 2068*9880d681SAndroid Build Coastguard Worker 2069*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 2070*9880d681SAndroid Build Coastguard Worker def : Pat<(store (i16 (bitconvert (v16i1 VK16:$src))), addr:$dst), 2071*9880d681SAndroid Build Coastguard Worker (KMOVWmk addr:$dst, VK16:$src)>; 2072*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (load addr:$src)), 2073*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (AND32ri8 (MOVZX32rm8 addr:$src), (i32 1)), VK1)>; 2074*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i1 (bitconvert (i16 (load addr:$src)))), 2075*9880d681SAndroid Build Coastguard Worker (KMOVWkm addr:$src)>; 2076*9880d681SAndroid Build Coastguard Worker} 2077*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in { 2078*9880d681SAndroid Build Coastguard Worker def : Pat<(store (i32 (bitconvert (v32i1 VK32:$src))), addr:$dst), 2079*9880d681SAndroid Build Coastguard Worker (KMOVDmk addr:$dst, VK32:$src)>; 2080*9880d681SAndroid Build Coastguard Worker def : Pat<(v32i1 (bitconvert (i32 (load addr:$src)))), 2081*9880d681SAndroid Build Coastguard Worker (KMOVDkm addr:$src)>; 2082*9880d681SAndroid Build Coastguard Worker def : Pat<(store (i64 (bitconvert (v64i1 VK64:$src))), addr:$dst), 2083*9880d681SAndroid Build Coastguard Worker (KMOVQmk addr:$dst, VK64:$src)>; 2084*9880d681SAndroid Build Coastguard Worker def : Pat<(v64i1 (bitconvert (i64 (load addr:$src)))), 2085*9880d681SAndroid Build Coastguard Worker (KMOVQkm addr:$src)>; 2086*9880d681SAndroid Build Coastguard Worker} 2087*9880d681SAndroid Build Coastguard Worker 2088*9880d681SAndroid Build Coastguard Workerdef assertzext_i1 : PatFrag<(ops node:$src), (assertzext node:$src), [{ 2089*9880d681SAndroid Build Coastguard Worker return cast<VTSDNode>(N->getOperand(1))->getVT() == MVT::i1; 2090*9880d681SAndroid Build Coastguard Worker}]>; 2091*9880d681SAndroid Build Coastguard Worker 2092*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 2093*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i64 GR64:$src))), 2094*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (i16 (EXTRACT_SUBREG (AND64ri8 $src, (i64 1)), 2095*9880d681SAndroid Build Coastguard Worker sub_16bit)), VK1)>; 2096*9880d681SAndroid Build Coastguard Worker 2097*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i64 (assertzext_i1 GR64:$src)))), 2098*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (i16 (EXTRACT_SUBREG $src, sub_16bit)), VK1)>; 2099*9880d681SAndroid Build Coastguard Worker 2100*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i32 GR32:$src))), 2101*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (i16 (EXTRACT_SUBREG (AND32ri8 $src, (i32 1)), 2102*9880d681SAndroid Build Coastguard Worker sub_16bit)), VK1)>; 2103*9880d681SAndroid Build Coastguard Worker 2104*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i32 (assertzext_i1 GR32:$src)))), 2105*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (i16 (EXTRACT_SUBREG $src, sub_16bit)), VK1)>; 2106*9880d681SAndroid Build Coastguard Worker 2107*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i8 GR8:$src))), 2108*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (i16 (SUBREG_TO_REG (i64 0), (AND8ri8 $src, (i8 1)), 2109*9880d681SAndroid Build Coastguard Worker sub_8bit)), VK1)>; 2110*9880d681SAndroid Build Coastguard Worker 2111*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i8 (assertzext_i1 GR8:$src)))), 2112*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (i16 (SUBREG_TO_REG (i64 0), $src, sub_8bit)), VK1)>; 2113*9880d681SAndroid Build Coastguard Worker 2114*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i16 GR16:$src))), 2115*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (AND16ri GR16:$src, (i16 1)), VK1)>; 2116*9880d681SAndroid Build Coastguard Worker 2117*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (trunc (i16 (assertzext_i1 GR16:$src)))), 2118*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS $src, VK1)>; 2119*9880d681SAndroid Build Coastguard Worker 2120*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (zext VK1:$src)), 2121*9880d681SAndroid Build Coastguard Worker (i32 (SUBREG_TO_REG (i64 0), (i16 (COPY_TO_REGCLASS $src, GR16)), 2122*9880d681SAndroid Build Coastguard Worker sub_16bit))>; 2123*9880d681SAndroid Build Coastguard Worker 2124*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (anyext VK1:$src)), 2125*9880d681SAndroid Build Coastguard Worker (i32 (SUBREG_TO_REG (i64 0), (i16 (COPY_TO_REGCLASS $src, GR16)), 2126*9880d681SAndroid Build Coastguard Worker sub_16bit))>; 2127*9880d681SAndroid Build Coastguard Worker 2128*9880d681SAndroid Build Coastguard Worker def : Pat<(i8 (zext VK1:$src)), 2129*9880d681SAndroid Build Coastguard Worker (i8 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS VK1:$src, GR16)), sub_8bit))>; 2130*9880d681SAndroid Build Coastguard Worker 2131*9880d681SAndroid Build Coastguard Worker def : Pat<(i8 (anyext VK1:$src)), 2132*9880d681SAndroid Build Coastguard Worker (i8 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS $src, GR16)), sub_8bit))>; 2133*9880d681SAndroid Build Coastguard Worker 2134*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (zext VK1:$src)), 2135*9880d681SAndroid Build Coastguard Worker (i64 (SUBREG_TO_REG (i64 0), (i16 (COPY_TO_REGCLASS $src, GR16)), 2136*9880d681SAndroid Build Coastguard Worker sub_16bit))>; 2137*9880d681SAndroid Build Coastguard Worker 2138*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (anyext VK1:$src)), 2139*9880d681SAndroid Build Coastguard Worker (i64 (SUBREG_TO_REG (i64 0), (i16 (COPY_TO_REGCLASS $src, GR16)), 2140*9880d681SAndroid Build Coastguard Worker sub_16bit))>; 2141*9880d681SAndroid Build Coastguard Worker 2142*9880d681SAndroid Build Coastguard Worker def : Pat<(i16 (zext VK1:$src)), 2143*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS $src, GR16)>; 2144*9880d681SAndroid Build Coastguard Worker 2145*9880d681SAndroid Build Coastguard Worker def : Pat<(i16 (anyext VK1:$src)), 2146*9880d681SAndroid Build Coastguard Worker (i16 (COPY_TO_REGCLASS $src, GR16))>; 2147*9880d681SAndroid Build Coastguard Worker} 2148*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i1 (scalar_to_vector VK1:$src)), 2149*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src, VK16)>; 2150*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (scalar_to_vector VK1:$src)), 2151*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src, VK8)>; 2152*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (scalar_to_vector VK1:$src)), 2153*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src, VK4)>; 2154*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i1 (scalar_to_vector VK1:$src)), 2155*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src, VK2)>; 2156*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i1 (scalar_to_vector VK1:$src)), 2157*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src, VK32)>; 2158*9880d681SAndroid Build Coastguard Workerdef : Pat<(v64i1 (scalar_to_vector VK1:$src)), 2159*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src, VK64)>; 2160*9880d681SAndroid Build Coastguard Worker 2161*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (i1 -1), addr:$dst), (MOV8mi addr:$dst, (i8 1))>; 2162*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (i1 1), addr:$dst), (MOV8mi addr:$dst, (i8 1))>; 2163*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (i1 0), addr:$dst), (MOV8mi addr:$dst, (i8 0))>; 2164*9880d681SAndroid Build Coastguard Worker 2165*9880d681SAndroid Build Coastguard Worker// With AVX-512 only, 8-bit mask is promoted to 16-bit mask. 2166*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512, NoDQI] in { 2167*9880d681SAndroid Build Coastguard Worker // GR from/to 8-bit mask without native support 2168*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i1 (bitconvert (i8 GR8:$src))), 2169*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 2170*9880d681SAndroid Build Coastguard Worker (KMOVWkr (SUBREG_TO_REG (i32 0), GR8:$src, sub_8bit)), VK8)>; 2171*9880d681SAndroid Build Coastguard Worker def : Pat<(i8 (bitconvert (v8i1 VK8:$src))), 2172*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 2173*9880d681SAndroid Build Coastguard Worker (KMOVWrk (COPY_TO_REGCLASS VK8:$src, VK16)), 2174*9880d681SAndroid Build Coastguard Worker sub_8bit)>; 2175*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (zext (i8 (bitconvert (v8i1 VK8:$src))))), 2176*9880d681SAndroid Build Coastguard Worker (KMOVWrk (COPY_TO_REGCLASS VK8:$src, VK16))>; 2177*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (anyext (i8 (bitconvert (v8i1 VK8:$src))))), 2178*9880d681SAndroid Build Coastguard Worker (KMOVWrk (COPY_TO_REGCLASS VK8:$src, VK16))>; 2179*9880d681SAndroid Build Coastguard Worker} 2180*9880d681SAndroid Build Coastguard Worker 2181*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 2182*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (X86Vextract VK16:$src, (iPTR 0))), 2183*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK16:$src, VK1)>; 2184*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (X86Vextract VK8:$src, (iPTR 0))), 2185*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK8:$src, VK1)>; 2186*9880d681SAndroid Build Coastguard Worker} 2187*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in { 2188*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (X86Vextract VK32:$src, (iPTR 0))), 2189*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK32:$src, VK1)>; 2190*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 (X86Vextract VK64:$src, (iPTR 0))), 2191*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK64:$src, VK1)>; 2192*9880d681SAndroid Build Coastguard Worker} 2193*9880d681SAndroid Build Coastguard Worker 2194*9880d681SAndroid Build Coastguard Worker// Mask unary operation 2195*9880d681SAndroid Build Coastguard Worker// - KNOT 2196*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_unop<bits<8> opc, string OpcodeStr, 2197*9880d681SAndroid Build Coastguard Worker RegisterClass KRC, SDPatternOperator OpNode, 2198*9880d681SAndroid Build Coastguard Worker Predicate prd> { 2199*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 2200*9880d681SAndroid Build Coastguard Worker def rr : I<opc, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src), 2201*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 2202*9880d681SAndroid Build Coastguard Worker [(set KRC:$dst, (OpNode KRC:$src))]>; 2203*9880d681SAndroid Build Coastguard Worker} 2204*9880d681SAndroid Build Coastguard Worker 2205*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_unop_all<bits<8> opc, string OpcodeStr, 2206*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode> { 2207*9880d681SAndroid Build Coastguard Worker defm B : avx512_mask_unop<opc, !strconcat(OpcodeStr, "b"), VK8, OpNode, 2208*9880d681SAndroid Build Coastguard Worker HasDQI>, VEX, PD; 2209*9880d681SAndroid Build Coastguard Worker defm W : avx512_mask_unop<opc, !strconcat(OpcodeStr, "w"), VK16, OpNode, 2210*9880d681SAndroid Build Coastguard Worker HasAVX512>, VEX, PS; 2211*9880d681SAndroid Build Coastguard Worker defm D : avx512_mask_unop<opc, !strconcat(OpcodeStr, "d"), VK32, OpNode, 2212*9880d681SAndroid Build Coastguard Worker HasBWI>, VEX, PD, VEX_W; 2213*9880d681SAndroid Build Coastguard Worker defm Q : avx512_mask_unop<opc, !strconcat(OpcodeStr, "q"), VK64, OpNode, 2214*9880d681SAndroid Build Coastguard Worker HasBWI>, VEX, PS, VEX_W; 2215*9880d681SAndroid Build Coastguard Worker} 2216*9880d681SAndroid Build Coastguard Worker 2217*9880d681SAndroid Build Coastguard Workerdefm KNOT : avx512_mask_unop_all<0x44, "knot", not>; 2218*9880d681SAndroid Build Coastguard Worker 2219*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_unop_int<string IntName, string InstName> { 2220*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 2221*9880d681SAndroid Build Coastguard Worker def : Pat<(!cast<Intrinsic>("int_x86_avx512_"##IntName##"_w") 2222*9880d681SAndroid Build Coastguard Worker (i16 GR16:$src)), 2223*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (!cast<Instruction>(InstName##"Wrr") 2224*9880d681SAndroid Build Coastguard Worker (v16i1 (COPY_TO_REGCLASS GR16:$src, VK16))), GR16)>; 2225*9880d681SAndroid Build Coastguard Worker} 2226*9880d681SAndroid Build Coastguard Workerdefm : avx512_mask_unop_int<"knot", "KNOT">; 2227*9880d681SAndroid Build Coastguard Worker 2228*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDQI] in 2229*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK8:$src1, (v8i1 immAllOnesV)), (KNOTBrr VK8:$src1)>; 2230*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in 2231*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK16:$src1, (v16i1 immAllOnesV)), (KNOTWrr VK16:$src1)>; 2232*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in 2233*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK32:$src1, (v32i1 immAllOnesV)), (KNOTDrr VK32:$src1)>; 2234*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in 2235*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK64:$src1, (v64i1 immAllOnesV)), (KNOTQrr VK64:$src1)>; 2236*9880d681SAndroid Build Coastguard Worker 2237*9880d681SAndroid Build Coastguard Worker// KNL does not support KMOVB, 8-bit mask is promoted to 16-bit 2238*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512, NoDQI] in { 2239*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK8:$src1, (v8i1 immAllOnesV)), 2240*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KNOTWrr (COPY_TO_REGCLASS VK8:$src1, VK16)), VK8)>; 2241*9880d681SAndroid Build Coastguard Workerdef : Pat<(not VK8:$src), 2242*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 2243*9880d681SAndroid Build Coastguard Worker (KNOTWrr (COPY_TO_REGCLASS VK8:$src, VK16)), VK8)>; 2244*9880d681SAndroid Build Coastguard Worker} 2245*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK4:$src1, (v4i1 immAllOnesV)), 2246*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KNOTWrr (COPY_TO_REGCLASS VK4:$src1, VK16)), VK4)>; 2247*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor VK2:$src1, (v2i1 immAllOnesV)), 2248*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KNOTWrr (COPY_TO_REGCLASS VK2:$src1, VK16)), VK2)>; 2249*9880d681SAndroid Build Coastguard Worker 2250*9880d681SAndroid Build Coastguard Worker// Mask binary operation 2251*9880d681SAndroid Build Coastguard Worker// - KAND, KANDN, KOR, KXNOR, KXOR 2252*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_binop<bits<8> opc, string OpcodeStr, 2253*9880d681SAndroid Build Coastguard Worker RegisterClass KRC, SDPatternOperator OpNode, 2254*9880d681SAndroid Build Coastguard Worker Predicate prd, bit IsCommutable> { 2255*9880d681SAndroid Build Coastguard Worker let Predicates = [prd], isCommutable = IsCommutable in 2256*9880d681SAndroid Build Coastguard Worker def rr : I<opc, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src1, KRC:$src2), 2257*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 2258*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 2259*9880d681SAndroid Build Coastguard Worker [(set KRC:$dst, (OpNode KRC:$src1, KRC:$src2))]>; 2260*9880d681SAndroid Build Coastguard Worker} 2261*9880d681SAndroid Build Coastguard Worker 2262*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_binop_all<bits<8> opc, string OpcodeStr, 2263*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, bit IsCommutable, 2264*9880d681SAndroid Build Coastguard Worker Predicate prdW = HasAVX512> { 2265*9880d681SAndroid Build Coastguard Worker defm B : avx512_mask_binop<opc, !strconcat(OpcodeStr, "b"), VK8, OpNode, 2266*9880d681SAndroid Build Coastguard Worker HasDQI, IsCommutable>, VEX_4V, VEX_L, PD; 2267*9880d681SAndroid Build Coastguard Worker defm W : avx512_mask_binop<opc, !strconcat(OpcodeStr, "w"), VK16, OpNode, 2268*9880d681SAndroid Build Coastguard Worker prdW, IsCommutable>, VEX_4V, VEX_L, PS; 2269*9880d681SAndroid Build Coastguard Worker defm D : avx512_mask_binop<opc, !strconcat(OpcodeStr, "d"), VK32, OpNode, 2270*9880d681SAndroid Build Coastguard Worker HasBWI, IsCommutable>, VEX_4V, VEX_L, VEX_W, PD; 2271*9880d681SAndroid Build Coastguard Worker defm Q : avx512_mask_binop<opc, !strconcat(OpcodeStr, "q"), VK64, OpNode, 2272*9880d681SAndroid Build Coastguard Worker HasBWI, IsCommutable>, VEX_4V, VEX_L, VEX_W, PS; 2273*9880d681SAndroid Build Coastguard Worker} 2274*9880d681SAndroid Build Coastguard Worker 2275*9880d681SAndroid Build Coastguard Workerdef andn : PatFrag<(ops node:$i0, node:$i1), (and (not node:$i0), node:$i1)>; 2276*9880d681SAndroid Build Coastguard Workerdef xnor : PatFrag<(ops node:$i0, node:$i1), (not (xor node:$i0, node:$i1))>; 2277*9880d681SAndroid Build Coastguard Worker 2278*9880d681SAndroid Build Coastguard Workerdefm KAND : avx512_mask_binop_all<0x41, "kand", and, 1>; 2279*9880d681SAndroid Build Coastguard Workerdefm KOR : avx512_mask_binop_all<0x45, "kor", or, 1>; 2280*9880d681SAndroid Build Coastguard Workerdefm KXNOR : avx512_mask_binop_all<0x46, "kxnor", xnor, 1>; 2281*9880d681SAndroid Build Coastguard Workerdefm KXOR : avx512_mask_binop_all<0x47, "kxor", xor, 1>; 2282*9880d681SAndroid Build Coastguard Workerdefm KANDN : avx512_mask_binop_all<0x42, "kandn", andn, 0>; 2283*9880d681SAndroid Build Coastguard Workerdefm KADD : avx512_mask_binop_all<0x4A, "kadd", add, 1, HasDQI>; 2284*9880d681SAndroid Build Coastguard Worker 2285*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_binop_int<string IntName, string InstName> { 2286*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 2287*9880d681SAndroid Build Coastguard Worker def : Pat<(!cast<Intrinsic>("int_x86_avx512_"##IntName##"_w") 2288*9880d681SAndroid Build Coastguard Worker (i16 GR16:$src1), (i16 GR16:$src2)), 2289*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (!cast<Instruction>(InstName##"Wrr") 2290*9880d681SAndroid Build Coastguard Worker (v16i1 (COPY_TO_REGCLASS GR16:$src1, VK16)), 2291*9880d681SAndroid Build Coastguard Worker (v16i1 (COPY_TO_REGCLASS GR16:$src2, VK16))), GR16)>; 2292*9880d681SAndroid Build Coastguard Worker} 2293*9880d681SAndroid Build Coastguard Worker 2294*9880d681SAndroid Build Coastguard Workerdefm : avx512_mask_binop_int<"kand", "KAND">; 2295*9880d681SAndroid Build Coastguard Workerdefm : avx512_mask_binop_int<"kandn", "KANDN">; 2296*9880d681SAndroid Build Coastguard Workerdefm : avx512_mask_binop_int<"kor", "KOR">; 2297*9880d681SAndroid Build Coastguard Workerdefm : avx512_mask_binop_int<"kxnor", "KXNOR">; 2298*9880d681SAndroid Build Coastguard Workerdefm : avx512_mask_binop_int<"kxor", "KXOR">; 2299*9880d681SAndroid Build Coastguard Worker 2300*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_pat<SDPatternOperator OpNode, Instruction Inst> { 2301*9880d681SAndroid Build Coastguard Worker // With AVX512F, 8-bit mask is promoted to 16-bit mask, 2302*9880d681SAndroid Build Coastguard Worker // for the DQI set, this type is legal and KxxxB instruction is used 2303*9880d681SAndroid Build Coastguard Worker let Predicates = [NoDQI] in 2304*9880d681SAndroid Build Coastguard Worker def : Pat<(OpNode VK8:$src1, VK8:$src2), 2305*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 2306*9880d681SAndroid Build Coastguard Worker (Inst (COPY_TO_REGCLASS VK8:$src1, VK16), 2307*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK8:$src2, VK16)), VK8)>; 2308*9880d681SAndroid Build Coastguard Worker 2309*9880d681SAndroid Build Coastguard Worker // All types smaller than 8 bits require conversion anyway 2310*9880d681SAndroid Build Coastguard Worker def : Pat<(OpNode VK1:$src1, VK1:$src2), 2311*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (Inst 2312*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src1, VK16), 2313*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src2, VK16)), VK1)>; 2314*9880d681SAndroid Build Coastguard Worker def : Pat<(OpNode VK2:$src1, VK2:$src2), 2315*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (Inst 2316*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK2:$src1, VK16), 2317*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK2:$src2, VK16)), VK1)>; 2318*9880d681SAndroid Build Coastguard Worker def : Pat<(OpNode VK4:$src1, VK4:$src2), 2319*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (Inst 2320*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK4:$src1, VK16), 2321*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK4:$src2, VK16)), VK1)>; 2322*9880d681SAndroid Build Coastguard Worker} 2323*9880d681SAndroid Build Coastguard Worker 2324*9880d681SAndroid Build Coastguard Workerdefm : avx512_binop_pat<and, KANDWrr>; 2325*9880d681SAndroid Build Coastguard Workerdefm : avx512_binop_pat<andn, KANDNWrr>; 2326*9880d681SAndroid Build Coastguard Workerdefm : avx512_binop_pat<or, KORWrr>; 2327*9880d681SAndroid Build Coastguard Workerdefm : avx512_binop_pat<xnor, KXNORWrr>; 2328*9880d681SAndroid Build Coastguard Workerdefm : avx512_binop_pat<xor, KXORWrr>; 2329*9880d681SAndroid Build Coastguard Worker 2330*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK16:$src1, VK16:$src2), (v16i1 immAllOnesV)), 2331*9880d681SAndroid Build Coastguard Worker (KXNORWrr VK16:$src1, VK16:$src2)>; 2332*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK8:$src1, VK8:$src2), (v8i1 immAllOnesV)), 2333*9880d681SAndroid Build Coastguard Worker (KXNORBrr VK8:$src1, VK8:$src2)>, Requires<[HasDQI]>; 2334*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK32:$src1, VK32:$src2), (v32i1 immAllOnesV)), 2335*9880d681SAndroid Build Coastguard Worker (KXNORDrr VK32:$src1, VK32:$src2)>, Requires<[HasBWI]>; 2336*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK64:$src1, VK64:$src2), (v64i1 immAllOnesV)), 2337*9880d681SAndroid Build Coastguard Worker (KXNORQrr VK64:$src1, VK64:$src2)>, Requires<[HasBWI]>; 2338*9880d681SAndroid Build Coastguard Worker 2339*9880d681SAndroid Build Coastguard Workerlet Predicates = [NoDQI] in 2340*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK8:$src1, VK8:$src2), (v8i1 immAllOnesV)), 2341*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KXNORWrr (COPY_TO_REGCLASS VK8:$src1, VK16), 2342*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK8:$src2, VK16)), VK8)>; 2343*9880d681SAndroid Build Coastguard Worker 2344*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK4:$src1, VK4:$src2), (v4i1 immAllOnesV)), 2345*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KXNORWrr (COPY_TO_REGCLASS VK4:$src1, VK16), 2346*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK4:$src2, VK16)), VK4)>; 2347*9880d681SAndroid Build Coastguard Worker 2348*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK2:$src1, VK2:$src2), (v2i1 immAllOnesV)), 2349*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KXNORWrr (COPY_TO_REGCLASS VK2:$src1, VK16), 2350*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK2:$src2, VK16)), VK2)>; 2351*9880d681SAndroid Build Coastguard Worker 2352*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (xor VK1:$src1, VK1:$src2), (i1 1)), 2353*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (KXNORWrr (COPY_TO_REGCLASS VK1:$src1, VK16), 2354*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VK1:$src2, VK16)), VK1)>; 2355*9880d681SAndroid Build Coastguard Worker 2356*9880d681SAndroid Build Coastguard Worker// Mask unpacking 2357*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_unpck<string Suffix,RegisterClass KRC, ValueType VT, 2358*9880d681SAndroid Build Coastguard Worker RegisterClass KRCSrc, Predicate prd> { 2359*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 2360*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in 2361*9880d681SAndroid Build Coastguard Worker def rr : I<0x4b, MRMSrcReg, (outs KRC:$dst), 2362*9880d681SAndroid Build Coastguard Worker (ins KRC:$src1, KRC:$src2), 2363*9880d681SAndroid Build Coastguard Worker "kunpck"#Suffix#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>, 2364*9880d681SAndroid Build Coastguard Worker VEX_4V, VEX_L; 2365*9880d681SAndroid Build Coastguard Worker 2366*9880d681SAndroid Build Coastguard Worker def : Pat<(VT (concat_vectors KRCSrc:$src1, KRCSrc:$src2)), 2367*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME##rr) 2368*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS KRCSrc:$src2, KRC), 2369*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS KRCSrc:$src1, KRC))>; 2370*9880d681SAndroid Build Coastguard Worker } 2371*9880d681SAndroid Build Coastguard Worker} 2372*9880d681SAndroid Build Coastguard Worker 2373*9880d681SAndroid Build Coastguard Workerdefm KUNPCKBW : avx512_mask_unpck<"bw", VK16, v16i1, VK8, HasAVX512>, PD; 2374*9880d681SAndroid Build Coastguard Workerdefm KUNPCKWD : avx512_mask_unpck<"wd", VK32, v32i1, VK16, HasBWI>, PS; 2375*9880d681SAndroid Build Coastguard Workerdefm KUNPCKDQ : avx512_mask_unpck<"dq", VK64, v64i1, VK32, HasBWI>, PS, VEX_W; 2376*9880d681SAndroid Build Coastguard Worker 2377*9880d681SAndroid Build Coastguard Worker// Mask bit testing 2378*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_testop<bits<8> opc, string OpcodeStr, RegisterClass KRC, 2379*9880d681SAndroid Build Coastguard Worker SDNode OpNode, Predicate prd> { 2380*9880d681SAndroid Build Coastguard Worker let Predicates = [prd], Defs = [EFLAGS] in 2381*9880d681SAndroid Build Coastguard Worker def rr : I<opc, MRMSrcReg, (outs), (ins KRC:$src1, KRC:$src2), 2382*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1|$src1, $src2}"), 2383*9880d681SAndroid Build Coastguard Worker [(set EFLAGS, (OpNode KRC:$src1, KRC:$src2))]>; 2384*9880d681SAndroid Build Coastguard Worker} 2385*9880d681SAndroid Build Coastguard Worker 2386*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_testop_w<bits<8> opc, string OpcodeStr, SDNode OpNode, 2387*9880d681SAndroid Build Coastguard Worker Predicate prdW = HasAVX512> { 2388*9880d681SAndroid Build Coastguard Worker defm B : avx512_mask_testop<opc, OpcodeStr#"b", VK8, OpNode, HasDQI>, 2389*9880d681SAndroid Build Coastguard Worker VEX, PD; 2390*9880d681SAndroid Build Coastguard Worker defm W : avx512_mask_testop<opc, OpcodeStr#"w", VK16, OpNode, prdW>, 2391*9880d681SAndroid Build Coastguard Worker VEX, PS; 2392*9880d681SAndroid Build Coastguard Worker defm Q : avx512_mask_testop<opc, OpcodeStr#"q", VK64, OpNode, HasBWI>, 2393*9880d681SAndroid Build Coastguard Worker VEX, PS, VEX_W; 2394*9880d681SAndroid Build Coastguard Worker defm D : avx512_mask_testop<opc, OpcodeStr#"d", VK32, OpNode, HasBWI>, 2395*9880d681SAndroid Build Coastguard Worker VEX, PD, VEX_W; 2396*9880d681SAndroid Build Coastguard Worker} 2397*9880d681SAndroid Build Coastguard Worker 2398*9880d681SAndroid Build Coastguard Workerdefm KORTEST : avx512_mask_testop_w<0x98, "kortest", X86kortest>; 2399*9880d681SAndroid Build Coastguard Workerdefm KTEST : avx512_mask_testop_w<0x99, "ktest", X86ktest, HasDQI>; 2400*9880d681SAndroid Build Coastguard Worker 2401*9880d681SAndroid Build Coastguard Worker// Mask shift 2402*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_shiftop<bits<8> opc, string OpcodeStr, RegisterClass KRC, 2403*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 2404*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 2405*9880d681SAndroid Build Coastguard Worker def ri : Ii8<opc, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src, u8imm:$imm), 2406*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 2407*9880d681SAndroid Build Coastguard Worker "\t{$imm, $src, $dst|$dst, $src, $imm}"), 2408*9880d681SAndroid Build Coastguard Worker [(set KRC:$dst, (OpNode KRC:$src, (i8 imm:$imm)))]>; 2409*9880d681SAndroid Build Coastguard Worker} 2410*9880d681SAndroid Build Coastguard Worker 2411*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_shiftop_w<bits<8> opc1, bits<8> opc2, string OpcodeStr, 2412*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 2413*9880d681SAndroid Build Coastguard Worker defm W : avx512_mask_shiftop<opc1, !strconcat(OpcodeStr, "w"), VK16, OpNode>, 2414*9880d681SAndroid Build Coastguard Worker VEX, TAPD, VEX_W; 2415*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in 2416*9880d681SAndroid Build Coastguard Worker defm B : avx512_mask_shiftop<opc1, !strconcat(OpcodeStr, "b"), VK8, OpNode>, 2417*9880d681SAndroid Build Coastguard Worker VEX, TAPD; 2418*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 2419*9880d681SAndroid Build Coastguard Worker defm Q : avx512_mask_shiftop<opc2, !strconcat(OpcodeStr, "q"), VK64, OpNode>, 2420*9880d681SAndroid Build Coastguard Worker VEX, TAPD, VEX_W; 2421*9880d681SAndroid Build Coastguard Worker defm D : avx512_mask_shiftop<opc2, !strconcat(OpcodeStr, "d"), VK32, OpNode>, 2422*9880d681SAndroid Build Coastguard Worker VEX, TAPD; 2423*9880d681SAndroid Build Coastguard Worker } 2424*9880d681SAndroid Build Coastguard Worker} 2425*9880d681SAndroid Build Coastguard Worker 2426*9880d681SAndroid Build Coastguard Workerdefm KSHIFTL : avx512_mask_shiftop_w<0x32, 0x33, "kshiftl", X86vshli>; 2427*9880d681SAndroid Build Coastguard Workerdefm KSHIFTR : avx512_mask_shiftop_w<0x30, 0x31, "kshiftr", X86vsrli>; 2428*9880d681SAndroid Build Coastguard Worker 2429*9880d681SAndroid Build Coastguard Worker// Mask setting all 0s or 1s 2430*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_setop<RegisterClass KRC, ValueType VT, PatFrag Val> { 2431*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 2432*9880d681SAndroid Build Coastguard Worker let isReMaterializable = 1, isAsCheapAsAMove = 1, isPseudo = 1 in 2433*9880d681SAndroid Build Coastguard Worker def #NAME# : I<0, Pseudo, (outs KRC:$dst), (ins), "", 2434*9880d681SAndroid Build Coastguard Worker [(set KRC:$dst, (VT Val))]>; 2435*9880d681SAndroid Build Coastguard Worker} 2436*9880d681SAndroid Build Coastguard Worker 2437*9880d681SAndroid Build Coastguard Workermulticlass avx512_mask_setop_w<PatFrag Val> { 2438*9880d681SAndroid Build Coastguard Worker defm B : avx512_mask_setop<VK8, v8i1, Val>; 2439*9880d681SAndroid Build Coastguard Worker defm W : avx512_mask_setop<VK16, v16i1, Val>; 2440*9880d681SAndroid Build Coastguard Worker defm D : avx512_mask_setop<VK32, v32i1, Val>; 2441*9880d681SAndroid Build Coastguard Worker defm Q : avx512_mask_setop<VK64, v64i1, Val>; 2442*9880d681SAndroid Build Coastguard Worker} 2443*9880d681SAndroid Build Coastguard Worker 2444*9880d681SAndroid Build Coastguard Workerdefm KSET0 : avx512_mask_setop_w<immAllZerosV>; 2445*9880d681SAndroid Build Coastguard Workerdefm KSET1 : avx512_mask_setop_w<immAllOnesV>; 2446*9880d681SAndroid Build Coastguard Worker 2447*9880d681SAndroid Build Coastguard Worker// With AVX-512 only, 8-bit mask is promoted to 16-bit mask. 2448*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 2449*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i1 immAllZerosV), (COPY_TO_REGCLASS (KSET0W), VK8)>; 2450*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i1 immAllOnesV), (COPY_TO_REGCLASS (KSET1W), VK8)>; 2451*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i1 immAllOnesV), (COPY_TO_REGCLASS (KSET1W), VK4)>; 2452*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i1 immAllOnesV), (COPY_TO_REGCLASS (KSET1W), VK2)>; 2453*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 0), (COPY_TO_REGCLASS (KSET0W), VK1)>; 2454*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 1), (COPY_TO_REGCLASS (KSHIFTRWri (KSET1W), (i8 15)), VK1)>; 2455*9880d681SAndroid Build Coastguard Worker def : Pat<(i1 -1), (COPY_TO_REGCLASS (KSHIFTRWri (KSET1W), (i8 15)), VK1)>; 2456*9880d681SAndroid Build Coastguard Worker} 2457*9880d681SAndroid Build Coastguard Worker 2458*9880d681SAndroid Build Coastguard Worker// Patterns for kmask insert_subvector/extract_subvector to/from index=0 2459*9880d681SAndroid Build Coastguard Workermulticlass operation_subvector_mask_lowering<RegisterClass subRC, ValueType subVT, 2460*9880d681SAndroid Build Coastguard Worker RegisterClass RC, ValueType VT> { 2461*9880d681SAndroid Build Coastguard Worker def : Pat<(subVT (extract_subvector (VT RC:$src), (iPTR 0))), 2462*9880d681SAndroid Build Coastguard Worker (subVT (COPY_TO_REGCLASS RC:$src, subRC))>; 2463*9880d681SAndroid Build Coastguard Worker 2464*9880d681SAndroid Build Coastguard Worker def : Pat<(VT (insert_subvector undef, subRC:$src, (iPTR 0))), 2465*9880d681SAndroid Build Coastguard Worker (VT (COPY_TO_REGCLASS subRC:$src, RC))>; 2466*9880d681SAndroid Build Coastguard Worker} 2467*9880d681SAndroid Build Coastguard Worker 2468*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK2, v2i1, VK4, v4i1>; 2469*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK2, v2i1, VK8, v8i1>; 2470*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK2, v2i1, VK16, v16i1>; 2471*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK2, v2i1, VK32, v32i1>; 2472*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK2, v2i1, VK64, v64i1>; 2473*9880d681SAndroid Build Coastguard Worker 2474*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK4, v4i1, VK8, v8i1>; 2475*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK4, v4i1, VK16, v16i1>; 2476*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK4, v4i1, VK32, v32i1>; 2477*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK4, v4i1, VK64, v64i1>; 2478*9880d681SAndroid Build Coastguard Worker 2479*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK8, v8i1, VK16, v16i1>; 2480*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK8, v8i1, VK32, v32i1>; 2481*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK8, v8i1, VK64, v64i1>; 2482*9880d681SAndroid Build Coastguard Worker 2483*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK16, v16i1, VK32, v32i1>; 2484*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK16, v16i1, VK64, v64i1>; 2485*9880d681SAndroid Build Coastguard Worker 2486*9880d681SAndroid Build Coastguard Workerdefm : operation_subvector_mask_lowering<VK32, v32i1, VK64, v64i1>; 2487*9880d681SAndroid Build Coastguard Worker 2488*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i1 (extract_subvector (v4i1 VK4:$src), (iPTR 2))), 2489*9880d681SAndroid Build Coastguard Worker (v2i1 (COPY_TO_REGCLASS 2490*9880d681SAndroid Build Coastguard Worker (KSHIFTRWri (COPY_TO_REGCLASS VK4:$src, VK16), (i8 2)), 2491*9880d681SAndroid Build Coastguard Worker VK2))>; 2492*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (extract_subvector (v8i1 VK8:$src), (iPTR 4))), 2493*9880d681SAndroid Build Coastguard Worker (v4i1 (COPY_TO_REGCLASS 2494*9880d681SAndroid Build Coastguard Worker (KSHIFTRWri (COPY_TO_REGCLASS VK8:$src, VK16), (i8 4)), 2495*9880d681SAndroid Build Coastguard Worker VK4))>; 2496*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (extract_subvector (v16i1 VK16:$src), (iPTR 8))), 2497*9880d681SAndroid Build Coastguard Worker (v8i1 (COPY_TO_REGCLASS (KSHIFTRWri VK16:$src, (i8 8)), VK8))>; 2498*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i1 (extract_subvector (v32i1 VK32:$src), (iPTR 16))), 2499*9880d681SAndroid Build Coastguard Worker (v16i1 (COPY_TO_REGCLASS (KSHIFTRDri VK32:$src, (i8 16)), VK16))>; 2500*9880d681SAndroid Build Coastguard Workerdef : Pat<(v32i1 (extract_subvector (v64i1 VK64:$src), (iPTR 32))), 2501*9880d681SAndroid Build Coastguard Worker (v32i1 (COPY_TO_REGCLASS (KSHIFTRQri VK64:$src, (i8 32)), VK32))>; 2502*9880d681SAndroid Build Coastguard Worker 2503*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i1 (X86vshli VK8:$src, (i8 imm:$imm))), 2504*9880d681SAndroid Build Coastguard Worker (v8i1 (COPY_TO_REGCLASS 2505*9880d681SAndroid Build Coastguard Worker (KSHIFTLWri (COPY_TO_REGCLASS VK8:$src, VK16), 2506*9880d681SAndroid Build Coastguard Worker (I8Imm $imm)), VK8))>, Requires<[HasAVX512, NoDQI]>; 2507*9880d681SAndroid Build Coastguard Worker 2508*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (X86vshli VK4:$src, (i8 imm:$imm))), 2509*9880d681SAndroid Build Coastguard Worker (v4i1 (COPY_TO_REGCLASS 2510*9880d681SAndroid Build Coastguard Worker (KSHIFTLWri (COPY_TO_REGCLASS VK4:$src, VK16), 2511*9880d681SAndroid Build Coastguard Worker (I8Imm $imm)), VK4))>, Requires<[HasAVX512]>; 2512*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2513*9880d681SAndroid Build Coastguard Worker// AVX-512 - Aligned and unaligned load and store 2514*9880d681SAndroid Build Coastguard Worker// 2515*9880d681SAndroid Build Coastguard Worker 2516*9880d681SAndroid Build Coastguard Worker 2517*9880d681SAndroid Build Coastguard Workermulticlass avx512_load<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 2518*9880d681SAndroid Build Coastguard Worker PatFrag ld_frag, PatFrag mload, 2519*9880d681SAndroid Build Coastguard Worker bit IsReMaterializable = 1, 2520*9880d681SAndroid Build Coastguard Worker SDPatternOperator SelectOprr = vselect> { 2521*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in { 2522*9880d681SAndroid Build Coastguard Worker def rr : AVX512PI<opc, MRMSrcReg, (outs _.RC:$dst), (ins _.RC:$src), 2523*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), [], 2524*9880d681SAndroid Build Coastguard Worker _.ExeDomain>, EVEX; 2525*9880d681SAndroid Build Coastguard Worker def rrkz : AVX512PI<opc, MRMSrcReg, (outs _.RC:$dst), 2526*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src), 2527*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, ${dst} {${mask}} {z}|", 2528*9880d681SAndroid Build Coastguard Worker "${dst} {${mask}} {z}, $src}"), 2529*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT (vselect _.KRCWM:$mask, 2530*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src), 2531*9880d681SAndroid Build Coastguard Worker _.ImmAllZerosV)))], _.ExeDomain>, 2532*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_KZ; 2533*9880d681SAndroid Build Coastguard Worker 2534*9880d681SAndroid Build Coastguard Worker let canFoldAsLoad = 1, isReMaterializable = IsReMaterializable, 2535*9880d681SAndroid Build Coastguard Worker SchedRW = [WriteLoad] in 2536*9880d681SAndroid Build Coastguard Worker def rm : AVX512PI<opc, MRMSrcMem, (outs _.RC:$dst), (ins _.MemOp:$src), 2537*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 2538*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT (bitconvert (ld_frag addr:$src))))], 2539*9880d681SAndroid Build Coastguard Worker _.ExeDomain>, EVEX; 2540*9880d681SAndroid Build Coastguard Worker 2541*9880d681SAndroid Build Coastguard Worker let Constraints = "$src0 = $dst" in { 2542*9880d681SAndroid Build Coastguard Worker def rrk : AVX512PI<opc, MRMSrcReg, (outs _.RC:$dst), 2543*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src0, _.KRCWM:$mask, _.RC:$src1), 2544*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src1, ${dst} {${mask}}|", 2545*9880d681SAndroid Build Coastguard Worker "${dst} {${mask}}, $src1}"), 2546*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT (SelectOprr _.KRCWM:$mask, 2547*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src1), 2548*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src0))))], _.ExeDomain>, 2549*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_K; 2550*9880d681SAndroid Build Coastguard Worker let SchedRW = [WriteLoad] in 2551*9880d681SAndroid Build Coastguard Worker def rmk : AVX512PI<opc, MRMSrcMem, (outs _.RC:$dst), 2552*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src0, _.KRCWM:$mask, _.MemOp:$src1), 2553*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src1, ${dst} {${mask}}|", 2554*9880d681SAndroid Build Coastguard Worker "${dst} {${mask}}, $src1}"), 2555*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT 2556*9880d681SAndroid Build Coastguard Worker (vselect _.KRCWM:$mask, 2557*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (ld_frag addr:$src1))), 2558*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src0))))], _.ExeDomain>, EVEX, EVEX_K; 2559*9880d681SAndroid Build Coastguard Worker } 2560*9880d681SAndroid Build Coastguard Worker let SchedRW = [WriteLoad] in 2561*9880d681SAndroid Build Coastguard Worker def rmkz : AVX512PI<opc, MRMSrcMem, (outs _.RC:$dst), 2562*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.MemOp:$src), 2563*9880d681SAndroid Build Coastguard Worker OpcodeStr #"\t{$src, ${dst} {${mask}} {z}|"# 2564*9880d681SAndroid Build Coastguard Worker "${dst} {${mask}} {z}, $src}", 2565*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT (vselect _.KRCWM:$mask, 2566*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (ld_frag addr:$src))), _.ImmAllZerosV)))], 2567*9880d681SAndroid Build Coastguard Worker _.ExeDomain>, EVEX, EVEX_KZ; 2568*9880d681SAndroid Build Coastguard Worker } 2569*9880d681SAndroid Build Coastguard Worker def : Pat<(_.VT (mload addr:$ptr, _.KRCWM:$mask, undef)), 2570*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#_.ZSuffix##rmkz) _.KRCWM:$mask, addr:$ptr)>; 2571*9880d681SAndroid Build Coastguard Worker 2572*9880d681SAndroid Build Coastguard Worker def : Pat<(_.VT (mload addr:$ptr, _.KRCWM:$mask, _.ImmAllZerosV)), 2573*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#_.ZSuffix##rmkz) _.KRCWM:$mask, addr:$ptr)>; 2574*9880d681SAndroid Build Coastguard Worker 2575*9880d681SAndroid Build Coastguard Worker def : Pat<(_.VT (mload addr:$ptr, _.KRCWM:$mask, (_.VT _.RC:$src0))), 2576*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#_.ZSuffix##rmk) _.RC:$src0, 2577*9880d681SAndroid Build Coastguard Worker _.KRCWM:$mask, addr:$ptr)>; 2578*9880d681SAndroid Build Coastguard Worker} 2579*9880d681SAndroid Build Coastguard Worker 2580*9880d681SAndroid Build Coastguard Workermulticlass avx512_alignedload_vl<bits<8> opc, string OpcodeStr, 2581*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, 2582*9880d681SAndroid Build Coastguard Worker Predicate prd, 2583*9880d681SAndroid Build Coastguard Worker bit IsReMaterializable = 1> { 2584*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 2585*9880d681SAndroid Build Coastguard Worker defm Z : avx512_load<opc, OpcodeStr, _.info512, _.info512.AlignedLdFrag, 2586*9880d681SAndroid Build Coastguard Worker masked_load_aligned512, IsReMaterializable>, EVEX_V512; 2587*9880d681SAndroid Build Coastguard Worker 2588*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 2589*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_load<opc, OpcodeStr, _.info256, _.info256.AlignedLdFrag, 2590*9880d681SAndroid Build Coastguard Worker masked_load_aligned256, IsReMaterializable>, EVEX_V256; 2591*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_load<opc, OpcodeStr, _.info128, _.info128.AlignedLdFrag, 2592*9880d681SAndroid Build Coastguard Worker masked_load_aligned128, IsReMaterializable>, EVEX_V128; 2593*9880d681SAndroid Build Coastguard Worker } 2594*9880d681SAndroid Build Coastguard Worker} 2595*9880d681SAndroid Build Coastguard Worker 2596*9880d681SAndroid Build Coastguard Workermulticlass avx512_load_vl<bits<8> opc, string OpcodeStr, 2597*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, 2598*9880d681SAndroid Build Coastguard Worker Predicate prd, 2599*9880d681SAndroid Build Coastguard Worker bit IsReMaterializable = 1, 2600*9880d681SAndroid Build Coastguard Worker SDPatternOperator SelectOprr = vselect> { 2601*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 2602*9880d681SAndroid Build Coastguard Worker defm Z : avx512_load<opc, OpcodeStr, _.info512, _.info512.LdFrag, 2603*9880d681SAndroid Build Coastguard Worker masked_load_unaligned, IsReMaterializable, 2604*9880d681SAndroid Build Coastguard Worker SelectOprr>, EVEX_V512; 2605*9880d681SAndroid Build Coastguard Worker 2606*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 2607*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_load<opc, OpcodeStr, _.info256, _.info256.LdFrag, 2608*9880d681SAndroid Build Coastguard Worker masked_load_unaligned, IsReMaterializable, 2609*9880d681SAndroid Build Coastguard Worker SelectOprr>, EVEX_V256; 2610*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_load<opc, OpcodeStr, _.info128, _.info128.LdFrag, 2611*9880d681SAndroid Build Coastguard Worker masked_load_unaligned, IsReMaterializable, 2612*9880d681SAndroid Build Coastguard Worker SelectOprr>, EVEX_V128; 2613*9880d681SAndroid Build Coastguard Worker } 2614*9880d681SAndroid Build Coastguard Worker} 2615*9880d681SAndroid Build Coastguard Worker 2616*9880d681SAndroid Build Coastguard Workermulticlass avx512_store<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 2617*9880d681SAndroid Build Coastguard Worker PatFrag st_frag, PatFrag mstore> { 2618*9880d681SAndroid Build Coastguard Worker 2619*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in { 2620*9880d681SAndroid Build Coastguard Worker def rr_REV : AVX512PI<opc, MRMDestReg, (outs _.RC:$dst), (ins _.RC:$src), 2621*9880d681SAndroid Build Coastguard Worker OpcodeStr # ".s\t{$src, $dst|$dst, $src}", 2622*9880d681SAndroid Build Coastguard Worker [], _.ExeDomain>, EVEX; 2623*9880d681SAndroid Build Coastguard Worker def rrk_REV : AVX512PI<opc, MRMDestReg, (outs _.RC:$dst), 2624*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src), 2625*9880d681SAndroid Build Coastguard Worker OpcodeStr # ".s\t{$src, ${dst} {${mask}}|"# 2626*9880d681SAndroid Build Coastguard Worker "${dst} {${mask}}, $src}", 2627*9880d681SAndroid Build Coastguard Worker [], _.ExeDomain>, EVEX, EVEX_K; 2628*9880d681SAndroid Build Coastguard Worker def rrkz_REV : AVX512PI<opc, MRMDestReg, (outs _.RC:$dst), 2629*9880d681SAndroid Build Coastguard Worker (ins _.KRCWM:$mask, _.RC:$src), 2630*9880d681SAndroid Build Coastguard Worker OpcodeStr # ".s\t{$src, ${dst} {${mask}} {z}|" # 2631*9880d681SAndroid Build Coastguard Worker "${dst} {${mask}} {z}, $src}", 2632*9880d681SAndroid Build Coastguard Worker [], _.ExeDomain>, EVEX, EVEX_KZ; 2633*9880d681SAndroid Build Coastguard Worker } 2634*9880d681SAndroid Build Coastguard Worker 2635*9880d681SAndroid Build Coastguard Worker def mr : AVX512PI<opc, MRMDestMem, (outs), (ins _.MemOp:$dst, _.RC:$src), 2636*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 2637*9880d681SAndroid Build Coastguard Worker [(st_frag (_.VT _.RC:$src), addr:$dst)], _.ExeDomain>, EVEX; 2638*9880d681SAndroid Build Coastguard Worker def mrk : AVX512PI<opc, MRMDestMem, (outs), 2639*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$dst, _.KRCWM:$mask, _.RC:$src), 2640*9880d681SAndroid Build Coastguard Worker OpcodeStr # "\t{$src, ${dst} {${mask}}|${dst} {${mask}}, $src}", 2641*9880d681SAndroid Build Coastguard Worker [], _.ExeDomain>, EVEX, EVEX_K; 2642*9880d681SAndroid Build Coastguard Worker 2643*9880d681SAndroid Build Coastguard Worker def: Pat<(mstore addr:$ptr, _.KRCWM:$mask, (_.VT _.RC:$src)), 2644*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#_.ZSuffix##mrk) addr:$ptr, 2645*9880d681SAndroid Build Coastguard Worker _.KRCWM:$mask, _.RC:$src)>; 2646*9880d681SAndroid Build Coastguard Worker} 2647*9880d681SAndroid Build Coastguard Worker 2648*9880d681SAndroid Build Coastguard Worker 2649*9880d681SAndroid Build Coastguard Workermulticlass avx512_store_vl< bits<8> opc, string OpcodeStr, 2650*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, Predicate prd> { 2651*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 2652*9880d681SAndroid Build Coastguard Worker defm Z : avx512_store<opc, OpcodeStr, _.info512, store, 2653*9880d681SAndroid Build Coastguard Worker masked_store_unaligned>, EVEX_V512; 2654*9880d681SAndroid Build Coastguard Worker 2655*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 2656*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_store<opc, OpcodeStr, _.info256, store, 2657*9880d681SAndroid Build Coastguard Worker masked_store_unaligned>, EVEX_V256; 2658*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_store<opc, OpcodeStr, _.info128, store, 2659*9880d681SAndroid Build Coastguard Worker masked_store_unaligned>, EVEX_V128; 2660*9880d681SAndroid Build Coastguard Worker } 2661*9880d681SAndroid Build Coastguard Worker} 2662*9880d681SAndroid Build Coastguard Worker 2663*9880d681SAndroid Build Coastguard Workermulticlass avx512_alignedstore_vl<bits<8> opc, string OpcodeStr, 2664*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, Predicate prd> { 2665*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 2666*9880d681SAndroid Build Coastguard Worker defm Z : avx512_store<opc, OpcodeStr, _.info512, alignedstore512, 2667*9880d681SAndroid Build Coastguard Worker masked_store_aligned512>, EVEX_V512; 2668*9880d681SAndroid Build Coastguard Worker 2669*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 2670*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_store<opc, OpcodeStr, _.info256, alignedstore256, 2671*9880d681SAndroid Build Coastguard Worker masked_store_aligned256>, EVEX_V256; 2672*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_store<opc, OpcodeStr, _.info128, alignedstore, 2673*9880d681SAndroid Build Coastguard Worker masked_store_aligned128>, EVEX_V128; 2674*9880d681SAndroid Build Coastguard Worker } 2675*9880d681SAndroid Build Coastguard Worker} 2676*9880d681SAndroid Build Coastguard Worker 2677*9880d681SAndroid Build Coastguard Workerdefm VMOVAPS : avx512_alignedload_vl<0x28, "vmovaps", avx512vl_f32_info, 2678*9880d681SAndroid Build Coastguard Worker HasAVX512>, 2679*9880d681SAndroid Build Coastguard Worker avx512_alignedstore_vl<0x29, "vmovaps", avx512vl_f32_info, 2680*9880d681SAndroid Build Coastguard Worker HasAVX512>, PS, EVEX_CD8<32, CD8VF>; 2681*9880d681SAndroid Build Coastguard Worker 2682*9880d681SAndroid Build Coastguard Workerdefm VMOVAPD : avx512_alignedload_vl<0x28, "vmovapd", avx512vl_f64_info, 2683*9880d681SAndroid Build Coastguard Worker HasAVX512>, 2684*9880d681SAndroid Build Coastguard Worker avx512_alignedstore_vl<0x29, "vmovapd", avx512vl_f64_info, 2685*9880d681SAndroid Build Coastguard Worker HasAVX512>, PD, VEX_W, EVEX_CD8<64, CD8VF>; 2686*9880d681SAndroid Build Coastguard Worker 2687*9880d681SAndroid Build Coastguard Workerdefm VMOVUPS : avx512_load_vl<0x10, "vmovups", avx512vl_f32_info, HasAVX512, 2688*9880d681SAndroid Build Coastguard Worker 1, null_frag>, 2689*9880d681SAndroid Build Coastguard Worker avx512_store_vl<0x11, "vmovups", avx512vl_f32_info, HasAVX512>, 2690*9880d681SAndroid Build Coastguard Worker PS, EVEX_CD8<32, CD8VF>; 2691*9880d681SAndroid Build Coastguard Worker 2692*9880d681SAndroid Build Coastguard Workerdefm VMOVUPD : avx512_load_vl<0x10, "vmovupd", avx512vl_f64_info, HasAVX512, 0, 2693*9880d681SAndroid Build Coastguard Worker null_frag>, 2694*9880d681SAndroid Build Coastguard Worker avx512_store_vl<0x11, "vmovupd", avx512vl_f64_info, HasAVX512>, 2695*9880d681SAndroid Build Coastguard Worker PD, VEX_W, EVEX_CD8<64, CD8VF>; 2696*9880d681SAndroid Build Coastguard Worker 2697*9880d681SAndroid Build Coastguard Workerdefm VMOVDQA32 : avx512_alignedload_vl<0x6F, "vmovdqa32", avx512vl_i32_info, 2698*9880d681SAndroid Build Coastguard Worker HasAVX512>, 2699*9880d681SAndroid Build Coastguard Worker avx512_alignedstore_vl<0x7F, "vmovdqa32", avx512vl_i32_info, 2700*9880d681SAndroid Build Coastguard Worker HasAVX512>, PD, EVEX_CD8<32, CD8VF>; 2701*9880d681SAndroid Build Coastguard Worker 2702*9880d681SAndroid Build Coastguard Workerdefm VMOVDQA64 : avx512_alignedload_vl<0x6F, "vmovdqa64", avx512vl_i64_info, 2703*9880d681SAndroid Build Coastguard Worker HasAVX512>, 2704*9880d681SAndroid Build Coastguard Worker avx512_alignedstore_vl<0x7F, "vmovdqa64", avx512vl_i64_info, 2705*9880d681SAndroid Build Coastguard Worker HasAVX512>, PD, VEX_W, EVEX_CD8<64, CD8VF>; 2706*9880d681SAndroid Build Coastguard Worker 2707*9880d681SAndroid Build Coastguard Workerdefm VMOVDQU8 : avx512_load_vl<0x6F, "vmovdqu8", avx512vl_i8_info, HasBWI>, 2708*9880d681SAndroid Build Coastguard Worker avx512_store_vl<0x7F, "vmovdqu8", avx512vl_i8_info, 2709*9880d681SAndroid Build Coastguard Worker HasBWI>, XD, EVEX_CD8<8, CD8VF>; 2710*9880d681SAndroid Build Coastguard Worker 2711*9880d681SAndroid Build Coastguard Workerdefm VMOVDQU16 : avx512_load_vl<0x6F, "vmovdqu16", avx512vl_i16_info, HasBWI>, 2712*9880d681SAndroid Build Coastguard Worker avx512_store_vl<0x7F, "vmovdqu16", avx512vl_i16_info, 2713*9880d681SAndroid Build Coastguard Worker HasBWI>, XD, VEX_W, EVEX_CD8<16, CD8VF>; 2714*9880d681SAndroid Build Coastguard Worker 2715*9880d681SAndroid Build Coastguard Workerdefm VMOVDQU32 : avx512_load_vl<0x6F, "vmovdqu32", avx512vl_i32_info, HasAVX512, 2716*9880d681SAndroid Build Coastguard Worker 1, null_frag>, 2717*9880d681SAndroid Build Coastguard Worker avx512_store_vl<0x7F, "vmovdqu32", avx512vl_i32_info, 2718*9880d681SAndroid Build Coastguard Worker HasAVX512>, XS, EVEX_CD8<32, CD8VF>; 2719*9880d681SAndroid Build Coastguard Worker 2720*9880d681SAndroid Build Coastguard Workerdefm VMOVDQU64 : avx512_load_vl<0x6F, "vmovdqu64", avx512vl_i64_info, HasAVX512, 2721*9880d681SAndroid Build Coastguard Worker 1, null_frag>, 2722*9880d681SAndroid Build Coastguard Worker avx512_store_vl<0x7F, "vmovdqu64", avx512vl_i64_info, 2723*9880d681SAndroid Build Coastguard Worker HasAVX512>, XS, VEX_W, EVEX_CD8<64, CD8VF>; 2724*9880d681SAndroid Build Coastguard Worker 2725*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (vselect VK8WM:$mask, (bc_v8i64 (v16i32 immAllZerosV)), 2726*9880d681SAndroid Build Coastguard Worker (v8i64 VR512:$src))), 2727*9880d681SAndroid Build Coastguard Worker (VMOVDQA64Zrrkz (COPY_TO_REGCLASS (KNOTWrr (COPY_TO_REGCLASS VK8:$mask, VK16)), 2728*9880d681SAndroid Build Coastguard Worker VK8), VR512:$src)>; 2729*9880d681SAndroid Build Coastguard Worker 2730*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (vselect VK16WM:$mask, (v16i32 immAllZerosV), 2731*9880d681SAndroid Build Coastguard Worker (v16i32 VR512:$src))), 2732*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Zrrkz (KNOTWrr VK16WM:$mask), VR512:$src)>; 2733*9880d681SAndroid Build Coastguard Worker 2734*9880d681SAndroid Build Coastguard Worker// These patterns exist to prevent the above patterns from introducing a second 2735*9880d681SAndroid Build Coastguard Worker// mask inversion when one already exists. 2736*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (vselect (xor VK8:$mask, (v8i1 immAllOnesV)), 2737*9880d681SAndroid Build Coastguard Worker (bc_v8i64 (v16i32 immAllZerosV)), 2738*9880d681SAndroid Build Coastguard Worker (v8i64 VR512:$src))), 2739*9880d681SAndroid Build Coastguard Worker (VMOVDQA64Zrrkz VK8:$mask, VR512:$src)>; 2740*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (vselect (xor VK16:$mask, (v16i1 immAllOnesV)), 2741*9880d681SAndroid Build Coastguard Worker (v16i32 immAllZerosV), 2742*9880d681SAndroid Build Coastguard Worker (v16i32 VR512:$src))), 2743*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Zrrkz VK16WM:$mask, VR512:$src)>; 2744*9880d681SAndroid Build Coastguard Worker 2745*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 2746*9880d681SAndroid Build Coastguard Worker // Special patterns for storing subvector extracts of lower 128-bits of 256. 2747*9880d681SAndroid Build Coastguard Worker // Its cheaper to just use VMOVAPS/VMOVUPS instead of VEXTRACTF128mr 2748*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v2f64 (extract_subvector 2749*9880d681SAndroid Build Coastguard Worker (v4f64 VR256X:$src), (iPTR 0))), addr:$dst), 2750*9880d681SAndroid Build Coastguard Worker (VMOVAPDZ128mr addr:$dst, (v2f64 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2751*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v4f32 (extract_subvector 2752*9880d681SAndroid Build Coastguard Worker (v8f32 VR256X:$src), (iPTR 0))), addr:$dst), 2753*9880d681SAndroid Build Coastguard Worker (VMOVAPSZ128mr addr:$dst, (v4f32 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2754*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v2i64 (extract_subvector 2755*9880d681SAndroid Build Coastguard Worker (v4i64 VR256X:$src), (iPTR 0))), addr:$dst), 2756*9880d681SAndroid Build Coastguard Worker (VMOVDQA64Z128mr addr:$dst, (v2i64 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2757*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v4i32 (extract_subvector 2758*9880d681SAndroid Build Coastguard Worker (v8i32 VR256X:$src), (iPTR 0))), addr:$dst), 2759*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z128mr addr:$dst, (v4i32 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2760*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v8i16 (extract_subvector 2761*9880d681SAndroid Build Coastguard Worker (v16i16 VR256X:$src), (iPTR 0))), addr:$dst), 2762*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z128mr addr:$dst, (v8i16 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2763*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v16i8 (extract_subvector 2764*9880d681SAndroid Build Coastguard Worker (v32i8 VR256X:$src), (iPTR 0))), addr:$dst), 2765*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z128mr addr:$dst, (v16i8 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2766*9880d681SAndroid Build Coastguard Worker 2767*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f64 (extract_subvector 2768*9880d681SAndroid Build Coastguard Worker (v4f64 VR256X:$src), (iPTR 0))), addr:$dst), 2769*9880d681SAndroid Build Coastguard Worker (VMOVUPDZ128mr addr:$dst, (v2f64 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2770*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f32 (extract_subvector 2771*9880d681SAndroid Build Coastguard Worker (v8f32 VR256X:$src), (iPTR 0))), addr:$dst), 2772*9880d681SAndroid Build Coastguard Worker (VMOVUPSZ128mr addr:$dst, (v4f32 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2773*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i64 (extract_subvector 2774*9880d681SAndroid Build Coastguard Worker (v4i64 VR256X:$src), (iPTR 0))), addr:$dst), 2775*9880d681SAndroid Build Coastguard Worker (VMOVDQU64Z128mr addr:$dst, (v2i64 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2776*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i32 (extract_subvector 2777*9880d681SAndroid Build Coastguard Worker (v8i32 VR256X:$src), (iPTR 0))), addr:$dst), 2778*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z128mr addr:$dst, (v4i32 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2779*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i16 (extract_subvector 2780*9880d681SAndroid Build Coastguard Worker (v16i16 VR256X:$src), (iPTR 0))), addr:$dst), 2781*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z128mr addr:$dst, (v8i16 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2782*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v16i8 (extract_subvector 2783*9880d681SAndroid Build Coastguard Worker (v32i8 VR256X:$src), (iPTR 0))), addr:$dst), 2784*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z128mr addr:$dst, (v16i8 (EXTRACT_SUBREG VR256X:$src,sub_xmm)))>; 2785*9880d681SAndroid Build Coastguard Worker 2786*9880d681SAndroid Build Coastguard Worker // Special patterns for storing subvector extracts of lower 128-bits of 512. 2787*9880d681SAndroid Build Coastguard Worker // Its cheaper to just use VMOVAPS/VMOVUPS instead of VEXTRACTF128mr 2788*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v2f64 (extract_subvector 2789*9880d681SAndroid Build Coastguard Worker (v8f64 VR512:$src), (iPTR 0))), addr:$dst), 2790*9880d681SAndroid Build Coastguard Worker (VMOVAPDZ128mr addr:$dst, (v2f64 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2791*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v4f32 (extract_subvector 2792*9880d681SAndroid Build Coastguard Worker (v16f32 VR512:$src), (iPTR 0))), addr:$dst), 2793*9880d681SAndroid Build Coastguard Worker (VMOVAPSZ128mr addr:$dst, (v4f32 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2794*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v2i64 (extract_subvector 2795*9880d681SAndroid Build Coastguard Worker (v8i64 VR512:$src), (iPTR 0))), addr:$dst), 2796*9880d681SAndroid Build Coastguard Worker (VMOVDQA64Z128mr addr:$dst, (v2i64 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2797*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v4i32 (extract_subvector 2798*9880d681SAndroid Build Coastguard Worker (v16i32 VR512:$src), (iPTR 0))), addr:$dst), 2799*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z128mr addr:$dst, (v4i32 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2800*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v8i16 (extract_subvector 2801*9880d681SAndroid Build Coastguard Worker (v32i16 VR512:$src), (iPTR 0))), addr:$dst), 2802*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z128mr addr:$dst, (v8i16 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2803*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v16i8 (extract_subvector 2804*9880d681SAndroid Build Coastguard Worker (v64i8 VR512:$src), (iPTR 0))), addr:$dst), 2805*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z128mr addr:$dst, (v16i8 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2806*9880d681SAndroid Build Coastguard Worker 2807*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f64 (extract_subvector 2808*9880d681SAndroid Build Coastguard Worker (v8f64 VR512:$src), (iPTR 0))), addr:$dst), 2809*9880d681SAndroid Build Coastguard Worker (VMOVUPDZ128mr addr:$dst, (v2f64 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2810*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f32 (extract_subvector 2811*9880d681SAndroid Build Coastguard Worker (v16f32 VR512:$src), (iPTR 0))), addr:$dst), 2812*9880d681SAndroid Build Coastguard Worker (VMOVUPSZ128mr addr:$dst, (v4f32 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2813*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i64 (extract_subvector 2814*9880d681SAndroid Build Coastguard Worker (v8i64 VR512:$src), (iPTR 0))), addr:$dst), 2815*9880d681SAndroid Build Coastguard Worker (VMOVDQU64Z128mr addr:$dst, (v2i64 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2816*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i32 (extract_subvector 2817*9880d681SAndroid Build Coastguard Worker (v16i32 VR512:$src), (iPTR 0))), addr:$dst), 2818*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z128mr addr:$dst, (v4i32 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2819*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i16 (extract_subvector 2820*9880d681SAndroid Build Coastguard Worker (v32i16 VR512:$src), (iPTR 0))), addr:$dst), 2821*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z128mr addr:$dst, (v8i16 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2822*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v16i8 (extract_subvector 2823*9880d681SAndroid Build Coastguard Worker (v64i8 VR512:$src), (iPTR 0))), addr:$dst), 2824*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z128mr addr:$dst, (v16i8 (EXTRACT_SUBREG VR512:$src,sub_xmm)))>; 2825*9880d681SAndroid Build Coastguard Worker 2826*9880d681SAndroid Build Coastguard Worker // Special patterns for storing subvector extracts of lower 256-bits of 512. 2827*9880d681SAndroid Build Coastguard Worker // Its cheaper to just use VMOVAPS/VMOVUPS instead of VEXTRACTF128mr 2828*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v4f64 (extract_subvector 2829*9880d681SAndroid Build Coastguard Worker (v8f64 VR512:$src), (iPTR 0))), addr:$dst), 2830*9880d681SAndroid Build Coastguard Worker (VMOVAPDZ256mr addr:$dst, (v4f64 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2831*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v8f32 (extract_subvector 2832*9880d681SAndroid Build Coastguard Worker (v16f32 VR512:$src), (iPTR 0))), addr:$dst), 2833*9880d681SAndroid Build Coastguard Worker (VMOVAPSZ256mr addr:$dst, (v8f32 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2834*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v4i64 (extract_subvector 2835*9880d681SAndroid Build Coastguard Worker (v8i64 VR512:$src), (iPTR 0))), addr:$dst), 2836*9880d681SAndroid Build Coastguard Worker (VMOVDQA64Z256mr addr:$dst, (v4i64 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2837*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v8i32 (extract_subvector 2838*9880d681SAndroid Build Coastguard Worker (v16i32 VR512:$src), (iPTR 0))), addr:$dst), 2839*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z256mr addr:$dst, (v8i32 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2840*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v16i16 (extract_subvector 2841*9880d681SAndroid Build Coastguard Worker (v32i16 VR512:$src), (iPTR 0))), addr:$dst), 2842*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z256mr addr:$dst, (v16i16 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2843*9880d681SAndroid Build Coastguard Worker def : Pat<(alignedstore (v32i8 (extract_subvector 2844*9880d681SAndroid Build Coastguard Worker (v64i8 VR512:$src), (iPTR 0))), addr:$dst), 2845*9880d681SAndroid Build Coastguard Worker (VMOVDQA32Z256mr addr:$dst, (v32i8 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2846*9880d681SAndroid Build Coastguard Worker 2847*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f64 (extract_subvector 2848*9880d681SAndroid Build Coastguard Worker (v8f64 VR512:$src), (iPTR 0))), addr:$dst), 2849*9880d681SAndroid Build Coastguard Worker (VMOVUPDZ256mr addr:$dst, (v4f64 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2850*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8f32 (extract_subvector 2851*9880d681SAndroid Build Coastguard Worker (v16f32 VR512:$src), (iPTR 0))), addr:$dst), 2852*9880d681SAndroid Build Coastguard Worker (VMOVUPSZ256mr addr:$dst, (v8f32 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2853*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i64 (extract_subvector 2854*9880d681SAndroid Build Coastguard Worker (v8i64 VR512:$src), (iPTR 0))), addr:$dst), 2855*9880d681SAndroid Build Coastguard Worker (VMOVDQU64Z256mr addr:$dst, (v4i64 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2856*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i32 (extract_subvector 2857*9880d681SAndroid Build Coastguard Worker (v16i32 VR512:$src), (iPTR 0))), addr:$dst), 2858*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z256mr addr:$dst, (v8i32 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2859*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v16i16 (extract_subvector 2860*9880d681SAndroid Build Coastguard Worker (v32i16 VR512:$src), (iPTR 0))), addr:$dst), 2861*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z256mr addr:$dst, (v16i16 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2862*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v32i8 (extract_subvector 2863*9880d681SAndroid Build Coastguard Worker (v64i8 VR512:$src), (iPTR 0))), addr:$dst), 2864*9880d681SAndroid Build Coastguard Worker (VMOVDQU32Z256mr addr:$dst, (v32i8 (EXTRACT_SUBREG VR512:$src,sub_ymm)))>; 2865*9880d681SAndroid Build Coastguard Worker} 2866*9880d681SAndroid Build Coastguard Worker 2867*9880d681SAndroid Build Coastguard Worker 2868*9880d681SAndroid Build Coastguard Worker// Move Int Doubleword to Packed Double Int 2869*9880d681SAndroid Build Coastguard Worker// 2870*9880d681SAndroid Build Coastguard Workerdef VMOVDI2PDIZrr : AVX512BI<0x6E, MRMSrcReg, (outs VR128X:$dst), (ins GR32:$src), 2871*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2872*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, 2873*9880d681SAndroid Build Coastguard Worker (v4i32 (scalar_to_vector GR32:$src)))], IIC_SSE_MOVDQ>, 2874*9880d681SAndroid Build Coastguard Worker EVEX; 2875*9880d681SAndroid Build Coastguard Workerdef VMOVDI2PDIZrm : AVX512BI<0x6E, MRMSrcMem, (outs VR128X:$dst), (ins i32mem:$src), 2876*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2877*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, 2878*9880d681SAndroid Build Coastguard Worker (v4i32 (scalar_to_vector (loadi32 addr:$src))))], 2879*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, EVEX_CD8<32, CD8VT1>; 2880*9880d681SAndroid Build Coastguard Workerdef VMOV64toPQIZrr : AVX512BI<0x6E, MRMSrcReg, (outs VR128X:$dst), (ins GR64:$src), 2881*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2882*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, 2883*9880d681SAndroid Build Coastguard Worker (v2i64 (scalar_to_vector GR64:$src)))], 2884*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, VEX_W; 2885*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayLoad = 1 in 2886*9880d681SAndroid Build Coastguard Workerdef VMOV64toPQIZrm : AVX512BI<0x6E, MRMSrcMem, (outs VR128X:$dst), 2887*9880d681SAndroid Build Coastguard Worker (ins i64mem:$src), 2888*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", []>, 2889*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W, EVEX_CD8<64, CD8VT1>; 2890*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 2891*9880d681SAndroid Build Coastguard Workerdef VMOV64toSDZrr : AVX512BI<0x6E, MRMSrcReg, (outs FR64X:$dst), (ins GR64:$src), 2892*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2893*9880d681SAndroid Build Coastguard Worker [(set FR64X:$dst, (bitconvert GR64:$src))], 2894*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, VEX_W, Sched<[WriteMove]>; 2895*9880d681SAndroid Build Coastguard Workerdef VMOVSDto64Zrr : AVX512BI<0x7E, MRMDestReg, (outs GR64:$dst), (ins FR64X:$src), 2896*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2897*9880d681SAndroid Build Coastguard Worker [(set GR64:$dst, (bitconvert FR64X:$src))], 2898*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, VEX_W, Sched<[WriteMove]>; 2899*9880d681SAndroid Build Coastguard Workerdef VMOVSDto64Zmr : AVX512BI<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, FR64X:$src), 2900*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2901*9880d681SAndroid Build Coastguard Worker [(store (i64 (bitconvert FR64X:$src)), addr:$dst)], 2902*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, VEX_W, Sched<[WriteStore]>, 2903*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VT1>; 2904*9880d681SAndroid Build Coastguard Worker} 2905*9880d681SAndroid Build Coastguard Worker 2906*9880d681SAndroid Build Coastguard Worker// Move Int Doubleword to Single Scalar 2907*9880d681SAndroid Build Coastguard Worker// 2908*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 2909*9880d681SAndroid Build Coastguard Workerdef VMOVDI2SSZrr : AVX512BI<0x6E, MRMSrcReg, (outs FR32X:$dst), (ins GR32:$src), 2910*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2911*9880d681SAndroid Build Coastguard Worker [(set FR32X:$dst, (bitconvert GR32:$src))], 2912*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX; 2913*9880d681SAndroid Build Coastguard Worker 2914*9880d681SAndroid Build Coastguard Workerdef VMOVDI2SSZrm : AVX512BI<0x6E, MRMSrcMem, (outs FR32X:$dst), (ins i32mem:$src), 2915*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2916*9880d681SAndroid Build Coastguard Worker [(set FR32X:$dst, (bitconvert (loadi32 addr:$src)))], 2917*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, EVEX_CD8<32, CD8VT1>; 2918*9880d681SAndroid Build Coastguard Worker} 2919*9880d681SAndroid Build Coastguard Worker 2920*9880d681SAndroid Build Coastguard Worker// Move doubleword from xmm register to r/m32 2921*9880d681SAndroid Build Coastguard Worker// 2922*9880d681SAndroid Build Coastguard Workerdef VMOVPDI2DIZrr : AVX512BI<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128X:$src), 2923*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2924*9880d681SAndroid Build Coastguard Worker [(set GR32:$dst, (extractelt (v4i32 VR128X:$src), 2925*9880d681SAndroid Build Coastguard Worker (iPTR 0)))], IIC_SSE_MOVD_ToGP>, 2926*9880d681SAndroid Build Coastguard Worker EVEX; 2927*9880d681SAndroid Build Coastguard Workerdef VMOVPDI2DIZmr : AVX512BI<0x7E, MRMDestMem, (outs), 2928*9880d681SAndroid Build Coastguard Worker (ins i32mem:$dst, VR128X:$src), 2929*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2930*9880d681SAndroid Build Coastguard Worker [(store (i32 (extractelt (v4i32 VR128X:$src), 2931*9880d681SAndroid Build Coastguard Worker (iPTR 0))), addr:$dst)], IIC_SSE_MOVDQ>, 2932*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<32, CD8VT1>; 2933*9880d681SAndroid Build Coastguard Worker 2934*9880d681SAndroid Build Coastguard Worker// Move quadword from xmm1 register to r/m64 2935*9880d681SAndroid Build Coastguard Worker// 2936*9880d681SAndroid Build Coastguard Workerdef VMOVPQIto64Zrr : I<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128X:$src), 2937*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2938*9880d681SAndroid Build Coastguard Worker [(set GR64:$dst, (extractelt (v2i64 VR128X:$src), 2939*9880d681SAndroid Build Coastguard Worker (iPTR 0)))], 2940*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVD_ToGP>, PD, EVEX, VEX_W, 2941*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512, In64BitMode]>; 2942*9880d681SAndroid Build Coastguard Worker 2943*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0, mayStore = 1 in 2944*9880d681SAndroid Build Coastguard Workerdef VMOVPQIto64Zmr : I<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, VR128X:$src), 2945*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2946*9880d681SAndroid Build Coastguard Worker [], IIC_SSE_MOVD_ToGP>, PD, EVEX, VEX_W, 2947*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512, In64BitMode]>; 2948*9880d681SAndroid Build Coastguard Worker 2949*9880d681SAndroid Build Coastguard Workerdef VMOVPQI2QIZmr : I<0xD6, MRMDestMem, (outs), 2950*9880d681SAndroid Build Coastguard Worker (ins i64mem:$dst, VR128X:$src), 2951*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2952*9880d681SAndroid Build Coastguard Worker [(store (extractelt (v2i64 VR128X:$src), (iPTR 0)), 2953*9880d681SAndroid Build Coastguard Worker addr:$dst)], IIC_SSE_MOVDQ>, 2954*9880d681SAndroid Build Coastguard Worker EVEX, PD, VEX_W, EVEX_CD8<64, CD8VT1>, 2955*9880d681SAndroid Build Coastguard Worker Sched<[WriteStore]>, Requires<[HasAVX512, In64BitMode]>; 2956*9880d681SAndroid Build Coastguard Worker 2957*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 2958*9880d681SAndroid Build Coastguard Workerdef VMOVPQI2QIZrr : AVX512BI<0xD6, MRMDestReg, (outs VR128X:$dst), 2959*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src), 2960*9880d681SAndroid Build Coastguard Worker "vmovq.s\t{$src, $dst|$dst, $src}",[]>, 2961*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W; 2962*9880d681SAndroid Build Coastguard Worker 2963*9880d681SAndroid Build Coastguard Worker// Move Scalar Single to Double Int 2964*9880d681SAndroid Build Coastguard Worker// 2965*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 2966*9880d681SAndroid Build Coastguard Workerdef VMOVSS2DIZrr : AVX512BI<0x7E, MRMDestReg, (outs GR32:$dst), 2967*9880d681SAndroid Build Coastguard Worker (ins FR32X:$src), 2968*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2969*9880d681SAndroid Build Coastguard Worker [(set GR32:$dst, (bitconvert FR32X:$src))], 2970*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVD_ToGP>, EVEX; 2971*9880d681SAndroid Build Coastguard Workerdef VMOVSS2DIZmr : AVX512BI<0x7E, MRMDestMem, (outs), 2972*9880d681SAndroid Build Coastguard Worker (ins i32mem:$dst, FR32X:$src), 2973*9880d681SAndroid Build Coastguard Worker "vmovd\t{$src, $dst|$dst, $src}", 2974*9880d681SAndroid Build Coastguard Worker [(store (i32 (bitconvert FR32X:$src)), addr:$dst)], 2975*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, EVEX_CD8<32, CD8VT1>; 2976*9880d681SAndroid Build Coastguard Worker} 2977*9880d681SAndroid Build Coastguard Worker 2978*9880d681SAndroid Build Coastguard Worker// Move Quadword Int to Packed Quadword Int 2979*9880d681SAndroid Build Coastguard Worker// 2980*9880d681SAndroid Build Coastguard Workerdef VMOVQI2PQIZrm : AVX512XSI<0x7E, MRMSrcMem, (outs VR128X:$dst), 2981*9880d681SAndroid Build Coastguard Worker (ins i64mem:$src), 2982*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 2983*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, 2984*9880d681SAndroid Build Coastguard Worker (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>, 2985*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W, EVEX_CD8<8, CD8VT8>; 2986*9880d681SAndroid Build Coastguard Worker 2987*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2988*9880d681SAndroid Build Coastguard Worker// AVX-512 MOVSS, MOVSD 2989*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2990*9880d681SAndroid Build Coastguard Worker 2991*9880d681SAndroid Build Coastguard Workermulticlass avx512_move_scalar <string asm, SDNode OpNode, 2992*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 2993*9880d681SAndroid Build Coastguard Worker defm rr_Int : AVX512_maskable_scalar<0x10, MRMSrcReg, _, (outs _.RC:$dst), 2994*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), 2995*9880d681SAndroid Build Coastguard Worker asm, "$src2, $src1","$src1, $src2", 2996*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT _.RC:$src1), 2997*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2))), 2998*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOV_S_RR>, EVEX_4V; 2999*9880d681SAndroid Build Coastguard Worker let Constraints = "$src1 = $dst" in 3000*9880d681SAndroid Build Coastguard Worker defm rm_Int : AVX512_maskable_3src_scalar<0x10, MRMSrcMem, _, 3001*9880d681SAndroid Build Coastguard Worker (outs _.RC:$dst), 3002*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src), 3003*9880d681SAndroid Build Coastguard Worker asm,"$src","$src", 3004*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT _.RC:$src1), 3005*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector 3006*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src)))))>, EVEX; 3007*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 3008*9880d681SAndroid Build Coastguard Worker def rr : AVX512PI<0x10, MRMSrcReg, (outs _.RC:$dst), 3009*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.FRC:$src2), 3010*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 3011*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, (_.VT (OpNode _.RC:$src1, 3012*9880d681SAndroid Build Coastguard Worker (scalar_to_vector _.FRC:$src2))))], 3013*9880d681SAndroid Build Coastguard Worker _.ExeDomain,IIC_SSE_MOV_S_RR>, EVEX_4V; 3014*9880d681SAndroid Build Coastguard Worker def rm : AVX512PI<0x10, MRMSrcMem, (outs _.FRC:$dst), (ins _.ScalarMemOp:$src), 3015*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "\t{$src, $dst|$dst, $src}"), 3016*9880d681SAndroid Build Coastguard Worker [(set _.FRC:$dst, (_.ScalarLdFrag addr:$src))], 3017*9880d681SAndroid Build Coastguard Worker _.ExeDomain, IIC_SSE_MOV_S_RM>, EVEX; 3018*9880d681SAndroid Build Coastguard Worker } 3019*9880d681SAndroid Build Coastguard Worker def mr: AVX512PI<0x11, MRMDestMem, (outs), (ins _.ScalarMemOp:$dst, _.FRC:$src), 3020*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "\t{$src, $dst|$dst, $src}"), 3021*9880d681SAndroid Build Coastguard Worker [(store _.FRC:$src, addr:$dst)], _.ExeDomain, IIC_SSE_MOV_S_MR>, 3022*9880d681SAndroid Build Coastguard Worker EVEX; 3023*9880d681SAndroid Build Coastguard Worker let mayStore = 1 in 3024*9880d681SAndroid Build Coastguard Worker def mrk: AVX512PI<0x11, MRMDestMem, (outs), 3025*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$dst, VK1WM:$mask, _.FRC:$src), 3026*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "\t{$src, $dst {${mask}}|$dst {${mask}}, $src}"), 3027*9880d681SAndroid Build Coastguard Worker [], _.ExeDomain, IIC_SSE_MOV_S_MR>, EVEX, EVEX_K; 3028*9880d681SAndroid Build Coastguard Worker} 3029*9880d681SAndroid Build Coastguard Worker 3030*9880d681SAndroid Build Coastguard Workerdefm VMOVSSZ : avx512_move_scalar<"vmovss", X86Movss, f32x_info>, 3031*9880d681SAndroid Build Coastguard Worker VEX_LIG, XS, EVEX_CD8<32, CD8VT1>; 3032*9880d681SAndroid Build Coastguard Worker 3033*9880d681SAndroid Build Coastguard Workerdefm VMOVSDZ : avx512_move_scalar<"vmovsd", X86Movsd, f64x_info>, 3034*9880d681SAndroid Build Coastguard Worker VEX_LIG, XD, VEX_W, EVEX_CD8<64, CD8VT1>; 3035*9880d681SAndroid Build Coastguard Worker 3036*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (X86selects VK1WM:$mask, (f32 FR32X:$src1), (f32 FR32X:$src2))), 3037*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSSZrr_Intk (COPY_TO_REGCLASS FR32X:$src2, VR128X), 3038*9880d681SAndroid Build Coastguard Worker VK1WM:$mask, (v4f32 (IMPLICIT_DEF)),(COPY_TO_REGCLASS FR32X:$src1, VR128X)), FR32X)>; 3039*9880d681SAndroid Build Coastguard Worker 3040*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (X86selects VK1WM:$mask, (f64 FR64X:$src1), (f64 FR64X:$src2))), 3041*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSDZrr_Intk (COPY_TO_REGCLASS FR64X:$src2, VR128X), 3042*9880d681SAndroid Build Coastguard Worker VK1WM:$mask, (v2f64 (IMPLICIT_DEF)), (COPY_TO_REGCLASS FR64X:$src1, VR128X)), FR64X)>; 3043*9880d681SAndroid Build Coastguard Worker 3044*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_x86_avx512_mask_store_ss addr:$dst, VR128X:$src, GR8:$mask), 3045*9880d681SAndroid Build Coastguard Worker (VMOVSSZmrk addr:$dst, (i1 (COPY_TO_REGCLASS GR8:$mask, VK1WM)), 3046*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 3047*9880d681SAndroid Build Coastguard Worker 3048*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 3049*9880d681SAndroid Build Coastguard Workerdefm VMOVSSZrr_REV : AVX512_maskable_in_asm<0x11, MRMDestReg, f32x_info, 3050*9880d681SAndroid Build Coastguard Worker (outs VR128X:$dst), (ins VR128X:$src1, VR128X:$src2), 3051*9880d681SAndroid Build Coastguard Worker "vmovss.s", "$src2, $src1", "$src1, $src2", []>, 3052*9880d681SAndroid Build Coastguard Worker XS, EVEX_4V, VEX_LIG; 3053*9880d681SAndroid Build Coastguard Worker 3054*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 3055*9880d681SAndroid Build Coastguard Workerdefm VMOVSSDrr_REV : AVX512_maskable_in_asm<0x11, MRMDestReg, f64x_info, 3056*9880d681SAndroid Build Coastguard Worker (outs VR128X:$dst), (ins VR128X:$src1, VR128X:$src2), 3057*9880d681SAndroid Build Coastguard Worker "vmovsd.s", "$src2, $src1", "$src1, $src2", []>, 3058*9880d681SAndroid Build Coastguard Worker XD, EVEX_4V, VEX_LIG, VEX_W; 3059*9880d681SAndroid Build Coastguard Worker 3060*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 3061*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 15 in { 3062*9880d681SAndroid Build Coastguard Worker // Move scalar to XMM zero-extended, zeroing a VR128X then do a 3063*9880d681SAndroid Build Coastguard Worker // MOVS{S,D} to the lower bits. 3064*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86vzmovl (v4f32 (scalar_to_vector FR32X:$src)))), 3065*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4f32 (V_SET0)), FR32X:$src)>; 3066*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86vzmovl (v4f32 VR128X:$src))), 3067*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4f32 (V_SET0)), (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 3068*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86vzmovl (v4i32 VR128X:$src))), 3069*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4i32 (V_SET0)), (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 3070*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86vzmovl (v2f64 (scalar_to_vector FR64X:$src)))), 3071*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr (v2f64 (V_SET0)), FR64X:$src)>; 3072*9880d681SAndroid Build Coastguard Worker 3073*9880d681SAndroid Build Coastguard Worker // Move low f32 and clear high bits. 3074*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f32 (X86vzmovl (v8f32 VR256X:$src))), 3075*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3076*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4f32 (V_SET0)), 3077*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v8f32 VR256X:$src), sub_xmm)), sub_xmm)>; 3078*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i32 (X86vzmovl (v8i32 VR256X:$src))), 3079*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3080*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4i32 (V_SET0)), 3081*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v8i32 VR256X:$src), sub_xmm)), sub_xmm)>; 3082*9880d681SAndroid Build Coastguard Worker } 3083*9880d681SAndroid Build Coastguard Worker 3084*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 20 in { 3085*9880d681SAndroid Build Coastguard Worker // MOVSSrm zeros the high parts of the register; represent this 3086*9880d681SAndroid Build Coastguard Worker // with SUBREG_TO_REG. The AVX versions also write: DST[255:128] <- 0 3087*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86vzmovl (v4f32 (scalar_to_vector (loadf32 addr:$src))))), 3088*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSSZrm addr:$src), VR128X)>; 3089*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (scalar_to_vector (loadf32 addr:$src))), 3090*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSSZrm addr:$src), VR128X)>; 3091*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86vzmovl (loadv4f32 addr:$src))), 3092*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSSZrm addr:$src), VR128X)>; 3093*9880d681SAndroid Build Coastguard Worker 3094*9880d681SAndroid Build Coastguard Worker // MOVSDrm zeros the high parts of the register; represent this 3095*9880d681SAndroid Build Coastguard Worker // with SUBREG_TO_REG. The AVX versions also write: DST[255:128] <- 0 3096*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86vzmovl (v2f64 (scalar_to_vector (loadf64 addr:$src))))), 3097*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSDZrm addr:$src), VR128X)>; 3098*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (scalar_to_vector (loadf64 addr:$src))), 3099*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSDZrm addr:$src), VR128X)>; 3100*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86vzmovl (loadv2f64 addr:$src))), 3101*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSDZrm addr:$src), VR128X)>; 3102*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86vzmovl (bc_v2f64 (loadv4f32 addr:$src)))), 3103*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSDZrm addr:$src), VR128X)>; 3104*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86vzload addr:$src)), 3105*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSDZrm addr:$src), VR128X)>; 3106*9880d681SAndroid Build Coastguard Worker 3107*9880d681SAndroid Build Coastguard Worker // Represent the same patterns above but in the form they appear for 3108*9880d681SAndroid Build Coastguard Worker // 256-bit types 3109*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i32 (X86vzmovl (insert_subvector undef, 3110*9880d681SAndroid Build Coastguard Worker (v4i32 (scalar_to_vector (loadi32 addr:$src))), (iPTR 0)))), 3111*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVDI2PDIZrm addr:$src), sub_xmm)>; 3112*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f32 (X86vzmovl (insert_subvector undef, 3113*9880d681SAndroid Build Coastguard Worker (v4f32 (scalar_to_vector (loadf32 addr:$src))), (iPTR 0)))), 3114*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSSZrm addr:$src), sub_xmm)>; 3115*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (X86vzmovl (insert_subvector undef, 3116*9880d681SAndroid Build Coastguard Worker (v2f64 (scalar_to_vector (loadf64 addr:$src))), (iPTR 0)))), 3117*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSDZrm addr:$src), sub_xmm)>; 3118*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (X86vzload addr:$src)), 3119*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSDZrm addr:$src), sub_xmm)>; 3120*9880d681SAndroid Build Coastguard Worker 3121*9880d681SAndroid Build Coastguard Worker // Represent the same patterns above but in the form they appear for 3122*9880d681SAndroid Build Coastguard Worker // 512-bit types 3123*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i32 (X86vzmovl (insert_subvector undef, 3124*9880d681SAndroid Build Coastguard Worker (v4i32 (scalar_to_vector (loadi32 addr:$src))), (iPTR 0)))), 3125*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVDI2PDIZrm addr:$src), sub_xmm)>; 3126*9880d681SAndroid Build Coastguard Worker def : Pat<(v16f32 (X86vzmovl (insert_subvector undef, 3127*9880d681SAndroid Build Coastguard Worker (v4f32 (scalar_to_vector (loadf32 addr:$src))), (iPTR 0)))), 3128*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSSZrm addr:$src), sub_xmm)>; 3129*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f64 (X86vzmovl (insert_subvector undef, 3130*9880d681SAndroid Build Coastguard Worker (v2f64 (scalar_to_vector (loadf64 addr:$src))), (iPTR 0)))), 3131*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSDZrm addr:$src), sub_xmm)>; 3132*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f64 (X86vzload addr:$src)), 3133*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSDZrm addr:$src), sub_xmm)>; 3134*9880d681SAndroid Build Coastguard Worker } 3135*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f32 (X86vzmovl (insert_subvector undef, 3136*9880d681SAndroid Build Coastguard Worker (v4f32 (scalar_to_vector FR32X:$src)), (iPTR 0)))), 3137*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (v4f32 (VMOVSSZrr (v4f32 (V_SET0)), 3138*9880d681SAndroid Build Coastguard Worker FR32X:$src)), sub_xmm)>; 3139*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (X86vzmovl (insert_subvector undef, 3140*9880d681SAndroid Build Coastguard Worker (v2f64 (scalar_to_vector FR64X:$src)), (iPTR 0)))), 3141*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (v2f64 (VMOVSDZrr (v2f64 (V_SET0)), 3142*9880d681SAndroid Build Coastguard Worker FR64X:$src)), sub_xmm)>; 3143*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i64 (X86vzmovl (insert_subvector undef, 3144*9880d681SAndroid Build Coastguard Worker (v2i64 (scalar_to_vector (loadi64 addr:$src))), (iPTR 0)))), 3145*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (VMOVQI2PQIZrm addr:$src), sub_xmm)>; 3146*9880d681SAndroid Build Coastguard Worker 3147*9880d681SAndroid Build Coastguard Worker // Move low f64 and clear high bits. 3148*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (X86vzmovl (v4f64 VR256X:$src))), 3149*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3150*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr (v2f64 (V_SET0)), 3151*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v4f64 VR256X:$src), sub_xmm)), sub_xmm)>; 3152*9880d681SAndroid Build Coastguard Worker 3153*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i64 (X86vzmovl (v4i64 VR256X:$src))), 3154*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVSDZrr (v2i64 (V_SET0)), 3155*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v4i64 VR256X:$src), sub_xmm)), sub_xmm)>; 3156*9880d681SAndroid Build Coastguard Worker 3157*9880d681SAndroid Build Coastguard Worker // Extract and store. 3158*9880d681SAndroid Build Coastguard Worker def : Pat<(store (f32 (extractelt (v4f32 VR128X:$src), (iPTR 0))), 3159*9880d681SAndroid Build Coastguard Worker addr:$dst), 3160*9880d681SAndroid Build Coastguard Worker (VMOVSSZmr addr:$dst, (COPY_TO_REGCLASS (v4f32 VR128X:$src), FR32X))>; 3161*9880d681SAndroid Build Coastguard Worker 3162*9880d681SAndroid Build Coastguard Worker // Shuffle with VMOVSS 3163*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86Movss VR128X:$src1, VR128X:$src2)), 3164*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4i32 VR128X:$src1), 3165*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (v4i32 VR128X:$src2), FR32X))>; 3166*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86Movss VR128X:$src1, VR128X:$src2)), 3167*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (v4f32 VR128X:$src1), 3168*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (v4f32 VR128X:$src2), FR32X))>; 3169*9880d681SAndroid Build Coastguard Worker 3170*9880d681SAndroid Build Coastguard Worker // 256-bit variants 3171*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i32 (X86Movss VR256X:$src1, VR256X:$src2)), 3172*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3173*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (EXTRACT_SUBREG (v8i32 VR256X:$src1), sub_xmm), 3174*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v8i32 VR256X:$src2), sub_xmm)), 3175*9880d681SAndroid Build Coastguard Worker sub_xmm)>; 3176*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f32 (X86Movss VR256X:$src1, VR256X:$src2)), 3177*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3178*9880d681SAndroid Build Coastguard Worker (VMOVSSZrr (EXTRACT_SUBREG (v8f32 VR256X:$src1), sub_xmm), 3179*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v8f32 VR256X:$src2), sub_xmm)), 3180*9880d681SAndroid Build Coastguard Worker sub_xmm)>; 3181*9880d681SAndroid Build Coastguard Worker 3182*9880d681SAndroid Build Coastguard Worker // Shuffle with VMOVSD 3183*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86Movsd VR128X:$src1, VR128X:$src2)), 3184*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3185*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86Movsd VR128X:$src1, VR128X:$src2)), 3186*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3187*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86Movsd VR128X:$src1, VR128X:$src2)), 3188*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3189*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86Movsd VR128X:$src1, VR128X:$src2)), 3190*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3191*9880d681SAndroid Build Coastguard Worker 3192*9880d681SAndroid Build Coastguard Worker // 256-bit variants 3193*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i64 (X86Movsd VR256X:$src1, VR256X:$src2)), 3194*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3195*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr (EXTRACT_SUBREG (v4i64 VR256X:$src1), sub_xmm), 3196*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v4i64 VR256X:$src2), sub_xmm)), 3197*9880d681SAndroid Build Coastguard Worker sub_xmm)>; 3198*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (X86Movsd VR256X:$src1, VR256X:$src2)), 3199*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3200*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr (EXTRACT_SUBREG (v4f64 VR256X:$src1), sub_xmm), 3201*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v4f64 VR256X:$src2), sub_xmm)), 3202*9880d681SAndroid Build Coastguard Worker sub_xmm)>; 3203*9880d681SAndroid Build Coastguard Worker 3204*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86Movlpd VR128X:$src1, VR128X:$src2)), 3205*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3206*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86Movlpd VR128X:$src1, VR128X:$src2)), 3207*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3208*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86Movlps VR128X:$src1, VR128X:$src2)), 3209*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3210*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86Movlps VR128X:$src1, VR128X:$src2)), 3211*9880d681SAndroid Build Coastguard Worker (VMOVSDZrr VR128X:$src1, (COPY_TO_REGCLASS VR128X:$src2, FR64X))>; 3212*9880d681SAndroid Build Coastguard Worker} 3213*9880d681SAndroid Build Coastguard Worker 3214*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 15 in 3215*9880d681SAndroid Build Coastguard Workerdef VMOVZPQILo2PQIZrr : AVX512XSI<0x7E, MRMSrcReg, (outs VR128X:$dst), 3216*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src), 3217*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 3218*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (v2i64 (X86vzmovl 3219*9880d681SAndroid Build Coastguard Worker (v2i64 VR128X:$src))))], 3220*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVQ_RR>, EVEX, VEX_W; 3221*9880d681SAndroid Build Coastguard Worker 3222*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 , isCodeGenOnly = 1 in 3223*9880d681SAndroid Build Coastguard Workerdef VMOVZPQILo2PQIZrm : AVX512XSI<0x7E, MRMSrcMem, (outs VR128X:$dst), 3224*9880d681SAndroid Build Coastguard Worker (ins i128mem:$src), 3225*9880d681SAndroid Build Coastguard Worker "vmovq\t{$src, $dst|$dst, $src}", 3226*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (v2i64 (X86vzmovl 3227*9880d681SAndroid Build Coastguard Worker (loadv2i64 addr:$src))))], 3228*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOVDQ>, EVEX, VEX_W, 3229*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VT8>; 3230*9880d681SAndroid Build Coastguard Worker 3231*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 3232*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 15 in { 3233*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86vzmovl (v4i32 (scalar_to_vector GR32:$src)))), 3234*9880d681SAndroid Build Coastguard Worker (VMOVDI2PDIZrr GR32:$src)>; 3235*9880d681SAndroid Build Coastguard Worker 3236*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86vzmovl (v2i64 (scalar_to_vector GR64:$src)))), 3237*9880d681SAndroid Build Coastguard Worker (VMOV64toPQIZrr GR64:$src)>; 3238*9880d681SAndroid Build Coastguard Worker 3239*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i64 (X86vzmovl (insert_subvector undef, 3240*9880d681SAndroid Build Coastguard Worker (v2i64 (scalar_to_vector GR64:$src)),(iPTR 0)))), 3241*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (VMOV64toPQIZrr GR64:$src), sub_xmm)>; 3242*9880d681SAndroid Build Coastguard Worker } 3243*9880d681SAndroid Build Coastguard Worker // AVX 128-bit movd/movq instruction write zeros in the high 128-bit part. 3244*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 20 in { 3245*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86vzmovl (v4i32 (scalar_to_vector (loadi32 addr:$src))))), 3246*9880d681SAndroid Build Coastguard Worker (VMOVDI2PDIZrm addr:$src)>; 3247*9880d681SAndroid Build Coastguard Worker 3248*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86vzmovl (bc_v4i32 (loadv4f32 addr:$src)))), 3249*9880d681SAndroid Build Coastguard Worker (VMOVDI2PDIZrm addr:$src)>; 3250*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86vzmovl (bc_v4i32 (loadv2i64 addr:$src)))), 3251*9880d681SAndroid Build Coastguard Worker (VMOVDI2PDIZrm addr:$src)>; 3252*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86vzmovl (loadv2i64 addr:$src))), 3253*9880d681SAndroid Build Coastguard Worker (VMOVZPQILo2PQIZrm addr:$src)>; 3254*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86vzmovl (v2f64 VR128X:$src))), 3255*9880d681SAndroid Build Coastguard Worker (VMOVZPQILo2PQIZrr VR128X:$src)>; 3256*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86vzload addr:$src)), 3257*9880d681SAndroid Build Coastguard Worker (VMOVZPQILo2PQIZrm addr:$src)>; 3258*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i64 (X86vzload addr:$src)), 3259*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (VMOVZPQILo2PQIZrm addr:$src), sub_xmm)>; 3260*9880d681SAndroid Build Coastguard Worker } 3261*9880d681SAndroid Build Coastguard Worker 3262*9880d681SAndroid Build Coastguard Worker // Use regular 128-bit instructions to match 256-bit scalar_to_vec+zext. 3263*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i32 (X86vzmovl (insert_subvector undef, 3264*9880d681SAndroid Build Coastguard Worker (v4i32 (scalar_to_vector GR32:$src)),(iPTR 0)))), 3265*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVDI2PDIZrr GR32:$src), sub_xmm)>; 3266*9880d681SAndroid Build Coastguard Worker 3267*9880d681SAndroid Build Coastguard Worker // Use regular 128-bit instructions to match 512-bit scalar_to_vec+zext. 3268*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i64 (X86vzload addr:$src)), 3269*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (VMOVZPQILo2PQIZrm addr:$src), sub_xmm)>; 3270*9880d681SAndroid Build Coastguard Worker} 3271*9880d681SAndroid Build Coastguard Worker 3272*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (X86Vinsert (v16i32 immAllZerosV), GR32:$src2, (iPTR 0))), 3273*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVDI2PDIZrr GR32:$src2), sub_xmm)>; 3274*9880d681SAndroid Build Coastguard Worker 3275*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (X86Vinsert (bc_v8i64 (v16i32 immAllZerosV)), GR64:$src2, (iPTR 0))), 3276*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOV64toPQIZrr GR64:$src2), sub_xmm)>; 3277*9880d681SAndroid Build Coastguard Worker 3278*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i32 (X86Vinsert undef, GR32:$src2, (iPTR 0))), 3279*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOVDI2PDIZrr GR32:$src2), sub_xmm)>; 3280*9880d681SAndroid Build Coastguard Worker 3281*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i64 (X86Vinsert undef, GR64:$src2, (iPTR 0))), 3282*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (VMOV64toPQIZrr GR64:$src2), sub_xmm)>; 3283*9880d681SAndroid Build Coastguard Worker 3284*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3285*9880d681SAndroid Build Coastguard Worker// AVX-512 - Non-temporals 3286*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3287*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteLoad] in { 3288*9880d681SAndroid Build Coastguard Worker def VMOVNTDQAZrm : AVX512PI<0x2A, MRMSrcMem, (outs VR512:$dst), 3289*9880d681SAndroid Build Coastguard Worker (ins i512mem:$src), "vmovntdqa\t{$src, $dst|$dst, $src}", 3290*9880d681SAndroid Build Coastguard Worker [(set VR512:$dst, (int_x86_avx512_movntdqa addr:$src))], 3291*9880d681SAndroid Build Coastguard Worker SSEPackedInt>, EVEX, T8PD, EVEX_V512, 3292*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 3293*9880d681SAndroid Build Coastguard Worker 3294*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 3295*9880d681SAndroid Build Coastguard Worker def VMOVNTDQAZ256rm : AVX512PI<0x2A, MRMSrcMem, (outs VR256X:$dst), 3296*9880d681SAndroid Build Coastguard Worker (ins i256mem:$src), 3297*9880d681SAndroid Build Coastguard Worker "vmovntdqa\t{$src, $dst|$dst, $src}", 3298*9880d681SAndroid Build Coastguard Worker [(set VR256X:$dst, (int_x86_avx2_movntdqa addr:$src))], 3299*9880d681SAndroid Build Coastguard Worker SSEPackedInt>, EVEX, T8PD, EVEX_V256, 3300*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 3301*9880d681SAndroid Build Coastguard Worker 3302*9880d681SAndroid Build Coastguard Worker def VMOVNTDQAZ128rm : AVX512PI<0x2A, MRMSrcMem, (outs VR128X:$dst), 3303*9880d681SAndroid Build Coastguard Worker (ins i128mem:$src), 3304*9880d681SAndroid Build Coastguard Worker "vmovntdqa\t{$src, $dst|$dst, $src}", 3305*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (int_x86_sse41_movntdqa addr:$src))], 3306*9880d681SAndroid Build Coastguard Worker SSEPackedInt>, EVEX, T8PD, EVEX_V128, 3307*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 3308*9880d681SAndroid Build Coastguard Worker } 3309*9880d681SAndroid Build Coastguard Worker} 3310*9880d681SAndroid Build Coastguard Worker 3311*9880d681SAndroid Build Coastguard Workermulticlass avx512_movnt<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 3312*9880d681SAndroid Build Coastguard Worker PatFrag st_frag = alignednontemporalstore, 3313*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = IIC_SSE_MOVNT> { 3314*9880d681SAndroid Build Coastguard Worker let SchedRW = [WriteStore], AddedComplexity = 400 in 3315*9880d681SAndroid Build Coastguard Worker def mr : AVX512PI<opc, MRMDestMem, (outs), (ins _.MemOp:$dst, _.RC:$src), 3316*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 3317*9880d681SAndroid Build Coastguard Worker [(st_frag (_.VT _.RC:$src), addr:$dst)], 3318*9880d681SAndroid Build Coastguard Worker _.ExeDomain, itin>, EVEX, EVEX_CD8<_.EltSize, CD8VF>; 3319*9880d681SAndroid Build Coastguard Worker} 3320*9880d681SAndroid Build Coastguard Worker 3321*9880d681SAndroid Build Coastguard Workermulticlass avx512_movnt_vl<bits<8> opc, string OpcodeStr, 3322*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 3323*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 3324*9880d681SAndroid Build Coastguard Worker defm Z : avx512_movnt<opc, OpcodeStr, VTInfo.info512>, EVEX_V512; 3325*9880d681SAndroid Build Coastguard Worker 3326*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 3327*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_movnt<opc, OpcodeStr, VTInfo.info256>, EVEX_V256; 3328*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_movnt<opc, OpcodeStr, VTInfo.info128>, EVEX_V128; 3329*9880d681SAndroid Build Coastguard Worker } 3330*9880d681SAndroid Build Coastguard Worker} 3331*9880d681SAndroid Build Coastguard Worker 3332*9880d681SAndroid Build Coastguard Workerdefm VMOVNTDQ : avx512_movnt_vl<0xE7, "vmovntdq", avx512vl_i64_info>, PD; 3333*9880d681SAndroid Build Coastguard Workerdefm VMOVNTPD : avx512_movnt_vl<0x2B, "vmovntpd", avx512vl_f64_info>, PD, VEX_W; 3334*9880d681SAndroid Build Coastguard Workerdefm VMOVNTPS : avx512_movnt_vl<0x2B, "vmovntps", avx512vl_f32_info>, PS; 3335*9880d681SAndroid Build Coastguard Worker 3336*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512], AddedComplexity = 400 in { 3337*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v16i32 VR512:$src), addr:$dst), 3338*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZmr addr:$dst, VR512:$src)>; 3339*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v32i16 VR512:$src), addr:$dst), 3340*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZmr addr:$dst, VR512:$src)>; 3341*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v64i8 VR512:$src), addr:$dst), 3342*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZmr addr:$dst, VR512:$src)>; 3343*9880d681SAndroid Build Coastguard Worker 3344*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f64 (alignednontemporalload addr:$src)), 3345*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZrm addr:$src)>; 3346*9880d681SAndroid Build Coastguard Worker def : Pat<(v16f32 (alignednontemporalload addr:$src)), 3347*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZrm addr:$src)>; 3348*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i64 (alignednontemporalload addr:$src)), 3349*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZrm addr:$src)>; 3350*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i32 (alignednontemporalload addr:$src)), 3351*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZrm addr:$src)>; 3352*9880d681SAndroid Build Coastguard Worker def : Pat<(v32i16 (alignednontemporalload addr:$src)), 3353*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZrm addr:$src)>; 3354*9880d681SAndroid Build Coastguard Worker def : Pat<(v64i8 (alignednontemporalload addr:$src)), 3355*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZrm addr:$src)>; 3356*9880d681SAndroid Build Coastguard Worker} 3357*9880d681SAndroid Build Coastguard Worker 3358*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX], AddedComplexity = 400 in { 3359*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v8i32 VR256X:$src), addr:$dst), 3360*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZ256mr addr:$dst, VR256X:$src)>; 3361*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v16i16 VR256X:$src), addr:$dst), 3362*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZ256mr addr:$dst, VR256X:$src)>; 3363*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v32i8 VR256X:$src), addr:$dst), 3364*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZ256mr addr:$dst, VR256X:$src)>; 3365*9880d681SAndroid Build Coastguard Worker 3366*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (alignednontemporalload addr:$src)), 3367*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ256rm addr:$src)>; 3368*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f32 (alignednontemporalload addr:$src)), 3369*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ256rm addr:$src)>; 3370*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i64 (alignednontemporalload addr:$src)), 3371*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ256rm addr:$src)>; 3372*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i32 (alignednontemporalload addr:$src)), 3373*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ256rm addr:$src)>; 3374*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i16 (alignednontemporalload addr:$src)), 3375*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ256rm addr:$src)>; 3376*9880d681SAndroid Build Coastguard Worker def : Pat<(v32i8 (alignednontemporalload addr:$src)), 3377*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ256rm addr:$src)>; 3378*9880d681SAndroid Build Coastguard Worker 3379*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v4i32 VR128X:$src), addr:$dst), 3380*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZ128mr addr:$dst, VR128X:$src)>; 3381*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v8i16 VR128X:$src), addr:$dst), 3382*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZ128mr addr:$dst, VR128X:$src)>; 3383*9880d681SAndroid Build Coastguard Worker def : Pat<(alignednontemporalstore (v16i8 VR128X:$src), addr:$dst), 3384*9880d681SAndroid Build Coastguard Worker (VMOVNTDQZ128mr addr:$dst, VR128X:$src)>; 3385*9880d681SAndroid Build Coastguard Worker 3386*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (alignednontemporalload addr:$src)), 3387*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ128rm addr:$src)>; 3388*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (alignednontemporalload addr:$src)), 3389*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ128rm addr:$src)>; 3390*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (alignednontemporalload addr:$src)), 3391*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ128rm addr:$src)>; 3392*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (alignednontemporalload addr:$src)), 3393*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ128rm addr:$src)>; 3394*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (alignednontemporalload addr:$src)), 3395*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ128rm addr:$src)>; 3396*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i8 (alignednontemporalload addr:$src)), 3397*9880d681SAndroid Build Coastguard Worker (VMOVNTDQAZ128rm addr:$src)>; 3398*9880d681SAndroid Build Coastguard Worker} 3399*9880d681SAndroid Build Coastguard Worker 3400*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3401*9880d681SAndroid Build Coastguard Worker// AVX-512 - Integer arithmetic 3402*9880d681SAndroid Build Coastguard Worker// 3403*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, 3404*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, OpndItins itins, 3405*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3406*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 3407*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 3408*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3409*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2)), 3410*9880d681SAndroid Build Coastguard Worker itins.rr, IsCommutable>, 3411*9880d681SAndroid Build Coastguard Worker AVX512BIBase, EVEX_4V; 3412*9880d681SAndroid Build Coastguard Worker 3413*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 3414*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2), OpcodeStr, 3415*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3416*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, 3417*9880d681SAndroid Build Coastguard Worker (bitconvert (_.LdFrag addr:$src2)))), 3418*9880d681SAndroid Build Coastguard Worker itins.rm>, 3419*9880d681SAndroid Build Coastguard Worker AVX512BIBase, EVEX_4V; 3420*9880d681SAndroid Build Coastguard Worker} 3421*9880d681SAndroid Build Coastguard Worker 3422*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rmb<bits<8> opc, string OpcodeStr, SDNode OpNode, 3423*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, OpndItins itins, 3424*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> : 3425*9880d681SAndroid Build Coastguard Worker avx512_binop_rm<opc, OpcodeStr, OpNode, _, itins, IsCommutable> { 3426*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 3427*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 3428*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 3429*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 3430*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, 3431*9880d681SAndroid Build Coastguard Worker (X86VBroadcast 3432*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2)))), 3433*9880d681SAndroid Build Coastguard Worker itins.rm>, 3434*9880d681SAndroid Build Coastguard Worker AVX512BIBase, EVEX_4V, EVEX_B; 3435*9880d681SAndroid Build Coastguard Worker} 3436*9880d681SAndroid Build Coastguard Worker 3437*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl<bits<8> opc, string OpcodeStr, SDNode OpNode, 3438*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, OpndItins itins, 3439*9880d681SAndroid Build Coastguard Worker Predicate prd, bit IsCommutable = 0> { 3440*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 3441*9880d681SAndroid Build Coastguard Worker defm Z : avx512_binop_rm<opc, OpcodeStr, OpNode, VTInfo.info512, itins, 3442*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V512; 3443*9880d681SAndroid Build Coastguard Worker 3444*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 3445*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_binop_rm<opc, OpcodeStr, OpNode, VTInfo.info256, itins, 3446*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V256; 3447*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_binop_rm<opc, OpcodeStr, OpNode, VTInfo.info128, itins, 3448*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V128; 3449*9880d681SAndroid Build Coastguard Worker } 3450*9880d681SAndroid Build Coastguard Worker} 3451*9880d681SAndroid Build Coastguard Worker 3452*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rmb_vl<bits<8> opc, string OpcodeStr, SDNode OpNode, 3453*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, OpndItins itins, 3454*9880d681SAndroid Build Coastguard Worker Predicate prd, bit IsCommutable = 0> { 3455*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 3456*9880d681SAndroid Build Coastguard Worker defm Z : avx512_binop_rmb<opc, OpcodeStr, OpNode, VTInfo.info512, itins, 3457*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V512; 3458*9880d681SAndroid Build Coastguard Worker 3459*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 3460*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_binop_rmb<opc, OpcodeStr, OpNode, VTInfo.info256, itins, 3461*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V256; 3462*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_binop_rmb<opc, OpcodeStr, OpNode, VTInfo.info128, itins, 3463*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V128; 3464*9880d681SAndroid Build Coastguard Worker } 3465*9880d681SAndroid Build Coastguard Worker} 3466*9880d681SAndroid Build Coastguard Worker 3467*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_q<bits<8> opc, string OpcodeStr, SDNode OpNode, 3468*9880d681SAndroid Build Coastguard Worker OpndItins itins, Predicate prd, 3469*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3470*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_binop_rmb_vl<opc, OpcodeStr, OpNode, avx512vl_i64_info, 3471*9880d681SAndroid Build Coastguard Worker itins, prd, IsCommutable>, 3472*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_CD8<64, CD8VF>; 3473*9880d681SAndroid Build Coastguard Worker} 3474*9880d681SAndroid Build Coastguard Worker 3475*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_d<bits<8> opc, string OpcodeStr, SDNode OpNode, 3476*9880d681SAndroid Build Coastguard Worker OpndItins itins, Predicate prd, 3477*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3478*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_binop_rmb_vl<opc, OpcodeStr, OpNode, avx512vl_i32_info, 3479*9880d681SAndroid Build Coastguard Worker itins, prd, IsCommutable>, EVEX_CD8<32, CD8VF>; 3480*9880d681SAndroid Build Coastguard Worker} 3481*9880d681SAndroid Build Coastguard Worker 3482*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_w<bits<8> opc, string OpcodeStr, SDNode OpNode, 3483*9880d681SAndroid Build Coastguard Worker OpndItins itins, Predicate prd, 3484*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3485*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_binop_rm_vl<opc, OpcodeStr, OpNode, avx512vl_i16_info, 3486*9880d681SAndroid Build Coastguard Worker itins, prd, IsCommutable>, EVEX_CD8<16, CD8VF>; 3487*9880d681SAndroid Build Coastguard Worker} 3488*9880d681SAndroid Build Coastguard Worker 3489*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_b<bits<8> opc, string OpcodeStr, SDNode OpNode, 3490*9880d681SAndroid Build Coastguard Worker OpndItins itins, Predicate prd, 3491*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3492*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_binop_rm_vl<opc, OpcodeStr, OpNode, avx512vl_i8_info, 3493*9880d681SAndroid Build Coastguard Worker itins, prd, IsCommutable>, EVEX_CD8<8, CD8VF>; 3494*9880d681SAndroid Build Coastguard Worker} 3495*9880d681SAndroid Build Coastguard Worker 3496*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_dq<bits<8> opc_d, bits<8> opc_q, string OpcodeStr, 3497*9880d681SAndroid Build Coastguard Worker SDNode OpNode, OpndItins itins, Predicate prd, 3498*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3499*9880d681SAndroid Build Coastguard Worker defm Q : avx512_binop_rm_vl_q<opc_q, OpcodeStr#"q", OpNode, itins, prd, 3500*9880d681SAndroid Build Coastguard Worker IsCommutable>; 3501*9880d681SAndroid Build Coastguard Worker 3502*9880d681SAndroid Build Coastguard Worker defm D : avx512_binop_rm_vl_d<opc_d, OpcodeStr#"d", OpNode, itins, prd, 3503*9880d681SAndroid Build Coastguard Worker IsCommutable>; 3504*9880d681SAndroid Build Coastguard Worker} 3505*9880d681SAndroid Build Coastguard Worker 3506*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_bw<bits<8> opc_b, bits<8> opc_w, string OpcodeStr, 3507*9880d681SAndroid Build Coastguard Worker SDNode OpNode, OpndItins itins, Predicate prd, 3508*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3509*9880d681SAndroid Build Coastguard Worker defm W : avx512_binop_rm_vl_w<opc_w, OpcodeStr#"w", OpNode, itins, prd, 3510*9880d681SAndroid Build Coastguard Worker IsCommutable>; 3511*9880d681SAndroid Build Coastguard Worker 3512*9880d681SAndroid Build Coastguard Worker defm B : avx512_binop_rm_vl_b<opc_b, OpcodeStr#"b", OpNode, itins, prd, 3513*9880d681SAndroid Build Coastguard Worker IsCommutable>; 3514*9880d681SAndroid Build Coastguard Worker} 3515*9880d681SAndroid Build Coastguard Worker 3516*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm_vl_all<bits<8> opc_b, bits<8> opc_w, 3517*9880d681SAndroid Build Coastguard Worker bits<8> opc_d, bits<8> opc_q, 3518*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, 3519*9880d681SAndroid Build Coastguard Worker OpndItins itins, bit IsCommutable = 0> { 3520*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_binop_rm_vl_dq<opc_d, opc_q, OpcodeStr, OpNode, 3521*9880d681SAndroid Build Coastguard Worker itins, HasAVX512, IsCommutable>, 3522*9880d681SAndroid Build Coastguard Worker avx512_binop_rm_vl_bw<opc_b, opc_w, OpcodeStr, OpNode, 3523*9880d681SAndroid Build Coastguard Worker itins, HasBWI, IsCommutable>; 3524*9880d681SAndroid Build Coastguard Worker} 3525*9880d681SAndroid Build Coastguard Worker 3526*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_rm2<bits<8> opc, string OpcodeStr, OpndItins itins, 3527*9880d681SAndroid Build Coastguard Worker SDNode OpNode,X86VectorVTInfo _Src, 3528*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Dst, X86VectorVTInfo _Brdct, 3529*9880d681SAndroid Build Coastguard Worker bit IsCommutable = 0> { 3530*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _Dst, (outs _Dst.RC:$dst), 3531*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Src.RC:$src2), OpcodeStr, 3532*9880d681SAndroid Build Coastguard Worker "$src2, $src1","$src1, $src2", 3533*9880d681SAndroid Build Coastguard Worker (_Dst.VT (OpNode 3534*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src1), 3535*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src2))), 3536*9880d681SAndroid Build Coastguard Worker itins.rr, IsCommutable>, 3537*9880d681SAndroid Build Coastguard Worker AVX512BIBase, EVEX_4V; 3538*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), 3539*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Src.MemOp:$src2), OpcodeStr, 3540*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3541*9880d681SAndroid Build Coastguard Worker (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), 3542*9880d681SAndroid Build Coastguard Worker (bitconvert (_Src.LdFrag addr:$src2)))), 3543*9880d681SAndroid Build Coastguard Worker itins.rm>, 3544*9880d681SAndroid Build Coastguard Worker AVX512BIBase, EVEX_4V; 3545*9880d681SAndroid Build Coastguard Worker 3546*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), 3547*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Dst.ScalarMemOp:$src2), 3548*9880d681SAndroid Build Coastguard Worker OpcodeStr, 3549*9880d681SAndroid Build Coastguard Worker "${src2}"##_Brdct.BroadcastStr##", $src1", 3550*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_Dst.BroadcastStr, 3551*9880d681SAndroid Build Coastguard Worker (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), (bitconvert 3552*9880d681SAndroid Build Coastguard Worker (_Brdct.VT (X86VBroadcast 3553*9880d681SAndroid Build Coastguard Worker (_Brdct.ScalarLdFrag addr:$src2)))))), 3554*9880d681SAndroid Build Coastguard Worker itins.rm>, 3555*9880d681SAndroid Build Coastguard Worker AVX512BIBase, EVEX_4V, EVEX_B; 3556*9880d681SAndroid Build Coastguard Worker} 3557*9880d681SAndroid Build Coastguard Worker 3558*9880d681SAndroid Build Coastguard Workerdefm VPADD : avx512_binop_rm_vl_all<0xFC, 0xFD, 0xFE, 0xD4, "vpadd", add, 3559*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, 1>; 3560*9880d681SAndroid Build Coastguard Workerdefm VPSUB : avx512_binop_rm_vl_all<0xF8, 0xF9, 0xFA, 0xFB, "vpsub", sub, 3561*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, 0>; 3562*9880d681SAndroid Build Coastguard Workerdefm VPADDS : avx512_binop_rm_vl_bw<0xEC, 0xED, "vpadds", X86adds, 3563*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3564*9880d681SAndroid Build Coastguard Workerdefm VPSUBS : avx512_binop_rm_vl_bw<0xE8, 0xE9, "vpsubs", X86subs, 3565*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 0>; 3566*9880d681SAndroid Build Coastguard Workerdefm VPADDUS : avx512_binop_rm_vl_bw<0xDC, 0xDD, "vpaddus", X86addus, 3567*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3568*9880d681SAndroid Build Coastguard Workerdefm VPSUBUS : avx512_binop_rm_vl_bw<0xD8, 0xD9, "vpsubus", X86subus, 3569*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 0>; 3570*9880d681SAndroid Build Coastguard Workerdefm VPMULLD : avx512_binop_rm_vl_d<0x40, "vpmulld", mul, 3571*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>, T8PD; 3572*9880d681SAndroid Build Coastguard Workerdefm VPMULLW : avx512_binop_rm_vl_w<0xD5, "vpmullw", mul, 3573*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3574*9880d681SAndroid Build Coastguard Workerdefm VPMULLQ : avx512_binop_rm_vl_q<0x40, "vpmullq", mul, 3575*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasDQI, 1>, T8PD; 3576*9880d681SAndroid Build Coastguard Workerdefm VPMULHW : avx512_binop_rm_vl_w<0xE5, "vpmulhw", mulhs, SSE_INTALU_ITINS_P, 3577*9880d681SAndroid Build Coastguard Worker HasBWI, 1>; 3578*9880d681SAndroid Build Coastguard Workerdefm VPMULHUW : avx512_binop_rm_vl_w<0xE4, "vpmulhuw", mulhu, SSE_INTMUL_ITINS_P, 3579*9880d681SAndroid Build Coastguard Worker HasBWI, 1>; 3580*9880d681SAndroid Build Coastguard Workerdefm VPMULHRSW : avx512_binop_rm_vl_w<0x0B, "vpmulhrsw", X86mulhrs, SSE_INTMUL_ITINS_P, 3581*9880d681SAndroid Build Coastguard Worker HasBWI, 1>, T8PD; 3582*9880d681SAndroid Build Coastguard Workerdefm VPAVG : avx512_binop_rm_vl_bw<0xE0, 0xE3, "vpavg", X86avg, 3583*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3584*9880d681SAndroid Build Coastguard Worker 3585*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_all<bits<8> opc, string OpcodeStr, OpndItins itins, 3586*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _SrcVTInfo, AVX512VLVectorVTInfo _DstVTInfo, 3587*9880d681SAndroid Build Coastguard Worker SDNode OpNode, Predicate prd, bit IsCommutable = 0> { 3588*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 3589*9880d681SAndroid Build Coastguard Worker defm NAME#Z : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, 3590*9880d681SAndroid Build Coastguard Worker _SrcVTInfo.info512, _DstVTInfo.info512, 3591*9880d681SAndroid Build Coastguard Worker v8i64_info, IsCommutable>, 3592*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<64, CD8VF>, VEX_W; 3593*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, prd] in { 3594*9880d681SAndroid Build Coastguard Worker defm NAME#Z256 : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, 3595*9880d681SAndroid Build Coastguard Worker _SrcVTInfo.info256, _DstVTInfo.info256, 3596*9880d681SAndroid Build Coastguard Worker v4i64x_info, IsCommutable>, 3597*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<64, CD8VF>, VEX_W; 3598*9880d681SAndroid Build Coastguard Worker defm NAME#Z128 : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, 3599*9880d681SAndroid Build Coastguard Worker _SrcVTInfo.info128, _DstVTInfo.info128, 3600*9880d681SAndroid Build Coastguard Worker v2i64x_info, IsCommutable>, 3601*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<64, CD8VF>, VEX_W; 3602*9880d681SAndroid Build Coastguard Worker } 3603*9880d681SAndroid Build Coastguard Worker} 3604*9880d681SAndroid Build Coastguard Worker 3605*9880d681SAndroid Build Coastguard Workerdefm VPMULDQ : avx512_binop_all<0x28, "vpmuldq", SSE_INTALU_ITINS_P, 3606*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, avx512vl_i64_info, 3607*9880d681SAndroid Build Coastguard Worker X86pmuldq, HasAVX512, 1>,T8PD; 3608*9880d681SAndroid Build Coastguard Workerdefm VPMULUDQ : avx512_binop_all<0xF4, "vpmuludq", SSE_INTMUL_ITINS_P, 3609*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, avx512vl_i64_info, 3610*9880d681SAndroid Build Coastguard Worker X86pmuludq, HasAVX512, 1>; 3611*9880d681SAndroid Build Coastguard Workerdefm VPMULTISHIFTQB : avx512_binop_all<0x83, "vpmultishiftqb", SSE_INTALU_ITINS_P, 3612*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, avx512vl_i8_info, 3613*9880d681SAndroid Build Coastguard Worker X86multishift, HasVBMI, 0>, T8PD; 3614*9880d681SAndroid Build Coastguard Worker 3615*9880d681SAndroid Build Coastguard Workermulticlass avx512_packs_rmb<bits<8> opc, string OpcodeStr, SDNode OpNode, 3616*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, X86VectorVTInfo _Dst> { 3617*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), 3618*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Src.ScalarMemOp:$src2), 3619*9880d681SAndroid Build Coastguard Worker OpcodeStr, 3620*9880d681SAndroid Build Coastguard Worker "${src2}"##_Src.BroadcastStr##", $src1", 3621*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_Src.BroadcastStr, 3622*9880d681SAndroid Build Coastguard Worker (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), (bitconvert 3623*9880d681SAndroid Build Coastguard Worker (_Src.VT (X86VBroadcast 3624*9880d681SAndroid Build Coastguard Worker (_Src.ScalarLdFrag addr:$src2))))))>, 3625*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_B, EVEX_CD8<_Src.EltSize, CD8VF>; 3626*9880d681SAndroid Build Coastguard Worker} 3627*9880d681SAndroid Build Coastguard Worker 3628*9880d681SAndroid Build Coastguard Workermulticlass avx512_packs_rm<bits<8> opc, string OpcodeStr, 3629*9880d681SAndroid Build Coastguard Worker SDNode OpNode,X86VectorVTInfo _Src, 3630*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Dst> { 3631*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _Dst, (outs _Dst.RC:$dst), 3632*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Src.RC:$src2), OpcodeStr, 3633*9880d681SAndroid Build Coastguard Worker "$src2, $src1","$src1, $src2", 3634*9880d681SAndroid Build Coastguard Worker (_Dst.VT (OpNode 3635*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src1), 3636*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src2)))>, 3637*9880d681SAndroid Build Coastguard Worker EVEX_CD8<_Src.EltSize, CD8VF>, EVEX_4V; 3638*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), 3639*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Src.MemOp:$src2), OpcodeStr, 3640*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3641*9880d681SAndroid Build Coastguard Worker (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), 3642*9880d681SAndroid Build Coastguard Worker (bitconvert (_Src.LdFrag addr:$src2))))>, 3643*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_CD8<_Src.EltSize, CD8VF>; 3644*9880d681SAndroid Build Coastguard Worker} 3645*9880d681SAndroid Build Coastguard Worker 3646*9880d681SAndroid Build Coastguard Workermulticlass avx512_packs_all_i32_i16<bits<8> opc, string OpcodeStr, 3647*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 3648*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 3649*9880d681SAndroid Build Coastguard Worker defm NAME#Z : avx512_packs_rm<opc, OpcodeStr, OpNode, v16i32_info, 3650*9880d681SAndroid Build Coastguard Worker v32i16_info>, 3651*9880d681SAndroid Build Coastguard Worker avx512_packs_rmb<opc, OpcodeStr, OpNode, v16i32_info, 3652*9880d681SAndroid Build Coastguard Worker v32i16_info>, EVEX_V512; 3653*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI, HasVLX] in { 3654*9880d681SAndroid Build Coastguard Worker defm NAME#Z256 : avx512_packs_rm<opc, OpcodeStr, OpNode, v8i32x_info, 3655*9880d681SAndroid Build Coastguard Worker v16i16x_info>, 3656*9880d681SAndroid Build Coastguard Worker avx512_packs_rmb<opc, OpcodeStr, OpNode, v8i32x_info, 3657*9880d681SAndroid Build Coastguard Worker v16i16x_info>, EVEX_V256; 3658*9880d681SAndroid Build Coastguard Worker defm NAME#Z128 : avx512_packs_rm<opc, OpcodeStr, OpNode, v4i32x_info, 3659*9880d681SAndroid Build Coastguard Worker v8i16x_info>, 3660*9880d681SAndroid Build Coastguard Worker avx512_packs_rmb<opc, OpcodeStr, OpNode, v4i32x_info, 3661*9880d681SAndroid Build Coastguard Worker v8i16x_info>, EVEX_V128; 3662*9880d681SAndroid Build Coastguard Worker } 3663*9880d681SAndroid Build Coastguard Worker} 3664*9880d681SAndroid Build Coastguard Workermulticlass avx512_packs_all_i16_i8<bits<8> opc, string OpcodeStr, 3665*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 3666*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 3667*9880d681SAndroid Build Coastguard Worker defm NAME#Z : avx512_packs_rm<opc, OpcodeStr, OpNode, v32i16_info, 3668*9880d681SAndroid Build Coastguard Worker v64i8_info>, EVEX_V512; 3669*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI, HasVLX] in { 3670*9880d681SAndroid Build Coastguard Worker defm NAME#Z256 : avx512_packs_rm<opc, OpcodeStr, OpNode, v16i16x_info, 3671*9880d681SAndroid Build Coastguard Worker v32i8x_info>, EVEX_V256; 3672*9880d681SAndroid Build Coastguard Worker defm NAME#Z128 : avx512_packs_rm<opc, OpcodeStr, OpNode, v8i16x_info, 3673*9880d681SAndroid Build Coastguard Worker v16i8x_info>, EVEX_V128; 3674*9880d681SAndroid Build Coastguard Worker } 3675*9880d681SAndroid Build Coastguard Worker} 3676*9880d681SAndroid Build Coastguard Worker 3677*9880d681SAndroid Build Coastguard Workermulticlass avx512_vpmadd<bits<8> opc, string OpcodeStr, 3678*9880d681SAndroid Build Coastguard Worker SDNode OpNode, AVX512VLVectorVTInfo _Src, 3679*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _Dst> { 3680*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 3681*9880d681SAndroid Build Coastguard Worker defm NAME#Z : avx512_packs_rm<opc, OpcodeStr, OpNode, _Src.info512, 3682*9880d681SAndroid Build Coastguard Worker _Dst.info512>, EVEX_V512; 3683*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI, HasVLX] in { 3684*9880d681SAndroid Build Coastguard Worker defm NAME#Z256 : avx512_packs_rm<opc, OpcodeStr, OpNode, _Src.info256, 3685*9880d681SAndroid Build Coastguard Worker _Dst.info256>, EVEX_V256; 3686*9880d681SAndroid Build Coastguard Worker defm NAME#Z128 : avx512_packs_rm<opc, OpcodeStr, OpNode, _Src.info128, 3687*9880d681SAndroid Build Coastguard Worker _Dst.info128>, EVEX_V128; 3688*9880d681SAndroid Build Coastguard Worker } 3689*9880d681SAndroid Build Coastguard Worker} 3690*9880d681SAndroid Build Coastguard Worker 3691*9880d681SAndroid Build Coastguard Workerdefm VPACKSSDW : avx512_packs_all_i32_i16<0x6B, "vpackssdw", X86Packss>, AVX512BIBase; 3692*9880d681SAndroid Build Coastguard Workerdefm VPACKUSDW : avx512_packs_all_i32_i16<0x2b, "vpackusdw", X86Packus>, AVX5128IBase; 3693*9880d681SAndroid Build Coastguard Workerdefm VPACKSSWB : avx512_packs_all_i16_i8 <0x63, "vpacksswb", X86Packss>, AVX512BIBase; 3694*9880d681SAndroid Build Coastguard Workerdefm VPACKUSWB : avx512_packs_all_i16_i8 <0x67, "vpackuswb", X86Packus>, AVX512BIBase; 3695*9880d681SAndroid Build Coastguard Worker 3696*9880d681SAndroid Build Coastguard Workerdefm VPMADDUBSW : avx512_vpmadd<0x04, "vpmaddubsw", X86vpmaddubsw, 3697*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, avx512vl_i16_info>, AVX512BIBase, T8PD; 3698*9880d681SAndroid Build Coastguard Workerdefm VPMADDWD : avx512_vpmadd<0xF5, "vpmaddwd", X86vpmaddwd, 3699*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, avx512vl_i32_info>, AVX512BIBase; 3700*9880d681SAndroid Build Coastguard Worker 3701*9880d681SAndroid Build Coastguard Workerdefm VPMAXSB : avx512_binop_rm_vl_b<0x3C, "vpmaxsb", smax, 3702*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>, T8PD; 3703*9880d681SAndroid Build Coastguard Workerdefm VPMAXSW : avx512_binop_rm_vl_w<0xEE, "vpmaxsw", smax, 3704*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3705*9880d681SAndroid Build Coastguard Workerdefm VPMAXS : avx512_binop_rm_vl_dq<0x3D, 0x3D, "vpmaxs", smax, 3706*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>, T8PD; 3707*9880d681SAndroid Build Coastguard Worker 3708*9880d681SAndroid Build Coastguard Workerdefm VPMAXUB : avx512_binop_rm_vl_b<0xDE, "vpmaxub", umax, 3709*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3710*9880d681SAndroid Build Coastguard Workerdefm VPMAXUW : avx512_binop_rm_vl_w<0x3E, "vpmaxuw", umax, 3711*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>, T8PD; 3712*9880d681SAndroid Build Coastguard Workerdefm VPMAXU : avx512_binop_rm_vl_dq<0x3F, 0x3F, "vpmaxu", umax, 3713*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>, T8PD; 3714*9880d681SAndroid Build Coastguard Worker 3715*9880d681SAndroid Build Coastguard Workerdefm VPMINSB : avx512_binop_rm_vl_b<0x38, "vpminsb", smin, 3716*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>, T8PD; 3717*9880d681SAndroid Build Coastguard Workerdefm VPMINSW : avx512_binop_rm_vl_w<0xEA, "vpminsw", smin, 3718*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3719*9880d681SAndroid Build Coastguard Workerdefm VPMINS : avx512_binop_rm_vl_dq<0x39, 0x39, "vpmins", smin, 3720*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>, T8PD; 3721*9880d681SAndroid Build Coastguard Worker 3722*9880d681SAndroid Build Coastguard Workerdefm VPMINUB : avx512_binop_rm_vl_b<0xDA, "vpminub", umin, 3723*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>; 3724*9880d681SAndroid Build Coastguard Workerdefm VPMINUW : avx512_binop_rm_vl_w<0x3A, "vpminuw", umin, 3725*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI, 1>, T8PD; 3726*9880d681SAndroid Build Coastguard Workerdefm VPMINU : avx512_binop_rm_vl_dq<0x3B, 0x3B, "vpminu", umin, 3727*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>, T8PD; 3728*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3729*9880d681SAndroid Build Coastguard Worker// AVX-512 Logical Instructions 3730*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3731*9880d681SAndroid Build Coastguard Worker 3732*9880d681SAndroid Build Coastguard Workerdefm VPAND : avx512_binop_rm_vl_dq<0xDB, 0xDB, "vpand", and, 3733*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>; 3734*9880d681SAndroid Build Coastguard Workerdefm VPOR : avx512_binop_rm_vl_dq<0xEB, 0xEB, "vpor", or, 3735*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>; 3736*9880d681SAndroid Build Coastguard Workerdefm VPXOR : avx512_binop_rm_vl_dq<0xEF, 0xEF, "vpxor", xor, 3737*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 1>; 3738*9880d681SAndroid Build Coastguard Workerdefm VPANDN : avx512_binop_rm_vl_dq<0xDF, 0xDF, "vpandn", X86andnp, 3739*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512, 0>; 3740*9880d681SAndroid Build Coastguard Worker 3741*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3742*9880d681SAndroid Build Coastguard Worker// AVX-512 FP arithmetic 3743*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3744*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalar<bits<8> opc, string OpcodeStr,X86VectorVTInfo _, 3745*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode VecNode, OpndItins itins, 3746*9880d681SAndroid Build Coastguard Worker bit IsCommutable> { 3747*9880d681SAndroid Build Coastguard Worker 3748*9880d681SAndroid Build Coastguard Worker defm rr_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 3749*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 3750*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3751*9880d681SAndroid Build Coastguard Worker (VecNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 3752*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)), 3753*9880d681SAndroid Build Coastguard Worker itins.rr, IsCommutable>; 3754*9880d681SAndroid Build Coastguard Worker 3755*9880d681SAndroid Build Coastguard Worker defm rm_Int : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 3756*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 3757*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3758*9880d681SAndroid Build Coastguard Worker (VecNode (_.VT _.RC:$src1), 3759*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector (_.ScalarLdFrag addr:$src2))), 3760*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)), 3761*9880d681SAndroid Build Coastguard Worker itins.rm, IsCommutable>; 3762*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1, isCommutable = IsCommutable, 3763*9880d681SAndroid Build Coastguard Worker Predicates = [HasAVX512] in { 3764*9880d681SAndroid Build Coastguard Worker def rr : I< opc, MRMSrcReg, (outs _.FRC:$dst), 3765*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.FRC:$src2), 3766*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 3767*9880d681SAndroid Build Coastguard Worker [(set _.FRC:$dst, (OpNode _.FRC:$src1, _.FRC:$src2))], 3768*9880d681SAndroid Build Coastguard Worker itins.rr>; 3769*9880d681SAndroid Build Coastguard Worker def rm : I< opc, MRMSrcMem, (outs _.FRC:$dst), 3770*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.ScalarMemOp:$src2), 3771*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 3772*9880d681SAndroid Build Coastguard Worker [(set _.FRC:$dst, (OpNode _.FRC:$src1, 3773*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2)))], itins.rm>; 3774*9880d681SAndroid Build Coastguard Worker } 3775*9880d681SAndroid Build Coastguard Worker} 3776*9880d681SAndroid Build Coastguard Worker 3777*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalar_round<bits<8> opc, string OpcodeStr,X86VectorVTInfo _, 3778*9880d681SAndroid Build Coastguard Worker SDNode VecNode, OpndItins itins, bit IsCommutable = 0> { 3779*9880d681SAndroid Build Coastguard Worker 3780*9880d681SAndroid Build Coastguard Worker defm rrb : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 3781*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, AVX512RC:$rc), OpcodeStr, 3782*9880d681SAndroid Build Coastguard Worker "$rc, $src2, $src1", "$src1, $src2, $rc", 3783*9880d681SAndroid Build Coastguard Worker (VecNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 3784*9880d681SAndroid Build Coastguard Worker (i32 imm:$rc)), itins.rr, IsCommutable>, 3785*9880d681SAndroid Build Coastguard Worker EVEX_B, EVEX_RC; 3786*9880d681SAndroid Build Coastguard Worker} 3787*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalar_sae<bits<8> opc, string OpcodeStr,X86VectorVTInfo _, 3788*9880d681SAndroid Build Coastguard Worker SDNode VecNode, OpndItins itins, bit IsCommutable> { 3789*9880d681SAndroid Build Coastguard Worker 3790*9880d681SAndroid Build Coastguard Worker defm rrb : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 3791*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 3792*9880d681SAndroid Build Coastguard Worker "{sae}, $src2, $src1", "$src1, $src2, {sae}", 3793*9880d681SAndroid Build Coastguard Worker (VecNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 3794*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 3795*9880d681SAndroid Build Coastguard Worker} 3796*9880d681SAndroid Build Coastguard Worker 3797*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_s_round<bits<8> opc, string OpcodeStr, SDNode OpNode, 3798*9880d681SAndroid Build Coastguard Worker SDNode VecNode, 3799*9880d681SAndroid Build Coastguard Worker SizeItins itins, bit IsCommutable> { 3800*9880d681SAndroid Build Coastguard Worker defm SSZ : avx512_fp_scalar<opc, OpcodeStr#"ss", f32x_info, OpNode, VecNode, 3801*9880d681SAndroid Build Coastguard Worker itins.s, IsCommutable>, 3802*9880d681SAndroid Build Coastguard Worker avx512_fp_scalar_round<opc, OpcodeStr#"ss", f32x_info, VecNode, 3803*9880d681SAndroid Build Coastguard Worker itins.s, IsCommutable>, 3804*9880d681SAndroid Build Coastguard Worker XS, EVEX_4V, VEX_LIG, EVEX_CD8<32, CD8VT1>; 3805*9880d681SAndroid Build Coastguard Worker defm SDZ : avx512_fp_scalar<opc, OpcodeStr#"sd", f64x_info, OpNode, VecNode, 3806*9880d681SAndroid Build Coastguard Worker itins.d, IsCommutable>, 3807*9880d681SAndroid Build Coastguard Worker avx512_fp_scalar_round<opc, OpcodeStr#"sd", f64x_info, VecNode, 3808*9880d681SAndroid Build Coastguard Worker itins.d, IsCommutable>, 3809*9880d681SAndroid Build Coastguard Worker XD, VEX_W, EVEX_4V, VEX_LIG, EVEX_CD8<64, CD8VT1>; 3810*9880d681SAndroid Build Coastguard Worker} 3811*9880d681SAndroid Build Coastguard Worker 3812*9880d681SAndroid Build Coastguard Workermulticlass avx512_binop_s_sae<bits<8> opc, string OpcodeStr, SDNode OpNode, 3813*9880d681SAndroid Build Coastguard Worker SDNode VecNode, 3814*9880d681SAndroid Build Coastguard Worker SizeItins itins, bit IsCommutable> { 3815*9880d681SAndroid Build Coastguard Worker defm SSZ : avx512_fp_scalar<opc, OpcodeStr#"ss", f32x_info, OpNode, VecNode, 3816*9880d681SAndroid Build Coastguard Worker itins.s, IsCommutable>, 3817*9880d681SAndroid Build Coastguard Worker avx512_fp_scalar_sae<opc, OpcodeStr#"ss", f32x_info, VecNode, 3818*9880d681SAndroid Build Coastguard Worker itins.s, IsCommutable>, 3819*9880d681SAndroid Build Coastguard Worker XS, EVEX_4V, VEX_LIG, EVEX_CD8<32, CD8VT1>; 3820*9880d681SAndroid Build Coastguard Worker defm SDZ : avx512_fp_scalar<opc, OpcodeStr#"sd", f64x_info, OpNode, VecNode, 3821*9880d681SAndroid Build Coastguard Worker itins.d, IsCommutable>, 3822*9880d681SAndroid Build Coastguard Worker avx512_fp_scalar_sae<opc, OpcodeStr#"sd", f64x_info, VecNode, 3823*9880d681SAndroid Build Coastguard Worker itins.d, IsCommutable>, 3824*9880d681SAndroid Build Coastguard Worker XD, VEX_W, EVEX_4V, VEX_LIG, EVEX_CD8<64, CD8VT1>; 3825*9880d681SAndroid Build Coastguard Worker} 3826*9880d681SAndroid Build Coastguard Workerdefm VADD : avx512_binop_s_round<0x58, "vadd", fadd, X86faddRnd, SSE_ALU_ITINS_S, 1>; 3827*9880d681SAndroid Build Coastguard Workerdefm VMUL : avx512_binop_s_round<0x59, "vmul", fmul, X86fmulRnd, SSE_ALU_ITINS_S, 1>; 3828*9880d681SAndroid Build Coastguard Workerdefm VSUB : avx512_binop_s_round<0x5C, "vsub", fsub, X86fsubRnd, SSE_ALU_ITINS_S, 0>; 3829*9880d681SAndroid Build Coastguard Workerdefm VDIV : avx512_binop_s_round<0x5E, "vdiv", fdiv, X86fdivRnd, SSE_ALU_ITINS_S, 0>; 3830*9880d681SAndroid Build Coastguard Workerdefm VMIN : avx512_binop_s_sae <0x5D, "vmin", X86fmin, X86fminRnd, SSE_ALU_ITINS_S, 0>; 3831*9880d681SAndroid Build Coastguard Workerdefm VMAX : avx512_binop_s_sae <0x5F, "vmax", X86fmax, X86fmaxRnd, SSE_ALU_ITINS_S, 0>; 3832*9880d681SAndroid Build Coastguard Worker 3833*9880d681SAndroid Build Coastguard Worker// MIN/MAX nodes are commutable under "unsafe-fp-math". In this case we use 3834*9880d681SAndroid Build Coastguard Worker// X86fminc and X86fmaxc instead of X86fmin and X86fmax 3835*9880d681SAndroid Build Coastguard Workermulticlass avx512_comutable_binop_s<bits<8> opc, string OpcodeStr, 3836*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, SDNode OpNode, OpndItins itins> { 3837*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1, isCommutable =1, Predicates = [HasAVX512] in { 3838*9880d681SAndroid Build Coastguard Worker def rr : I< opc, MRMSrcReg, (outs _.FRC:$dst), 3839*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.FRC:$src2), 3840*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 3841*9880d681SAndroid Build Coastguard Worker [(set _.FRC:$dst, (OpNode _.FRC:$src1, _.FRC:$src2))], 3842*9880d681SAndroid Build Coastguard Worker itins.rr>; 3843*9880d681SAndroid Build Coastguard Worker def rm : I< opc, MRMSrcMem, (outs _.FRC:$dst), 3844*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.ScalarMemOp:$src2), 3845*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 3846*9880d681SAndroid Build Coastguard Worker [(set _.FRC:$dst, (OpNode _.FRC:$src1, 3847*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2)))], itins.rm>; 3848*9880d681SAndroid Build Coastguard Worker } 3849*9880d681SAndroid Build Coastguard Worker} 3850*9880d681SAndroid Build Coastguard Workerdefm VMINCSSZ : avx512_comutable_binop_s<0x5D, "vminss", f32x_info, X86fminc, 3851*9880d681SAndroid Build Coastguard Worker SSE_ALU_ITINS_S.s>, XS, EVEX_4V, VEX_LIG, 3852*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 3853*9880d681SAndroid Build Coastguard Worker 3854*9880d681SAndroid Build Coastguard Workerdefm VMINCSDZ : avx512_comutable_binop_s<0x5D, "vminsd", f64x_info, X86fminc, 3855*9880d681SAndroid Build Coastguard Worker SSE_ALU_ITINS_S.d>, XD, VEX_W, EVEX_4V, VEX_LIG, 3856*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VT1>; 3857*9880d681SAndroid Build Coastguard Worker 3858*9880d681SAndroid Build Coastguard Workerdefm VMAXCSSZ : avx512_comutable_binop_s<0x5F, "vmaxss", f32x_info, X86fmaxc, 3859*9880d681SAndroid Build Coastguard Worker SSE_ALU_ITINS_S.s>, XS, EVEX_4V, VEX_LIG, 3860*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 3861*9880d681SAndroid Build Coastguard Worker 3862*9880d681SAndroid Build Coastguard Workerdefm VMAXCSDZ : avx512_comutable_binop_s<0x5F, "vmaxsd", f64x_info, X86fmaxc, 3863*9880d681SAndroid Build Coastguard Worker SSE_ALU_ITINS_S.d>, XD, VEX_W, EVEX_4V, VEX_LIG, 3864*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VT1>; 3865*9880d681SAndroid Build Coastguard Worker 3866*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_packed<bits<8> opc, string OpcodeStr, SDNode OpNode, 3867*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, bit IsCommutable> { 3868*9880d681SAndroid Build Coastguard Worker defm rr: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 3869*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr##_.Suffix, 3870*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3871*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2))>, EVEX_4V; 3872*9880d681SAndroid Build Coastguard Worker defm rm: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 3873*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2), OpcodeStr##_.Suffix, 3874*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3875*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, (_.LdFrag addr:$src2))>, EVEX_4V; 3876*9880d681SAndroid Build Coastguard Worker defm rmb: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 3877*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr##_.Suffix, 3878*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 3879*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 3880*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, (_.VT (X86VBroadcast 3881*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2))))>, 3882*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_B; 3883*9880d681SAndroid Build Coastguard Worker} 3884*9880d681SAndroid Build Coastguard Worker 3885*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_round_packed<bits<8> opc, string OpcodeStr, SDNode OpNodeRnd, 3886*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 3887*9880d681SAndroid Build Coastguard Worker defm rb: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 3888*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, AVX512RC:$rc), OpcodeStr##_.Suffix, 3889*9880d681SAndroid Build Coastguard Worker "$rc, $src2, $src1", "$src1, $src2, $rc", 3890*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src1, _.RC:$src2, (i32 imm:$rc)))>, 3891*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_B, EVEX_RC; 3892*9880d681SAndroid Build Coastguard Worker} 3893*9880d681SAndroid Build Coastguard Worker 3894*9880d681SAndroid Build Coastguard Worker 3895*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_sae_packed<bits<8> opc, string OpcodeStr, SDNode OpNodeRnd, 3896*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 3897*9880d681SAndroid Build Coastguard Worker defm rb: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 3898*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr##_.Suffix, 3899*9880d681SAndroid Build Coastguard Worker "{sae}, $src2, $src1", "$src1, $src2, {sae}", 3900*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src1, _.RC:$src2, (i32 FROUND_NO_EXC)))>, 3901*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_B; 3902*9880d681SAndroid Build Coastguard Worker} 3903*9880d681SAndroid Build Coastguard Worker 3904*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_binop_p<bits<8> opc, string OpcodeStr, SDNode OpNode, 3905*9880d681SAndroid Build Coastguard Worker Predicate prd, bit IsCommutable = 0> { 3906*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 3907*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_fp_packed<opc, OpcodeStr, OpNode, v16f32_info, 3908*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V512, PS, 3909*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 3910*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_fp_packed<opc, OpcodeStr, OpNode, v8f64_info, 3911*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V512, PD, VEX_W, 3912*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 3913*9880d681SAndroid Build Coastguard Worker } 3914*9880d681SAndroid Build Coastguard Worker 3915*9880d681SAndroid Build Coastguard Worker // Define only if AVX512VL feature is present. 3916*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 3917*9880d681SAndroid Build Coastguard Worker defm PSZ128 : avx512_fp_packed<opc, OpcodeStr, OpNode, v4f32x_info, 3918*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V128, PS, 3919*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 3920*9880d681SAndroid Build Coastguard Worker defm PSZ256 : avx512_fp_packed<opc, OpcodeStr, OpNode, v8f32x_info, 3921*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V256, PS, 3922*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 3923*9880d681SAndroid Build Coastguard Worker defm PDZ128 : avx512_fp_packed<opc, OpcodeStr, OpNode, v2f64x_info, 3924*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V128, PD, VEX_W, 3925*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 3926*9880d681SAndroid Build Coastguard Worker defm PDZ256 : avx512_fp_packed<opc, OpcodeStr, OpNode, v4f64x_info, 3927*9880d681SAndroid Build Coastguard Worker IsCommutable>, EVEX_V256, PD, VEX_W, 3928*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 3929*9880d681SAndroid Build Coastguard Worker } 3930*9880d681SAndroid Build Coastguard Worker} 3931*9880d681SAndroid Build Coastguard Worker 3932*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_binop_p_round<bits<8> opc, string OpcodeStr, SDNode OpNodeRnd> { 3933*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_fp_round_packed<opc, OpcodeStr, OpNodeRnd, v16f32_info>, 3934*9880d681SAndroid Build Coastguard Worker EVEX_V512, PS, EVEX_CD8<32, CD8VF>; 3935*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_fp_round_packed<opc, OpcodeStr, OpNodeRnd, v8f64_info>, 3936*9880d681SAndroid Build Coastguard Worker EVEX_V512, PD, VEX_W,EVEX_CD8<64, CD8VF>; 3937*9880d681SAndroid Build Coastguard Worker} 3938*9880d681SAndroid Build Coastguard Worker 3939*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_binop_p_sae<bits<8> opc, string OpcodeStr, SDNode OpNodeRnd> { 3940*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_fp_sae_packed<opc, OpcodeStr, OpNodeRnd, v16f32_info>, 3941*9880d681SAndroid Build Coastguard Worker EVEX_V512, PS, EVEX_CD8<32, CD8VF>; 3942*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_fp_sae_packed<opc, OpcodeStr, OpNodeRnd, v8f64_info>, 3943*9880d681SAndroid Build Coastguard Worker EVEX_V512, PD, VEX_W,EVEX_CD8<64, CD8VF>; 3944*9880d681SAndroid Build Coastguard Worker} 3945*9880d681SAndroid Build Coastguard Worker 3946*9880d681SAndroid Build Coastguard Workerdefm VADD : avx512_fp_binop_p<0x58, "vadd", fadd, HasAVX512, 1>, 3947*9880d681SAndroid Build Coastguard Worker avx512_fp_binop_p_round<0x58, "vadd", X86faddRnd>; 3948*9880d681SAndroid Build Coastguard Workerdefm VMUL : avx512_fp_binop_p<0x59, "vmul", fmul, HasAVX512, 1>, 3949*9880d681SAndroid Build Coastguard Worker avx512_fp_binop_p_round<0x59, "vmul", X86fmulRnd>; 3950*9880d681SAndroid Build Coastguard Workerdefm VSUB : avx512_fp_binop_p<0x5C, "vsub", fsub, HasAVX512>, 3951*9880d681SAndroid Build Coastguard Worker avx512_fp_binop_p_round<0x5C, "vsub", X86fsubRnd>; 3952*9880d681SAndroid Build Coastguard Workerdefm VDIV : avx512_fp_binop_p<0x5E, "vdiv", fdiv, HasAVX512>, 3953*9880d681SAndroid Build Coastguard Worker avx512_fp_binop_p_round<0x5E, "vdiv", X86fdivRnd>; 3954*9880d681SAndroid Build Coastguard Workerdefm VMIN : avx512_fp_binop_p<0x5D, "vmin", X86fmin, HasAVX512, 0>, 3955*9880d681SAndroid Build Coastguard Worker avx512_fp_binop_p_sae<0x5D, "vmin", X86fminRnd>; 3956*9880d681SAndroid Build Coastguard Workerdefm VMAX : avx512_fp_binop_p<0x5F, "vmax", X86fmax, HasAVX512, 0>, 3957*9880d681SAndroid Build Coastguard Worker avx512_fp_binop_p_sae<0x5F, "vmax", X86fmaxRnd>; 3958*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 3959*9880d681SAndroid Build Coastguard Worker defm VMINC : avx512_fp_binop_p<0x5D, "vmin", X86fminc, HasAVX512, 1>; 3960*9880d681SAndroid Build Coastguard Worker defm VMAXC : avx512_fp_binop_p<0x5F, "vmax", X86fmaxc, HasAVX512, 1>; 3961*9880d681SAndroid Build Coastguard Worker} 3962*9880d681SAndroid Build Coastguard Workerdefm VAND : avx512_fp_binop_p<0x54, "vand", X86fand, HasDQI, 1>; 3963*9880d681SAndroid Build Coastguard Workerdefm VANDN : avx512_fp_binop_p<0x55, "vandn", X86fandn, HasDQI, 0>; 3964*9880d681SAndroid Build Coastguard Workerdefm VOR : avx512_fp_binop_p<0x56, "vor", X86for, HasDQI, 1>; 3965*9880d681SAndroid Build Coastguard Workerdefm VXOR : avx512_fp_binop_p<0x57, "vxor", X86fxor, HasDQI, 1>; 3966*9880d681SAndroid Build Coastguard Worker 3967*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalef_p<bits<8> opc, string OpcodeStr, SDNode OpNode, 3968*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 3969*9880d681SAndroid Build Coastguard Worker defm rr: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 3970*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr##_.Suffix, 3971*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3972*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, (i32 FROUND_CURRENT)))>, EVEX_4V; 3973*9880d681SAndroid Build Coastguard Worker defm rm: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 3974*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2), OpcodeStr##_.Suffix, 3975*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3976*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, (_.LdFrag addr:$src2), (i32 FROUND_CURRENT))>, EVEX_4V; 3977*9880d681SAndroid Build Coastguard Worker defm rmb: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 3978*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr##_.Suffix, 3979*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 3980*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 3981*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, (_.VT (X86VBroadcast 3982*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2))), (i32 FROUND_CURRENT))>, 3983*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_B; 3984*9880d681SAndroid Build Coastguard Worker} 3985*9880d681SAndroid Build Coastguard Worker 3986*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalef_scalar<bits<8> opc, string OpcodeStr, SDNode OpNode, 3987*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 3988*9880d681SAndroid Build Coastguard Worker defm rr: AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 3989*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr##_.Suffix, 3990*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3991*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, (i32 FROUND_CURRENT)))>; 3992*9880d681SAndroid Build Coastguard Worker defm rm: AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 3993*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr##_.Suffix, 3994*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 3995*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, 3996*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector (_.ScalarLdFrag addr:$src2))), 3997*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 3998*9880d681SAndroid Build Coastguard Worker} 3999*9880d681SAndroid Build Coastguard Worker 4000*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalef_all<bits<8> opc, bits<8> opcScaler, string OpcodeStr, SDNode OpNode, SDNode OpNodeScal> { 4001*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_fp_scalef_p<opc, OpcodeStr, OpNode, v16f32_info>, 4002*9880d681SAndroid Build Coastguard Worker avx512_fp_round_packed<opc, OpcodeStr, OpNode, v16f32_info>, 4003*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VF>; 4004*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_fp_scalef_p<opc, OpcodeStr, OpNode, v8f64_info>, 4005*9880d681SAndroid Build Coastguard Worker avx512_fp_round_packed<opc, OpcodeStr, OpNode, v8f64_info>, 4006*9880d681SAndroid Build Coastguard Worker EVEX_V512, VEX_W, EVEX_CD8<64, CD8VF>; 4007*9880d681SAndroid Build Coastguard Worker defm SSZ128 : avx512_fp_scalef_scalar<opcScaler, OpcodeStr, OpNodeScal, f32x_info>, 4008*9880d681SAndroid Build Coastguard Worker avx512_fp_scalar_round<opcScaler, OpcodeStr##"ss", f32x_info, OpNodeScal, SSE_ALU_ITINS_S.s>, 4009*9880d681SAndroid Build Coastguard Worker EVEX_4V,EVEX_CD8<32, CD8VT1>; 4010*9880d681SAndroid Build Coastguard Worker defm SDZ128 : avx512_fp_scalef_scalar<opcScaler, OpcodeStr, OpNodeScal, f64x_info>, 4011*9880d681SAndroid Build Coastguard Worker avx512_fp_scalar_round<opcScaler, OpcodeStr##"sd", f64x_info, OpNodeScal, SSE_ALU_ITINS_S.d>, 4012*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_CD8<64, CD8VT1>, VEX_W; 4013*9880d681SAndroid Build Coastguard Worker 4014*9880d681SAndroid Build Coastguard Worker // Define only if AVX512VL feature is present. 4015*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 4016*9880d681SAndroid Build Coastguard Worker defm PSZ128 : avx512_fp_scalef_p<opc, OpcodeStr, OpNode, v4f32x_info>, 4017*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<32, CD8VF>; 4018*9880d681SAndroid Build Coastguard Worker defm PSZ256 : avx512_fp_scalef_p<opc, OpcodeStr, OpNode, v8f32x_info>, 4019*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<32, CD8VF>; 4020*9880d681SAndroid Build Coastguard Worker defm PDZ128 : avx512_fp_scalef_p<opc, OpcodeStr, OpNode, v2f64x_info>, 4021*9880d681SAndroid Build Coastguard Worker EVEX_V128, VEX_W, EVEX_CD8<64, CD8VF>; 4022*9880d681SAndroid Build Coastguard Worker defm PDZ256 : avx512_fp_scalef_p<opc, OpcodeStr, OpNode, v4f64x_info>, 4023*9880d681SAndroid Build Coastguard Worker EVEX_V256, VEX_W, EVEX_CD8<64, CD8VF>; 4024*9880d681SAndroid Build Coastguard Worker } 4025*9880d681SAndroid Build Coastguard Worker} 4026*9880d681SAndroid Build Coastguard Workerdefm VSCALEF : avx512_fp_scalef_all<0x2C, 0x2D, "vscalef", X86scalef, X86scalefs>, T8PD; 4027*9880d681SAndroid Build Coastguard Worker 4028*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4029*9880d681SAndroid Build Coastguard Worker// AVX-512 VPTESTM instructions 4030*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4031*9880d681SAndroid Build Coastguard Worker 4032*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest<bits<8> opc, string OpcodeStr, SDNode OpNode, 4033*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4034*9880d681SAndroid Build Coastguard Worker let isCommutable = 1 in 4035*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable_cmp<opc, MRMSrcReg, _, (outs _.KRC:$dst), 4036*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 4037*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4038*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2))>, 4039*9880d681SAndroid Build Coastguard Worker EVEX_4V; 4040*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable_cmp<opc, MRMSrcMem, _, (outs _.KRC:$dst), 4041*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2), OpcodeStr, 4042*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4043*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 4044*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))))>, 4045*9880d681SAndroid Build Coastguard Worker EVEX_4V, 4046*9880d681SAndroid Build Coastguard Worker EVEX_CD8<_.EltSize, CD8VF>; 4047*9880d681SAndroid Build Coastguard Worker} 4048*9880d681SAndroid Build Coastguard Worker 4049*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest_mb<bits<8> opc, string OpcodeStr, SDNode OpNode, 4050*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4051*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable_cmp<opc, MRMSrcMem, _, (outs _.KRC:$dst), 4052*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 4053*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 4054*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 4055*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT (X86VBroadcast 4056*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2))))>, 4057*9880d681SAndroid Build Coastguard Worker EVEX_B, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; 4058*9880d681SAndroid Build Coastguard Worker} 4059*9880d681SAndroid Build Coastguard Worker 4060*9880d681SAndroid Build Coastguard Worker// Use 512bit version to implement 128/256 bit in case NoVLX. 4061*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest_lowering<SDNode OpNode, X86VectorVTInfo ExtendInfo, 4062*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, string Suffix> { 4063*9880d681SAndroid Build Coastguard Worker def : Pat<(_.KVT (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2))), 4064*9880d681SAndroid Build Coastguard Worker (_.KVT (COPY_TO_REGCLASS 4065*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME # Suffix # "Zrr") 4066*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (ExtendInfo.VT (IMPLICIT_DEF)), 4067*9880d681SAndroid Build Coastguard Worker _.RC:$src1, _.SubRegIdx), 4068*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (ExtendInfo.VT (IMPLICIT_DEF)), 4069*9880d681SAndroid Build Coastguard Worker _.RC:$src2, _.SubRegIdx)), 4070*9880d681SAndroid Build Coastguard Worker _.KRC))>; 4071*9880d681SAndroid Build Coastguard Worker} 4072*9880d681SAndroid Build Coastguard Worker 4073*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest_dq_sizes<bits<8> opc, string OpcodeStr, SDNode OpNode, 4074*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, string Suffix> { 4075*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 4076*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vptest<opc, OpcodeStr, OpNode, _.info512>, 4077*9880d681SAndroid Build Coastguard Worker avx512_vptest_mb<opc, OpcodeStr, OpNode, _.info512>, EVEX_V512; 4078*9880d681SAndroid Build Coastguard Worker 4079*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 4080*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vptest<opc, OpcodeStr, OpNode, _.info256>, 4081*9880d681SAndroid Build Coastguard Worker avx512_vptest_mb<opc, OpcodeStr, OpNode, _.info256>, EVEX_V256; 4082*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vptest<opc, OpcodeStr, OpNode, _.info128>, 4083*9880d681SAndroid Build Coastguard Worker avx512_vptest_mb<opc, OpcodeStr, OpNode, _.info128>, EVEX_V128; 4084*9880d681SAndroid Build Coastguard Worker } 4085*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, NoVLX] in { 4086*9880d681SAndroid Build Coastguard Worker defm Z256_Alt : avx512_vptest_lowering< OpNode, _.info512, _.info256, Suffix>; 4087*9880d681SAndroid Build Coastguard Worker defm Z128_Alt : avx512_vptest_lowering< OpNode, _.info512, _.info128, Suffix>; 4088*9880d681SAndroid Build Coastguard Worker } 4089*9880d681SAndroid Build Coastguard Worker} 4090*9880d681SAndroid Build Coastguard Worker 4091*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest_dq<bits<8> opc, string OpcodeStr, SDNode OpNode> { 4092*9880d681SAndroid Build Coastguard Worker defm D : avx512_vptest_dq_sizes<opc, OpcodeStr#"d", OpNode, 4093*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, "D">; 4094*9880d681SAndroid Build Coastguard Worker defm Q : avx512_vptest_dq_sizes<opc, OpcodeStr#"q", OpNode, 4095*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, "Q">, VEX_W; 4096*9880d681SAndroid Build Coastguard Worker} 4097*9880d681SAndroid Build Coastguard Worker 4098*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest_wb<bits<8> opc, string OpcodeStr, 4099*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 4100*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 4101*9880d681SAndroid Build Coastguard Worker defm WZ: avx512_vptest<opc, OpcodeStr#"w", OpNode, v32i16_info>, 4102*9880d681SAndroid Build Coastguard Worker EVEX_V512, VEX_W; 4103*9880d681SAndroid Build Coastguard Worker defm BZ: avx512_vptest<opc, OpcodeStr#"b", OpNode, v64i8_info>, 4104*9880d681SAndroid Build Coastguard Worker EVEX_V512; 4105*9880d681SAndroid Build Coastguard Worker } 4106*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasBWI] in { 4107*9880d681SAndroid Build Coastguard Worker 4108*9880d681SAndroid Build Coastguard Worker defm WZ256: avx512_vptest<opc, OpcodeStr#"w", OpNode, v16i16x_info>, 4109*9880d681SAndroid Build Coastguard Worker EVEX_V256, VEX_W; 4110*9880d681SAndroid Build Coastguard Worker defm WZ128: avx512_vptest<opc, OpcodeStr#"w", OpNode, v8i16x_info>, 4111*9880d681SAndroid Build Coastguard Worker EVEX_V128, VEX_W; 4112*9880d681SAndroid Build Coastguard Worker defm BZ256: avx512_vptest<opc, OpcodeStr#"b", OpNode, v32i8x_info>, 4113*9880d681SAndroid Build Coastguard Worker EVEX_V256; 4114*9880d681SAndroid Build Coastguard Worker defm BZ128: avx512_vptest<opc, OpcodeStr#"b", OpNode, v16i8x_info>, 4115*9880d681SAndroid Build Coastguard Worker EVEX_V128; 4116*9880d681SAndroid Build Coastguard Worker } 4117*9880d681SAndroid Build Coastguard Worker 4118*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, NoVLX] in { 4119*9880d681SAndroid Build Coastguard Worker defm BZ256_Alt : avx512_vptest_lowering< OpNode, v64i8_info, v32i8x_info, "B">; 4120*9880d681SAndroid Build Coastguard Worker defm BZ128_Alt : avx512_vptest_lowering< OpNode, v64i8_info, v16i8x_info, "B">; 4121*9880d681SAndroid Build Coastguard Worker defm WZ256_Alt : avx512_vptest_lowering< OpNode, v32i16_info, v16i16x_info, "W">; 4122*9880d681SAndroid Build Coastguard Worker defm WZ128_Alt : avx512_vptest_lowering< OpNode, v32i16_info, v8i16x_info, "W">; 4123*9880d681SAndroid Build Coastguard Worker } 4124*9880d681SAndroid Build Coastguard Worker 4125*9880d681SAndroid Build Coastguard Worker} 4126*9880d681SAndroid Build Coastguard Worker 4127*9880d681SAndroid Build Coastguard Workermulticlass avx512_vptest_all_forms<bits<8> opc_wb, bits<8> opc_dq, string OpcodeStr, 4128*9880d681SAndroid Build Coastguard Worker SDNode OpNode> : 4129*9880d681SAndroid Build Coastguard Worker avx512_vptest_wb <opc_wb, OpcodeStr, OpNode>, 4130*9880d681SAndroid Build Coastguard Worker avx512_vptest_dq<opc_dq, OpcodeStr, OpNode>; 4131*9880d681SAndroid Build Coastguard Worker 4132*9880d681SAndroid Build Coastguard Workerdefm VPTESTM : avx512_vptest_all_forms<0x26, 0x27, "vptestm", X86testm>, T8PD; 4133*9880d681SAndroid Build Coastguard Workerdefm VPTESTNM : avx512_vptest_all_forms<0x26, 0x27, "vptestnm", X86testnm>, T8XS; 4134*9880d681SAndroid Build Coastguard Worker 4135*9880d681SAndroid Build Coastguard Worker 4136*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4137*9880d681SAndroid Build Coastguard Worker// AVX-512 Shift instructions 4138*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4139*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_rmi<bits<8> opc, Format ImmFormR, Format ImmFormM, 4140*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, X86VectorVTInfo _> { 4141*9880d681SAndroid Build Coastguard Worker defm ri : AVX512_maskable<opc, ImmFormR, _, (outs _.RC:$dst), 4142*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, u8imm:$src2), OpcodeStr, 4143*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4144*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (i8 imm:$src2))), 4145*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rr>; 4146*9880d681SAndroid Build Coastguard Worker defm mi : AVX512_maskable<opc, ImmFormM, _, (outs _.RC:$dst), 4147*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src1, u8imm:$src2), OpcodeStr, 4148*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4149*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT (bitconvert (_.LdFrag addr:$src1))), 4150*9880d681SAndroid Build Coastguard Worker (i8 imm:$src2))), 4151*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rm>; 4152*9880d681SAndroid Build Coastguard Worker} 4153*9880d681SAndroid Build Coastguard Worker 4154*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_rmbi<bits<8> opc, Format ImmFormM, 4155*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, X86VectorVTInfo _> { 4156*9880d681SAndroid Build Coastguard Worker defm mbi : AVX512_maskable<opc, ImmFormM, _, (outs _.RC:$dst), 4157*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src1, u8imm:$src2), OpcodeStr, 4158*9880d681SAndroid Build Coastguard Worker "$src2, ${src1}"##_.BroadcastStr, "${src1}"##_.BroadcastStr##", $src2", 4159*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (X86VBroadcast (_.ScalarLdFrag addr:$src1)), (i8 imm:$src2))), 4160*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rm>, EVEX_B; 4161*9880d681SAndroid Build Coastguard Worker} 4162*9880d681SAndroid Build Coastguard Worker 4163*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_rrm<bits<8> opc, string OpcodeStr, SDNode OpNode, 4164*9880d681SAndroid Build Coastguard Worker ValueType SrcVT, PatFrag bc_frag, X86VectorVTInfo _> { 4165*9880d681SAndroid Build Coastguard Worker // src2 is always 128-bit 4166*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 4167*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, VR128X:$src2), OpcodeStr, 4168*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4169*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (SrcVT VR128X:$src2))), 4170*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rr>, AVX512BIBase, EVEX_4V; 4171*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 4172*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, i128mem:$src2), OpcodeStr, 4173*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4174*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (bc_frag (loadv2i64 addr:$src2)))), 4175*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rm>, AVX512BIBase, 4176*9880d681SAndroid Build Coastguard Worker EVEX_4V; 4177*9880d681SAndroid Build Coastguard Worker} 4178*9880d681SAndroid Build Coastguard Worker 4179*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_sizes<bits<8> opc, string OpcodeStr, SDNode OpNode, 4180*9880d681SAndroid Build Coastguard Worker ValueType SrcVT, PatFrag bc_frag, 4181*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 4182*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 4183*9880d681SAndroid Build Coastguard Worker defm Z : avx512_shift_rrm<opc, OpcodeStr, OpNode, SrcVT, bc_frag, 4184*9880d681SAndroid Build Coastguard Worker VTInfo.info512>, EVEX_V512, 4185*9880d681SAndroid Build Coastguard Worker EVEX_CD8<VTInfo.info512.EltSize, CD8VQ> ; 4186*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 4187*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_shift_rrm<opc, OpcodeStr, OpNode, SrcVT, bc_frag, 4188*9880d681SAndroid Build Coastguard Worker VTInfo.info256>, EVEX_V256, 4189*9880d681SAndroid Build Coastguard Worker EVEX_CD8<VTInfo.info256.EltSize, CD8VH>; 4190*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_shift_rrm<opc, OpcodeStr, OpNode, SrcVT, bc_frag, 4191*9880d681SAndroid Build Coastguard Worker VTInfo.info128>, EVEX_V128, 4192*9880d681SAndroid Build Coastguard Worker EVEX_CD8<VTInfo.info128.EltSize, CD8VF>; 4193*9880d681SAndroid Build Coastguard Worker } 4194*9880d681SAndroid Build Coastguard Worker} 4195*9880d681SAndroid Build Coastguard Worker 4196*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_types<bits<8> opcd, bits<8> opcq, bits<8> opcw, 4197*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode> { 4198*9880d681SAndroid Build Coastguard Worker defm D : avx512_shift_sizes<opcd, OpcodeStr#"d", OpNode, v4i32, bc_v4i32, 4199*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, HasAVX512>; 4200*9880d681SAndroid Build Coastguard Worker defm Q : avx512_shift_sizes<opcq, OpcodeStr#"q", OpNode, v2i64, bc_v2i64, 4201*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, HasAVX512>, VEX_W; 4202*9880d681SAndroid Build Coastguard Worker defm W : avx512_shift_sizes<opcw, OpcodeStr#"w", OpNode, v8i16, bc_v8i16, 4203*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, HasBWI>; 4204*9880d681SAndroid Build Coastguard Worker} 4205*9880d681SAndroid Build Coastguard Worker 4206*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_rmi_sizes<bits<8> opc, Format ImmFormR, Format ImmFormM, 4207*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, 4208*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 4209*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 4210*9880d681SAndroid Build Coastguard Worker defm Z: avx512_shift_rmi<opc, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4211*9880d681SAndroid Build Coastguard Worker VTInfo.info512>, 4212*9880d681SAndroid Build Coastguard Worker avx512_shift_rmbi<opc, ImmFormM, OpcodeStr, OpNode, 4213*9880d681SAndroid Build Coastguard Worker VTInfo.info512>, EVEX_V512; 4214*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 4215*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_shift_rmi<opc, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4216*9880d681SAndroid Build Coastguard Worker VTInfo.info256>, 4217*9880d681SAndroid Build Coastguard Worker avx512_shift_rmbi<opc, ImmFormM, OpcodeStr, OpNode, 4218*9880d681SAndroid Build Coastguard Worker VTInfo.info256>, EVEX_V256; 4219*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_shift_rmi<opc, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4220*9880d681SAndroid Build Coastguard Worker VTInfo.info128>, 4221*9880d681SAndroid Build Coastguard Worker avx512_shift_rmbi<opc, ImmFormM, OpcodeStr, OpNode, 4222*9880d681SAndroid Build Coastguard Worker VTInfo.info128>, EVEX_V128; 4223*9880d681SAndroid Build Coastguard Worker } 4224*9880d681SAndroid Build Coastguard Worker} 4225*9880d681SAndroid Build Coastguard Worker 4226*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_rmi_w<bits<8> opcw, 4227*9880d681SAndroid Build Coastguard Worker Format ImmFormR, Format ImmFormM, 4228*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode> { 4229*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 4230*9880d681SAndroid Build Coastguard Worker defm WZ: avx512_shift_rmi<opcw, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4231*9880d681SAndroid Build Coastguard Worker v32i16_info>, EVEX_V512; 4232*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasBWI] in { 4233*9880d681SAndroid Build Coastguard Worker defm WZ256: avx512_shift_rmi<opcw, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4234*9880d681SAndroid Build Coastguard Worker v16i16x_info>, EVEX_V256; 4235*9880d681SAndroid Build Coastguard Worker defm WZ128: avx512_shift_rmi<opcw, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4236*9880d681SAndroid Build Coastguard Worker v8i16x_info>, EVEX_V128; 4237*9880d681SAndroid Build Coastguard Worker } 4238*9880d681SAndroid Build Coastguard Worker} 4239*9880d681SAndroid Build Coastguard Worker 4240*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_rmi_dq<bits<8> opcd, bits<8> opcq, 4241*9880d681SAndroid Build Coastguard Worker Format ImmFormR, Format ImmFormM, 4242*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode> { 4243*9880d681SAndroid Build Coastguard Worker defm D: avx512_shift_rmi_sizes<opcd, ImmFormR, ImmFormM, OpcodeStr#"d", OpNode, 4244*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info>, EVEX_CD8<32, CD8VF>; 4245*9880d681SAndroid Build Coastguard Worker defm Q: avx512_shift_rmi_sizes<opcq, ImmFormR, ImmFormM, OpcodeStr#"q", OpNode, 4246*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info>, EVEX_CD8<64, CD8VF>, VEX_W; 4247*9880d681SAndroid Build Coastguard Worker} 4248*9880d681SAndroid Build Coastguard Worker 4249*9880d681SAndroid Build Coastguard Workerdefm VPSRL : avx512_shift_rmi_dq<0x72, 0x73, MRM2r, MRM2m, "vpsrl", X86vsrli>, 4250*9880d681SAndroid Build Coastguard Worker avx512_shift_rmi_w<0x71, MRM2r, MRM2m, "vpsrlw", X86vsrli>, AVX512BIi8Base, EVEX_4V; 4251*9880d681SAndroid Build Coastguard Worker 4252*9880d681SAndroid Build Coastguard Workerdefm VPSLL : avx512_shift_rmi_dq<0x72, 0x73, MRM6r, MRM6m, "vpsll", X86vshli>, 4253*9880d681SAndroid Build Coastguard Worker avx512_shift_rmi_w<0x71, MRM6r, MRM6m, "vpsllw", X86vshli>, AVX512BIi8Base, EVEX_4V; 4254*9880d681SAndroid Build Coastguard Worker 4255*9880d681SAndroid Build Coastguard Workerdefm VPSRA : avx512_shift_rmi_dq<0x72, 0x72, MRM4r, MRM4m, "vpsra", X86vsrai>, 4256*9880d681SAndroid Build Coastguard Worker avx512_shift_rmi_w<0x71, MRM4r, MRM4m, "vpsraw", X86vsrai>, AVX512BIi8Base, EVEX_4V; 4257*9880d681SAndroid Build Coastguard Worker 4258*9880d681SAndroid Build Coastguard Workerdefm VPROR : avx512_shift_rmi_dq<0x72, 0x72, MRM0r, MRM0m, "vpror", X86vrotri>, AVX512BIi8Base, EVEX_4V; 4259*9880d681SAndroid Build Coastguard Workerdefm VPROL : avx512_shift_rmi_dq<0x72, 0x72, MRM1r, MRM1m, "vprol", X86vrotli>, AVX512BIi8Base, EVEX_4V; 4260*9880d681SAndroid Build Coastguard Worker 4261*9880d681SAndroid Build Coastguard Workerdefm VPSLL : avx512_shift_types<0xF2, 0xF3, 0xF1, "vpsll", X86vshl>; 4262*9880d681SAndroid Build Coastguard Workerdefm VPSRA : avx512_shift_types<0xE2, 0xE2, 0xE1, "vpsra", X86vsra>; 4263*9880d681SAndroid Build Coastguard Workerdefm VPSRL : avx512_shift_types<0xD2, 0xD3, 0xD1, "vpsrl", X86vsrl>; 4264*9880d681SAndroid Build Coastguard Worker 4265*9880d681SAndroid Build Coastguard Worker//===-------------------------------------------------------------------===// 4266*9880d681SAndroid Build Coastguard Worker// Variable Bit Shifts 4267*9880d681SAndroid Build Coastguard Worker//===-------------------------------------------------------------------===// 4268*9880d681SAndroid Build Coastguard Workermulticlass avx512_var_shift<bits<8> opc, string OpcodeStr, SDNode OpNode, 4269*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4270*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 4271*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 4272*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4273*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (_.VT _.RC:$src2))), 4274*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rr>, AVX5128IBase, EVEX_4V; 4275*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 4276*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2), OpcodeStr, 4277*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4278*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, 4279*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))))), 4280*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rm>, AVX5128IBase, EVEX_4V, 4281*9880d681SAndroid Build Coastguard Worker EVEX_CD8<_.EltSize, CD8VF>; 4282*9880d681SAndroid Build Coastguard Worker} 4283*9880d681SAndroid Build Coastguard Worker 4284*9880d681SAndroid Build Coastguard Workermulticlass avx512_var_shift_mb<bits<8> opc, string OpcodeStr, SDNode OpNode, 4285*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4286*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 4287*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 4288*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 4289*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 4290*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (_.VT (X86VBroadcast 4291*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2))))), 4292*9880d681SAndroid Build Coastguard Worker SSE_INTSHIFT_ITINS_P.rm>, AVX5128IBase, EVEX_B, 4293*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; 4294*9880d681SAndroid Build Coastguard Worker} 4295*9880d681SAndroid Build Coastguard Workermulticlass avx512_var_shift_sizes<bits<8> opc, string OpcodeStr, SDNode OpNode, 4296*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _> { 4297*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 4298*9880d681SAndroid Build Coastguard Worker defm Z : avx512_var_shift<opc, OpcodeStr, OpNode, _.info512>, 4299*9880d681SAndroid Build Coastguard Worker avx512_var_shift_mb<opc, OpcodeStr, OpNode, _.info512>, EVEX_V512; 4300*9880d681SAndroid Build Coastguard Worker 4301*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 4302*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_var_shift<opc, OpcodeStr, OpNode, _.info256>, 4303*9880d681SAndroid Build Coastguard Worker avx512_var_shift_mb<opc, OpcodeStr, OpNode, _.info256>, EVEX_V256; 4304*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_var_shift<opc, OpcodeStr, OpNode, _.info128>, 4305*9880d681SAndroid Build Coastguard Worker avx512_var_shift_mb<opc, OpcodeStr, OpNode, _.info128>, EVEX_V128; 4306*9880d681SAndroid Build Coastguard Worker } 4307*9880d681SAndroid Build Coastguard Worker} 4308*9880d681SAndroid Build Coastguard Worker 4309*9880d681SAndroid Build Coastguard Workermulticlass avx512_var_shift_types<bits<8> opc, string OpcodeStr, 4310*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 4311*9880d681SAndroid Build Coastguard Worker defm D : avx512_var_shift_sizes<opc, OpcodeStr#"d", OpNode, 4312*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info>; 4313*9880d681SAndroid Build Coastguard Worker defm Q : avx512_var_shift_sizes<opc, OpcodeStr#"q", OpNode, 4314*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info>, VEX_W; 4315*9880d681SAndroid Build Coastguard Worker} 4316*9880d681SAndroid Build Coastguard Worker 4317*9880d681SAndroid Build Coastguard Worker// Use 512bit version to implement 128/256 bit in case NoVLX. 4318*9880d681SAndroid Build Coastguard Workermulticlass avx512_var_shift_w_lowering<AVX512VLVectorVTInfo _, SDNode OpNode> { 4319*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI, NoVLX] in { 4320*9880d681SAndroid Build Coastguard Worker def : Pat<(_.info256.VT (OpNode (_.info256.VT _.info256.RC:$src1), 4321*9880d681SAndroid Build Coastguard Worker (_.info256.VT _.info256.RC:$src2))), 4322*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 4323*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"WZrr") 4324*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR256X:$src1, sub_ymm), 4325*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR256X:$src2, sub_ymm)), 4326*9880d681SAndroid Build Coastguard Worker sub_ymm)>; 4327*9880d681SAndroid Build Coastguard Worker 4328*9880d681SAndroid Build Coastguard Worker def : Pat<(_.info128.VT (OpNode (_.info128.VT _.info128.RC:$src1), 4329*9880d681SAndroid Build Coastguard Worker (_.info128.VT _.info128.RC:$src2))), 4330*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 4331*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"WZrr") 4332*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR128X:$src1, sub_xmm), 4333*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR128X:$src2, sub_xmm)), 4334*9880d681SAndroid Build Coastguard Worker sub_xmm)>; 4335*9880d681SAndroid Build Coastguard Worker } 4336*9880d681SAndroid Build Coastguard Worker} 4337*9880d681SAndroid Build Coastguard Worker 4338*9880d681SAndroid Build Coastguard Workermulticlass avx512_var_shift_w<bits<8> opc, string OpcodeStr, 4339*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 4340*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 4341*9880d681SAndroid Build Coastguard Worker defm WZ: avx512_var_shift<opc, OpcodeStr, OpNode, v32i16_info>, 4342*9880d681SAndroid Build Coastguard Worker EVEX_V512, VEX_W; 4343*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasBWI] in { 4344*9880d681SAndroid Build Coastguard Worker 4345*9880d681SAndroid Build Coastguard Worker defm WZ256: avx512_var_shift<opc, OpcodeStr, OpNode, v16i16x_info>, 4346*9880d681SAndroid Build Coastguard Worker EVEX_V256, VEX_W; 4347*9880d681SAndroid Build Coastguard Worker defm WZ128: avx512_var_shift<opc, OpcodeStr, OpNode, v8i16x_info>, 4348*9880d681SAndroid Build Coastguard Worker EVEX_V128, VEX_W; 4349*9880d681SAndroid Build Coastguard Worker } 4350*9880d681SAndroid Build Coastguard Worker} 4351*9880d681SAndroid Build Coastguard Worker 4352*9880d681SAndroid Build Coastguard Workerdefm VPSLLV : avx512_var_shift_types<0x47, "vpsllv", shl>, 4353*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w<0x12, "vpsllvw", shl>, 4354*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w_lowering<avx512vl_i16_info, shl>; 4355*9880d681SAndroid Build Coastguard Worker 4356*9880d681SAndroid Build Coastguard Workerdefm VPSRAV : avx512_var_shift_types<0x46, "vpsrav", sra>, 4357*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w<0x11, "vpsravw", sra>, 4358*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w_lowering<avx512vl_i16_info, sra>; 4359*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 4360*9880d681SAndroid Build Coastguard Worker defm VPSRAV_Int : avx512_var_shift_types<0x46, "vpsrav", X86vsrav>, 4361*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w<0x11, "vpsravw", X86vsrav>; 4362*9880d681SAndroid Build Coastguard Worker 4363*9880d681SAndroid Build Coastguard Workerdefm VPSRLV : avx512_var_shift_types<0x45, "vpsrlv", srl>, 4364*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w<0x10, "vpsrlvw", srl>, 4365*9880d681SAndroid Build Coastguard Worker avx512_var_shift_w_lowering<avx512vl_i16_info, srl>; 4366*9880d681SAndroid Build Coastguard Workerdefm VPRORV : avx512_var_shift_types<0x14, "vprorv", rotr>; 4367*9880d681SAndroid Build Coastguard Workerdefm VPROLV : avx512_var_shift_types<0x15, "vprolv", rotl>; 4368*9880d681SAndroid Build Coastguard Worker 4369*9880d681SAndroid Build Coastguard Worker//===-------------------------------------------------------------------===// 4370*9880d681SAndroid Build Coastguard Worker// 1-src variable permutation VPERMW/D/Q 4371*9880d681SAndroid Build Coastguard Worker//===-------------------------------------------------------------------===// 4372*9880d681SAndroid Build Coastguard Workermulticlass avx512_vperm_dq_sizes<bits<8> opc, string OpcodeStr, SDNode OpNode, 4373*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _> { 4374*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 4375*9880d681SAndroid Build Coastguard Worker defm Z : avx512_var_shift<opc, OpcodeStr, OpNode, _.info512>, 4376*9880d681SAndroid Build Coastguard Worker avx512_var_shift_mb<opc, OpcodeStr, OpNode, _.info512>, EVEX_V512; 4377*9880d681SAndroid Build Coastguard Worker 4378*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in 4379*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_var_shift<opc, OpcodeStr, OpNode, _.info256>, 4380*9880d681SAndroid Build Coastguard Worker avx512_var_shift_mb<opc, OpcodeStr, OpNode, _.info256>, EVEX_V256; 4381*9880d681SAndroid Build Coastguard Worker} 4382*9880d681SAndroid Build Coastguard Worker 4383*9880d681SAndroid Build Coastguard Workermulticlass avx512_vpermi_dq_sizes<bits<8> opc, Format ImmFormR, Format ImmFormM, 4384*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, 4385*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 4386*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 4387*9880d681SAndroid Build Coastguard Worker defm Z: avx512_shift_rmi<opc, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4388*9880d681SAndroid Build Coastguard Worker VTInfo.info512>, 4389*9880d681SAndroid Build Coastguard Worker avx512_shift_rmbi<opc, ImmFormM, OpcodeStr, OpNode, 4390*9880d681SAndroid Build Coastguard Worker VTInfo.info512>, EVEX_V512; 4391*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in 4392*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_shift_rmi<opc, ImmFormR, ImmFormM, OpcodeStr, OpNode, 4393*9880d681SAndroid Build Coastguard Worker VTInfo.info256>, 4394*9880d681SAndroid Build Coastguard Worker avx512_shift_rmbi<opc, ImmFormM, OpcodeStr, OpNode, 4395*9880d681SAndroid Build Coastguard Worker VTInfo.info256>, EVEX_V256; 4396*9880d681SAndroid Build Coastguard Worker} 4397*9880d681SAndroid Build Coastguard Worker 4398*9880d681SAndroid Build Coastguard Workermulticlass avx512_vperm_bw<bits<8> opc, string OpcodeStr, 4399*9880d681SAndroid Build Coastguard Worker Predicate prd, SDNode OpNode, 4400*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _> { 4401*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 4402*9880d681SAndroid Build Coastguard Worker defm Z: avx512_var_shift<opc, OpcodeStr, OpNode, _.info512>, 4403*9880d681SAndroid Build Coastguard Worker EVEX_V512 ; 4404*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, prd] in { 4405*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_var_shift<opc, OpcodeStr, OpNode, _.info256>, 4406*9880d681SAndroid Build Coastguard Worker EVEX_V256 ; 4407*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_var_shift<opc, OpcodeStr, OpNode, _.info128>, 4408*9880d681SAndroid Build Coastguard Worker EVEX_V128 ; 4409*9880d681SAndroid Build Coastguard Worker } 4410*9880d681SAndroid Build Coastguard Worker} 4411*9880d681SAndroid Build Coastguard Worker 4412*9880d681SAndroid Build Coastguard Workerdefm VPERMW : avx512_vperm_bw<0x8D, "vpermw", HasBWI, X86VPermv, 4413*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info>, VEX_W; 4414*9880d681SAndroid Build Coastguard Workerdefm VPERMB : avx512_vperm_bw<0x8D, "vpermb", HasVBMI, X86VPermv, 4415*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info>; 4416*9880d681SAndroid Build Coastguard Worker 4417*9880d681SAndroid Build Coastguard Workerdefm VPERMD : avx512_vperm_dq_sizes<0x36, "vpermd", X86VPermv, 4418*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info>; 4419*9880d681SAndroid Build Coastguard Workerdefm VPERMQ : avx512_vperm_dq_sizes<0x36, "vpermq", X86VPermv, 4420*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info>, VEX_W; 4421*9880d681SAndroid Build Coastguard Workerdefm VPERMPS : avx512_vperm_dq_sizes<0x16, "vpermps", X86VPermv, 4422*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info>; 4423*9880d681SAndroid Build Coastguard Workerdefm VPERMPD : avx512_vperm_dq_sizes<0x16, "vpermpd", X86VPermv, 4424*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info>, VEX_W; 4425*9880d681SAndroid Build Coastguard Worker 4426*9880d681SAndroid Build Coastguard Workerdefm VPERMQ : avx512_vpermi_dq_sizes<0x00, MRMSrcReg, MRMSrcMem, "vpermq", 4427*9880d681SAndroid Build Coastguard Worker X86VPermi, avx512vl_i64_info>, 4428*9880d681SAndroid Build Coastguard Worker EVEX, AVX512AIi8Base, EVEX_CD8<64, CD8VF>, VEX_W; 4429*9880d681SAndroid Build Coastguard Workerdefm VPERMPD : avx512_vpermi_dq_sizes<0x01, MRMSrcReg, MRMSrcMem, "vpermpd", 4430*9880d681SAndroid Build Coastguard Worker X86VPermi, avx512vl_f64_info>, 4431*9880d681SAndroid Build Coastguard Worker EVEX, AVX512AIi8Base, EVEX_CD8<64, CD8VF>, VEX_W; 4432*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4433*9880d681SAndroid Build Coastguard Worker// AVX-512 - VPERMIL 4434*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4435*9880d681SAndroid Build Coastguard Worker 4436*9880d681SAndroid Build Coastguard Workermulticlass avx512_permil_vec<bits<8> OpcVar, string OpcodeStr, SDNode OpNode, 4437*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, X86VectorVTInfo Ctrl> { 4438*9880d681SAndroid Build Coastguard Worker defm rr: AVX512_maskable<OpcVar, MRMSrcReg, _, (outs _.RC:$dst), 4439*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, Ctrl.RC:$src2), OpcodeStr, 4440*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4441*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, 4442*9880d681SAndroid Build Coastguard Worker (Ctrl.VT Ctrl.RC:$src2)))>, 4443*9880d681SAndroid Build Coastguard Worker T8PD, EVEX_4V; 4444*9880d681SAndroid Build Coastguard Worker defm rm: AVX512_maskable<OpcVar, MRMSrcMem, _, (outs _.RC:$dst), 4445*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, Ctrl.MemOp:$src2), OpcodeStr, 4446*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 4447*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode 4448*9880d681SAndroid Build Coastguard Worker _.RC:$src1, 4449*9880d681SAndroid Build Coastguard Worker (Ctrl.VT (bitconvert(Ctrl.LdFrag addr:$src2)))))>, 4450*9880d681SAndroid Build Coastguard Worker T8PD, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; 4451*9880d681SAndroid Build Coastguard Worker defm rmb: AVX512_maskable<OpcVar, MRMSrcMem, _, (outs _.RC:$dst), 4452*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 4453*9880d681SAndroid Build Coastguard Worker "${src2}"##_.BroadcastStr##", $src1", 4454*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr, 4455*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode 4456*9880d681SAndroid Build Coastguard Worker _.RC:$src1, 4457*9880d681SAndroid Build Coastguard Worker (Ctrl.VT (X86VBroadcast 4458*9880d681SAndroid Build Coastguard Worker (Ctrl.ScalarLdFrag addr:$src2)))))>, 4459*9880d681SAndroid Build Coastguard Worker T8PD, EVEX_4V, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>; 4460*9880d681SAndroid Build Coastguard Worker} 4461*9880d681SAndroid Build Coastguard Worker 4462*9880d681SAndroid Build Coastguard Workermulticlass avx512_permil_vec_common<string OpcodeStr, bits<8> OpcVar, 4463*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{ 4464*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 4465*9880d681SAndroid Build Coastguard Worker defm Z : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, _.info512, 4466*9880d681SAndroid Build Coastguard Worker Ctrl.info512>, EVEX_V512; 4467*9880d681SAndroid Build Coastguard Worker } 4468*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 4469*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, _.info128, 4470*9880d681SAndroid Build Coastguard Worker Ctrl.info128>, EVEX_V128; 4471*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, _.info256, 4472*9880d681SAndroid Build Coastguard Worker Ctrl.info256>, EVEX_V256; 4473*9880d681SAndroid Build Coastguard Worker } 4474*9880d681SAndroid Build Coastguard Worker} 4475*9880d681SAndroid Build Coastguard Worker 4476*9880d681SAndroid Build Coastguard Workermulticlass avx512_permil<string OpcodeStr, bits<8> OpcImm, bits<8> OpcVar, 4477*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{ 4478*9880d681SAndroid Build Coastguard Worker 4479*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_permil_vec_common<OpcodeStr, OpcVar, _, Ctrl>; 4480*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_shift_rmi_sizes<OpcImm, MRMSrcReg, MRMSrcMem, OpcodeStr, 4481*9880d681SAndroid Build Coastguard Worker X86VPermilpi, _>, 4482*9880d681SAndroid Build Coastguard Worker EVEX, AVX512AIi8Base, EVEX_CD8<_.info128.EltSize, CD8VF>; 4483*9880d681SAndroid Build Coastguard Worker} 4484*9880d681SAndroid Build Coastguard Worker 4485*9880d681SAndroid Build Coastguard Workerdefm VPERMILPS : avx512_permil<"vpermilps", 0x04, 0x0C, avx512vl_f32_info, 4486*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info>; 4487*9880d681SAndroid Build Coastguard Workerdefm VPERMILPD : avx512_permil<"vpermilpd", 0x05, 0x0D, avx512vl_f64_info, 4488*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info>, VEX_W; 4489*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4490*9880d681SAndroid Build Coastguard Worker// AVX-512 - VPSHUFD, VPSHUFLW, VPSHUFHW 4491*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4492*9880d681SAndroid Build Coastguard Worker 4493*9880d681SAndroid Build Coastguard Workerdefm VPSHUFD : avx512_shift_rmi_sizes<0x70, MRMSrcReg, MRMSrcMem, "vpshufd", 4494*9880d681SAndroid Build Coastguard Worker X86PShufd, avx512vl_i32_info>, 4495*9880d681SAndroid Build Coastguard Worker EVEX, AVX512BIi8Base, EVEX_CD8<32, CD8VF>; 4496*9880d681SAndroid Build Coastguard Workerdefm VPSHUFH : avx512_shift_rmi_w<0x70, MRMSrcReg, MRMSrcMem, "vpshufhw", 4497*9880d681SAndroid Build Coastguard Worker X86PShufhw>, EVEX, AVX512XSIi8Base; 4498*9880d681SAndroid Build Coastguard Workerdefm VPSHUFL : avx512_shift_rmi_w<0x70, MRMSrcReg, MRMSrcMem, "vpshuflw", 4499*9880d681SAndroid Build Coastguard Worker X86PShuflw>, EVEX, AVX512XDIi8Base; 4500*9880d681SAndroid Build Coastguard Worker 4501*9880d681SAndroid Build Coastguard Workermulticlass avx512_pshufb_sizes<bits<8> opc, string OpcodeStr, SDNode OpNode> { 4502*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in 4503*9880d681SAndroid Build Coastguard Worker defm Z: avx512_var_shift<opc, OpcodeStr, OpNode, v64i8_info>, EVEX_V512; 4504*9880d681SAndroid Build Coastguard Worker 4505*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasBWI] in { 4506*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_var_shift<opc, OpcodeStr, OpNode, v32i8x_info>, EVEX_V256; 4507*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_var_shift<opc, OpcodeStr, OpNode, v16i8x_info>, EVEX_V128; 4508*9880d681SAndroid Build Coastguard Worker } 4509*9880d681SAndroid Build Coastguard Worker} 4510*9880d681SAndroid Build Coastguard Worker 4511*9880d681SAndroid Build Coastguard Workerdefm VPSHUFB: avx512_pshufb_sizes<0x00, "vpshufb", X86pshufb>; 4512*9880d681SAndroid Build Coastguard Worker 4513*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4514*9880d681SAndroid Build Coastguard Worker// Move Low to High and High to Low packed FP Instructions 4515*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4516*9880d681SAndroid Build Coastguard Workerdef VMOVLHPSZrr : AVX512PSI<0x16, MRMSrcReg, (outs VR128X:$dst), 4517*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src1, VR128X:$src2), 4518*9880d681SAndroid Build Coastguard Worker "vmovlhps\t{$src2, $src1, $dst|$dst, $src1, $src2}", 4519*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (v4f32 (X86Movlhps VR128X:$src1, VR128X:$src2)))], 4520*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOV_LH>, EVEX_4V; 4521*9880d681SAndroid Build Coastguard Workerdef VMOVHLPSZrr : AVX512PSI<0x12, MRMSrcReg, (outs VR128X:$dst), 4522*9880d681SAndroid Build Coastguard Worker (ins VR128X:$src1, VR128X:$src2), 4523*9880d681SAndroid Build Coastguard Worker "vmovhlps\t{$src2, $src1, $dst|$dst, $src1, $src2}", 4524*9880d681SAndroid Build Coastguard Worker [(set VR128X:$dst, (v4f32 (X86Movhlps VR128X:$src1, VR128X:$src2)))], 4525*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOV_LH>, EVEX_4V; 4526*9880d681SAndroid Build Coastguard Worker 4527*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 4528*9880d681SAndroid Build Coastguard Worker // MOVLHPS patterns 4529*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86Movlhps VR128X:$src1, VR128X:$src2)), 4530*9880d681SAndroid Build Coastguard Worker (VMOVLHPSZrr VR128X:$src1, VR128X:$src2)>; 4531*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86Movlhps VR128X:$src1, VR128X:$src2)), 4532*9880d681SAndroid Build Coastguard Worker (VMOVLHPSZrr (v2i64 VR128X:$src1), VR128X:$src2)>; 4533*9880d681SAndroid Build Coastguard Worker 4534*9880d681SAndroid Build Coastguard Worker // MOVHLPS patterns 4535*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86Movhlps VR128X:$src1, VR128X:$src2)), 4536*9880d681SAndroid Build Coastguard Worker (VMOVHLPSZrr VR128X:$src1, VR128X:$src2)>; 4537*9880d681SAndroid Build Coastguard Worker} 4538*9880d681SAndroid Build Coastguard Worker 4539*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4540*9880d681SAndroid Build Coastguard Worker// VMOVHPS/PD VMOVLPS Instructions 4541*9880d681SAndroid Build Coastguard Worker// All patterns was taken from SSS implementation. 4542*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4543*9880d681SAndroid Build Coastguard Workermulticlass avx512_mov_hilo_packed<bits<8> opc, string OpcodeStr, SDNode OpNode, 4544*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4545*9880d681SAndroid Build Coastguard Worker def rm : AVX512<opc, MRMSrcMem, (outs _.RC:$dst), 4546*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, f64mem:$src2), 4547*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 4548*9880d681SAndroid Build Coastguard Worker "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 4549*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, 4550*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, 4551*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert 4552*9880d681SAndroid Build Coastguard Worker (v2f64 (scalar_to_vector (loadf64 addr:$src2)))))))], 4553*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOV_LH>, EVEX_4V; 4554*9880d681SAndroid Build Coastguard Worker} 4555*9880d681SAndroid Build Coastguard Worker 4556*9880d681SAndroid Build Coastguard Workerdefm VMOVHPSZ128 : avx512_mov_hilo_packed<0x16, "vmovhps", X86Movlhps, 4557*9880d681SAndroid Build Coastguard Worker v4f32x_info>, EVEX_CD8<32, CD8VT2>, PS; 4558*9880d681SAndroid Build Coastguard Workerdefm VMOVHPDZ128 : avx512_mov_hilo_packed<0x16, "vmovhpd", X86Movlhpd, 4559*9880d681SAndroid Build Coastguard Worker v2f64x_info>, EVEX_CD8<64, CD8VT1>, PD, VEX_W; 4560*9880d681SAndroid Build Coastguard Workerdefm VMOVLPSZ128 : avx512_mov_hilo_packed<0x12, "vmovlps", X86Movlps, 4561*9880d681SAndroid Build Coastguard Worker v4f32x_info>, EVEX_CD8<32, CD8VT2>, PS; 4562*9880d681SAndroid Build Coastguard Workerdefm VMOVLPDZ128 : avx512_mov_hilo_packed<0x12, "vmovlpd", X86Movlpd, 4563*9880d681SAndroid Build Coastguard Worker v2f64x_info>, EVEX_CD8<64, CD8VT1>, PD, VEX_W; 4564*9880d681SAndroid Build Coastguard Worker 4565*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 4566*9880d681SAndroid Build Coastguard Worker // VMOVHPS patterns 4567*9880d681SAndroid Build Coastguard Worker def : Pat<(X86Movlhps VR128X:$src1, 4568*9880d681SAndroid Build Coastguard Worker (bc_v4f32 (v2i64 (scalar_to_vector (loadi64 addr:$src2))))), 4569*9880d681SAndroid Build Coastguard Worker (VMOVHPSZ128rm VR128X:$src1, addr:$src2)>; 4570*9880d681SAndroid Build Coastguard Worker def : Pat<(X86Movlhps VR128X:$src1, 4571*9880d681SAndroid Build Coastguard Worker (bc_v4i32 (v2i64 (X86vzload addr:$src2)))), 4572*9880d681SAndroid Build Coastguard Worker (VMOVHPSZ128rm VR128X:$src1, addr:$src2)>; 4573*9880d681SAndroid Build Coastguard Worker // VMOVHPD patterns 4574*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86Unpckl VR128X:$src1, 4575*9880d681SAndroid Build Coastguard Worker (scalar_to_vector (loadf64 addr:$src2)))), 4576*9880d681SAndroid Build Coastguard Worker (VMOVHPDZ128rm VR128X:$src1, addr:$src2)>; 4577*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86Unpckl VR128X:$src1, 4578*9880d681SAndroid Build Coastguard Worker (bc_v2f64 (v2i64 (scalar_to_vector (loadi64 addr:$src2)))))), 4579*9880d681SAndroid Build Coastguard Worker (VMOVHPDZ128rm VR128X:$src1, addr:$src2)>; 4580*9880d681SAndroid Build Coastguard Worker // VMOVLPS patterns 4581*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (X86Movlps VR128X:$src1, (load addr:$src2))), 4582*9880d681SAndroid Build Coastguard Worker (VMOVLPSZ128rm VR128X:$src1, addr:$src2)>; 4583*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (X86Movlps VR128X:$src1, (load addr:$src2))), 4584*9880d681SAndroid Build Coastguard Worker (VMOVLPSZ128rm VR128X:$src1, addr:$src2)>; 4585*9880d681SAndroid Build Coastguard Worker // VMOVLPD patterns 4586*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86Movlpd VR128X:$src1, (load addr:$src2))), 4587*9880d681SAndroid Build Coastguard Worker (VMOVLPDZ128rm VR128X:$src1, addr:$src2)>; 4588*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (X86Movlpd VR128X:$src1, (load addr:$src2))), 4589*9880d681SAndroid Build Coastguard Worker (VMOVLPDZ128rm VR128X:$src1, addr:$src2)>; 4590*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (X86Movsd VR128X:$src1, 4591*9880d681SAndroid Build Coastguard Worker (v2f64 (scalar_to_vector (loadf64 addr:$src2))))), 4592*9880d681SAndroid Build Coastguard Worker (VMOVLPDZ128rm VR128X:$src1, addr:$src2)>; 4593*9880d681SAndroid Build Coastguard Worker} 4594*9880d681SAndroid Build Coastguard Worker 4595*9880d681SAndroid Build Coastguard Workerdef VMOVHPSZ128mr : AVX512PSI<0x17, MRMDestMem, (outs), 4596*9880d681SAndroid Build Coastguard Worker (ins f64mem:$dst, VR128X:$src), 4597*9880d681SAndroid Build Coastguard Worker "vmovhps\t{$src, $dst|$dst, $src}", 4598*9880d681SAndroid Build Coastguard Worker [(store (f64 (extractelt 4599*9880d681SAndroid Build Coastguard Worker (X86Unpckh (bc_v2f64 (v4f32 VR128X:$src)), 4600*9880d681SAndroid Build Coastguard Worker (bc_v2f64 (v4f32 VR128X:$src))), 4601*9880d681SAndroid Build Coastguard Worker (iPTR 0))), addr:$dst)], IIC_SSE_MOV_LH>, 4602*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<32, CD8VT2>; 4603*9880d681SAndroid Build Coastguard Workerdef VMOVHPDZ128mr : AVX512PDI<0x17, MRMDestMem, (outs), 4604*9880d681SAndroid Build Coastguard Worker (ins f64mem:$dst, VR128X:$src), 4605*9880d681SAndroid Build Coastguard Worker "vmovhpd\t{$src, $dst|$dst, $src}", 4606*9880d681SAndroid Build Coastguard Worker [(store (f64 (extractelt 4607*9880d681SAndroid Build Coastguard Worker (v2f64 (X86Unpckh VR128X:$src, VR128X:$src)), 4608*9880d681SAndroid Build Coastguard Worker (iPTR 0))), addr:$dst)], IIC_SSE_MOV_LH>, 4609*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<64, CD8VT1>, VEX_W; 4610*9880d681SAndroid Build Coastguard Workerdef VMOVLPSZ128mr : AVX512PSI<0x13, MRMDestMem, (outs), 4611*9880d681SAndroid Build Coastguard Worker (ins f64mem:$dst, VR128X:$src), 4612*9880d681SAndroid Build Coastguard Worker "vmovlps\t{$src, $dst|$dst, $src}", 4613*9880d681SAndroid Build Coastguard Worker [(store (f64 (extractelt (bc_v2f64 (v4f32 VR128X:$src)), 4614*9880d681SAndroid Build Coastguard Worker (iPTR 0))), addr:$dst)], 4615*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOV_LH>, 4616*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<32, CD8VT2>; 4617*9880d681SAndroid Build Coastguard Workerdef VMOVLPDZ128mr : AVX512PDI<0x13, MRMDestMem, (outs), 4618*9880d681SAndroid Build Coastguard Worker (ins f64mem:$dst, VR128X:$src), 4619*9880d681SAndroid Build Coastguard Worker "vmovlpd\t{$src, $dst|$dst, $src}", 4620*9880d681SAndroid Build Coastguard Worker [(store (f64 (extractelt (v2f64 VR128X:$src), 4621*9880d681SAndroid Build Coastguard Worker (iPTR 0))), addr:$dst)], 4622*9880d681SAndroid Build Coastguard Worker IIC_SSE_MOV_LH>, 4623*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<64, CD8VT1>, VEX_W; 4624*9880d681SAndroid Build Coastguard Worker 4625*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 4626*9880d681SAndroid Build Coastguard Worker // VMOVHPD patterns 4627*9880d681SAndroid Build Coastguard Worker def : Pat<(store (f64 (extractelt 4628*9880d681SAndroid Build Coastguard Worker (v2f64 (X86VPermilpi VR128X:$src, (i8 1))), 4629*9880d681SAndroid Build Coastguard Worker (iPTR 0))), addr:$dst), 4630*9880d681SAndroid Build Coastguard Worker (VMOVHPDZ128mr addr:$dst, VR128X:$src)>; 4631*9880d681SAndroid Build Coastguard Worker // VMOVLPS patterns 4632*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f32 (X86Movlps (load addr:$src1), VR128X:$src2)), 4633*9880d681SAndroid Build Coastguard Worker addr:$src1), 4634*9880d681SAndroid Build Coastguard Worker (VMOVLPSZ128mr addr:$src1, VR128X:$src2)>; 4635*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i32 (X86Movlps 4636*9880d681SAndroid Build Coastguard Worker (bc_v4i32 (loadv2i64 addr:$src1)), VR128X:$src2)), addr:$src1), 4637*9880d681SAndroid Build Coastguard Worker (VMOVLPSZ128mr addr:$src1, VR128X:$src2)>; 4638*9880d681SAndroid Build Coastguard Worker // VMOVLPD patterns 4639*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f64 (X86Movlpd (load addr:$src1), VR128X:$src2)), 4640*9880d681SAndroid Build Coastguard Worker addr:$src1), 4641*9880d681SAndroid Build Coastguard Worker (VMOVLPDZ128mr addr:$src1, VR128X:$src2)>; 4642*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i64 (X86Movlpd (load addr:$src1), VR128X:$src2)), 4643*9880d681SAndroid Build Coastguard Worker addr:$src1), 4644*9880d681SAndroid Build Coastguard Worker (VMOVLPDZ128mr addr:$src1, VR128X:$src2)>; 4645*9880d681SAndroid Build Coastguard Worker} 4646*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4647*9880d681SAndroid Build Coastguard Worker// FMA - Fused Multiply Operations 4648*9880d681SAndroid Build Coastguard Worker// 4649*9880d681SAndroid Build Coastguard Worker 4650*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 4651*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_213_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, 4652*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4653*9880d681SAndroid Build Coastguard Worker defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4654*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3), 4655*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 4656*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, _.RC:$src3))>, 4657*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4658*9880d681SAndroid Build Coastguard Worker 4659*9880d681SAndroid Build Coastguard Worker defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4660*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.MemOp:$src3), 4661*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 4662*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, (_.LdFrag addr:$src3)))>, 4663*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4664*9880d681SAndroid Build Coastguard Worker 4665*9880d681SAndroid Build Coastguard Worker defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4666*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3), 4667*9880d681SAndroid Build Coastguard Worker OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), 4668*9880d681SAndroid Build Coastguard Worker !strconcat("$src2, ${src3}", _.BroadcastStr ), 4669*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, 4670*9880d681SAndroid Build Coastguard Worker _.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3))))>, 4671*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base, EVEX_B; 4672*9880d681SAndroid Build Coastguard Worker} 4673*9880d681SAndroid Build Coastguard Worker 4674*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3_213_round<bits<8> opc, string OpcodeStr, SDNode OpNode, 4675*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4676*9880d681SAndroid Build Coastguard Worker defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4677*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), 4678*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", 4679*9880d681SAndroid Build Coastguard Worker (_.VT ( OpNode _.RC:$src1, _.RC:$src2, _.RC:$src3, (i32 imm:$rc)))>, 4680*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base, EVEX_B, EVEX_RC; 4681*9880d681SAndroid Build Coastguard Worker} 4682*9880d681SAndroid Build Coastguard Worker} // Constraints = "$src1 = $dst" 4683*9880d681SAndroid Build Coastguard Worker 4684*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_213_common<bits<8> opc, string OpcodeStr, SDNode OpNode, 4685*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd, AVX512VLVectorVTInfo _> { 4686*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 4687*9880d681SAndroid Build Coastguard Worker defm Z : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, _.info512>, 4688*9880d681SAndroid Build Coastguard Worker avx512_fma3_213_round<opc, OpcodeStr, OpNodeRnd, _.info512>, 4689*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; 4690*9880d681SAndroid Build Coastguard Worker } 4691*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 4692*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, _.info256>, 4693*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; 4694*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, _.info128>, 4695*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>; 4696*9880d681SAndroid Build Coastguard Worker } 4697*9880d681SAndroid Build Coastguard Worker} 4698*9880d681SAndroid Build Coastguard Worker 4699*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_213_f<bits<8> opc, string OpcodeStr, SDNode OpNode, 4700*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd > { 4701*9880d681SAndroid Build Coastguard Worker defm PS : avx512_fma3p_213_common<opc, OpcodeStr#"ps", OpNode, OpNodeRnd, 4702*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info>; 4703*9880d681SAndroid Build Coastguard Worker defm PD : avx512_fma3p_213_common<opc, OpcodeStr#"pd", OpNode, OpNodeRnd, 4704*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info>, VEX_W; 4705*9880d681SAndroid Build Coastguard Worker} 4706*9880d681SAndroid Build Coastguard Worker 4707*9880d681SAndroid Build Coastguard Workerdefm VFMADD213 : avx512_fma3p_213_f<0xA8, "vfmadd213", X86Fmadd, X86FmaddRnd>; 4708*9880d681SAndroid Build Coastguard Workerdefm VFMSUB213 : avx512_fma3p_213_f<0xAA, "vfmsub213", X86Fmsub, X86FmsubRnd>; 4709*9880d681SAndroid Build Coastguard Workerdefm VFMADDSUB213 : avx512_fma3p_213_f<0xA6, "vfmaddsub213", X86Fmaddsub, X86FmaddsubRnd>; 4710*9880d681SAndroid Build Coastguard Workerdefm VFMSUBADD213 : avx512_fma3p_213_f<0xA7, "vfmsubadd213", X86Fmsubadd, X86FmsubaddRnd>; 4711*9880d681SAndroid Build Coastguard Workerdefm VFNMADD213 : avx512_fma3p_213_f<0xAC, "vfnmadd213", X86Fnmadd, X86FnmaddRnd>; 4712*9880d681SAndroid Build Coastguard Workerdefm VFNMSUB213 : avx512_fma3p_213_f<0xAE, "vfnmsub213", X86Fnmsub, X86FnmsubRnd>; 4713*9880d681SAndroid Build Coastguard Worker 4714*9880d681SAndroid Build Coastguard Worker 4715*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 4716*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_231_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, 4717*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4718*9880d681SAndroid Build Coastguard Worker defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4719*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3), 4720*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 4721*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1))>, 4722*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4723*9880d681SAndroid Build Coastguard Worker 4724*9880d681SAndroid Build Coastguard Worker defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4725*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.MemOp:$src3), 4726*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 4727*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src2, (_.LdFrag addr:$src3), _.RC:$src1))>, 4728*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4729*9880d681SAndroid Build Coastguard Worker 4730*9880d681SAndroid Build Coastguard Worker defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4731*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3), 4732*9880d681SAndroid Build Coastguard Worker OpcodeStr, "${src3}"##_.BroadcastStr##", $src2", 4733*9880d681SAndroid Build Coastguard Worker "$src2, ${src3}"##_.BroadcastStr, 4734*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src2, 4735*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))), 4736*9880d681SAndroid Build Coastguard Worker _.RC:$src1))>, AVX512FMA3Base, EVEX_B; 4737*9880d681SAndroid Build Coastguard Worker} 4738*9880d681SAndroid Build Coastguard Worker 4739*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3_231_round<bits<8> opc, string OpcodeStr, SDNode OpNode, 4740*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4741*9880d681SAndroid Build Coastguard Worker defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4742*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), 4743*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", 4744*9880d681SAndroid Build Coastguard Worker (_.VT ( OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1, (i32 imm:$rc)))>, 4745*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base, EVEX_B, EVEX_RC; 4746*9880d681SAndroid Build Coastguard Worker} 4747*9880d681SAndroid Build Coastguard Worker} // Constraints = "$src1 = $dst" 4748*9880d681SAndroid Build Coastguard Worker 4749*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_231_common<bits<8> opc, string OpcodeStr, SDNode OpNode, 4750*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd, AVX512VLVectorVTInfo _> { 4751*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 4752*9880d681SAndroid Build Coastguard Worker defm Z : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, _.info512>, 4753*9880d681SAndroid Build Coastguard Worker avx512_fma3_231_round<opc, OpcodeStr, OpNodeRnd, _.info512>, 4754*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; 4755*9880d681SAndroid Build Coastguard Worker } 4756*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 4757*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, _.info256>, 4758*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; 4759*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, _.info128>, 4760*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>; 4761*9880d681SAndroid Build Coastguard Worker } 4762*9880d681SAndroid Build Coastguard Worker} 4763*9880d681SAndroid Build Coastguard Worker 4764*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_231_f<bits<8> opc, string OpcodeStr, SDNode OpNode, 4765*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd > { 4766*9880d681SAndroid Build Coastguard Worker defm PS : avx512_fma3p_231_common<opc, OpcodeStr#"ps", OpNode, OpNodeRnd, 4767*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info>; 4768*9880d681SAndroid Build Coastguard Worker defm PD : avx512_fma3p_231_common<opc, OpcodeStr#"pd", OpNode, OpNodeRnd, 4769*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info>, VEX_W; 4770*9880d681SAndroid Build Coastguard Worker} 4771*9880d681SAndroid Build Coastguard Worker 4772*9880d681SAndroid Build Coastguard Workerdefm VFMADD231 : avx512_fma3p_231_f<0xB8, "vfmadd231", X86Fmadd, X86FmaddRnd>; 4773*9880d681SAndroid Build Coastguard Workerdefm VFMSUB231 : avx512_fma3p_231_f<0xBA, "vfmsub231", X86Fmsub, X86FmsubRnd>; 4774*9880d681SAndroid Build Coastguard Workerdefm VFMADDSUB231 : avx512_fma3p_231_f<0xB6, "vfmaddsub231", X86Fmaddsub, X86FmaddsubRnd>; 4775*9880d681SAndroid Build Coastguard Workerdefm VFMSUBADD231 : avx512_fma3p_231_f<0xB7, "vfmsubadd231", X86Fmsubadd, X86FmsubaddRnd>; 4776*9880d681SAndroid Build Coastguard Workerdefm VFNMADD231 : avx512_fma3p_231_f<0xBC, "vfnmadd231", X86Fnmadd, X86FnmaddRnd>; 4777*9880d681SAndroid Build Coastguard Workerdefm VFNMSUB231 : avx512_fma3p_231_f<0xBE, "vfnmsub231", X86Fnmsub, X86FnmsubRnd>; 4778*9880d681SAndroid Build Coastguard Worker 4779*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 4780*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, 4781*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4782*9880d681SAndroid Build Coastguard Worker defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4783*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src3, _.RC:$src2), 4784*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src2, $src3", "$src3, $src2", 4785*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, _.RC:$src3))>, 4786*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4787*9880d681SAndroid Build Coastguard Worker 4788*9880d681SAndroid Build Coastguard Worker defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4789*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src3, _.MemOp:$src2), 4790*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src2, $src3", "$src3, $src2", 4791*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (_.LdFrag addr:$src2), _.RC:$src3))>, 4792*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4793*9880d681SAndroid Build Coastguard Worker 4794*9880d681SAndroid Build Coastguard Worker defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4795*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src3, _.ScalarMemOp:$src2), 4796*9880d681SAndroid Build Coastguard Worker OpcodeStr, "${src2}"##_.BroadcastStr##", $src3", 4797*9880d681SAndroid Build Coastguard Worker "$src3, ${src2}"##_.BroadcastStr, 4798*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, 4799*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src2))), 4800*9880d681SAndroid Build Coastguard Worker _.RC:$src3))>, AVX512FMA3Base, EVEX_B; 4801*9880d681SAndroid Build Coastguard Worker} 4802*9880d681SAndroid Build Coastguard Worker 4803*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3_132_round<bits<8> opc, string OpcodeStr, SDNode OpNode, 4804*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4805*9880d681SAndroid Build Coastguard Worker defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4806*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src3, _.RC:$src2, AVX512RC:$rc), 4807*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$rc, $src2, $src3", "$src3, $src2, $rc", 4808*9880d681SAndroid Build Coastguard Worker (_.VT ( OpNode _.RC:$src1, _.RC:$src2, _.RC:$src3, (i32 imm:$rc)))>, 4809*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base, EVEX_B, EVEX_RC; 4810*9880d681SAndroid Build Coastguard Worker} 4811*9880d681SAndroid Build Coastguard Worker} // Constraints = "$src1 = $dst" 4812*9880d681SAndroid Build Coastguard Worker 4813*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_132_common<bits<8> opc, string OpcodeStr, SDNode OpNode, 4814*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd, AVX512VLVectorVTInfo _> { 4815*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 4816*9880d681SAndroid Build Coastguard Worker defm Z : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, _.info512>, 4817*9880d681SAndroid Build Coastguard Worker avx512_fma3_132_round<opc, OpcodeStr, OpNodeRnd, _.info512>, 4818*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; 4819*9880d681SAndroid Build Coastguard Worker } 4820*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 4821*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, _.info256>, 4822*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; 4823*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, _.info128>, 4824*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>; 4825*9880d681SAndroid Build Coastguard Worker } 4826*9880d681SAndroid Build Coastguard Worker} 4827*9880d681SAndroid Build Coastguard Worker 4828*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3p_132_f<bits<8> opc, string OpcodeStr, SDNode OpNode, 4829*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd > { 4830*9880d681SAndroid Build Coastguard Worker defm PS : avx512_fma3p_132_common<opc, OpcodeStr#"ps", OpNode, OpNodeRnd, 4831*9880d681SAndroid Build Coastguard Worker avx512vl_f32_info>; 4832*9880d681SAndroid Build Coastguard Worker defm PD : avx512_fma3p_132_common<opc, OpcodeStr#"pd", OpNode, OpNodeRnd, 4833*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info>, VEX_W; 4834*9880d681SAndroid Build Coastguard Worker} 4835*9880d681SAndroid Build Coastguard Worker 4836*9880d681SAndroid Build Coastguard Workerdefm VFMADD132 : avx512_fma3p_132_f<0x98, "vfmadd132", X86Fmadd, X86FmaddRnd>; 4837*9880d681SAndroid Build Coastguard Workerdefm VFMSUB132 : avx512_fma3p_132_f<0x9A, "vfmsub132", X86Fmsub, X86FmsubRnd>; 4838*9880d681SAndroid Build Coastguard Workerdefm VFMADDSUB132 : avx512_fma3p_132_f<0x96, "vfmaddsub132", X86Fmaddsub, X86FmaddsubRnd>; 4839*9880d681SAndroid Build Coastguard Workerdefm VFMSUBADD132 : avx512_fma3p_132_f<0x97, "vfmsubadd132", X86Fmsubadd, X86FmsubaddRnd>; 4840*9880d681SAndroid Build Coastguard Workerdefm VFNMADD132 : avx512_fma3p_132_f<0x9C, "vfnmadd132", X86Fnmadd, X86FnmaddRnd>; 4841*9880d681SAndroid Build Coastguard Workerdefm VFNMSUB132 : avx512_fma3p_132_f<0x9E, "vfnmsub132", X86Fnmsub, X86FnmsubRnd>; 4842*9880d681SAndroid Build Coastguard Worker 4843*9880d681SAndroid Build Coastguard Worker// Scalar FMA 4844*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 4845*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3s_common<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 4846*9880d681SAndroid Build Coastguard Worker dag RHS_VEC_r, dag RHS_VEC_m, dag RHS_VEC_rb, 4847*9880d681SAndroid Build Coastguard Worker dag RHS_r, dag RHS_m > { 4848*9880d681SAndroid Build Coastguard Worker defm r_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 4849*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3), OpcodeStr, 4850*9880d681SAndroid Build Coastguard Worker "$src3, $src2", "$src2, $src3", RHS_VEC_r>, AVX512FMA3Base; 4851*9880d681SAndroid Build Coastguard Worker 4852*9880d681SAndroid Build Coastguard Worker defm m_Int: AVX512_maskable_3src_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 4853*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3), OpcodeStr, 4854*9880d681SAndroid Build Coastguard Worker "$src3, $src2", "$src2, $src3", RHS_VEC_m>, AVX512FMA3Base; 4855*9880d681SAndroid Build Coastguard Worker 4856*9880d681SAndroid Build Coastguard Worker defm rb_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 4857*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc), 4858*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb>, 4859*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base, EVEX_B, EVEX_RC; 4860*9880d681SAndroid Build Coastguard Worker 4861*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 4862*9880d681SAndroid Build Coastguard Worker def r : AVX512FMA3<opc, MRMSrcReg, (outs _.FRC:$dst), 4863*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.FRC:$src2, _.FRC:$src3), 4864*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 4865*9880d681SAndroid Build Coastguard Worker "\t{$src3, $src2, $dst|$dst, $src2, $src3}"), 4866*9880d681SAndroid Build Coastguard Worker [RHS_r]>; 4867*9880d681SAndroid Build Coastguard Worker def m : AVX512FMA3<opc, MRMSrcMem, (outs _.FRC:$dst), 4868*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.FRC:$src2, _.ScalarMemOp:$src3), 4869*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, 4870*9880d681SAndroid Build Coastguard Worker "\t{$src3, $src2, $dst|$dst, $src2, $src3}"), 4871*9880d681SAndroid Build Coastguard Worker [RHS_m]>; 4872*9880d681SAndroid Build Coastguard Worker }// isCodeGenOnly = 1 4873*9880d681SAndroid Build Coastguard Worker} 4874*9880d681SAndroid Build Coastguard Worker}// Constraints = "$src1 = $dst" 4875*9880d681SAndroid Build Coastguard Worker 4876*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3s_all<bits<8> opc213, bits<8> opc231, bits<8> opc132, 4877*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, SDNode OpNodeRnd, X86VectorVTInfo _ , 4878*9880d681SAndroid Build Coastguard Worker string SUFF> { 4879*9880d681SAndroid Build Coastguard Worker 4880*9880d681SAndroid Build Coastguard Worker defm NAME#213#SUFF: avx512_fma3s_common<opc213, OpcodeStr#"213"#_.Suffix , _ , 4881*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src2, _.RC:$src1, _.RC:$src3, (i32 FROUND_CURRENT))), 4882*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src2, _.RC:$src1, 4883*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector(_.ScalarLdFrag addr:$src3))), (i32 FROUND_CURRENT))), 4884*9880d681SAndroid Build Coastguard Worker (_.VT ( OpNodeRnd _.RC:$src2, _.RC:$src1, _.RC:$src3, 4885*9880d681SAndroid Build Coastguard Worker (i32 imm:$rc))), 4886*9880d681SAndroid Build Coastguard Worker (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src1, 4887*9880d681SAndroid Build Coastguard Worker _.FRC:$src3))), 4888*9880d681SAndroid Build Coastguard Worker (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src1, 4889*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src3))))>; 4890*9880d681SAndroid Build Coastguard Worker 4891*9880d681SAndroid Build Coastguard Worker defm NAME#231#SUFF: avx512_fma3s_common<opc231, OpcodeStr#"231"#_.Suffix , _ , 4892*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src2, _.RC:$src3, _.RC:$src1, (i32 FROUND_CURRENT))), 4893*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src2, 4894*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector(_.ScalarLdFrag addr:$src3))), 4895*9880d681SAndroid Build Coastguard Worker _.RC:$src1, (i32 FROUND_CURRENT))), 4896*9880d681SAndroid Build Coastguard Worker (_.VT ( OpNodeRnd _.RC:$src2, _.RC:$src3, _.RC:$src1, 4897*9880d681SAndroid Build Coastguard Worker (i32 imm:$rc))), 4898*9880d681SAndroid Build Coastguard Worker (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src3, 4899*9880d681SAndroid Build Coastguard Worker _.FRC:$src1))), 4900*9880d681SAndroid Build Coastguard Worker (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, 4901*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src3), _.FRC:$src1)))>; 4902*9880d681SAndroid Build Coastguard Worker 4903*9880d681SAndroid Build Coastguard Worker defm NAME#132#SUFF: avx512_fma3s_common<opc132, OpcodeStr#"132"#_.Suffix , _ , 4904*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src1, _.RC:$src3, _.RC:$src2, (i32 FROUND_CURRENT))), 4905*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src1, 4906*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector(_.ScalarLdFrag addr:$src3))), 4907*9880d681SAndroid Build Coastguard Worker _.RC:$src2, (i32 FROUND_CURRENT))), 4908*9880d681SAndroid Build Coastguard Worker (_.VT ( OpNodeRnd _.RC:$src1, _.RC:$src3, _.RC:$src2, 4909*9880d681SAndroid Build Coastguard Worker (i32 imm:$rc))), 4910*9880d681SAndroid Build Coastguard Worker (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src1, _.FRC:$src3, 4911*9880d681SAndroid Build Coastguard Worker _.FRC:$src2))), 4912*9880d681SAndroid Build Coastguard Worker (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src1, 4913*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src3), _.FRC:$src2)))>; 4914*9880d681SAndroid Build Coastguard Worker} 4915*9880d681SAndroid Build Coastguard Worker 4916*9880d681SAndroid Build Coastguard Workermulticlass avx512_fma3s<bits<8> opc213, bits<8> opc231, bits<8> opc132, 4917*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode, SDNode OpNodeRnd>{ 4918*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 4919*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_fma3s_all<opc213, opc231, opc132, OpcodeStr, OpNode, 4920*9880d681SAndroid Build Coastguard Worker OpNodeRnd, f32x_info, "SS">, 4921*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>, VEX_LIG; 4922*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_fma3s_all<opc213, opc231, opc132, OpcodeStr, OpNode, 4923*9880d681SAndroid Build Coastguard Worker OpNodeRnd, f64x_info, "SD">, 4924*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VT1>, VEX_LIG, VEX_W; 4925*9880d681SAndroid Build Coastguard Worker } 4926*9880d681SAndroid Build Coastguard Worker} 4927*9880d681SAndroid Build Coastguard Worker 4928*9880d681SAndroid Build Coastguard Workerdefm VFMADD : avx512_fma3s<0xA9, 0xB9, 0x99, "vfmadd", X86Fmadd, X86FmaddRnd>; 4929*9880d681SAndroid Build Coastguard Workerdefm VFMSUB : avx512_fma3s<0xAB, 0xBB, 0x9B, "vfmsub", X86Fmsub, X86FmsubRnd>; 4930*9880d681SAndroid Build Coastguard Workerdefm VFNMADD : avx512_fma3s<0xAD, 0xBD, 0x9D, "vfnmadd", X86Fnmadd, X86FnmaddRnd>; 4931*9880d681SAndroid Build Coastguard Workerdefm VFNMSUB : avx512_fma3s<0xAF, 0xBF, 0x9F, "vfnmsub", X86Fnmsub, X86FnmsubRnd>; 4932*9880d681SAndroid Build Coastguard Worker 4933*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4934*9880d681SAndroid Build Coastguard Worker// AVX-512 Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit IFMA 4935*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4936*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 4937*9880d681SAndroid Build Coastguard Workermulticlass avx512_pmadd52_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, 4938*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 4939*9880d681SAndroid Build Coastguard Worker defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 4940*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3), 4941*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 4942*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, _.RC:$src3))>, 4943*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4944*9880d681SAndroid Build Coastguard Worker 4945*9880d681SAndroid Build Coastguard Worker defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4946*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.MemOp:$src3), 4947*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2", "$src2, $src3", 4948*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, _.RC:$src2, (_.LdFrag addr:$src3)))>, 4949*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base; 4950*9880d681SAndroid Build Coastguard Worker 4951*9880d681SAndroid Build Coastguard Worker defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 4952*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3), 4953*9880d681SAndroid Build Coastguard Worker OpcodeStr, !strconcat("${src3}", _.BroadcastStr,", $src2"), 4954*9880d681SAndroid Build Coastguard Worker !strconcat("$src2, ${src3}", _.BroadcastStr ), 4955*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, 4956*9880d681SAndroid Build Coastguard Worker _.RC:$src2,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3))))>, 4957*9880d681SAndroid Build Coastguard Worker AVX512FMA3Base, EVEX_B; 4958*9880d681SAndroid Build Coastguard Worker} 4959*9880d681SAndroid Build Coastguard Worker} // Constraints = "$src1 = $dst" 4960*9880d681SAndroid Build Coastguard Worker 4961*9880d681SAndroid Build Coastguard Workermulticlass avx512_pmadd52_common<bits<8> opc, string OpcodeStr, SDNode OpNode, 4962*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _> { 4963*9880d681SAndroid Build Coastguard Worker let Predicates = [HasIFMA] in { 4964*9880d681SAndroid Build Coastguard Worker defm Z : avx512_pmadd52_rm<opc, OpcodeStr, OpNode, _.info512>, 4965*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; 4966*9880d681SAndroid Build Coastguard Worker } 4967*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasIFMA] in { 4968*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_pmadd52_rm<opc, OpcodeStr, OpNode, _.info256>, 4969*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; 4970*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_pmadd52_rm<opc, OpcodeStr, OpNode, _.info128>, 4971*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>; 4972*9880d681SAndroid Build Coastguard Worker } 4973*9880d681SAndroid Build Coastguard Worker} 4974*9880d681SAndroid Build Coastguard Worker 4975*9880d681SAndroid Build Coastguard Workerdefm VPMADD52LUQ : avx512_pmadd52_common<0xb4, "vpmadd52luq", x86vpmadd52l, 4976*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info>, VEX_W; 4977*9880d681SAndroid Build Coastguard Workerdefm VPMADD52HUQ : avx512_pmadd52_common<0xb5, "vpmadd52huq", x86vpmadd52h, 4978*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info>, VEX_W; 4979*9880d681SAndroid Build Coastguard Worker 4980*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4981*9880d681SAndroid Build Coastguard Worker// AVX-512 Scalar convert from sign integer to float/double 4982*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 4983*9880d681SAndroid Build Coastguard Worker 4984*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcvtsi<bits<8> opc, SDNode OpNode, RegisterClass SrcRC, 4985*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DstVT, X86MemOperand x86memop, 4986*9880d681SAndroid Build Coastguard Worker PatFrag ld_frag, string asm> { 4987*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in { 4988*9880d681SAndroid Build Coastguard Worker def rr : SI<opc, MRMSrcReg, (outs DstVT.FRC:$dst), 4989*9880d681SAndroid Build Coastguard Worker (ins DstVT.FRC:$src1, SrcRC:$src), 4990*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $src1, $dst|$dst, $src1, $src}"), []>, 4991*9880d681SAndroid Build Coastguard Worker EVEX_4V; 4992*9880d681SAndroid Build Coastguard Worker let mayLoad = 1 in 4993*9880d681SAndroid Build Coastguard Worker def rm : SI<opc, MRMSrcMem, (outs DstVT.FRC:$dst), 4994*9880d681SAndroid Build Coastguard Worker (ins DstVT.FRC:$src1, x86memop:$src), 4995*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $src1, $dst|$dst, $src1, $src}"), []>, 4996*9880d681SAndroid Build Coastguard Worker EVEX_4V; 4997*9880d681SAndroid Build Coastguard Worker } // hasSideEffects = 0 4998*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 4999*9880d681SAndroid Build Coastguard Worker def rr_Int : SI<opc, MRMSrcReg, (outs DstVT.RC:$dst), 5000*9880d681SAndroid Build Coastguard Worker (ins DstVT.RC:$src1, SrcRC:$src2), 5001*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 5002*9880d681SAndroid Build Coastguard Worker [(set DstVT.RC:$dst, 5003*9880d681SAndroid Build Coastguard Worker (OpNode (DstVT.VT DstVT.RC:$src1), 5004*9880d681SAndroid Build Coastguard Worker SrcRC:$src2, 5005*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)))]>, EVEX_4V; 5006*9880d681SAndroid Build Coastguard Worker 5007*9880d681SAndroid Build Coastguard Worker def rm_Int : SI<opc, MRMSrcMem, (outs DstVT.RC:$dst), 5008*9880d681SAndroid Build Coastguard Worker (ins DstVT.RC:$src1, x86memop:$src2), 5009*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 5010*9880d681SAndroid Build Coastguard Worker [(set DstVT.RC:$dst, 5011*9880d681SAndroid Build Coastguard Worker (OpNode (DstVT.VT DstVT.RC:$src1), 5012*9880d681SAndroid Build Coastguard Worker (ld_frag addr:$src2), 5013*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)))]>, EVEX_4V; 5014*9880d681SAndroid Build Coastguard Worker }//isCodeGenOnly = 1 5015*9880d681SAndroid Build Coastguard Worker} 5016*9880d681SAndroid Build Coastguard Worker 5017*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcvtsi_round<bits<8> opc, SDNode OpNode, RegisterClass SrcRC, 5018*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DstVT, string asm> { 5019*9880d681SAndroid Build Coastguard Worker def rrb_Int : SI<opc, MRMSrcReg, (outs DstVT.RC:$dst), 5020*9880d681SAndroid Build Coastguard Worker (ins DstVT.RC:$src1, SrcRC:$src2, AVX512RC:$rc), 5021*9880d681SAndroid Build Coastguard Worker !strconcat(asm, 5022*9880d681SAndroid Build Coastguard Worker "\t{$src2, $rc, $src1, $dst|$dst, $src1, $rc, $src2}"), 5023*9880d681SAndroid Build Coastguard Worker [(set DstVT.RC:$dst, 5024*9880d681SAndroid Build Coastguard Worker (OpNode (DstVT.VT DstVT.RC:$src1), 5025*9880d681SAndroid Build Coastguard Worker SrcRC:$src2, 5026*9880d681SAndroid Build Coastguard Worker (i32 imm:$rc)))]>, EVEX_4V, EVEX_B, EVEX_RC; 5027*9880d681SAndroid Build Coastguard Worker} 5028*9880d681SAndroid Build Coastguard Worker 5029*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcvtsi_common<bits<8> opc, SDNode OpNode, RegisterClass SrcRC, 5030*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DstVT, X86MemOperand x86memop, 5031*9880d681SAndroid Build Coastguard Worker PatFrag ld_frag, string asm> { 5032*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_vcvtsi_round<opc, OpNode, SrcRC, DstVT, asm>, 5033*9880d681SAndroid Build Coastguard Worker avx512_vcvtsi<opc, OpNode, SrcRC, DstVT, x86memop, ld_frag, asm>, 5034*9880d681SAndroid Build Coastguard Worker VEX_LIG; 5035*9880d681SAndroid Build Coastguard Worker} 5036*9880d681SAndroid Build Coastguard Worker 5037*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5038*9880d681SAndroid Build Coastguard Workerdefm VCVTSI2SSZ : avx512_vcvtsi_common<0x2A, X86SintToFpRnd, GR32, 5039*9880d681SAndroid Build Coastguard Worker v4f32x_info, i32mem, loadi32, "cvtsi2ss{l}">, 5040*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VT1>; 5041*9880d681SAndroid Build Coastguard Workerdefm VCVTSI642SSZ: avx512_vcvtsi_common<0x2A, X86SintToFpRnd, GR64, 5042*9880d681SAndroid Build Coastguard Worker v4f32x_info, i64mem, loadi64, "cvtsi2ss{q}">, 5043*9880d681SAndroid Build Coastguard Worker XS, VEX_W, EVEX_CD8<64, CD8VT1>; 5044*9880d681SAndroid Build Coastguard Workerdefm VCVTSI2SDZ : avx512_vcvtsi_common<0x2A, X86SintToFpRnd, GR32, 5045*9880d681SAndroid Build Coastguard Worker v2f64x_info, i32mem, loadi32, "cvtsi2sd{l}">, 5046*9880d681SAndroid Build Coastguard Worker XD, EVEX_CD8<32, CD8VT1>; 5047*9880d681SAndroid Build Coastguard Workerdefm VCVTSI642SDZ: avx512_vcvtsi_common<0x2A, X86SintToFpRnd, GR64, 5048*9880d681SAndroid Build Coastguard Worker v2f64x_info, i64mem, loadi64, "cvtsi2sd{q}">, 5049*9880d681SAndroid Build Coastguard Worker XD, VEX_W, EVEX_CD8<64, CD8VT1>; 5050*9880d681SAndroid Build Coastguard Worker 5051*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (sint_to_fp (loadi32 addr:$src))), 5052*9880d681SAndroid Build Coastguard Worker (VCVTSI2SSZrm (f32 (IMPLICIT_DEF)), addr:$src)>; 5053*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (sint_to_fp (loadi64 addr:$src))), 5054*9880d681SAndroid Build Coastguard Worker (VCVTSI642SSZrm (f32 (IMPLICIT_DEF)), addr:$src)>; 5055*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (sint_to_fp (loadi32 addr:$src))), 5056*9880d681SAndroid Build Coastguard Worker (VCVTSI2SDZrm (f64 (IMPLICIT_DEF)), addr:$src)>; 5057*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (sint_to_fp (loadi64 addr:$src))), 5058*9880d681SAndroid Build Coastguard Worker (VCVTSI642SDZrm (f64 (IMPLICIT_DEF)), addr:$src)>; 5059*9880d681SAndroid Build Coastguard Worker 5060*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (sint_to_fp GR32:$src)), 5061*9880d681SAndroid Build Coastguard Worker (VCVTSI2SSZrr (f32 (IMPLICIT_DEF)), GR32:$src)>; 5062*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (sint_to_fp GR64:$src)), 5063*9880d681SAndroid Build Coastguard Worker (VCVTSI642SSZrr (f32 (IMPLICIT_DEF)), GR64:$src)>; 5064*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (sint_to_fp GR32:$src)), 5065*9880d681SAndroid Build Coastguard Worker (VCVTSI2SDZrr (f64 (IMPLICIT_DEF)), GR32:$src)>; 5066*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (sint_to_fp GR64:$src)), 5067*9880d681SAndroid Build Coastguard Worker (VCVTSI642SDZrr (f64 (IMPLICIT_DEF)), GR64:$src)>; 5068*9880d681SAndroid Build Coastguard Worker 5069*9880d681SAndroid Build Coastguard Workerdefm VCVTUSI2SSZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, GR32, 5070*9880d681SAndroid Build Coastguard Worker v4f32x_info, i32mem, loadi32, 5071*9880d681SAndroid Build Coastguard Worker "cvtusi2ss{l}">, XS, EVEX_CD8<32, CD8VT1>; 5072*9880d681SAndroid Build Coastguard Workerdefm VCVTUSI642SSZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, GR64, 5073*9880d681SAndroid Build Coastguard Worker v4f32x_info, i64mem, loadi64, "cvtusi2ss{q}">, 5074*9880d681SAndroid Build Coastguard Worker XS, VEX_W, EVEX_CD8<64, CD8VT1>; 5075*9880d681SAndroid Build Coastguard Workerdefm VCVTUSI2SDZ : avx512_vcvtsi<0x7B, X86UintToFpRnd, GR32, v2f64x_info, 5076*9880d681SAndroid Build Coastguard Worker i32mem, loadi32, "cvtusi2sd{l}">, 5077*9880d681SAndroid Build Coastguard Worker XD, VEX_LIG, EVEX_CD8<32, CD8VT1>; 5078*9880d681SAndroid Build Coastguard Workerdefm VCVTUSI642SDZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, GR64, 5079*9880d681SAndroid Build Coastguard Worker v2f64x_info, i64mem, loadi64, "cvtusi2sd{q}">, 5080*9880d681SAndroid Build Coastguard Worker XD, VEX_W, EVEX_CD8<64, CD8VT1>; 5081*9880d681SAndroid Build Coastguard Worker 5082*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (uint_to_fp (loadi32 addr:$src))), 5083*9880d681SAndroid Build Coastguard Worker (VCVTUSI2SSZrm (f32 (IMPLICIT_DEF)), addr:$src)>; 5084*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (uint_to_fp (loadi64 addr:$src))), 5085*9880d681SAndroid Build Coastguard Worker (VCVTUSI642SSZrm (f32 (IMPLICIT_DEF)), addr:$src)>; 5086*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (uint_to_fp (loadi32 addr:$src))), 5087*9880d681SAndroid Build Coastguard Worker (VCVTUSI2SDZrm (f64 (IMPLICIT_DEF)), addr:$src)>; 5088*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (uint_to_fp (loadi64 addr:$src))), 5089*9880d681SAndroid Build Coastguard Worker (VCVTUSI642SDZrm (f64 (IMPLICIT_DEF)), addr:$src)>; 5090*9880d681SAndroid Build Coastguard Worker 5091*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (uint_to_fp GR32:$src)), 5092*9880d681SAndroid Build Coastguard Worker (VCVTUSI2SSZrr (f32 (IMPLICIT_DEF)), GR32:$src)>; 5093*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (uint_to_fp GR64:$src)), 5094*9880d681SAndroid Build Coastguard Worker (VCVTUSI642SSZrr (f32 (IMPLICIT_DEF)), GR64:$src)>; 5095*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (uint_to_fp GR32:$src)), 5096*9880d681SAndroid Build Coastguard Worker (VCVTUSI2SDZrr (f64 (IMPLICIT_DEF)), GR32:$src)>; 5097*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (uint_to_fp GR64:$src)), 5098*9880d681SAndroid Build Coastguard Worker (VCVTUSI642SDZrr (f64 (IMPLICIT_DEF)), GR64:$src)>; 5099*9880d681SAndroid Build Coastguard Worker} 5100*9880d681SAndroid Build Coastguard Worker 5101*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5102*9880d681SAndroid Build Coastguard Worker// AVX-512 Scalar convert from float/double to integer 5103*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5104*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_s_int_round<bits<8> opc, X86VectorVTInfo SrcVT , 5105*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DstVT, SDNode OpNode, string asm> { 5106*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5107*9880d681SAndroid Build Coastguard Worker def rr : SI<opc, MRMSrcReg, (outs DstVT.RC:$dst), (ins SrcVT.RC:$src), 5108*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $dst|$dst, $src}"), 5109*9880d681SAndroid Build Coastguard Worker [(set DstVT.RC:$dst, (OpNode (SrcVT.VT SrcVT.RC:$src),(i32 FROUND_CURRENT)))]>, 5110*9880d681SAndroid Build Coastguard Worker EVEX, VEX_LIG; 5111*9880d681SAndroid Build Coastguard Worker def rb : SI<opc, MRMSrcReg, (outs DstVT.RC:$dst), (ins SrcVT.RC:$src, AVX512RC:$rc), 5112*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$rc, $src, $dst|$dst, $src, $rc}"), 5113*9880d681SAndroid Build Coastguard Worker [(set DstVT.RC:$dst, (OpNode (SrcVT.VT SrcVT.RC:$src),(i32 imm:$rc)))]>, 5114*9880d681SAndroid Build Coastguard Worker EVEX, VEX_LIG, EVEX_B, EVEX_RC; 5115*9880d681SAndroid Build Coastguard Worker def rm : SI<opc, MRMSrcMem, (outs DstVT.RC:$dst), (ins SrcVT.ScalarMemOp:$src), 5116*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $dst|$dst, $src}"), 5117*9880d681SAndroid Build Coastguard Worker [(set DstVT.RC:$dst, (OpNode 5118*9880d681SAndroid Build Coastguard Worker (SrcVT.VT (scalar_to_vector (SrcVT.ScalarLdFrag addr:$src))), 5119*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)))]>, 5120*9880d681SAndroid Build Coastguard Worker EVEX, VEX_LIG; 5121*9880d681SAndroid Build Coastguard Worker } // Predicates = [HasAVX512] 5122*9880d681SAndroid Build Coastguard Worker} 5123*9880d681SAndroid Build Coastguard Worker 5124*9880d681SAndroid Build Coastguard Worker// Convert float/double to signed/unsigned int 32/64 5125*9880d681SAndroid Build Coastguard Workerdefm VCVTSS2SIZ: avx512_cvt_s_int_round<0x2D, f32x_info, i32x_info, 5126*9880d681SAndroid Build Coastguard Worker X86cvts2si, "cvtss2si">, 5127*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VT1>; 5128*9880d681SAndroid Build Coastguard Workerdefm VCVTSS2SI64Z: avx512_cvt_s_int_round<0x2D, f32x_info, i64x_info, 5129*9880d681SAndroid Build Coastguard Worker X86cvts2si, "cvtss2si">, 5130*9880d681SAndroid Build Coastguard Worker XS, VEX_W, EVEX_CD8<32, CD8VT1>; 5131*9880d681SAndroid Build Coastguard Workerdefm VCVTSS2USIZ: avx512_cvt_s_int_round<0x79, f32x_info, i32x_info, 5132*9880d681SAndroid Build Coastguard Worker X86cvts2usi, "cvtss2usi">, 5133*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VT1>; 5134*9880d681SAndroid Build Coastguard Workerdefm VCVTSS2USI64Z: avx512_cvt_s_int_round<0x79, f32x_info, i64x_info, 5135*9880d681SAndroid Build Coastguard Worker X86cvts2usi, "cvtss2usi">, XS, VEX_W, 5136*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 5137*9880d681SAndroid Build Coastguard Workerdefm VCVTSD2SIZ: avx512_cvt_s_int_round<0x2D, f64x_info, i32x_info, 5138*9880d681SAndroid Build Coastguard Worker X86cvts2si, "cvtsd2si">, 5139*9880d681SAndroid Build Coastguard Worker XD, EVEX_CD8<64, CD8VT1>; 5140*9880d681SAndroid Build Coastguard Workerdefm VCVTSD2SI64Z: avx512_cvt_s_int_round<0x2D, f64x_info, i64x_info, 5141*9880d681SAndroid Build Coastguard Worker X86cvts2si, "cvtsd2si">, 5142*9880d681SAndroid Build Coastguard Worker XD, VEX_W, EVEX_CD8<64, CD8VT1>; 5143*9880d681SAndroid Build Coastguard Workerdefm VCVTSD2USIZ: avx512_cvt_s_int_round<0x79, f64x_info, i32x_info, 5144*9880d681SAndroid Build Coastguard Worker X86cvts2usi, "cvtsd2usi">, 5145*9880d681SAndroid Build Coastguard Worker XD, EVEX_CD8<64, CD8VT1>; 5146*9880d681SAndroid Build Coastguard Workerdefm VCVTSD2USI64Z: avx512_cvt_s_int_round<0x79, f64x_info, i64x_info, 5147*9880d681SAndroid Build Coastguard Worker X86cvts2usi, "cvtsd2usi">, XD, VEX_W, 5148*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VT1>; 5149*9880d681SAndroid Build Coastguard Worker 5150*9880d681SAndroid Build Coastguard Worker// The SSE version of these instructions are disabled for AVX512. 5151*9880d681SAndroid Build Coastguard Worker// Therefore, the SSE intrinsics are mapped to the AVX512 instructions. 5152*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5153*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (int_x86_sse_cvtss2si (v4f32 VR128X:$src))), 5154*9880d681SAndroid Build Coastguard Worker (VCVTSS2SIZrr (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 5155*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (int_x86_sse_cvtss2si64 (v4f32 VR128X:$src))), 5156*9880d681SAndroid Build Coastguard Worker (VCVTSS2SI64Zrr (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 5157*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (int_x86_sse2_cvtsd2si (v2f64 VR128X:$src))), 5158*9880d681SAndroid Build Coastguard Worker (VCVTSD2SIZrr (COPY_TO_REGCLASS VR128X:$src, FR64X))>; 5159*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (int_x86_sse2_cvtsd2si64 (v2f64 VR128X:$src))), 5160*9880d681SAndroid Build Coastguard Worker (VCVTSD2SI64Zrr (COPY_TO_REGCLASS VR128X:$src, FR64X))>; 5161*9880d681SAndroid Build Coastguard Worker} // HasAVX512 5162*9880d681SAndroid Build Coastguard Worker 5163*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 , Predicates = [HasAVX512] in { 5164*9880d681SAndroid Build Coastguard Worker defm Int_VCVTSI2SSZ : sse12_cvt_sint_3addr<0x2A, GR32, VR128X, 5165*9880d681SAndroid Build Coastguard Worker int_x86_sse_cvtsi2ss, i32mem, loadi32, "cvtsi2ss{l}", 5166*9880d681SAndroid Build Coastguard Worker SSE_CVT_Scalar, 0>, XS, EVEX_4V; 5167*9880d681SAndroid Build Coastguard Worker defm Int_VCVTSI2SS64Z : sse12_cvt_sint_3addr<0x2A, GR64, VR128X, 5168*9880d681SAndroid Build Coastguard Worker int_x86_sse_cvtsi642ss, i64mem, loadi64, "cvtsi2ss{q}", 5169*9880d681SAndroid Build Coastguard Worker SSE_CVT_Scalar, 0>, XS, EVEX_4V, VEX_W; 5170*9880d681SAndroid Build Coastguard Worker defm Int_VCVTSI2SDZ : sse12_cvt_sint_3addr<0x2A, GR32, VR128X, 5171*9880d681SAndroid Build Coastguard Worker int_x86_sse2_cvtsi2sd, i32mem, loadi32, "cvtsi2sd{l}", 5172*9880d681SAndroid Build Coastguard Worker SSE_CVT_Scalar, 0>, XD, EVEX_4V; 5173*9880d681SAndroid Build Coastguard Worker defm Int_VCVTSI2SD64Z : sse12_cvt_sint_3addr<0x2A, GR64, VR128X, 5174*9880d681SAndroid Build Coastguard Worker int_x86_sse2_cvtsi642sd, i64mem, loadi64, "cvtsi2sd{q}", 5175*9880d681SAndroid Build Coastguard Worker SSE_CVT_Scalar, 0>, XD, EVEX_4V, VEX_W; 5176*9880d681SAndroid Build Coastguard Worker 5177*9880d681SAndroid Build Coastguard Worker defm Int_VCVTUSI2SDZ : sse12_cvt_sint_3addr<0x7B, GR32, VR128X, 5178*9880d681SAndroid Build Coastguard Worker int_x86_avx512_cvtusi2sd, i32mem, loadi32, "cvtusi2sd{l}", 5179*9880d681SAndroid Build Coastguard Worker SSE_CVT_Scalar, 0>, XD, EVEX_4V; 5180*9880d681SAndroid Build Coastguard Worker} // isCodeGenOnly = 1, Predicates = [HasAVX512] 5181*9880d681SAndroid Build Coastguard Worker 5182*9880d681SAndroid Build Coastguard Worker// Convert float/double to signed/unsigned int 32/64 with truncation 5183*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_s_all<bits<8> opc, string asm, X86VectorVTInfo _SrcRC, 5184*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _DstRC, SDNode OpNode, 5185*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd>{ 5186*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5187*9880d681SAndroid Build Coastguard Worker def rr : SI<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.FRC:$src), 5188*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $dst|$dst, $src}"), 5189*9880d681SAndroid Build Coastguard Worker [(set _DstRC.RC:$dst, (OpNode _SrcRC.FRC:$src))]>, EVEX; 5190*9880d681SAndroid Build Coastguard Worker def rb : SI<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.FRC:$src), 5191*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{{sae}, $src, $dst|$dst, $src, {sae}}"), 5192*9880d681SAndroid Build Coastguard Worker []>, EVEX, EVEX_B; 5193*9880d681SAndroid Build Coastguard Worker def rm : SI<opc, MRMSrcMem, (outs _DstRC.RC:$dst), (ins _SrcRC.ScalarMemOp:$src), 5194*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $dst|$dst, $src}"), 5195*9880d681SAndroid Build Coastguard Worker [(set _DstRC.RC:$dst, (OpNode (_SrcRC.ScalarLdFrag addr:$src)))]>, 5196*9880d681SAndroid Build Coastguard Worker EVEX; 5197*9880d681SAndroid Build Coastguard Worker 5198*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 5199*9880d681SAndroid Build Coastguard Worker def rr_Int : SI<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.RC:$src), 5200*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $dst|$dst, $src}"), 5201*9880d681SAndroid Build Coastguard Worker [(set _DstRC.RC:$dst, (OpNodeRnd (_SrcRC.VT _SrcRC.RC:$src), 5202*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)))]>, EVEX, VEX_LIG; 5203*9880d681SAndroid Build Coastguard Worker def rb_Int : SI<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.RC:$src), 5204*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{{sae}, $src, $dst|$dst, $src, {sae}}"), 5205*9880d681SAndroid Build Coastguard Worker [(set _DstRC.RC:$dst, (OpNodeRnd (_SrcRC.VT _SrcRC.RC:$src), 5206*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC)))]>, 5207*9880d681SAndroid Build Coastguard Worker EVEX,VEX_LIG , EVEX_B; 5208*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, hasSideEffects = 0 in 5209*9880d681SAndroid Build Coastguard Worker def rm_Int : SI<opc, MRMSrcMem, (outs _DstRC.RC:$dst), 5210*9880d681SAndroid Build Coastguard Worker (ins _SrcRC.MemOp:$src), 5211*9880d681SAndroid Build Coastguard Worker !strconcat(asm,"\t{$src, $dst|$dst, $src}"), 5212*9880d681SAndroid Build Coastguard Worker []>, EVEX, VEX_LIG; 5213*9880d681SAndroid Build Coastguard Worker 5214*9880d681SAndroid Build Coastguard Worker } // isCodeGenOnly = 1 5215*9880d681SAndroid Build Coastguard Worker} //HasAVX512 5216*9880d681SAndroid Build Coastguard Worker} 5217*9880d681SAndroid Build Coastguard Worker 5218*9880d681SAndroid Build Coastguard Worker 5219*9880d681SAndroid Build Coastguard Workerdefm VCVTTSS2SIZ: avx512_cvt_s_all<0x2C, "cvttss2si", f32x_info, i32x_info, 5220*9880d681SAndroid Build Coastguard Worker fp_to_sint,X86cvtts2IntRnd>, 5221*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VT1>; 5222*9880d681SAndroid Build Coastguard Workerdefm VCVTTSS2SI64Z: avx512_cvt_s_all<0x2C, "cvttss2si", f32x_info, i64x_info, 5223*9880d681SAndroid Build Coastguard Worker fp_to_sint,X86cvtts2IntRnd>, 5224*9880d681SAndroid Build Coastguard Worker VEX_W, XS, EVEX_CD8<32, CD8VT1>; 5225*9880d681SAndroid Build Coastguard Workerdefm VCVTTSD2SIZ: avx512_cvt_s_all<0x2C, "cvttsd2si", f64x_info, i32x_info, 5226*9880d681SAndroid Build Coastguard Worker fp_to_sint,X86cvtts2IntRnd>, 5227*9880d681SAndroid Build Coastguard Worker XD, EVEX_CD8<64, CD8VT1>; 5228*9880d681SAndroid Build Coastguard Workerdefm VCVTTSD2SI64Z: avx512_cvt_s_all<0x2C, "cvttsd2si", f64x_info, i64x_info, 5229*9880d681SAndroid Build Coastguard Worker fp_to_sint,X86cvtts2IntRnd>, 5230*9880d681SAndroid Build Coastguard Worker VEX_W, XD, EVEX_CD8<64, CD8VT1>; 5231*9880d681SAndroid Build Coastguard Worker 5232*9880d681SAndroid Build Coastguard Workerdefm VCVTTSS2USIZ: avx512_cvt_s_all<0x78, "cvttss2usi", f32x_info, i32x_info, 5233*9880d681SAndroid Build Coastguard Worker fp_to_uint,X86cvtts2UIntRnd>, 5234*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VT1>; 5235*9880d681SAndroid Build Coastguard Workerdefm VCVTTSS2USI64Z: avx512_cvt_s_all<0x78, "cvttss2usi", f32x_info, i64x_info, 5236*9880d681SAndroid Build Coastguard Worker fp_to_uint,X86cvtts2UIntRnd>, 5237*9880d681SAndroid Build Coastguard Worker XS,VEX_W, EVEX_CD8<32, CD8VT1>; 5238*9880d681SAndroid Build Coastguard Workerdefm VCVTTSD2USIZ: avx512_cvt_s_all<0x78, "cvttsd2usi", f64x_info, i32x_info, 5239*9880d681SAndroid Build Coastguard Worker fp_to_uint,X86cvtts2UIntRnd>, 5240*9880d681SAndroid Build Coastguard Worker XD, EVEX_CD8<64, CD8VT1>; 5241*9880d681SAndroid Build Coastguard Workerdefm VCVTTSD2USI64Z: avx512_cvt_s_all<0x78, "cvttsd2usi", f64x_info, i64x_info, 5242*9880d681SAndroid Build Coastguard Worker fp_to_uint,X86cvtts2UIntRnd>, 5243*9880d681SAndroid Build Coastguard Worker XD, VEX_W, EVEX_CD8<64, CD8VT1>; 5244*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5245*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (int_x86_sse_cvttss2si (v4f32 VR128X:$src))), 5246*9880d681SAndroid Build Coastguard Worker (VCVTTSS2SIZrr_Int (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 5247*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (int_x86_sse_cvttss2si64 (v4f32 VR128X:$src))), 5248*9880d681SAndroid Build Coastguard Worker (VCVTTSS2SI64Zrr_Int (COPY_TO_REGCLASS VR128X:$src, FR32X))>; 5249*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (int_x86_sse2_cvttsd2si (v2f64 VR128X:$src))), 5250*9880d681SAndroid Build Coastguard Worker (VCVTTSD2SIZrr_Int (COPY_TO_REGCLASS VR128X:$src, FR64X))>; 5251*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (int_x86_sse2_cvttsd2si64 (v2f64 VR128X:$src))), 5252*9880d681SAndroid Build Coastguard Worker (VCVTTSD2SI64Zrr_Int (COPY_TO_REGCLASS VR128X:$src, FR64X))>; 5253*9880d681SAndroid Build Coastguard Worker 5254*9880d681SAndroid Build Coastguard Worker} // HasAVX512 5255*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5256*9880d681SAndroid Build Coastguard Worker// AVX-512 Convert form float to double and back 5257*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5258*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_fp_scalar<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5259*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, SDNode OpNode> { 5260*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 5261*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _Src.RC:$src2), OpcodeStr, 5262*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 5263*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT _.RC:$src1), 5264*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src2)))>, 5265*9880d681SAndroid Build Coastguard Worker EVEX_4V, VEX_LIG, Sched<[WriteCvtF2F]>; 5266*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 5267*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src1, _Src.ScalarMemOp:$src2), OpcodeStr, 5268*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 5269*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT _.RC:$src1), 5270*9880d681SAndroid Build Coastguard Worker (_Src.VT (scalar_to_vector 5271*9880d681SAndroid Build Coastguard Worker (_Src.ScalarLdFrag addr:$src2)))))>, 5272*9880d681SAndroid Build Coastguard Worker EVEX_4V, VEX_LIG, Sched<[WriteCvtF2FLd, ReadAfterLd]>; 5273*9880d681SAndroid Build Coastguard Worker} 5274*9880d681SAndroid Build Coastguard Worker 5275*9880d681SAndroid Build Coastguard Worker// Scalar Coversion with SAE - suppress all exceptions 5276*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_fp_sae_scalar<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5277*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, SDNode OpNodeRnd> { 5278*9880d681SAndroid Build Coastguard Worker defm rrb : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 5279*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _Src.RC:$src2), OpcodeStr, 5280*9880d681SAndroid Build Coastguard Worker "{sae}, $src2, $src1", "$src1, $src2, {sae}", 5281*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd (_.VT _.RC:$src1), 5282*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src2), 5283*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC)))>, 5284*9880d681SAndroid Build Coastguard Worker EVEX_4V, VEX_LIG, EVEX_B; 5285*9880d681SAndroid Build Coastguard Worker} 5286*9880d681SAndroid Build Coastguard Worker 5287*9880d681SAndroid Build Coastguard Worker// Scalar Conversion with rounding control (RC) 5288*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_fp_rc_scalar<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5289*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, SDNode OpNodeRnd> { 5290*9880d681SAndroid Build Coastguard Worker defm rrb : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 5291*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _Src.RC:$src2, AVX512RC:$rc), OpcodeStr, 5292*9880d681SAndroid Build Coastguard Worker "$rc, $src2, $src1", "$src1, $src2, $rc", 5293*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd (_.VT _.RC:$src1), 5294*9880d681SAndroid Build Coastguard Worker (_Src.VT _Src.RC:$src2), (i32 imm:$rc)))>, 5295*9880d681SAndroid Build Coastguard Worker EVEX_4V, VEX_LIG, Sched<[WriteCvtF2FLd, ReadAfterLd]>, 5296*9880d681SAndroid Build Coastguard Worker EVEX_B, EVEX_RC; 5297*9880d681SAndroid Build Coastguard Worker} 5298*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_fp_scalar_sd2ss<bits<8> opc, string OpcodeStr, SDNode OpNode, 5299*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd, X86VectorVTInfo _src, 5300*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _dst> { 5301*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5302*9880d681SAndroid Build Coastguard Worker defm Z : avx512_cvt_fp_scalar<opc, OpcodeStr, _dst, _src, OpNode>, 5303*9880d681SAndroid Build Coastguard Worker avx512_cvt_fp_rc_scalar<opc, OpcodeStr, _dst, _src, 5304*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, VEX_W, EVEX_CD8<64, CD8VT1>, 5305*9880d681SAndroid Build Coastguard Worker EVEX_V512, XD; 5306*9880d681SAndroid Build Coastguard Worker } 5307*9880d681SAndroid Build Coastguard Worker} 5308*9880d681SAndroid Build Coastguard Worker 5309*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvt_fp_scalar_ss2sd<bits<8> opc, string OpcodeStr, SDNode OpNode, 5310*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd, X86VectorVTInfo _src, 5311*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _dst> { 5312*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5313*9880d681SAndroid Build Coastguard Worker defm Z : avx512_cvt_fp_scalar<opc, OpcodeStr, _dst, _src, OpNode>, 5314*9880d681SAndroid Build Coastguard Worker avx512_cvt_fp_sae_scalar<opc, OpcodeStr, _dst, _src, OpNodeRnd>, 5315*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>, XS, EVEX_V512; 5316*9880d681SAndroid Build Coastguard Worker } 5317*9880d681SAndroid Build Coastguard Worker} 5318*9880d681SAndroid Build Coastguard Workerdefm VCVTSD2SS : avx512_cvt_fp_scalar_sd2ss<0x5A, "vcvtsd2ss", X86fround, 5319*9880d681SAndroid Build Coastguard Worker X86froundRnd, f64x_info, f32x_info>; 5320*9880d681SAndroid Build Coastguard Workerdefm VCVTSS2SD : avx512_cvt_fp_scalar_ss2sd<0x5A, "vcvtss2sd", X86fpext, 5321*9880d681SAndroid Build Coastguard Worker X86fpextRnd,f32x_info, f64x_info >; 5322*9880d681SAndroid Build Coastguard Worker 5323*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fextend FR32X:$src)), 5324*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VCVTSS2SDZrr (COPY_TO_REGCLASS FR32X:$src, VR128X), 5325*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS FR32X:$src, VR128X)), VR128X)>, 5326*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512]>; 5327*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fextend (loadf32 addr:$src))), 5328*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VCVTSS2SDZrm (v4f32 (IMPLICIT_DEF)), addr:$src), VR128X)>, 5329*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512]>; 5330*9880d681SAndroid Build Coastguard Worker 5331*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extloadf32 addr:$src)), 5332*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VCVTSS2SDZrm (v4f32 (IMPLICIT_DEF)), addr:$src), VR128X)>, 5333*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512, OptForSize]>; 5334*9880d681SAndroid Build Coastguard Worker 5335*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extloadf32 addr:$src)), 5336*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VCVTSS2SDZrr (v4f32 (IMPLICIT_DEF)), 5337*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VMOVSSZrm addr:$src), VR128X)), VR128X)>, 5338*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512, OptForSpeed]>; 5339*9880d681SAndroid Build Coastguard Worker 5340*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fround FR64X:$src)), 5341*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VCVTSD2SSZrr (COPY_TO_REGCLASS FR64X:$src, VR128X), 5342*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS FR64X:$src, VR128X)), VR128X)>, 5343*9880d681SAndroid Build Coastguard Worker Requires<[HasAVX512]>; 5344*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5345*9880d681SAndroid Build Coastguard Worker// AVX-512 Vector convert from signed/unsigned integer to float/double 5346*9880d681SAndroid Build Coastguard Worker// and from float/double to signed/unsigned integer 5347*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5348*9880d681SAndroid Build Coastguard Worker 5349*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcvt_fp<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5350*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, SDNode OpNode, 5351*9880d681SAndroid Build Coastguard Worker string Broadcast = _.BroadcastStr, 5352*9880d681SAndroid Build Coastguard Worker string Alias = ""> { 5353*9880d681SAndroid Build Coastguard Worker 5354*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 5355*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src), OpcodeStr, "$src", "$src", 5356*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_Src.VT _Src.RC:$src)))>, EVEX; 5357*9880d681SAndroid Build Coastguard Worker 5358*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 5359*9880d681SAndroid Build Coastguard Worker (ins _Src.MemOp:$src), OpcodeStr#Alias, "$src", "$src", 5360*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_Src.VT 5361*9880d681SAndroid Build Coastguard Worker (bitconvert (_Src.LdFrag addr:$src)))))>, EVEX; 5362*9880d681SAndroid Build Coastguard Worker 5363*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 5364*9880d681SAndroid Build Coastguard Worker (ins _Src.ScalarMemOp:$src), OpcodeStr, 5365*9880d681SAndroid Build Coastguard Worker "${src}"##Broadcast, "${src}"##Broadcast, 5366*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_Src.VT 5367*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_Src.ScalarLdFrag addr:$src))) 5368*9880d681SAndroid Build Coastguard Worker ))>, EVEX, EVEX_B; 5369*9880d681SAndroid Build Coastguard Worker} 5370*9880d681SAndroid Build Coastguard Worker// Coversion with SAE - suppress all exceptions 5371*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcvt_fp_sae<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5372*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, SDNode OpNodeRnd> { 5373*9880d681SAndroid Build Coastguard Worker defm rrb : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 5374*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src), OpcodeStr, 5375*9880d681SAndroid Build Coastguard Worker "{sae}, $src", "$src, {sae}", 5376*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd (_Src.VT _Src.RC:$src), 5377*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC)))>, 5378*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_B; 5379*9880d681SAndroid Build Coastguard Worker} 5380*9880d681SAndroid Build Coastguard Worker 5381*9880d681SAndroid Build Coastguard Worker// Conversion with rounding control (RC) 5382*9880d681SAndroid Build Coastguard Workermulticlass avx512_vcvt_fp_rc<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5383*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _Src, SDNode OpNodeRnd> { 5384*9880d681SAndroid Build Coastguard Worker defm rrb : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 5385*9880d681SAndroid Build Coastguard Worker (ins _Src.RC:$src, AVX512RC:$rc), OpcodeStr, 5386*9880d681SAndroid Build Coastguard Worker "$rc, $src", "$src, $rc", 5387*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd (_Src.VT _Src.RC:$src), (i32 imm:$rc)))>, 5388*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_B, EVEX_RC; 5389*9880d681SAndroid Build Coastguard Worker} 5390*9880d681SAndroid Build Coastguard Worker 5391*9880d681SAndroid Build Coastguard Worker// Extend Float to Double 5392*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtps2pd<bits<8> opc, string OpcodeStr> { 5393*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5394*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f64_info, v8f32x_info, fextend>, 5395*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_sae<opc, OpcodeStr, v8f64_info, v8f32x_info, 5396*9880d681SAndroid Build Coastguard Worker X86vfpextRnd>, EVEX_V512; 5397*9880d681SAndroid Build Coastguard Worker } 5398*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5399*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2f64x_info, v4f32x_info, 5400*9880d681SAndroid Build Coastguard Worker X86vfpext, "{1to2}">, EVEX_V128; 5401*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f64x_info, v4f32x_info, fextend>, 5402*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5403*9880d681SAndroid Build Coastguard Worker } 5404*9880d681SAndroid Build Coastguard Worker} 5405*9880d681SAndroid Build Coastguard Worker 5406*9880d681SAndroid Build Coastguard Worker// Truncate Double to Float 5407*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtpd2ps<bits<8> opc, string OpcodeStr> { 5408*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5409*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f32x_info, v8f64_info, fround>, 5410*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v8f32x_info, v8f64_info, 5411*9880d681SAndroid Build Coastguard Worker X86vfproundRnd>, EVEX_V512; 5412*9880d681SAndroid Build Coastguard Worker } 5413*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5414*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v2f64x_info, 5415*9880d681SAndroid Build Coastguard Worker X86vfpround, "{1to2}", "{x}">, EVEX_V128; 5416*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v4f64x_info, fround, 5417*9880d681SAndroid Build Coastguard Worker "{1to4}", "{y}">, EVEX_V256; 5418*9880d681SAndroid Build Coastguard Worker } 5419*9880d681SAndroid Build Coastguard Worker} 5420*9880d681SAndroid Build Coastguard Worker 5421*9880d681SAndroid Build Coastguard Workerdefm VCVTPD2PS : avx512_cvtpd2ps<0x5A, "vcvtpd2ps">, 5422*9880d681SAndroid Build Coastguard Worker VEX_W, PD, EVEX_CD8<64, CD8VF>; 5423*9880d681SAndroid Build Coastguard Workerdefm VCVTPS2PD : avx512_cvtps2pd<0x5A, "vcvtps2pd">, 5424*9880d681SAndroid Build Coastguard Worker PS, EVEX_CD8<32, CD8VH>; 5425*9880d681SAndroid Build Coastguard Worker 5426*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (extloadv8f32 addr:$src)), 5427*9880d681SAndroid Build Coastguard Worker (VCVTPS2PDZrm addr:$src)>; 5428*9880d681SAndroid Build Coastguard Worker 5429*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 5430*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f64 (extloadv4f32 addr:$src)), 5431*9880d681SAndroid Build Coastguard Worker (VCVTPS2PDZ256rm addr:$src)>; 5432*9880d681SAndroid Build Coastguard Worker} 5433*9880d681SAndroid Build Coastguard Worker 5434*9880d681SAndroid Build Coastguard Worker// Convert Signed/Unsigned Doubleword to Double 5435*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtdq2pd<bits<8> opc, string OpcodeStr, SDNode OpNode, 5436*9880d681SAndroid Build Coastguard Worker SDNode OpNode128> { 5437*9880d681SAndroid Build Coastguard Worker // No rounding in this op 5438*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 5439*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f64_info, v8i32x_info, OpNode>, 5440*9880d681SAndroid Build Coastguard Worker EVEX_V512; 5441*9880d681SAndroid Build Coastguard Worker 5442*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5443*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2f64x_info, v4i32x_info, 5444*9880d681SAndroid Build Coastguard Worker OpNode128, "{1to2}">, EVEX_V128; 5445*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f64x_info, v4i32x_info, OpNode>, 5446*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5447*9880d681SAndroid Build Coastguard Worker } 5448*9880d681SAndroid Build Coastguard Worker} 5449*9880d681SAndroid Build Coastguard Worker 5450*9880d681SAndroid Build Coastguard Worker// Convert Signed/Unsigned Doubleword to Float 5451*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtdq2ps<bits<8> opc, string OpcodeStr, SDNode OpNode, 5452*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd> { 5453*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 5454*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16f32_info, v16i32_info, OpNode>, 5455*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v16f32_info, v16i32_info, 5456*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5457*9880d681SAndroid Build Coastguard Worker 5458*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5459*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v4i32x_info, OpNode>, 5460*9880d681SAndroid Build Coastguard Worker EVEX_V128; 5461*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v8f32x_info, v8i32x_info, OpNode>, 5462*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5463*9880d681SAndroid Build Coastguard Worker } 5464*9880d681SAndroid Build Coastguard Worker} 5465*9880d681SAndroid Build Coastguard Worker 5466*9880d681SAndroid Build Coastguard Worker// Convert Float to Signed/Unsigned Doubleword with truncation 5467*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvttps2dq<bits<8> opc, string OpcodeStr, 5468*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5469*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5470*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16i32_info, v16f32_info, OpNode>, 5471*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_sae<opc, OpcodeStr, v16i32_info, v16f32_info, 5472*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5473*9880d681SAndroid Build Coastguard Worker } 5474*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5475*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f32x_info, OpNode>, 5476*9880d681SAndroid Build Coastguard Worker EVEX_V128; 5477*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f32x_info, OpNode>, 5478*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5479*9880d681SAndroid Build Coastguard Worker } 5480*9880d681SAndroid Build Coastguard Worker} 5481*9880d681SAndroid Build Coastguard Worker 5482*9880d681SAndroid Build Coastguard Worker// Convert Float to Signed/Unsigned Doubleword 5483*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtps2dq<bits<8> opc, string OpcodeStr, 5484*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5485*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5486*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16i32_info, v16f32_info, OpNode>, 5487*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v16i32_info, v16f32_info, 5488*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5489*9880d681SAndroid Build Coastguard Worker } 5490*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5491*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f32x_info, OpNode>, 5492*9880d681SAndroid Build Coastguard Worker EVEX_V128; 5493*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f32x_info, OpNode>, 5494*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5495*9880d681SAndroid Build Coastguard Worker } 5496*9880d681SAndroid Build Coastguard Worker} 5497*9880d681SAndroid Build Coastguard Worker 5498*9880d681SAndroid Build Coastguard Worker// Convert Double to Signed/Unsigned Doubleword with truncation 5499*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvttpd2dq<bits<8> opc, string OpcodeStr, 5500*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5501*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5502*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f64_info, OpNode>, 5503*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_sae<opc, OpcodeStr, v8i32x_info, v8f64_info, 5504*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5505*9880d681SAndroid Build Coastguard Worker } 5506*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5507*9880d681SAndroid Build Coastguard Worker // we need "x"/"y" suffixes in order to distinguish between 128 and 256 5508*9880d681SAndroid Build Coastguard Worker // memory forms of these instructions in Asm Parcer. They have the same 5509*9880d681SAndroid Build Coastguard Worker // dest type - 'v4i32x_info'. We also specify the broadcast string explicitly 5510*9880d681SAndroid Build Coastguard Worker // due to the same reason. 5511*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v2f64x_info, OpNode, 5512*9880d681SAndroid Build Coastguard Worker "{1to2}", "{x}">, EVEX_V128; 5513*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f64x_info, OpNode, 5514*9880d681SAndroid Build Coastguard Worker "{1to4}", "{y}">, EVEX_V256; 5515*9880d681SAndroid Build Coastguard Worker } 5516*9880d681SAndroid Build Coastguard Worker} 5517*9880d681SAndroid Build Coastguard Worker 5518*9880d681SAndroid Build Coastguard Worker// Convert Double to Signed/Unsigned Doubleword 5519*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtpd2dq<bits<8> opc, string OpcodeStr, 5520*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5521*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 5522*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f64_info, OpNode>, 5523*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v8i32x_info, v8f64_info, 5524*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5525*9880d681SAndroid Build Coastguard Worker } 5526*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5527*9880d681SAndroid Build Coastguard Worker // we need "x"/"y" suffixes in order to distinguish between 128 and 256 5528*9880d681SAndroid Build Coastguard Worker // memory forms of these instructions in Asm Parcer. They have the same 5529*9880d681SAndroid Build Coastguard Worker // dest type - 'v4i32x_info'. We also specify the broadcast string explicitly 5530*9880d681SAndroid Build Coastguard Worker // due to the same reason. 5531*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v2f64x_info, OpNode, 5532*9880d681SAndroid Build Coastguard Worker "{1to2}", "{x}">, EVEX_V128; 5533*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f64x_info, OpNode, 5534*9880d681SAndroid Build Coastguard Worker "{1to4}", "{y}">, EVEX_V256; 5535*9880d681SAndroid Build Coastguard Worker } 5536*9880d681SAndroid Build Coastguard Worker} 5537*9880d681SAndroid Build Coastguard Worker 5538*9880d681SAndroid Build Coastguard Worker// Convert Double to Signed/Unsigned Quardword 5539*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtpd2qq<bits<8> opc, string OpcodeStr, 5540*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5541*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 5542*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f64_info, OpNode>, 5543*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v8i64_info, v8f64_info, 5544*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5545*9880d681SAndroid Build Coastguard Worker } 5546*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in { 5547*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v2f64x_info, OpNode>, 5548*9880d681SAndroid Build Coastguard Worker EVEX_V128; 5549*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f64x_info, OpNode>, 5550*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5551*9880d681SAndroid Build Coastguard Worker } 5552*9880d681SAndroid Build Coastguard Worker} 5553*9880d681SAndroid Build Coastguard Worker 5554*9880d681SAndroid Build Coastguard Worker// Convert Double to Signed/Unsigned Quardword with truncation 5555*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvttpd2qq<bits<8> opc, string OpcodeStr, 5556*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5557*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 5558*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f64_info, OpNode>, 5559*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_sae<opc, OpcodeStr, v8i64_info, v8f64_info, 5560*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5561*9880d681SAndroid Build Coastguard Worker } 5562*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in { 5563*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v2f64x_info, OpNode>, 5564*9880d681SAndroid Build Coastguard Worker EVEX_V128; 5565*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f64x_info, OpNode>, 5566*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5567*9880d681SAndroid Build Coastguard Worker } 5568*9880d681SAndroid Build Coastguard Worker} 5569*9880d681SAndroid Build Coastguard Worker 5570*9880d681SAndroid Build Coastguard Worker// Convert Signed/Unsigned Quardword to Double 5571*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtqq2pd<bits<8> opc, string OpcodeStr, 5572*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5573*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 5574*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f64_info, v8i64_info, OpNode>, 5575*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v8f64_info, v8i64_info, 5576*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5577*9880d681SAndroid Build Coastguard Worker } 5578*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in { 5579*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2f64x_info, v2i64x_info, OpNode>, 5580*9880d681SAndroid Build Coastguard Worker EVEX_V128; 5581*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f64x_info, v4i64x_info, OpNode>, 5582*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5583*9880d681SAndroid Build Coastguard Worker } 5584*9880d681SAndroid Build Coastguard Worker} 5585*9880d681SAndroid Build Coastguard Worker 5586*9880d681SAndroid Build Coastguard Worker// Convert Float to Signed/Unsigned Quardword 5587*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtps2qq<bits<8> opc, string OpcodeStr, 5588*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5589*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 5590*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f32x_info, OpNode>, 5591*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v8i64_info, v8f32x_info, 5592*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5593*9880d681SAndroid Build Coastguard Worker } 5594*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in { 5595*9880d681SAndroid Build Coastguard Worker // Explicitly specified broadcast string, since we take only 2 elements 5596*9880d681SAndroid Build Coastguard Worker // from v4f32x_info source 5597*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v4f32x_info, OpNode, 5598*9880d681SAndroid Build Coastguard Worker "{1to2}">, EVEX_V128; 5599*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f32x_info, OpNode>, 5600*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5601*9880d681SAndroid Build Coastguard Worker } 5602*9880d681SAndroid Build Coastguard Worker} 5603*9880d681SAndroid Build Coastguard Worker 5604*9880d681SAndroid Build Coastguard Worker// Convert Float to Signed/Unsigned Quardword with truncation 5605*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvttps2qq<bits<8> opc, string OpcodeStr, 5606*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5607*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 5608*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f32x_info, OpNode>, 5609*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_sae<opc, OpcodeStr, v8i64_info, v8f32x_info, 5610*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5611*9880d681SAndroid Build Coastguard Worker } 5612*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in { 5613*9880d681SAndroid Build Coastguard Worker // Explicitly specified broadcast string, since we take only 2 elements 5614*9880d681SAndroid Build Coastguard Worker // from v4f32x_info source 5615*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v4f32x_info, OpNode, 5616*9880d681SAndroid Build Coastguard Worker "{1to2}">, EVEX_V128; 5617*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f32x_info, OpNode>, 5618*9880d681SAndroid Build Coastguard Worker EVEX_V256; 5619*9880d681SAndroid Build Coastguard Worker } 5620*9880d681SAndroid Build Coastguard Worker} 5621*9880d681SAndroid Build Coastguard Worker 5622*9880d681SAndroid Build Coastguard Worker// Convert Signed/Unsigned Quardword to Float 5623*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtqq2ps<bits<8> opc, string OpcodeStr, 5624*9880d681SAndroid Build Coastguard Worker SDNode OpNode, SDNode OpNodeRnd> { 5625*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 5626*9880d681SAndroid Build Coastguard Worker defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f32x_info, v8i64_info, OpNode>, 5627*9880d681SAndroid Build Coastguard Worker avx512_vcvt_fp_rc<opc, OpcodeStr, v8f32x_info, v8i64_info, 5628*9880d681SAndroid Build Coastguard Worker OpNodeRnd>, EVEX_V512; 5629*9880d681SAndroid Build Coastguard Worker } 5630*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI, HasVLX] in { 5631*9880d681SAndroid Build Coastguard Worker // we need "x"/"y" suffixes in order to distinguish between 128 and 256 5632*9880d681SAndroid Build Coastguard Worker // memory forms of these instructions in Asm Parcer. They have the same 5633*9880d681SAndroid Build Coastguard Worker // dest type - 'v4i32x_info'. We also specify the broadcast string explicitly 5634*9880d681SAndroid Build Coastguard Worker // due to the same reason. 5635*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v2i64x_info, OpNode, 5636*9880d681SAndroid Build Coastguard Worker "{1to2}", "{x}">, EVEX_V128; 5637*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v4i64x_info, OpNode, 5638*9880d681SAndroid Build Coastguard Worker "{1to4}", "{y}">, EVEX_V256; 5639*9880d681SAndroid Build Coastguard Worker } 5640*9880d681SAndroid Build Coastguard Worker} 5641*9880d681SAndroid Build Coastguard Worker 5642*9880d681SAndroid Build Coastguard Workerdefm VCVTDQ2PD : avx512_cvtdq2pd<0xE6, "vcvtdq2pd", sint_to_fp, X86cvtdq2pd>, XS, 5643*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VH>; 5644*9880d681SAndroid Build Coastguard Worker 5645*9880d681SAndroid Build Coastguard Workerdefm VCVTDQ2PS : avx512_cvtdq2ps<0x5B, "vcvtdq2ps", sint_to_fp, 5646*9880d681SAndroid Build Coastguard Worker X86VSintToFpRnd>, 5647*9880d681SAndroid Build Coastguard Worker PS, EVEX_CD8<32, CD8VF>; 5648*9880d681SAndroid Build Coastguard Worker 5649*9880d681SAndroid Build Coastguard Workerdefm VCVTTPS2DQ : avx512_cvttps2dq<0x5B, "vcvttps2dq", fp_to_sint, 5650*9880d681SAndroid Build Coastguard Worker X86VFpToSintRnd>, 5651*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VF>; 5652*9880d681SAndroid Build Coastguard Worker 5653*9880d681SAndroid Build Coastguard Workerdefm VCVTTPD2DQ : avx512_cvttpd2dq<0xE6, "vcvttpd2dq", fp_to_sint, 5654*9880d681SAndroid Build Coastguard Worker X86VFpToSintRnd>, 5655*9880d681SAndroid Build Coastguard Worker PD, VEX_W, EVEX_CD8<64, CD8VF>; 5656*9880d681SAndroid Build Coastguard Worker 5657*9880d681SAndroid Build Coastguard Workerdefm VCVTTPS2UDQ : avx512_cvttps2dq<0x78, "vcvttps2udq", fp_to_uint, 5658*9880d681SAndroid Build Coastguard Worker X86VFpToUintRnd>, PS, 5659*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 5660*9880d681SAndroid Build Coastguard Worker 5661*9880d681SAndroid Build Coastguard Workerdefm VCVTTPD2UDQ : avx512_cvttpd2dq<0x78, "vcvttpd2udq", fp_to_uint, 5662*9880d681SAndroid Build Coastguard Worker X86VFpToUintRnd>, PS, VEX_W, 5663*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 5664*9880d681SAndroid Build Coastguard Worker 5665*9880d681SAndroid Build Coastguard Workerdefm VCVTUDQ2PD : avx512_cvtdq2pd<0x7A, "vcvtudq2pd", uint_to_fp, X86cvtudq2pd>, 5666*9880d681SAndroid Build Coastguard Worker XS, EVEX_CD8<32, CD8VH>; 5667*9880d681SAndroid Build Coastguard Worker 5668*9880d681SAndroid Build Coastguard Workerdefm VCVTUDQ2PS : avx512_cvtdq2ps<0x7A, "vcvtudq2ps", uint_to_fp, 5669*9880d681SAndroid Build Coastguard Worker X86VUintToFpRnd>, XD, 5670*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 5671*9880d681SAndroid Build Coastguard Worker 5672*9880d681SAndroid Build Coastguard Workerdefm VCVTPS2DQ : avx512_cvtps2dq<0x5B, "vcvtps2dq", X86cvtp2Int, 5673*9880d681SAndroid Build Coastguard Worker X86cvtp2IntRnd>, PD, EVEX_CD8<32, CD8VF>; 5674*9880d681SAndroid Build Coastguard Worker 5675*9880d681SAndroid Build Coastguard Workerdefm VCVTPD2DQ : avx512_cvtpd2dq<0xE6, "vcvtpd2dq", X86cvtp2Int, 5676*9880d681SAndroid Build Coastguard Worker X86cvtp2IntRnd>, XD, VEX_W, 5677*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>; 5678*9880d681SAndroid Build Coastguard Worker 5679*9880d681SAndroid Build Coastguard Workerdefm VCVTPS2UDQ : avx512_cvtps2dq<0x79, "vcvtps2udq", X86cvtp2UInt, 5680*9880d681SAndroid Build Coastguard Worker X86cvtp2UIntRnd>, 5681*9880d681SAndroid Build Coastguard Worker PS, EVEX_CD8<32, CD8VF>; 5682*9880d681SAndroid Build Coastguard Workerdefm VCVTPD2UDQ : avx512_cvtpd2dq<0x79, "vcvtpd2udq", X86cvtp2UInt, 5683*9880d681SAndroid Build Coastguard Worker X86cvtp2UIntRnd>, VEX_W, 5684*9880d681SAndroid Build Coastguard Worker PS, EVEX_CD8<64, CD8VF>; 5685*9880d681SAndroid Build Coastguard Worker 5686*9880d681SAndroid Build Coastguard Workerdefm VCVTPD2QQ : avx512_cvtpd2qq<0x7B, "vcvtpd2qq", X86cvtp2Int, 5687*9880d681SAndroid Build Coastguard Worker X86cvtp2IntRnd>, VEX_W, 5688*9880d681SAndroid Build Coastguard Worker PD, EVEX_CD8<64, CD8VF>; 5689*9880d681SAndroid Build Coastguard Worker 5690*9880d681SAndroid Build Coastguard Workerdefm VCVTPS2QQ : avx512_cvtps2qq<0x7B, "vcvtps2qq", X86cvtp2Int, 5691*9880d681SAndroid Build Coastguard Worker X86cvtp2IntRnd>, PD, EVEX_CD8<32, CD8VH>; 5692*9880d681SAndroid Build Coastguard Worker 5693*9880d681SAndroid Build Coastguard Workerdefm VCVTPD2UQQ : avx512_cvtpd2qq<0x79, "vcvtpd2uqq", X86cvtp2UInt, 5694*9880d681SAndroid Build Coastguard Worker X86cvtp2UIntRnd>, VEX_W, 5695*9880d681SAndroid Build Coastguard Worker PD, EVEX_CD8<64, CD8VF>; 5696*9880d681SAndroid Build Coastguard Worker 5697*9880d681SAndroid Build Coastguard Workerdefm VCVTPS2UQQ : avx512_cvtps2qq<0x79, "vcvtps2uqq", X86cvtp2UInt, 5698*9880d681SAndroid Build Coastguard Worker X86cvtp2UIntRnd>, PD, EVEX_CD8<32, CD8VH>; 5699*9880d681SAndroid Build Coastguard Worker 5700*9880d681SAndroid Build Coastguard Workerdefm VCVTTPD2QQ : avx512_cvttpd2qq<0x7A, "vcvttpd2qq", fp_to_sint, 5701*9880d681SAndroid Build Coastguard Worker X86VFpToSintRnd>, VEX_W, 5702*9880d681SAndroid Build Coastguard Worker PD, EVEX_CD8<64, CD8VF>; 5703*9880d681SAndroid Build Coastguard Worker 5704*9880d681SAndroid Build Coastguard Workerdefm VCVTTPS2QQ : avx512_cvttps2qq<0x7A, "vcvttps2qq", fp_to_sint, 5705*9880d681SAndroid Build Coastguard Worker X86VFpToSintRnd>, PD, EVEX_CD8<32, CD8VH>; 5706*9880d681SAndroid Build Coastguard Worker 5707*9880d681SAndroid Build Coastguard Workerdefm VCVTTPD2UQQ : avx512_cvttpd2qq<0x78, "vcvttpd2uqq", fp_to_uint, 5708*9880d681SAndroid Build Coastguard Worker X86VFpToUintRnd>, VEX_W, 5709*9880d681SAndroid Build Coastguard Worker PD, EVEX_CD8<64, CD8VF>; 5710*9880d681SAndroid Build Coastguard Worker 5711*9880d681SAndroid Build Coastguard Workerdefm VCVTTPS2UQQ : avx512_cvttps2qq<0x78, "vcvttps2uqq", fp_to_uint, 5712*9880d681SAndroid Build Coastguard Worker X86VFpToUintRnd>, PD, EVEX_CD8<32, CD8VH>; 5713*9880d681SAndroid Build Coastguard Worker 5714*9880d681SAndroid Build Coastguard Workerdefm VCVTQQ2PD : avx512_cvtqq2pd<0xE6, "vcvtqq2pd", sint_to_fp, 5715*9880d681SAndroid Build Coastguard Worker X86VSintToFpRnd>, VEX_W, XS, EVEX_CD8<64, CD8VF>; 5716*9880d681SAndroid Build Coastguard Worker 5717*9880d681SAndroid Build Coastguard Workerdefm VCVTUQQ2PD : avx512_cvtqq2pd<0x7A, "vcvtuqq2pd", uint_to_fp, 5718*9880d681SAndroid Build Coastguard Worker X86VUintToFpRnd>, VEX_W, XS, EVEX_CD8<64, CD8VF>; 5719*9880d681SAndroid Build Coastguard Worker 5720*9880d681SAndroid Build Coastguard Workerdefm VCVTQQ2PS : avx512_cvtqq2ps<0x5B, "vcvtqq2ps", sint_to_fp, 5721*9880d681SAndroid Build Coastguard Worker X86VSintToFpRnd>, VEX_W, PS, EVEX_CD8<64, CD8VF>; 5722*9880d681SAndroid Build Coastguard Worker 5723*9880d681SAndroid Build Coastguard Workerdefm VCVTUQQ2PS : avx512_cvtqq2ps<0x7A, "vcvtuqq2ps", uint_to_fp, 5724*9880d681SAndroid Build Coastguard Worker X86VUintToFpRnd>, VEX_W, XD, EVEX_CD8<64, CD8VF>; 5725*9880d681SAndroid Build Coastguard Worker 5726*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512, NoVLX] in { 5727*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i32 (fp_to_uint (v8f32 VR256X:$src1))), 5728*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v16i32 (VCVTTPS2UDQZrr 5729*9880d681SAndroid Build Coastguard Worker (v16f32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)))), sub_ymm)>; 5730*9880d681SAndroid Build Coastguard Worker 5731*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (fp_to_uint (v4f32 VR128X:$src1))), 5732*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v16i32 (VCVTTPS2UDQZrr 5733*9880d681SAndroid Build Coastguard Worker (v16f32 (SUBREG_TO_REG (i32 0), VR128X:$src1, sub_xmm)))), sub_xmm)>; 5734*9880d681SAndroid Build Coastguard Worker 5735*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (fp_to_uint (v4f64 VR256X:$src1))), 5736*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v8i32 (VCVTTPD2UDQZrr 5737*9880d681SAndroid Build Coastguard Worker (v8f64 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)))), sub_xmm)>; 5738*9880d681SAndroid Build Coastguard Worker 5739*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f32 (uint_to_fp (v8i32 VR256X:$src1))), 5740*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v16f32 (VCVTUDQ2PSZrr 5741*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR256X:$src1, sub_ymm)))), sub_ymm)>; 5742*9880d681SAndroid Build Coastguard Worker 5743*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (uint_to_fp (v4i32 VR128X:$src1))), 5744*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v16f32 (VCVTUDQ2PSZrr 5745*9880d681SAndroid Build Coastguard Worker (v16i32 (SUBREG_TO_REG (i32 0), VR128X:$src1, sub_xmm)))), sub_xmm)>; 5746*9880d681SAndroid Build Coastguard Worker 5747*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (uint_to_fp (v4i32 VR128X:$src1))), 5748*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (v8f64 (VCVTUDQ2PDZrr 5749*9880d681SAndroid Build Coastguard Worker (v8i32 (SUBREG_TO_REG (i32 0), VR128X:$src1, sub_xmm)))), sub_ymm)>; 5750*9880d681SAndroid Build Coastguard Worker} 5751*9880d681SAndroid Build Coastguard Worker 5752*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5753*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f32 (fround (loadv8f64 addr:$src))), 5754*9880d681SAndroid Build Coastguard Worker (VCVTPD2PSZrm addr:$src)>; 5755*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f64 (extloadv8f32 addr:$src)), 5756*9880d681SAndroid Build Coastguard Worker (VCVTPS2PDZrm addr:$src)>; 5757*9880d681SAndroid Build Coastguard Worker} 5758*9880d681SAndroid Build Coastguard Worker 5759*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5760*9880d681SAndroid Build Coastguard Worker// Half precision conversion instructions 5761*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5762*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtph2ps<X86VectorVTInfo _dest, X86VectorVTInfo _src, 5763*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memop, PatFrag ld_frag> { 5764*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<0x13, MRMSrcReg, _dest ,(outs _dest.RC:$dst), (ins _src.RC:$src), 5765*9880d681SAndroid Build Coastguard Worker "vcvtph2ps", "$src", "$src", 5766*9880d681SAndroid Build Coastguard Worker (X86cvtph2ps (_src.VT _src.RC:$src), 5767*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>, T8PD; 5768*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<0x13, MRMSrcMem, _dest, (outs _dest.RC:$dst), (ins x86memop:$src), 5769*9880d681SAndroid Build Coastguard Worker "vcvtph2ps", "$src", "$src", 5770*9880d681SAndroid Build Coastguard Worker (X86cvtph2ps (_src.VT (bitconvert (ld_frag addr:$src))), 5771*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>, T8PD; 5772*9880d681SAndroid Build Coastguard Worker} 5773*9880d681SAndroid Build Coastguard Worker 5774*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtph2ps_sae<X86VectorVTInfo _dest, X86VectorVTInfo _src> { 5775*9880d681SAndroid Build Coastguard Worker defm rb : AVX512_maskable<0x13, MRMSrcReg, _dest ,(outs _dest.RC:$dst), (ins _src.RC:$src), 5776*9880d681SAndroid Build Coastguard Worker "vcvtph2ps", "{sae}, $src", "$src, {sae}", 5777*9880d681SAndroid Build Coastguard Worker (X86cvtph2ps (_src.VT _src.RC:$src), 5778*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, T8PD, EVEX_B; 5779*9880d681SAndroid Build Coastguard Worker 5780*9880d681SAndroid Build Coastguard Worker} 5781*9880d681SAndroid Build Coastguard Worker 5782*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5783*9880d681SAndroid Build Coastguard Worker defm VCVTPH2PSZ : avx512_cvtph2ps<v16f32_info, v16i16x_info, f256mem, loadv4i64>, 5784*9880d681SAndroid Build Coastguard Worker avx512_cvtph2ps_sae<v16f32_info, v16i16x_info>, 5785*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_V512, EVEX_CD8<32, CD8VH>; 5786*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5787*9880d681SAndroid Build Coastguard Worker defm VCVTPH2PSZ256 : avx512_cvtph2ps<v8f32x_info, v8i16x_info, f128mem, 5788*9880d681SAndroid Build Coastguard Worker loadv2i64>,EVEX, EVEX_V256, EVEX_CD8<32, CD8VH>; 5789*9880d681SAndroid Build Coastguard Worker defm VCVTPH2PSZ128 : avx512_cvtph2ps<v4f32x_info, v8i16x_info, f64mem, 5790*9880d681SAndroid Build Coastguard Worker loadv2i64>, EVEX, EVEX_V128, EVEX_CD8<32, CD8VH>; 5791*9880d681SAndroid Build Coastguard Worker } 5792*9880d681SAndroid Build Coastguard Worker} 5793*9880d681SAndroid Build Coastguard Worker 5794*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtps2ph<X86VectorVTInfo _dest, X86VectorVTInfo _src, 5795*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memop> { 5796*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<0x1D, MRMDestReg, _dest ,(outs _dest.RC:$dst), 5797*9880d681SAndroid Build Coastguard Worker (ins _src.RC:$src1, i32u8imm:$src2), 5798*9880d681SAndroid Build Coastguard Worker "vcvtps2ph", "$src2, $src1", "$src1, $src2", 5799*9880d681SAndroid Build Coastguard Worker (X86cvtps2ph (_src.VT _src.RC:$src1), 5800*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), 5801*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT)), 5802*9880d681SAndroid Build Coastguard Worker NoItinerary, 0, X86select>, AVX512AIi8Base; 5803*9880d681SAndroid Build Coastguard Worker def mr : AVX512AIi8<0x1D, MRMDestMem, (outs), 5804*9880d681SAndroid Build Coastguard Worker (ins x86memop:$dst, _src.RC:$src1, i32u8imm:$src2), 5805*9880d681SAndroid Build Coastguard Worker "vcvtps2ph\t{$src2, $src1, $dst|$dst, $src1, $src2}", 5806*9880d681SAndroid Build Coastguard Worker [(store (_dest.VT (X86cvtps2ph (_src.VT _src.RC:$src1), 5807*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), (i32 FROUND_CURRENT) )), 5808*9880d681SAndroid Build Coastguard Worker addr:$dst)]>; 5809*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0, mayStore = 1 in 5810*9880d681SAndroid Build Coastguard Worker def mrk : AVX512AIi8<0x1D, MRMDestMem, (outs), 5811*9880d681SAndroid Build Coastguard Worker (ins x86memop:$dst, _dest.KRCWM:$mask, _src.RC:$src1, i32u8imm:$src2), 5812*9880d681SAndroid Build Coastguard Worker "vcvtps2ph\t{$src2, $src1, $dst {${mask}}|$dst {${mask}}, $src1, $src2}", 5813*9880d681SAndroid Build Coastguard Worker []>, EVEX_K; 5814*9880d681SAndroid Build Coastguard Worker} 5815*9880d681SAndroid Build Coastguard Workermulticlass avx512_cvtps2ph_sae<X86VectorVTInfo _dest, X86VectorVTInfo _src> { 5816*9880d681SAndroid Build Coastguard Worker defm rb : AVX512_maskable<0x1D, MRMDestReg, _dest ,(outs _dest.RC:$dst), 5817*9880d681SAndroid Build Coastguard Worker (ins _src.RC:$src1, i32u8imm:$src2), 5818*9880d681SAndroid Build Coastguard Worker "vcvtps2ph", "$src2, {sae}, $src1", "$src1, {sae}, $src2", 5819*9880d681SAndroid Build Coastguard Worker (X86cvtps2ph (_src.VT _src.RC:$src1), 5820*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), 5821*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC)), 5822*9880d681SAndroid Build Coastguard Worker NoItinerary, 0, X86select>, EVEX_B, AVX512AIi8Base; 5823*9880d681SAndroid Build Coastguard Worker} 5824*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 5825*9880d681SAndroid Build Coastguard Worker defm VCVTPS2PHZ : avx512_cvtps2ph<v16i16x_info, v16f32_info, f256mem>, 5826*9880d681SAndroid Build Coastguard Worker avx512_cvtps2ph_sae<v16i16x_info, v16f32_info>, 5827*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_V512, EVEX_CD8<32, CD8VH>; 5828*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5829*9880d681SAndroid Build Coastguard Worker defm VCVTPS2PHZ256 : avx512_cvtps2ph<v8i16x_info, v8f32x_info, f128mem>, 5830*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_V256, EVEX_CD8<32, CD8VH>; 5831*9880d681SAndroid Build Coastguard Worker defm VCVTPS2PHZ128 : avx512_cvtps2ph<v8i16x_info, v4f32x_info, f128mem>, 5832*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_V128, EVEX_CD8<32, CD8VH>; 5833*9880d681SAndroid Build Coastguard Worker } 5834*9880d681SAndroid Build Coastguard Worker} 5835*9880d681SAndroid Build Coastguard Worker 5836*9880d681SAndroid Build Coastguard Worker// Unordered/Ordered scalar fp compare with Sea and set EFLAGS 5837*9880d681SAndroid Build Coastguard Workermulticlass avx512_ord_cmp_sae<bits<8> opc, X86VectorVTInfo _, SDNode OpNode, 5838*9880d681SAndroid Build Coastguard Worker string OpcodeStr> { 5839*9880d681SAndroid Build Coastguard Worker def rb: AVX512<opc, MRMSrcReg, (outs), (ins _.RC:$src1, _.RC:$src2), 5840*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{{sae}, $src2, $src1|$src1, $src2, {sae}}"), 5841*9880d681SAndroid Build Coastguard Worker [(set EFLAGS, (OpNode (_.VT _.RC:$src1), _.RC:$src2, 5842*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC)))], 5843*9880d681SAndroid Build Coastguard Worker IIC_SSE_COMIS_RR>, EVEX, EVEX_B, VEX_LIG, EVEX_V128, 5844*9880d681SAndroid Build Coastguard Worker Sched<[WriteFAdd]>; 5845*9880d681SAndroid Build Coastguard Worker} 5846*9880d681SAndroid Build Coastguard Worker 5847*9880d681SAndroid Build Coastguard Workerlet Defs = [EFLAGS], Predicates = [HasAVX512] in { 5848*9880d681SAndroid Build Coastguard Worker defm VUCOMISSZ : avx512_ord_cmp_sae<0x2E, v4f32x_info, X86ucomiSae, "vucomiss">, 5849*9880d681SAndroid Build Coastguard Worker AVX512PSIi8Base, EVEX_CD8<32, CD8VT1>; 5850*9880d681SAndroid Build Coastguard Worker defm VUCOMISDZ : avx512_ord_cmp_sae<0x2E, v2f64x_info, X86ucomiSae, "vucomisd">, 5851*9880d681SAndroid Build Coastguard Worker AVX512PDIi8Base, VEX_W, EVEX_CD8<64, CD8VT1>; 5852*9880d681SAndroid Build Coastguard Worker defm VCOMISSZ : avx512_ord_cmp_sae<0x2F, v4f32x_info, X86comiSae, "vcomiss">, 5853*9880d681SAndroid Build Coastguard Worker AVX512PSIi8Base, EVEX_CD8<32, CD8VT1>; 5854*9880d681SAndroid Build Coastguard Worker defm VCOMISDZ : avx512_ord_cmp_sae<0x2F, v2f64x_info, X86comiSae, "vcomisd">, 5855*9880d681SAndroid Build Coastguard Worker AVX512PDIi8Base, VEX_W, EVEX_CD8<64, CD8VT1>; 5856*9880d681SAndroid Build Coastguard Worker} 5857*9880d681SAndroid Build Coastguard Worker 5858*9880d681SAndroid Build Coastguard Workerlet Defs = [EFLAGS], Predicates = [HasAVX512] in { 5859*9880d681SAndroid Build Coastguard Worker defm VUCOMISSZ : sse12_ord_cmp<0x2E, FR32X, X86cmp, f32, f32mem, loadf32, 5860*9880d681SAndroid Build Coastguard Worker "ucomiss">, PS, EVEX, VEX_LIG, 5861*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 5862*9880d681SAndroid Build Coastguard Worker defm VUCOMISDZ : sse12_ord_cmp<0x2E, FR64X, X86cmp, f64, f64mem, loadf64, 5863*9880d681SAndroid Build Coastguard Worker "ucomisd">, PD, EVEX, 5864*9880d681SAndroid Build Coastguard Worker VEX_LIG, VEX_W, EVEX_CD8<64, CD8VT1>; 5865*9880d681SAndroid Build Coastguard Worker let Pattern = []<dag> in { 5866*9880d681SAndroid Build Coastguard Worker defm VCOMISSZ : sse12_ord_cmp<0x2F, FR32X, undef, f32, f32mem, loadf32, 5867*9880d681SAndroid Build Coastguard Worker "comiss">, PS, EVEX, VEX_LIG, 5868*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 5869*9880d681SAndroid Build Coastguard Worker defm VCOMISDZ : sse12_ord_cmp<0x2F, FR64X, undef, f64, f64mem, loadf64, 5870*9880d681SAndroid Build Coastguard Worker "comisd">, PD, EVEX, 5871*9880d681SAndroid Build Coastguard Worker VEX_LIG, VEX_W, EVEX_CD8<64, CD8VT1>; 5872*9880d681SAndroid Build Coastguard Worker } 5873*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 5874*9880d681SAndroid Build Coastguard Worker defm Int_VUCOMISSZ : sse12_ord_cmp<0x2E, VR128X, X86ucomi, v4f32, f128mem, 5875*9880d681SAndroid Build Coastguard Worker load, "ucomiss">, PS, EVEX, VEX_LIG, 5876*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 5877*9880d681SAndroid Build Coastguard Worker defm Int_VUCOMISDZ : sse12_ord_cmp<0x2E, VR128X, X86ucomi, v2f64, f128mem, 5878*9880d681SAndroid Build Coastguard Worker load, "ucomisd">, PD, EVEX, 5879*9880d681SAndroid Build Coastguard Worker VEX_LIG, VEX_W, EVEX_CD8<64, CD8VT1>; 5880*9880d681SAndroid Build Coastguard Worker 5881*9880d681SAndroid Build Coastguard Worker defm Int_VCOMISSZ : sse12_ord_cmp<0x2F, VR128X, X86comi, v4f32, f128mem, 5882*9880d681SAndroid Build Coastguard Worker load, "comiss">, PS, EVEX, VEX_LIG, 5883*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 5884*9880d681SAndroid Build Coastguard Worker defm Int_VCOMISDZ : sse12_ord_cmp<0x2F, VR128X, X86comi, v2f64, f128mem, 5885*9880d681SAndroid Build Coastguard Worker load, "comisd">, PD, EVEX, 5886*9880d681SAndroid Build Coastguard Worker VEX_LIG, VEX_W, EVEX_CD8<64, CD8VT1>; 5887*9880d681SAndroid Build Coastguard Worker } 5888*9880d681SAndroid Build Coastguard Worker} 5889*9880d681SAndroid Build Coastguard Worker 5890*9880d681SAndroid Build Coastguard Worker/// avx512_fp14_s rcp14ss, rcp14sd, rsqrt14ss, rsqrt14sd 5891*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp14_s<bits<8> opc, string OpcodeStr, SDNode OpNode, 5892*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 5893*9880d681SAndroid Build Coastguard Worker let AddedComplexity = 20 , Predicates = [HasAVX512] in { 5894*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 5895*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 5896*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 5897*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2))>, EVEX_4V; 5898*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 5899*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 5900*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 5901*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 5902*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector (_.ScalarLdFrag addr:$src2))))>, EVEX_4V; 5903*9880d681SAndroid Build Coastguard Worker} 5904*9880d681SAndroid Build Coastguard Worker} 5905*9880d681SAndroid Build Coastguard Worker 5906*9880d681SAndroid Build Coastguard Workerdefm VRCP14SS : avx512_fp14_s<0x4D, "vrcp14ss", X86frcp14s, f32x_info>, 5907*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>, T8PD; 5908*9880d681SAndroid Build Coastguard Workerdefm VRCP14SD : avx512_fp14_s<0x4D, "vrcp14sd", X86frcp14s, f64x_info>, 5909*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_CD8<64, CD8VT1>, T8PD; 5910*9880d681SAndroid Build Coastguard Workerdefm VRSQRT14SS : avx512_fp14_s<0x4F, "vrsqrt14ss", X86frsqrt14s, f32x_info>, 5911*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>, T8PD; 5912*9880d681SAndroid Build Coastguard Workerdefm VRSQRT14SD : avx512_fp14_s<0x4F, "vrsqrt14sd", X86frsqrt14s, f64x_info>, 5913*9880d681SAndroid Build Coastguard Worker VEX_W, EVEX_CD8<64, CD8VT1>, T8PD; 5914*9880d681SAndroid Build Coastguard Worker 5915*9880d681SAndroid Build Coastguard Worker/// avx512_fp14_p rcp14ps, rcp14pd, rsqrt14ps, rsqrt14pd 5916*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp14_p<bits<8> opc, string OpcodeStr, SDNode OpNode, 5917*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 5918*9880d681SAndroid Build Coastguard Worker defm r: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 5919*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src), OpcodeStr, "$src", "$src", 5920*9880d681SAndroid Build Coastguard Worker (_.FloatVT (OpNode _.RC:$src))>, EVEX, T8PD; 5921*9880d681SAndroid Build Coastguard Worker defm m: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 5922*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src), OpcodeStr, "$src", "$src", 5923*9880d681SAndroid Build Coastguard Worker (OpNode (_.FloatVT 5924*9880d681SAndroid Build Coastguard Worker (bitconvert (_.LdFrag addr:$src))))>, EVEX, T8PD; 5925*9880d681SAndroid Build Coastguard Worker defm mb: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 5926*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src), OpcodeStr, 5927*9880d681SAndroid Build Coastguard Worker "${src}"##_.BroadcastStr, "${src}"##_.BroadcastStr, 5928*9880d681SAndroid Build Coastguard Worker (OpNode (_.FloatVT 5929*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src))))>, 5930*9880d681SAndroid Build Coastguard Worker EVEX, T8PD, EVEX_B; 5931*9880d681SAndroid Build Coastguard Worker} 5932*9880d681SAndroid Build Coastguard Worker 5933*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp14_p_vl_all<bits<8> opc, string OpcodeStr, SDNode OpNode> { 5934*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_fp14_p<opc, !strconcat(OpcodeStr, "ps"), OpNode, v16f32_info>, 5935*9880d681SAndroid Build Coastguard Worker EVEX_V512, EVEX_CD8<32, CD8VF>; 5936*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_fp14_p<opc, !strconcat(OpcodeStr, "pd"), OpNode, v8f64_info>, 5937*9880d681SAndroid Build Coastguard Worker EVEX_V512, VEX_W, EVEX_CD8<64, CD8VF>; 5938*9880d681SAndroid Build Coastguard Worker 5939*9880d681SAndroid Build Coastguard Worker // Define only if AVX512VL feature is present. 5940*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 5941*9880d681SAndroid Build Coastguard Worker defm PSZ128 : avx512_fp14_p<opc, !strconcat(OpcodeStr, "ps"), 5942*9880d681SAndroid Build Coastguard Worker OpNode, v4f32x_info>, 5943*9880d681SAndroid Build Coastguard Worker EVEX_V128, EVEX_CD8<32, CD8VF>; 5944*9880d681SAndroid Build Coastguard Worker defm PSZ256 : avx512_fp14_p<opc, !strconcat(OpcodeStr, "ps"), 5945*9880d681SAndroid Build Coastguard Worker OpNode, v8f32x_info>, 5946*9880d681SAndroid Build Coastguard Worker EVEX_V256, EVEX_CD8<32, CD8VF>; 5947*9880d681SAndroid Build Coastguard Worker defm PDZ128 : avx512_fp14_p<opc, !strconcat(OpcodeStr, "pd"), 5948*9880d681SAndroid Build Coastguard Worker OpNode, v2f64x_info>, 5949*9880d681SAndroid Build Coastguard Worker EVEX_V128, VEX_W, EVEX_CD8<64, CD8VF>; 5950*9880d681SAndroid Build Coastguard Worker defm PDZ256 : avx512_fp14_p<opc, !strconcat(OpcodeStr, "pd"), 5951*9880d681SAndroid Build Coastguard Worker OpNode, v4f64x_info>, 5952*9880d681SAndroid Build Coastguard Worker EVEX_V256, VEX_W, EVEX_CD8<64, CD8VF>; 5953*9880d681SAndroid Build Coastguard Worker } 5954*9880d681SAndroid Build Coastguard Worker} 5955*9880d681SAndroid Build Coastguard Worker 5956*9880d681SAndroid Build Coastguard Workerdefm VRSQRT14 : avx512_fp14_p_vl_all<0x4E, "vrsqrt14", X86frsqrt>; 5957*9880d681SAndroid Build Coastguard Workerdefm VRCP14 : avx512_fp14_p_vl_all<0x4C, "vrcp14", X86frcp>; 5958*9880d681SAndroid Build Coastguard Worker 5959*9880d681SAndroid Build Coastguard Worker/// avx512_fp28_s rcp28ss, rcp28sd, rsqrt28ss, rsqrt28sd 5960*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp28_s<bits<8> opc, string OpcodeStr,X86VectorVTInfo _, 5961*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 5962*9880d681SAndroid Build Coastguard Worker 5963*9880d681SAndroid Build Coastguard Worker defm r : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 5964*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 5965*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 5966*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 5967*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 5968*9880d681SAndroid Build Coastguard Worker 5969*9880d681SAndroid Build Coastguard Worker defm rb : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 5970*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 5971*9880d681SAndroid Build Coastguard Worker "{sae}, $src2, $src1", "$src1, $src2, {sae}", 5972*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2), 5973*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 5974*9880d681SAndroid Build Coastguard Worker 5975*9880d681SAndroid Build Coastguard Worker defm m : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 5976*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 5977*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 5978*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 5979*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector (_.ScalarLdFrag addr:$src2))), 5980*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 5981*9880d681SAndroid Build Coastguard Worker} 5982*9880d681SAndroid Build Coastguard Worker 5983*9880d681SAndroid Build Coastguard Workermulticlass avx512_eri_s<bits<8> opc, string OpcodeStr, SDNode OpNode> { 5984*9880d681SAndroid Build Coastguard Worker defm SS : avx512_fp28_s<opc, OpcodeStr#"ss", f32x_info, OpNode>, 5985*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VT1>; 5986*9880d681SAndroid Build Coastguard Worker defm SD : avx512_fp28_s<opc, OpcodeStr#"sd", f64x_info, OpNode>, 5987*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VT1>, VEX_W; 5988*9880d681SAndroid Build Coastguard Worker} 5989*9880d681SAndroid Build Coastguard Worker 5990*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasERI] in { 5991*9880d681SAndroid Build Coastguard Worker defm VRCP28 : avx512_eri_s<0xCB, "vrcp28", X86rcp28s>, T8PD, EVEX_4V; 5992*9880d681SAndroid Build Coastguard Worker defm VRSQRT28 : avx512_eri_s<0xCD, "vrsqrt28", X86rsqrt28s>, T8PD, EVEX_4V; 5993*9880d681SAndroid Build Coastguard Worker} 5994*9880d681SAndroid Build Coastguard Worker 5995*9880d681SAndroid Build Coastguard Workerdefm VGETEXP : avx512_eri_s<0x43, "vgetexp", X86fgetexpRnds>, T8PD, EVEX_4V; 5996*9880d681SAndroid Build Coastguard Worker/// avx512_fp28_p rcp28ps, rcp28pd, rsqrt28ps, rsqrt28pd 5997*9880d681SAndroid Build Coastguard Worker 5998*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp28_p<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 5999*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 6000*9880d681SAndroid Build Coastguard Worker 6001*9880d681SAndroid Build Coastguard Worker defm r : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 6002*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src), OpcodeStr, "$src", "$src", 6003*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src), (i32 FROUND_CURRENT))>; 6004*9880d681SAndroid Build Coastguard Worker 6005*9880d681SAndroid Build Coastguard Worker defm m : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 6006*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src), OpcodeStr, "$src", "$src", 6007*9880d681SAndroid Build Coastguard Worker (OpNode (_.FloatVT 6008*9880d681SAndroid Build Coastguard Worker (bitconvert (_.LdFrag addr:$src))), 6009*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 6010*9880d681SAndroid Build Coastguard Worker 6011*9880d681SAndroid Build Coastguard Worker defm mb : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 6012*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src), OpcodeStr, 6013*9880d681SAndroid Build Coastguard Worker "${src}"##_.BroadcastStr, "${src}"##_.BroadcastStr, 6014*9880d681SAndroid Build Coastguard Worker (OpNode (_.FloatVT 6015*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src))), 6016*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>, EVEX_B; 6017*9880d681SAndroid Build Coastguard Worker} 6018*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp28_p_round<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 6019*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 6020*9880d681SAndroid Build Coastguard Worker defm rb : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 6021*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src), OpcodeStr, 6022*9880d681SAndroid Build Coastguard Worker "{sae}, $src", "$src, {sae}", 6023*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src), (i32 FROUND_NO_EXC))>, EVEX_B; 6024*9880d681SAndroid Build Coastguard Worker} 6025*9880d681SAndroid Build Coastguard Worker 6026*9880d681SAndroid Build Coastguard Workermulticlass avx512_eri<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6027*9880d681SAndroid Build Coastguard Worker defm PS : avx512_fp28_p<opc, OpcodeStr#"ps", v16f32_info, OpNode>, 6028*9880d681SAndroid Build Coastguard Worker avx512_fp28_p_round<opc, OpcodeStr#"ps", v16f32_info, OpNode>, 6029*9880d681SAndroid Build Coastguard Worker T8PD, EVEX_V512, EVEX_CD8<32, CD8VF>; 6030*9880d681SAndroid Build Coastguard Worker defm PD : avx512_fp28_p<opc, OpcodeStr#"pd", v8f64_info, OpNode>, 6031*9880d681SAndroid Build Coastguard Worker avx512_fp28_p_round<opc, OpcodeStr#"pd", v8f64_info, OpNode>, 6032*9880d681SAndroid Build Coastguard Worker T8PD, EVEX_V512, VEX_W, EVEX_CD8<64, CD8VF>; 6033*9880d681SAndroid Build Coastguard Worker} 6034*9880d681SAndroid Build Coastguard Worker 6035*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_unaryop_packed<bits<8> opc, string OpcodeStr, 6036*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 6037*9880d681SAndroid Build Coastguard Worker // Define only if AVX512VL feature is present. 6038*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 6039*9880d681SAndroid Build Coastguard Worker defm PSZ128 : avx512_fp28_p<opc, OpcodeStr#"ps", v4f32x_info, OpNode>, 6040*9880d681SAndroid Build Coastguard Worker EVEX_V128, T8PD, EVEX_CD8<32, CD8VF>; 6041*9880d681SAndroid Build Coastguard Worker defm PSZ256 : avx512_fp28_p<opc, OpcodeStr#"ps", v8f32x_info, OpNode>, 6042*9880d681SAndroid Build Coastguard Worker EVEX_V256, T8PD, EVEX_CD8<32, CD8VF>; 6043*9880d681SAndroid Build Coastguard Worker defm PDZ128 : avx512_fp28_p<opc, OpcodeStr#"pd", v2f64x_info, OpNode>, 6044*9880d681SAndroid Build Coastguard Worker EVEX_V128, VEX_W, T8PD, EVEX_CD8<64, CD8VF>; 6045*9880d681SAndroid Build Coastguard Worker defm PDZ256 : avx512_fp28_p<opc, OpcodeStr#"pd", v4f64x_info, OpNode>, 6046*9880d681SAndroid Build Coastguard Worker EVEX_V256, VEX_W, T8PD, EVEX_CD8<64, CD8VF>; 6047*9880d681SAndroid Build Coastguard Worker } 6048*9880d681SAndroid Build Coastguard Worker} 6049*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasERI] in { 6050*9880d681SAndroid Build Coastguard Worker 6051*9880d681SAndroid Build Coastguard Worker defm VRSQRT28 : avx512_eri<0xCC, "vrsqrt28", X86rsqrt28>, EVEX; 6052*9880d681SAndroid Build Coastguard Worker defm VRCP28 : avx512_eri<0xCA, "vrcp28", X86rcp28>, EVEX; 6053*9880d681SAndroid Build Coastguard Worker defm VEXP2 : avx512_eri<0xC8, "vexp2", X86exp2>, EVEX; 6054*9880d681SAndroid Build Coastguard Worker} 6055*9880d681SAndroid Build Coastguard Workerdefm VGETEXP : avx512_eri<0x42, "vgetexp", X86fgetexpRnd>, 6056*9880d681SAndroid Build Coastguard Worker avx512_fp_unaryop_packed<0x42, "vgetexp", X86fgetexpRnd> , EVEX; 6057*9880d681SAndroid Build Coastguard Worker 6058*9880d681SAndroid Build Coastguard Workermulticlass avx512_sqrt_packed_round<bits<8> opc, string OpcodeStr, 6059*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd, X86VectorVTInfo _>{ 6060*9880d681SAndroid Build Coastguard Worker defm rb: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 6061*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src, AVX512RC:$rc), OpcodeStr, "$rc, $src", "$src, $rc", 6062*9880d681SAndroid Build Coastguard Worker (_.VT (OpNodeRnd _.RC:$src, (i32 imm:$rc)))>, 6063*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_B, EVEX_RC; 6064*9880d681SAndroid Build Coastguard Worker} 6065*9880d681SAndroid Build Coastguard Worker 6066*9880d681SAndroid Build Coastguard Workermulticlass avx512_sqrt_packed<bits<8> opc, string OpcodeStr, 6067*9880d681SAndroid Build Coastguard Worker SDNode OpNode, X86VectorVTInfo _>{ 6068*9880d681SAndroid Build Coastguard Worker defm r: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 6069*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src), OpcodeStr, "$src", "$src", 6070*9880d681SAndroid Build Coastguard Worker (_.FloatVT (OpNode _.RC:$src))>, EVEX; 6071*9880d681SAndroid Build Coastguard Worker defm m: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 6072*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src), OpcodeStr, "$src", "$src", 6073*9880d681SAndroid Build Coastguard Worker (OpNode (_.FloatVT 6074*9880d681SAndroid Build Coastguard Worker (bitconvert (_.LdFrag addr:$src))))>, EVEX; 6075*9880d681SAndroid Build Coastguard Worker 6076*9880d681SAndroid Build Coastguard Worker defm mb: AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 6077*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src), OpcodeStr, 6078*9880d681SAndroid Build Coastguard Worker "${src}"##_.BroadcastStr, "${src}"##_.BroadcastStr, 6079*9880d681SAndroid Build Coastguard Worker (OpNode (_.FloatVT 6080*9880d681SAndroid Build Coastguard Worker (X86VBroadcast (_.ScalarLdFrag addr:$src))))>, 6081*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_B; 6082*9880d681SAndroid Build Coastguard Worker} 6083*9880d681SAndroid Build Coastguard Worker 6084*9880d681SAndroid Build Coastguard Workermulticlass avx512_sqrt_packed_all<bits<8> opc, string OpcodeStr, 6085*9880d681SAndroid Build Coastguard Worker SDNode OpNode> { 6086*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_sqrt_packed<opc, !strconcat(OpcodeStr, "ps"), OpNode, 6087*9880d681SAndroid Build Coastguard Worker v16f32_info>, 6088*9880d681SAndroid Build Coastguard Worker EVEX_V512, PS, EVEX_CD8<32, CD8VF>; 6089*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_sqrt_packed<opc, !strconcat(OpcodeStr, "pd"), OpNode, 6090*9880d681SAndroid Build Coastguard Worker v8f64_info>, 6091*9880d681SAndroid Build Coastguard Worker EVEX_V512, VEX_W, PD, EVEX_CD8<64, CD8VF>; 6092*9880d681SAndroid Build Coastguard Worker // Define only if AVX512VL feature is present. 6093*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 6094*9880d681SAndroid Build Coastguard Worker defm PSZ128 : avx512_sqrt_packed<opc, !strconcat(OpcodeStr, "ps"), 6095*9880d681SAndroid Build Coastguard Worker OpNode, v4f32x_info>, 6096*9880d681SAndroid Build Coastguard Worker EVEX_V128, PS, EVEX_CD8<32, CD8VF>; 6097*9880d681SAndroid Build Coastguard Worker defm PSZ256 : avx512_sqrt_packed<opc, !strconcat(OpcodeStr, "ps"), 6098*9880d681SAndroid Build Coastguard Worker OpNode, v8f32x_info>, 6099*9880d681SAndroid Build Coastguard Worker EVEX_V256, PS, EVEX_CD8<32, CD8VF>; 6100*9880d681SAndroid Build Coastguard Worker defm PDZ128 : avx512_sqrt_packed<opc, !strconcat(OpcodeStr, "pd"), 6101*9880d681SAndroid Build Coastguard Worker OpNode, v2f64x_info>, 6102*9880d681SAndroid Build Coastguard Worker EVEX_V128, VEX_W, PD, EVEX_CD8<64, CD8VF>; 6103*9880d681SAndroid Build Coastguard Worker defm PDZ256 : avx512_sqrt_packed<opc, !strconcat(OpcodeStr, "pd"), 6104*9880d681SAndroid Build Coastguard Worker OpNode, v4f64x_info>, 6105*9880d681SAndroid Build Coastguard Worker EVEX_V256, VEX_W, PD, EVEX_CD8<64, CD8VF>; 6106*9880d681SAndroid Build Coastguard Worker } 6107*9880d681SAndroid Build Coastguard Worker} 6108*9880d681SAndroid Build Coastguard Worker 6109*9880d681SAndroid Build Coastguard Workermulticlass avx512_sqrt_packed_all_round<bits<8> opc, string OpcodeStr, 6110*9880d681SAndroid Build Coastguard Worker SDNode OpNodeRnd> { 6111*9880d681SAndroid Build Coastguard Worker defm PSZ : avx512_sqrt_packed_round<opc, !strconcat(OpcodeStr, "ps"), OpNodeRnd, 6112*9880d681SAndroid Build Coastguard Worker v16f32_info>, EVEX_V512, PS, EVEX_CD8<32, CD8VF>; 6113*9880d681SAndroid Build Coastguard Worker defm PDZ : avx512_sqrt_packed_round<opc, !strconcat(OpcodeStr, "pd"), OpNodeRnd, 6114*9880d681SAndroid Build Coastguard Worker v8f64_info>, EVEX_V512, VEX_W, PD, EVEX_CD8<64, CD8VF>; 6115*9880d681SAndroid Build Coastguard Worker} 6116*9880d681SAndroid Build Coastguard Worker 6117*9880d681SAndroid Build Coastguard Workermulticlass avx512_sqrt_scalar<bits<8> opc, string OpcodeStr,X86VectorVTInfo _, 6118*9880d681SAndroid Build Coastguard Worker string SUFF, SDNode OpNode, SDNode OpNodeRnd> { 6119*9880d681SAndroid Build Coastguard Worker 6120*9880d681SAndroid Build Coastguard Worker defm r_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 6121*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2), OpcodeStr, 6122*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 6123*9880d681SAndroid Build Coastguard Worker (OpNodeRnd (_.VT _.RC:$src1), 6124*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 6125*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 6126*9880d681SAndroid Build Coastguard Worker defm m_Int : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 6127*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, 6128*9880d681SAndroid Build Coastguard Worker "$src2, $src1", "$src1, $src2", 6129*9880d681SAndroid Build Coastguard Worker (OpNodeRnd (_.VT _.RC:$src1), 6130*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector 6131*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2))), 6132*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 6133*9880d681SAndroid Build Coastguard Worker 6134*9880d681SAndroid Build Coastguard Worker defm rb_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 6135*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, AVX512RC:$rc), OpcodeStr, 6136*9880d681SAndroid Build Coastguard Worker "$rc, $src2, $src1", "$src1, $src2, $rc", 6137*9880d681SAndroid Build Coastguard Worker (OpNodeRnd (_.VT _.RC:$src1), 6138*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 6139*9880d681SAndroid Build Coastguard Worker (i32 imm:$rc))>, 6140*9880d681SAndroid Build Coastguard Worker EVEX_B, EVEX_RC; 6141*9880d681SAndroid Build Coastguard Worker 6142*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1, hasSideEffects = 0 in { 6143*9880d681SAndroid Build Coastguard Worker def r : I<opc, MRMSrcReg, (outs _.FRC:$dst), 6144*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.FRC:$src2), 6145*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>; 6146*9880d681SAndroid Build Coastguard Worker 6147*9880d681SAndroid Build Coastguard Worker let mayLoad = 1 in 6148*9880d681SAndroid Build Coastguard Worker def m : I<opc, MRMSrcMem, (outs _.FRC:$dst), 6149*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.ScalarMemOp:$src2), 6150*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>; 6151*9880d681SAndroid Build Coastguard Worker } 6152*9880d681SAndroid Build Coastguard Worker 6153*9880d681SAndroid Build Coastguard Worker def : Pat<(_.EltVT (OpNode _.FRC:$src)), 6154*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SUFF#Zr) 6155*9880d681SAndroid Build Coastguard Worker (_.EltVT (IMPLICIT_DEF)), _.FRC:$src)>; 6156*9880d681SAndroid Build Coastguard Worker 6157*9880d681SAndroid Build Coastguard Worker def : Pat<(_.EltVT (OpNode (load addr:$src))), 6158*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SUFF#Zm) 6159*9880d681SAndroid Build Coastguard Worker (_.EltVT (IMPLICIT_DEF)), addr:$src)>, Requires<[HasAVX512, OptForSize]>; 6160*9880d681SAndroid Build Coastguard Worker} 6161*9880d681SAndroid Build Coastguard Worker 6162*9880d681SAndroid Build Coastguard Workermulticlass avx512_sqrt_scalar_all<bits<8> opc, string OpcodeStr> { 6163*9880d681SAndroid Build Coastguard Worker defm SSZ : avx512_sqrt_scalar<opc, OpcodeStr#"ss", f32x_info, "SS", fsqrt, 6164*9880d681SAndroid Build Coastguard Worker X86fsqrtRnds>, EVEX_CD8<32, CD8VT1>, EVEX_4V, XS; 6165*9880d681SAndroid Build Coastguard Worker defm SDZ : avx512_sqrt_scalar<opc, OpcodeStr#"sd", f64x_info, "SD", fsqrt, 6166*9880d681SAndroid Build Coastguard Worker X86fsqrtRnds>, EVEX_CD8<64, CD8VT1>, EVEX_4V, XD, VEX_W; 6167*9880d681SAndroid Build Coastguard Worker} 6168*9880d681SAndroid Build Coastguard Worker 6169*9880d681SAndroid Build Coastguard Workerdefm VSQRT : avx512_sqrt_packed_all<0x51, "vsqrt", fsqrt>, 6170*9880d681SAndroid Build Coastguard Worker avx512_sqrt_packed_all_round<0x51, "vsqrt", X86fsqrtRnd>; 6171*9880d681SAndroid Build Coastguard Worker 6172*9880d681SAndroid Build Coastguard Workerdefm VSQRT : avx512_sqrt_scalar_all<0x51, "vsqrt">, VEX_LIG; 6173*9880d681SAndroid Build Coastguard Worker 6174*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 6175*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (X86frsqrt FR32X:$src)), 6176*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VRSQRT14SSrr (v4f32 (IMPLICIT_DEF)), (COPY_TO_REGCLASS FR32X:$src, VR128X)), VR128X)>; 6177*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (X86frsqrt (load addr:$src))), 6178*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VRSQRT14SSrm (v4f32 (IMPLICIT_DEF)), addr:$src), VR128X)>, 6179*9880d681SAndroid Build Coastguard Worker Requires<[OptForSize]>; 6180*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (X86frcp FR32X:$src)), 6181*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VRCP14SSrr (v4f32 (IMPLICIT_DEF)), (COPY_TO_REGCLASS FR32X:$src, VR128X)), VR128X )>; 6182*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (X86frcp (load addr:$src))), 6183*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VRCP14SSrm (v4f32 (IMPLICIT_DEF)), addr:$src), VR128X)>, 6184*9880d681SAndroid Build Coastguard Worker Requires<[OptForSize]>; 6185*9880d681SAndroid Build Coastguard Worker} 6186*9880d681SAndroid Build Coastguard Worker 6187*9880d681SAndroid Build Coastguard Workermulticlass 6188*9880d681SAndroid Build Coastguard Workeravx512_rndscale_scalar<bits<8> opc, string OpcodeStr, X86VectorVTInfo _> { 6189*9880d681SAndroid Build Coastguard Worker 6190*9880d681SAndroid Build Coastguard Worker let ExeDomain = _.ExeDomain in { 6191*9880d681SAndroid Build Coastguard Worker defm r : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 6192*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, i32u8imm:$src3), OpcodeStr, 6193*9880d681SAndroid Build Coastguard Worker "$src3, $src2, $src1", "$src1, $src2, $src3", 6194*9880d681SAndroid Build Coastguard Worker (_.VT (X86RndScales (_.VT _.RC:$src1), (_.VT _.RC:$src2), 6195*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), (i32 FROUND_CURRENT)))>; 6196*9880d681SAndroid Build Coastguard Worker 6197*9880d681SAndroid Build Coastguard Worker defm rb : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 6198*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, i32u8imm:$src3), OpcodeStr, 6199*9880d681SAndroid Build Coastguard Worker "$src3, {sae}, $src2, $src1", "$src1, $src2, {sae}, $src3", 6200*9880d681SAndroid Build Coastguard Worker (_.VT (X86RndScales (_.VT _.RC:$src1), (_.VT _.RC:$src2), 6201*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), (i32 FROUND_NO_EXC)))>, EVEX_B; 6202*9880d681SAndroid Build Coastguard Worker 6203*9880d681SAndroid Build Coastguard Worker defm m : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 6204*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, i32u8imm:$src3), 6205*9880d681SAndroid Build Coastguard Worker OpcodeStr, 6206*9880d681SAndroid Build Coastguard Worker "$src3, $src2, $src1", "$src1, $src2, $src3", 6207*9880d681SAndroid Build Coastguard Worker (_.VT (X86RndScales (_.VT _.RC:$src1), 6208*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector (_.ScalarLdFrag addr:$src2))), 6209*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), (i32 FROUND_CURRENT)))>; 6210*9880d681SAndroid Build Coastguard Worker } 6211*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 6212*9880d681SAndroid Build Coastguard Worker def : Pat<(ffloor _.FRC:$src), (COPY_TO_REGCLASS 6213*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##r) (_.VT (IMPLICIT_DEF)), 6214*9880d681SAndroid Build Coastguard Worker (_.VT (COPY_TO_REGCLASS _.FRC:$src, _.RC)), (i32 0x1))), _.FRC)>; 6215*9880d681SAndroid Build Coastguard Worker def : Pat<(fceil _.FRC:$src), (COPY_TO_REGCLASS 6216*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##r) (_.VT (IMPLICIT_DEF)), 6217*9880d681SAndroid Build Coastguard Worker (_.VT (COPY_TO_REGCLASS _.FRC:$src, _.RC)), (i32 0x2))), _.FRC)>; 6218*9880d681SAndroid Build Coastguard Worker def : Pat<(ftrunc _.FRC:$src), (COPY_TO_REGCLASS 6219*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##r) (_.VT (IMPLICIT_DEF)), 6220*9880d681SAndroid Build Coastguard Worker (_.VT (COPY_TO_REGCLASS _.FRC:$src, _.RC)), (i32 0x3))), _.FRC)>; 6221*9880d681SAndroid Build Coastguard Worker def : Pat<(frint _.FRC:$src), (COPY_TO_REGCLASS 6222*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##r) (_.VT (IMPLICIT_DEF)), 6223*9880d681SAndroid Build Coastguard Worker (_.VT (COPY_TO_REGCLASS _.FRC:$src, _.RC)), (i32 0x4))), _.FRC)>; 6224*9880d681SAndroid Build Coastguard Worker def : Pat<(fnearbyint _.FRC:$src), (COPY_TO_REGCLASS 6225*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##r) (_.VT (IMPLICIT_DEF)), 6226*9880d681SAndroid Build Coastguard Worker (_.VT (COPY_TO_REGCLASS _.FRC:$src, _.RC)), (i32 0xc))), _.FRC)>; 6227*9880d681SAndroid Build Coastguard Worker 6228*9880d681SAndroid Build Coastguard Worker def : Pat<(ffloor (_.ScalarLdFrag addr:$src)), (COPY_TO_REGCLASS 6229*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##m) (_.VT (IMPLICIT_DEF)), 6230*9880d681SAndroid Build Coastguard Worker addr:$src, (i32 0x1))), _.FRC)>; 6231*9880d681SAndroid Build Coastguard Worker def : Pat<(fceil (_.ScalarLdFrag addr:$src)), (COPY_TO_REGCLASS 6232*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##m) (_.VT (IMPLICIT_DEF)), 6233*9880d681SAndroid Build Coastguard Worker addr:$src, (i32 0x2))), _.FRC)>; 6234*9880d681SAndroid Build Coastguard Worker def : Pat<(ftrunc (_.ScalarLdFrag addr:$src)), (COPY_TO_REGCLASS 6235*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##m) (_.VT (IMPLICIT_DEF)), 6236*9880d681SAndroid Build Coastguard Worker addr:$src, (i32 0x3))), _.FRC)>; 6237*9880d681SAndroid Build Coastguard Worker def : Pat<(frint (_.ScalarLdFrag addr:$src)), (COPY_TO_REGCLASS 6238*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##m) (_.VT (IMPLICIT_DEF)), 6239*9880d681SAndroid Build Coastguard Worker addr:$src, (i32 0x4))), _.FRC)>; 6240*9880d681SAndroid Build Coastguard Worker def : Pat<(fnearbyint (_.ScalarLdFrag addr:$src)), (COPY_TO_REGCLASS 6241*9880d681SAndroid Build Coastguard Worker (_.VT (!cast<Instruction>(NAME##m) (_.VT (IMPLICIT_DEF)), 6242*9880d681SAndroid Build Coastguard Worker addr:$src, (i32 0xc))), _.FRC)>; 6243*9880d681SAndroid Build Coastguard Worker } 6244*9880d681SAndroid Build Coastguard Worker} 6245*9880d681SAndroid Build Coastguard Worker 6246*9880d681SAndroid Build Coastguard Workerdefm VRNDSCALESS : avx512_rndscale_scalar<0x0A, "vrndscaless", f32x_info>, 6247*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<32, CD8VT1>; 6248*9880d681SAndroid Build Coastguard Worker 6249*9880d681SAndroid Build Coastguard Workerdefm VRNDSCALESD : avx512_rndscale_scalar<0x0B, "vrndscalesd", f64x_info>, VEX_W, 6250*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<64, CD8VT1>; 6251*9880d681SAndroid Build Coastguard Worker 6252*9880d681SAndroid Build Coastguard Worker//------------------------------------------------- 6253*9880d681SAndroid Build Coastguard Worker// Integer truncate and extend operations 6254*9880d681SAndroid Build Coastguard Worker//------------------------------------------------- 6255*9880d681SAndroid Build Coastguard Worker 6256*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_common<bits<8> opc, string OpcodeStr, SDNode OpNode, 6257*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo SrcInfo, X86VectorVTInfo DestInfo, 6258*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memop> { 6259*9880d681SAndroid Build Coastguard Worker 6260*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMDestReg, DestInfo, (outs DestInfo.RC:$dst), 6261*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.RC:$src1), OpcodeStr ,"$src1", "$src1", 6262*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src1)))>, 6263*9880d681SAndroid Build Coastguard Worker EVEX, T8XS; 6264*9880d681SAndroid Build Coastguard Worker 6265*9880d681SAndroid Build Coastguard Worker // for intrinsic patter match 6266*9880d681SAndroid Build Coastguard Worker def : Pat<(DestInfo.VT (X86select DestInfo.KRCWM:$mask, 6267*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src1))), 6268*9880d681SAndroid Build Coastguard Worker undef)), 6269*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##rrkz) DestInfo.KRCWM:$mask , 6270*9880d681SAndroid Build Coastguard Worker SrcInfo.RC:$src1)>; 6271*9880d681SAndroid Build Coastguard Worker 6272*9880d681SAndroid Build Coastguard Worker def : Pat<(DestInfo.VT (X86select DestInfo.KRCWM:$mask, 6273*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src1))), 6274*9880d681SAndroid Build Coastguard Worker DestInfo.ImmAllZerosV)), 6275*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##rrkz) DestInfo.KRCWM:$mask , 6276*9880d681SAndroid Build Coastguard Worker SrcInfo.RC:$src1)>; 6277*9880d681SAndroid Build Coastguard Worker 6278*9880d681SAndroid Build Coastguard Worker def : Pat<(DestInfo.VT (X86select DestInfo.KRCWM:$mask, 6279*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src1))), 6280*9880d681SAndroid Build Coastguard Worker DestInfo.RC:$src0)), 6281*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##rrk) DestInfo.RC:$src0, 6282*9880d681SAndroid Build Coastguard Worker DestInfo.KRCWM:$mask , 6283*9880d681SAndroid Build Coastguard Worker SrcInfo.RC:$src1)>; 6284*9880d681SAndroid Build Coastguard Worker 6285*9880d681SAndroid Build Coastguard Worker let mayStore = 1, mayLoad = 1, hasSideEffects = 0 in { 6286*9880d681SAndroid Build Coastguard Worker def mr : AVX512XS8I<opc, MRMDestMem, (outs), 6287*9880d681SAndroid Build Coastguard Worker (ins x86memop:$dst, SrcInfo.RC:$src), 6288*9880d681SAndroid Build Coastguard Worker OpcodeStr # "\t{$src, $dst|$dst, $src}", 6289*9880d681SAndroid Build Coastguard Worker []>, EVEX; 6290*9880d681SAndroid Build Coastguard Worker 6291*9880d681SAndroid Build Coastguard Worker def mrk : AVX512XS8I<opc, MRMDestMem, (outs), 6292*9880d681SAndroid Build Coastguard Worker (ins x86memop:$dst, SrcInfo.KRCWM:$mask, SrcInfo.RC:$src), 6293*9880d681SAndroid Build Coastguard Worker OpcodeStr # "\t{$src, $dst {${mask}}|$dst {${mask}}, $src}", 6294*9880d681SAndroid Build Coastguard Worker []>, EVEX, EVEX_K; 6295*9880d681SAndroid Build Coastguard Worker }//mayStore = 1, mayLoad = 1, hasSideEffects = 0 6296*9880d681SAndroid Build Coastguard Worker} 6297*9880d681SAndroid Build Coastguard Worker 6298*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_mr_lowering<X86VectorVTInfo SrcInfo, 6299*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfo, 6300*9880d681SAndroid Build Coastguard Worker PatFrag truncFrag, PatFrag mtruncFrag > { 6301*9880d681SAndroid Build Coastguard Worker 6302*9880d681SAndroid Build Coastguard Worker def : Pat<(truncFrag (SrcInfo.VT SrcInfo.RC:$src), addr:$dst), 6303*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##mr) 6304*9880d681SAndroid Build Coastguard Worker addr:$dst, SrcInfo.RC:$src)>; 6305*9880d681SAndroid Build Coastguard Worker 6306*9880d681SAndroid Build Coastguard Worker def : Pat<(mtruncFrag addr:$dst, SrcInfo.KRCWM:$mask, 6307*9880d681SAndroid Build Coastguard Worker (SrcInfo.VT SrcInfo.RC:$src)), 6308*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##mrk) 6309*9880d681SAndroid Build Coastguard Worker addr:$dst, SrcInfo.KRCWM:$mask, SrcInfo.RC:$src)>; 6310*9880d681SAndroid Build Coastguard Worker} 6311*9880d681SAndroid Build Coastguard Worker 6312*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_mr_lowering<X86VectorVTInfo SrcInfo, 6313*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfo, string sat > { 6314*9880d681SAndroid Build Coastguard Worker 6315*9880d681SAndroid Build Coastguard Worker def: Pat<(!cast<Intrinsic>("int_x86_avx512_mask_pmov"#sat#"_"#SrcInfo.Suffix# 6316*9880d681SAndroid Build Coastguard Worker DestInfo.Suffix#"_mem_"#SrcInfo.Size) 6317*9880d681SAndroid Build Coastguard Worker addr:$ptr, (SrcInfo.VT SrcInfo.RC:$src), SrcInfo.MRC:$mask), 6318*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##mrk) addr:$ptr, 6319*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS SrcInfo.MRC:$mask, SrcInfo.KRCWM), 6320*9880d681SAndroid Build Coastguard Worker (SrcInfo.VT SrcInfo.RC:$src))>; 6321*9880d681SAndroid Build Coastguard Worker 6322*9880d681SAndroid Build Coastguard Worker def: Pat<(!cast<Intrinsic>("int_x86_avx512_mask_pmov"#sat#"_"#SrcInfo.Suffix# 6323*9880d681SAndroid Build Coastguard Worker DestInfo.Suffix#"_mem_"#SrcInfo.Size) 6324*9880d681SAndroid Build Coastguard Worker addr:$ptr, (SrcInfo.VT SrcInfo.RC:$src), -1), 6325*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#SrcInfo.ZSuffix##mr) addr:$ptr, 6326*9880d681SAndroid Build Coastguard Worker (SrcInfo.VT SrcInfo.RC:$src))>; 6327*9880d681SAndroid Build Coastguard Worker} 6328*9880d681SAndroid Build Coastguard Worker 6329*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc<bits<8> opc, string OpcodeStr, SDNode OpNode, 6330*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTSrcInfo, X86VectorVTInfo DestInfoZ128, 6331*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfoZ256, X86VectorVTInfo DestInfoZ, 6332*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memopZ128, X86MemOperand x86memopZ256, 6333*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memopZ, PatFrag truncFrag, PatFrag mtruncFrag, 6334*9880d681SAndroid Build Coastguard Worker Predicate prd = HasAVX512>{ 6335*9880d681SAndroid Build Coastguard Worker 6336*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, prd] in { 6337*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_trunc_common<opc, OpcodeStr, OpNode, VTSrcInfo.info128, 6338*9880d681SAndroid Build Coastguard Worker DestInfoZ128, x86memopZ128>, 6339*9880d681SAndroid Build Coastguard Worker avx512_trunc_mr_lowering<VTSrcInfo.info128, DestInfoZ128, 6340*9880d681SAndroid Build Coastguard Worker truncFrag, mtruncFrag>, EVEX_V128; 6341*9880d681SAndroid Build Coastguard Worker 6342*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_trunc_common<opc, OpcodeStr, OpNode, VTSrcInfo.info256, 6343*9880d681SAndroid Build Coastguard Worker DestInfoZ256, x86memopZ256>, 6344*9880d681SAndroid Build Coastguard Worker avx512_trunc_mr_lowering<VTSrcInfo.info256, DestInfoZ256, 6345*9880d681SAndroid Build Coastguard Worker truncFrag, mtruncFrag>, EVEX_V256; 6346*9880d681SAndroid Build Coastguard Worker } 6347*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 6348*9880d681SAndroid Build Coastguard Worker defm Z: avx512_trunc_common<opc, OpcodeStr, OpNode, VTSrcInfo.info512, 6349*9880d681SAndroid Build Coastguard Worker DestInfoZ, x86memopZ>, 6350*9880d681SAndroid Build Coastguard Worker avx512_trunc_mr_lowering<VTSrcInfo.info512, DestInfoZ, 6351*9880d681SAndroid Build Coastguard Worker truncFrag, mtruncFrag>, EVEX_V512; 6352*9880d681SAndroid Build Coastguard Worker} 6353*9880d681SAndroid Build Coastguard Worker 6354*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat<bits<8> opc, string OpcodeStr, SDNode OpNode, 6355*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTSrcInfo, X86VectorVTInfo DestInfoZ128, 6356*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfoZ256, X86VectorVTInfo DestInfoZ, 6357*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memopZ128, X86MemOperand x86memopZ256, 6358*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memopZ, string sat, Predicate prd = HasAVX512>{ 6359*9880d681SAndroid Build Coastguard Worker 6360*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, prd] in { 6361*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_trunc_common<opc, OpcodeStr, OpNode, VTSrcInfo.info128, 6362*9880d681SAndroid Build Coastguard Worker DestInfoZ128, x86memopZ128>, 6363*9880d681SAndroid Build Coastguard Worker avx512_trunc_sat_mr_lowering<VTSrcInfo.info128, DestInfoZ128, 6364*9880d681SAndroid Build Coastguard Worker sat>, EVEX_V128; 6365*9880d681SAndroid Build Coastguard Worker 6366*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_trunc_common<opc, OpcodeStr, OpNode, VTSrcInfo.info256, 6367*9880d681SAndroid Build Coastguard Worker DestInfoZ256, x86memopZ256>, 6368*9880d681SAndroid Build Coastguard Worker avx512_trunc_sat_mr_lowering<VTSrcInfo.info256, DestInfoZ256, 6369*9880d681SAndroid Build Coastguard Worker sat>, EVEX_V256; 6370*9880d681SAndroid Build Coastguard Worker } 6371*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 6372*9880d681SAndroid Build Coastguard Worker defm Z: avx512_trunc_common<opc, OpcodeStr, OpNode, VTSrcInfo.info512, 6373*9880d681SAndroid Build Coastguard Worker DestInfoZ, x86memopZ>, 6374*9880d681SAndroid Build Coastguard Worker avx512_trunc_sat_mr_lowering<VTSrcInfo.info512, DestInfoZ, 6375*9880d681SAndroid Build Coastguard Worker sat>, EVEX_V512; 6376*9880d681SAndroid Build Coastguard Worker} 6377*9880d681SAndroid Build Coastguard Worker 6378*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_qb<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6379*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc<opc, OpcodeStr, OpNode, avx512vl_i64_info, 6380*9880d681SAndroid Build Coastguard Worker v16i8x_info, v16i8x_info, v16i8x_info, i16mem, i32mem, i64mem, 6381*9880d681SAndroid Build Coastguard Worker truncstorevi8, masked_truncstorevi8>, EVEX_CD8<8, CD8VO>; 6382*9880d681SAndroid Build Coastguard Worker} 6383*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_qb<bits<8> opc, string sat, SDNode OpNode> { 6384*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc_sat<opc, "vpmov"##sat##"qb", OpNode, avx512vl_i64_info, 6385*9880d681SAndroid Build Coastguard Worker v16i8x_info, v16i8x_info, v16i8x_info, i16mem, i32mem, i64mem, 6386*9880d681SAndroid Build Coastguard Worker sat>, EVEX_CD8<8, CD8VO>; 6387*9880d681SAndroid Build Coastguard Worker} 6388*9880d681SAndroid Build Coastguard Worker 6389*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_qw<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6390*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc<opc, OpcodeStr, OpNode, avx512vl_i64_info, 6391*9880d681SAndroid Build Coastguard Worker v8i16x_info, v8i16x_info, v8i16x_info, i32mem, i64mem, i128mem, 6392*9880d681SAndroid Build Coastguard Worker truncstorevi16, masked_truncstorevi16>, EVEX_CD8<16, CD8VQ>; 6393*9880d681SAndroid Build Coastguard Worker} 6394*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_qw<bits<8> opc, string sat, SDNode OpNode> { 6395*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc_sat<opc, "vpmov"##sat##"qw", OpNode, avx512vl_i64_info, 6396*9880d681SAndroid Build Coastguard Worker v8i16x_info, v8i16x_info, v8i16x_info, i32mem, i64mem, i128mem, 6397*9880d681SAndroid Build Coastguard Worker sat>, EVEX_CD8<16, CD8VQ>; 6398*9880d681SAndroid Build Coastguard Worker} 6399*9880d681SAndroid Build Coastguard Worker 6400*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_qd<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6401*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc<opc, OpcodeStr, OpNode, avx512vl_i64_info, 6402*9880d681SAndroid Build Coastguard Worker v4i32x_info, v4i32x_info, v8i32x_info, i64mem, i128mem, i256mem, 6403*9880d681SAndroid Build Coastguard Worker truncstorevi32, masked_truncstorevi32>, EVEX_CD8<32, CD8VH>; 6404*9880d681SAndroid Build Coastguard Worker} 6405*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_qd<bits<8> opc, string sat, SDNode OpNode> { 6406*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc_sat<opc, "vpmov"##sat##"qd", OpNode, avx512vl_i64_info, 6407*9880d681SAndroid Build Coastguard Worker v4i32x_info, v4i32x_info, v8i32x_info, i64mem, i128mem, i256mem, 6408*9880d681SAndroid Build Coastguard Worker sat>, EVEX_CD8<32, CD8VH>; 6409*9880d681SAndroid Build Coastguard Worker} 6410*9880d681SAndroid Build Coastguard Worker 6411*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_db<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6412*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc<opc, OpcodeStr, OpNode, avx512vl_i32_info, 6413*9880d681SAndroid Build Coastguard Worker v16i8x_info, v16i8x_info, v16i8x_info, i32mem, i64mem, i128mem, 6414*9880d681SAndroid Build Coastguard Worker truncstorevi8, masked_truncstorevi8>, EVEX_CD8<8, CD8VQ>; 6415*9880d681SAndroid Build Coastguard Worker} 6416*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_db<bits<8> opc, string sat, SDNode OpNode> { 6417*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc_sat<opc, "vpmov"##sat##"db", OpNode, avx512vl_i32_info, 6418*9880d681SAndroid Build Coastguard Worker v16i8x_info, v16i8x_info, v16i8x_info, i32mem, i64mem, i128mem, 6419*9880d681SAndroid Build Coastguard Worker sat>, EVEX_CD8<8, CD8VQ>; 6420*9880d681SAndroid Build Coastguard Worker} 6421*9880d681SAndroid Build Coastguard Worker 6422*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_dw<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6423*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc<opc, OpcodeStr, OpNode, avx512vl_i32_info, 6424*9880d681SAndroid Build Coastguard Worker v8i16x_info, v8i16x_info, v16i16x_info, i64mem, i128mem, i256mem, 6425*9880d681SAndroid Build Coastguard Worker truncstorevi16, masked_truncstorevi16>, EVEX_CD8<16, CD8VH>; 6426*9880d681SAndroid Build Coastguard Worker} 6427*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_dw<bits<8> opc, string sat, SDNode OpNode> { 6428*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc_sat<opc, "vpmov"##sat##"dw", OpNode, avx512vl_i32_info, 6429*9880d681SAndroid Build Coastguard Worker v8i16x_info, v8i16x_info, v16i16x_info, i64mem, i128mem, i256mem, 6430*9880d681SAndroid Build Coastguard Worker sat>, EVEX_CD8<16, CD8VH>; 6431*9880d681SAndroid Build Coastguard Worker} 6432*9880d681SAndroid Build Coastguard Worker 6433*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_wb<bits<8> opc, string OpcodeStr, SDNode OpNode> { 6434*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc<opc, OpcodeStr, OpNode, avx512vl_i16_info, 6435*9880d681SAndroid Build Coastguard Worker v16i8x_info, v16i8x_info, v32i8x_info, i64mem, i128mem, i256mem, 6436*9880d681SAndroid Build Coastguard Worker truncstorevi8, masked_truncstorevi8,HasBWI>, EVEX_CD8<16, CD8VH>; 6437*9880d681SAndroid Build Coastguard Worker} 6438*9880d681SAndroid Build Coastguard Workermulticlass avx512_trunc_sat_wb<bits<8> opc, string sat, SDNode OpNode> { 6439*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_trunc_sat<opc, "vpmov"##sat##"wb", OpNode, avx512vl_i16_info, 6440*9880d681SAndroid Build Coastguard Worker v16i8x_info, v16i8x_info, v32i8x_info, i64mem, i128mem, i256mem, 6441*9880d681SAndroid Build Coastguard Worker sat, HasBWI>, EVEX_CD8<16, CD8VH>; 6442*9880d681SAndroid Build Coastguard Worker} 6443*9880d681SAndroid Build Coastguard Worker 6444*9880d681SAndroid Build Coastguard Workerdefm VPMOVQB : avx512_trunc_qb<0x32, "vpmovqb", X86vtrunc>; 6445*9880d681SAndroid Build Coastguard Workerdefm VPMOVSQB : avx512_trunc_sat_qb<0x22, "s", X86vtruncs>; 6446*9880d681SAndroid Build Coastguard Workerdefm VPMOVUSQB : avx512_trunc_sat_qb<0x12, "us", X86vtruncus>; 6447*9880d681SAndroid Build Coastguard Worker 6448*9880d681SAndroid Build Coastguard Workerdefm VPMOVQW : avx512_trunc_qw<0x34, "vpmovqw", X86vtrunc>; 6449*9880d681SAndroid Build Coastguard Workerdefm VPMOVSQW : avx512_trunc_sat_qw<0x24, "s", X86vtruncs>; 6450*9880d681SAndroid Build Coastguard Workerdefm VPMOVUSQW : avx512_trunc_sat_qw<0x14, "us", X86vtruncus>; 6451*9880d681SAndroid Build Coastguard Worker 6452*9880d681SAndroid Build Coastguard Workerdefm VPMOVQD : avx512_trunc_qd<0x35, "vpmovqd", X86vtrunc>; 6453*9880d681SAndroid Build Coastguard Workerdefm VPMOVSQD : avx512_trunc_sat_qd<0x25, "s", X86vtruncs>; 6454*9880d681SAndroid Build Coastguard Workerdefm VPMOVUSQD : avx512_trunc_sat_qd<0x15, "us", X86vtruncus>; 6455*9880d681SAndroid Build Coastguard Worker 6456*9880d681SAndroid Build Coastguard Workerdefm VPMOVDB : avx512_trunc_db<0x31, "vpmovdb", X86vtrunc>; 6457*9880d681SAndroid Build Coastguard Workerdefm VPMOVSDB : avx512_trunc_sat_db<0x21, "s", X86vtruncs>; 6458*9880d681SAndroid Build Coastguard Workerdefm VPMOVUSDB : avx512_trunc_sat_db<0x11, "us", X86vtruncus>; 6459*9880d681SAndroid Build Coastguard Worker 6460*9880d681SAndroid Build Coastguard Workerdefm VPMOVDW : avx512_trunc_dw<0x33, "vpmovdw", X86vtrunc>; 6461*9880d681SAndroid Build Coastguard Workerdefm VPMOVSDW : avx512_trunc_sat_dw<0x23, "s", X86vtruncs>; 6462*9880d681SAndroid Build Coastguard Workerdefm VPMOVUSDW : avx512_trunc_sat_dw<0x13, "us", X86vtruncus>; 6463*9880d681SAndroid Build Coastguard Worker 6464*9880d681SAndroid Build Coastguard Workerdefm VPMOVWB : avx512_trunc_wb<0x30, "vpmovwb", X86vtrunc>; 6465*9880d681SAndroid Build Coastguard Workerdefm VPMOVSWB : avx512_trunc_sat_wb<0x20, "s", X86vtruncs>; 6466*9880d681SAndroid Build Coastguard Workerdefm VPMOVUSWB : avx512_trunc_sat_wb<0x10, "us", X86vtruncus>; 6467*9880d681SAndroid Build Coastguard Worker 6468*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512, NoVLX] in { 6469*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i16 (X86vtrunc (v8i32 VR256X:$src))), 6470*9880d681SAndroid Build Coastguard Worker (v8i16 (EXTRACT_SUBREG 6471*9880d681SAndroid Build Coastguard Worker (v16i16 (VPMOVDWZrr (v16i32 (SUBREG_TO_REG (i32 0), 6472*9880d681SAndroid Build Coastguard Worker VR256X:$src, sub_ymm)))), sub_xmm))>; 6473*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i32 (X86vtrunc (v4i64 VR256X:$src))), 6474*9880d681SAndroid Build Coastguard Worker (v4i32 (EXTRACT_SUBREG 6475*9880d681SAndroid Build Coastguard Worker (v8i32 (VPMOVQDZrr (v8i64 (SUBREG_TO_REG (i32 0), 6476*9880d681SAndroid Build Coastguard Worker VR256X:$src, sub_ymm)))), sub_xmm))>; 6477*9880d681SAndroid Build Coastguard Worker} 6478*9880d681SAndroid Build Coastguard Worker 6479*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI, NoVLX] in { 6480*9880d681SAndroid Build Coastguard Workerdef: Pat<(v16i8 (X86vtrunc (v16i16 VR256X:$src))), 6481*9880d681SAndroid Build Coastguard Worker (v16i8 (EXTRACT_SUBREG (VPMOVWBZrr (v32i16 (SUBREG_TO_REG (i32 0), 6482*9880d681SAndroid Build Coastguard Worker VR256X:$src, sub_ymm))), sub_xmm))>; 6483*9880d681SAndroid Build Coastguard Worker} 6484*9880d681SAndroid Build Coastguard Worker 6485*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_common<bits<8> opc, string OpcodeStr, 6486*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfo, X86VectorVTInfo SrcInfo, 6487*9880d681SAndroid Build Coastguard Worker X86MemOperand x86memop, PatFrag LdFrag, SDPatternOperator OpNode>{ 6488*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, DestInfo, (outs DestInfo.RC:$dst), 6489*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.RC:$src), OpcodeStr ,"$src", "$src", 6490*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src)))>, 6491*9880d681SAndroid Build Coastguard Worker EVEX; 6492*9880d681SAndroid Build Coastguard Worker 6493*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, DestInfo, (outs DestInfo.RC:$dst), 6494*9880d681SAndroid Build Coastguard Worker (ins x86memop:$src), OpcodeStr ,"$src", "$src", 6495*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (LdFrag addr:$src))>, 6496*9880d681SAndroid Build Coastguard Worker EVEX; 6497*9880d681SAndroid Build Coastguard Worker} 6498*9880d681SAndroid Build Coastguard Worker 6499*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_BW<bits<8> opc, string OpcodeStr, 6500*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, 6501*9880d681SAndroid Build Coastguard Worker string ExtTy,PatFrag LdFrag = !cast<PatFrag>(ExtTy#"extloadvi8")> { 6502*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasBWI] in { 6503*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_extend_common<opc, OpcodeStr, v8i16x_info, 6504*9880d681SAndroid Build Coastguard Worker v16i8x_info, i64mem, LdFrag, OpNode>, 6505*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VH>, T8PD, EVEX_V128; 6506*9880d681SAndroid Build Coastguard Worker 6507*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_extend_common<opc, OpcodeStr, v16i16x_info, 6508*9880d681SAndroid Build Coastguard Worker v16i8x_info, i128mem, LdFrag, OpNode>, 6509*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VH>, T8PD, EVEX_V256; 6510*9880d681SAndroid Build Coastguard Worker } 6511*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 6512*9880d681SAndroid Build Coastguard Worker defm Z : avx512_extend_common<opc, OpcodeStr, v32i16_info, 6513*9880d681SAndroid Build Coastguard Worker v32i8x_info, i256mem, LdFrag, OpNode>, 6514*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VH>, T8PD, EVEX_V512; 6515*9880d681SAndroid Build Coastguard Worker } 6516*9880d681SAndroid Build Coastguard Worker} 6517*9880d681SAndroid Build Coastguard Worker 6518*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_BD<bits<8> opc, string OpcodeStr, 6519*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, 6520*9880d681SAndroid Build Coastguard Worker string ExtTy,PatFrag LdFrag = !cast<PatFrag>(ExtTy#"extloadvi8")> { 6521*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 6522*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_extend_common<opc, OpcodeStr, v4i32x_info, 6523*9880d681SAndroid Build Coastguard Worker v16i8x_info, i32mem, LdFrag, OpNode>, 6524*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VQ>, T8PD, EVEX_V128; 6525*9880d681SAndroid Build Coastguard Worker 6526*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_extend_common<opc, OpcodeStr, v8i32x_info, 6527*9880d681SAndroid Build Coastguard Worker v16i8x_info, i64mem, LdFrag, OpNode>, 6528*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VQ>, T8PD, EVEX_V256; 6529*9880d681SAndroid Build Coastguard Worker } 6530*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 6531*9880d681SAndroid Build Coastguard Worker defm Z : avx512_extend_common<opc, OpcodeStr, v16i32_info, 6532*9880d681SAndroid Build Coastguard Worker v16i8x_info, i128mem, LdFrag, OpNode>, 6533*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VQ>, T8PD, EVEX_V512; 6534*9880d681SAndroid Build Coastguard Worker } 6535*9880d681SAndroid Build Coastguard Worker} 6536*9880d681SAndroid Build Coastguard Worker 6537*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_BQ<bits<8> opc, string OpcodeStr, 6538*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, 6539*9880d681SAndroid Build Coastguard Worker string ExtTy,PatFrag LdFrag = !cast<PatFrag>(ExtTy#"extloadvi8")> { 6540*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 6541*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_extend_common<opc, OpcodeStr, v2i64x_info, 6542*9880d681SAndroid Build Coastguard Worker v16i8x_info, i16mem, LdFrag, OpNode>, 6543*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VO>, T8PD, EVEX_V128; 6544*9880d681SAndroid Build Coastguard Worker 6545*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_extend_common<opc, OpcodeStr, v4i64x_info, 6546*9880d681SAndroid Build Coastguard Worker v16i8x_info, i32mem, LdFrag, OpNode>, 6547*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VO>, T8PD, EVEX_V256; 6548*9880d681SAndroid Build Coastguard Worker } 6549*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 6550*9880d681SAndroid Build Coastguard Worker defm Z : avx512_extend_common<opc, OpcodeStr, v8i64_info, 6551*9880d681SAndroid Build Coastguard Worker v16i8x_info, i64mem, LdFrag, OpNode>, 6552*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VO>, T8PD, EVEX_V512; 6553*9880d681SAndroid Build Coastguard Worker } 6554*9880d681SAndroid Build Coastguard Worker} 6555*9880d681SAndroid Build Coastguard Worker 6556*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_WD<bits<8> opc, string OpcodeStr, 6557*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, 6558*9880d681SAndroid Build Coastguard Worker string ExtTy,PatFrag LdFrag = !cast<PatFrag>(ExtTy#"extloadvi16")> { 6559*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 6560*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_extend_common<opc, OpcodeStr, v4i32x_info, 6561*9880d681SAndroid Build Coastguard Worker v8i16x_info, i64mem, LdFrag, OpNode>, 6562*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VH>, T8PD, EVEX_V128; 6563*9880d681SAndroid Build Coastguard Worker 6564*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_extend_common<opc, OpcodeStr, v8i32x_info, 6565*9880d681SAndroid Build Coastguard Worker v8i16x_info, i128mem, LdFrag, OpNode>, 6566*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VH>, T8PD, EVEX_V256; 6567*9880d681SAndroid Build Coastguard Worker } 6568*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 6569*9880d681SAndroid Build Coastguard Worker defm Z : avx512_extend_common<opc, OpcodeStr, v16i32_info, 6570*9880d681SAndroid Build Coastguard Worker v16i16x_info, i256mem, LdFrag, OpNode>, 6571*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VH>, T8PD, EVEX_V512; 6572*9880d681SAndroid Build Coastguard Worker } 6573*9880d681SAndroid Build Coastguard Worker} 6574*9880d681SAndroid Build Coastguard Worker 6575*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_WQ<bits<8> opc, string OpcodeStr, 6576*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, 6577*9880d681SAndroid Build Coastguard Worker string ExtTy,PatFrag LdFrag = !cast<PatFrag>(ExtTy#"extloadvi16")> { 6578*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 6579*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_extend_common<opc, OpcodeStr, v2i64x_info, 6580*9880d681SAndroid Build Coastguard Worker v8i16x_info, i32mem, LdFrag, OpNode>, 6581*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VQ>, T8PD, EVEX_V128; 6582*9880d681SAndroid Build Coastguard Worker 6583*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_extend_common<opc, OpcodeStr, v4i64x_info, 6584*9880d681SAndroid Build Coastguard Worker v8i16x_info, i64mem, LdFrag, OpNode>, 6585*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VQ>, T8PD, EVEX_V256; 6586*9880d681SAndroid Build Coastguard Worker } 6587*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 6588*9880d681SAndroid Build Coastguard Worker defm Z : avx512_extend_common<opc, OpcodeStr, v8i64_info, 6589*9880d681SAndroid Build Coastguard Worker v8i16x_info, i128mem, LdFrag, OpNode>, 6590*9880d681SAndroid Build Coastguard Worker EVEX_CD8<16, CD8VQ>, T8PD, EVEX_V512; 6591*9880d681SAndroid Build Coastguard Worker } 6592*9880d681SAndroid Build Coastguard Worker} 6593*9880d681SAndroid Build Coastguard Worker 6594*9880d681SAndroid Build Coastguard Workermulticlass avx512_extend_DQ<bits<8> opc, string OpcodeStr, 6595*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode, 6596*9880d681SAndroid Build Coastguard Worker string ExtTy,PatFrag LdFrag = !cast<PatFrag>(ExtTy#"extloadvi32")> { 6597*9880d681SAndroid Build Coastguard Worker 6598*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX, HasAVX512] in { 6599*9880d681SAndroid Build Coastguard Worker defm Z128: avx512_extend_common<opc, OpcodeStr, v2i64x_info, 6600*9880d681SAndroid Build Coastguard Worker v4i32x_info, i64mem, LdFrag, OpNode>, 6601*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VH>, T8PD, EVEX_V128; 6602*9880d681SAndroid Build Coastguard Worker 6603*9880d681SAndroid Build Coastguard Worker defm Z256: avx512_extend_common<opc, OpcodeStr, v4i64x_info, 6604*9880d681SAndroid Build Coastguard Worker v4i32x_info, i128mem, LdFrag, OpNode>, 6605*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VH>, T8PD, EVEX_V256; 6606*9880d681SAndroid Build Coastguard Worker } 6607*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 6608*9880d681SAndroid Build Coastguard Worker defm Z : avx512_extend_common<opc, OpcodeStr, v8i64_info, 6609*9880d681SAndroid Build Coastguard Worker v8i32x_info, i256mem, LdFrag, OpNode>, 6610*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VH>, T8PD, EVEX_V512; 6611*9880d681SAndroid Build Coastguard Worker } 6612*9880d681SAndroid Build Coastguard Worker} 6613*9880d681SAndroid Build Coastguard Worker 6614*9880d681SAndroid Build Coastguard Workerdefm VPMOVZXBW : avx512_extend_BW<0x30, "vpmovzxbw", X86vzext, "z">; 6615*9880d681SAndroid Build Coastguard Workerdefm VPMOVZXBD : avx512_extend_BD<0x31, "vpmovzxbd", X86vzext, "z">; 6616*9880d681SAndroid Build Coastguard Workerdefm VPMOVZXBQ : avx512_extend_BQ<0x32, "vpmovzxbq", X86vzext, "z">; 6617*9880d681SAndroid Build Coastguard Workerdefm VPMOVZXWD : avx512_extend_WD<0x33, "vpmovzxwd", X86vzext, "z">; 6618*9880d681SAndroid Build Coastguard Workerdefm VPMOVZXWQ : avx512_extend_WQ<0x34, "vpmovzxwq", X86vzext, "z">; 6619*9880d681SAndroid Build Coastguard Workerdefm VPMOVZXDQ : avx512_extend_DQ<0x35, "vpmovzxdq", X86vzext, "z">; 6620*9880d681SAndroid Build Coastguard Worker 6621*9880d681SAndroid Build Coastguard Workerdefm VPMOVSXBW: avx512_extend_BW<0x20, "vpmovsxbw", X86vsext, "s">; 6622*9880d681SAndroid Build Coastguard Workerdefm VPMOVSXBD: avx512_extend_BD<0x21, "vpmovsxbd", X86vsext, "s">; 6623*9880d681SAndroid Build Coastguard Workerdefm VPMOVSXBQ: avx512_extend_BQ<0x22, "vpmovsxbq", X86vsext, "s">; 6624*9880d681SAndroid Build Coastguard Workerdefm VPMOVSXWD: avx512_extend_WD<0x23, "vpmovsxwd", X86vsext, "s">; 6625*9880d681SAndroid Build Coastguard Workerdefm VPMOVSXWQ: avx512_extend_WQ<0x24, "vpmovsxwq", X86vsext, "s">; 6626*9880d681SAndroid Build Coastguard Workerdefm VPMOVSXDQ: avx512_extend_DQ<0x25, "vpmovsxdq", X86vsext, "s">; 6627*9880d681SAndroid Build Coastguard Worker 6628*9880d681SAndroid Build Coastguard Worker// EXTLOAD patterns, implemented using vpmovz 6629*9880d681SAndroid Build Coastguard Workermulticlass avx512_ext_lowering<string InstrStr, X86VectorVTInfo To, 6630*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo From, PatFrag LdFrag> { 6631*9880d681SAndroid Build Coastguard Worker def : Pat<(To.VT (LdFrag addr:$src)), 6632*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("VPMOVZX"#InstrStr#"rm") addr:$src)>; 6633*9880d681SAndroid Build Coastguard Worker def : Pat<(To.VT (vselect To.KRCWM:$mask, (LdFrag addr:$src), To.RC:$src0)), 6634*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("VPMOVZX"#InstrStr#"rmk") To.RC:$src0, 6635*9880d681SAndroid Build Coastguard Worker To.KRC:$mask, addr:$src)>; 6636*9880d681SAndroid Build Coastguard Worker def : Pat<(To.VT (vselect To.KRCWM:$mask, (LdFrag addr:$src), 6637*9880d681SAndroid Build Coastguard Worker To.ImmAllZerosV)), 6638*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("VPMOVZX"#InstrStr#"rmkz") To.KRC:$mask, 6639*9880d681SAndroid Build Coastguard Worker addr:$src)>; 6640*9880d681SAndroid Build Coastguard Worker} 6641*9880d681SAndroid Build Coastguard Worker 6642*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX, HasBWI] in { 6643*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BWZ128", v8i16x_info, v16i8x_info, extloadvi8>; 6644*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BWZ256", v16i16x_info, v16i8x_info, extloadvi8>; 6645*9880d681SAndroid Build Coastguard Worker} 6646*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasBWI] in { 6647*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BWZ", v32i16_info, v32i8x_info, extloadvi8>; 6648*9880d681SAndroid Build Coastguard Worker} 6649*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX, HasAVX512] in { 6650*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BDZ128", v4i32x_info, v16i8x_info, extloadvi8>; 6651*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BDZ256", v8i32x_info, v16i8x_info, extloadvi8>; 6652*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BQZ128", v2i64x_info, v16i8x_info, extloadvi8>; 6653*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BQZ256", v4i64x_info, v16i8x_info, extloadvi8>; 6654*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"WDZ128", v4i32x_info, v8i16x_info, extloadvi16>; 6655*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"WDZ256", v8i32x_info, v8i16x_info, extloadvi16>; 6656*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"WQZ128", v2i64x_info, v8i16x_info, extloadvi16>; 6657*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"WQZ256", v4i64x_info, v8i16x_info, extloadvi16>; 6658*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"DQZ128", v2i64x_info, v4i32x_info, extloadvi32>; 6659*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"DQZ256", v4i64x_info, v4i32x_info, extloadvi32>; 6660*9880d681SAndroid Build Coastguard Worker} 6661*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 6662*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BDZ", v16i32_info, v16i8x_info, extloadvi8>; 6663*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"BQZ", v8i64_info, v16i8x_info, extloadvi8>; 6664*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"WDZ", v16i32_info, v16i16x_info, extloadvi16>; 6665*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"WQZ", v8i64_info, v8i16x_info, extloadvi16>; 6666*9880d681SAndroid Build Coastguard Worker defm : avx512_ext_lowering<"DQZ", v8i64_info, v8i32x_info, extloadvi32>; 6667*9880d681SAndroid Build Coastguard Worker} 6668*9880d681SAndroid Build Coastguard Worker 6669*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 6670*9880d681SAndroid Build Coastguard Worker// GATHER - SCATTER Operations 6671*9880d681SAndroid Build Coastguard Worker 6672*9880d681SAndroid Build Coastguard Workermulticlass avx512_gather<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 6673*9880d681SAndroid Build Coastguard Worker X86MemOperand memop, PatFrag GatherNode> { 6674*9880d681SAndroid Build Coastguard Worker let Constraints = "@earlyclobber $dst, $src1 = $dst, $mask = $mask_wb", 6675*9880d681SAndroid Build Coastguard Worker ExeDomain = _.ExeDomain in 6676*9880d681SAndroid Build Coastguard Worker def rm : AVX5128I<opc, MRMSrcMem, (outs _.RC:$dst, _.KRCWM:$mask_wb), 6677*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.KRCWM:$mask, memop:$src2), 6678*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr#_.Suffix, 6679*9880d681SAndroid Build Coastguard Worker "\t{$src2, ${dst} {${mask}}|${dst} {${mask}}, $src2}"), 6680*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, _.KRCWM:$mask_wb, 6681*9880d681SAndroid Build Coastguard Worker (GatherNode (_.VT _.RC:$src1), _.KRCWM:$mask, 6682*9880d681SAndroid Build Coastguard Worker vectoraddr:$src2))]>, EVEX, EVEX_K, 6683*9880d681SAndroid Build Coastguard Worker EVEX_CD8<_.EltSize, CD8VT1>; 6684*9880d681SAndroid Build Coastguard Worker} 6685*9880d681SAndroid Build Coastguard Worker 6686*9880d681SAndroid Build Coastguard Workermulticlass avx512_gather_q_pd<bits<8> dopc, bits<8> qopc, 6687*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, string OpcodeStr, string SUFF> { 6688*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z: avx512_gather<dopc, OpcodeStr##"d", _.info512, 6689*9880d681SAndroid Build Coastguard Worker vy512mem, mgatherv8i32>, EVEX_V512, VEX_W; 6690*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z: avx512_gather<qopc, OpcodeStr##"q", _.info512, 6691*9880d681SAndroid Build Coastguard Worker vz512mem, mgatherv8i64>, EVEX_V512, VEX_W; 6692*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 6693*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z256: avx512_gather<dopc, OpcodeStr##"d", _.info256, 6694*9880d681SAndroid Build Coastguard Worker vx256xmem, mgatherv4i32>, EVEX_V256, VEX_W; 6695*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z256: avx512_gather<qopc, OpcodeStr##"q", _.info256, 6696*9880d681SAndroid Build Coastguard Worker vy256xmem, mgatherv4i64>, EVEX_V256, VEX_W; 6697*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z128: avx512_gather<dopc, OpcodeStr##"d", _.info128, 6698*9880d681SAndroid Build Coastguard Worker vx128xmem, mgatherv4i32>, EVEX_V128, VEX_W; 6699*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z128: avx512_gather<qopc, OpcodeStr##"q", _.info128, 6700*9880d681SAndroid Build Coastguard Worker vx128xmem, mgatherv2i64>, EVEX_V128, VEX_W; 6701*9880d681SAndroid Build Coastguard Worker} 6702*9880d681SAndroid Build Coastguard Worker} 6703*9880d681SAndroid Build Coastguard Worker 6704*9880d681SAndroid Build Coastguard Workermulticlass avx512_gather_d_ps<bits<8> dopc, bits<8> qopc, 6705*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, string OpcodeStr, string SUFF> { 6706*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z: avx512_gather<dopc, OpcodeStr##"d", _.info512, vz512mem, 6707*9880d681SAndroid Build Coastguard Worker mgatherv16i32>, EVEX_V512; 6708*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z: avx512_gather<qopc, OpcodeStr##"q", _.info256, vz512mem, 6709*9880d681SAndroid Build Coastguard Worker mgatherv8i64>, EVEX_V512; 6710*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 6711*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z256: avx512_gather<dopc, OpcodeStr##"d", _.info256, 6712*9880d681SAndroid Build Coastguard Worker vy256xmem, mgatherv8i32>, EVEX_V256; 6713*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z256: avx512_gather<qopc, OpcodeStr##"q", _.info128, 6714*9880d681SAndroid Build Coastguard Worker vy128xmem, mgatherv4i64>, EVEX_V256; 6715*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z128: avx512_gather<dopc, OpcodeStr##"d", _.info128, 6716*9880d681SAndroid Build Coastguard Worker vx128xmem, mgatherv4i32>, EVEX_V128; 6717*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z128: avx512_gather<qopc, OpcodeStr##"q", _.info128, 6718*9880d681SAndroid Build Coastguard Worker vx64xmem, mgatherv2i64>, EVEX_V128; 6719*9880d681SAndroid Build Coastguard Worker} 6720*9880d681SAndroid Build Coastguard Worker} 6721*9880d681SAndroid Build Coastguard Worker 6722*9880d681SAndroid Build Coastguard Worker 6723*9880d681SAndroid Build Coastguard Workerdefm VGATHER : avx512_gather_q_pd<0x92, 0x93, avx512vl_f64_info, "vgather", "PD">, 6724*9880d681SAndroid Build Coastguard Worker avx512_gather_d_ps<0x92, 0x93, avx512vl_f32_info, "vgather", "PS">; 6725*9880d681SAndroid Build Coastguard Worker 6726*9880d681SAndroid Build Coastguard Workerdefm VPGATHER : avx512_gather_q_pd<0x90, 0x91, avx512vl_i64_info, "vpgather", "Q">, 6727*9880d681SAndroid Build Coastguard Worker avx512_gather_d_ps<0x90, 0x91, avx512vl_i32_info, "vpgather", "D">; 6728*9880d681SAndroid Build Coastguard Worker 6729*9880d681SAndroid Build Coastguard Workermulticlass avx512_scatter<bits<8> opc, string OpcodeStr, X86VectorVTInfo _, 6730*9880d681SAndroid Build Coastguard Worker X86MemOperand memop, PatFrag ScatterNode> { 6731*9880d681SAndroid Build Coastguard Worker 6732*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, Constraints = "$mask = $mask_wb", ExeDomain = _.ExeDomain in 6733*9880d681SAndroid Build Coastguard Worker 6734*9880d681SAndroid Build Coastguard Worker def mr : AVX5128I<opc, MRMDestMem, (outs _.KRCWM:$mask_wb), 6735*9880d681SAndroid Build Coastguard Worker (ins memop:$dst, _.KRCWM:$mask, _.RC:$src), 6736*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr#_.Suffix, 6737*9880d681SAndroid Build Coastguard Worker "\t{$src, ${dst} {${mask}}|${dst} {${mask}}, $src}"), 6738*9880d681SAndroid Build Coastguard Worker [(set _.KRCWM:$mask_wb, (ScatterNode (_.VT _.RC:$src), 6739*9880d681SAndroid Build Coastguard Worker _.KRCWM:$mask, vectoraddr:$dst))]>, 6740*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_K, EVEX_CD8<_.EltSize, CD8VT1>; 6741*9880d681SAndroid Build Coastguard Worker} 6742*9880d681SAndroid Build Coastguard Worker 6743*9880d681SAndroid Build Coastguard Workermulticlass avx512_scatter_q_pd<bits<8> dopc, bits<8> qopc, 6744*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, string OpcodeStr, string SUFF> { 6745*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z: avx512_scatter<dopc, OpcodeStr##"d", _.info512, 6746*9880d681SAndroid Build Coastguard Worker vy512mem, mscatterv8i32>, EVEX_V512, VEX_W; 6747*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z: avx512_scatter<qopc, OpcodeStr##"q", _.info512, 6748*9880d681SAndroid Build Coastguard Worker vz512mem, mscatterv8i64>, EVEX_V512, VEX_W; 6749*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 6750*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z256: avx512_scatter<dopc, OpcodeStr##"d", _.info256, 6751*9880d681SAndroid Build Coastguard Worker vx256xmem, mscatterv4i32>, EVEX_V256, VEX_W; 6752*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z256: avx512_scatter<qopc, OpcodeStr##"q", _.info256, 6753*9880d681SAndroid Build Coastguard Worker vy256xmem, mscatterv4i64>, EVEX_V256, VEX_W; 6754*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z128: avx512_scatter<dopc, OpcodeStr##"d", _.info128, 6755*9880d681SAndroid Build Coastguard Worker vx128xmem, mscatterv4i32>, EVEX_V128, VEX_W; 6756*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z128: avx512_scatter<qopc, OpcodeStr##"q", _.info128, 6757*9880d681SAndroid Build Coastguard Worker vx128xmem, mscatterv2i64>, EVEX_V128, VEX_W; 6758*9880d681SAndroid Build Coastguard Worker} 6759*9880d681SAndroid Build Coastguard Worker} 6760*9880d681SAndroid Build Coastguard Worker 6761*9880d681SAndroid Build Coastguard Workermulticlass avx512_scatter_d_ps<bits<8> dopc, bits<8> qopc, 6762*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, string OpcodeStr, string SUFF> { 6763*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z: avx512_scatter<dopc, OpcodeStr##"d", _.info512, vz512mem, 6764*9880d681SAndroid Build Coastguard Worker mscatterv16i32>, EVEX_V512; 6765*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z: avx512_scatter<qopc, OpcodeStr##"q", _.info256, vz512mem, 6766*9880d681SAndroid Build Coastguard Worker mscatterv8i64>, EVEX_V512; 6767*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVLX] in { 6768*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z256: avx512_scatter<dopc, OpcodeStr##"d", _.info256, 6769*9880d681SAndroid Build Coastguard Worker vy256xmem, mscatterv8i32>, EVEX_V256; 6770*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z256: avx512_scatter<qopc, OpcodeStr##"q", _.info128, 6771*9880d681SAndroid Build Coastguard Worker vy128xmem, mscatterv4i64>, EVEX_V256; 6772*9880d681SAndroid Build Coastguard Worker defm NAME##D##SUFF##Z128: avx512_scatter<dopc, OpcodeStr##"d", _.info128, 6773*9880d681SAndroid Build Coastguard Worker vx128xmem, mscatterv4i32>, EVEX_V128; 6774*9880d681SAndroid Build Coastguard Worker defm NAME##Q##SUFF##Z128: avx512_scatter<qopc, OpcodeStr##"q", _.info128, 6775*9880d681SAndroid Build Coastguard Worker vx64xmem, mscatterv2i64>, EVEX_V128; 6776*9880d681SAndroid Build Coastguard Worker} 6777*9880d681SAndroid Build Coastguard Worker} 6778*9880d681SAndroid Build Coastguard Worker 6779*9880d681SAndroid Build Coastguard Workerdefm VSCATTER : avx512_scatter_q_pd<0xA2, 0xA3, avx512vl_f64_info, "vscatter", "PD">, 6780*9880d681SAndroid Build Coastguard Worker avx512_scatter_d_ps<0xA2, 0xA3, avx512vl_f32_info, "vscatter", "PS">; 6781*9880d681SAndroid Build Coastguard Worker 6782*9880d681SAndroid Build Coastguard Workerdefm VPSCATTER : avx512_scatter_q_pd<0xA0, 0xA1, avx512vl_i64_info, "vpscatter", "Q">, 6783*9880d681SAndroid Build Coastguard Worker avx512_scatter_d_ps<0xA0, 0xA1, avx512vl_i32_info, "vpscatter", "D">; 6784*9880d681SAndroid Build Coastguard Worker 6785*9880d681SAndroid Build Coastguard Worker// prefetch 6786*9880d681SAndroid Build Coastguard Workermulticlass avx512_gather_scatter_prefetch<bits<8> opc, Format F, string OpcodeStr, 6787*9880d681SAndroid Build Coastguard Worker RegisterClass KRC, X86MemOperand memop> { 6788*9880d681SAndroid Build Coastguard Worker let Predicates = [HasPFI], hasSideEffects = 1 in 6789*9880d681SAndroid Build Coastguard Worker def m : AVX5128I<opc, F, (outs), (ins KRC:$mask, memop:$src), 6790*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src {${mask}}|{${mask}}, $src}"), 6791*9880d681SAndroid Build Coastguard Worker []>, EVEX, EVEX_K; 6792*9880d681SAndroid Build Coastguard Worker} 6793*9880d681SAndroid Build Coastguard Worker 6794*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF0DPS: avx512_gather_scatter_prefetch<0xC6, MRM1m, "vgatherpf0dps", 6795*9880d681SAndroid Build Coastguard Worker VK16WM, vz512mem>, EVEX_V512, EVEX_CD8<32, CD8VT1>; 6796*9880d681SAndroid Build Coastguard Worker 6797*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF0QPS: avx512_gather_scatter_prefetch<0xC7, MRM1m, "vgatherpf0qps", 6798*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, EVEX_CD8<64, CD8VT1>; 6799*9880d681SAndroid Build Coastguard Worker 6800*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF0DPD: avx512_gather_scatter_prefetch<0xC6, MRM1m, "vgatherpf0dpd", 6801*9880d681SAndroid Build Coastguard Worker VK8WM, vy512mem>, EVEX_V512, VEX_W, EVEX_CD8<32, CD8VT1>; 6802*9880d681SAndroid Build Coastguard Worker 6803*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF0QPD: avx512_gather_scatter_prefetch<0xC7, MRM1m, "vgatherpf0qpd", 6804*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, VEX_W, EVEX_CD8<64, CD8VT1>; 6805*9880d681SAndroid Build Coastguard Worker 6806*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF1DPS: avx512_gather_scatter_prefetch<0xC6, MRM2m, "vgatherpf1dps", 6807*9880d681SAndroid Build Coastguard Worker VK16WM, vz512mem>, EVEX_V512, EVEX_CD8<32, CD8VT1>; 6808*9880d681SAndroid Build Coastguard Worker 6809*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF1QPS: avx512_gather_scatter_prefetch<0xC7, MRM2m, "vgatherpf1qps", 6810*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, EVEX_CD8<64, CD8VT1>; 6811*9880d681SAndroid Build Coastguard Worker 6812*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF1DPD: avx512_gather_scatter_prefetch<0xC6, MRM2m, "vgatherpf1dpd", 6813*9880d681SAndroid Build Coastguard Worker VK8WM, vy512mem>, EVEX_V512, VEX_W, EVEX_CD8<32, CD8VT1>; 6814*9880d681SAndroid Build Coastguard Worker 6815*9880d681SAndroid Build Coastguard Workerdefm VGATHERPF1QPD: avx512_gather_scatter_prefetch<0xC7, MRM2m, "vgatherpf1qpd", 6816*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, VEX_W, EVEX_CD8<64, CD8VT1>; 6817*9880d681SAndroid Build Coastguard Worker 6818*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF0DPS: avx512_gather_scatter_prefetch<0xC6, MRM5m, "vscatterpf0dps", 6819*9880d681SAndroid Build Coastguard Worker VK16WM, vz512mem>, EVEX_V512, EVEX_CD8<32, CD8VT1>; 6820*9880d681SAndroid Build Coastguard Worker 6821*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF0QPS: avx512_gather_scatter_prefetch<0xC7, MRM5m, "vscatterpf0qps", 6822*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, EVEX_CD8<64, CD8VT1>; 6823*9880d681SAndroid Build Coastguard Worker 6824*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF0DPD: avx512_gather_scatter_prefetch<0xC6, MRM5m, "vscatterpf0dpd", 6825*9880d681SAndroid Build Coastguard Worker VK8WM, vy512mem>, EVEX_V512, VEX_W, EVEX_CD8<32, CD8VT1>; 6826*9880d681SAndroid Build Coastguard Worker 6827*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF0QPD: avx512_gather_scatter_prefetch<0xC7, MRM5m, "vscatterpf0qpd", 6828*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, VEX_W, EVEX_CD8<64, CD8VT1>; 6829*9880d681SAndroid Build Coastguard Worker 6830*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF1DPS: avx512_gather_scatter_prefetch<0xC6, MRM6m, "vscatterpf1dps", 6831*9880d681SAndroid Build Coastguard Worker VK16WM, vz512mem>, EVEX_V512, EVEX_CD8<32, CD8VT1>; 6832*9880d681SAndroid Build Coastguard Worker 6833*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF1QPS: avx512_gather_scatter_prefetch<0xC7, MRM6m, "vscatterpf1qps", 6834*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, EVEX_CD8<64, CD8VT1>; 6835*9880d681SAndroid Build Coastguard Worker 6836*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF1DPD: avx512_gather_scatter_prefetch<0xC6, MRM6m, "vscatterpf1dpd", 6837*9880d681SAndroid Build Coastguard Worker VK8WM, vy512mem>, EVEX_V512, VEX_W, EVEX_CD8<32, CD8VT1>; 6838*9880d681SAndroid Build Coastguard Worker 6839*9880d681SAndroid Build Coastguard Workerdefm VSCATTERPF1QPD: avx512_gather_scatter_prefetch<0xC7, MRM6m, "vscatterpf1qpd", 6840*9880d681SAndroid Build Coastguard Worker VK8WM, vz512mem>, EVEX_V512, VEX_W, EVEX_CD8<64, CD8VT1>; 6841*9880d681SAndroid Build Coastguard Worker 6842*9880d681SAndroid Build Coastguard Worker// Helper fragments to match sext vXi1 to vXiY. 6843*9880d681SAndroid Build Coastguard Workerdef v16i1sextv16i32 : PatLeaf<(v16i32 (X86vsrai VR512:$src, (i8 31)))>; 6844*9880d681SAndroid Build Coastguard Workerdef v8i1sextv8i64 : PatLeaf<(v8i64 (X86vsrai VR512:$src, (i8 63)))>; 6845*9880d681SAndroid Build Coastguard Worker 6846*9880d681SAndroid Build Coastguard Workermulticlass cvt_by_vec_width<bits<8> opc, X86VectorVTInfo Vec, string OpcodeStr > { 6847*9880d681SAndroid Build Coastguard Workerdef rr : AVX512XS8I<opc, MRMSrcReg, (outs Vec.RC:$dst), (ins Vec.KRC:$src), 6848*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr##Vec.Suffix, "\t{$src, $dst|$dst, $src}"), 6849*9880d681SAndroid Build Coastguard Worker [(set Vec.RC:$dst, (Vec.VT (X86vsext Vec.KRC:$src)))]>, EVEX; 6850*9880d681SAndroid Build Coastguard Worker} 6851*9880d681SAndroid Build Coastguard Worker 6852*9880d681SAndroid Build Coastguard Workermulticlass cvt_mask_by_elt_width<bits<8> opc, AVX512VLVectorVTInfo VTInfo, 6853*9880d681SAndroid Build Coastguard Worker string OpcodeStr, Predicate prd> { 6854*9880d681SAndroid Build Coastguard Workerlet Predicates = [prd] in 6855*9880d681SAndroid Build Coastguard Worker defm Z : cvt_by_vec_width<opc, VTInfo.info512, OpcodeStr>, EVEX_V512; 6856*9880d681SAndroid Build Coastguard Worker 6857*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 6858*9880d681SAndroid Build Coastguard Worker defm Z256 : cvt_by_vec_width<opc, VTInfo.info256, OpcodeStr>, EVEX_V256; 6859*9880d681SAndroid Build Coastguard Worker defm Z128 : cvt_by_vec_width<opc, VTInfo.info128, OpcodeStr>, EVEX_V128; 6860*9880d681SAndroid Build Coastguard Worker } 6861*9880d681SAndroid Build Coastguard Worker} 6862*9880d681SAndroid Build Coastguard Worker 6863*9880d681SAndroid Build Coastguard Workermulticlass avx512_convert_mask_to_vector<string OpcodeStr> { 6864*9880d681SAndroid Build Coastguard Worker defm NAME##B : cvt_mask_by_elt_width<0x28, avx512vl_i8_info, OpcodeStr, 6865*9880d681SAndroid Build Coastguard Worker HasBWI>; 6866*9880d681SAndroid Build Coastguard Worker defm NAME##W : cvt_mask_by_elt_width<0x28, avx512vl_i16_info, OpcodeStr, 6867*9880d681SAndroid Build Coastguard Worker HasBWI>, VEX_W; 6868*9880d681SAndroid Build Coastguard Worker defm NAME##D : cvt_mask_by_elt_width<0x38, avx512vl_i32_info, OpcodeStr, 6869*9880d681SAndroid Build Coastguard Worker HasDQI>; 6870*9880d681SAndroid Build Coastguard Worker defm NAME##Q : cvt_mask_by_elt_width<0x38, avx512vl_i64_info, OpcodeStr, 6871*9880d681SAndroid Build Coastguard Worker HasDQI>, VEX_W; 6872*9880d681SAndroid Build Coastguard Worker} 6873*9880d681SAndroid Build Coastguard Worker 6874*9880d681SAndroid Build Coastguard Workerdefm VPMOVM2 : avx512_convert_mask_to_vector<"vpmovm2">; 6875*9880d681SAndroid Build Coastguard Worker 6876*9880d681SAndroid Build Coastguard Workermulticlass convert_vector_to_mask_common<bits<8> opc, X86VectorVTInfo _, string OpcodeStr > { 6877*9880d681SAndroid Build Coastguard Worker def rr : AVX512XS8I<opc, MRMSrcReg, (outs _.KRC:$dst), (ins _.RC:$src), 6878*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), 6879*9880d681SAndroid Build Coastguard Worker [(set _.KRC:$dst, (X86cvt2mask (_.VT _.RC:$src)))]>, EVEX; 6880*9880d681SAndroid Build Coastguard Worker} 6881*9880d681SAndroid Build Coastguard Worker 6882*9880d681SAndroid Build Coastguard Worker// Use 512bit version to implement 128/256 bit in case NoVLX. 6883*9880d681SAndroid Build Coastguard Workermulticlass convert_vector_to_mask_lowering<X86VectorVTInfo ExtendInfo, 6884*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 6885*9880d681SAndroid Build Coastguard Worker 6886*9880d681SAndroid Build Coastguard Worker def : Pat<(_.KVT (X86cvt2mask (_.VT _.RC:$src))), 6887*9880d681SAndroid Build Coastguard Worker (_.KVT (COPY_TO_REGCLASS 6888*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"Zrr") 6889*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (ExtendInfo.VT (IMPLICIT_DEF)), 6890*9880d681SAndroid Build Coastguard Worker _.RC:$src, _.SubRegIdx)), 6891*9880d681SAndroid Build Coastguard Worker _.KRC))>; 6892*9880d681SAndroid Build Coastguard Worker} 6893*9880d681SAndroid Build Coastguard Worker 6894*9880d681SAndroid Build Coastguard Workermulticlass avx512_convert_vector_to_mask<bits<8> opc, string OpcodeStr, 6895*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 6896*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 6897*9880d681SAndroid Build Coastguard Worker defm Z : convert_vector_to_mask_common <opc, VTInfo.info512, OpcodeStr>, 6898*9880d681SAndroid Build Coastguard Worker EVEX_V512; 6899*9880d681SAndroid Build Coastguard Worker 6900*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 6901*9880d681SAndroid Build Coastguard Worker defm Z256 : convert_vector_to_mask_common<opc, VTInfo.info256, OpcodeStr>, 6902*9880d681SAndroid Build Coastguard Worker EVEX_V256; 6903*9880d681SAndroid Build Coastguard Worker defm Z128 : convert_vector_to_mask_common<opc, VTInfo.info128, OpcodeStr>, 6904*9880d681SAndroid Build Coastguard Worker EVEX_V128; 6905*9880d681SAndroid Build Coastguard Worker } 6906*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, NoVLX] in { 6907*9880d681SAndroid Build Coastguard Worker defm Z256_Alt : convert_vector_to_mask_lowering<VTInfo.info512, VTInfo.info256>; 6908*9880d681SAndroid Build Coastguard Worker defm Z128_Alt : convert_vector_to_mask_lowering<VTInfo.info512, VTInfo.info128>; 6909*9880d681SAndroid Build Coastguard Worker } 6910*9880d681SAndroid Build Coastguard Worker} 6911*9880d681SAndroid Build Coastguard Worker 6912*9880d681SAndroid Build Coastguard Workerdefm VPMOVB2M : avx512_convert_vector_to_mask<0x29, "vpmovb2m", 6913*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, HasBWI>; 6914*9880d681SAndroid Build Coastguard Workerdefm VPMOVW2M : avx512_convert_vector_to_mask<0x29, "vpmovw2m", 6915*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, HasBWI>, VEX_W; 6916*9880d681SAndroid Build Coastguard Workerdefm VPMOVD2M : avx512_convert_vector_to_mask<0x39, "vpmovd2m", 6917*9880d681SAndroid Build Coastguard Worker avx512vl_i32_info, HasDQI>; 6918*9880d681SAndroid Build Coastguard Workerdefm VPMOVQ2M : avx512_convert_vector_to_mask<0x39, "vpmovq2m", 6919*9880d681SAndroid Build Coastguard Worker avx512vl_i64_info, HasDQI>, VEX_W; 6920*9880d681SAndroid Build Coastguard Worker 6921*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 6922*9880d681SAndroid Build Coastguard Worker// AVX-512 - COMPRESS and EXPAND 6923*9880d681SAndroid Build Coastguard Worker// 6924*9880d681SAndroid Build Coastguard Worker 6925*9880d681SAndroid Build Coastguard Workermulticlass compress_by_vec_width<bits<8> opc, X86VectorVTInfo _, 6926*9880d681SAndroid Build Coastguard Worker string OpcodeStr> { 6927*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMDestReg, _, (outs _.RC:$dst), 6928*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1), OpcodeStr, "$src1", "$src1", 6929*9880d681SAndroid Build Coastguard Worker (_.VT (X86compress _.RC:$src1))>, AVX5128IBase; 6930*9880d681SAndroid Build Coastguard Worker 6931*9880d681SAndroid Build Coastguard Worker let mayStore = 1, hasSideEffects = 0 in 6932*9880d681SAndroid Build Coastguard Worker def mr : AVX5128I<opc, MRMDestMem, (outs), 6933*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$dst, _.RC:$src), 6934*9880d681SAndroid Build Coastguard Worker OpcodeStr # "\t{$src, $dst|$dst, $src}", 6935*9880d681SAndroid Build Coastguard Worker []>, EVEX_CD8<_.EltSize, CD8VT1>; 6936*9880d681SAndroid Build Coastguard Worker 6937*9880d681SAndroid Build Coastguard Worker def mrk : AVX5128I<opc, MRMDestMem, (outs), 6938*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$dst, _.KRCWM:$mask, _.RC:$src), 6939*9880d681SAndroid Build Coastguard Worker OpcodeStr # "\t{$src, $dst {${mask}}|$dst {${mask}}, $src}", 6940*9880d681SAndroid Build Coastguard Worker [(store (_.VT (vselect _.KRCWM:$mask, 6941*9880d681SAndroid Build Coastguard Worker (_.VT (X86compress _.RC:$src)), _.ImmAllZerosV)), 6942*9880d681SAndroid Build Coastguard Worker addr:$dst)]>, 6943*9880d681SAndroid Build Coastguard Worker EVEX_K, EVEX_CD8<_.EltSize, CD8VT1>; 6944*9880d681SAndroid Build Coastguard Worker} 6945*9880d681SAndroid Build Coastguard Worker 6946*9880d681SAndroid Build Coastguard Workermulticlass compress_by_elt_width<bits<8> opc, string OpcodeStr, 6947*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 6948*9880d681SAndroid Build Coastguard Worker defm Z : compress_by_vec_width<opc, VTInfo.info512, OpcodeStr>, EVEX_V512; 6949*9880d681SAndroid Build Coastguard Worker 6950*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 6951*9880d681SAndroid Build Coastguard Worker defm Z256 : compress_by_vec_width<opc, VTInfo.info256, OpcodeStr>, EVEX_V256; 6952*9880d681SAndroid Build Coastguard Worker defm Z128 : compress_by_vec_width<opc, VTInfo.info128, OpcodeStr>, EVEX_V128; 6953*9880d681SAndroid Build Coastguard Worker } 6954*9880d681SAndroid Build Coastguard Worker} 6955*9880d681SAndroid Build Coastguard Worker 6956*9880d681SAndroid Build Coastguard Workerdefm VPCOMPRESSD : compress_by_elt_width <0x8B, "vpcompressd", avx512vl_i32_info>, 6957*9880d681SAndroid Build Coastguard Worker EVEX; 6958*9880d681SAndroid Build Coastguard Workerdefm VPCOMPRESSQ : compress_by_elt_width <0x8B, "vpcompressq", avx512vl_i64_info>, 6959*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W; 6960*9880d681SAndroid Build Coastguard Workerdefm VCOMPRESSPS : compress_by_elt_width <0x8A, "vcompressps", avx512vl_f32_info>, 6961*9880d681SAndroid Build Coastguard Worker EVEX; 6962*9880d681SAndroid Build Coastguard Workerdefm VCOMPRESSPD : compress_by_elt_width <0x8A, "vcompresspd", avx512vl_f64_info>, 6963*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W; 6964*9880d681SAndroid Build Coastguard Worker 6965*9880d681SAndroid Build Coastguard Worker// expand 6966*9880d681SAndroid Build Coastguard Workermulticlass expand_by_vec_width<bits<8> opc, X86VectorVTInfo _, 6967*9880d681SAndroid Build Coastguard Worker string OpcodeStr> { 6968*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 6969*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1), OpcodeStr, "$src1", "$src1", 6970*9880d681SAndroid Build Coastguard Worker (_.VT (X86expand _.RC:$src1))>, AVX5128IBase; 6971*9880d681SAndroid Build Coastguard Worker 6972*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 6973*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src1), OpcodeStr, "$src1", "$src1", 6974*9880d681SAndroid Build Coastguard Worker (_.VT (X86expand (_.VT (bitconvert 6975*9880d681SAndroid Build Coastguard Worker (_.LdFrag addr:$src1)))))>, 6976*9880d681SAndroid Build Coastguard Worker AVX5128IBase, EVEX_CD8<_.EltSize, CD8VT1>; 6977*9880d681SAndroid Build Coastguard Worker} 6978*9880d681SAndroid Build Coastguard Worker 6979*9880d681SAndroid Build Coastguard Workermulticlass expand_by_elt_width<bits<8> opc, string OpcodeStr, 6980*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 6981*9880d681SAndroid Build Coastguard Worker defm Z : expand_by_vec_width<opc, VTInfo.info512, OpcodeStr>, EVEX_V512; 6982*9880d681SAndroid Build Coastguard Worker 6983*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVLX] in { 6984*9880d681SAndroid Build Coastguard Worker defm Z256 : expand_by_vec_width<opc, VTInfo.info256, OpcodeStr>, EVEX_V256; 6985*9880d681SAndroid Build Coastguard Worker defm Z128 : expand_by_vec_width<opc, VTInfo.info128, OpcodeStr>, EVEX_V128; 6986*9880d681SAndroid Build Coastguard Worker } 6987*9880d681SAndroid Build Coastguard Worker} 6988*9880d681SAndroid Build Coastguard Worker 6989*9880d681SAndroid Build Coastguard Workerdefm VPEXPANDD : expand_by_elt_width <0x89, "vpexpandd", avx512vl_i32_info>, 6990*9880d681SAndroid Build Coastguard Worker EVEX; 6991*9880d681SAndroid Build Coastguard Workerdefm VPEXPANDQ : expand_by_elt_width <0x89, "vpexpandq", avx512vl_i64_info>, 6992*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W; 6993*9880d681SAndroid Build Coastguard Workerdefm VEXPANDPS : expand_by_elt_width <0x88, "vexpandps", avx512vl_f32_info>, 6994*9880d681SAndroid Build Coastguard Worker EVEX; 6995*9880d681SAndroid Build Coastguard Workerdefm VEXPANDPD : expand_by_elt_width <0x88, "vexpandpd", avx512vl_f64_info>, 6996*9880d681SAndroid Build Coastguard Worker EVEX, VEX_W; 6997*9880d681SAndroid Build Coastguard Worker 6998*9880d681SAndroid Build Coastguard Worker//handle instruction reg_vec1 = op(reg_vec,imm) 6999*9880d681SAndroid Build Coastguard Worker// op(mem_vec,imm) 7000*9880d681SAndroid Build Coastguard Worker// op(broadcast(eltVt),imm) 7001*9880d681SAndroid Build Coastguard Worker//all instruction created with FROUND_CURRENT 7002*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_fp_packed_imm<bits<8> opc, string OpcodeStr, SDNode OpNode, 7003*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _>{ 7004*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 7005*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, i32u8imm:$src2), 7006*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src2, $src1", "$src1, $src2", 7007*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7008*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), 7009*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7010*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7011*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src1, i32u8imm:$src2), 7012*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src2, $src1", "$src1, $src2", 7013*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT (bitconvert (_.LdFrag addr:$src1))), 7014*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), 7015*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7016*9880d681SAndroid Build Coastguard Worker defm rmbi : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7017*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src1, i32u8imm:$src2), 7018*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src2, ${src1}"##_.BroadcastStr, 7019*9880d681SAndroid Build Coastguard Worker "${src1}"##_.BroadcastStr##", $src2", 7020*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src1))), 7021*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), 7022*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>, EVEX_B; 7023*9880d681SAndroid Build Coastguard Worker} 7024*9880d681SAndroid Build Coastguard Worker 7025*9880d681SAndroid Build Coastguard Worker//handle instruction reg_vec1 = op(reg_vec2,reg_vec3,imm),{sae} 7026*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_fp_sae_packed_imm<bits<8> opc, string OpcodeStr, 7027*9880d681SAndroid Build Coastguard Worker SDNode OpNode, X86VectorVTInfo _>{ 7028*9880d681SAndroid Build Coastguard Worker defm rrib : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 7029*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, i32u8imm:$src2), 7030*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src2, {sae}, $src1", 7031*9880d681SAndroid Build Coastguard Worker "$src1, {sae}, $src2", 7032*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7033*9880d681SAndroid Build Coastguard Worker (i32 imm:$src2), 7034*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 7035*9880d681SAndroid Build Coastguard Worker} 7036*9880d681SAndroid Build Coastguard Worker 7037*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_unary_fp_sae_packed_imm<string OpcodeStr, 7038*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, bits<8> opc, SDNode OpNode, Predicate prd>{ 7039*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 7040*9880d681SAndroid Build Coastguard Worker defm Z : avx512_unary_fp_packed_imm<opc, OpcodeStr, OpNode, _.info512>, 7041*9880d681SAndroid Build Coastguard Worker avx512_unary_fp_sae_packed_imm<opc, OpcodeStr, OpNode, _.info512>, 7042*9880d681SAndroid Build Coastguard Worker EVEX_V512; 7043*9880d681SAndroid Build Coastguard Worker } 7044*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 7045*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_unary_fp_packed_imm<opc, OpcodeStr, OpNode, _.info128>, 7046*9880d681SAndroid Build Coastguard Worker EVEX_V128; 7047*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_unary_fp_packed_imm<opc, OpcodeStr, OpNode, _.info256>, 7048*9880d681SAndroid Build Coastguard Worker EVEX_V256; 7049*9880d681SAndroid Build Coastguard Worker } 7050*9880d681SAndroid Build Coastguard Worker} 7051*9880d681SAndroid Build Coastguard Worker 7052*9880d681SAndroid Build Coastguard Worker//handle instruction reg_vec1 = op(reg_vec2,reg_vec3,imm) 7053*9880d681SAndroid Build Coastguard Worker// op(reg_vec2,mem_vec,imm) 7054*9880d681SAndroid Build Coastguard Worker// op(reg_vec2,broadcast(eltVt),imm) 7055*9880d681SAndroid Build Coastguard Worker//all instruction created with FROUND_CURRENT 7056*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_packed_imm<bits<8> opc, string OpcodeStr, SDNode OpNode, 7057*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _>{ 7058*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 7059*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, i32u8imm:$src3), 7060*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7061*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7062*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7063*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7064*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7065*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7066*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2, i32u8imm:$src3), 7067*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7068*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7069*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src2))), 7070*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7071*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7072*9880d681SAndroid Build Coastguard Worker defm rmbi : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7073*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, i32u8imm:$src3), 7074*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, ${src2}"##_.BroadcastStr##", $src1", 7075*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr##", $src3", 7076*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7077*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src2))), 7078*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7079*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>, EVEX_B; 7080*9880d681SAndroid Build Coastguard Worker} 7081*9880d681SAndroid Build Coastguard Worker 7082*9880d681SAndroid Build Coastguard Worker//handle instruction reg_vec1 = op(reg_vec2,reg_vec3,imm) 7083*9880d681SAndroid Build Coastguard Worker// op(reg_vec2,mem_vec,imm) 7084*9880d681SAndroid Build Coastguard Workermulticlass avx512_3Op_rm_imm8<bits<8> opc, string OpcodeStr, SDNode OpNode, 7085*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo DestInfo, X86VectorVTInfo SrcInfo>{ 7086*9880d681SAndroid Build Coastguard Worker 7087*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable<opc, MRMSrcReg, DestInfo, (outs DestInfo.RC:$dst), 7088*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.RC:$src1, SrcInfo.RC:$src2, u8imm:$src3), 7089*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7090*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src1), 7091*9880d681SAndroid Build Coastguard Worker (SrcInfo.VT SrcInfo.RC:$src2), 7092*9880d681SAndroid Build Coastguard Worker (i8 imm:$src3)))>; 7093*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable<opc, MRMSrcMem, DestInfo, (outs DestInfo.RC:$dst), 7094*9880d681SAndroid Build Coastguard Worker (ins SrcInfo.RC:$src1, SrcInfo.MemOp:$src2, u8imm:$src3), 7095*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7096*9880d681SAndroid Build Coastguard Worker (DestInfo.VT (OpNode (SrcInfo.VT SrcInfo.RC:$src1), 7097*9880d681SAndroid Build Coastguard Worker (SrcInfo.VT (bitconvert 7098*9880d681SAndroid Build Coastguard Worker (SrcInfo.LdFrag addr:$src2))), 7099*9880d681SAndroid Build Coastguard Worker (i8 imm:$src3)))>; 7100*9880d681SAndroid Build Coastguard Worker} 7101*9880d681SAndroid Build Coastguard Worker 7102*9880d681SAndroid Build Coastguard Worker//handle instruction reg_vec1 = op(reg_vec2,reg_vec3,imm) 7103*9880d681SAndroid Build Coastguard Worker// op(reg_vec2,mem_vec,imm) 7104*9880d681SAndroid Build Coastguard Worker// op(reg_vec2,broadcast(eltVt),imm) 7105*9880d681SAndroid Build Coastguard Workermulticlass avx512_3Op_imm8<bits<8> opc, string OpcodeStr, SDNode OpNode, 7106*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _>: 7107*9880d681SAndroid Build Coastguard Worker avx512_3Op_rm_imm8<opc, OpcodeStr, OpNode, _, _>{ 7108*9880d681SAndroid Build Coastguard Worker 7109*9880d681SAndroid Build Coastguard Worker defm rmbi : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7110*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, u8imm:$src3), 7111*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, ${src2}"##_.BroadcastStr##", $src1", 7112*9880d681SAndroid Build Coastguard Worker "$src1, ${src2}"##_.BroadcastStr##", $src3", 7113*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7114*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src2))), 7115*9880d681SAndroid Build Coastguard Worker (i8 imm:$src3))>, EVEX_B; 7116*9880d681SAndroid Build Coastguard Worker} 7117*9880d681SAndroid Build Coastguard Worker 7118*9880d681SAndroid Build Coastguard Worker//handle scalar instruction reg_vec1 = op(reg_vec2,reg_vec3,imm) 7119*9880d681SAndroid Build Coastguard Worker// op(reg_vec2,mem_scalar,imm) 7120*9880d681SAndroid Build Coastguard Worker//all instruction created with FROUND_CURRENT 7121*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_scalar_imm<bits<8> opc, string OpcodeStr, SDNode OpNode, 7122*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 7123*9880d681SAndroid Build Coastguard Worker 7124*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 7125*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, i32u8imm:$src3), 7126*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7127*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7128*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7129*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7130*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7131*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 7132*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.MemOp:$src2, i32u8imm:$src3), 7133*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7134*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7135*9880d681SAndroid Build Coastguard Worker (_.VT (scalar_to_vector 7136*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src2))), 7137*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7138*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7139*9880d681SAndroid Build Coastguard Worker 7140*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1, mayLoad = 1, hasSideEffects = 0 in { 7141*9880d681SAndroid Build Coastguard Worker defm rmi_alt :AVX512_maskable_in_asm<opc, MRMSrcMem, _, (outs _.FRC:$dst), 7142*9880d681SAndroid Build Coastguard Worker (ins _.FRC:$src1, _.ScalarMemOp:$src2, u8imm:$src3), 7143*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, $src2, $src1", "$src1, $src2, $src3", 7144*9880d681SAndroid Build Coastguard Worker []>; 7145*9880d681SAndroid Build Coastguard Worker } 7146*9880d681SAndroid Build Coastguard Worker} 7147*9880d681SAndroid Build Coastguard Worker 7148*9880d681SAndroid Build Coastguard Worker//handle instruction reg_vec1 = op(reg_vec2,reg_vec3,imm),{sae} 7149*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_sae_packed_imm<bits<8> opc, string OpcodeStr, 7150*9880d681SAndroid Build Coastguard Worker SDNode OpNode, X86VectorVTInfo _>{ 7151*9880d681SAndroid Build Coastguard Worker defm rrib : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 7152*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, i32u8imm:$src3), 7153*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, {sae}, $src2, $src1", 7154*9880d681SAndroid Build Coastguard Worker "$src1, $src2, {sae}, $src3", 7155*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7156*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7157*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7158*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 7159*9880d681SAndroid Build Coastguard Worker} 7160*9880d681SAndroid Build Coastguard Worker//handle scalar instruction reg_vec1 = op(reg_vec2,reg_vec3,imm),{sae} 7161*9880d681SAndroid Build Coastguard Workermulticlass avx512_fp_sae_scalar_imm<bits<8> opc, string OpcodeStr, 7162*9880d681SAndroid Build Coastguard Worker SDNode OpNode, X86VectorVTInfo _> { 7163*9880d681SAndroid Build Coastguard Worker defm NAME#rrib : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 7164*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.RC:$src2, i32u8imm:$src3), 7165*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src3, {sae}, $src2, $src1", 7166*9880d681SAndroid Build Coastguard Worker "$src1, $src2, {sae}, $src3", 7167*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7168*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7169*9880d681SAndroid Build Coastguard Worker (i32 imm:$src3), 7170*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 7171*9880d681SAndroid Build Coastguard Worker} 7172*9880d681SAndroid Build Coastguard Worker 7173*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_fp_sae_packed_imm<string OpcodeStr, 7174*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo _, bits<8> opc, SDNode OpNode, Predicate prd>{ 7175*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 7176*9880d681SAndroid Build Coastguard Worker defm Z : avx512_fp_packed_imm<opc, OpcodeStr, OpNode, _.info512>, 7177*9880d681SAndroid Build Coastguard Worker avx512_fp_sae_packed_imm<opc, OpcodeStr, OpNode, _.info512>, 7178*9880d681SAndroid Build Coastguard Worker EVEX_V512; 7179*9880d681SAndroid Build Coastguard Worker 7180*9880d681SAndroid Build Coastguard Worker } 7181*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 7182*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_fp_packed_imm<opc, OpcodeStr, OpNode, _.info128>, 7183*9880d681SAndroid Build Coastguard Worker EVEX_V128; 7184*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_fp_packed_imm<opc, OpcodeStr, OpNode, _.info256>, 7185*9880d681SAndroid Build Coastguard Worker EVEX_V256; 7186*9880d681SAndroid Build Coastguard Worker } 7187*9880d681SAndroid Build Coastguard Worker} 7188*9880d681SAndroid Build Coastguard Worker 7189*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_3Op_rm_imm8<bits<8> opc, SDNode OpNode, string OpStr, 7190*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo DestInfo, AVX512VLVectorVTInfo SrcInfo>{ 7191*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 7192*9880d681SAndroid Build Coastguard Worker defm Z : avx512_3Op_rm_imm8<opc, OpStr, OpNode, DestInfo.info512, 7193*9880d681SAndroid Build Coastguard Worker SrcInfo.info512>, EVEX_V512, AVX512AIi8Base, EVEX_4V; 7194*9880d681SAndroid Build Coastguard Worker } 7195*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI, HasVLX] in { 7196*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_3Op_rm_imm8<opc, OpStr, OpNode, DestInfo.info128, 7197*9880d681SAndroid Build Coastguard Worker SrcInfo.info128>, EVEX_V128, AVX512AIi8Base, EVEX_4V; 7198*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_3Op_rm_imm8<opc, OpStr, OpNode, DestInfo.info256, 7199*9880d681SAndroid Build Coastguard Worker SrcInfo.info256>, EVEX_V256, AVX512AIi8Base, EVEX_4V; 7200*9880d681SAndroid Build Coastguard Worker } 7201*9880d681SAndroid Build Coastguard Worker} 7202*9880d681SAndroid Build Coastguard Worker 7203*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_3Op_imm8<string OpcodeStr, AVX512VLVectorVTInfo _, 7204*9880d681SAndroid Build Coastguard Worker bits<8> opc, SDNode OpNode>{ 7205*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 7206*9880d681SAndroid Build Coastguard Worker defm Z : avx512_3Op_imm8<opc, OpcodeStr, OpNode, _.info512>, EVEX_V512; 7207*9880d681SAndroid Build Coastguard Worker } 7208*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 7209*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_3Op_imm8<opc, OpcodeStr, OpNode, _.info128>, EVEX_V128; 7210*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_3Op_imm8<opc, OpcodeStr, OpNode, _.info256>, EVEX_V256; 7211*9880d681SAndroid Build Coastguard Worker } 7212*9880d681SAndroid Build Coastguard Worker} 7213*9880d681SAndroid Build Coastguard Worker 7214*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_fp_sae_scalar_imm<string OpcodeStr, 7215*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, bits<8> opc, SDNode OpNode, Predicate prd>{ 7216*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in { 7217*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_fp_scalar_imm<opc, OpcodeStr, OpNode, _>, 7218*9880d681SAndroid Build Coastguard Worker avx512_fp_sae_scalar_imm<opc, OpcodeStr, OpNode, _>; 7219*9880d681SAndroid Build Coastguard Worker } 7220*9880d681SAndroid Build Coastguard Worker} 7221*9880d681SAndroid Build Coastguard Worker 7222*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_unary_fp_sae_packed_imm_all<string OpcodeStr, 7223*9880d681SAndroid Build Coastguard Worker bits<8> opcPs, bits<8> opcPd, SDNode OpNode, Predicate prd>{ 7224*9880d681SAndroid Build Coastguard Worker defm PS : avx512_common_unary_fp_sae_packed_imm<OpcodeStr, avx512vl_f32_info, 7225*9880d681SAndroid Build Coastguard Worker opcPs, OpNode, prd>, EVEX_CD8<32, CD8VF>; 7226*9880d681SAndroid Build Coastguard Worker defm PD : avx512_common_unary_fp_sae_packed_imm<OpcodeStr, avx512vl_f64_info, 7227*9880d681SAndroid Build Coastguard Worker opcPd, OpNode, prd>, EVEX_CD8<64, CD8VF>, VEX_W; 7228*9880d681SAndroid Build Coastguard Worker} 7229*9880d681SAndroid Build Coastguard Worker 7230*9880d681SAndroid Build Coastguard Worker 7231*9880d681SAndroid Build Coastguard Workerdefm VREDUCE : avx512_common_unary_fp_sae_packed_imm_all<"vreduce", 0x56, 0x56, 7232*9880d681SAndroid Build Coastguard Worker X86VReduce, HasDQI>, AVX512AIi8Base, EVEX; 7233*9880d681SAndroid Build Coastguard Workerdefm VRNDSCALE : avx512_common_unary_fp_sae_packed_imm_all<"vrndscale", 0x08, 0x09, 7234*9880d681SAndroid Build Coastguard Worker X86VRndScale, HasAVX512>, AVX512AIi8Base, EVEX; 7235*9880d681SAndroid Build Coastguard Workerdefm VGETMANT : avx512_common_unary_fp_sae_packed_imm_all<"vgetmant", 0x26, 0x26, 7236*9880d681SAndroid Build Coastguard Worker X86VGetMant, HasAVX512>, AVX512AIi8Base, EVEX; 7237*9880d681SAndroid Build Coastguard Worker 7238*9880d681SAndroid Build Coastguard Worker 7239*9880d681SAndroid Build Coastguard Workerdefm VRANGEPD : avx512_common_fp_sae_packed_imm<"vrangepd", avx512vl_f64_info, 7240*9880d681SAndroid Build Coastguard Worker 0x50, X86VRange, HasDQI>, 7241*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<64, CD8VF>, VEX_W; 7242*9880d681SAndroid Build Coastguard Workerdefm VRANGEPS : avx512_common_fp_sae_packed_imm<"vrangeps", avx512vl_f32_info, 7243*9880d681SAndroid Build Coastguard Worker 0x50, X86VRange, HasDQI>, 7244*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<32, CD8VF>; 7245*9880d681SAndroid Build Coastguard Worker 7246*9880d681SAndroid Build Coastguard Workerdefm VRANGESD: avx512_common_fp_sae_scalar_imm<"vrangesd", f64x_info, 7247*9880d681SAndroid Build Coastguard Worker 0x51, X86VRange, HasDQI>, 7248*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<64, CD8VT1>, VEX_W; 7249*9880d681SAndroid Build Coastguard Workerdefm VRANGESS: avx512_common_fp_sae_scalar_imm<"vrangess", f32x_info, 7250*9880d681SAndroid Build Coastguard Worker 0x51, X86VRange, HasDQI>, 7251*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<32, CD8VT1>; 7252*9880d681SAndroid Build Coastguard Worker 7253*9880d681SAndroid Build Coastguard Workerdefm VREDUCESD: avx512_common_fp_sae_scalar_imm<"vreducesd", f64x_info, 7254*9880d681SAndroid Build Coastguard Worker 0x57, X86Reduces, HasDQI>, 7255*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<64, CD8VT1>, VEX_W; 7256*9880d681SAndroid Build Coastguard Workerdefm VREDUCESS: avx512_common_fp_sae_scalar_imm<"vreducess", f32x_info, 7257*9880d681SAndroid Build Coastguard Worker 0x57, X86Reduces, HasDQI>, 7258*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<32, CD8VT1>; 7259*9880d681SAndroid Build Coastguard Worker 7260*9880d681SAndroid Build Coastguard Workerdefm VGETMANTSD: avx512_common_fp_sae_scalar_imm<"vgetmantsd", f64x_info, 7261*9880d681SAndroid Build Coastguard Worker 0x27, X86GetMants, HasAVX512>, 7262*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<64, CD8VT1>, VEX_W; 7263*9880d681SAndroid Build Coastguard Workerdefm VGETMANTSS: avx512_common_fp_sae_scalar_imm<"vgetmantss", f32x_info, 7264*9880d681SAndroid Build Coastguard Worker 0x27, X86GetMants, HasAVX512>, 7265*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<32, CD8VT1>; 7266*9880d681SAndroid Build Coastguard Worker 7267*9880d681SAndroid Build Coastguard Workermulticlass avx512_shuff_packed_128<string OpcodeStr, AVX512VLVectorVTInfo _, 7268*9880d681SAndroid Build Coastguard Worker bits<8> opc, SDNode OpNode = X86Shuf128>{ 7269*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in { 7270*9880d681SAndroid Build Coastguard Worker defm Z : avx512_3Op_imm8<opc, OpcodeStr, OpNode, _.info512>, EVEX_V512; 7271*9880d681SAndroid Build Coastguard Worker 7272*9880d681SAndroid Build Coastguard Worker } 7273*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 7274*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_3Op_imm8<opc, OpcodeStr, OpNode, _.info256>, EVEX_V256; 7275*9880d681SAndroid Build Coastguard Worker } 7276*9880d681SAndroid Build Coastguard Worker} 7277*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAVX512] in { 7278*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (ffloor VR512:$src)), 7279*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPSZrri VR512:$src, (i32 0x1))>; 7280*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (fnearbyint VR512:$src)), 7281*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPSZrri VR512:$src, (i32 0xC))>; 7282*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (fceil VR512:$src)), 7283*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPSZrri VR512:$src, (i32 0x2))>; 7284*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (frint VR512:$src)), 7285*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPSZrri VR512:$src, (i32 0x4))>; 7286*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16f32 (ftrunc VR512:$src)), 7287*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPSZrri VR512:$src, (i32 0x3))>; 7288*9880d681SAndroid Build Coastguard Worker 7289*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (ffloor VR512:$src)), 7290*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPDZrri VR512:$src, (i32 0x1))>; 7291*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (fnearbyint VR512:$src)), 7292*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPDZrri VR512:$src, (i32 0xC))>; 7293*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (fceil VR512:$src)), 7294*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPDZrri VR512:$src, (i32 0x2))>; 7295*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (frint VR512:$src)), 7296*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPDZrri VR512:$src, (i32 0x4))>; 7297*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f64 (ftrunc VR512:$src)), 7298*9880d681SAndroid Build Coastguard Worker (VRNDSCALEPDZrri VR512:$src, (i32 0x3))>; 7299*9880d681SAndroid Build Coastguard Worker} 7300*9880d681SAndroid Build Coastguard Worker 7301*9880d681SAndroid Build Coastguard Workerdefm VSHUFF32X4 : avx512_shuff_packed_128<"vshuff32x4",avx512vl_f32_info, 0x23>, 7302*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<32, CD8VF>; 7303*9880d681SAndroid Build Coastguard Workerdefm VSHUFF64X2 : avx512_shuff_packed_128<"vshuff64x2",avx512vl_f64_info, 0x23>, 7304*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<64, CD8VF>, VEX_W; 7305*9880d681SAndroid Build Coastguard Workerdefm VSHUFI32X4 : avx512_shuff_packed_128<"vshufi32x4",avx512vl_i32_info, 0x43>, 7306*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<32, CD8VF>; 7307*9880d681SAndroid Build Coastguard Workerdefm VSHUFI64X2 : avx512_shuff_packed_128<"vshufi64x2",avx512vl_i64_info, 0x43>, 7308*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<64, CD8VF>, VEX_W; 7309*9880d681SAndroid Build Coastguard Worker 7310*9880d681SAndroid Build Coastguard Workermulticlass avx512_valign<string OpcodeStr, AVX512VLVectorVTInfo VTInfo_I> { 7311*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_common_3Op_imm8<OpcodeStr, VTInfo_I, 0x03, X86VAlign>, 7312*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V; 7313*9880d681SAndroid Build Coastguard Worker} 7314*9880d681SAndroid Build Coastguard Worker 7315*9880d681SAndroid Build Coastguard Workerdefm VALIGND: avx512_valign<"valignd", avx512vl_i32_info>, 7316*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 7317*9880d681SAndroid Build Coastguard Workerdefm VALIGNQ: avx512_valign<"valignq", avx512vl_i64_info>, 7318*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>, VEX_W; 7319*9880d681SAndroid Build Coastguard Worker 7320*9880d681SAndroid Build Coastguard Workermulticlass avx512_vpalignr_lowering<X86VectorVTInfo _ , list<Predicate> p>{ 7321*9880d681SAndroid Build Coastguard Worker let Predicates = p in 7322*9880d681SAndroid Build Coastguard Worker def NAME#_.VTName#rri: 7323*9880d681SAndroid Build Coastguard Worker Pat<(_.VT (X86PAlignr _.RC:$src1, _.RC:$src2, (i8 imm:$imm))), 7324*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#_.ZSuffix#rri) 7325*9880d681SAndroid Build Coastguard Worker _.RC:$src1, _.RC:$src2, imm:$imm)>; 7326*9880d681SAndroid Build Coastguard Worker} 7327*9880d681SAndroid Build Coastguard Worker 7328*9880d681SAndroid Build Coastguard Workermulticlass avx512_vpalignr_lowering_common<AVX512VLVectorVTInfo _>: 7329*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering<_.info512, [HasBWI]>, 7330*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering<_.info128, [HasBWI, HasVLX]>, 7331*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering<_.info256, [HasBWI, HasVLX]>; 7332*9880d681SAndroid Build Coastguard Worker 7333*9880d681SAndroid Build Coastguard Workerdefm VPALIGNR: avx512_common_3Op_rm_imm8<0x0F, X86PAlignr, "vpalignr" , 7334*9880d681SAndroid Build Coastguard Worker avx512vl_i8_info, avx512vl_i8_info>, 7335*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering_common<avx512vl_i16_info>, 7336*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering_common<avx512vl_i32_info>, 7337*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering_common<avx512vl_f32_info>, 7338*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering_common<avx512vl_i64_info>, 7339*9880d681SAndroid Build Coastguard Worker avx512_vpalignr_lowering_common<avx512vl_f64_info>, 7340*9880d681SAndroid Build Coastguard Worker EVEX_CD8<8, CD8VF>; 7341*9880d681SAndroid Build Coastguard Worker 7342*9880d681SAndroid Build Coastguard Workerdefm VDBPSADBW: avx512_common_3Op_rm_imm8<0x42, X86dbpsadbw, "vdbpsadbw" , 7343*9880d681SAndroid Build Coastguard Worker avx512vl_i16_info, avx512vl_i8_info>, EVEX_CD8<8, CD8VF>; 7344*9880d681SAndroid Build Coastguard Worker 7345*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, 7346*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 7347*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 7348*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1), OpcodeStr, 7349*9880d681SAndroid Build Coastguard Worker "$src1", "$src1", 7350*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1))>, EVEX, AVX5128IBase; 7351*9880d681SAndroid Build Coastguard Worker 7352*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7353*9880d681SAndroid Build Coastguard Worker (ins _.MemOp:$src1), OpcodeStr, 7354*9880d681SAndroid Build Coastguard Worker "$src1", "$src1", 7355*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (bitconvert (_.LdFrag addr:$src1))))>, 7356*9880d681SAndroid Build Coastguard Worker EVEX, AVX5128IBase, EVEX_CD8<_.EltSize, CD8VF>; 7357*9880d681SAndroid Build Coastguard Worker} 7358*9880d681SAndroid Build Coastguard Worker 7359*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rmb<bits<8> opc, string OpcodeStr, SDNode OpNode, 7360*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> : 7361*9880d681SAndroid Build Coastguard Worker avx512_unary_rm<opc, OpcodeStr, OpNode, _> { 7362*9880d681SAndroid Build Coastguard Worker defm rmb : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7363*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src1), OpcodeStr, 7364*9880d681SAndroid Build Coastguard Worker "${src1}"##_.BroadcastStr, 7365*9880d681SAndroid Build Coastguard Worker "${src1}"##_.BroadcastStr, 7366*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (X86VBroadcast 7367*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src1))))>, 7368*9880d681SAndroid Build Coastguard Worker EVEX, AVX5128IBase, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>; 7369*9880d681SAndroid Build Coastguard Worker} 7370*9880d681SAndroid Build Coastguard Worker 7371*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rm_vl<bits<8> opc, string OpcodeStr, SDNode OpNode, 7372*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 7373*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 7374*9880d681SAndroid Build Coastguard Worker defm Z : avx512_unary_rm<opc, OpcodeStr, OpNode, VTInfo.info512>, EVEX_V512; 7375*9880d681SAndroid Build Coastguard Worker 7376*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 7377*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_unary_rm<opc, OpcodeStr, OpNode, VTInfo.info256>, 7378*9880d681SAndroid Build Coastguard Worker EVEX_V256; 7379*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_unary_rm<opc, OpcodeStr, OpNode, VTInfo.info128>, 7380*9880d681SAndroid Build Coastguard Worker EVEX_V128; 7381*9880d681SAndroid Build Coastguard Worker } 7382*9880d681SAndroid Build Coastguard Worker} 7383*9880d681SAndroid Build Coastguard Worker 7384*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rmb_vl<bits<8> opc, string OpcodeStr, SDNode OpNode, 7385*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo, Predicate prd> { 7386*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 7387*9880d681SAndroid Build Coastguard Worker defm Z : avx512_unary_rmb<opc, OpcodeStr, OpNode, VTInfo.info512>, 7388*9880d681SAndroid Build Coastguard Worker EVEX_V512; 7389*9880d681SAndroid Build Coastguard Worker 7390*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 7391*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_unary_rmb<opc, OpcodeStr, OpNode, VTInfo.info256>, 7392*9880d681SAndroid Build Coastguard Worker EVEX_V256; 7393*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_unary_rmb<opc, OpcodeStr, OpNode, VTInfo.info128>, 7394*9880d681SAndroid Build Coastguard Worker EVEX_V128; 7395*9880d681SAndroid Build Coastguard Worker } 7396*9880d681SAndroid Build Coastguard Worker} 7397*9880d681SAndroid Build Coastguard Worker 7398*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rm_vl_dq<bits<8> opc_d, bits<8> opc_q, string OpcodeStr, 7399*9880d681SAndroid Build Coastguard Worker SDNode OpNode, Predicate prd> { 7400*9880d681SAndroid Build Coastguard Worker defm Q : avx512_unary_rmb_vl<opc_q, OpcodeStr#"q", OpNode, avx512vl_i64_info, 7401*9880d681SAndroid Build Coastguard Worker prd>, VEX_W; 7402*9880d681SAndroid Build Coastguard Worker defm D : avx512_unary_rmb_vl<opc_d, OpcodeStr#"d", OpNode, avx512vl_i32_info, 7403*9880d681SAndroid Build Coastguard Worker prd>; 7404*9880d681SAndroid Build Coastguard Worker} 7405*9880d681SAndroid Build Coastguard Worker 7406*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rm_vl_bw<bits<8> opc_b, bits<8> opc_w, string OpcodeStr, 7407*9880d681SAndroid Build Coastguard Worker SDNode OpNode, Predicate prd> { 7408*9880d681SAndroid Build Coastguard Worker defm W : avx512_unary_rm_vl<opc_w, OpcodeStr#"w", OpNode, avx512vl_i16_info, prd>; 7409*9880d681SAndroid Build Coastguard Worker defm B : avx512_unary_rm_vl<opc_b, OpcodeStr#"b", OpNode, avx512vl_i8_info, prd>; 7410*9880d681SAndroid Build Coastguard Worker} 7411*9880d681SAndroid Build Coastguard Worker 7412*9880d681SAndroid Build Coastguard Workermulticlass avx512_unary_rm_vl_all<bits<8> opc_b, bits<8> opc_w, 7413*9880d681SAndroid Build Coastguard Worker bits<8> opc_d, bits<8> opc_q, 7414*9880d681SAndroid Build Coastguard Worker string OpcodeStr, SDNode OpNode> { 7415*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_unary_rm_vl_dq<opc_d, opc_q, OpcodeStr, OpNode, 7416*9880d681SAndroid Build Coastguard Worker HasAVX512>, 7417*9880d681SAndroid Build Coastguard Worker avx512_unary_rm_vl_bw<opc_b, opc_w, OpcodeStr, OpNode, 7418*9880d681SAndroid Build Coastguard Worker HasBWI>; 7419*9880d681SAndroid Build Coastguard Worker} 7420*9880d681SAndroid Build Coastguard Worker 7421*9880d681SAndroid Build Coastguard Workerdefm VPABS : avx512_unary_rm_vl_all<0x1C, 0x1D, 0x1E, 0x1F, "vpabs", X86Abs>; 7422*9880d681SAndroid Build Coastguard Worker 7423*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor 7424*9880d681SAndroid Build Coastguard Worker (bc_v16i32 (v16i1sextv16i32)), 7425*9880d681SAndroid Build Coastguard Worker (bc_v16i32 (add (v16i32 VR512:$src), (v16i1sextv16i32)))), 7426*9880d681SAndroid Build Coastguard Worker (VPABSDZrr VR512:$src)>; 7427*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor 7428*9880d681SAndroid Build Coastguard Worker (bc_v8i64 (v8i1sextv8i64)), 7429*9880d681SAndroid Build Coastguard Worker (bc_v8i64 (add (v8i64 VR512:$src), (v8i1sextv8i64)))), 7430*9880d681SAndroid Build Coastguard Worker (VPABSQZrr VR512:$src)>; 7431*9880d681SAndroid Build Coastguard Worker 7432*9880d681SAndroid Build Coastguard Workermulticlass avx512_ctlz<bits<8> opc, string OpcodeStr, Predicate prd>{ 7433*9880d681SAndroid Build Coastguard Worker 7434*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_unary_rm_vl_dq<opc, opc, OpcodeStr, ctlz, prd>; 7435*9880d681SAndroid Build Coastguard Worker} 7436*9880d681SAndroid Build Coastguard Worker 7437*9880d681SAndroid Build Coastguard Workerdefm VPLZCNT : avx512_ctlz<0x44, "vplzcnt", HasCDI>; 7438*9880d681SAndroid Build Coastguard Workerdefm VPCONFLICT : avx512_unary_rm_vl_dq<0xC4, 0xC4, "vpconflict", X86Conflict, HasCDI>; 7439*9880d681SAndroid Build Coastguard Worker 7440*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 7441*9880d681SAndroid Build Coastguard Worker// Replicate Single FP - MOVSHDUP and MOVSLDUP 7442*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 7443*9880d681SAndroid Build Coastguard Workermulticlass avx512_replicate<bits<8> opc, string OpcodeStr, SDNode OpNode>{ 7444*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_unary_rm_vl<opc, OpcodeStr, OpNode, avx512vl_f32_info, 7445*9880d681SAndroid Build Coastguard Worker HasAVX512>, XS; 7446*9880d681SAndroid Build Coastguard Worker} 7447*9880d681SAndroid Build Coastguard Worker 7448*9880d681SAndroid Build Coastguard Workerdefm VMOVSHDUP : avx512_replicate<0x16, "vmovshdup", X86Movshdup>; 7449*9880d681SAndroid Build Coastguard Workerdefm VMOVSLDUP : avx512_replicate<0x12, "vmovsldup", X86Movsldup>; 7450*9880d681SAndroid Build Coastguard Worker 7451*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7452*9880d681SAndroid Build Coastguard Worker// AVX-512 - MOVDDUP 7453*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7454*9880d681SAndroid Build Coastguard Worker 7455*9880d681SAndroid Build Coastguard Workermulticlass avx512_movddup_128<bits<8> opc, string OpcodeStr, SDNode OpNode, 7456*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 7457*9880d681SAndroid Build Coastguard Worker defm rr : AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst), 7458*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src), OpcodeStr, "$src", "$src", 7459*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT _.RC:$src)))>, EVEX; 7460*9880d681SAndroid Build Coastguard Worker defm rm : AVX512_maskable<opc, MRMSrcMem, _, (outs _.RC:$dst), 7461*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$src), OpcodeStr, "$src", "$src", 7462*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode (_.VT (scalar_to_vector 7463*9880d681SAndroid Build Coastguard Worker (_.ScalarLdFrag addr:$src)))))>, 7464*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<_.EltSize, CD8VH>; 7465*9880d681SAndroid Build Coastguard Worker} 7466*9880d681SAndroid Build Coastguard Worker 7467*9880d681SAndroid Build Coastguard Workermulticlass avx512_movddup_common<bits<8> opc, string OpcodeStr, SDNode OpNode, 7468*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo> { 7469*9880d681SAndroid Build Coastguard Worker 7470*9880d681SAndroid Build Coastguard Worker defm Z : avx512_unary_rm<opc, OpcodeStr, OpNode, VTInfo.info512>, EVEX_V512; 7471*9880d681SAndroid Build Coastguard Worker 7472*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 7473*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_unary_rm<opc, OpcodeStr, OpNode, VTInfo.info256>, 7474*9880d681SAndroid Build Coastguard Worker EVEX_V256; 7475*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_movddup_128<opc, OpcodeStr, OpNode, VTInfo.info128>, 7476*9880d681SAndroid Build Coastguard Worker EVEX_V128; 7477*9880d681SAndroid Build Coastguard Worker } 7478*9880d681SAndroid Build Coastguard Worker} 7479*9880d681SAndroid Build Coastguard Worker 7480*9880d681SAndroid Build Coastguard Workermulticlass avx512_movddup<bits<8> opc, string OpcodeStr, SDNode OpNode>{ 7481*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_movddup_common<opc, OpcodeStr, OpNode, 7482*9880d681SAndroid Build Coastguard Worker avx512vl_f64_info>, XD, VEX_W; 7483*9880d681SAndroid Build Coastguard Worker} 7484*9880d681SAndroid Build Coastguard Worker 7485*9880d681SAndroid Build Coastguard Workerdefm VMOVDDUP : avx512_movddup<0x12, "vmovddup", X86Movddup>; 7486*9880d681SAndroid Build Coastguard Worker 7487*9880d681SAndroid Build Coastguard Workerdef : Pat<(X86Movddup (loadv2f64 addr:$src)), 7488*9880d681SAndroid Build Coastguard Worker (VMOVDDUPZ128rm addr:$src)>, Requires<[HasAVX512, HasVLX]>; 7489*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (X86VBroadcast (loadf64 addr:$src))), 7490*9880d681SAndroid Build Coastguard Worker (VMOVDDUPZ128rm addr:$src)>, Requires<[HasAVX512, HasVLX]>; 7491*9880d681SAndroid Build Coastguard Worker 7492*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7493*9880d681SAndroid Build Coastguard Worker// AVX-512 - Unpack Instructions 7494*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7495*9880d681SAndroid Build Coastguard Workerdefm VUNPCKH : avx512_fp_binop_p<0x15, "vunpckh", X86Unpckh, HasAVX512>; 7496*9880d681SAndroid Build Coastguard Workerdefm VUNPCKL : avx512_fp_binop_p<0x14, "vunpckl", X86Unpckl, HasAVX512>; 7497*9880d681SAndroid Build Coastguard Worker 7498*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKLBW : avx512_binop_rm_vl_b<0x60, "vpunpcklbw", X86Unpckl, 7499*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI>; 7500*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKHBW : avx512_binop_rm_vl_b<0x68, "vpunpckhbw", X86Unpckh, 7501*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI>; 7502*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKLWD : avx512_binop_rm_vl_w<0x61, "vpunpcklwd", X86Unpckl, 7503*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI>; 7504*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKHWD : avx512_binop_rm_vl_w<0x69, "vpunpckhwd", X86Unpckh, 7505*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasBWI>; 7506*9880d681SAndroid Build Coastguard Worker 7507*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKLDQ : avx512_binop_rm_vl_d<0x62, "vpunpckldq", X86Unpckl, 7508*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512>; 7509*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKHDQ : avx512_binop_rm_vl_d<0x6A, "vpunpckhdq", X86Unpckh, 7510*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512>; 7511*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKLQDQ : avx512_binop_rm_vl_q<0x6C, "vpunpcklqdq", X86Unpckl, 7512*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512>; 7513*9880d681SAndroid Build Coastguard Workerdefm VPUNPCKHQDQ : avx512_binop_rm_vl_q<0x6D, "vpunpckhqdq", X86Unpckh, 7514*9880d681SAndroid Build Coastguard Worker SSE_INTALU_ITINS_P, HasAVX512>; 7515*9880d681SAndroid Build Coastguard Worker 7516*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7517*9880d681SAndroid Build Coastguard Worker// AVX-512 - Extract & Insert Integer Instructions 7518*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7519*9880d681SAndroid Build Coastguard Worker 7520*9880d681SAndroid Build Coastguard Workermulticlass avx512_extract_elt_bw_m<bits<8> opc, string OpcodeStr, SDNode OpNode, 7521*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _> { 7522*9880d681SAndroid Build Coastguard Worker def mr : AVX512Ii8<opc, MRMDestMem, (outs), 7523*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$dst, _.RC:$src1, u8imm:$src2), 7524*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 7525*9880d681SAndroid Build Coastguard Worker [(store (_.EltVT (trunc (assertzext (OpNode (_.VT _.RC:$src1), 7526*9880d681SAndroid Build Coastguard Worker imm:$src2)))), 7527*9880d681SAndroid Build Coastguard Worker addr:$dst)]>, 7528*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<_.EltSize, CD8VT1>; 7529*9880d681SAndroid Build Coastguard Worker} 7530*9880d681SAndroid Build Coastguard Worker 7531*9880d681SAndroid Build Coastguard Workermulticlass avx512_extract_elt_b<string OpcodeStr, X86VectorVTInfo _> { 7532*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 7533*9880d681SAndroid Build Coastguard Worker def rr : AVX512Ii8<0x14, MRMDestReg, (outs GR32orGR64:$dst), 7534*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, u8imm:$src2), 7535*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 7536*9880d681SAndroid Build Coastguard Worker [(set GR32orGR64:$dst, 7537*9880d681SAndroid Build Coastguard Worker (X86pextrb (_.VT _.RC:$src1), imm:$src2))]>, 7538*9880d681SAndroid Build Coastguard Worker EVEX, TAPD; 7539*9880d681SAndroid Build Coastguard Worker 7540*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_extract_elt_bw_m<0x14, OpcodeStr, X86pextrb, _>, TAPD; 7541*9880d681SAndroid Build Coastguard Worker } 7542*9880d681SAndroid Build Coastguard Worker} 7543*9880d681SAndroid Build Coastguard Worker 7544*9880d681SAndroid Build Coastguard Workermulticlass avx512_extract_elt_w<string OpcodeStr, X86VectorVTInfo _> { 7545*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 7546*9880d681SAndroid Build Coastguard Worker def rr : AVX512Ii8<0xC5, MRMSrcReg, (outs GR32orGR64:$dst), 7547*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, u8imm:$src2), 7548*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 7549*9880d681SAndroid Build Coastguard Worker [(set GR32orGR64:$dst, 7550*9880d681SAndroid Build Coastguard Worker (X86pextrw (_.VT _.RC:$src1), imm:$src2))]>, 7551*9880d681SAndroid Build Coastguard Worker EVEX, PD; 7552*9880d681SAndroid Build Coastguard Worker 7553*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 0 in 7554*9880d681SAndroid Build Coastguard Worker def rr_REV : AVX512Ii8<0x15, MRMDestReg, (outs GR32orGR64:$dst), 7555*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, u8imm:$src2), 7556*9880d681SAndroid Build Coastguard Worker OpcodeStr#".s\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>, 7557*9880d681SAndroid Build Coastguard Worker EVEX, TAPD; 7558*9880d681SAndroid Build Coastguard Worker 7559*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_extract_elt_bw_m<0x15, OpcodeStr, X86pextrw, _>, TAPD; 7560*9880d681SAndroid Build Coastguard Worker } 7561*9880d681SAndroid Build Coastguard Worker} 7562*9880d681SAndroid Build Coastguard Worker 7563*9880d681SAndroid Build Coastguard Workermulticlass avx512_extract_elt_dq<string OpcodeStr, X86VectorVTInfo _, 7564*9880d681SAndroid Build Coastguard Worker RegisterClass GRC> { 7565*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 7566*9880d681SAndroid Build Coastguard Worker def rr : AVX512Ii8<0x16, MRMDestReg, (outs GRC:$dst), 7567*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, u8imm:$src2), 7568*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 7569*9880d681SAndroid Build Coastguard Worker [(set GRC:$dst, 7570*9880d681SAndroid Build Coastguard Worker (extractelt (_.VT _.RC:$src1), imm:$src2))]>, 7571*9880d681SAndroid Build Coastguard Worker EVEX, TAPD; 7572*9880d681SAndroid Build Coastguard Worker 7573*9880d681SAndroid Build Coastguard Worker def mr : AVX512Ii8<0x16, MRMDestMem, (outs), 7574*9880d681SAndroid Build Coastguard Worker (ins _.ScalarMemOp:$dst, _.RC:$src1, u8imm:$src2), 7575*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", 7576*9880d681SAndroid Build Coastguard Worker [(store (extractelt (_.VT _.RC:$src1), 7577*9880d681SAndroid Build Coastguard Worker imm:$src2),addr:$dst)]>, 7578*9880d681SAndroid Build Coastguard Worker EVEX, EVEX_CD8<_.EltSize, CD8VT1>, TAPD; 7579*9880d681SAndroid Build Coastguard Worker } 7580*9880d681SAndroid Build Coastguard Worker} 7581*9880d681SAndroid Build Coastguard Worker 7582*9880d681SAndroid Build Coastguard Workerdefm VPEXTRBZ : avx512_extract_elt_b<"vpextrb", v16i8x_info>; 7583*9880d681SAndroid Build Coastguard Workerdefm VPEXTRWZ : avx512_extract_elt_w<"vpextrw", v8i16x_info>; 7584*9880d681SAndroid Build Coastguard Workerdefm VPEXTRDZ : avx512_extract_elt_dq<"vpextrd", v4i32x_info, GR32>; 7585*9880d681SAndroid Build Coastguard Workerdefm VPEXTRQZ : avx512_extract_elt_dq<"vpextrq", v2i64x_info, GR64>, VEX_W; 7586*9880d681SAndroid Build Coastguard Worker 7587*9880d681SAndroid Build Coastguard Workermulticlass avx512_insert_elt_m<bits<8> opc, string OpcodeStr, SDNode OpNode, 7588*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, PatFrag LdFrag> { 7589*9880d681SAndroid Build Coastguard Worker def rm : AVX512Ii8<opc, MRMSrcMem, (outs _.RC:$dst), 7590*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, _.ScalarMemOp:$src2, u8imm:$src3), 7591*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}", 7592*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, 7593*9880d681SAndroid Build Coastguard Worker (_.VT (OpNode _.RC:$src1, (LdFrag addr:$src2), imm:$src3)))]>, 7594*9880d681SAndroid Build Coastguard Worker EVEX_4V, EVEX_CD8<_.EltSize, CD8VT1>; 7595*9880d681SAndroid Build Coastguard Worker} 7596*9880d681SAndroid Build Coastguard Worker 7597*9880d681SAndroid Build Coastguard Workermulticlass avx512_insert_elt_bw<bits<8> opc, string OpcodeStr, SDNode OpNode, 7598*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, PatFrag LdFrag> { 7599*9880d681SAndroid Build Coastguard Worker let Predicates = [HasBWI] in { 7600*9880d681SAndroid Build Coastguard Worker def rr : AVX512Ii8<opc, MRMSrcReg, (outs _.RC:$dst), 7601*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, GR32orGR64:$src2, u8imm:$src3), 7602*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}", 7603*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, 7604*9880d681SAndroid Build Coastguard Worker (OpNode _.RC:$src1, GR32orGR64:$src2, imm:$src3))]>, EVEX_4V; 7605*9880d681SAndroid Build Coastguard Worker 7606*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_insert_elt_m<opc, OpcodeStr, OpNode, _, LdFrag>; 7607*9880d681SAndroid Build Coastguard Worker } 7608*9880d681SAndroid Build Coastguard Worker} 7609*9880d681SAndroid Build Coastguard Worker 7610*9880d681SAndroid Build Coastguard Workermulticlass avx512_insert_elt_dq<bits<8> opc, string OpcodeStr, 7611*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, RegisterClass GRC> { 7612*9880d681SAndroid Build Coastguard Worker let Predicates = [HasDQI] in { 7613*9880d681SAndroid Build Coastguard Worker def rr : AVX512Ii8<opc, MRMSrcReg, (outs _.RC:$dst), 7614*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src1, GRC:$src2, u8imm:$src3), 7615*9880d681SAndroid Build Coastguard Worker OpcodeStr#"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}", 7616*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst, 7617*9880d681SAndroid Build Coastguard Worker (_.VT (insertelt _.RC:$src1, GRC:$src2, imm:$src3)))]>, 7618*9880d681SAndroid Build Coastguard Worker EVEX_4V, TAPD; 7619*9880d681SAndroid Build Coastguard Worker 7620*9880d681SAndroid Build Coastguard Worker defm NAME : avx512_insert_elt_m<opc, OpcodeStr, insertelt, _, 7621*9880d681SAndroid Build Coastguard Worker _.ScalarLdFrag>, TAPD; 7622*9880d681SAndroid Build Coastguard Worker } 7623*9880d681SAndroid Build Coastguard Worker} 7624*9880d681SAndroid Build Coastguard Worker 7625*9880d681SAndroid Build Coastguard Workerdefm VPINSRBZ : avx512_insert_elt_bw<0x20, "vpinsrb", X86pinsrb, v16i8x_info, 7626*9880d681SAndroid Build Coastguard Worker extloadi8>, TAPD; 7627*9880d681SAndroid Build Coastguard Workerdefm VPINSRWZ : avx512_insert_elt_bw<0xC4, "vpinsrw", X86pinsrw, v8i16x_info, 7628*9880d681SAndroid Build Coastguard Worker extloadi16>, PD; 7629*9880d681SAndroid Build Coastguard Workerdefm VPINSRDZ : avx512_insert_elt_dq<0x22, "vpinsrd", v4i32x_info, GR32>; 7630*9880d681SAndroid Build Coastguard Workerdefm VPINSRQZ : avx512_insert_elt_dq<0x22, "vpinsrq", v2i64x_info, GR64>, VEX_W; 7631*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7632*9880d681SAndroid Build Coastguard Worker// VSHUFPS - VSHUFPD Operations 7633*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7634*9880d681SAndroid Build Coastguard Workermulticlass avx512_shufp<string OpcodeStr, AVX512VLVectorVTInfo VTInfo_I, 7635*9880d681SAndroid Build Coastguard Worker AVX512VLVectorVTInfo VTInfo_FP>{ 7636*9880d681SAndroid Build Coastguard Worker defm NAME: avx512_common_3Op_imm8<OpcodeStr, VTInfo_FP, 0xC6, X86Shufp>, 7637*9880d681SAndroid Build Coastguard Worker EVEX_CD8<VTInfo_FP.info512.EltSize, CD8VF>, 7638*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V; 7639*9880d681SAndroid Build Coastguard Worker} 7640*9880d681SAndroid Build Coastguard Worker 7641*9880d681SAndroid Build Coastguard Workerdefm VSHUFPS: avx512_shufp<"vshufps", avx512vl_i32_info, avx512vl_f32_info>, PS; 7642*9880d681SAndroid Build Coastguard Workerdefm VSHUFPD: avx512_shufp<"vshufpd", avx512vl_i64_info, avx512vl_f64_info>, PD, VEX_W; 7643*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7644*9880d681SAndroid Build Coastguard Worker// AVX-512 - Byte shift Left/Right 7645*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7646*9880d681SAndroid Build Coastguard Worker 7647*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_packed<bits<8> opc, SDNode OpNode, Format MRMr, 7648*9880d681SAndroid Build Coastguard Worker Format MRMm, string OpcodeStr, X86VectorVTInfo _>{ 7649*9880d681SAndroid Build Coastguard Worker def rr : AVX512<opc, MRMr, 7650*9880d681SAndroid Build Coastguard Worker (outs _.RC:$dst), (ins _.RC:$src1, u8imm:$src2), 7651*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 7652*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst,(_.VT (OpNode _.RC:$src1, (i8 imm:$src2))))]>; 7653*9880d681SAndroid Build Coastguard Worker def rm : AVX512<opc, MRMm, 7654*9880d681SAndroid Build Coastguard Worker (outs _.RC:$dst), (ins _.MemOp:$src1, u8imm:$src2), 7655*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 7656*9880d681SAndroid Build Coastguard Worker [(set _.RC:$dst,(_.VT (OpNode 7657*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src1))), 7658*9880d681SAndroid Build Coastguard Worker (i8 imm:$src2))))]>; 7659*9880d681SAndroid Build Coastguard Worker} 7660*9880d681SAndroid Build Coastguard Worker 7661*9880d681SAndroid Build Coastguard Workermulticlass avx512_shift_packed_all<bits<8> opc, SDNode OpNode, Format MRMr, 7662*9880d681SAndroid Build Coastguard Worker Format MRMm, string OpcodeStr, Predicate prd>{ 7663*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 7664*9880d681SAndroid Build Coastguard Worker defm Z512 : avx512_shift_packed<opc, OpNode, MRMr, MRMm, 7665*9880d681SAndroid Build Coastguard Worker OpcodeStr, v64i8_info>, EVEX_V512; 7666*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 7667*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_shift_packed<opc, OpNode, MRMr, MRMm, 7668*9880d681SAndroid Build Coastguard Worker OpcodeStr, v32i8x_info>, EVEX_V256; 7669*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_shift_packed<opc, OpNode, MRMr, MRMm, 7670*9880d681SAndroid Build Coastguard Worker OpcodeStr, v16i8x_info>, EVEX_V128; 7671*9880d681SAndroid Build Coastguard Worker } 7672*9880d681SAndroid Build Coastguard Worker} 7673*9880d681SAndroid Build Coastguard Workerdefm VPSLLDQ : avx512_shift_packed_all<0x73, X86vshldq, MRM7r, MRM7m, "vpslldq", 7674*9880d681SAndroid Build Coastguard Worker HasBWI>, AVX512PDIi8Base, EVEX_4V; 7675*9880d681SAndroid Build Coastguard Workerdefm VPSRLDQ : avx512_shift_packed_all<0x73, X86vshrdq, MRM3r, MRM3m, "vpsrldq", 7676*9880d681SAndroid Build Coastguard Worker HasBWI>, AVX512PDIi8Base, EVEX_4V; 7677*9880d681SAndroid Build Coastguard Worker 7678*9880d681SAndroid Build Coastguard Worker 7679*9880d681SAndroid Build Coastguard Workermulticlass avx512_psadbw_packed<bits<8> opc, SDNode OpNode, 7680*9880d681SAndroid Build Coastguard Worker string OpcodeStr, X86VectorVTInfo _dst, 7681*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _src>{ 7682*9880d681SAndroid Build Coastguard Worker def rr : AVX512BI<opc, MRMSrcReg, 7683*9880d681SAndroid Build Coastguard Worker (outs _dst.RC:$dst), (ins _src.RC:$src1, _src.RC:$src2), 7684*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 7685*9880d681SAndroid Build Coastguard Worker [(set _dst.RC:$dst,(_dst.VT 7686*9880d681SAndroid Build Coastguard Worker (OpNode (_src.VT _src.RC:$src1), 7687*9880d681SAndroid Build Coastguard Worker (_src.VT _src.RC:$src2))))]>; 7688*9880d681SAndroid Build Coastguard Worker def rm : AVX512BI<opc, MRMSrcMem, 7689*9880d681SAndroid Build Coastguard Worker (outs _dst.RC:$dst), (ins _src.RC:$src1, _src.MemOp:$src2), 7690*9880d681SAndroid Build Coastguard Worker !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), 7691*9880d681SAndroid Build Coastguard Worker [(set _dst.RC:$dst,(_dst.VT 7692*9880d681SAndroid Build Coastguard Worker (OpNode (_src.VT _src.RC:$src1), 7693*9880d681SAndroid Build Coastguard Worker (_src.VT (bitconvert 7694*9880d681SAndroid Build Coastguard Worker (_src.LdFrag addr:$src2))))))]>; 7695*9880d681SAndroid Build Coastguard Worker} 7696*9880d681SAndroid Build Coastguard Worker 7697*9880d681SAndroid Build Coastguard Workermulticlass avx512_psadbw_packed_all<bits<8> opc, SDNode OpNode, 7698*9880d681SAndroid Build Coastguard Worker string OpcodeStr, Predicate prd> { 7699*9880d681SAndroid Build Coastguard Worker let Predicates = [prd] in 7700*9880d681SAndroid Build Coastguard Worker defm Z512 : avx512_psadbw_packed<opc, OpNode, OpcodeStr, v8i64_info, 7701*9880d681SAndroid Build Coastguard Worker v64i8_info>, EVEX_V512; 7702*9880d681SAndroid Build Coastguard Worker let Predicates = [prd, HasVLX] in { 7703*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_psadbw_packed<opc, OpNode, OpcodeStr, v4i64x_info, 7704*9880d681SAndroid Build Coastguard Worker v32i8x_info>, EVEX_V256; 7705*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_psadbw_packed<opc, OpNode, OpcodeStr, v2i64x_info, 7706*9880d681SAndroid Build Coastguard Worker v16i8x_info>, EVEX_V128; 7707*9880d681SAndroid Build Coastguard Worker } 7708*9880d681SAndroid Build Coastguard Worker} 7709*9880d681SAndroid Build Coastguard Worker 7710*9880d681SAndroid Build Coastguard Workerdefm VPSADBW : avx512_psadbw_packed_all<0xf6, X86psadbw, "vpsadbw", 7711*9880d681SAndroid Build Coastguard Worker HasBWI>, EVEX_4V; 7712*9880d681SAndroid Build Coastguard Worker 7713*9880d681SAndroid Build Coastguard Workermulticlass avx512_ternlog<bits<8> opc, string OpcodeStr, SDNode OpNode, 7714*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _>{ 7715*9880d681SAndroid Build Coastguard Worker let Constraints = "$src1 = $dst" in { 7716*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 7717*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, u8imm:$src4), 7718*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src4, $src3, $src2", "$src2, $src3, $src4", 7719*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7720*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7721*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src3), 7722*9880d681SAndroid Build Coastguard Worker (i8 imm:$src4))>, AVX512AIi8Base, EVEX_4V; 7723*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 7724*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.MemOp:$src3, u8imm:$src4), 7725*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src4, $src3, $src2", "$src2, $src3, $src4", 7726*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7727*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7728*9880d681SAndroid Build Coastguard Worker (_.VT (bitconvert (_.LdFrag addr:$src3))), 7729*9880d681SAndroid Build Coastguard Worker (i8 imm:$src4))>, 7730*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; 7731*9880d681SAndroid Build Coastguard Worker defm rmbi : AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 7732*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3, u8imm:$src4), 7733*9880d681SAndroid Build Coastguard Worker OpcodeStr, "$src4, ${src3}"##_.BroadcastStr##", $src2", 7734*9880d681SAndroid Build Coastguard Worker "$src2, ${src3}"##_.BroadcastStr##", $src4", 7735*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7736*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7737*9880d681SAndroid Build Coastguard Worker (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))), 7738*9880d681SAndroid Build Coastguard Worker (i8 imm:$src4))>, EVEX_B, 7739*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; 7740*9880d681SAndroid Build Coastguard Worker }// Constraints = "$src1 = $dst" 7741*9880d681SAndroid Build Coastguard Worker} 7742*9880d681SAndroid Build Coastguard Worker 7743*9880d681SAndroid Build Coastguard Workermulticlass avx512_common_ternlog<string OpcodeStr, AVX512VLVectorVTInfo _>{ 7744*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 7745*9880d681SAndroid Build Coastguard Worker defm Z : avx512_ternlog<0x25, OpcodeStr, X86vpternlog, _.info512>, EVEX_V512; 7746*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 7747*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_ternlog<0x25, OpcodeStr, X86vpternlog, _.info128>, EVEX_V128; 7748*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_ternlog<0x25, OpcodeStr, X86vpternlog, _.info256>, EVEX_V256; 7749*9880d681SAndroid Build Coastguard Worker } 7750*9880d681SAndroid Build Coastguard Worker} 7751*9880d681SAndroid Build Coastguard Worker 7752*9880d681SAndroid Build Coastguard Workerdefm VPTERNLOGD : avx512_common_ternlog<"vpternlogd", avx512vl_i32_info>; 7753*9880d681SAndroid Build Coastguard Workerdefm VPTERNLOGQ : avx512_common_ternlog<"vpternlogq", avx512vl_i64_info>, VEX_W; 7754*9880d681SAndroid Build Coastguard Worker 7755*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7756*9880d681SAndroid Build Coastguard Worker// AVX-512 - FixupImm 7757*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 7758*9880d681SAndroid Build Coastguard Worker 7759*9880d681SAndroid Build Coastguard Workermulticlass avx512_fixupimm_packed<bits<8> opc, string OpcodeStr, SDNode OpNode, 7760*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _>{ 7761*9880d681SAndroid Build Coastguard Worker let Constraints = "$src1 = $dst" in { 7762*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 7763*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, i32u8imm:$src4), 7764*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, $src3, $src2", "$src2, $src3, $src4", 7765*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7766*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7767*9880d681SAndroid Build Coastguard Worker (_.IntVT _.RC:$src3), 7768*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7769*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7770*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 7771*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.MemOp:$src3, i32u8imm:$src4), 7772*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, $src3, $src2", "$src2, $src3, $src4", 7773*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7774*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7775*9880d681SAndroid Build Coastguard Worker (_.IntVT (bitconvert (_.LdFrag addr:$src3))), 7776*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7777*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7778*9880d681SAndroid Build Coastguard Worker defm rmbi : AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst), 7779*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3, i32u8imm:$src4), 7780*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, ${src3}"##_.BroadcastStr##", $src2", 7781*9880d681SAndroid Build Coastguard Worker "$src2, ${src3}"##_.BroadcastStr##", $src4", 7782*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7783*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7784*9880d681SAndroid Build Coastguard Worker (_.IntVT (X86VBroadcast(_.ScalarLdFrag addr:$src3))), 7785*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7786*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>, EVEX_B; 7787*9880d681SAndroid Build Coastguard Worker } // Constraints = "$src1 = $dst" 7788*9880d681SAndroid Build Coastguard Worker} 7789*9880d681SAndroid Build Coastguard Worker 7790*9880d681SAndroid Build Coastguard Workermulticlass avx512_fixupimm_packed_sae<bits<8> opc, string OpcodeStr, 7791*9880d681SAndroid Build Coastguard Worker SDNode OpNode, X86VectorVTInfo _>{ 7792*9880d681SAndroid Build Coastguard Workerlet Constraints = "$src1 = $dst" in { 7793*9880d681SAndroid Build Coastguard Worker defm rrib : AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), 7794*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, i32u8imm:$src4), 7795*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, {sae}, $src3, $src2", 7796*9880d681SAndroid Build Coastguard Worker "$src2, $src3, {sae}, $src4", 7797*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7798*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7799*9880d681SAndroid Build Coastguard Worker (_.IntVT _.RC:$src3), 7800*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7801*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 7802*9880d681SAndroid Build Coastguard Worker } 7803*9880d681SAndroid Build Coastguard Worker} 7804*9880d681SAndroid Build Coastguard Worker 7805*9880d681SAndroid Build Coastguard Workermulticlass avx512_fixupimm_scalar<bits<8> opc, string OpcodeStr, SDNode OpNode, 7806*9880d681SAndroid Build Coastguard Worker X86VectorVTInfo _, X86VectorVTInfo _src3VT> { 7807*9880d681SAndroid Build Coastguard Worker let Constraints = "$src1 = $dst" , Predicates = [HasAVX512] in { 7808*9880d681SAndroid Build Coastguard Worker defm rri : AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 7809*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, i32u8imm:$src4), 7810*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, $src3, $src2", "$src2, $src3, $src4", 7811*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7812*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7813*9880d681SAndroid Build Coastguard Worker (_src3VT.VT _src3VT.RC:$src3), 7814*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7815*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7816*9880d681SAndroid Build Coastguard Worker 7817*9880d681SAndroid Build Coastguard Worker defm rrib : AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst), 7818*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.RC:$src3, i32u8imm:$src4), 7819*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, {sae}, $src3, $src2", 7820*9880d681SAndroid Build Coastguard Worker "$src2, $src3, {sae}, $src4", 7821*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7822*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7823*9880d681SAndroid Build Coastguard Worker (_src3VT.VT _src3VT.RC:$src3), 7824*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7825*9880d681SAndroid Build Coastguard Worker (i32 FROUND_NO_EXC))>, EVEX_B; 7826*9880d681SAndroid Build Coastguard Worker defm rmi : AVX512_maskable_3src_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst), 7827*9880d681SAndroid Build Coastguard Worker (ins _.RC:$src2, _.ScalarMemOp:$src3, i32u8imm:$src4), 7828*9880d681SAndroid Build Coastguard Worker OpcodeStr##_.Suffix, "$src4, $src3, $src2", "$src2, $src3, $src4", 7829*9880d681SAndroid Build Coastguard Worker (OpNode (_.VT _.RC:$src1), 7830*9880d681SAndroid Build Coastguard Worker (_.VT _.RC:$src2), 7831*9880d681SAndroid Build Coastguard Worker (_src3VT.VT (scalar_to_vector 7832*9880d681SAndroid Build Coastguard Worker (_src3VT.ScalarLdFrag addr:$src3))), 7833*9880d681SAndroid Build Coastguard Worker (i32 imm:$src4), 7834*9880d681SAndroid Build Coastguard Worker (i32 FROUND_CURRENT))>; 7835*9880d681SAndroid Build Coastguard Worker } 7836*9880d681SAndroid Build Coastguard Worker} 7837*9880d681SAndroid Build Coastguard Worker 7838*9880d681SAndroid Build Coastguard Workermulticlass avx512_fixupimm_packed_all<AVX512VLVectorVTInfo _Vec>{ 7839*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512] in 7840*9880d681SAndroid Build Coastguard Worker defm Z : avx512_fixupimm_packed<0x54, "vfixupimm", X86VFixupimm, _Vec.info512>, 7841*9880d681SAndroid Build Coastguard Worker avx512_fixupimm_packed_sae<0x54, "vfixupimm", X86VFixupimm, _Vec.info512>, 7842*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_V512; 7843*9880d681SAndroid Build Coastguard Worker let Predicates = [HasAVX512, HasVLX] in { 7844*9880d681SAndroid Build Coastguard Worker defm Z128 : avx512_fixupimm_packed<0x54, "vfixupimm", X86VFixupimm, _Vec.info128>, 7845*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_V128; 7846*9880d681SAndroid Build Coastguard Worker defm Z256 : avx512_fixupimm_packed<0x54, "vfixupimm", X86VFixupimm, _Vec.info256>, 7847*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, EVEX_4V, EVEX_V256; 7848*9880d681SAndroid Build Coastguard Worker } 7849*9880d681SAndroid Build Coastguard Worker} 7850*9880d681SAndroid Build Coastguard Worker 7851*9880d681SAndroid Build Coastguard Workerdefm VFIXUPIMMSS : avx512_fixupimm_scalar<0x55, "vfixupimm", X86VFixupimmScalar, 7852*9880d681SAndroid Build Coastguard Worker f32x_info, v4i32x_info>, 7853*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<32, CD8VT1>; 7854*9880d681SAndroid Build Coastguard Workerdefm VFIXUPIMMSD : avx512_fixupimm_scalar<0x55, "vfixupimm", X86VFixupimmScalar, 7855*9880d681SAndroid Build Coastguard Worker f64x_info, v2i64x_info>, 7856*9880d681SAndroid Build Coastguard Worker AVX512AIi8Base, VEX_LIG, EVEX_4V, EVEX_CD8<64, CD8VT1>, VEX_W; 7857*9880d681SAndroid Build Coastguard Workerdefm VFIXUPIMMPS : avx512_fixupimm_packed_all<avx512vl_f32_info>, 7858*9880d681SAndroid Build Coastguard Worker EVEX_CD8<32, CD8VF>; 7859*9880d681SAndroid Build Coastguard Workerdefm VFIXUPIMMPD : avx512_fixupimm_packed_all<avx512vl_f64_info>, 7860*9880d681SAndroid Build Coastguard Worker EVEX_CD8<64, CD8VF>, VEX_W; 7861