@@ -941,7 +941,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
941
941
};
942
942
943
943
// TODO: support more ops.
944
- static const unsigned ZvfhminPromoteOps [] = {
944
+ static const unsigned ZvfhminZvfbfminPromoteOps [] = {
945
945
ISD::FMINNUM, ISD::FMAXNUM, ISD::FADD, ISD::FSUB,
946
946
ISD::FMUL, ISD::FMA, ISD::FDIV, ISD::FSQRT,
947
947
ISD::FCEIL, ISD::FTRUNC, ISD::FFLOOR, ISD::FROUND,
@@ -951,30 +951,31 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
951
951
ISD::STRICT_FMA};
952
952
953
953
// TODO: support more vp ops.
954
- static const unsigned ZvfhminPromoteVPOps[] = {ISD::VP_FADD,
955
- ISD::VP_FSUB,
956
- ISD::VP_FMUL,
957
- ISD::VP_FDIV,
958
- ISD::VP_FMA,
959
- ISD::VP_REDUCE_FADD,
960
- ISD::VP_REDUCE_SEQ_FADD,
961
- ISD::VP_REDUCE_FMIN,
962
- ISD::VP_REDUCE_FMAX,
963
- ISD::VP_SQRT,
964
- ISD::VP_FMINNUM,
965
- ISD::VP_FMAXNUM,
966
- ISD::VP_FCEIL,
967
- ISD::VP_FFLOOR,
968
- ISD::VP_FROUND,
969
- ISD::VP_FROUNDEVEN,
970
- ISD::VP_FROUNDTOZERO,
971
- ISD::VP_FRINT,
972
- ISD::VP_FNEARBYINT,
973
- ISD::VP_SETCC,
974
- ISD::VP_FMINIMUM,
975
- ISD::VP_FMAXIMUM,
976
- ISD::VP_REDUCE_FMINIMUM,
977
- ISD::VP_REDUCE_FMAXIMUM};
954
+ static const unsigned ZvfhminZvfbfminPromoteVPOps[] = {
955
+ ISD::VP_FADD,
956
+ ISD::VP_FSUB,
957
+ ISD::VP_FMUL,
958
+ ISD::VP_FDIV,
959
+ ISD::VP_FMA,
960
+ ISD::VP_REDUCE_FADD,
961
+ ISD::VP_REDUCE_SEQ_FADD,
962
+ ISD::VP_REDUCE_FMIN,
963
+ ISD::VP_REDUCE_FMAX,
964
+ ISD::VP_SQRT,
965
+ ISD::VP_FMINNUM,
966
+ ISD::VP_FMAXNUM,
967
+ ISD::VP_FCEIL,
968
+ ISD::VP_FFLOOR,
969
+ ISD::VP_FROUND,
970
+ ISD::VP_FROUNDEVEN,
971
+ ISD::VP_FROUNDTOZERO,
972
+ ISD::VP_FRINT,
973
+ ISD::VP_FNEARBYINT,
974
+ ISD::VP_SETCC,
975
+ ISD::VP_FMINIMUM,
976
+ ISD::VP_FMAXIMUM,
977
+ ISD::VP_REDUCE_FMINIMUM,
978
+ ISD::VP_REDUCE_FMAXIMUM};
978
979
979
980
// Sets common operation actions on RVV floating-point vector types.
980
981
const auto SetCommonVFPActions = [&](MVT VT) {
@@ -1097,20 +1098,20 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
1097
1098
setOperationAction(ISD::FABS, VT, Expand);
1098
1099
setOperationAction(ISD::FCOPYSIGN, VT, Expand);
1099
1100
1100
- // Custom split nxv32f16 since nxv32f32 if not legal.
1101
+ // Custom split nxv32f16 since nxv32f32 is not legal.
1101
1102
if (VT == MVT::nxv32f16) {
1102
- setOperationAction(ZvfhminPromoteOps , VT, Custom);
1103
- setOperationAction(ZvfhminPromoteVPOps , VT, Custom);
1103
+ setOperationAction(ZvfhminZvfbfminPromoteOps , VT, Custom);
1104
+ setOperationAction(ZvfhminZvfbfminPromoteVPOps , VT, Custom);
1104
1105
continue;
1105
1106
}
1106
1107
// Add more promote ops.
1107
1108
MVT F32VecVT = MVT::getVectorVT(MVT::f32, VT.getVectorElementCount());
1108
- setOperationPromotedToType(ZvfhminPromoteOps , VT, F32VecVT);
1109
- setOperationPromotedToType(ZvfhminPromoteVPOps , VT, F32VecVT);
1109
+ setOperationPromotedToType(ZvfhminZvfbfminPromoteOps , VT, F32VecVT);
1110
+ setOperationPromotedToType(ZvfhminZvfbfminPromoteVPOps , VT, F32VecVT);
1110
1111
}
1111
1112
}
1112
1113
1113
- // TODO: Could we merge some code with zvfhmin?
1114
+ // TODO: merge with zvfhmin
1114
1115
if (Subtarget.hasVInstructionsBF16Minimal()) {
1115
1116
for (MVT VT : BF16VecVTs) {
1116
1117
if (!isTypeLegal(VT))
@@ -1139,7 +1140,16 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
1139
1140
setOperationAction(ISD::FABS, VT, Expand);
1140
1141
setOperationAction(ISD::FCOPYSIGN, VT, Expand);
1141
1142
1142
- // TODO: Promote to fp32.
1143
+ // Custom split nxv32f16 since nxv32f32 is not legal.
1144
+ if (VT == MVT::nxv32bf16) {
1145
+ setOperationAction(ZvfhminZvfbfminPromoteOps, VT, Custom);
1146
+ setOperationAction(ZvfhminZvfbfminPromoteVPOps, VT, Custom);
1147
+ continue;
1148
+ }
1149
+ // Add more promote ops.
1150
+ MVT F32VecVT = MVT::getVectorVT(MVT::f32, VT.getVectorElementCount());
1151
+ setOperationPromotedToType(ZvfhminZvfbfminPromoteOps, VT, F32VecVT);
1152
+ setOperationPromotedToType(ZvfhminZvfbfminPromoteVPOps, VT, F32VecVT);
1143
1153
}
1144
1154
}
1145
1155
@@ -1375,8 +1385,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
1375
1385
// TODO: could split the f16 vector into two vectors and do promotion.
1376
1386
if (!isTypeLegal(F32VecVT))
1377
1387
continue;
1378
- setOperationPromotedToType(ZvfhminPromoteOps , VT, F32VecVT);
1379
- setOperationPromotedToType(ZvfhminPromoteVPOps , VT, F32VecVT);
1388
+ setOperationPromotedToType(ZvfhminZvfbfminPromoteOps , VT, F32VecVT);
1389
+ setOperationPromotedToType(ZvfhminZvfbfminPromoteVPOps , VT, F32VecVT);
1380
1390
continue;
1381
1391
}
1382
1392
@@ -6333,6 +6343,17 @@ static bool hasMaskOp(unsigned Opcode) {
6333
6343
return false;
6334
6344
}
6335
6345
6346
+ static bool isPromotedOpNeedingSplit(SDValue Op,
6347
+ const RISCVSubtarget &Subtarget) {
6348
+ if (Op.getValueType() == MVT::nxv32f16 &&
6349
+ (Subtarget.hasVInstructionsF16Minimal() &&
6350
+ !Subtarget.hasVInstructionsF16()))
6351
+ return true;
6352
+ if (Op.getValueType() == MVT::nxv32bf16)
6353
+ return true;
6354
+ return false;
6355
+ }
6356
+
6336
6357
static SDValue SplitVectorOp(SDValue Op, SelectionDAG &DAG) {
6337
6358
auto [LoVT, HiVT] = DAG.GetSplitDestVTs(Op.getValueType());
6338
6359
SDLoc DL(Op);
@@ -6670,9 +6691,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
6670
6691
}
6671
6692
case ISD::FMAXIMUM:
6672
6693
case ISD::FMINIMUM:
6673
- if (Op.getValueType() == MVT::nxv32f16 &&
6674
- (Subtarget.hasVInstructionsF16Minimal() &&
6675
- !Subtarget.hasVInstructionsF16()))
6694
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
6676
6695
return SplitVectorOp(Op, DAG);
6677
6696
return lowerFMAXIMUM_FMINIMUM(Op, DAG, Subtarget);
6678
6697
case ISD::FP_EXTEND:
@@ -6688,8 +6707,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
6688
6707
(Subtarget.hasVInstructionsF16Minimal() &&
6689
6708
!Subtarget.hasVInstructionsF16())) ||
6690
6709
Op.getValueType().getScalarType() == MVT::bf16)) {
6691
- if (Op.getValueType() == MVT::nxv32f16 ||
6692
- Op.getValueType() == MVT::nxv32bf16)
6710
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
6693
6711
return SplitVectorOp(Op, DAG);
6694
6712
// int -> f32
6695
6713
SDLoc DL(Op);
@@ -6709,8 +6727,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
6709
6727
(Subtarget.hasVInstructionsF16Minimal() &&
6710
6728
!Subtarget.hasVInstructionsF16())) ||
6711
6729
Op1.getValueType().getScalarType() == MVT::bf16)) {
6712
- if (Op1.getValueType() == MVT::nxv32f16 ||
6713
- Op1.getValueType() == MVT::nxv32bf16)
6730
+ if (isPromotedOpNeedingSplit(Op1, Subtarget))
6714
6731
return SplitVectorOp(Op, DAG);
6715
6732
// [b]f16 -> f32
6716
6733
SDLoc DL(Op);
@@ -6942,9 +6959,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
6942
6959
case ISD::FRINT:
6943
6960
case ISD::FROUND:
6944
6961
case ISD::FROUNDEVEN:
6945
- if (Op.getValueType() == MVT::nxv32f16 &&
6946
- (Subtarget.hasVInstructionsF16Minimal() &&
6947
- !Subtarget.hasVInstructionsF16()))
6962
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
6948
6963
return SplitVectorOp(Op, DAG);
6949
6964
return lowerFTRUNC_FCEIL_FFLOOR_FROUND(Op, DAG, Subtarget);
6950
6965
case ISD::LRINT:
@@ -7002,9 +7017,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7002
7017
case ISD::VP_REDUCE_FMAX:
7003
7018
case ISD::VP_REDUCE_FMINIMUM:
7004
7019
case ISD::VP_REDUCE_FMAXIMUM:
7005
- if (Op.getOperand(1).getValueType() == MVT::nxv32f16 &&
7006
- (Subtarget.hasVInstructionsF16Minimal() &&
7007
- !Subtarget.hasVInstructionsF16()))
7020
+ if (isPromotedOpNeedingSplit(Op.getOperand(1), Subtarget))
7008
7021
return SplitVectorReductionOp(Op, DAG);
7009
7022
return lowerVPREDUCE(Op, DAG);
7010
7023
case ISD::VP_REDUCE_AND:
@@ -7251,9 +7264,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7251
7264
return DAG.getSetCC(DL, VT, RHS, LHS, CCVal);
7252
7265
}
7253
7266
7254
- if (Op.getOperand(0).getSimpleValueType() == MVT::nxv32f16 &&
7255
- (Subtarget.hasVInstructionsF16Minimal() &&
7256
- !Subtarget.hasVInstructionsF16()))
7267
+ if (isPromotedOpNeedingSplit(Op.getOperand(0), Subtarget))
7257
7268
return SplitVectorOp(Op, DAG);
7258
7269
7259
7270
return lowerFixedLengthVectorSetccToRVV(Op, DAG);
@@ -7295,9 +7306,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7295
7306
case ISD::FMA:
7296
7307
case ISD::FMINNUM:
7297
7308
case ISD::FMAXNUM:
7298
- if (Op.getValueType() == MVT::nxv32f16 &&
7299
- (Subtarget.hasVInstructionsF16Minimal() &&
7300
- !Subtarget.hasVInstructionsF16()))
7309
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7301
7310
return SplitVectorOp(Op, DAG);
7302
7311
[[fallthrough]];
7303
7312
case ISD::AVGFLOORS:
@@ -7345,9 +7354,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7345
7354
case ISD::FCOPYSIGN:
7346
7355
if (Op.getValueType() == MVT::f16 || Op.getValueType() == MVT::bf16)
7347
7356
return lowerFCOPYSIGN(Op, DAG, Subtarget);
7348
- if (Op.getValueType() == MVT::nxv32f16 &&
7349
- (Subtarget.hasVInstructionsF16Minimal() &&
7350
- !Subtarget.hasVInstructionsF16()))
7357
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7351
7358
return SplitVectorOp(Op, DAG);
7352
7359
return lowerFixedLengthVectorFCOPYSIGNToRVV(Op, DAG);
7353
7360
case ISD::STRICT_FADD:
@@ -7356,9 +7363,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7356
7363
case ISD::STRICT_FDIV:
7357
7364
case ISD::STRICT_FSQRT:
7358
7365
case ISD::STRICT_FMA:
7359
- if (Op.getValueType() == MVT::nxv32f16 &&
7360
- (Subtarget.hasVInstructionsF16Minimal() &&
7361
- !Subtarget.hasVInstructionsF16()))
7366
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7362
7367
return SplitStrictFPVectorOp(Op, DAG);
7363
7368
return lowerToScalableOp(Op, DAG);
7364
7369
case ISD::STRICT_FSETCC:
@@ -7415,9 +7420,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7415
7420
case ISD::VP_FMINNUM:
7416
7421
case ISD::VP_FMAXNUM:
7417
7422
case ISD::VP_FCOPYSIGN:
7418
- if (Op.getValueType() == MVT::nxv32f16 &&
7419
- (Subtarget.hasVInstructionsF16Minimal() &&
7420
- !Subtarget.hasVInstructionsF16()))
7423
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7421
7424
return SplitVPOp(Op, DAG);
7422
7425
[[fallthrough]];
7423
7426
case ISD::VP_SRA:
@@ -7443,8 +7446,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7443
7446
(Subtarget.hasVInstructionsF16Minimal() &&
7444
7447
!Subtarget.hasVInstructionsF16())) ||
7445
7448
Op.getValueType().getScalarType() == MVT::bf16)) {
7446
- if (Op.getValueType() == MVT::nxv32f16 ||
7447
- Op.getValueType() == MVT::nxv32bf16)
7449
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7448
7450
return SplitVectorOp(Op, DAG);
7449
7451
// int -> f32
7450
7452
SDLoc DL(Op);
@@ -7464,8 +7466,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7464
7466
(Subtarget.hasVInstructionsF16Minimal() &&
7465
7467
!Subtarget.hasVInstructionsF16())) ||
7466
7468
Op1.getValueType().getScalarType() == MVT::bf16)) {
7467
- if (Op1.getValueType() == MVT::nxv32f16 ||
7468
- Op1.getValueType() == MVT::nxv32bf16)
7469
+ if (isPromotedOpNeedingSplit(Op1, Subtarget))
7469
7470
return SplitVectorOp(Op, DAG);
7470
7471
// [b]f16 -> f32
7471
7472
SDLoc DL(Op);
@@ -7478,9 +7479,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7478
7479
}
7479
7480
return lowerVPFPIntConvOp(Op, DAG);
7480
7481
case ISD::VP_SETCC:
7481
- if (Op.getOperand(0).getSimpleValueType() == MVT::nxv32f16 &&
7482
- (Subtarget.hasVInstructionsF16Minimal() &&
7483
- !Subtarget.hasVInstructionsF16()))
7482
+ if (isPromotedOpNeedingSplit(Op.getOperand(0), Subtarget))
7484
7483
return SplitVPOp(Op, DAG);
7485
7484
if (Op.getOperand(0).getSimpleValueType().getVectorElementType() == MVT::i1)
7486
7485
return lowerVPSetCCMaskOp(Op, DAG);
@@ -7515,16 +7514,12 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7515
7514
case ISD::VP_FROUND:
7516
7515
case ISD::VP_FROUNDEVEN:
7517
7516
case ISD::VP_FROUNDTOZERO:
7518
- if (Op.getValueType() == MVT::nxv32f16 &&
7519
- (Subtarget.hasVInstructionsF16Minimal() &&
7520
- !Subtarget.hasVInstructionsF16()))
7517
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7521
7518
return SplitVPOp(Op, DAG);
7522
7519
return lowerVectorFTRUNC_FCEIL_FFLOOR_FROUND(Op, DAG, Subtarget);
7523
7520
case ISD::VP_FMAXIMUM:
7524
7521
case ISD::VP_FMINIMUM:
7525
- if (Op.getValueType() == MVT::nxv32f16 &&
7526
- (Subtarget.hasVInstructionsF16Minimal() &&
7527
- !Subtarget.hasVInstructionsF16()))
7522
+ if (isPromotedOpNeedingSplit(Op, Subtarget))
7528
7523
return SplitVPOp(Op, DAG);
7529
7524
return lowerFMAXIMUM_FMINIMUM(Op, DAG, Subtarget);
7530
7525
case ISD::EXPERIMENTAL_VP_SPLICE:
0 commit comments