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 | |
| 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')
| -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;  | 

