aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/PowerPC/PPCCodeEmitter.cpp
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2004-10-23 23:47:34 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2004-10-23 23:47:34 +0000
commitd4b4a99587a0856473b9334455f6cebcb4fe2583 (patch)
tree6bdffee0be79ade74e7f31d71f8576597273ecfd /lib/Target/PowerPC/PPCCodeEmitter.cpp
parent40a55e1e291f1e28eadae19e5ce6f9087d99e085 (diff)
downloadexternal_llvm-d4b4a99587a0856473b9334455f6cebcb4fe2583.zip
external_llvm-d4b4a99587a0856473b9334455f6cebcb4fe2583.tar.gz
external_llvm-d4b4a99587a0856473b9334455f6cebcb4fe2583.tar.bz2
* 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17195 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCCodeEmitter.cpp')
-rw-r--r--lib/Target/PowerPC/PPCCodeEmitter.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/Target/PowerPC/PPCCodeEmitter.cpp b/lib/Target/PowerPC/PPCCodeEmitter.cpp
index 51ed6d4..cdcb5ef 100644
--- a/lib/Target/PowerPC/PPCCodeEmitter.cpp
+++ b/lib/Target/PowerPC/PPCCodeEmitter.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();