@@ -11436,6 +11436,102 @@ defm VPTERNLOGD : avx512_common_ternlog<"vpternlogd", SchedWriteVecALU,
11436
11436
defm VPTERNLOGQ : avx512_common_ternlog<"vpternlogq", SchedWriteVecALU,
11437
11437
avx512vl_i64_info>, VEX_W;
11438
11438
11439
+ // Patterns to fold bitcasted FP broadcasts.
11440
+ // FIXME: Need better DAG canonicalization.
11441
+ let Predicates = [HasVLX] in {
11442
+ def : Pat<(X86vpternlog VR128X:$src1, VR128X:$src2,
11443
+ (bc_v4i32 (v4f32 (X86VBroadcast (loadf32 addr:$src3)))),
11444
+ (i8 timm:$src4)),
11445
+ (VPTERNLOGDZ128rmbi VR128X:$src1, VR128X:$src2, addr:$src3,
11446
+ timm:$src4)>;
11447
+ def : Pat<(X86vpternlog (bc_v4i32 (v4f32 (X86VBroadcast (loadf32 addr:$src3)))),
11448
+ VR128X:$src2, VR128X:$src1, (i8 timm:$src4)),
11449
+ (VPTERNLOGDZ128rmbi VR128X:$src1, VR128X:$src2, addr:$src3,
11450
+ (VPTERNLOG321_imm8 timm:$src4))>;
11451
+ def : Pat<(X86vpternlog VR128X:$src1,
11452
+ (bc_v4i32 (v4f32 (X86VBroadcast (loadf32 addr:$src3)))),
11453
+ VR128X:$src2, (i8 timm:$src4)),
11454
+ (VPTERNLOGDZ128rmbi VR128X:$src1, VR128X:$src2, addr:$src3,
11455
+ (VPTERNLOG132_imm8 timm:$src4))>;
11456
+
11457
+ def : Pat<(X86vpternlog VR128X:$src1, VR128X:$src2,
11458
+ (bc_v2i64 (v2f64 (X86VBroadcast (loadf64 addr:$src3)))),
11459
+ (i8 timm:$src4)),
11460
+ (VPTERNLOGQZ128rmbi VR128X:$src1, VR128X:$src2, addr:$src3,
11461
+ timm:$src4)>;
11462
+ def : Pat<(X86vpternlog (bc_v2i64 (v2f64 (X86VBroadcast (loadf64 addr:$src3)))),
11463
+ VR128X:$src2, VR128X:$src1, (i8 timm:$src4)),
11464
+ (VPTERNLOGQZ128rmbi VR128X:$src1, VR128X:$src2, addr:$src3,
11465
+ (VPTERNLOG321_imm8 timm:$src4))>;
11466
+ def : Pat<(X86vpternlog VR128X:$src1,
11467
+ (bc_v2i64 (v2f64 (X86VBroadcast (loadf64 addr:$src3)))),
11468
+ VR128X:$src2, (i8 timm:$src4)),
11469
+ (VPTERNLOGQZ128rmbi VR128X:$src1, VR128X:$src2, addr:$src3,
11470
+ (VPTERNLOG132_imm8 timm:$src4))>;
11471
+
11472
+ def : Pat<(X86vpternlog VR256X:$src1, VR256X:$src2,
11473
+ (bc_v8i32 (v8f32 (X86VBroadcast (loadf32 addr:$src3)))),
11474
+ (i8 timm:$src4)),
11475
+ (VPTERNLOGDZ256rmbi VR256X:$src1, VR256X:$src2, addr:$src3,
11476
+ timm:$src4)>;
11477
+ def : Pat<(X86vpternlog (bc_v8i32 (v8f32 (X86VBroadcast (loadf32 addr:$src3)))),
11478
+ VR256X:$src2, VR256X:$src1, (i8 timm:$src4)),
11479
+ (VPTERNLOGDZ256rmbi VR256X:$src1, VR256X:$src2, addr:$src3,
11480
+ (VPTERNLOG321_imm8 timm:$src4))>;
11481
+ def : Pat<(X86vpternlog VR256X:$src1,
11482
+ (bc_v8i32 (v8f32 (X86VBroadcast (loadf32 addr:$src3)))),
11483
+ VR256X:$src2, (i8 timm:$src4)),
11484
+ (VPTERNLOGDZ256rmbi VR256X:$src1, VR256X:$src2, addr:$src3,
11485
+ (VPTERNLOG132_imm8 timm:$src4))>;
11486
+
11487
+ def : Pat<(X86vpternlog VR256X:$src1, VR256X:$src2,
11488
+ (bc_v4i64 (v4f64 (X86VBroadcast (loadf64 addr:$src3)))),
11489
+ (i8 timm:$src4)),
11490
+ (VPTERNLOGQZ256rmbi VR256X:$src1, VR256X:$src2, addr:$src3,
11491
+ timm:$src4)>;
11492
+ def : Pat<(X86vpternlog (bc_v4i64 (v4f64 (X86VBroadcast (loadf64 addr:$src3)))),
11493
+ VR256X:$src2, VR256X:$src1, (i8 timm:$src4)),
11494
+ (VPTERNLOGQZ256rmbi VR256X:$src1, VR256X:$src2, addr:$src3,
11495
+ (VPTERNLOG321_imm8 timm:$src4))>;
11496
+ def : Pat<(X86vpternlog VR256X:$src1,
11497
+ (bc_v4i64 (v4f64 (X86VBroadcast (loadf64 addr:$src3)))),
11498
+ VR256X:$src2, (i8 timm:$src4)),
11499
+ (VPTERNLOGQZ256rmbi VR256X:$src1, VR256X:$src2, addr:$src3,
11500
+ (VPTERNLOG132_imm8 timm:$src4))>;
11501
+ }
11502
+
11503
+ let Predicates = [HasAVX512] in {
11504
+ def : Pat<(X86vpternlog VR512:$src1, VR512:$src2,
11505
+ (bc_v16i32 (v16f32 (X86VBroadcast (loadf32 addr:$src3)))),
11506
+ (i8 timm:$src4)),
11507
+ (VPTERNLOGDZrmbi VR512:$src1, VR512:$src2, addr:$src3,
11508
+ timm:$src4)>;
11509
+ def : Pat<(X86vpternlog (bc_v16i32 (v16f32 (X86VBroadcast (loadf32 addr:$src3)))),
11510
+ VR512:$src2, VR512:$src1, (i8 timm:$src4)),
11511
+ (VPTERNLOGDZrmbi VR512:$src1, VR512:$src2, addr:$src3,
11512
+ (VPTERNLOG321_imm8 timm:$src4))>;
11513
+ def : Pat<(X86vpternlog VR512:$src1,
11514
+ (bc_v16i32 (v16f32 (X86VBroadcast (loadf32 addr:$src3)))),
11515
+ VR512:$src2, (i8 timm:$src4)),
11516
+ (VPTERNLOGDZrmbi VR512:$src1, VR512:$src2, addr:$src3,
11517
+ (VPTERNLOG132_imm8 timm:$src4))>;
11518
+
11519
+ def : Pat<(X86vpternlog VR512:$src1, VR512:$src2,
11520
+ (bc_v8i64 (v8f64 (X86VBroadcast (loadf64 addr:$src3)))),
11521
+ (i8 timm:$src4)),
11522
+ (VPTERNLOGQZrmbi VR512:$src1, VR512:$src2, addr:$src3,
11523
+ timm:$src4)>;
11524
+ def : Pat<(X86vpternlog (bc_v8i64 (v8f64 (X86VBroadcast (loadf64 addr:$src3)))),
11525
+ VR512:$src2, VR512:$src1, (i8 timm:$src4)),
11526
+ (VPTERNLOGQZrmbi VR512:$src1, VR512:$src2, addr:$src3,
11527
+ (VPTERNLOG321_imm8 timm:$src4))>;
11528
+ def : Pat<(X86vpternlog VR512:$src1,
11529
+ (bc_v8i64 (v8f64 (X86VBroadcast (loadf64 addr:$src3)))),
11530
+ VR512:$src2, (i8 timm:$src4)),
11531
+ (VPTERNLOGQZrmbi VR512:$src1, VR512:$src2, addr:$src3,
11532
+ (VPTERNLOG132_imm8 timm:$src4))>;
11533
+ }
11534
+
11439
11535
// Patterns to use VPTERNLOG for vXi16/vXi8 vectors.
11440
11536
let Predicates = [HasVLX] in {
11441
11537
def : Pat<(v16i8 (X86vpternlog VR128X:$src1, VR128X:$src2, VR128X:$src3,
0 commit comments