diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-03-20 22:38:22 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-03-20 22:38:22 +0000 |
| commit | c8b16d00b9391663efcf65220fbc27b229a87260 (patch) | |
| tree | 84ec8fb13118b91bf5a62a6944105d7956fdfb66 /llvm/lib | |
| parent | 6d74b09da754db836c253832858532cead6c5d85 (diff) | |
| download | bcm5719-llvm-c8b16d00b9391663efcf65220fbc27b229a87260.tar.gz bcm5719-llvm-c8b16d00b9391663efcf65220fbc27b229a87260.zip | |
Handle constant addresses more efficiently, folding the low bits into the
disp field of the load/store if possible. This compiles
CodeGen/PowerPC/load-constant-addr.ll to:
_test:
lis r2, 2838
lfs f1, 26848(r2)
blr
instead of:
_test:
lis r2, 2838
ori r2, r2, 26848
lfs f1, 0(r2)
blr
llvm-svn: 26908
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index 61e279c046e..bc6573b13c5 100644 --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -535,7 +535,24 @@ bool PPCDAGToDAGISel::SelectAddrImm(SDOperand N, SDOperand &Disp, return true; } } + } else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N)) { + // Loading from a constant address. + int Addr = (int)CN->getValue(); + + // If this address fits entirely in a 16-bit sext immediate field, codegen + // this as "d, 0" + if (Addr == (short)Addr) { + Disp = getI32Imm(Addr); + Base = CurDAG->getRegister(PPC::R0, MVT::i32); + return true; + } + + // Otherwise, break this down into an LIS + disp. + Disp = getI32Imm((short)Addr); + Base = CurDAG->getConstant(Addr - (signed short)Addr, MVT::i32); + return true; } + Disp = getI32Imm(0); if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) Base = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); |

