@@ -3249,6 +3249,7 @@ defm : mask_shift_lowering<VK2, v2i1>, Requires<[HasAVX512]>;
3249
3249
3250
3250
multiclass avx512_load<bits<8> opc, string OpcodeStr, X86VectorVTInfo _,
3251
3251
PatFrag ld_frag, PatFrag mload,
3252
+ bit NoRMPattern = 0,
3252
3253
SDPatternOperator SelectOprr = vselect> {
3253
3254
let hasSideEffects = 0 in {
3254
3255
def rr : AVX512PI<opc, MRMSrcReg, (outs _.RC:$dst), (ins _.RC:$src),
@@ -3263,11 +3264,13 @@ multiclass avx512_load<bits<8> opc, string OpcodeStr, X86VectorVTInfo _,
3263
3264
_.ImmAllZerosV)))], _.ExeDomain>,
3264
3265
EVEX, EVEX_KZ;
3265
3266
3266
- let canFoldAsLoad = 1, isReMaterializable = 1,
3267
+ let mayLoad = 1, canFoldAsLoad = 1, isReMaterializable = 1,
3267
3268
SchedRW = [WriteLoad] in
3268
3269
def rm : AVX512PI<opc, MRMSrcMem, (outs _.RC:$dst), (ins _.MemOp:$src),
3269
3270
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
3270
- [(set _.RC:$dst, (_.VT (bitconvert (ld_frag addr:$src))))],
3271
+ !if(NoRMPattern, [],
3272
+ [(set _.RC:$dst,
3273
+ (_.VT (bitconvert (ld_frag addr:$src))))]),
3271
3274
_.ExeDomain>, EVEX;
3272
3275
3273
3276
let Constraints = "$src0 = $dst", isConvertibleToThreeAddress = 1 in {
@@ -3327,16 +3330,20 @@ multiclass avx512_alignedload_vl<bits<8> opc, string OpcodeStr,
3327
3330
multiclass avx512_load_vl<bits<8> opc, string OpcodeStr,
3328
3331
AVX512VLVectorVTInfo _,
3329
3332
Predicate prd,
3333
+ bit NoRMPattern = 0,
3330
3334
SDPatternOperator SelectOprr = vselect> {
3331
3335
let Predicates = [prd] in
3332
3336
defm Z : avx512_load<opc, OpcodeStr, _.info512, _.info512.LdFrag,
3333
- masked_load_unaligned, SelectOprr>, EVEX_V512;
3337
+ masked_load_unaligned, NoRMPattern,
3338
+ SelectOprr>, EVEX_V512;
3334
3339
3335
3340
let Predicates = [prd, HasVLX] in {
3336
3341
defm Z256 : avx512_load<opc, OpcodeStr, _.info256, _.info256.LdFrag,
3337
- masked_load_unaligned, SelectOprr>, EVEX_V256;
3342
+ masked_load_unaligned, NoRMPattern,
3343
+ SelectOprr>, EVEX_V256;
3338
3344
defm Z128 : avx512_load<opc, OpcodeStr, _.info128, _.info128.LdFrag,
3339
- masked_load_unaligned, SelectOprr>, EVEX_V128;
3345
+ masked_load_unaligned, NoRMPattern,
3346
+ SelectOprr>, EVEX_V128;
3340
3347
}
3341
3348
}
3342
3349
@@ -3416,13 +3423,13 @@ defm VMOVAPD : avx512_alignedload_vl<0x28, "vmovapd", avx512vl_f64_info,
3416
3423
PD, VEX_W, EVEX_CD8<64, CD8VF>;
3417
3424
3418
3425
defm VMOVUPS : avx512_load_vl<0x10, "vmovups", avx512vl_f32_info, HasAVX512,
3419
- null_frag>,
3426
+ 0, null_frag>,
3420
3427
avx512_store_vl<0x11, "vmovups", avx512vl_f32_info, HasAVX512,
3421
3428
"VMOVUPS">,
3422
3429
PS, EVEX_CD8<32, CD8VF>;
3423
3430
3424
3431
defm VMOVUPD : avx512_load_vl<0x10, "vmovupd", avx512vl_f64_info, HasAVX512,
3425
- null_frag>,
3432
+ 0, null_frag>,
3426
3433
avx512_store_vl<0x11, "vmovupd", avx512vl_f64_info, HasAVX512,
3427
3434
"VMOVUPD">,
3428
3435
PD, VEX_W, EVEX_CD8<64, CD8VF>;
@@ -3439,24 +3446,24 @@ defm VMOVDQA64 : avx512_alignedload_vl<0x6F, "vmovdqa64", avx512vl_i64_info,
3439
3446
HasAVX512, "VMOVDQA64">,
3440
3447
PD, VEX_W, EVEX_CD8<64, CD8VF>;
3441
3448
3442
- defm VMOVDQU8 : avx512_load_vl<0x6F, "vmovdqu8", avx512vl_i8_info, HasBWI>,
3449
+ defm VMOVDQU8 : avx512_load_vl<0x6F, "vmovdqu8", avx512vl_i8_info, HasBWI, 1 >,
3443
3450
avx512_store_vl<0x7F, "vmovdqu8", avx512vl_i8_info,
3444
3451
HasBWI, "VMOVDQU8">,
3445
3452
XD, EVEX_CD8<8, CD8VF>;
3446
3453
3447
- defm VMOVDQU16 : avx512_load_vl<0x6F, "vmovdqu16", avx512vl_i16_info, HasBWI>,
3454
+ defm VMOVDQU16 : avx512_load_vl<0x6F, "vmovdqu16", avx512vl_i16_info, HasBWI, 1 >,
3448
3455
avx512_store_vl<0x7F, "vmovdqu16", avx512vl_i16_info,
3449
3456
HasBWI, "VMOVDQU16">,
3450
3457
XD, VEX_W, EVEX_CD8<16, CD8VF>;
3451
3458
3452
3459
defm VMOVDQU32 : avx512_load_vl<0x6F, "vmovdqu32", avx512vl_i32_info, HasAVX512,
3453
- null_frag>,
3460
+ 0, null_frag>,
3454
3461
avx512_store_vl<0x7F, "vmovdqu32", avx512vl_i32_info,
3455
3462
HasAVX512, "VMOVDQU32">,
3456
3463
XS, EVEX_CD8<32, CD8VF>;
3457
3464
3458
3465
defm VMOVDQU64 : avx512_load_vl<0x6F, "vmovdqu64", avx512vl_i64_info, HasAVX512,
3459
- null_frag>,
3466
+ 0, null_frag>,
3460
3467
avx512_store_vl<0x7F, "vmovdqu64", avx512vl_i64_info,
3461
3468
HasAVX512, "VMOVDQU64">,
3462
3469
XS, VEX_W, EVEX_CD8<64, CD8VF>;
0 commit comments