mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-15 06:29:05 +00:00
Add libcalls for the new rounding opcodes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55133 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -97,6 +97,26 @@ namespace RTLIB {
|
|||||||
POW_F64,
|
POW_F64,
|
||||||
POW_F80,
|
POW_F80,
|
||||||
POW_PPCF128,
|
POW_PPCF128,
|
||||||
|
CEIL_F32,
|
||||||
|
CEIL_F64,
|
||||||
|
CEIL_F80,
|
||||||
|
CEIL_PPCF128,
|
||||||
|
TRUNC_F32,
|
||||||
|
TRUNC_F64,
|
||||||
|
TRUNC_F80,
|
||||||
|
TRUNC_PPCF128,
|
||||||
|
RINT_F32,
|
||||||
|
RINT_F64,
|
||||||
|
RINT_F80,
|
||||||
|
RINT_PPCF128,
|
||||||
|
NEARBYINT_F32,
|
||||||
|
NEARBYINT_F64,
|
||||||
|
NEARBYINT_F80,
|
||||||
|
NEARBYINT_PPCF128,
|
||||||
|
FLOOR_F32,
|
||||||
|
FLOOR_F64,
|
||||||
|
FLOOR_F80,
|
||||||
|
FLOOR_PPCF128,
|
||||||
|
|
||||||
// CONVERSION
|
// CONVERSION
|
||||||
FPEXT_F32_F64,
|
FPEXT_F32_F64,
|
||||||
|
@@ -3529,6 +3529,11 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
Result = DAG.getNode(ISD::SELECT, VT, Tmp2, Tmp1, Tmp3);
|
Result = DAG.getNode(ISD::SELECT, VT, Tmp2, Tmp1, Tmp3);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ISD::FTRUNC:
|
||||||
|
case ISD::FFLOOR:
|
||||||
|
case ISD::FCEIL:
|
||||||
|
case ISD::FRINT:
|
||||||
|
case ISD::FNEARBYINT:
|
||||||
case ISD::FSQRT:
|
case ISD::FSQRT:
|
||||||
case ISD::FSIN:
|
case ISD::FSIN:
|
||||||
case ISD::FCOS: {
|
case ISD::FCOS: {
|
||||||
@@ -3554,6 +3559,26 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64,
|
LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64,
|
||||||
RTLIB::COS_F80, RTLIB::COS_PPCF128);
|
RTLIB::COS_F80, RTLIB::COS_PPCF128);
|
||||||
break;
|
break;
|
||||||
|
case ISD::FTRUNC:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64,
|
||||||
|
RTLIB::TRUNC_F80, RTLIB::TRUNC_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FFLOOR:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64,
|
||||||
|
RTLIB::FLOOR_F80, RTLIB::FLOOR_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FCEIL:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::CEIL_F32, RTLIB::CEIL_F64,
|
||||||
|
RTLIB::CEIL_F80, RTLIB::CEIL_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FRINT:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::RINT_F32, RTLIB::RINT_F64,
|
||||||
|
RTLIB::RINT_F80, RTLIB::RINT_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FNEARBYINT:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64,
|
||||||
|
RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_PPCF128);
|
||||||
|
break;
|
||||||
default: assert(0 && "Unreachable!");
|
default: assert(0 && "Unreachable!");
|
||||||
}
|
}
|
||||||
SDValue Dummy;
|
SDValue Dummy;
|
||||||
@@ -4144,6 +4169,11 @@ SDValue SelectionDAGLegalize::PromoteOp(SDValue Op) {
|
|||||||
case ISD::FSQRT:
|
case ISD::FSQRT:
|
||||||
case ISD::FSIN:
|
case ISD::FSIN:
|
||||||
case ISD::FCOS:
|
case ISD::FCOS:
|
||||||
|
case ISD::FTRUNC:
|
||||||
|
case ISD::FFLOOR:
|
||||||
|
case ISD::FCEIL:
|
||||||
|
case ISD::FRINT:
|
||||||
|
case ISD::FNEARBYINT:
|
||||||
Tmp1 = PromoteOp(Node->getOperand(0));
|
Tmp1 = PromoteOp(Node->getOperand(0));
|
||||||
assert(Tmp1.getValueType() == NVT);
|
assert(Tmp1.getValueType() == NVT);
|
||||||
Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
|
Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
|
||||||
@@ -6507,6 +6537,11 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
RTLIB::POWI_PPCF128),
|
RTLIB::POWI_PPCF128),
|
||||||
Node, false, Hi);
|
Node, false, Hi);
|
||||||
break;
|
break;
|
||||||
|
case ISD::FTRUNC:
|
||||||
|
case ISD::FFLOOR:
|
||||||
|
case ISD::FCEIL:
|
||||||
|
case ISD::FRINT:
|
||||||
|
case ISD::FNEARBYINT:
|
||||||
case ISD::FSQRT:
|
case ISD::FSQRT:
|
||||||
case ISD::FSIN:
|
case ISD::FSIN:
|
||||||
case ISD::FCOS: {
|
case ISD::FCOS: {
|
||||||
@@ -6524,6 +6559,26 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64,
|
LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64,
|
||||||
RTLIB::COS_F80, RTLIB::COS_PPCF128);
|
RTLIB::COS_F80, RTLIB::COS_PPCF128);
|
||||||
break;
|
break;
|
||||||
|
case ISD::FTRUNC:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64,
|
||||||
|
RTLIB::TRUNC_F80, RTLIB::TRUNC_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FFLOOR:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64,
|
||||||
|
RTLIB::FLOOR_F80, RTLIB::FLOOR_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FCEIL:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::CEIL_F32, RTLIB::CEIL_F64,
|
||||||
|
RTLIB::CEIL_F80, RTLIB::CEIL_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FRINT:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::RINT_F32, RTLIB::RINT_F64,
|
||||||
|
RTLIB::RINT_F80, RTLIB::RINT_PPCF128);
|
||||||
|
break;
|
||||||
|
case ISD::FNEARBYINT:
|
||||||
|
LC = GetFPLibCall(VT, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64,
|
||||||
|
RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_PPCF128);
|
||||||
|
break;
|
||||||
default: assert(0 && "Unreachable!");
|
default: assert(0 && "Unreachable!");
|
||||||
}
|
}
|
||||||
Lo = ExpandLibCall(LC, Node, false, Hi);
|
Lo = ExpandLibCall(LC, Node, false, Hi);
|
||||||
|
@@ -95,6 +95,26 @@ static void InitLibcallNames(const char **Names) {
|
|||||||
Names[RTLIB::POW_F64] = "pow";
|
Names[RTLIB::POW_F64] = "pow";
|
||||||
Names[RTLIB::POW_F80] = "powl";
|
Names[RTLIB::POW_F80] = "powl";
|
||||||
Names[RTLIB::POW_PPCF128] = "powl";
|
Names[RTLIB::POW_PPCF128] = "powl";
|
||||||
|
Names[RTLIB::CEIL_F32] = "ceilf";
|
||||||
|
Names[RTLIB::CEIL_F64] = "ceil";
|
||||||
|
Names[RTLIB::CEIL_F80] = "ceill";
|
||||||
|
Names[RTLIB::CEIL_PPCF128] = "ceill";
|
||||||
|
Names[RTLIB::TRUNC_F32] = "truncf";
|
||||||
|
Names[RTLIB::TRUNC_F64] = "trunc";
|
||||||
|
Names[RTLIB::TRUNC_F80] = "truncl";
|
||||||
|
Names[RTLIB::TRUNC_PPCF128] = "truncl";
|
||||||
|
Names[RTLIB::RINT_F32] = "rintf";
|
||||||
|
Names[RTLIB::RINT_F64] = "rint";
|
||||||
|
Names[RTLIB::RINT_F80] = "rintl";
|
||||||
|
Names[RTLIB::RINT_PPCF128] = "rintl";
|
||||||
|
Names[RTLIB::NEARBYINT_F32] = "nearbyintf";
|
||||||
|
Names[RTLIB::NEARBYINT_F64] = "nearbyint";
|
||||||
|
Names[RTLIB::NEARBYINT_F80] = "nearbyintl";
|
||||||
|
Names[RTLIB::NEARBYINT_PPCF128] = "nearbyintl";
|
||||||
|
Names[RTLIB::FLOOR_F32] = "floorf";
|
||||||
|
Names[RTLIB::FLOOR_F64] = "floor";
|
||||||
|
Names[RTLIB::FLOOR_F80] = "floorl";
|
||||||
|
Names[RTLIB::FLOOR_PPCF128] = "floorl";
|
||||||
Names[RTLIB::FPEXT_F32_F64] = "__extendsfdf2";
|
Names[RTLIB::FPEXT_F32_F64] = "__extendsfdf2";
|
||||||
Names[RTLIB::FPROUND_F64_F32] = "__truncdfsf2";
|
Names[RTLIB::FPROUND_F64_F32] = "__truncdfsf2";
|
||||||
Names[RTLIB::FPROUND_F80_F32] = "__truncxfsf2";
|
Names[RTLIB::FPROUND_F80_F32] = "__truncxfsf2";
|
||||||
|
Reference in New Issue
Block a user