diff options
| author | Misha Brukman <brukman+llvm@gmail.com> | 2004-10-23 23:47:34 +0000 |
|---|---|---|
| committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-10-23 23:47:34 +0000 |
| commit | 9ce0da9e90b54e4e5b960e8ab3c7a98edd3650f4 (patch) | |
| tree | 2ad594db3be11e3fe154957950f1b14da7e1414a /llvm/lib | |
| parent | f1f62707081644a8c81e020abcadc5bd69a1ad08 (diff) | |
| download | bcm5719-llvm-9ce0da9e90b54e4e5b960e8ab3c7a98edd3650f4.tar.gz bcm5719-llvm-9ce0da9e90b54e4e5b960e8ab3c7a98edd3650f4.zip | |
* Correctly handle the MovePCtoLR pseudo-instr with a bl to next instr
* Stop the confusion of using rv and Addr for global addresses: just use rv
llvm-svn: 17195
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp b/llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp index 51ed6d41e11..cdcb5ef4520 100644 --- a/llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp +++ b/llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp @@ -18,6 +18,7 @@ #include "llvm/Module.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Support/Debug.h" @@ -204,9 +205,15 @@ void PPC32CodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I){ MachineInstr &MI = *I; unsigned Opcode = MI.getOpcode(); - if (Opcode == PPC::IMPLICIT_DEF) continue; - - emitWord(getBinaryCodeForInstr(*I)); + if (Opcode == PPC::IMPLICIT_DEF) + continue; // pseudo opcode, no side effects + else if (Opcode == PPC::MovePCtoLR) { + // This can be simplified: the resulting 32-bit code is 0x48000005 + MachineInstr *MI = BuildMI(PPC::BL, 1).addImm(1); + emitWord(getBinaryCodeForInstr(*MI)); + delete MI; + } else + emitWord(getBinaryCodeForInstr(*I)); } } @@ -269,16 +276,15 @@ int64_t PPC32CodeEmitter::getMachineOpValue(MachineInstr &MI, rv = MO.getImmedValue(); } else if (MO.isGlobalAddress()) { GlobalValue *GV = MO.getGlobal(); - intptr_t Addr = (intptr_t)MCE.getGlobalValueAddress(GV); - if (Addr == 0) { + rv = MCE.getGlobalValueAddress(GV); + if (rv == 0) { if (Function *F = dyn_cast<Function>(GV)) { if (F->isExternal()) rv = getAddressOfExternalFunction(F); else { - // Function has not yet been code generated! + // Function has not yet been code generated! Use lazy resolution. getResolver(MCE).addFunctionReference(MCE.getCurrentPCValue(), F); - // Delayed resolution... - return (intptr_t)getResolver(MCE).getLazyResolver(F); + rv = getResolver(MCE).getLazyResolver(F); } } else if (GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) { if (GVar->isExternal()) { @@ -295,7 +301,7 @@ int64_t PPC32CodeEmitter::getMachineOpValue(MachineInstr &MI, } } if (MO.isPCRelative()) { // Global variable reference - rv = (Addr - MCE.getCurrentPCValue()) >> 2; + rv = (rv - MCE.getCurrentPCValue()) >> 2; } } else if (MO.isMachineBasicBlock()) { const BasicBlock *BB = MO.getMachineBasicBlock()->getBasicBlock(); |

