@@ -162,6 +162,9 @@ class SchedBinaryMC<string write, string read0, string read1,
162
162
class SchedTernary<string write, string read0, string read1, string read2,
163
163
string mx, int sew = 0, bit forceMasked = 0>:
164
164
SchedNary<write, [read0, read1, read2], mx, sew, forceMasked>;
165
+ class SchedTernaryMC<string write, string read0, string read1, string read2,
166
+ int sew = 0, bit forceMasked = 1>:
167
+ SchedNary<write, [read0, read1, read2], "WorstCase", sew, forceMasked>;
165
168
166
169
// For reduction instructions.
167
170
class SchedReduction<string write, string read, string mx, int sew>:
@@ -438,10 +441,14 @@ class VALUmVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
438
441
}
439
442
440
443
// op vd, vs1, vs2, vm (reverse the order of vs1 and vs2)
441
- class VALUrVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
442
- : RVInstVV<funct6, opv, (outs VR:$vd),
443
- (ins VR:$vs1, VR:$vs2, VMaskOp:$vm),
444
- opcodestr, "$vd, $vs1, $vs2$vm">;
444
+ class VALUrVV<bits<6> funct6, RISCVVFormat opv, string opcodestr,
445
+ bit EarlyClobber = 0>
446
+ : RVInstVV<funct6, opv, (outs VR:$vd_wb),
447
+ (ins VR:$vd, VR:$vs1, VR:$vs2, VMaskOp:$vm),
448
+ opcodestr, "$vd, $vs1, $vs2$vm"> {
449
+ let Constraints = !if(EarlyClobber, "@earlyclobber $vd_wb, $vd = $vd_wb",
450
+ "$vd = $vd_wb");
451
+ }
445
452
446
453
// op vd, vs2, vs1
447
454
class VALUVVNoVm<bits<6> funct6, RISCVVFormat opv, string opcodestr>
@@ -466,10 +473,14 @@ class VALUmVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
466
473
}
467
474
468
475
// op vd, rs1, vs2, vm (reverse the order of rs1 and vs2)
469
- class VALUrVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
470
- : RVInstVX<funct6, opv, (outs VR:$vd),
471
- (ins GPR:$rs1, VR:$vs2, VMaskOp:$vm),
472
- opcodestr, "$vd, $rs1, $vs2$vm">;
476
+ class VALUrVX<bits<6> funct6, RISCVVFormat opv, string opcodestr,
477
+ bit EarlyClobber = 0>
478
+ : RVInstVX<funct6, opv, (outs VR:$vd_wb),
479
+ (ins VR:$vd, GPR:$rs1, VR:$vs2, VMaskOp:$vm),
480
+ opcodestr, "$vd, $rs1, $vs2$vm"> {
481
+ let Constraints = !if(EarlyClobber, "@earlyclobber $vd_wb, $vd = $vd_wb",
482
+ "$vd = $vd_wb");
483
+ }
473
484
474
485
// op vd, vs1, vs2
475
486
class VALUVXNoVm<bits<6> funct6, RISCVVFormat opv, string opcodestr>
@@ -508,10 +519,14 @@ class VALUVF<bits<6> funct6, RISCVVFormat opv, string opcodestr>
508
519
opcodestr, "$vd, $vs2, $rs1$vm">;
509
520
510
521
// op vd, rs1, vs2, vm (Float) (with mask, reverse the order of rs1 and vs2)
511
- class VALUrVF<bits<6> funct6, RISCVVFormat opv, string opcodestr>
512
- : RVInstVX<funct6, opv, (outs VR:$vd),
513
- (ins FPR32:$rs1, VR:$vs2, VMaskOp:$vm),
514
- opcodestr, "$vd, $rs1, $vs2$vm">;
522
+ class VALUrVF<bits<6> funct6, RISCVVFormat opv, string opcodestr,
523
+ bit EarlyClobber = 0>
524
+ : RVInstVX<funct6, opv, (outs VR:$vd_wb),
525
+ (ins VR:$vd, FPR32:$rs1, VR:$vs2, VMaskOp:$vm),
526
+ opcodestr, "$vd, $rs1, $vs2$vm"> {
527
+ let Constraints = !if(EarlyClobber, "@earlyclobber $vd_wb, $vd = $vd_wb",
528
+ "$vd = $vd_wb");
529
+ }
515
530
516
531
// op vd, vs2, vm (use vs1 as instruction encoding)
517
532
class VALUVs2<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr>
@@ -590,20 +605,26 @@ multiclass VALU_MV_V_X<string opcodestr, bits<6> funct6, string vw> {
590
605
591
606
multiclass VMAC_MV_V_X<string opcodestr, bits<6> funct6> {
592
607
def V : VALUrVV<funct6, OPMVV, opcodestr # ".vv">,
593
- SchedBinaryMC<"WriteVIMulAddV", "ReadVIMulAddV", "ReadVIMulAddV">;
608
+ SchedTernaryMC<"WriteVIMulAddV", "ReadVIMulAddV", "ReadVIMulAddV",
609
+ "ReadVIMulAddV">;
594
610
def X : VALUrVX<funct6, OPMVX, opcodestr # ".vx">,
595
- SchedBinaryMC<"WriteVIMulAddX", "ReadVIMulAddV", "ReadVIMulAddX">;
611
+ SchedTernaryMC<"WriteVIMulAddX", "ReadVIMulAddV", "ReadVIMulAddX",
612
+ "ReadVIMulAddV">;
596
613
}
597
614
598
615
multiclass VWMAC_MV_X<string opcodestr, bits<6> funct6> {
616
+ let RVVConstraint = WidenV in
599
617
def X : VALUrVX<funct6, OPMVX, opcodestr # ".vx">,
600
- SchedBinaryMC<"WriteVIWMulAddX", "ReadVIWMulAddV", "ReadVIWMulAddX">;
618
+ SchedTernaryMC<"WriteVIWMulAddX", "ReadVIWMulAddV", "ReadVIWMulAddX",
619
+ "ReadVIWMulAddV">;
601
620
}
602
621
603
622
multiclass VWMAC_MV_V_X<string opcodestr, bits<6> funct6>
604
623
: VWMAC_MV_X<opcodestr, funct6> {
605
- def V : VALUrVV<funct6, OPMVV, opcodestr # ".vv">,
606
- SchedBinaryMC<"WriteVIWMulAddV", "ReadVIWMulAddV", "ReadVIWMulAddV">;
624
+ let RVVConstraint = WidenV in
625
+ def V : VALUrVV<funct6, OPMVV, opcodestr # ".vv", /*EarlyClobber*/1>,
626
+ SchedTernaryMC<"WriteVIWMulAddV", "ReadVIWMulAddV", "ReadVIWMulAddV",
627
+ "ReadVIWMulAddV">;
607
628
}
608
629
609
630
multiclass VALU_MV_VS2<string opcodestr, bits<6> funct6, bits<5> vs1> {
@@ -693,16 +714,22 @@ multiclass VWMUL_FV_V_F<string opcodestr, bits<6> funct6> {
693
714
694
715
multiclass VMAC_FV_V_F<string opcodestr, bits<6> funct6> {
695
716
def V : VALUrVV<funct6, OPFVV, opcodestr # ".vv">,
696
- SchedBinaryMC<"WriteVFMulAddV", "ReadVFMulAddV", "ReadVFMulAddV">;
717
+ SchedTernaryMC<"WriteVFMulAddV", "ReadVFMulAddV", "ReadVFMulAddV",
718
+ "ReadVFMulAddV">;
697
719
def F : VALUrVF<funct6, OPFVF, opcodestr # ".vf">,
698
- SchedBinaryMC<"WriteVFMulAddF", "ReadVFMulAddV", "ReadVFMulAddF">;
720
+ SchedTernaryMC<"WriteVFMulAddF", "ReadVFMulAddV", "ReadVFMulAddF",
721
+ "ReadVFMulAddV">;
699
722
}
700
723
701
724
multiclass VWMAC_FV_V_F<string opcodestr, bits<6> funct6> {
702
- def V : VALUrVV<funct6, OPFVV, opcodestr # ".vv">,
703
- SchedBinaryMC<"WriteVFWMulAddV", "ReadVFWMulAddV", "ReadVFWMulAddV">;
704
- def F : VALUrVF<funct6, OPFVF, opcodestr # ".vf">,
705
- SchedBinaryMC<"WriteVFWMulAddF", "ReadVFWMulAddV", "ReadVFWMulAddF">;
725
+ let RVVConstraint = WidenV in {
726
+ def V : VALUrVV<funct6, OPFVV, opcodestr # ".vv", /*EarlyClobber*/1>,
727
+ SchedTernaryMC<"WriteVFWMulAddV", "ReadVFWMulAddV", "ReadVFWMulAddV",
728
+ "ReadVFWMulAddV">;
729
+ def F : VALUrVF<funct6, OPFVF, opcodestr # ".vf", /*EarlyClobber*/1>,
730
+ SchedTernaryMC<"WriteVFWMulAddF", "ReadVFWMulAddV", "ReadVFWMulAddF",
731
+ "ReadVFWMulAddV">;
732
+ }
706
733
}
707
734
708
735
multiclass VSQR_FV_VS2<string opcodestr, bits<6> funct6, bits<5> vs1> {
@@ -1289,12 +1316,10 @@ defm VMADD_V : VMAC_MV_V_X<"vmadd", 0b101001>;
1289
1316
defm VNMSUB_V : VMAC_MV_V_X<"vnmsub", 0b101011>;
1290
1317
1291
1318
// Vector Widening Integer Multiply-Add Instructions
1292
- let Constraints = "@earlyclobber $vd", RVVConstraint = WidenV in {
1293
1319
defm VWMACCU_V : VWMAC_MV_V_X<"vwmaccu", 0b111100>;
1294
1320
defm VWMACC_V : VWMAC_MV_V_X<"vwmacc", 0b111101>;
1295
1321
defm VWMACCSU_V : VWMAC_MV_V_X<"vwmaccsu", 0b111111>;
1296
1322
defm VWMACCUS_V : VWMAC_MV_X<"vwmaccus", 0b111110>;
1297
- } // Constraints = "@earlyclobber $vd", RVVConstraint = WidenV
1298
1323
1299
1324
// Vector Integer Merge Instructions
1300
1325
defm VMERGE_V : VMRG_IV_V_X_I<"vmerge", 0b010111>;
@@ -1394,8 +1419,7 @@ defm VFNMSUB_V : VMAC_FV_V_F<"vfnmsub", 0b101011>;
1394
1419
}
1395
1420
1396
1421
// Vector Widening Floating-Point Fused Multiply-Add Instructions
1397
- let Constraints = "@earlyclobber $vd", RVVConstraint = WidenV,
1398
- Uses = [FRM], mayRaiseFPException = true in {
1422
+ let Uses = [FRM], mayRaiseFPException = true in {
1399
1423
defm VFWMACC_V : VWMAC_FV_V_F<"vfwmacc", 0b111100>;
1400
1424
defm VFWNMACC_V : VWMAC_FV_V_F<"vfwnmacc", 0b111101>;
1401
1425
defm VFWMSAC_V : VWMAC_FV_V_F<"vfwmsac", 0b111110>;
0 commit comments