1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- Mips/MipsCodeEmitter.cpp - Convert Mips Code to Machine Code ------===// 2dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// 3dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// The LLVM Compiler Infrastructure 4dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// 5dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// This file is distributed under the University of Illinois Open Source 6dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// License. See LICENSE.TXT for details. 7dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// 8dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes//===---------------------------------------------------------------------===// 9dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// 10dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// This file contains the pass that transforms the Mips machine instructions 11dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// into relocatable machine code. 12dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes// 13dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes//===---------------------------------------------------------------------===// 14dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 15dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "Mips.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MCTargetDesc/MipsBaseInfo.h" 17dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "MipsInstrInfo.h" 18dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "MipsRelocations.h" 19dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "MipsSubtarget.h" 20dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "MipsTargetMachine.h" 2147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes#include "llvm/ADT/Statistic.h" 22dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/CodeGen/JITCodeEmitter.h" 23dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/CodeGen/MachineConstantPool.h" 24dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/CodeGen/MachineFunctionPass.h" 25dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/CodeGen/MachineInstr.h" 26b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h" 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineJumpTableInfo.h" 28dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/CodeGen/MachineModuleInfo.h" 2947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes#include "llvm/CodeGen/MachineOperand.h" 30dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/CodeGen/Passes.h" 310b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 320b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 3347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes#include "llvm/PassManager.h" 34dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/Support/Debug.h" 35dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/Support/ErrorHandling.h" 36dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include "llvm/Support/raw_ostream.h" 37dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#ifndef NDEBUG 38dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#include <iomanip> 39dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes#endif 40dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 41dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopesusing namespace llvm; 42dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "jit" 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 45c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso LopesSTATISTIC(NumEmitted, "Number of machine instructions emitted"); 46c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 47dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopesnamespace { 48dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 49dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopesclass MipsCodeEmitter : public MachineFunctionPass { 50dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MipsJITInfo *JTI; 51dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes const MipsInstrInfo *II; 523574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow const DataLayout *TD; 53dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes const MipsSubtarget *Subtarget; 54dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes TargetMachine &TM; 55dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes JITCodeEmitter &MCE; 56dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes const std::vector<MachineConstantPoolEntry> *MCPEs; 57dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes const std::vector<MachineJumpTableEntry> *MJTEs; 58dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes bool IsPIC; 59dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 61dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes AU.addRequired<MachineModuleInfo> (); 62dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MachineFunctionPass::getAnalysisUsage(AU); 63dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes } 64dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 65dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes static char ID; 66dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 671b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanakapublic: 681b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka MipsCodeEmitter(TargetMachine &tm, JITCodeEmitter &mce) 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : MachineFunctionPass(ID), JTI(nullptr), II(nullptr), TD(nullptr), 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TM(tm), MCE(mce), MCPEs(nullptr), MJTEs(nullptr), 711b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka IsPIC(TM.getRelocationModel() == Reloc::PIC_) {} 721b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool runOnMachineFunction(MachineFunction &MF) override; 741b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getPassName() const override { 761b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka return "Mips Machine Code Emitter"; 771b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka } 781b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 791b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// getBinaryCodeForInstr - This function, generated by the 801b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// CodeEmitterGenerator using TableGen, produces the binary encoding for 811b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// machine instructions. 821b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka uint64_t getBinaryCodeForInstr(const MachineInstr &MI) const; 831b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 84b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka void emitInstruction(MachineBasicBlock::instr_iterator MI, 85b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka MachineBasicBlock &MBB); 861b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 871b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanakaprivate: 881b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 891b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka void emitWord(unsigned Word); 901b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 911b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// Routines that handle operands which add machine relocations which are 921b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// fixed up by the relocation stage. 931b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka void emitGlobalAddress(const GlobalValue *GV, unsigned Reloc, 941b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka bool MayNeedFarStub) const; 951b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka void emitExternalSymbolAddress(const char *ES, unsigned Reloc) const; 961b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka void emitConstPoolAddress(unsigned CPI, unsigned Reloc) const; 971b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka void emitJumpTableAddress(unsigned JTIndex, unsigned Reloc) const; 981b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka void emitMachineBasicBlock(MachineBasicBlock *BB, unsigned Reloc) const; 991b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 1001b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// getMachineOpValue - Return binary encoding of operand. If the machine 1011b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka /// operand requires relocation, record the relocation and return zero. 1021b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getMachineOpValue(const MachineInstr &MI, 1031b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka const MachineOperand &MO) const; 1041b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 1051b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getRelocation(const MachineInstr &MI, 1061b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka const MachineOperand &MO) const; 1071b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 1081b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getJumpTargetOpValue(const MachineInstr &MI, unsigned OpNo) const; 1091aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic unsigned getJumpTargetOpValueMM(const MachineInstr &MI, unsigned OpNo) const; 1105c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic unsigned getBranchTargetOpValueMM(const MachineInstr &MI, 1115c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic unsigned OpNo) const; 1121b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getBranchTarget21OpValue(const MachineInstr &MI, 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned OpNo) const; 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getBranchTarget26OpValue(const MachineInstr &MI, 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned OpNo) const; 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getJumpOffset16OpValue(const MachineInstr &MI, unsigned OpNo) const; 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1191b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getBranchTargetOpValue(const MachineInstr &MI, unsigned OpNo) const; 1201b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getMemEncoding(const MachineInstr &MI, unsigned OpNo) const; 121da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter unsigned getMemEncodingMMImm12(const MachineInstr &MI, unsigned OpNo) const; 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMSAMemEncoding(const MachineInstr &MI, unsigned OpNo) const; 1231b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getSizeExtEncoding(const MachineInstr &MI, unsigned OpNo) const; 1241b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka unsigned getSizeInsEncoding(const MachineInstr &MI, unsigned OpNo) const; 12595adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida unsigned getLSAImmEncoding(const MachineInstr &MI, unsigned OpNo) const; 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getSimm19Lsl2Encoding(const MachineInstr &MI, unsigned OpNo) const; 127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned getSimm18Lsl3Encoding(const MachineInstr &MI, unsigned OpNo) const; 1281b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka 129c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka /// Expand pseudo instructions with accumulator register operands. 130fee62c167b1f731998ff4d315830154d17ec6f85Akira Hatanaka void expandACCInstr(MachineBasicBlock::instr_iterator MI, 131c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka MachineBasicBlock &MBB, unsigned Opc) const; 132c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka 133b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka /// \brief Expand pseudo instruction. Return true if MI was expanded. 134b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka bool expandPseudos(MachineBasicBlock::instr_iterator &MI, 135b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka MachineBasicBlock &MBB) const; 1361b235a26f530623d07b49ab861fcd4adb4e62b4fAkira Hatanaka}; 137dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes} 138dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 139c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopeschar MipsCodeEmitter::ID = 0; 140dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 141dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopesbool MipsCodeEmitter::runOnMachineFunction(MachineFunction &MF) { 142953cbfcd26fa59d80c8d9ca749b5dd8ef901d11aDmitri Gribenko MipsTargetMachine &Target = static_cast<MipsTargetMachine &>( 143953cbfcd26fa59d80c8d9ca749b5dd8ef901d11aDmitri Gribenko const_cast<TargetMachine &>(MF.getTarget())); 144953cbfcd26fa59d80c8d9ca749b5dd8ef901d11aDmitri Gribenko 145953cbfcd26fa59d80c8d9ca749b5dd8ef901d11aDmitri Gribenko JTI = Target.getJITInfo(); 146953cbfcd26fa59d80c8d9ca749b5dd8ef901d11aDmitri Gribenko II = Target.getInstrInfo(); 147953cbfcd26fa59d80c8d9ca749b5dd8ef901d11aDmitri Gribenko TD = Target.getDataLayout(); 148dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes Subtarget = &TM.getSubtarget<MipsSubtarget> (); 149dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MCPEs = &MF.getConstantPool()->getConstants(); 150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MJTEs = nullptr; 151dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes if (MF.getJumpTableInfo()) MJTEs = &MF.getJumpTableInfo()->getJumpTables(); 152ff0b2cfa3b97e3aae384622464deeb7ab93bafc5Akira Hatanaka JTI->Initialize(MF, IsPIC, Subtarget->isLittle()); 153dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MCE.setModuleInfo(&getAnalysis<MachineModuleInfo> ()); 154dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 155dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes do { 156dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes DEBUG(errs() << "JITTing function '" 15796601ca332ab388754ca4673be8973396fea2dddCraig Topper << MF.getName() << "'\n"); 158dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MCE.startFunction(MF); 159dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 160dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes for (MachineFunction::iterator MBB = MF.begin(), E = MF.end(); 161dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MBB != E; ++MBB){ 162dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes MCE.StartMachineBasicBlock(MBB); 163226ae40fc234f7deb7a605e844a84b12b2fbb8d6Akira Hatanaka for (MachineBasicBlock::instr_iterator I = MBB->instr_begin(), 164b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka E = MBB->instr_end(); I != E;) 165b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka emitInstruction(*I++, *MBB); 166dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes } 167dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes } while (MCE.finishFunction(MF)); 168dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 169dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes return false; 170dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes} 171dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 172c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesunsigned MipsCodeEmitter::getRelocation(const MachineInstr &MI, 173c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes const MachineOperand &MO) const { 174c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes // NOTE: This relocations are for static. 175c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes uint64_t TSFlags = MI.getDesc().TSFlags; 176c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes uint64_t Form = TSFlags & MipsII::FormMask; 177c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes if (Form == MipsII::FrmJ) 178c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return Mips::reloc_mips_26; 179c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes if ((Form == MipsII::FrmI || Form == MipsII::FrmFI) 1805a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng && MI.isBranch()) 1813aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes return Mips::reloc_mips_pc16; 182c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes if (Form == MipsII::FrmI && MI.getOpcode() == Mips::LUi) 183c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return Mips::reloc_mips_hi; 184c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return Mips::reloc_mips_lo; 185c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 186c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 18747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopesunsigned MipsCodeEmitter::getJumpTargetOpValue(const MachineInstr &MI, 18847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes unsigned OpNo) const { 1893aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes MachineOperand MO = MI.getOperand(OpNo); 1903aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes if (MO.isGlobal()) 1913aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes emitGlobalAddress(MO.getGlobal(), getRelocation(MI, MO), true); 1923aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes else if (MO.isSymbol()) 1933aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes emitExternalSymbolAddress(MO.getSymbolName(), getRelocation(MI, MO)); 1943aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes else if (MO.isMBB()) 1953aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes emitMachineBasicBlock(MO.getMBB(), getRelocation(MI, MO)); 1963aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes else 1973aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes llvm_unreachable("Unexpected jump target operand kind."); 19847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes return 0; 1991aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic} 2001aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic 2011aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovicunsigned MipsCodeEmitter::getJumpTargetOpValueMM(const MachineInstr &MI, 2021aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic unsigned OpNo) const { 2031aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic llvm_unreachable("Unimplemented function."); 2041aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic return 0; 2055c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic} 2065c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic 2075c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovicunsigned MipsCodeEmitter::getBranchTargetOpValueMM(const MachineInstr &MI, 2085c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic unsigned OpNo) const { 2095c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic llvm_unreachable("Unimplemented function."); 2105c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic return 0; 21147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes} 21247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned MipsCodeEmitter::getBranchTarget21OpValue(const MachineInstr &MI, 214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned OpNo) const { 215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable("Unimplemented function."); 216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned MipsCodeEmitter::getBranchTarget26OpValue(const MachineInstr &MI, 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned OpNo) const { 221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable("Unimplemented function."); 222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned MipsCodeEmitter::getJumpOffset16OpValue(const MachineInstr &MI, 226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned OpNo) const { 227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable("Unimplemented function."); 228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 23147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopesunsigned MipsCodeEmitter::getBranchTargetOpValue(const MachineInstr &MI, 23247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes unsigned OpNo) const { 2333aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes MachineOperand MO = MI.getOperand(OpNo); 2343aa035fa0c27d3ea2a834868f680bcbfe7eb0de7Bruno Cardoso Lopes emitMachineBasicBlock(MO.getMBB(), getRelocation(MI, MO)); 23547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes return 0; 23647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes} 23747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 238c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopesunsigned MipsCodeEmitter::getMemEncoding(const MachineInstr &MI, 23947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes unsigned OpNo) const { 240c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. 241c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes assert(MI.getOperand(OpNo).isReg()); 242c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo)) << 16; 24347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes return (getMachineOpValue(MI, MI.getOperand(OpNo+1)) & 0xFFFF) | RegBits; 244c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes} 245c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes 246da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carterunsigned MipsCodeEmitter::getMemEncodingMMImm12(const MachineInstr &MI, 247da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter unsigned OpNo) const { 248da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter llvm_unreachable("Unimplemented function."); 249da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter return 0; 250da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter} 251da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned MipsCodeEmitter::getMSAMemEncoding(const MachineInstr &MI, 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned OpNo) const { 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm_unreachable("Unimplemented function."); 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return 0; 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 258c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopesunsigned MipsCodeEmitter::getSizeExtEncoding(const MachineInstr &MI, 25947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes unsigned OpNo) const { 260c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes // size is encoded as size-1. 261c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes return getMachineOpValue(MI, MI.getOperand(OpNo)) - 1; 262c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes} 263c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes 264c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopesunsigned MipsCodeEmitter::getSizeInsEncoding(const MachineInstr &MI, 26547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes unsigned OpNo) const { 266c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes // size is encoded as pos+size-1. 267c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes return getMachineOpValue(MI, MI.getOperand(OpNo-1)) + 268c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes getMachineOpValue(MI, MI.getOperand(OpNo)) - 1; 269c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes} 270c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes 27195adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeidaunsigned MipsCodeEmitter::getLSAImmEncoding(const MachineInstr &MI, 27295adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida unsigned OpNo) const { 27395adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida llvm_unreachable("Unimplemented function."); 27495adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida return 0; 27595adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida} 27695adf91f29980e374bf094e15bc3f2764ef9baf4Matheus Almeida 277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesunsigned MipsCodeEmitter::getSimm18Lsl3Encoding(const MachineInstr &MI, 278cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned OpNo) const { 279cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines llvm_unreachable("Unimplemented function."); 280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return 0; 281cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 283dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned MipsCodeEmitter::getSimm19Lsl2Encoding(const MachineInstr &MI, 284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned OpNo) const { 285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable("Unimplemented function."); 286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 289c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes/// getMachineOpValue - Return binary encoding of operand. If the machine 290c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes/// operand requires relocation, record the relocation and return zero. 291c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesunsigned MipsCodeEmitter::getMachineOpValue(const MachineInstr &MI, 29247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes const MachineOperand &MO) const { 293c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes if (MO.isReg()) 294e8068692f924a1577075bd2d7b72b44820e0ffb2Akira Hatanaka return TM.getRegisterInfo()->getEncodingValue(MO.getReg()); 295c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes else if (MO.isImm()) 296c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return static_cast<unsigned>(MO.getImm()); 2975a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka else if (MO.isGlobal()) 2985a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka emitGlobalAddress(MO.getGlobal(), getRelocation(MI, MO), true); 2995a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka else if (MO.isSymbol()) 300c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes emitExternalSymbolAddress(MO.getSymbolName(), getRelocation(MI, MO)); 301c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes else if (MO.isCPI()) 302c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes emitConstPoolAddress(MO.getIndex(), getRelocation(MI, MO)); 303c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes else if (MO.isJTI()) 304c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes emitJumpTableAddress(MO.getIndex(), getRelocation(MI, MO)); 305c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes else if (MO.isMBB()) 306c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes emitMachineBasicBlock(MO.getMBB(), getRelocation(MI, MO)); 307c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes else 308c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes llvm_unreachable("Unable to encode MachineOperand!"); 309c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return 0; 310c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 311c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 312c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesvoid MipsCodeEmitter::emitGlobalAddress(const GlobalValue *GV, unsigned Reloc, 31347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes bool MayNeedFarStub) const { 314c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes MCE.addRelocation(MachineRelocation::getGV(MCE.getCurrentPCOffset(), Reloc, 31547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes const_cast<GlobalValue *>(GV), 0, 31647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MayNeedFarStub)); 317c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 318c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 319c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesvoid MipsCodeEmitter:: 320c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso LopesemitExternalSymbolAddress(const char *ES, unsigned Reloc) const { 321c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes MCE.addRelocation(MachineRelocation::getExtSym(MCE.getCurrentPCOffset(), 322b57134523c87ee3e115fca41f58d73cb66046146Akira Hatanaka Reloc, ES, 0, 0)); 323c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 324c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 325c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesvoid MipsCodeEmitter::emitConstPoolAddress(unsigned CPI, unsigned Reloc) const { 326c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes MCE.addRelocation(MachineRelocation::getConstPool(MCE.getCurrentPCOffset(), 327c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes Reloc, CPI, 0, false)); 328c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 329c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 330c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesvoid MipsCodeEmitter:: 331c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso LopesemitJumpTableAddress(unsigned JTIndex, unsigned Reloc) const { 332c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes MCE.addRelocation(MachineRelocation::getJumpTable(MCE.getCurrentPCOffset(), 333c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes Reloc, JTIndex, 0, false)); 334c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 335c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 336c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopesvoid MipsCodeEmitter::emitMachineBasicBlock(MachineBasicBlock *BB, 33747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes unsigned Reloc) const { 338c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes MCE.addRelocation(MachineRelocation::getBB(MCE.getCurrentPCOffset(), 339c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes Reloc, BB)); 340c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 341c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 342b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanakavoid MipsCodeEmitter::emitInstruction(MachineBasicBlock::instr_iterator MI, 343b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka MachineBasicBlock &MBB) { 344b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka DEBUG(errs() << "JIT: " << (void*)MCE.getCurrentPCValue() << ":\t" << *MI); 345c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 346b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka // Expand pseudo instruction. Skip if MI was not expanded. 347b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka if (((MI->getDesc().TSFlags & MipsII::FormMask) == MipsII::Pseudo) && 348b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka !expandPseudos(MI, MBB)) 349c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return; 350c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 351b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka MCE.processDebugLoc(MI->getDebugLoc(), true); 352b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka 353b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka emitWord(getBinaryCodeForInstr(*MI)); 3545a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka ++NumEmitted; // Keep track of the # of mi's emitted 355c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 356b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka MCE.processDebugLoc(MI->getDebugLoc(), false); 357dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes} 358dca6cdd6a14195c3ebbbb5d2c668445be119aaecBruno Cardoso Lopes 359ff0b2cfa3b97e3aae384622464deeb7ab93bafc5Akira Hatanakavoid MipsCodeEmitter::emitWord(unsigned Word) { 360c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes DEBUG(errs() << " 0x"; 361c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes errs().write_hex(Word) << "\n"); 362ff0b2cfa3b97e3aae384622464deeb7ab93bafc5Akira Hatanaka if (Subtarget->isLittle()) 363ff0b2cfa3b97e3aae384622464deeb7ab93bafc5Akira Hatanaka MCE.emitWordLE(Word); 364ff0b2cfa3b97e3aae384622464deeb7ab93bafc5Akira Hatanaka else 365ff0b2cfa3b97e3aae384622464deeb7ab93bafc5Akira Hatanaka MCE.emitWordBE(Word); 366c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 367c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 368fee62c167b1f731998ff4d315830154d17ec6f85Akira Hatanakavoid MipsCodeEmitter::expandACCInstr(MachineBasicBlock::instr_iterator MI, 369c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka MachineBasicBlock &MBB, 370c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka unsigned Opc) const { 371c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka // Expand "pseudomult $ac0, $t0, $t1" to "mult $t0, $t1". 372c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka BuildMI(MBB, &*MI, MI->getDebugLoc(), II->get(Opc)) 373c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka .addReg(MI->getOperand(1).getReg()).addReg(MI->getOperand(2).getReg()); 374c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka} 375c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka 376b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanakabool MipsCodeEmitter::expandPseudos(MachineBasicBlock::instr_iterator &MI, 377b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka MachineBasicBlock &MBB) const { 378b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka switch (MI->getOpcode()) { 379b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka case Mips::NOP: 380b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka BuildMI(MBB, &*MI, MI->getDebugLoc(), II->get(Mips::SLL), Mips::ZERO) 381b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka .addReg(Mips::ZERO).addImm(0); 382b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka break; 3831d04ca7987ef0abb5be07b11e3bb9c9e756a1fceAkira Hatanaka case Mips::B: 3841d04ca7987ef0abb5be07b11e3bb9c9e756a1fceAkira Hatanaka BuildMI(MBB, &*MI, MI->getDebugLoc(), II->get(Mips::BEQ)).addReg(Mips::ZERO) 3851d04ca7987ef0abb5be07b11e3bb9c9e756a1fceAkira Hatanaka .addReg(Mips::ZERO).addOperand(MI->getOperand(0)); 3861d04ca7987ef0abb5be07b11e3bb9c9e756a1fceAkira Hatanaka break; 387997c5dead83fc237280888696e1fa719563fc7f1Akira Hatanaka case Mips::TRAP: 388997c5dead83fc237280888696e1fa719563fc7f1Akira Hatanaka BuildMI(MBB, &*MI, MI->getDebugLoc(), II->get(Mips::BREAK)).addImm(0) 389997c5dead83fc237280888696e1fa719563fc7f1Akira Hatanaka .addImm(0); 390997c5dead83fc237280888696e1fa719563fc7f1Akira Hatanaka break; 391b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka case Mips::JALRPseudo: 392b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka BuildMI(MBB, &*MI, MI->getDebugLoc(), II->get(Mips::JALR), Mips::RA) 393b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka .addReg(MI->getOperand(0).getReg()); 394b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka break; 395c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoMULT: 396c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::MULT); 397c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 398c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoMULTu: 399c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::MULTu); 400c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 401c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoSDIV: 402c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::SDIV); 403c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 404c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoUDIV: 405c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::UDIV); 406c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 407c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoMADD: 408c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::MADD); 409c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 410c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoMADDU: 411c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::MADDU); 412c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 413c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoMSUB: 414c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::MSUB); 415c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 416c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka case Mips::PseudoMSUBU: 417c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka expandACCInstr(MI, MBB, Mips::MSUBU); 418c227c4675e7395342182492e99c0696c5d9997afAkira Hatanaka break; 419b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka default: 420b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka return false; 421b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka } 422b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka 423b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka (MI--)->eraseFromBundle(); 424b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka return true; 425b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka} 426b4b4fa80bab1387e50c5f1b08e1141f853d35204Akira Hatanaka 427c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes/// createMipsJITCodeEmitterPass - Return a pass that emits the collected Mips 428c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes/// code to the specified MCE object. 429c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso LopesFunctionPass *llvm::createMipsJITCodeEmitterPass(MipsTargetMachine &TM, 43047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes JITCodeEmitter &JCE) { 431c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes return new MipsCodeEmitter(TM, JCE); 432c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes} 433c4cc40c001e23dbeb6cb9953715177ccb314fbf1Bruno Cardoso Lopes 434c3f16b316a7a15ee3bd32b4eb5753595cdce2757Bruno Cardoso Lopes#include "MipsGenCodeEmitter.inc" 435