@@ -12300,72 +12300,76 @@ defm : vpclmulqdq_aliases<"VPCLMULQDQZ256", VR256X, i256mem>;
12300
12300
// VBMI2
12301
12301
//===----------------------------------------------------------------------===//
12302
12302
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,
12304
12304
X86FoldableSchedWrite sched, X86VectorVTInfo VTI> {
12305
12305
let Constraints = "$src1 = $dst",
12306
12306
ExeDomain = VTI.ExeDomain in {
12307
12307
defm r: AVX512_maskable_3src<Op, MRMSrcReg, VTI, (outs VTI.RC:$dst),
12308
12308
(ins VTI.RC:$src2, VTI.RC:$src3), OpStr,
12309
12309
"$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))))>,
12311
12313
T8, PD, EVEX, VVVV, Sched<[sched]>;
12312
12314
defm m: AVX512_maskable_3src<Op, MRMSrcMem, VTI, (outs VTI.RC:$dst),
12313
12315
(ins VTI.RC:$src2, VTI.MemOp:$src3), OpStr,
12314
12316
"$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)))))>,
12317
12320
T8, PD, EVEX, VVVV,
12318
12321
Sched<[sched.Folded, sched.ReadAfterFold]>;
12319
12322
}
12320
12323
}
12321
12324
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,
12323
12326
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> {
12325
12328
let Constraints = "$src1 = $dst",
12326
12329
ExeDomain = VTI.ExeDomain in
12327
12330
defm mb: AVX512_maskable_3src<Op, MRMSrcMem, VTI, (outs VTI.RC:$dst),
12328
12331
(ins VTI.RC:$src2, VTI.ScalarMemOp:$src3), OpStr,
12329
12332
"${src3}"#VTI.BroadcastStr#", $src2",
12330
12333
"$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))))>,
12333
12337
T8, PD, EVEX, VVVV, EVEX_B,
12334
12338
Sched<[sched.Folded, sched.ReadAfterFold]>;
12335
12339
}
12336
12340
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,
12338
12342
X86SchedWriteWidths sched, AVX512VLVectorVTInfo VTI> {
12339
12343
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>,
12341
12345
EVEX_V512;
12342
12346
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>,
12344
12348
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>,
12346
12350
EVEX_V128;
12347
12351
}
12348
12352
}
12349
12353
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,
12351
12355
X86SchedWriteWidths sched, AVX512VLVectorVTInfo VTI> {
12352
12356
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>,
12354
12358
EVEX_V512;
12355
12359
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>,
12357
12361
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>,
12359
12363
EVEX_V128;
12360
12364
}
12361
12365
}
12362
12366
multiclass 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,
12365
12369
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,
12367
12371
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,
12369
12373
avx512vl_i64_info>, REX_W, EVEX_CD8<64, CD8VF>;
12370
12374
}
12371
12375
@@ -12381,8 +12385,8 @@ multiclass VBMI2_shift_imm<bits<8> wOp, bits<8> dqOp, string Prefix,
12381
12385
}
12382
12386
12383
12387
// 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>;
12386
12390
defm VPSHLD : VBMI2_shift_imm<0x70, 0x71, "vpshld", X86VShld, SchedWriteVecIMul>;
12387
12391
defm VPSHRD : VBMI2_shift_imm<0x72, 0x73, "vpshrd", X86VShrd, SchedWriteVecIMul>;
12388
12392
0 commit comments