diff options
| author | Nate Begeman <natebegeman@mac.com> | 2005-03-31 02:05:53 +0000 |
|---|---|---|
| committer | Nate Begeman <natebegeman@mac.com> | 2005-03-31 02:05:53 +0000 |
| commit | eddfff338a35f5ddcd08174c70581d7a500c3522 (patch) | |
| tree | ea0e6d269b6e493a19b48c16b122615371bb30df /llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp | |
| parent | 9de7ddf7d50c46ade769164e076bf7e819919201 (diff) | |
| download | bcm5719-llvm-eddfff338a35f5ddcd08174c70581d7a500c3522.tar.gz bcm5719-llvm-eddfff338a35f5ddcd08174c70581d7a500c3522.zip | |
Pass the correct values to the chain argument for node construction during
LowerCallTo.
Handle ISD::ADD in SelectAddr, allowing us to have nonzero immediates for
loads and stores, amazing!
llvm-svn: 20946
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp b/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp index e3803b9f141..bfb03275eb8 100644 --- a/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp +++ b/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp @@ -321,21 +321,22 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain, case MVT::f64: if (FPR_remaining > 0) { if (isVarArg) { - MemOps.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, - Args[i].first, PtrOff)); + SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Chain, + Args[i].first, PtrOff); + MemOps.push_back(Store); // Float varargs are always shadowed in available integer registers if (GPR_remaining > 0) { - SDOperand Load = DAG.getLoad(MVT::i32, Chain, PtrOff); + SDOperand Load = DAG.getLoad(MVT::i32, Store, PtrOff); MemOps.push_back(Load); - args_to_use.push_back(DAG.getCopyToReg(Chain, Load, + args_to_use.push_back(DAG.getCopyToReg(Load, Load, GPR[GPR_idx])); } if (GPR_remaining > 1 && MVT::f64 == ArgVT) { SDOperand ConstFour = DAG.getConstant(4, getPointerTy()); PtrOff = DAG.getNode(ISD::ADD, MVT::i32, PtrOff, ConstFour); - SDOperand Load = DAG.getLoad(MVT::i32, Chain, PtrOff); + SDOperand Load = DAG.getLoad(MVT::i32, Store, PtrOff); MemOps.push_back(Load); - args_to_use.push_back(DAG.getCopyToReg(Chain, Load, + args_to_use.push_back(DAG.getCopyToReg(Load, Load, GPR[GPR_idx+1])); } } @@ -521,6 +522,13 @@ unsigned ISel::getGlobalBaseReg() { //Check to see if the load is a constant offset from a base register void ISel::SelectAddr(SDOperand N, unsigned& Reg, int& offset) { + unsigned imm = 0, opcode = N.getOpcode(); + if (N.getOpcode() == ISD::ADD) + if (1 == canUseAsImmediateForOpcode(N.getOperand(1), opcode, imm)) { + Reg = SelectExpr(N.getOperand(0)); + offset = imm; + return; + } Reg = SelectExpr(N); offset = 0; return; |

