@@ -927,6 +927,7 @@ InstructionCost RISCVTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
927
927
if (!IsTypeLegal)
928
928
return BaseT::getCastInstrCost (Opcode, Dst, Src, CCH, CostKind, I);
929
929
930
+ std::pair<InstructionCost, MVT> SrcLT = getTypeLegalizationCost (Src);
930
931
std::pair<InstructionCost, MVT> DstLT = getTypeLegalizationCost (Dst);
931
932
932
933
int ISD = TLI->InstructionOpcodeToISD (Opcode);
@@ -961,13 +962,31 @@ InstructionCost RISCVTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
961
962
// Instead we use the following instructions to truncate to mask vector:
962
963
// vand.vi v8, v8, 1
963
964
// vmsne.vi v0, v8, 0
964
- return 2 ;
965
+ return getRISCVInstructionCost ({RISCV::VAND_VI, RISCV::VMSNE_VI},
966
+ SrcLT.second , CostKind);
965
967
}
966
968
[[fallthrough]];
967
969
case ISD::FP_EXTEND:
968
- case ISD::FP_ROUND:
970
+ case ISD::FP_ROUND: {
969
971
// Counts of narrow/widen instructions.
970
- return std::abs (PowDiff);
972
+ unsigned SrcEltSize = Src->getScalarSizeInBits ();
973
+ unsigned DstEltSize = Dst->getScalarSizeInBits ();
974
+
975
+ unsigned Op = (ISD == ISD::TRUNCATE) ? RISCV::VNSRL_WI
976
+ : (ISD == ISD::FP_EXTEND) ? RISCV::VFWCVT_F_F_V
977
+ : RISCV::VFNCVT_F_F_W;
978
+ InstructionCost Cost = 0 ;
979
+ for (; SrcEltSize != DstEltSize;) {
980
+ MVT ElementMVT = (ISD == ISD::TRUNCATE)
981
+ ? MVT::getIntegerVT (DstEltSize)
982
+ : MVT::getFloatingPointVT (DstEltSize);
983
+ MVT DstMVT = DstLT.second .changeVectorElementType (ElementMVT);
984
+ DstEltSize =
985
+ (DstEltSize > SrcEltSize) ? DstEltSize >> 1 : DstEltSize << 1 ;
986
+ Cost += getRISCVInstructionCost (Op, DstMVT, CostKind);
987
+ }
988
+ return Cost;
989
+ }
971
990
case ISD::FP_TO_SINT:
972
991
case ISD::FP_TO_UINT:
973
992
case ISD::SINT_TO_FP:
0 commit comments