Index: include/llvm/CodeGen/RuntimeLibcalls.def =================================================================== --- include/llvm/CodeGen/RuntimeLibcalls.def +++ include/llvm/CodeGen/RuntimeLibcalls.def @@ -85,106 +85,127 @@ HANDLE_LIBCALL(NEG_I64, "__negdi2") // Floating-point +HANDLE_LIBCALL(ADD_F16, "__addhf3") HANDLE_LIBCALL(ADD_F32, "__addsf3") HANDLE_LIBCALL(ADD_F64, "__adddf3") HANDLE_LIBCALL(ADD_F80, "__addxf3") HANDLE_LIBCALL(ADD_F128, "__addtf3") HANDLE_LIBCALL(ADD_PPCF128, "__gcc_qadd") +HANDLE_LIBCALL(SUB_F16, "__subsh3") HANDLE_LIBCALL(SUB_F32, "__subsf3") HANDLE_LIBCALL(SUB_F64, "__subdf3") HANDLE_LIBCALL(SUB_F80, "__subxf3") HANDLE_LIBCALL(SUB_F128, "__subtf3") HANDLE_LIBCALL(SUB_PPCF128, "__gcc_qsub") +HANDLE_LIBCALL(MUL_F16, "__mulhf3") HANDLE_LIBCALL(MUL_F32, "__mulsf3") HANDLE_LIBCALL(MUL_F64, "__muldf3") HANDLE_LIBCALL(MUL_F80, "__mulxf3") HANDLE_LIBCALL(MUL_F128, "__multf3") HANDLE_LIBCALL(MUL_PPCF128, "__gcc_qmul") +HANDLE_LIBCALL(DIV_F16, "__divhf3") HANDLE_LIBCALL(DIV_F32, "__divsf3") HANDLE_LIBCALL(DIV_F64, "__divdf3") HANDLE_LIBCALL(DIV_F80, "__divxf3") HANDLE_LIBCALL(DIV_F128, "__divtf3") HANDLE_LIBCALL(DIV_PPCF128, "__gcc_qdiv") +HANDLE_LIBCALL(REM_F16, "fmodh") HANDLE_LIBCALL(REM_F32, "fmodf") HANDLE_LIBCALL(REM_F64, "fmod") HANDLE_LIBCALL(REM_F80, "fmodl") HANDLE_LIBCALL(REM_F128, "fmodl") HANDLE_LIBCALL(REM_PPCF128, "fmodl") +HANDLE_LIBCALL(FMA_F16, "fmah") HANDLE_LIBCALL(FMA_F32, "fmaf") HANDLE_LIBCALL(FMA_F64, "fma") HANDLE_LIBCALL(FMA_F80, "fmal") HANDLE_LIBCALL(FMA_F128, "fmal") HANDLE_LIBCALL(FMA_PPCF128, "fmal") +HANDLE_LIBCALL(POWI_F16, "__powihf2") HANDLE_LIBCALL(POWI_F32, "__powisf2") HANDLE_LIBCALL(POWI_F64, "__powidf2") HANDLE_LIBCALL(POWI_F80, "__powixf2") HANDLE_LIBCALL(POWI_F128, "__powitf2") HANDLE_LIBCALL(POWI_PPCF128, "__powitf2") +HANDLE_LIBCALL(SQRT_F16, "sqrth") HANDLE_LIBCALL(SQRT_F32, "sqrtf") HANDLE_LIBCALL(SQRT_F64, "sqrt") HANDLE_LIBCALL(SQRT_F80, "sqrtl") HANDLE_LIBCALL(SQRT_F128, "sqrtl") HANDLE_LIBCALL(SQRT_PPCF128, "sqrtl") +HANDLE_LIBCALL(LOG_F16, "logh") HANDLE_LIBCALL(LOG_F32, "logf") HANDLE_LIBCALL(LOG_F64, "log") HANDLE_LIBCALL(LOG_F80, "logl") HANDLE_LIBCALL(LOG_F128, "logl") HANDLE_LIBCALL(LOG_PPCF128, "logl") +HANDLE_LIBCALL(LOG_FINITE_F16, "__loghf_finite") HANDLE_LIBCALL(LOG_FINITE_F32, "__logf_finite") HANDLE_LIBCALL(LOG_FINITE_F64, "__log_finite") HANDLE_LIBCALL(LOG_FINITE_F80, "__logl_finite") HANDLE_LIBCALL(LOG_FINITE_F128, "__logl_finite") HANDLE_LIBCALL(LOG_FINITE_PPCF128, "__logl_finite") +HANDLE_LIBCALL(LOG2_F16, "log2h") HANDLE_LIBCALL(LOG2_F32, "log2f") HANDLE_LIBCALL(LOG2_F64, "log2") HANDLE_LIBCALL(LOG2_F80, "log2l") HANDLE_LIBCALL(LOG2_F128, "log2l") HANDLE_LIBCALL(LOG2_PPCF128, "log2l") +HANDLE_LIBCALL(LOG2_FINITE_F16, "__log2hf_finite") HANDLE_LIBCALL(LOG2_FINITE_F32, "__log2f_finite") HANDLE_LIBCALL(LOG2_FINITE_F64, "__log2_finite") HANDLE_LIBCALL(LOG2_FINITE_F80, "__log2l_finite") HANDLE_LIBCALL(LOG2_FINITE_F128, "__log2l_finite") HANDLE_LIBCALL(LOG2_FINITE_PPCF128, "__log2l_finite") +HANDLE_LIBCALL(LOG10_F16, "log10h") HANDLE_LIBCALL(LOG10_F32, "log10f") HANDLE_LIBCALL(LOG10_F64, "log10") HANDLE_LIBCALL(LOG10_F80, "log10l") HANDLE_LIBCALL(LOG10_F128, "log10l") HANDLE_LIBCALL(LOG10_PPCF128, "log10l") +HANDLE_LIBCALL(LOG10_FINITE_F16, "__log10hf_finite") HANDLE_LIBCALL(LOG10_FINITE_F32, "__log10f_finite") HANDLE_LIBCALL(LOG10_FINITE_F64, "__log10_finite") HANDLE_LIBCALL(LOG10_FINITE_F80, "__log10l_finite") HANDLE_LIBCALL(LOG10_FINITE_F128, "__log10l_finite") HANDLE_LIBCALL(LOG10_FINITE_PPCF128, "__log10l_finite") +HANDLE_LIBCALL(EXP_F16, "exph") HANDLE_LIBCALL(EXP_F32, "expf") HANDLE_LIBCALL(EXP_F64, "exp") HANDLE_LIBCALL(EXP_F80, "expl") HANDLE_LIBCALL(EXP_F128, "expl") HANDLE_LIBCALL(EXP_PPCF128, "expl") +HANDLE_LIBCALL(EXP_FINITE_F16, "__exphf_finite") HANDLE_LIBCALL(EXP_FINITE_F32, "__expf_finite") HANDLE_LIBCALL(EXP_FINITE_F64, "__exp_finite") HANDLE_LIBCALL(EXP_FINITE_F80, "__expl_finite") HANDLE_LIBCALL(EXP_FINITE_F128, "__expl_finite") HANDLE_LIBCALL(EXP_FINITE_PPCF128, "__expl_finite") +HANDLE_LIBCALL(EXP2_F16, "exp2h") HANDLE_LIBCALL(EXP2_F32, "exp2f") HANDLE_LIBCALL(EXP2_F64, "exp2") HANDLE_LIBCALL(EXP2_F80, "exp2l") HANDLE_LIBCALL(EXP2_F128, "exp2l") HANDLE_LIBCALL(EXP2_PPCF128, "exp2l") +HANDLE_LIBCALL(EXP2_FINITE_F16, "__exp2hf_finite") HANDLE_LIBCALL(EXP2_FINITE_F32, "__exp2f_finite") HANDLE_LIBCALL(EXP2_FINITE_F64, "__exp2_finite") HANDLE_LIBCALL(EXP2_FINITE_F80, "__exp2l_finite") HANDLE_LIBCALL(EXP2_FINITE_F128, "__exp2l_finite") HANDLE_LIBCALL(EXP2_FINITE_PPCF128, "__exp2l_finite") +HANDLE_LIBCALL(SIN_F16, "sinh") HANDLE_LIBCALL(SIN_F32, "sinf") HANDLE_LIBCALL(SIN_F64, "sin") HANDLE_LIBCALL(SIN_F80, "sinl") HANDLE_LIBCALL(SIN_F128, "sinl") HANDLE_LIBCALL(SIN_PPCF128, "sinl") +HANDLE_LIBCALL(COS_F16, "cosh") HANDLE_LIBCALL(COS_F32, "cosf") HANDLE_LIBCALL(COS_F64, "cos") HANDLE_LIBCALL(COS_F80, "cosl") HANDLE_LIBCALL(COS_F128, "cosl") HANDLE_LIBCALL(COS_PPCF128, "cosl") +HANDLE_LIBCALL(SINCOS_F16, nullptr) HANDLE_LIBCALL(SINCOS_F32, nullptr) HANDLE_LIBCALL(SINCOS_F64, nullptr) HANDLE_LIBCALL(SINCOS_F80, nullptr) @@ -192,56 +213,67 @@ HANDLE_LIBCALL(SINCOS_PPCF128, nullptr) HANDLE_LIBCALL(SINCOS_STRET_F32, nullptr) HANDLE_LIBCALL(SINCOS_STRET_F64, nullptr) +HANDLE_LIBCALL(POW_F16, "powh") HANDLE_LIBCALL(POW_F32, "powf") HANDLE_LIBCALL(POW_F64, "pow") HANDLE_LIBCALL(POW_F80, "powl") HANDLE_LIBCALL(POW_F128, "powl") HANDLE_LIBCALL(POW_PPCF128, "powl") +HANDLE_LIBCALL(POW_FINITE_F16, "__powf_finite") HANDLE_LIBCALL(POW_FINITE_F32, "__powf_finite") HANDLE_LIBCALL(POW_FINITE_F64, "__pow_finite") HANDLE_LIBCALL(POW_FINITE_F80, "__powl_finite") HANDLE_LIBCALL(POW_FINITE_F128, "__powl_finite") HANDLE_LIBCALL(POW_FINITE_PPCF128, "__powl_finite") +HANDLE_LIBCALL(CEIL_F16, "ceilh") HANDLE_LIBCALL(CEIL_F32, "ceilf") HANDLE_LIBCALL(CEIL_F64, "ceil") HANDLE_LIBCALL(CEIL_F80, "ceill") HANDLE_LIBCALL(CEIL_F128, "ceill") HANDLE_LIBCALL(CEIL_PPCF128, "ceill") +HANDLE_LIBCALL(TRUNC_F16, "trunch") HANDLE_LIBCALL(TRUNC_F32, "truncf") HANDLE_LIBCALL(TRUNC_F64, "trunc") HANDLE_LIBCALL(TRUNC_F80, "truncl") HANDLE_LIBCALL(TRUNC_F128, "truncl") HANDLE_LIBCALL(TRUNC_PPCF128, "truncl") +HANDLE_LIBCALL(RINT_F16, "rinth") HANDLE_LIBCALL(RINT_F32, "rintf") HANDLE_LIBCALL(RINT_F64, "rint") HANDLE_LIBCALL(RINT_F80, "rintl") HANDLE_LIBCALL(RINT_F128, "rintl") HANDLE_LIBCALL(RINT_PPCF128, "rintl") +HANDLE_LIBCALL(NEARBYINT_F16, "nearbyinth") HANDLE_LIBCALL(NEARBYINT_F32, "nearbyintf") HANDLE_LIBCALL(NEARBYINT_F64, "nearbyint") HANDLE_LIBCALL(NEARBYINT_F80, "nearbyintl") HANDLE_LIBCALL(NEARBYINT_F128, "nearbyintl") HANDLE_LIBCALL(NEARBYINT_PPCF128, "nearbyintl") +HANDLE_LIBCALL(ROUND_F16, "roundh") HANDLE_LIBCALL(ROUND_F32, "roundf") HANDLE_LIBCALL(ROUND_F64, "round") HANDLE_LIBCALL(ROUND_F80, "roundl") HANDLE_LIBCALL(ROUND_F128, "roundl") HANDLE_LIBCALL(ROUND_PPCF128, "roundl") +HANDLE_LIBCALL(FLOOR_F16, "floorh") HANDLE_LIBCALL(FLOOR_F32, "floorf") HANDLE_LIBCALL(FLOOR_F64, "floor") HANDLE_LIBCALL(FLOOR_F80, "floorl") HANDLE_LIBCALL(FLOOR_F128, "floorl") HANDLE_LIBCALL(FLOOR_PPCF128, "floorl") +HANDLE_LIBCALL(COPYSIGN_F16, "copysignh") HANDLE_LIBCALL(COPYSIGN_F32, "copysignf") HANDLE_LIBCALL(COPYSIGN_F64, "copysign") HANDLE_LIBCALL(COPYSIGN_F80, "copysignl") HANDLE_LIBCALL(COPYSIGN_F128, "copysignl") HANDLE_LIBCALL(COPYSIGN_PPCF128, "copysignl") +HANDLE_LIBCALL(FMIN_F16, "fminh") HANDLE_LIBCALL(FMIN_F32, "fminf") HANDLE_LIBCALL(FMIN_F64, "fmin") HANDLE_LIBCALL(FMIN_F80, "fminl") HANDLE_LIBCALL(FMIN_F128, "fminl") HANDLE_LIBCALL(FMIN_PPCF128, "fminl") +HANDLE_LIBCALL(FMAX_F16, "fmaxh") HANDLE_LIBCALL(FMAX_F32, "fmaxf") HANDLE_LIBCALL(FMAX_F64, "fmax") HANDLE_LIBCALL(FMAX_F80, "fmaxl") Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -142,7 +142,8 @@ std::pair ExpandChainLibCall(RTLIB::Libcall LC, SDNode *Node, bool isSigned); - SDValue ExpandFPLibCall(SDNode *Node, RTLIB::Libcall Call_F32, + SDValue ExpandFPLibCall(SDNode *Node, RTLIB::Libcall Call_F16, + RTLIB::Libcall Call_F32, RTLIB::Libcall Call_F64, RTLIB::Libcall Call_F80, RTLIB::Libcall Call_F128, RTLIB::Libcall Call_PPCF128); @@ -2095,6 +2096,7 @@ } SDValue SelectionDAGLegalize::ExpandFPLibCall(SDNode* Node, + RTLIB::Libcall Call_F16, RTLIB::Libcall Call_F32, RTLIB::Libcall Call_F64, RTLIB::Libcall Call_F80, @@ -2106,6 +2108,7 @@ RTLIB::Libcall LC; switch (Node->getSimpleValueType(0).SimpleTy) { default: llvm_unreachable("Unexpected request for libcall!"); + case MVT::f16: LC = Call_F16; break; case MVT::f32: LC = Call_F32; break; case MVT::f64: LC = Call_F64; break; case MVT::f80: LC = Call_F80; break; @@ -4035,30 +4038,35 @@ break; } case ISD::FMINNUM: - Results.push_back(ExpandFPLibCall(Node, RTLIB::FMIN_F32, RTLIB::FMIN_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::FMIN_F16, + RTLIB::FMIN_F32, RTLIB::FMIN_F64, RTLIB::FMIN_F80, RTLIB::FMIN_F128, RTLIB::FMIN_PPCF128)); break; case ISD::FMAXNUM: - Results.push_back(ExpandFPLibCall(Node, RTLIB::FMAX_F32, RTLIB::FMAX_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::FMAX_F16, + RTLIB::FMAX_F32, RTLIB::FMAX_F64, RTLIB::FMAX_F80, RTLIB::FMAX_F128, RTLIB::FMAX_PPCF128)); break; case ISD::FSQRT: case ISD::STRICT_FSQRT: - Results.push_back(ExpandFPLibCall(Node, RTLIB::SQRT_F32, RTLIB::SQRT_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::SQRT_F16, + RTLIB::SQRT_F32, RTLIB::SQRT_F64, RTLIB::SQRT_F80, RTLIB::SQRT_F128, RTLIB::SQRT_PPCF128)); break; case ISD::FSIN: case ISD::STRICT_FSIN: - Results.push_back(ExpandFPLibCall(Node, RTLIB::SIN_F32, RTLIB::SIN_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::SIN_F16, + RTLIB::SIN_F32, RTLIB::SIN_F64, RTLIB::SIN_F80, RTLIB::SIN_F128, RTLIB::SIN_PPCF128)); break; case ISD::FCOS: case ISD::STRICT_FCOS: - Results.push_back(ExpandFPLibCall(Node, RTLIB::COS_F32, RTLIB::COS_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::COS_F16, + RTLIB::COS_F32, RTLIB::COS_F64, RTLIB::COS_F80, RTLIB::COS_F128, RTLIB::COS_PPCF128)); break; @@ -4069,99 +4077,115 @@ case ISD::FLOG: case ISD::STRICT_FLOG: if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_log_finite)) - Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_FINITE_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_FINITE_F16, + RTLIB::LOG_FINITE_F32, RTLIB::LOG_FINITE_F64, RTLIB::LOG_FINITE_F80, RTLIB::LOG_FINITE_F128, RTLIB::LOG_FINITE_PPCF128)); else - Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_F32, RTLIB::LOG_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_F16, + RTLIB::LOG_F32, RTLIB::LOG_F64, RTLIB::LOG_F80, RTLIB::LOG_F128, RTLIB::LOG_PPCF128)); break; case ISD::FLOG2: case ISD::STRICT_FLOG2: if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_log2_finite)) - Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG2_FINITE_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG2_FINITE_F16, + RTLIB::LOG2_FINITE_F32, RTLIB::LOG2_FINITE_F64, RTLIB::LOG2_FINITE_F80, RTLIB::LOG2_FINITE_F128, RTLIB::LOG2_FINITE_PPCF128)); else - Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG2_F32, RTLIB::LOG2_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG2_F16, + RTLIB::LOG2_F32, RTLIB::LOG2_F64, RTLIB::LOG2_F80, RTLIB::LOG2_F128, RTLIB::LOG2_PPCF128)); break; case ISD::FLOG10: case ISD::STRICT_FLOG10: if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_log10_finite)) - Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG10_FINITE_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG10_FINITE_F16, + RTLIB::LOG10_FINITE_F32, RTLIB::LOG10_FINITE_F64, RTLIB::LOG10_FINITE_F80, RTLIB::LOG10_FINITE_F128, RTLIB::LOG10_FINITE_PPCF128)); else - Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG10_F32, RTLIB::LOG10_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG10_F16, + RTLIB::LOG10_F32, RTLIB::LOG10_F64, RTLIB::LOG10_F80, RTLIB::LOG10_F128, RTLIB::LOG10_PPCF128)); break; case ISD::FEXP: case ISD::STRICT_FEXP: if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_exp_finite)) - Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP_FINITE_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP_FINITE_F16, + RTLIB::EXP_FINITE_F32, RTLIB::EXP_FINITE_F64, RTLIB::EXP_FINITE_F80, RTLIB::EXP_FINITE_F128, RTLIB::EXP_FINITE_PPCF128)); else - Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP_F32, RTLIB::EXP_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP_F16, + RTLIB::EXP_F32, RTLIB::EXP_F64, RTLIB::EXP_F80, RTLIB::EXP_F128, RTLIB::EXP_PPCF128)); break; case ISD::FEXP2: case ISD::STRICT_FEXP2: if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_exp2_finite)) - Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP2_FINITE_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP2_FINITE_F16, + RTLIB::EXP2_FINITE_F32, RTLIB::EXP2_FINITE_F64, RTLIB::EXP2_FINITE_F80, RTLIB::EXP2_FINITE_F128, RTLIB::EXP2_FINITE_PPCF128)); else - Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP2_F32, RTLIB::EXP2_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP2_F16, + RTLIB::EXP2_F32, RTLIB::EXP2_F64, RTLIB::EXP2_F80, RTLIB::EXP2_F128, RTLIB::EXP2_PPCF128)); break; case ISD::FTRUNC: - Results.push_back(ExpandFPLibCall(Node, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::TRUNC_F16, + RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, RTLIB::TRUNC_F80, RTLIB::TRUNC_F128, RTLIB::TRUNC_PPCF128)); break; case ISD::FFLOOR: - Results.push_back(ExpandFPLibCall(Node, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::FLOOR_F16, + RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, RTLIB::FLOOR_F80, RTLIB::FLOOR_F128, RTLIB::FLOOR_PPCF128)); break; case ISD::FCEIL: - Results.push_back(ExpandFPLibCall(Node, RTLIB::CEIL_F32, RTLIB::CEIL_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::CEIL_F16, + RTLIB::CEIL_F32, RTLIB::CEIL_F64, RTLIB::CEIL_F80, RTLIB::CEIL_F128, RTLIB::CEIL_PPCF128)); break; case ISD::FRINT: case ISD::STRICT_FRINT: - Results.push_back(ExpandFPLibCall(Node, RTLIB::RINT_F32, RTLIB::RINT_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::RINT_F16, + RTLIB::RINT_F32, RTLIB::RINT_F64, RTLIB::RINT_F80, RTLIB::RINT_F128, RTLIB::RINT_PPCF128)); break; case ISD::FNEARBYINT: case ISD::STRICT_FNEARBYINT: - Results.push_back(ExpandFPLibCall(Node, RTLIB::NEARBYINT_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::NEARBYINT_F16, + RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64, RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_F128, RTLIB::NEARBYINT_PPCF128)); break; case ISD::FROUND: - Results.push_back(ExpandFPLibCall(Node, RTLIB::ROUND_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::ROUND_F16, + RTLIB::ROUND_F32, RTLIB::ROUND_F64, RTLIB::ROUND_F80, RTLIB::ROUND_F128, @@ -4169,46 +4193,54 @@ break; case ISD::FPOWI: case ISD::STRICT_FPOWI: - Results.push_back(ExpandFPLibCall(Node, RTLIB::POWI_F32, RTLIB::POWI_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::POWI_F16, + RTLIB::POWI_F32, RTLIB::POWI_F64, RTLIB::POWI_F80, RTLIB::POWI_F128, RTLIB::POWI_PPCF128)); break; case ISD::FPOW: case ISD::STRICT_FPOW: if (CanUseFiniteLibCall && DAG.getLibInfo().has(LibFunc_pow_finite)) - Results.push_back(ExpandFPLibCall(Node, RTLIB::POW_FINITE_F32, + Results.push_back(ExpandFPLibCall(Node, RTLIB::POW_FINITE_F16, + RTLIB::POW_FINITE_F32, RTLIB::POW_FINITE_F64, RTLIB::POW_FINITE_F80, RTLIB::POW_FINITE_F128, RTLIB::POW_FINITE_PPCF128)); else - Results.push_back(ExpandFPLibCall(Node, RTLIB::POW_F32, RTLIB::POW_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::POW_F16, + RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80, RTLIB::POW_F128, RTLIB::POW_PPCF128)); break; case ISD::FDIV: - Results.push_back(ExpandFPLibCall(Node, RTLIB::DIV_F32, RTLIB::DIV_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::DIV_F16, + RTLIB::DIV_F32, RTLIB::DIV_F64, RTLIB::DIV_F80, RTLIB::DIV_F128, RTLIB::DIV_PPCF128)); break; case ISD::FREM: - Results.push_back(ExpandFPLibCall(Node, RTLIB::REM_F32, RTLIB::REM_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::REM_F16, + RTLIB::REM_F32, RTLIB::REM_F64, RTLIB::REM_F80, RTLIB::REM_F128, RTLIB::REM_PPCF128)); break; case ISD::FMA: case ISD::STRICT_FMA: - Results.push_back(ExpandFPLibCall(Node, RTLIB::FMA_F32, RTLIB::FMA_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::FMA_F16, + RTLIB::FMA_F32, RTLIB::FMA_F64, RTLIB::FMA_F80, RTLIB::FMA_F128, RTLIB::FMA_PPCF128)); break; case ISD::FADD: - Results.push_back(ExpandFPLibCall(Node, RTLIB::ADD_F32, RTLIB::ADD_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::ADD_F16, + RTLIB::ADD_F32, RTLIB::ADD_F64, RTLIB::ADD_F80, RTLIB::ADD_F128, RTLIB::ADD_PPCF128)); break; case ISD::FMUL: - Results.push_back(ExpandFPLibCall(Node, RTLIB::MUL_F32, RTLIB::MUL_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::MUL_F16, + RTLIB::MUL_F32, RTLIB::MUL_F64, RTLIB::MUL_F80, RTLIB::MUL_F128, RTLIB::MUL_PPCF128)); break; @@ -4225,7 +4257,8 @@ break; } case ISD::FSUB: - Results.push_back(ExpandFPLibCall(Node, RTLIB::SUB_F32, RTLIB::SUB_F64, + Results.push_back(ExpandFPLibCall(Node, RTLIB::SUB_F16, + RTLIB::SUB_F32, RTLIB::SUB_F64, RTLIB::SUB_F80, RTLIB::SUB_F128, RTLIB::SUB_PPCF128)); break; Index: lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp =================================================================== --- lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -28,12 +28,14 @@ /// GetFPLibCall - Return the right libcall for the given floating point type. static RTLIB::Libcall GetFPLibCall(EVT VT, + RTLIB::Libcall Call_F16, RTLIB::Libcall Call_F32, RTLIB::Libcall Call_F64, RTLIB::Libcall Call_F80, RTLIB::Libcall Call_F128, RTLIB::Libcall Call_PPCF128) { return + VT == MVT::f16 ? Call_F16 : VT == MVT::f32 ? Call_F32 : VT == MVT::f64 ? Call_F64 : VT == MVT::f80 ? Call_F80 : @@ -201,6 +203,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::FMIN_F16, RTLIB::FMIN_F32, RTLIB::FMIN_F64, RTLIB::FMIN_F80, @@ -214,6 +217,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::FMAX_F16, RTLIB::FMAX_F32, RTLIB::FMAX_F64, RTLIB::FMAX_F80, @@ -227,6 +231,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::ADD_F16, RTLIB::ADD_F32, RTLIB::ADD_F64, RTLIB::ADD_F80, @@ -239,6 +244,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::CEIL_F16, RTLIB::CEIL_F32, RTLIB::CEIL_F64, RTLIB::CEIL_F80, @@ -302,6 +308,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::COS_F16, RTLIB::COS_F32, RTLIB::COS_F64, RTLIB::COS_F80, @@ -315,6 +322,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::DIV_F16, RTLIB::DIV_F32, RTLIB::DIV_F64, RTLIB::DIV_F80, @@ -327,6 +335,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::EXP_F16, RTLIB::EXP_F32, RTLIB::EXP_F64, RTLIB::EXP_F80, @@ -339,6 +348,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::EXP2_F16, RTLIB::EXP2_F32, RTLIB::EXP2_F64, RTLIB::EXP2_F80, @@ -351,6 +361,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::FLOOR_F16, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, RTLIB::FLOOR_F80, @@ -363,6 +374,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::LOG_F16, RTLIB::LOG_F32, RTLIB::LOG_F64, RTLIB::LOG_F80, @@ -375,6 +387,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::LOG2_F16, RTLIB::LOG2_F32, RTLIB::LOG2_F64, RTLIB::LOG2_F80, @@ -387,6 +400,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::LOG10_F16, RTLIB::LOG10_F32, RTLIB::LOG10_F64, RTLIB::LOG10_F80, @@ -401,6 +415,7 @@ GetSoftenedFloat(N->getOperand(1)), GetSoftenedFloat(N->getOperand(2)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::FMA_F16, RTLIB::FMA_F32, RTLIB::FMA_F64, RTLIB::FMA_F80, @@ -414,6 +429,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::MUL_F16, RTLIB::MUL_F32, RTLIB::MUL_F64, RTLIB::MUL_F80, @@ -426,6 +442,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::NEARBYINT_F16, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64, RTLIB::NEARBYINT_F80, @@ -444,6 +461,7 @@ SDValue Ops[2] = { DAG.getConstantFP(-0.0, dl, N->getValueType(0)), GetSoftenedFloat(N->getOperand(0)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::SUB_F16, RTLIB::SUB_F32, RTLIB::SUB_F64, RTLIB::SUB_F80, @@ -514,6 +532,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::POW_F16, RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80, @@ -528,6 +547,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), N->getOperand(1) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::POWI_F16, RTLIB::POWI_F32, RTLIB::POWI_F64, RTLIB::POWI_F80, @@ -541,6 +561,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::REM_F16, RTLIB::REM_F32, RTLIB::REM_F64, RTLIB::REM_F80, @@ -553,6 +574,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::RINT_F16, RTLIB::RINT_F32, RTLIB::RINT_F64, RTLIB::RINT_F80, @@ -565,6 +587,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::ROUND_F16, RTLIB::ROUND_F32, RTLIB::ROUND_F64, RTLIB::ROUND_F80, @@ -577,6 +600,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::SIN_F16, RTLIB::SIN_F32, RTLIB::SIN_F64, RTLIB::SIN_F80, @@ -589,6 +613,7 @@ EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::SQRT_F16, RTLIB::SQRT_F32, RTLIB::SQRT_F64, RTLIB::SQRT_F80, @@ -602,6 +627,7 @@ SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)), GetSoftenedFloat(N->getOperand(1)) }; return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::SUB_F16, RTLIB::SUB_F32, RTLIB::SUB_F64, RTLIB::SUB_F80, @@ -617,6 +643,7 @@ SDValue Op = GetSoftenedFloat(N->getOperand(0)); return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::TRUNC_F16, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, RTLIB::TRUNC_F80, @@ -1136,7 +1163,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FMINNUM(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::FMIN_F16, RTLIB::FMIN_F32, RTLIB::FMIN_F64, RTLIB::FMIN_F80, RTLIB::FMIN_F128, RTLIB::FMIN_PPCF128), @@ -1146,7 +1173,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FMAXNUM(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::FMAX_F16, RTLIB::FMAX_F32, RTLIB::FMAX_F64, RTLIB::FMAX_F80, RTLIB::FMAX_F128, RTLIB::FMAX_PPCF128), @@ -1156,7 +1183,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FADD(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::ADD_F16, RTLIB::ADD_F32, RTLIB::ADD_F64, RTLIB::ADD_F80, RTLIB::ADD_F128, RTLIB::ADD_PPCF128), @@ -1166,7 +1193,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FCEIL(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::CEIL_F16, RTLIB::CEIL_F32, RTLIB::CEIL_F64, RTLIB::CEIL_F80, RTLIB::CEIL_F128, RTLIB::CEIL_PPCF128), @@ -1177,6 +1204,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FCOPYSIGN(SDNode *N, SDValue &Lo, SDValue &Hi) { SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + RTLIB::COPYSIGN_F16, RTLIB::COPYSIGN_F32, RTLIB::COPYSIGN_F64, RTLIB::COPYSIGN_F80, @@ -1188,7 +1216,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FCOS(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::COS_F16, RTLIB::COS_F32, RTLIB::COS_F64, RTLIB::COS_F80, RTLIB::COS_F128, RTLIB::COS_PPCF128), @@ -1200,6 +1228,7 @@ SDValue &Hi) { SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::DIV_F16, RTLIB::DIV_F32, RTLIB::DIV_F64, RTLIB::DIV_F80, @@ -1212,7 +1241,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FEXP(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::EXP_F16, RTLIB::EXP_F32, RTLIB::EXP_F64, RTLIB::EXP_F80, RTLIB::EXP_F128, RTLIB::EXP_PPCF128), @@ -1222,7 +1251,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FEXP2(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::EXP2_F16, RTLIB::EXP2_F32, RTLIB::EXP2_F64, RTLIB::EXP2_F80, RTLIB::EXP2_F128, RTLIB::EXP2_PPCF128), @@ -1232,7 +1261,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FFLOOR(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::FLOOR_F16, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, RTLIB::FLOOR_F80, RTLIB::FLOOR_F128, RTLIB::FLOOR_PPCF128), @@ -1242,7 +1271,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FLOG(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::LOG_F16, RTLIB::LOG_F32, RTLIB::LOG_F64, RTLIB::LOG_F80, RTLIB::LOG_F128, RTLIB::LOG_PPCF128), @@ -1252,7 +1281,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FLOG2(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::LOG2_F16, RTLIB::LOG2_F32, RTLIB::LOG2_F64, RTLIB::LOG2_F80, RTLIB::LOG2_F128, RTLIB::LOG2_PPCF128), @@ -1262,7 +1291,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FLOG10(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::LOG10_F16, RTLIB::LOG10_F32, RTLIB::LOG10_F64, RTLIB::LOG10_F80, RTLIB::LOG10_F128, RTLIB::LOG10_PPCF128), @@ -1274,6 +1303,7 @@ SDValue &Hi) { SDValue Ops[3] = { N->getOperand(0), N->getOperand(1), N->getOperand(2) }; SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::FMA_F16, RTLIB::FMA_F32, RTLIB::FMA_F64, RTLIB::FMA_F80, @@ -1288,6 +1318,7 @@ SDValue &Hi) { SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::MUL_F16, RTLIB::MUL_F32, RTLIB::MUL_F64, RTLIB::MUL_F80, @@ -1301,6 +1332,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &Lo, SDValue &Hi) { SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + RTLIB::NEARBYINT_F16, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64, RTLIB::NEARBYINT_F80, @@ -1329,7 +1361,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FPOW(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::POW_F16, RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80, RTLIB::POW_F128, RTLIB::POW_PPCF128), @@ -1339,7 +1371,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::POWI_F16, RTLIB::POWI_F32, RTLIB::POWI_F64, RTLIB::POWI_F80, RTLIB::POWI_F128, RTLIB::POWI_PPCF128), @@ -1349,7 +1381,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FREM(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::REM_F16, RTLIB::REM_F32, RTLIB::REM_F64, RTLIB::REM_F80, RTLIB::REM_F128, RTLIB::REM_PPCF128), @@ -1359,7 +1391,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FRINT(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::RINT_F16, RTLIB::RINT_F32, RTLIB::RINT_F64, RTLIB::RINT_F80, RTLIB::RINT_F128, RTLIB::RINT_PPCF128), @@ -1370,6 +1402,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FROUND(SDNode *N, SDValue &Lo, SDValue &Hi) { SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + RTLIB::ROUND_F16, RTLIB::ROUND_F32, RTLIB::ROUND_F64, RTLIB::ROUND_F80, @@ -1381,7 +1414,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FSIN(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::SIN_F16, RTLIB::SIN_F32, RTLIB::SIN_F64, RTLIB::SIN_F80, RTLIB::SIN_F128, RTLIB::SIN_PPCF128), @@ -1391,7 +1424,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FSQRT(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::SQRT_F16, RTLIB::SQRT_F32, RTLIB::SQRT_F64, RTLIB::SQRT_F80, RTLIB::SQRT_F128, RTLIB::SQRT_PPCF128), @@ -1403,6 +1436,7 @@ SDValue &Hi) { SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; SDValue Call = TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0), + RTLIB::SUB_F16, RTLIB::SUB_F32, RTLIB::SUB_F64, RTLIB::SUB_F80, @@ -1415,7 +1449,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FTRUNC(SDNode *N, SDValue &Lo, SDValue &Hi) { - SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), + SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0), RTLIB::TRUNC_F16, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, RTLIB::TRUNC_F80, RTLIB::TRUNC_F128, RTLIB::TRUNC_PPCF128), Index: lib/CodeGen/TargetLoweringBase.cpp =================================================================== --- lib/CodeGen/TargetLoweringBase.cpp +++ lib/CodeGen/TargetLoweringBase.cpp @@ -1147,10 +1147,10 @@ // promote it to f32, because there are no f16 library calls (except for // conversions). if (!isTypeLegal(MVT::f16)) { - NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::f32]; - RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::f32]; - TransformToType[MVT::f16] = MVT::f32; - ValueTypeActions.setTypeAction(MVT::f16, TypePromoteFloat); + NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::i16]; + RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::i16]; + TransformToType[MVT::f16] = MVT::i16; + ValueTypeActions.setTypeAction(MVT::f16, TypeSoftenFloat); } // Loop over all of the vector value types to see which need transformations.