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