@@ -1104,65 +1104,6 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
11041104 return Cost * LT.first ;
11051105 break ;
11061106 }
1107- // vp integer arithmetic ops.
1108- case Intrinsic::vp_add:
1109- case Intrinsic::vp_and:
1110- case Intrinsic::vp_ashr:
1111- case Intrinsic::vp_lshr:
1112- case Intrinsic::vp_mul:
1113- case Intrinsic::vp_or:
1114- case Intrinsic::vp_sdiv:
1115- case Intrinsic::vp_shl:
1116- case Intrinsic::vp_srem:
1117- case Intrinsic::vp_sub:
1118- case Intrinsic::vp_udiv:
1119- case Intrinsic::vp_urem:
1120- case Intrinsic::vp_xor:
1121- // vp float arithmetic ops.
1122- case Intrinsic::vp_fadd:
1123- case Intrinsic::vp_fsub:
1124- case Intrinsic::vp_fmul:
1125- case Intrinsic::vp_fdiv:
1126- case Intrinsic::vp_frem: {
1127- std::optional<unsigned > FOp =
1128- VPIntrinsic::getFunctionalOpcodeForVP (ICA.getID ());
1129- assert (FOp.has_value ());
1130- return getArithmeticInstrCost (*FOp, ICA.getReturnType (), CostKind);
1131- break ;
1132- }
1133- // vp int cast ops.
1134- case Intrinsic::vp_trunc:
1135- case Intrinsic::vp_zext:
1136- case Intrinsic::vp_sext:
1137- // vp float cast ops.
1138- case Intrinsic::vp_fptoui:
1139- case Intrinsic::vp_fptosi:
1140- case Intrinsic::vp_uitofp:
1141- case Intrinsic::vp_sitofp:
1142- case Intrinsic::vp_fptrunc:
1143- case Intrinsic::vp_fpext: {
1144- std::optional<unsigned > FOp =
1145- VPIntrinsic::getFunctionalOpcodeForVP (ICA.getID ());
1146- assert (FOp.has_value () && !ICA.getArgTypes ().empty ());
1147- return getCastInstrCost (*FOp, RetTy, ICA.getArgTypes ()[0 ],
1148- TTI::CastContextHint::None, CostKind);
1149- break ;
1150- }
1151-
1152- // vp compare
1153- case Intrinsic::vp_icmp:
1154- case Intrinsic::vp_fcmp: {
1155- Intrinsic::ID IID = ICA.getID ();
1156- std::optional<unsigned > FOp = VPIntrinsic::getFunctionalOpcodeForVP (IID);
1157- // We can only handle vp_cmp intrinsics with underlying instructions.
1158- if (!ICA.getInst ())
1159- break ;
1160-
1161- assert (FOp);
1162- auto *UI = cast<VPCmpIntrinsic>(ICA.getInst ());
1163- return getCmpSelInstrCost (*FOp, ICA.getArgTypes ()[0 ], ICA.getReturnType (),
1164- UI->getPredicate (), CostKind);
1165- }
11661107 // vp load/store
11671108 case Intrinsic::vp_load:
11681109 case Intrinsic::vp_store: {
@@ -1193,6 +1134,35 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
11931134 CostKind);
11941135 }
11951136
1137+ if (VPBinOpIntrinsic::isVPBinOp (ICA.getID ())) {
1138+ std::optional<unsigned > FOp =
1139+ VPIntrinsic::getFunctionalOpcodeForVP (ICA.getID ());
1140+ assert (FOp.has_value ());
1141+ return getArithmeticInstrCost (*FOp, ICA.getReturnType (), CostKind);
1142+ }
1143+
1144+ // vp cmp ops
1145+ if (VPCmpIntrinsic::isVPCmp (ICA.getID ())) {
1146+ Intrinsic::ID IID = ICA.getID ();
1147+ std::optional<unsigned > FOp = VPIntrinsic::getFunctionalOpcodeForVP (IID);
1148+ // We can only handle vp_cmp intrinsics with underlying instructions.
1149+ if (ICA.getInst ()) {
1150+ assert (FOp);
1151+ auto *UI = cast<VPCmpIntrinsic>(ICA.getInst ());
1152+ return getCmpSelInstrCost (*FOp, ICA.getArgTypes ()[0 ], ICA.getReturnType (),
1153+ UI->getPredicate (), CostKind);
1154+ }
1155+ }
1156+
1157+ // vp cast ops
1158+ if (VPCastIntrinsic::isVPCast (ICA.getID ())) {
1159+ std::optional<unsigned > FOp =
1160+ VPIntrinsic::getFunctionalOpcodeForVP (ICA.getID ());
1161+ assert (FOp.has_value () && !ICA.getArgTypes ().empty ());
1162+ return getCastInstrCost (*FOp, RetTy, ICA.getArgTypes ()[0 ],
1163+ TTI::CastContextHint::None, CostKind);
1164+ }
1165+
11961166 if (ST->hasVInstructions () && RetTy->isVectorTy ()) {
11971167 if (auto LT = getTypeLegalizationCost (RetTy);
11981168 LT.second .isVector ()) {
0 commit comments