mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-17 00:57:54 +00:00
Teach SelectionDAG to match more calls to libm functions onto existing SDNodes. Mark these nodes as illegal by default, unless the target declares otherwise.
llvm-svn: 146171
This commit is contained in:
parent
f79eacae90
commit
d003a613e7
@ -5559,6 +5559,53 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
||||
Tmp.getValueType(), Tmp));
|
||||
return;
|
||||
}
|
||||
} else if (Name == "floor" || Name == "floorf" || Name == "floorl") {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FFLOOR, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
return;
|
||||
}
|
||||
} else if (Name == "nearbyint" || Name == "nearbyintf" ||
|
||||
Name == "nearbyintl") {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FNEARBYINT, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
return;
|
||||
}
|
||||
} else if (Name == "ceil" || Name == "ceilf" || Name == "ceill") {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FCEIL, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
return;
|
||||
}
|
||||
} else if (Name == "rint" || Name == "rintf" || Name == "rintl") {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FRINT, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
return;
|
||||
}
|
||||
} else if (Name == "trunc" || Name == "truncf" || Name == "truncl") {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FTRUNC, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
return;
|
||||
}
|
||||
|
||||
} else if (Name == "memcmp") {
|
||||
if (visitMemCmpCall(I))
|
||||
return;
|
||||
|
@ -577,16 +577,26 @@ TargetLowering::TargetLowering(const TargetMachine &tm,
|
||||
setOperationAction(ISD::ConstantFP, MVT::f80, Expand);
|
||||
|
||||
// These library functions default to expand.
|
||||
setOperationAction(ISD::FLOG , MVT::f64, Expand);
|
||||
setOperationAction(ISD::FLOG2, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FLOG10,MVT::f64, Expand);
|
||||
setOperationAction(ISD::FEXP , MVT::f64, Expand);
|
||||
setOperationAction(ISD::FEXP2, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FLOG , MVT::f32, Expand);
|
||||
setOperationAction(ISD::FLOG2, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FLOG10,MVT::f32, Expand);
|
||||
setOperationAction(ISD::FEXP , MVT::f32, Expand);
|
||||
setOperationAction(ISD::FEXP2, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FLOG , MVT::f64, Expand);
|
||||
setOperationAction(ISD::FLOG2, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FLOG10, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FEXP , MVT::f64, Expand);
|
||||
setOperationAction(ISD::FEXP2, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FFLOOR, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FNEARBYINT, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FCEIL, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FRINT, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FTRUNC, MVT::f64, Expand);
|
||||
setOperationAction(ISD::FLOG , MVT::f32, Expand);
|
||||
setOperationAction(ISD::FLOG2, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FLOG10, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FEXP , MVT::f32, Expand);
|
||||
setOperationAction(ISD::FEXP2, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FFLOOR, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FNEARBYINT, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FCEIL, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FRINT, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FTRUNC, MVT::f32, Expand);
|
||||
|
||||
// Default ISD::TRAP to expand (which turns it into abort).
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Expand);
|
||||
|
@ -103,6 +103,13 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
// from FP_ROUND: that rounds to nearest, this rounds to zero.
|
||||
setOperationAction(ISD::FP_ROUND_INREG, MVT::ppcf128, Custom);
|
||||
|
||||
// We do not currently implment this libm ops for PowerPC.
|
||||
setOperationAction(ISD::FFLOOR, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FCEIL, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FTRUNC, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FRINT, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FNEARBYINT, MVT::ppcf128, Expand);
|
||||
|
||||
// PowerPC has no SREM/UREM instructions
|
||||
setOperationAction(ISD::SREM, MVT::i32, Expand);
|
||||
setOperationAction(ISD::UREM, MVT::i32, Expand);
|
||||
|
@ -663,6 +663,11 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FCOS , MVT::f80 , Expand);
|
||||
}
|
||||
|
||||
setOperationAction(ISD::FFLOOR, MVT::f80, Expand);
|
||||
setOperationAction(ISD::FCEIL, MVT::f80, Expand);
|
||||
setOperationAction(ISD::FTRUNC, MVT::f80, Expand);
|
||||
setOperationAction(ISD::FRINT, MVT::f80, Expand);
|
||||
setOperationAction(ISD::FNEARBYINT, MVT::f80, Expand);
|
||||
setOperationAction(ISD::FMA, MVT::f80, Expand);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8 | FileCheck %s
|
||||
; rdar://7354379
|
||||
|
||||
declare double @floor(double) nounwind readnone
|
||||
declare double @foo(double) nounwind readnone
|
||||
|
||||
define void @t(i32 %c, double %b) {
|
||||
entry:
|
||||
@ -26,7 +26,7 @@ bb9: ; preds = %bb7
|
||||
; CHECK: cmp r0, #0
|
||||
; CHECK: cmp r0, #0
|
||||
; CHECK-NEXT: cbnz
|
||||
%0 = tail call double @floor(double %b) nounwind readnone ; <double> [#uses=0]
|
||||
%0 = tail call double @foo(double %b) nounwind readnone ; <double> [#uses=0]
|
||||
br label %bb11
|
||||
|
||||
bb11: ; preds = %bb9, %bb7
|
||||
|
Loading…
x
Reference in New Issue
Block a user