Index: llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -68,6 +68,7 @@ case ISD::FMINNUM: R = SoftenFloatRes_FMINNUM(N); break; case ISD::FMAXNUM: R = SoftenFloatRes_FMAXNUM(N); break; case ISD::FADD: R = SoftenFloatRes_FADD(N); break; + case ISD::FCBRT: R = SoftenFloatRes_FCBRT(N); break; case ISD::FCEIL: R = SoftenFloatRes_FCEIL(N); break; case ISD::FCOPYSIGN: R = SoftenFloatRes_FCOPYSIGN(N); break; case ISD::FCOS: R = SoftenFloatRes_FCOS(N); break; @@ -224,6 +225,21 @@ NVT, Ops, CallOptions, SDLoc(N)).first; } +SDValue DAGTypeLegalizer::SoftenFloatRes_FCBRT(SDNode *N) { + EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); + SDValue Op = GetSoftenedFloat(N->getOperand(0)); + TargetLowering::MakeLibCallOptions CallOptions; + EVT OpsVT[1] = { N->getOperand(0).getValueType() }; + CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true); + return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::CBRT_F32, + RTLIB::CBRT_F64, + RTLIB::CBRT_F80, + RTLIB::CBRT_F128, + RTLIB::CBRT_PPCF128), + NVT, Op, CallOptions, SDLoc(N)).first; +} + SDValue DAGTypeLegalizer::SoftenFloatRes_FCEIL(SDNode *N) { EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); Index: llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h =================================================================== --- llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -495,6 +495,7 @@ SDValue SoftenFloatRes_FMINNUM(SDNode *N); SDValue SoftenFloatRes_FMAXNUM(SDNode *N); SDValue SoftenFloatRes_FADD(SDNode *N); + SDValue SoftenFloatRes_FCBRT(SDNode *N); SDValue SoftenFloatRes_FCEIL(SDNode *N); SDValue SoftenFloatRes_FCOPYSIGN(SDNode *N); SDValue SoftenFloatRes_FCOS(SDNode *N); Index: llvm/test/CodeGen/ARM/pow.ll =================================================================== --- llvm/test/CodeGen/ARM/pow.ll +++ llvm/test/CodeGen/ARM/pow.ll @@ -26,6 +26,22 @@ ret double %r } +define float @pow_f32_one_third_fmf(float %x) nounwind { +; ANY-LABEL: pow_f32_one_third_fmf: +; SOFTFLOAT: bl cbrtf +; HARDFLOAT: b cbrtf + %r = call fast float @llvm.pow.f32(float %x, float 0x3FD5555560000000) + ret float %r +} + +define double @pow_f64_one_third_fmf(double %x) nounwind { +; ANY-LABEL: pow_f64_one_third_fmf: +; SOFTFLOAT: bl cbrt +; HARDFLOAT: b cbrt + %r = call fast double @llvm.pow.f64(double %x, double 0x3FD5555555555555) + ret double %r +} + define <4 x float> @pow_v4f32_one_fourth_fmf(<4 x float> %x) nounwind { ; ANY-LABEL: pow_v4f32_one_fourth_fmf: ; SOFTFLOAT: bl powf