forked from OSchip/llvm-project
[LegalizeTypes] Add SoftenFloatRes_Unary and SoftenFloatRes_Binary functions to factor repeated patterns out of many of the SoftenFloatRes_* functions
This has been factored out of D70654 which will add strict FP support to these functions. By making the helpers we avoid repeating even more code. Differential Revision: https://reviews.llvm.org/D70736
This commit is contained in:
parent
a38fc61648
commit
9b08366f57
|
@ -112,6 +112,28 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
|
|||
}
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_Unary(SDNode *N, RTLIB::Libcall LC) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
assert(N->getNumOperands() == 1 && "Unexpected number of operands!");
|
||||
SDValue Op = GetSoftenedFloat(N->getOperand(0));
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpVT = N->getOperand(0).getValueType();
|
||||
CallOptions.setTypeListBeforeSoften(OpVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, LC, NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_Binary(SDNode *N, RTLIB::Libcall LC) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
assert(N->getNumOperands() == 2 && "Unexpected number of operands!");
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, LC, NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_BITCAST(SDNode *N) {
|
||||
return BitConvertToInteger(N->getOperand(0));
|
||||
}
|
||||
|
@ -175,54 +197,30 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FABS(SDNode *N) {
|
|||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FMINNUM(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::FMIN_F32,
|
||||
RTLIB::FMIN_F64,
|
||||
RTLIB::FMIN_F80,
|
||||
RTLIB::FMIN_F128,
|
||||
RTLIB::FMIN_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::FMIN_F32,
|
||||
RTLIB::FMIN_F64,
|
||||
RTLIB::FMIN_F80,
|
||||
RTLIB::FMIN_F128,
|
||||
RTLIB::FMIN_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FMAXNUM(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::FMAX_F32,
|
||||
RTLIB::FMAX_F64,
|
||||
RTLIB::FMAX_F80,
|
||||
RTLIB::FMAX_F128,
|
||||
RTLIB::FMAX_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::FMAX_F32,
|
||||
RTLIB::FMAX_F64,
|
||||
RTLIB::FMAX_F80,
|
||||
RTLIB::FMAX_F128,
|
||||
RTLIB::FMAX_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FADD(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::ADD_F32,
|
||||
RTLIB::ADD_F64,
|
||||
RTLIB::ADD_F80,
|
||||
RTLIB::ADD_F128,
|
||||
RTLIB::ADD_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::ADD_F32,
|
||||
RTLIB::ADD_F64,
|
||||
RTLIB::ADD_F80,
|
||||
RTLIB::ADD_F128,
|
||||
RTLIB::ADD_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FCBRT(SDNode *N) {
|
||||
|
@ -241,18 +239,12 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FCBRT(SDNode *N) {
|
|||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FCEIL(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::CEIL_F32,
|
||||
RTLIB::CEIL_F64,
|
||||
RTLIB::CEIL_F80,
|
||||
RTLIB::CEIL_F128,
|
||||
RTLIB::CEIL_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::CEIL_F32,
|
||||
RTLIB::CEIL_F64,
|
||||
RTLIB::CEIL_F80,
|
||||
RTLIB::CEIL_F128,
|
||||
RTLIB::CEIL_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FCOPYSIGN(SDNode *N) {
|
||||
|
@ -304,125 +296,75 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FCOPYSIGN(SDNode *N) {
|
|||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FCOS(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::COS_F32,
|
||||
RTLIB::COS_F64,
|
||||
RTLIB::COS_F80,
|
||||
RTLIB::COS_F128,
|
||||
RTLIB::COS_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::COS_F32,
|
||||
RTLIB::COS_F64,
|
||||
RTLIB::COS_F80,
|
||||
RTLIB::COS_F128,
|
||||
RTLIB::COS_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FDIV(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::DIV_F32,
|
||||
RTLIB::DIV_F64,
|
||||
RTLIB::DIV_F80,
|
||||
RTLIB::DIV_F128,
|
||||
RTLIB::DIV_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::DIV_F32,
|
||||
RTLIB::DIV_F64,
|
||||
RTLIB::DIV_F80,
|
||||
RTLIB::DIV_F128,
|
||||
RTLIB::DIV_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FEXP(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::EXP_F32,
|
||||
RTLIB::EXP_F64,
|
||||
RTLIB::EXP_F80,
|
||||
RTLIB::EXP_F128,
|
||||
RTLIB::EXP_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::EXP_F32,
|
||||
RTLIB::EXP_F64,
|
||||
RTLIB::EXP_F80,
|
||||
RTLIB::EXP_F128,
|
||||
RTLIB::EXP_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FEXP2(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::EXP2_F32,
|
||||
RTLIB::EXP2_F64,
|
||||
RTLIB::EXP2_F80,
|
||||
RTLIB::EXP2_F128,
|
||||
RTLIB::EXP2_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::EXP2_F32,
|
||||
RTLIB::EXP2_F64,
|
||||
RTLIB::EXP2_F80,
|
||||
RTLIB::EXP2_F128,
|
||||
RTLIB::EXP2_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FFLOOR(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::FLOOR_F32,
|
||||
RTLIB::FLOOR_F64,
|
||||
RTLIB::FLOOR_F80,
|
||||
RTLIB::FLOOR_F128,
|
||||
RTLIB::FLOOR_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::FLOOR_F32,
|
||||
RTLIB::FLOOR_F64,
|
||||
RTLIB::FLOOR_F80,
|
||||
RTLIB::FLOOR_F128,
|
||||
RTLIB::FLOOR_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG(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::LOG_F32,
|
||||
RTLIB::LOG_F64,
|
||||
RTLIB::LOG_F80,
|
||||
RTLIB::LOG_F128,
|
||||
RTLIB::LOG_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::LOG_F32,
|
||||
RTLIB::LOG_F64,
|
||||
RTLIB::LOG_F80,
|
||||
RTLIB::LOG_F128,
|
||||
RTLIB::LOG_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG2(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::LOG2_F32,
|
||||
RTLIB::LOG2_F64,
|
||||
RTLIB::LOG2_F80,
|
||||
RTLIB::LOG2_F128,
|
||||
RTLIB::LOG2_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::LOG2_F32,
|
||||
RTLIB::LOG2_F64,
|
||||
RTLIB::LOG2_F80,
|
||||
RTLIB::LOG2_F128,
|
||||
RTLIB::LOG2_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FLOG10(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::LOG10_F32,
|
||||
RTLIB::LOG10_F64,
|
||||
RTLIB::LOG10_F80,
|
||||
RTLIB::LOG10_F128,
|
||||
RTLIB::LOG10_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::LOG10_F32,
|
||||
RTLIB::LOG10_F64,
|
||||
RTLIB::LOG10_F80,
|
||||
RTLIB::LOG10_F128,
|
||||
RTLIB::LOG10_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FMA(SDNode *N) {
|
||||
|
@ -445,35 +387,21 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FMA(SDNode *N) {
|
|||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::MUL_F32,
|
||||
RTLIB::MUL_F64,
|
||||
RTLIB::MUL_F80,
|
||||
RTLIB::MUL_F128,
|
||||
RTLIB::MUL_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::MUL_F32,
|
||||
RTLIB::MUL_F64,
|
||||
RTLIB::MUL_F80,
|
||||
RTLIB::MUL_F128,
|
||||
RTLIB::MUL_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FNEARBYINT(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::NEARBYINT_F32,
|
||||
RTLIB::NEARBYINT_F64,
|
||||
RTLIB::NEARBYINT_F80,
|
||||
RTLIB::NEARBYINT_F128,
|
||||
RTLIB::NEARBYINT_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::NEARBYINT_F32,
|
||||
RTLIB::NEARBYINT_F64,
|
||||
RTLIB::NEARBYINT_F80,
|
||||
RTLIB::NEARBYINT_F128,
|
||||
RTLIB::NEARBYINT_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FNEG(SDNode *N) {
|
||||
|
@ -568,20 +496,12 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FP_ROUND(SDNode *N) {
|
|||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FPOW(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::POW_F32,
|
||||
RTLIB::POW_F64,
|
||||
RTLIB::POW_F80,
|
||||
RTLIB::POW_F128,
|
||||
RTLIB::POW_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::POW_F32,
|
||||
RTLIB::POW_F64,
|
||||
RTLIB::POW_F80,
|
||||
RTLIB::POW_F128,
|
||||
RTLIB::POW_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FPOWI(SDNode *N) {
|
||||
|
@ -610,112 +530,66 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FPOWI(SDNode *N) {
|
|||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FREM(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::REM_F32,
|
||||
RTLIB::REM_F64,
|
||||
RTLIB::REM_F80,
|
||||
RTLIB::REM_F128,
|
||||
RTLIB::REM_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::REM_F32,
|
||||
RTLIB::REM_F64,
|
||||
RTLIB::REM_F80,
|
||||
RTLIB::REM_F128,
|
||||
RTLIB::REM_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FRINT(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::RINT_F32,
|
||||
RTLIB::RINT_F64,
|
||||
RTLIB::RINT_F80,
|
||||
RTLIB::RINT_F128,
|
||||
RTLIB::RINT_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::RINT_F32,
|
||||
RTLIB::RINT_F64,
|
||||
RTLIB::RINT_F80,
|
||||
RTLIB::RINT_F128,
|
||||
RTLIB::RINT_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FROUND(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::ROUND_F32,
|
||||
RTLIB::ROUND_F64,
|
||||
RTLIB::ROUND_F80,
|
||||
RTLIB::ROUND_F128,
|
||||
RTLIB::ROUND_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::ROUND_F32,
|
||||
RTLIB::ROUND_F64,
|
||||
RTLIB::ROUND_F80,
|
||||
RTLIB::ROUND_F128,
|
||||
RTLIB::ROUND_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FSIN(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::SIN_F32,
|
||||
RTLIB::SIN_F64,
|
||||
RTLIB::SIN_F80,
|
||||
RTLIB::SIN_F128,
|
||||
RTLIB::SIN_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::SIN_F32,
|
||||
RTLIB::SIN_F64,
|
||||
RTLIB::SIN_F80,
|
||||
RTLIB::SIN_F128,
|
||||
RTLIB::SIN_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FSQRT(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::SQRT_F32,
|
||||
RTLIB::SQRT_F64,
|
||||
RTLIB::SQRT_F80,
|
||||
RTLIB::SQRT_F128,
|
||||
RTLIB::SQRT_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::SQRT_F32,
|
||||
RTLIB::SQRT_F64,
|
||||
RTLIB::SQRT_F80,
|
||||
RTLIB::SQRT_F128,
|
||||
RTLIB::SQRT_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FSUB(SDNode *N) {
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue Ops[2] = { GetSoftenedFloat(N->getOperand(0)),
|
||||
GetSoftenedFloat(N->getOperand(1)) };
|
||||
TargetLowering::MakeLibCallOptions CallOptions;
|
||||
EVT OpsVT[2] = { N->getOperand(0).getValueType(),
|
||||
N->getOperand(1).getValueType() };
|
||||
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0), true);
|
||||
return TLI.makeLibCall(DAG, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::SUB_F32,
|
||||
RTLIB::SUB_F64,
|
||||
RTLIB::SUB_F80,
|
||||
RTLIB::SUB_F128,
|
||||
RTLIB::SUB_PPCF128),
|
||||
NVT, Ops, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::SUB_F32,
|
||||
RTLIB::SUB_F64,
|
||||
RTLIB::SUB_F80,
|
||||
RTLIB::SUB_F128,
|
||||
RTLIB::SUB_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_FTRUNC(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::TRUNC_F32,
|
||||
RTLIB::TRUNC_F64,
|
||||
RTLIB::TRUNC_F80,
|
||||
RTLIB::TRUNC_F128,
|
||||
RTLIB::TRUNC_PPCF128),
|
||||
NVT, Op, CallOptions, SDLoc(N)).first;
|
||||
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::TRUNC_F32,
|
||||
RTLIB::TRUNC_F64,
|
||||
RTLIB::TRUNC_F80,
|
||||
RTLIB::TRUNC_F128,
|
||||
RTLIB::TRUNC_PPCF128));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) {
|
||||
|
@ -866,7 +740,7 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) {
|
|||
return true;
|
||||
|
||||
assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
|
||||
"Invalid operand promotion");
|
||||
"Invalid operand softening");
|
||||
|
||||
ReplaceValueWith(SDValue(N, 0), Res);
|
||||
return false;
|
||||
|
|
|
@ -483,6 +483,8 @@ private:
|
|||
|
||||
// Convert Float Results to Integer.
|
||||
void SoftenFloatResult(SDNode *N, unsigned ResNo);
|
||||
SDValue SoftenFloatRes_Unary(SDNode *N, RTLIB::Libcall LC);
|
||||
SDValue SoftenFloatRes_Binary(SDNode *N, RTLIB::Libcall LC);
|
||||
SDValue SoftenFloatRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
|
||||
SDValue SoftenFloatRes_BITCAST(SDNode *N);
|
||||
SDValue SoftenFloatRes_BUILD_PAIR(SDNode *N);
|
||||
|
|
Loading…
Reference in New Issue