@@ -896,12 +896,13 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
896
896
897
897
// TODO: support more ops.
898
898
static const unsigned ZvfhminPromoteOps[] = {
899
- ISD::FMINNUM, ISD::FMAXNUM, ISD::FADD, ISD::FSUB,
900
- ISD::FMUL, ISD::FMA, ISD::FDIV, ISD::FSQRT,
901
- ISD::FABS, ISD::FNEG, ISD::FCOPYSIGN, ISD::FCEIL,
902
- ISD::FFLOOR, ISD::FROUND, ISD::FROUNDEVEN, ISD::FRINT,
903
- ISD::FNEARBYINT, ISD::IS_FPCLASS, ISD::SETCC, ISD::FMAXIMUM,
904
- ISD::FMINIMUM};
899
+ ISD::FMINNUM, ISD::FMAXNUM, ISD::FADD, ISD::FSUB,
900
+ ISD::FMUL, ISD::FMA, ISD::FDIV, ISD::FSQRT,
901
+ ISD::FABS, ISD::FNEG, ISD::FCOPYSIGN, ISD::FCEIL,
902
+ ISD::FFLOOR, ISD::FROUND, ISD::FROUNDEVEN, ISD::FRINT,
903
+ ISD::FNEARBYINT, ISD::IS_FPCLASS, ISD::SETCC, ISD::FMAXIMUM,
904
+ ISD::FMINIMUM, ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
905
+ ISD::STRICT_FDIV, ISD::STRICT_FSQRT, ISD::STRICT_FMA};
905
906
906
907
// TODO: support more vp ops.
907
908
static const unsigned ZvfhminPromoteVPOps[] = {
@@ -5597,6 +5598,41 @@ static SDValue SplitVectorReductionOp(SDValue Op, SelectionDAG &DAG) {
5597
5598
{ResLo, Hi, MaskHi, EVLHi}, Op->getFlags());
5598
5599
}
5599
5600
5601
+ static SDValue SplitStrictFPVectorOp(SDValue Op, SelectionDAG &DAG) {
5602
+
5603
+ assert(Op->isStrictFPOpcode());
5604
+
5605
+ auto [LoVT, HiVT] = DAG.GetSplitDestVTs(Op->getValueType(0));
5606
+
5607
+ SDVTList LoVTs = DAG.getVTList(LoVT, Op->getValueType(1));
5608
+ SDVTList HiVTs = DAG.getVTList(HiVT, Op->getValueType(1));
5609
+
5610
+ SDLoc DL(Op);
5611
+
5612
+ SmallVector<SDValue, 4> LoOperands(Op.getNumOperands());
5613
+ SmallVector<SDValue, 4> HiOperands(Op.getNumOperands());
5614
+
5615
+ for (unsigned j = 0; j != Op.getNumOperands(); ++j) {
5616
+ if (!Op.getOperand(j).getValueType().isVector()) {
5617
+ LoOperands[j] = Op.getOperand(j);
5618
+ HiOperands[j] = Op.getOperand(j);
5619
+ continue;
5620
+ }
5621
+ std::tie(LoOperands[j], HiOperands[j]) =
5622
+ DAG.SplitVector(Op.getOperand(j), DL);
5623
+ }
5624
+
5625
+ SDValue LoRes =
5626
+ DAG.getNode(Op.getOpcode(), DL, LoVTs, LoOperands, Op->getFlags());
5627
+ HiOperands[0] = LoRes.getValue(1);
5628
+ SDValue HiRes =
5629
+ DAG.getNode(Op.getOpcode(), DL, HiVTs, HiOperands, Op->getFlags());
5630
+
5631
+ SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, Op->getValueType(0),
5632
+ LoRes.getValue(0), HiRes.getValue(0));
5633
+ return DAG.getMergeValues({V, HiRes.getValue(1)}, DL);
5634
+ }
5635
+
5600
5636
SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
5601
5637
SelectionDAG &DAG) const {
5602
5638
switch (Op.getOpcode()) {
@@ -6374,6 +6410,10 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
6374
6410
case ISD::STRICT_FDIV:
6375
6411
case ISD::STRICT_FSQRT:
6376
6412
case ISD::STRICT_FMA:
6413
+ if (Op.getValueType() == MVT::nxv32f16 &&
6414
+ (Subtarget.hasVInstructionsF16Minimal() &&
6415
+ !Subtarget.hasVInstructionsF16()))
6416
+ return SplitStrictFPVectorOp(Op, DAG);
6377
6417
return lowerToScalableOp(Op, DAG);
6378
6418
case ISD::STRICT_FSETCC:
6379
6419
case ISD::STRICT_FSETCCS:
0 commit comments