mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-18 12:27:55 +00:00
mostly based on the ARM AsmParser at this time and is not particularly functional. Changed the MBlaze data layout from: "E-p:32:32-i8:8:8-i16:16:16-i64:32:32-f64:32:32-v64:32:32-v128:32:32-n32" to: "E-p:32:32:32-i8:8:8-i16:16:16" because the MicroBlaze doesn't have i64, f64, v64, or v128 data types. Cleaned up the MBlaze source code: 1. The floating point register class has been removed. The MicroBlaze does not have floating point registers. Floating point values are simply stored in integer registers. 2. Renaming the CPURegs register class to GPR to reflect the standard naming. 3. Removing a lot of stale code from AsmPrinter after the conversion to InstPrinter. 4. Simplified sign extended loads by marking them as expanded in ISelLowering. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117054 91177308-0d34-0410-b5e6-96231b3b80d8
104 lines
3.5 KiB
C++
104 lines
3.5 KiB
C++
//===-- MBlazeTargetMachine.cpp - Define TargetMachine for MBlaze ---------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Implements the info about MBlaze target spec.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "MBlaze.h"
|
|
#include "MBlazeMCAsmInfo.h"
|
|
#include "MBlazeTargetMachine.h"
|
|
#include "llvm/PassManager.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/Support/FormattedStream.h"
|
|
#include "llvm/Target/TargetOptions.h"
|
|
#include "llvm/Target/TargetRegistry.h"
|
|
using namespace llvm;
|
|
|
|
static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
|
|
MCContext &Ctx, TargetAsmBackend &TAB,
|
|
raw_ostream &_OS,
|
|
MCCodeEmitter *_Emitter,
|
|
bool RelaxAll) {
|
|
Triple TheTriple(TT);
|
|
switch (TheTriple.getOS()) {
|
|
case Triple::Darwin:
|
|
llvm_unreachable("MBlaze does not support Darwin MACH-O format");
|
|
return NULL;
|
|
case Triple::MinGW32:
|
|
case Triple::MinGW64:
|
|
case Triple::Cygwin:
|
|
case Triple::Win32:
|
|
llvm_unreachable("ARM does not support Windows COFF format");
|
|
return NULL;
|
|
default:
|
|
return createELFStreamer(Ctx, TAB, _OS, _Emitter, RelaxAll);
|
|
}
|
|
}
|
|
|
|
|
|
extern "C" void LLVMInitializeMBlazeTarget() {
|
|
// Register the target.
|
|
RegisterTargetMachine<MBlazeTargetMachine> X(TheMBlazeTarget);
|
|
RegisterAsmInfo<MBlazeMCAsmInfo> A(TheMBlazeTarget);
|
|
|
|
// Register the MC code emitter
|
|
TargetRegistry::RegisterCodeEmitter(TheMBlazeTarget,
|
|
llvm::createMBlazeMCCodeEmitter);
|
|
|
|
// Register the asm backend
|
|
TargetRegistry::RegisterAsmBackend(TheMBlazeTarget,
|
|
createMBlazeAsmBackend);
|
|
|
|
// Register the object streamer
|
|
TargetRegistry::RegisterObjectStreamer(TheMBlazeTarget,
|
|
createMCStreamer);
|
|
|
|
}
|
|
|
|
// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment
|
|
// The stack is always 8 byte aligned
|
|
// On function prologue, the stack is created by decrementing
|
|
// its pointer. Once decremented, all references are done with positive
|
|
// offset from the stack/frame pointer, using StackGrowsUp enables
|
|
// an easier handling.
|
|
MBlazeTargetMachine::
|
|
MBlazeTargetMachine(const Target &T, const std::string &TT,
|
|
const std::string &FS):
|
|
LLVMTargetMachine(T, TT),
|
|
Subtarget(TT, FS),
|
|
DataLayout("E-p:32:32:32-i8:8:8-i16:16:16"),
|
|
InstrInfo(*this),
|
|
FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0),
|
|
TLInfo(*this), TSInfo(*this), ELFWriterInfo(*this) {
|
|
if (getRelocationModel() == Reloc::Default) {
|
|
setRelocationModel(Reloc::Static);
|
|
}
|
|
|
|
if (getCodeModel() == CodeModel::Default)
|
|
setCodeModel(CodeModel::Small);
|
|
}
|
|
|
|
// Install an instruction selector pass using
|
|
// the ISelDag to gen MBlaze code.
|
|
bool MBlazeTargetMachine::
|
|
addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel) {
|
|
PM.add(createMBlazeISelDag(*this));
|
|
return false;
|
|
}
|
|
|
|
// Implemented by targets that want to run passes immediately before
|
|
// machine code is emitted. return true if -print-machineinstrs should
|
|
// print out the code after the passes.
|
|
bool MBlazeTargetMachine::
|
|
addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel) {
|
|
PM.add(createMBlazeDelaySlotFillerPass(*this));
|
|
return true;
|
|
}
|