PPCCodeEmitter.cpp revision 369503f8412bba4a0138074c97107c09cc4513e0
121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===-- PPCCodeEmitter.cpp - JIT Code Emitter for PowerPC32 -------*- C++ -*-=//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
35dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman//                     The LLVM Compiler Infrastructure
45dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman//
55dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman// This file was developed by the LLVM research group and is distributed under
65dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
85dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman//===----------------------------------------------------------------------===//
9b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
10d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman// This file defines the PowerPC 32-bit CodeEmitter and associated machinery to
11d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman// JIT-compile bytecode to native PowerPC.
125dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman//
135dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman//===----------------------------------------------------------------------===//
145dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman
1516e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCTargetMachine.h"
1616e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCRelocations.h"
172668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
183070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman#include "llvm/Module.h"
19de123822e5cc9a7d09b12166439cfd35a6c9ed62Chris Lattner#include "llvm/PassManager.h"
20b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman#include "llvm/CodeGen/MachineCodeEmitter.h"
21b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman#include "llvm/CodeGen/MachineFunctionPass.h"
22d4b4a99587a0856473b9334455f6cebcb4fe2583Misha Brukman#include "llvm/CodeGen/MachineInstrBuilder.h"
23b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman#include "llvm/CodeGen/Passes.h"
24551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/Debug.h"
25d2ee218b499fcd364aae7da031819b738f009cd1Evan Cheng#include "llvm/Target/TargetOptions.h"
2686a5484079abc8a20f24066aaf3f5efcccebb673Chris Lattner#include <iostream>
27eea9b134fcd97aa6c11277864fecf2d30640d27fChris Lattnerusing namespace llvm;
285dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman
29b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukmannamespace {
304c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner  class PPCCodeEmitter : public MachineFunctionPass {
31b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    TargetMachine &TM;
32b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    MachineCodeEmitter &MCE;
33b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
343070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    // Tracks which instruction references which BasicBlock
35b752a97ca41de789434fa792b6de01f6c04fe13eChris Lattner    std::vector<std::pair<MachineBasicBlock*, unsigned*> > BBRefs;
363070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    // Tracks where each BasicBlock starts
37b752a97ca41de789434fa792b6de01f6c04fe13eChris Lattner    std::map<MachineBasicBlock*, long> BBLocations;
383070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman
393070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    /// getMachineOpValue - evaluates the MachineOperand of a given MachineInstr
403070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    ///
41e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    int getMachineOpValue(MachineInstr &MI, MachineOperand &MO);
423070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman
43b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  public:
444c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner    PPCCodeEmitter(TargetMachine &T, MachineCodeEmitter &M)
45b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman      : TM(T), MCE(M) {}
46b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
47b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    const char *getPassName() const { return "PowerPC Machine Code Emitter"; }
48b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
49b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    /// runOnMachineFunction - emits the given MachineFunction to memory
50b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    ///
51b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    bool runOnMachineFunction(MachineFunction &MF);
52b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
53b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    /// emitBasicBlock - emits the given MachineBasicBlock to memory
54b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    ///
55b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    void emitBasicBlock(MachineBasicBlock &MBB);
56b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
57b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    /// emitWord - write a 32-bit word to memory at the current PC
58b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    ///
59b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    void emitWord(unsigned w) { MCE.emitWord(w); }
60b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
61d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman    /// getValueBit - return the particular bit of Val
62d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman    ///
63d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman    unsigned getValueBit(int64_t Val, unsigned bit) { return (Val >> bit) & 1; }
64b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
653070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    /// getBinaryCodeForInstr - This function, generated by the
663070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    /// CodeEmitterGenerator using TableGen, produces the binary encoding for
673070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    /// machine instructions.
68b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman    ///
69d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman    unsigned getBinaryCodeForInstr(MachineInstr &MI);
70b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  };
71b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman}
72b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
735dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman/// addPassesToEmitMachineCode - Add passes to the specified pass manager to get
745dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman/// machine code emitted.  This uses a MachineCodeEmitter object to handle
755dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman/// actually outputting the machine code and resolving things like the address
765dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman/// of functions.  This method should returns true if machine code emission is
775dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman/// not supported.
785dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman///
7921e463b2bf864671a87ebe386cb100ef9349a540Nate Begemanbool PPCTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
8021e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman                                                  MachineCodeEmitter &MCE) {
81b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  // Machine code emitter pass for PowerPC
824c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner  PM.add(new PPCCodeEmitter(*this, MCE));
83d37faba5b485eefe94e36e0f88da899b8fec42e5Misha Brukman  // Delete machine code for this function after emitting it
84b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  PM.add(createMachineCodeDeleter());
85c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman  return false;
86b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman}
87b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
884c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattnerbool PPCCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
894c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng  assert((MF.getTarget().getRelocationModel() != Reloc::Default ||
904c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng          MF.getTarget().getRelocationModel() != Reloc::Static) &&
914c1aa866578f7a358407a22fe55b454f52a24325Evan Cheng         "JIT relocation model must be set to static or default!");
92b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  MCE.startFunction(MF);
93b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  MCE.emitConstantPool(MF.getConstantPool());
943070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); BB != E; ++BB)
953070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    emitBasicBlock(*BB);
96b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  MCE.finishFunction(MF);
973070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman
983070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  // Resolve branches to BasicBlocks for the entire function
993070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
100e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    intptr_t Location = BBLocations[BBRefs[i].first];
1018599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    unsigned *Ref = BBRefs[i].second;
102e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location
1038599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner                    << "\n");
1048599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    unsigned Instr = *Ref;
1058599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    intptr_t BranchTargetDisp = (Location - (intptr_t)Ref) >> 2;
106b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
1078599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    switch (Instr >> 26) {
1088599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    default: assert(0 && "Unknown branch user!");
1098599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    case 18:  // This is B or BL
1108599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner      *Ref |= (BranchTargetDisp & ((1 << 24)-1)) << 2;
1118599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner      break;
1128599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner    case 16:  // This is BLT,BLE,BEQ,BGE,BGT,BNE, or other bcx instruction
1138599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner      *Ref |= (BranchTargetDisp & ((1 << 14)-1)) << 2;
1148599d385a2f1fbafaaead903ea5be5a9b33a6509Chris Lattner      break;
1153070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    }
1163070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  }
1173070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  BBRefs.clear();
1183070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  BBLocations.clear();
1193070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman
120b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman  return false;
121b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman}
122b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
1234c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattnervoid PPCCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
124b752a97ca41de789434fa792b6de01f6c04fe13eChris Lattner  BBLocations[&MBB] = MCE.getCurrentPCValue();
125a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman  for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I){
126a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman    MachineInstr &MI = *I;
127a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman    unsigned Opcode = MI.getOpcode();
128e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    switch (MI.getOpcode()) {
129e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    default:
130d4b4a99587a0856473b9334455f6cebcb4fe2583Misha Brukman      emitWord(getBinaryCodeForInstr(*I));
131e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner      break;
1322b54400f085391a247dd2c3fffc9f36f7b2dc867Chris Lattner    case PPC::IMPLICIT_DEF_GPR:
133919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner    case PPC::IMPLICIT_DEF_F8:
134919c032fa4511468aadc6f50d6ed9c50890710b3Chris Lattner    case PPC::IMPLICIT_DEF_F4:
135f3ce43210a5f6e89cff40674919890329a46ef13Chris Lattner    case PPC::IMPLICIT_DEF_VRRC:
136e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner      break; // pseudo opcode, no side effects
137e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    case PPC::MovePCtoLR:
1382497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      assert(0 && "CodeEmitter does not support MovePCtoLR instruction");
139e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner      break;
140e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    }
141a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman  }
142b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman}
143b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
1444c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattnerint PPCCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) {
145b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
146e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner  int rv = 0; // Return value; defaults to 0 for unhandled cases
147c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman                  // or things that get fixed up later by the JIT.
1483070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman  if (MO.isRegister()) {
149369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner    rv = PPCRegisterInfo::getRegisterNumbering(MO.getReg());
150f577c6122f8b51c4e4889f1e1c647ae210c501b8Chris Lattner
151adeb43ddf4eac9e75b7c8e79fa832f72922a2926Nate Begeman    // Special encoding for MTCRF and MFOCRF, which uses a bit mask for the
152f577c6122f8b51c4e4889f1e1c647ae210c501b8Chris Lattner    // register, not the register number directly.
153adeb43ddf4eac9e75b7c8e79fa832f72922a2926Nate Begeman    if ((MI.getOpcode() == PPC::MTCRF || MI.getOpcode() == PPC::MFOCRF) &&
154f577c6122f8b51c4e4889f1e1c647ae210c501b8Chris Lattner        (MO.getReg() >= PPC::CR0 && MO.getReg() <= PPC::CR7)) {
155f577c6122f8b51c4e4889f1e1c647ae210c501b8Chris Lattner      rv = 0x80 >> rv;
156f577c6122f8b51c4e4889f1e1c647ae210c501b8Chris Lattner    }
157c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman  } else if (MO.isImmediate()) {
158c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman    rv = MO.getImmedValue();
159477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner  } else if (MO.isGlobalAddress() || MO.isExternalSymbol()) {
160477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner    bool isExternal = MO.isExternalSymbol() ||
161477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner                      MO.getGlobal()->hasWeakLinkage() ||
1625fe0e28650dd49f290fce2b80c0052fbc12d2385Chris Lattner                      MO.getGlobal()->hasLinkOnceLinkage() ||
16337dd6f1b79bd888cb88ced7e5ce5a8ebc7aa44e2Chris Lattner                      (MO.getGlobal()->isExternal() &&
16437dd6f1b79bd888cb88ced7e5ce5a8ebc7aa44e2Chris Lattner                       !MO.getGlobal()->hasNotBeenReadFromBytecode());
165d7fa35c6d2acc2fe95346b1b9eaa3c0a30342c85Chris Lattner    unsigned Reloc = 0;
166422b0cee7a32636303398d8788f98a59bf15381cNate Begeman    if (MI.getOpcode() == PPC::BL)
167e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner      Reloc = PPC::reloc_pcrel_bx;
1685efb75daed48edfeb03ba62f3f0afe81b86f5d7fChris Lattner    else {
1692497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      switch (MI.getOpcode()) {
1702497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      default: MI.dump(); assert(0 && "Unknown instruction for relocation!");
1712497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LIS:
172477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner        if (isExternal)
1735efb75daed48edfeb03ba62f3f0afe81b86f5d7fChris Lattner          Reloc = PPC::reloc_absolute_ptr_high;   // Pointer to stub
17400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen        else
1755efb75daed48edfeb03ba62f3f0afe81b86f5d7fChris Lattner          Reloc = PPC::reloc_absolute_high;       // Pointer to symbol
1762497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman        break;
1772497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LA:
178477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner        assert(!isExternal && "Something in the ISEL changed\n");
1795efb75daed48edfeb03ba62f3f0afe81b86f5d7fChris Lattner        Reloc = PPC::reloc_absolute_low;
1802497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman        break;
1812497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LBZ:
1822497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LHA:
1832497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LHZ:
1842497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LWZ:
1852497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LFS:
1862497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::LFD:
1872497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::STB:
1882497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::STH:
1892497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::STW:
1902497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::STFS:
1912497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      case PPC::STFD:
1922497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman        if (isExternal)
1932497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman          Reloc = PPC::reloc_absolute_ptr_low;
19400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen        else
1952497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman          Reloc = PPC::reloc_absolute_low;
1962497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman        break;
1975efb75daed48edfeb03ba62f3f0afe81b86f5d7fChris Lattner      }
198e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner    }
199477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner    if (MO.isGlobalAddress())
200477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner      MCE.addRelocation(MachineRelocation(MCE.getCurrentPCOffset(),
2012497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman                                          Reloc, MO.getGlobal(), 0));
202477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner    else
203477d1de9b2c77455192b6e67dd9496851f4ed8d0Chris Lattner      MCE.addRelocation(MachineRelocation(MCE.getCurrentPCOffset(),
2042497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman                                          Reloc, MO.getSymbolName(), 0));
205c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman  } else if (MO.isMachineBasicBlock()) {
2063070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue();
207b752a97ca41de789434fa792b6de01f6c04fe13eChris Lattner    BBRefs.push_back(std::make_pair(MO.getMachineBasicBlock(), CurrPC));
208c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman  } else if (MO.isConstantPoolIndex()) {
2093070e2ff790e106f5969f503487db5e4b8639ce4Misha Brukman    unsigned index = MO.getConstantPoolIndex();
210b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner    unsigned Opcode = MI.getOpcode();
2112497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman    rv = MCE.getConstantPoolEntryAddress(index);
212e54645a6fb9887b3eccf2eade24531165f84b0edChris Lattner    if (Opcode == PPC::LIS || Opcode == PPC::ADDIS) {
2132497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      // lis wants hi16(addr)
214b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner      if ((short)rv < 0) rv += 1 << 16;
215e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner      rv >>= 16;
216a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman    } else if (Opcode == PPC::LWZ || Opcode == PPC::LA ||
217e54645a6fb9887b3eccf2eade24531165f84b0edChris Lattner               Opcode == PPC::LI ||
218a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman               Opcode == PPC::LFS || Opcode == PPC::LFD) {
2192497e6391f8df05926fe17b5cf08dad61c4797d2Nate Begeman      // These load opcodes want lo16(addr)
220e94c517bb52095f1ad070bb029617d532af405b8Chris Lattner      rv &= 0xffff;
221b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner    } else {
222b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner      assert(0 && "Unknown constant pool using instruction!");
223a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman    }
224b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner  } else {
225b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner    std::cerr << "ERROR: Unknown type of MachineOperand: " << MO << "\n";
226b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner    abort();
227a4df350ba1193b2f0421d06a135beb21afb80035Misha Brukman  }
228b9f26da5dd6c404e0a6eabcb60fb3c61ac0ee173Chris Lattner
229c982cfad875f64284ae0fb2f822b0867657171ebMisha Brukman  return rv;
2305dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman}
2315dfe3a9c3bd9091f9adecc909665d52bdd4edd8cMisha Brukman
2324c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner#include "PPCGenCodeEmitter.inc"
233b05daff7faf694a8d18f00ef00132384c8207cd4Misha Brukman
234