@@ -1080,6 +1080,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
1080
1080
VT, Custom);
1081
1081
if (Subtarget.hasStdExtZfhmin())
1082
1082
setOperationAction(ISD::SPLAT_VECTOR, VT, Custom);
1083
+ else
1084
+ setOperationAction(ISD::SPLAT_VECTOR, MVT::f16, Custom);
1083
1085
// load/store
1084
1086
setOperationAction({ISD::LOAD, ISD::STORE}, VT, Custom);
1085
1087
@@ -1117,6 +1119,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
1117
1119
VT, Custom);
1118
1120
if (Subtarget.hasStdExtZfbfmin())
1119
1121
setOperationAction(ISD::SPLAT_VECTOR, VT, Custom);
1122
+ else
1123
+ setOperationAction(ISD::SPLAT_VECTOR, MVT::bf16, Custom);
1120
1124
setOperationAction({ISD::LOAD, ISD::STORE}, VT, Custom);
1121
1125
1122
1126
setOperationAction(ISD::FNEG, VT, Expand);
@@ -6988,30 +6992,28 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
6988
6992
return lowerVECTOR_SPLICE(Op, DAG);
6989
6993
case ISD::BUILD_VECTOR:
6990
6994
return lowerBUILD_VECTOR(Op, DAG, Subtarget);
6991
- case ISD::SPLAT_VECTOR:
6992
- if ((Op.getValueType().getScalarType() == MVT::f16 &&
6993
- (Subtarget.hasVInstructionsF16Minimal() &&
6994
- Subtarget.hasStdExtZfhminOrZhinxmin() &&
6995
- !Subtarget.hasVInstructionsF16())) ||
6996
- (Op.getValueType().getScalarType() == MVT::bf16 &&
6997
- (Subtarget.hasVInstructionsBF16Minimal() &&
6998
- Subtarget.hasStdExtZfbfmin()))) {
6999
- if (Op.getValueType() == MVT::nxv32f16 ||
7000
- Op.getValueType() == MVT::nxv32bf16)
7001
- return SplitVectorOp(Op, DAG);
6995
+ case ISD::SPLAT_VECTOR: {
6996
+ MVT VT = Op.getSimpleValueType();
6997
+ MVT EltVT = VT.getVectorElementType();
6998
+ if ((EltVT == MVT::f16 && !Subtarget.hasStdExtZvfh()) ||
6999
+ EltVT == MVT::bf16) {
7002
7000
SDLoc DL(Op);
7003
- SDValue NewScalar =
7004
- DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, Op.getOperand(0));
7005
- SDValue NewSplat = DAG.getNode(
7006
- ISD::SPLAT_VECTOR, DL,
7007
- MVT::getVectorVT(MVT::f32, Op.getValueType().getVectorElementCount()),
7008
- NewScalar);
7009
- return DAG.getNode(ISD::FP_ROUND, DL, Op.getValueType(), NewSplat,
7010
- DAG.getIntPtrConstant(0, DL, /*isTarget=*/true));
7001
+ SDValue Elt;
7002
+ if ((EltVT == MVT::bf16 && Subtarget.hasStdExtZfbfmin()) ||
7003
+ (EltVT == MVT::f16 && Subtarget.hasStdExtZfhmin()))
7004
+ Elt = DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, Subtarget.getXLenVT(),
7005
+ Op.getOperand(0));
7006
+ else
7007
+ Elt = DAG.getNode(ISD::BITCAST, DL, MVT::i16, Op.getOperand(0));
7008
+ MVT IVT = VT.changeVectorElementType(MVT::i16);
7009
+ return DAG.getNode(ISD::BITCAST, DL, VT,
7010
+ DAG.getNode(ISD::SPLAT_VECTOR, DL, IVT, Elt));
7011
7011
}
7012
- if (Op.getValueType().getVectorElementType() == MVT::i1)
7012
+
7013
+ if (EltVT == MVT::i1)
7013
7014
return lowerVectorMaskSplat(Op, DAG);
7014
7015
return SDValue();
7016
+ }
7015
7017
case ISD::VECTOR_SHUFFLE:
7016
7018
return lowerVECTOR_SHUFFLE(Op, DAG, Subtarget);
7017
7019
case ISD::CONCAT_VECTORS: {
0 commit comments