@@ -12300,72 +12300,76 @@ defm : vpclmulqdq_aliases<"VPCLMULQDQZ256", VR256X, i256mem>;
1230012300// VBMI2
1230112301//===----------------------------------------------------------------------===//
1230212302
12303- multiclass VBMI2_shift_var_rm<bits<8> Op, string OpStr, SDNode OpNode,
12303+ multiclass VBMI2_shift_var_rm<bits<8> Op, string OpStr, SDNode OpNode, bit SwapLR,
1230412304 X86FoldableSchedWrite sched, X86VectorVTInfo VTI> {
1230512305 let Constraints = "$src1 = $dst",
1230612306 ExeDomain = VTI.ExeDomain in {
1230712307 defm r: AVX512_maskable_3src<Op, MRMSrcReg, VTI, (outs VTI.RC:$dst),
1230812308 (ins VTI.RC:$src2, VTI.RC:$src3), OpStr,
1230912309 "$src3, $src2", "$src2, $src3",
12310- (VTI.VT (OpNode VTI.RC:$src1, VTI.RC:$src2, VTI.RC:$src3))>,
12310+ !if(SwapLR,
12311+ (VTI.VT (OpNode (VTI.VT VTI.RC:$src2), (VTI.VT VTI.RC:$src1), (VTI.VT VTI.RC:$src3))),
12312+ (VTI.VT (OpNode (VTI.VT VTI.RC:$src1), (VTI.VT VTI.RC:$src2), (VTI.VT VTI.RC:$src3))))>,
1231112313 T8, PD, EVEX, VVVV, Sched<[sched]>;
1231212314 defm m: AVX512_maskable_3src<Op, MRMSrcMem, VTI, (outs VTI.RC:$dst),
1231312315 (ins VTI.RC:$src2, VTI.MemOp:$src3), OpStr,
1231412316 "$src3, $src2", "$src2, $src3",
12315- (VTI.VT (OpNode VTI.RC:$src1, VTI.RC:$src2,
12316- (VTI.VT (VTI.LdFrag addr:$src3))))>,
12317+ !if(SwapLR,
12318+ (VTI.VT (OpNode (VTI.VT VTI.RC:$src2), (VTI.VT VTI.RC:$src1), (VTI.VT (VTI.LdFrag addr:$src3)))),
12319+ (VTI.VT (OpNode (VTI.VT VTI.RC:$src1), (VTI.VT VTI.RC:$src2), (VTI.VT (VTI.LdFrag addr:$src3)))))>,
1231712320 T8, PD, EVEX, VVVV,
1231812321 Sched<[sched.Folded, sched.ReadAfterFold]>;
1231912322 }
1232012323}
1232112324
12322- multiclass VBMI2_shift_var_rmb<bits<8> Op, string OpStr, SDNode OpNode,
12325+ multiclass VBMI2_shift_var_rmb<bits<8> Op, string OpStr, SDNode OpNode, bit SwapLR,
1232312326 X86FoldableSchedWrite sched, X86VectorVTInfo VTI>
12324- : VBMI2_shift_var_rm<Op, OpStr, OpNode, sched, VTI> {
12327+ : VBMI2_shift_var_rm<Op, OpStr, OpNode, SwapLR, sched, VTI> {
1232512328 let Constraints = "$src1 = $dst",
1232612329 ExeDomain = VTI.ExeDomain in
1232712330 defm mb: AVX512_maskable_3src<Op, MRMSrcMem, VTI, (outs VTI.RC:$dst),
1232812331 (ins VTI.RC:$src2, VTI.ScalarMemOp:$src3), OpStr,
1232912332 "${src3}"#VTI.BroadcastStr#", $src2",
1233012333 "$src2, ${src3}"#VTI.BroadcastStr,
12331- (OpNode VTI.RC:$src1, VTI.RC:$src2,
12332- (VTI.VT (VTI.BroadcastLdFrag addr:$src3)))>,
12334+ !if(SwapLR,
12335+ (OpNode (VTI.VT VTI.RC:$src2), (VTI.VT VTI.RC:$src1), (VTI.VT (VTI.BroadcastLdFrag addr:$src3))),
12336+ (OpNode (VTI.VT VTI.RC:$src1), (VTI.VT VTI.RC:$src2), (VTI.VT (VTI.BroadcastLdFrag addr:$src3))))>,
1233312337 T8, PD, EVEX, VVVV, EVEX_B,
1233412338 Sched<[sched.Folded, sched.ReadAfterFold]>;
1233512339}
1233612340
12337- multiclass VBMI2_shift_var_rm_common<bits<8> Op, string OpStr, SDNode OpNode,
12341+ multiclass VBMI2_shift_var_rm_common<bits<8> Op, string OpStr, SDNode OpNode, bit SwapLR,
1233812342 X86SchedWriteWidths sched, AVX512VLVectorVTInfo VTI> {
1233912343 let Predicates = [HasVBMI2] in
12340- defm Z : VBMI2_shift_var_rm<Op, OpStr, OpNode, sched.ZMM, VTI.info512>,
12344+ defm Z : VBMI2_shift_var_rm<Op, OpStr, OpNode, SwapLR, sched.ZMM, VTI.info512>,
1234112345 EVEX_V512;
1234212346 let Predicates = [HasVBMI2, HasVLX] in {
12343- defm Z256 : VBMI2_shift_var_rm<Op, OpStr, OpNode, sched.YMM, VTI.info256>,
12347+ defm Z256 : VBMI2_shift_var_rm<Op, OpStr, OpNode, SwapLR, sched.YMM, VTI.info256>,
1234412348 EVEX_V256;
12345- defm Z128 : VBMI2_shift_var_rm<Op, OpStr, OpNode, sched.XMM, VTI.info128>,
12349+ defm Z128 : VBMI2_shift_var_rm<Op, OpStr, OpNode, SwapLR, sched.XMM, VTI.info128>,
1234612350 EVEX_V128;
1234712351 }
1234812352}
1234912353
12350- multiclass VBMI2_shift_var_rmb_common<bits<8> Op, string OpStr, SDNode OpNode,
12354+ multiclass VBMI2_shift_var_rmb_common<bits<8> Op, string OpStr, SDNode OpNode, bit SwapLR,
1235112355 X86SchedWriteWidths sched, AVX512VLVectorVTInfo VTI> {
1235212356 let Predicates = [HasVBMI2] in
12353- defm Z : VBMI2_shift_var_rmb<Op, OpStr, OpNode, sched.ZMM, VTI.info512>,
12357+ defm Z : VBMI2_shift_var_rmb<Op, OpStr, OpNode, SwapLR, sched.ZMM, VTI.info512>,
1235412358 EVEX_V512;
1235512359 let Predicates = [HasVBMI2, HasVLX] in {
12356- defm Z256 : VBMI2_shift_var_rmb<Op, OpStr, OpNode, sched.YMM, VTI.info256>,
12360+ defm Z256 : VBMI2_shift_var_rmb<Op, OpStr, OpNode, SwapLR, sched.YMM, VTI.info256>,
1235712361 EVEX_V256;
12358- defm Z128 : VBMI2_shift_var_rmb<Op, OpStr, OpNode, sched.XMM, VTI.info128>,
12362+ defm Z128 : VBMI2_shift_var_rmb<Op, OpStr, OpNode, SwapLR, sched.XMM, VTI.info128>,
1235912363 EVEX_V128;
1236012364 }
1236112365}
1236212366multiclass VBMI2_shift_var<bits<8> wOp, bits<8> dqOp, string Prefix,
12363- SDNode OpNode, X86SchedWriteWidths sched> {
12364- defm W : VBMI2_shift_var_rm_common<wOp, Prefix#"w", OpNode, sched,
12367+ SDNode OpNode, bit SwapLR, X86SchedWriteWidths sched> {
12368+ defm W : VBMI2_shift_var_rm_common<wOp, Prefix#"w", OpNode, SwapLR, sched,
1236512369 avx512vl_i16_info>, REX_W, EVEX_CD8<16, CD8VF>;
12366- defm D : VBMI2_shift_var_rmb_common<dqOp, Prefix#"d", OpNode, sched,
12370+ defm D : VBMI2_shift_var_rmb_common<dqOp, Prefix#"d", OpNode, SwapLR, sched,
1236712371 avx512vl_i32_info>, EVEX_CD8<32, CD8VF>;
12368- defm Q : VBMI2_shift_var_rmb_common<dqOp, Prefix#"q", OpNode, sched,
12372+ defm Q : VBMI2_shift_var_rmb_common<dqOp, Prefix#"q", OpNode, SwapLR, sched,
1236912373 avx512vl_i64_info>, REX_W, EVEX_CD8<64, CD8VF>;
1237012374}
1237112375
@@ -12381,8 +12385,8 @@ multiclass VBMI2_shift_imm<bits<8> wOp, bits<8> dqOp, string Prefix,
1238112385}
1238212386
1238312387// Concat & Shift
12384- defm VPSHLDV : VBMI2_shift_var<0x70, 0x71, "vpshldv", X86VShldv , SchedWriteVecIMul>;
12385- defm VPSHRDV : VBMI2_shift_var<0x72, 0x73, "vpshrdv", X86VShrdv , SchedWriteVecIMul>;
12388+ defm VPSHLDV : VBMI2_shift_var<0x70, 0x71, "vpshldv", fshl, 0 , SchedWriteVecIMul>;
12389+ defm VPSHRDV : VBMI2_shift_var<0x72, 0x73, "vpshrdv", fshr, 1 , SchedWriteVecIMul>;
1238612390defm VPSHLD : VBMI2_shift_imm<0x70, 0x71, "vpshld", X86VShld, SchedWriteVecIMul>;
1238712391defm VPSHRD : VBMI2_shift_imm<0x72, 0x73, "vpshrd", X86VShrd, SchedWriteVecIMul>;
1238812392
0 commit comments