1204642Srdivacky//===-- MBlazeTargetMachine.cpp - Define TargetMachine for MBlaze ---------===// 2204642Srdivacky// 3204642Srdivacky// The LLVM Compiler Infrastructure 4204642Srdivacky// 5204642Srdivacky// This file is distributed under the University of Illinois Open Source 6204642Srdivacky// License. See LICENSE.TXT for details. 7204642Srdivacky// 8204642Srdivacky//===----------------------------------------------------------------------===// 9204642Srdivacky// 10204642Srdivacky// Implements the info about MBlaze target spec. 11204642Srdivacky// 12204642Srdivacky//===----------------------------------------------------------------------===// 13204642Srdivacky 14234353Sdim#include "MBlazeTargetMachine.h" 15204642Srdivacky#include "MBlaze.h" 16249423Sdim#include "llvm/CodeGen/Passes.h" 17204642Srdivacky#include "llvm/PassManager.h" 18218893Sdim#include "llvm/Support/FormattedStream.h" 19226633Sdim#include "llvm/Support/TargetRegistry.h" 20218893Sdim#include "llvm/Target/TargetOptions.h" 21204642Srdivackyusing namespace llvm; 22204642Srdivacky 23204642Srdivackyextern "C" void LLVMInitializeMBlazeTarget() { 24204642Srdivacky // Register the target. 25204642Srdivacky RegisterTargetMachine<MBlazeTargetMachine> X(TheMBlazeTarget); 26204642Srdivacky} 27204642Srdivacky 28204642Srdivacky// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment 29204642Srdivacky// The stack is always 8 byte aligned 30204642Srdivacky// On function prologue, the stack is created by decrementing 31204642Srdivacky// its pointer. Once decremented, all references are done with positive 32204642Srdivacky// offset from the stack/frame pointer, using StackGrowsUp enables 33204642Srdivacky// an easier handling. 34204642SrdivackyMBlazeTargetMachine:: 35226633SdimMBlazeTargetMachine(const Target &T, StringRef TT, 36234353Sdim StringRef CPU, StringRef FS, const TargetOptions &Options, 37234353Sdim Reloc::Model RM, CodeModel::Model CM, 38234353Sdim CodeGenOpt::Level OL) 39234353Sdim : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 40234353Sdim Subtarget(TT, CPU, FS), 41243830Sdim DL("E-p:32:32:32-i8:8:8-i16:16:16"), 42234353Sdim InstrInfo(*this), 43234353Sdim FrameLowering(Subtarget), 44243830Sdim TLInfo(*this), TSInfo(*this), 45249423Sdim InstrItins(Subtarget.getInstrItineraryData()) { 46204642Srdivacky} 47204642Srdivacky 48234353Sdimnamespace { 49234353Sdim/// MBlaze Code Generator Pass Configuration Options. 50234353Sdimclass MBlazePassConfig : public TargetPassConfig { 51234353Sdimpublic: 52234353Sdim MBlazePassConfig(MBlazeTargetMachine *TM, PassManagerBase &PM) 53234353Sdim : TargetPassConfig(TM, PM) {} 54234353Sdim 55234353Sdim MBlazeTargetMachine &getMBlazeTargetMachine() const { 56234353Sdim return getTM<MBlazeTargetMachine>(); 57234353Sdim } 58234353Sdim 59234353Sdim virtual bool addInstSelector(); 60234353Sdim virtual bool addPreEmitPass(); 61234353Sdim}; 62234353Sdim} // namespace 63234353Sdim 64234353SdimTargetPassConfig *MBlazeTargetMachine::createPassConfig(PassManagerBase &PM) { 65234353Sdim return new MBlazePassConfig(this, PM); 66234353Sdim} 67234353Sdim 68204642Srdivacky// Install an instruction selector pass using 69204642Srdivacky// the ISelDag to gen MBlaze code. 70234353Sdimbool MBlazePassConfig::addInstSelector() { 71239462Sdim addPass(createMBlazeISelDag(getMBlazeTargetMachine())); 72204642Srdivacky return false; 73204642Srdivacky} 74204642Srdivacky 75204642Srdivacky// Implemented by targets that want to run passes immediately before 76204642Srdivacky// machine code is emitted. return true if -print-machineinstrs should 77204642Srdivacky// print out the code after the passes. 78234353Sdimbool MBlazePassConfig::addPreEmitPass() { 79239462Sdim addPass(createMBlazeDelaySlotFillerPass(getMBlazeTargetMachine())); 80204642Srdivacky return true; 81204642Srdivacky} 82