[RISCV] Split Widening convert to FP pseudos by SEW
This commit is contained in:
@@ -17642,8 +17642,7 @@ static MachineBasicBlock *emitSelectPseudo(MachineInstr &MI,
|
||||
|
||||
static MachineBasicBlock *emitVFROUND_NOEXCEPT_MASK(MachineInstr &MI,
|
||||
MachineBasicBlock *BB,
|
||||
unsigned CVTXOpc,
|
||||
unsigned CVTFOpc) {
|
||||
unsigned CVTXOpc) {
|
||||
DebugLoc DL = MI.getDebugLoc();
|
||||
|
||||
const TargetInstrInfo &TII = *BB->getParent()->getSubtarget().getInstrInfo();
|
||||
@@ -17674,6 +17673,85 @@ static MachineBasicBlock *emitVFROUND_NOEXCEPT_MASK(MachineInstr &MI,
|
||||
/*IsImp*/ true));
|
||||
|
||||
// Emit a VFCVT_F_X
|
||||
RISCVII::VLMUL LMul = RISCVII::getLMul(MI.getDesc().TSFlags);
|
||||
unsigned Log2SEW = MI.getOperand(RISCVII::getSEWOpNum(MI.getDesc())).getImm();
|
||||
// There is no E8 variant for VFCVT_F_X.
|
||||
assert(Log2SEW >= 4);
|
||||
// Since MI (VFROUND) isn't SEW specific, we cannot use a macro to make
|
||||
// handling of different (LMUL, SEW) pairs easier because we need to pull the
|
||||
// SEW immediate from MI, and that information is not avaliable during macro
|
||||
// expansion.
|
||||
unsigned CVTFOpc;
|
||||
if (Log2SEW == 4) {
|
||||
switch (LMul) {
|
||||
case RISCVII::LMUL_1:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M1_E16_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_2:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M2_E16_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_4:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M4_E16_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_8:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M8_E16_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_F2:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_MF2_E16_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_F4:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_MF4_E16_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_F8:
|
||||
case RISCVII::LMUL_RESERVED:
|
||||
llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
|
||||
}
|
||||
} else if (Log2SEW == 5) {
|
||||
switch (LMul) {
|
||||
case RISCVII::LMUL_1:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M1_E32_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_2:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M2_E32_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_4:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M4_E32_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_8:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M8_E32_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_F2:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_MF2_E32_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_F4:
|
||||
case RISCVII::LMUL_F8:
|
||||
case RISCVII::LMUL_RESERVED:
|
||||
llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
|
||||
}
|
||||
} else if (Log2SEW == 6) {
|
||||
switch (LMul) {
|
||||
case RISCVII::LMUL_1:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M1_E64_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_2:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M2_E64_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_4:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M4_E64_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_8:
|
||||
CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M8_E64_MASK;
|
||||
break;
|
||||
case RISCVII::LMUL_F2:
|
||||
case RISCVII::LMUL_F4:
|
||||
case RISCVII::LMUL_F8:
|
||||
case RISCVII::LMUL_RESERVED:
|
||||
llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
|
||||
}
|
||||
} else {
|
||||
llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
|
||||
}
|
||||
|
||||
BuildMI(*BB, MI, DL, TII.get(CVTFOpc))
|
||||
.add(MI.getOperand(0))
|
||||
.add(MI.getOperand(1))
|
||||
@@ -17883,23 +17961,17 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
|
||||
Subtarget);
|
||||
|
||||
case RISCV::PseudoVFROUND_NOEXCEPT_V_M1_MASK:
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M1_MASK,
|
||||
RISCV::PseudoVFCVT_F_X_V_M1_MASK);
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M1_MASK);
|
||||
case RISCV::PseudoVFROUND_NOEXCEPT_V_M2_MASK:
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M2_MASK,
|
||||
RISCV::PseudoVFCVT_F_X_V_M2_MASK);
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M2_MASK);
|
||||
case RISCV::PseudoVFROUND_NOEXCEPT_V_M4_MASK:
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M4_MASK,
|
||||
RISCV::PseudoVFCVT_F_X_V_M4_MASK);
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M4_MASK);
|
||||
case RISCV::PseudoVFROUND_NOEXCEPT_V_M8_MASK:
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M8_MASK,
|
||||
RISCV::PseudoVFCVT_F_X_V_M8_MASK);
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M8_MASK);
|
||||
case RISCV::PseudoVFROUND_NOEXCEPT_V_MF2_MASK:
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_MF2_MASK,
|
||||
RISCV::PseudoVFCVT_F_X_V_MF2_MASK);
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_MF2_MASK);
|
||||
case RISCV::PseudoVFROUND_NOEXCEPT_V_MF4_MASK:
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_MF4_MASK,
|
||||
RISCV::PseudoVFCVT_F_X_V_MF4_MASK);
|
||||
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_MF4_MASK);
|
||||
case RISCV::PseudoFROUND_H:
|
||||
case RISCV::PseudoFROUND_H_INX:
|
||||
case RISCV::PseudoFROUND_S:
|
||||
|
||||
@@ -3580,12 +3580,14 @@ multiclass VPseudoConversion<VReg RetClass,
|
||||
VReg Op1Class,
|
||||
LMULInfo MInfo,
|
||||
string Constraint = "",
|
||||
int sew = 0,
|
||||
int TargetConstraintType = 1> {
|
||||
defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX);
|
||||
let VLMul = MInfo.value in {
|
||||
def "_" # MInfo.MX : VPseudoUnaryNoMask<RetClass, Op1Class, Constraint, TargetConstraintType>;
|
||||
def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask<RetClass, Op1Class,
|
||||
Constraint, TargetConstraintType>,
|
||||
RISCVMaskedPseudo<MaskIdx=2>;
|
||||
def suffix : VPseudoUnaryNoMask<RetClass, Op1Class, Constraint, TargetConstraintType>;
|
||||
def suffix # "_MASK" : VPseudoUnaryMask<RetClass, Op1Class,
|
||||
Constraint, TargetConstraintType>,
|
||||
RISCVMaskedPseudo<MaskIdx=2>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3711,18 +3713,22 @@ multiclass VPseudoVWCVTI_RM_V {
|
||||
multiclass VPseudoVWCVTF_V {
|
||||
defvar constraint = "@earlyclobber $rd";
|
||||
foreach m = MxListW in {
|
||||
defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, TargetConstraintType=3>,
|
||||
SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX,
|
||||
forceMergeOpRead=true>;
|
||||
foreach e = SchedSEWSet<m.MX, isF=0, isWidening=1>.val in
|
||||
defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, sew=e,
|
||||
TargetConstraintType=3>,
|
||||
SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX, e,
|
||||
forceMergeOpRead=true>;
|
||||
}
|
||||
}
|
||||
|
||||
multiclass VPseudoVWCVTD_V {
|
||||
defvar constraint = "@earlyclobber $rd";
|
||||
foreach m = MxListFW in {
|
||||
defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, TargetConstraintType=3>,
|
||||
SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX,
|
||||
forceMergeOpRead=true>;
|
||||
foreach e = SchedSEWSet<m.MX, isF=1, isWidening=1>.val in
|
||||
defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, sew=e,
|
||||
TargetConstraintType=3>,
|
||||
SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX, e,
|
||||
forceMergeOpRead=true>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4896,14 +4902,17 @@ multiclass VPatConversionTA<string intrinsic,
|
||||
ValueType result_type,
|
||||
ValueType op1_type,
|
||||
ValueType mask_type,
|
||||
int sew,
|
||||
int log2sew,
|
||||
LMULInfo vlmul,
|
||||
VReg result_reg_class,
|
||||
VReg op1_reg_class> {
|
||||
VReg op1_reg_class,
|
||||
bit isSEWAware = 0> {
|
||||
def : VPatUnaryNoMask<intrinsic, inst, kind, result_type, op1_type,
|
||||
sew, vlmul, result_reg_class, op1_reg_class>;
|
||||
log2sew, vlmul, result_reg_class, op1_reg_class,
|
||||
isSEWAware>;
|
||||
def : VPatUnaryMask<intrinsic, inst, kind, result_type, op1_type,
|
||||
mask_type, sew, vlmul, result_reg_class, op1_reg_class>;
|
||||
mask_type, log2sew, vlmul, result_reg_class, op1_reg_class,
|
||||
isSEWAware>;
|
||||
}
|
||||
|
||||
multiclass VPatConversionTARoundingMode<string intrinsic,
|
||||
@@ -5952,7 +5961,8 @@ multiclass VPatConversionWI_VF_RM<string intrinsic, string instruction> {
|
||||
}
|
||||
}
|
||||
|
||||
multiclass VPatConversionWF_VI<string intrinsic, string instruction> {
|
||||
multiclass VPatConversionWF_VI<string intrinsic, string instruction,
|
||||
bit isSEWAware = 0> {
|
||||
foreach vtiToWti = AllWidenableIntToFloatVectors in {
|
||||
defvar vti = vtiToWti.Vti;
|
||||
defvar fwti = vtiToWti.Wti;
|
||||
@@ -5960,11 +5970,12 @@ multiclass VPatConversionWF_VI<string intrinsic, string instruction> {
|
||||
GetVTypePredicates<fwti>.Predicates) in
|
||||
defm : VPatConversionTA<intrinsic, instruction, "V",
|
||||
fwti.Vector, vti.Vector, fwti.Mask, vti.Log2SEW,
|
||||
vti.LMul, fwti.RegClass, vti.RegClass>;
|
||||
vti.LMul, fwti.RegClass, vti.RegClass, isSEWAware>;
|
||||
}
|
||||
}
|
||||
|
||||
multiclass VPatConversionWF_VF<string intrinsic, string instruction> {
|
||||
multiclass VPatConversionWF_VF<string intrinsic, string instruction,
|
||||
bit isSEWAware = 0> {
|
||||
foreach fvtiToFWti = AllWidenableFloatVectors in {
|
||||
defvar fvti = fvtiToFWti.Vti;
|
||||
defvar fwti = fvtiToFWti.Wti;
|
||||
@@ -5974,11 +5985,12 @@ multiclass VPatConversionWF_VF<string intrinsic, string instruction> {
|
||||
GetVTypePredicates<fwti>.Predicates)) in
|
||||
defm : VPatConversionTA<intrinsic, instruction, "V",
|
||||
fwti.Vector, fvti.Vector, fwti.Mask, fvti.Log2SEW,
|
||||
fvti.LMul, fwti.RegClass, fvti.RegClass>;
|
||||
fvti.LMul, fwti.RegClass, fvti.RegClass, isSEWAware>;
|
||||
}
|
||||
}
|
||||
|
||||
multiclass VPatConversionWF_VF_BF <string intrinsic, string instruction> {
|
||||
multiclass VPatConversionWF_VF_BF <string intrinsic, string instruction,
|
||||
bit isSEWAware = 0> {
|
||||
foreach fvtiToFWti = AllWidenableBFloatToFloatVectors in
|
||||
{
|
||||
defvar fvti = fvtiToFWti.Vti;
|
||||
@@ -5987,7 +5999,7 @@ multiclass VPatConversionWF_VF_BF <string intrinsic, string instruction> {
|
||||
GetVTypePredicates<fwti>.Predicates) in
|
||||
defm : VPatConversionTA<intrinsic, instruction, "V",
|
||||
fwti.Vector, fvti.Vector, fwti.Mask, fvti.Log2SEW,
|
||||
fvti.LMul, fwti.RegClass, fvti.RegClass>;
|
||||
fvti.LMul, fwti.RegClass, fvti.RegClass, isSEWAware>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7292,11 +7304,14 @@ defm : VPatConversionWI_VF_RM<"int_riscv_vfwcvt_xu_f_v", "PseudoVFWCVT_XU_F">;
|
||||
defm : VPatConversionWI_VF_RM<"int_riscv_vfwcvt_x_f_v", "PseudoVFWCVT_X_F">;
|
||||
defm : VPatConversionWI_VF<"int_riscv_vfwcvt_rtz_xu_f_v", "PseudoVFWCVT_RTZ_XU_F">;
|
||||
defm : VPatConversionWI_VF<"int_riscv_vfwcvt_rtz_x_f_v", "PseudoVFWCVT_RTZ_X_F">;
|
||||
defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_xu_v", "PseudoVFWCVT_F_XU">;
|
||||
defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_x_v", "PseudoVFWCVT_F_X">;
|
||||
defm : VPatConversionWF_VF<"int_riscv_vfwcvt_f_f_v", "PseudoVFWCVT_F_F">;
|
||||
defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_xu_v", "PseudoVFWCVT_F_XU",
|
||||
isSEWAware=1>;
|
||||
defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_x_v", "PseudoVFWCVT_F_X",
|
||||
isSEWAware=1>;
|
||||
defm : VPatConversionWF_VF<"int_riscv_vfwcvt_f_f_v", "PseudoVFWCVT_F_F",
|
||||
isSEWAware=1>;
|
||||
defm : VPatConversionWF_VF_BF<"int_riscv_vfwcvtbf16_f_f_v",
|
||||
"PseudoVFWCVTBF16_F_F">;
|
||||
"PseudoVFWCVTBF16_F_F", isSEWAware=1>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
|
||||
|
||||
@@ -441,7 +441,7 @@ multiclass VPatWConvertI2FPSDNode_V<SDPatternOperator vop,
|
||||
let Predicates = !listconcat(GetVTypePredicates<ivti>.Predicates,
|
||||
GetVTypePredicates<fwti>.Predicates) in
|
||||
def : Pat<(fwti.Vector (vop (ivti.Vector ivti.RegClass:$rs1))),
|
||||
(!cast<Instruction>(instruction_name#"_"#ivti.LMul.MX)
|
||||
(!cast<Instruction>(instruction_name#"_"#ivti.LMul.MX#"_E"#ivti.SEW)
|
||||
(fwti.Vector (IMPLICIT_DEF)),
|
||||
ivti.RegClass:$rs1,
|
||||
ivti.AVL, ivti.Log2SEW, TA_MA)>;
|
||||
|
||||
@@ -1315,7 +1315,7 @@ multiclass VPatWConvertI2FPVL_V<SDPatternOperator vop,
|
||||
def : Pat<(fwti.Vector (vop (ivti.Vector ivti.RegClass:$rs1),
|
||||
(ivti.Mask V0),
|
||||
VLOpFrag)),
|
||||
(!cast<Instruction>(instruction_name#"_"#ivti.LMul.MX#"_MASK")
|
||||
(!cast<Instruction>(instruction_name#"_"#ivti.LMul.MX#"_E"#ivti.SEW#"_MASK")
|
||||
(fwti.Vector (IMPLICIT_DEF)), ivti.RegClass:$rs1,
|
||||
(ivti.Mask V0),
|
||||
GPR:$vl, ivti.Log2SEW, TA_MA)>;
|
||||
@@ -2672,7 +2672,7 @@ foreach fvtiToFWti = AllWidenableFloatVectors in {
|
||||
(fvti.Vector fvti.RegClass:$rs1),
|
||||
(fvti.Mask V0),
|
||||
VLOpFrag)),
|
||||
(!cast<Instruction>("PseudoVFWCVT_F_F_V_"#fvti.LMul.MX#"_MASK")
|
||||
(!cast<Instruction>("PseudoVFWCVT_F_F_V_"#fvti.LMul.MX#"_E"#fvti.SEW#"_MASK")
|
||||
(fwti.Vector (IMPLICIT_DEF)), fvti.RegClass:$rs1,
|
||||
(fvti.Mask V0),
|
||||
GPR:$vl, fvti.Log2SEW, TA_MA)>;
|
||||
|
||||
@@ -784,10 +784,11 @@ foreach mx = SchedMxListF in {
|
||||
|
||||
// Widening
|
||||
foreach mx = SchedMxListW in {
|
||||
defvar Cycles = SiFive7GetCyclesDefault<mx>.c;
|
||||
defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListW>.c;
|
||||
let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in {
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtIToFV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>;
|
||||
foreach sew = SchedSEWSet<mx, isF=0, isWidening=1>.val in {
|
||||
defvar Cycles = SiFive7GetCyclesDefault<mx>.c;
|
||||
defvar IsWorstCase = SiFive7IsWorstCaseMXSEW<mx, sew, SchedMxListW>.c;
|
||||
let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtIToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>;
|
||||
}
|
||||
}
|
||||
foreach mx = SchedMxListFW in {
|
||||
@@ -801,16 +802,13 @@ foreach mx = SchedMxListFW in {
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>;
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>;
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddF", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>;
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtFToFV", [SiFive7VCQ, SiFive7VA], mx, sew, IsWorstCase>;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach mx = SchedMxListFW in {
|
||||
defvar Cycles = SiFive7GetCyclesDefault<mx>.c;
|
||||
defvar IsWorstCase = SiFive7IsWorstCaseMX<mx, SchedMxListFW>.c;
|
||||
let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in {
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>;
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtFToFV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>;
|
||||
}
|
||||
let Latency = 8, AcquireAtCycles = [0, 1], ReleaseAtCycles = [1, !add(1, Cycles)] in
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFive7VCQ, SiFive7VA], mx, IsWorstCase>;
|
||||
}
|
||||
// Narrowing
|
||||
foreach mx = SchedMxListW in {
|
||||
@@ -1181,9 +1179,9 @@ defm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
|
||||
defm "" : LMULReadAdvance<"ReadVFMovF", 0>;
|
||||
defm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceW<"ReadVFWCvtIToFV", 0>;
|
||||
defm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
|
||||
defm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
|
||||
|
||||
@@ -526,19 +526,18 @@ foreach mx = SchedMxList in {
|
||||
|
||||
// Widening
|
||||
foreach mx = SchedMxListW in {
|
||||
defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
|
||||
defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListW>.c;
|
||||
let Latency = 3, ReleaseAtCycles = [LMulLat] in {
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtIToFV", [SiFiveP600VectorArith], mx, IsWorstCase>;
|
||||
foreach sew = SchedSEWSet<mx, isF=0, isWidening=1>.val in {
|
||||
defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
|
||||
defvar IsWorstCase = SiFiveP600IsWorstCaseMXSEW<mx, sew, SchedMxListW>.c;
|
||||
let Latency = 3, ReleaseAtCycles = [LMulLat] in
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtIToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
|
||||
}
|
||||
}
|
||||
foreach mx = SchedMxListFW in {
|
||||
defvar LMulLat = SiFiveP600GetLMulCycles<mx>.c;
|
||||
defvar IsWorstCase = SiFiveP600IsWorstCaseMX<mx, SchedMxListFW>.c;
|
||||
let Latency = 6, ReleaseAtCycles = [LMulLat] in {
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>;
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtFToFV", [SiFiveP600VectorArith], mx, IsWorstCase>;
|
||||
}
|
||||
let Latency = 6, ReleaseAtCycles = [LMulLat] in
|
||||
defm "" : LMULWriteResMX<"WriteVFWCvtFToIV", [SiFiveP600VectorArith], mx, IsWorstCase>;
|
||||
}
|
||||
foreach mx = SchedMxListFW in {
|
||||
foreach sew = SchedSEWSet<mx, isF=1, isWidening=1>.val in {
|
||||
@@ -551,6 +550,7 @@ foreach mx = SchedMxListFW in {
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWMulAddF", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
|
||||
defm "" : LMULSEWWriteResMXSEW<"WriteVFWCvtFToFV", [SiFiveP600VectorArith], mx, sew, IsWorstCase>;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -962,9 +962,9 @@ defm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
|
||||
defm "" : LMULReadAdvance<"ReadVFMovF", 0>;
|
||||
defm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceW<"ReadVFWCvtIToFV", 0>;
|
||||
defm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
|
||||
defm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
|
||||
|
||||
@@ -253,6 +253,18 @@ multiclass LMULReadAdvanceFW<string name, int val, list<SchedWrite> writes = []>
|
||||
: LMULReadAdvanceImpl<name, val, writes>;
|
||||
class LMULSchedWriteListFW<list<string> names> : LMULSchedWriteListImpl<names, SchedMxListFW>;
|
||||
|
||||
multiclass LMULSEWSchedWritesW<string name>
|
||||
: LMULSEWSchedWritesImpl<name, SchedMxListW, isF = 0, isWidening = 1>;
|
||||
multiclass LMULSEWSchedReadsW<string name>
|
||||
: LMULSEWSchedReadsImpl<name, SchedMxListW, isF = 0, isWidening = 1>;
|
||||
multiclass LMULSEWWriteResW<string name, list<ProcResourceKind> resources>
|
||||
: LMULSEWWriteResImpl<name, resources, SchedMxListW, isF = 0,
|
||||
isWidening = 1>;
|
||||
multiclass
|
||||
LMULSEWReadAdvanceW<string name, int val, list<SchedWrite> writes = []>
|
||||
: LMULSEWReadAdvanceImpl<name, val, writes, SchedMxListW, isF = 0,
|
||||
isWidening = 1>;
|
||||
|
||||
multiclass LMULSEWSchedWritesFW<string name>
|
||||
: LMULSEWSchedWritesImpl<name, SchedMxListFW, isF = 1, isWidening = 1>;
|
||||
multiclass LMULSEWSchedReadsFW<string name>
|
||||
@@ -452,9 +464,9 @@ defm "" : LMULSchedWrites<"WriteVFMovV">;
|
||||
defm "" : LMULSEWSchedWritesF<"WriteVFCvtIToFV">;
|
||||
defm "" : LMULSchedWrites<"WriteVFCvtFToIV">;
|
||||
// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
|
||||
defm "" : LMULSchedWritesW<"WriteVFWCvtIToFV">;
|
||||
defm "" : LMULSEWSchedWritesW<"WriteVFWCvtIToFV">;
|
||||
defm "" : LMULSchedWritesFW<"WriteVFWCvtFToIV">;
|
||||
defm "" : LMULSchedWritesFW<"WriteVFWCvtFToFV">;
|
||||
defm "" : LMULSEWSchedWritesFW<"WriteVFWCvtFToFV">;
|
||||
// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
|
||||
defm "" : LMULSchedWritesFW<"WriteVFNCvtIToFV">;
|
||||
defm "" : LMULSchedWritesW<"WriteVFNCvtFToIV">;
|
||||
@@ -678,9 +690,9 @@ defm "" : LMULSchedReads<"ReadVFMovF">;
|
||||
defm "" : LMULSEWSchedReadsF<"ReadVFCvtIToFV">;
|
||||
defm "" : LMULSchedReads<"ReadVFCvtFToIV">;
|
||||
// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
|
||||
defm "" : LMULSchedReadsW<"ReadVFWCvtIToFV">;
|
||||
defm "" : LMULSEWSchedReadsW<"ReadVFWCvtIToFV">;
|
||||
defm "" : LMULSchedReadsFW<"ReadVFWCvtFToIV">;
|
||||
defm "" : LMULSchedReadsFW<"ReadVFWCvtFToFV">;
|
||||
defm "" : LMULSEWSchedReadsFW<"ReadVFWCvtFToFV">;
|
||||
// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
|
||||
defm "" : LMULSchedReadsFW<"ReadVFNCvtIToFV">;
|
||||
defm "" : LMULSchedReadsW<"ReadVFNCvtFToIV">;
|
||||
@@ -907,9 +919,9 @@ defm "" : LMULWriteRes<"WriteVFMergeV", []>;
|
||||
defm "" : LMULWriteRes<"WriteVFMovV", []>;
|
||||
defm "" : LMULSEWWriteResF<"WriteVFCvtIToFV", []>;
|
||||
defm "" : LMULWriteRes<"WriteVFCvtFToIV", []>;
|
||||
defm "" : LMULWriteResW<"WriteVFWCvtIToFV", []>;
|
||||
defm "" : LMULSEWWriteResW<"WriteVFWCvtIToFV", []>;
|
||||
defm "" : LMULWriteResFW<"WriteVFWCvtFToIV", []>;
|
||||
defm "" : LMULWriteResFW<"WriteVFWCvtFToFV", []>;
|
||||
defm "" : LMULSEWWriteResFW<"WriteVFWCvtFToFV", []>;
|
||||
defm "" : LMULWriteResFW<"WriteVFNCvtIToFV", []>;
|
||||
defm "" : LMULWriteResW<"WriteVFNCvtFToIV", []>;
|
||||
defm "" : LMULWriteResFW<"WriteVFNCvtFToFV", []>;
|
||||
@@ -1064,9 +1076,9 @@ defm "" : LMULReadAdvance<"ReadVFMergeF", 0>;
|
||||
defm "" : LMULReadAdvance<"ReadVFMovF", 0>;
|
||||
defm "" : LMULSEWReadAdvanceF<"ReadVFCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvance<"ReadVFCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceW<"ReadVFWCvtIToFV", 0>;
|
||||
defm "" : LMULSEWReadAdvanceW<"ReadVFWCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
|
||||
defm "" : LMULSEWReadAdvanceFW<"ReadVFWCvtFToFV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFNCvtIToFV", 0>;
|
||||
defm "" : LMULReadAdvanceW<"ReadVFNCvtFToIV", 0>;
|
||||
defm "" : LMULReadAdvanceFW<"ReadVFNCvtFToFV", 0>;
|
||||
|
||||
Reference in New Issue
Block a user