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