Add hooks for other intrinsics to get low-precision expansions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55845 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dale Johannesen 2008-09-05 18:38:42 +00:00
parent c39f4dba1c
commit 59e577f73c
2 changed files with 60 additions and 12 deletions

View File

@ -2753,6 +2753,58 @@ SelectionDAGLowering::implVisitBinaryAtomic(CallInst& I, ISD::NodeType Op) {
return 0;
}
/// visitExp - lower an exp intrinsic. Handles the special sequences
/// for limited-precision mode.
void
SelectionDAGLowering::visitExp(CallInst &I) {
SDValue result;
// No special expansion.
result = DAG.getNode(ISD::FEXP,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1)));
setValue(&I, result);
}
/// visitLog - lower a log intrinsic. Handles the special sequences
/// for limited-precision mode.
void
SelectionDAGLowering::visitLog(CallInst &I) {
SDValue result;
// No special expansion.
result = DAG.getNode(ISD::FLOG,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1)));
setValue(&I, result);
}
/// visitLog2 - lower a log2 intrinsic. Handles the special sequences
/// for limited-precision mode.
void
SelectionDAGLowering::visitLog2(CallInst &I) {
SDValue result;
// No special expansion.
result = DAG.getNode(ISD::FLOG2,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1)));
setValue(&I, result);
}
/// visitLog10 - lower a log10 intrinsic. Handles the special sequences
/// for limited-precision mode.
void
SelectionDAGLowering::visitLog10(CallInst &I) {
SDValue result;
// No special expansion.
result = DAG.getNode(ISD::FLOG10,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1)));
setValue(&I, result);
}
/// visitExp2 - lower an exp2 intrinsic. Handles the special sequences
/// for limited-precision mode.
@ -3071,24 +3123,16 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
getValue(I.getOperand(1))));
return 0;
case Intrinsic::log:
setValue(&I, DAG.getNode(ISD::FLOG,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1))));
visitLog(I);
return 0;
case Intrinsic::log2:
setValue(&I, DAG.getNode(ISD::FLOG2,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1))));
visitLog2(I);
return 0;
case Intrinsic::log10:
setValue(&I, DAG.getNode(ISD::FLOG10,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1))));
visitLog10(I);
return 0;
case Intrinsic::exp:
setValue(&I, DAG.getNode(ISD::FEXP,
getValue(I.getOperand(1)).getValueType(),
getValue(I.getOperand(1))));
visitExp(I);
return 0;
case Intrinsic::exp2:
visitExp2(I);

View File

@ -506,6 +506,10 @@ private:
void visitTargetIntrinsic(CallInst &I, unsigned Intrinsic);
void visitExp2(CallInst &I);
void visitExp(CallInst &I);
void visitLog(CallInst &I);
void visitLog2(CallInst &I);
void visitLog10(CallInst &I);
void visitVAStart(CallInst &I);
void visitVAArg(VAArgInst &I);