summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2006-12-01 16:30:47 +0000
committerJim Laskey <jlaskey@mac.com>2006-12-01 16:30:47 +0000
commit1b0bc794e6be1714ece81c586f814a15f9f2f23a (patch)
tree15273fd5e017d9c8c02f804120815a51003a5df7 /llvm/lib/Target/PowerPC/PPCISelLowering.cpp
parent311622f91273d1a2829d5d2df0321b48fa572ef7 (diff)
downloadbcm5719-llvm-1b0bc794e6be1714ece81c586f814a15f9f2f23a.tar.gz
bcm5719-llvm-1b0bc794e6be1714ece81c586f814a15f9f2f23a.zip
1. In ppc64 mode we need only use one GPR.
2. Float values need to be promoted to double when they are vararg. llvm-svn: 32074
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCISelLowering.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCISelLowering.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index d564ff7b688..d5129d56887 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -1377,6 +1377,12 @@ static SDOperand LowerCALL(SDOperand Op, SelectionDAG &DAG) {
break;
case MVT::f32:
case MVT::f64:
+ if (isVarArg && isPPC64) {
+ // Float varargs need to be promoted to double.
+ if (Arg.getValueType() == MVT::f32)
+ Arg = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Arg);
+ }
+
if (FPR_idx != NumFPRs) {
RegsToPass.push_back(std::make_pair(FPR[FPR_idx++], Arg));
@@ -1390,7 +1396,7 @@ static SDOperand LowerCALL(SDOperand Op, SelectionDAG &DAG) {
MemOpChains.push_back(Load.getValue(1));
RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load));
}
- if (GPR_idx != NumGPRs && Arg.getValueType() == MVT::f64) {
+ if (GPR_idx != NumGPRs && Arg.getValueType() == MVT::f64 && !isPPC64){
SDOperand ConstFour = DAG.getConstant(4, PtrOff.getValueType());
PtrOff = DAG.getNode(ISD::ADD, PtrVT, PtrOff, ConstFour);
SDOperand Load = DAG.getLoad(PtrVT, Store, PtrOff, NULL, 0);
OpenPOWER on IntegriCloud