mirror of
https://github.com/RPCSX/llvm.git
synced 2025-05-14 11:26:12 +00:00
Change XCoreAsmPrinter to lower MachineInstrs to MCInsts before emission.
This change adds XCoreMCInstLower to do the lowering to MCInst and XCoreInstPrinter to print the MCInsts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170288 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6438214d21
commit
9578d793c9
@ -15,6 +15,7 @@ add_llvm_target(XCoreCodeGen
|
|||||||
XCoreISelDAGToDAG.cpp
|
XCoreISelDAGToDAG.cpp
|
||||||
XCoreISelLowering.cpp
|
XCoreISelLowering.cpp
|
||||||
XCoreMachineFunctionInfo.cpp
|
XCoreMachineFunctionInfo.cpp
|
||||||
|
XCoreMCInstLower.cpp
|
||||||
XCoreRegisterInfo.cpp
|
XCoreRegisterInfo.cpp
|
||||||
XCoreSubtarget.cpp
|
XCoreSubtarget.cpp
|
||||||
XCoreTargetMachine.cpp
|
XCoreTargetMachine.cpp
|
||||||
@ -24,5 +25,6 @@ add_llvm_target(XCoreCodeGen
|
|||||||
|
|
||||||
add_dependencies(LLVMXCoreCodeGen intrinsics_gen)
|
add_dependencies(LLVMXCoreCodeGen intrinsics_gen)
|
||||||
|
|
||||||
|
add_subdirectory(InstPrinter)
|
||||||
add_subdirectory(TargetInfo)
|
add_subdirectory(TargetInfo)
|
||||||
add_subdirectory(MCTargetDesc)
|
add_subdirectory(MCTargetDesc)
|
||||||
|
7
lib/Target/XCore/InstPrinter/CMakeLists.txt
Normal file
7
lib/Target/XCore/InstPrinter/CMakeLists.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
|
||||||
|
|
||||||
|
add_llvm_library(LLVMXCoreAsmPrinter
|
||||||
|
XCoreInstPrinter.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_dependencies(LLVMXCoreAsmPrinter XCoreCommonTableGen)
|
23
lib/Target/XCore/InstPrinter/LLVMBuild.txt
Normal file
23
lib/Target/XCore/InstPrinter/LLVMBuild.txt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
;===- ./lib/Target/XCore/InstPrinter/LLVMBuild.txt -------------*- Conf -*--===;
|
||||||
|
;
|
||||||
|
; The LLVM Compiler Infrastructure
|
||||||
|
;
|
||||||
|
; This file is distributed under the University of Illinois Open Source
|
||||||
|
; License. See LICENSE.TXT for details.
|
||||||
|
;
|
||||||
|
;===------------------------------------------------------------------------===;
|
||||||
|
;
|
||||||
|
; This is an LLVMBuild description file for the components in this subdirectory.
|
||||||
|
;
|
||||||
|
; For more information on the LLVMBuild system, please see:
|
||||||
|
;
|
||||||
|
; http://llvm.org/docs/LLVMBuild.html
|
||||||
|
;
|
||||||
|
;===------------------------------------------------------------------------===;
|
||||||
|
|
||||||
|
[component_0]
|
||||||
|
type = Library
|
||||||
|
name = XCoreAsmPrinter
|
||||||
|
parent = XCore
|
||||||
|
required_libraries = MC Support
|
||||||
|
add_to_library_groups = XCore
|
16
lib/Target/XCore/InstPrinter/Makefile
Normal file
16
lib/Target/XCore/InstPrinter/Makefile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
##===- lib/Target/XCore/AsmPrinter/Makefile ----------------*- Makefile -*-===##
|
||||||
|
#
|
||||||
|
# The LLVM Compiler Infrastructure
|
||||||
|
#
|
||||||
|
# This file is distributed under the University of Illinois Open Source
|
||||||
|
# License. See LICENSE.TXT for details.
|
||||||
|
#
|
||||||
|
##===----------------------------------------------------------------------===##
|
||||||
|
|
||||||
|
LEVEL = ../../../..
|
||||||
|
LIBRARYNAME = LLVMXCoreAsmPrinter
|
||||||
|
|
||||||
|
# Hack: we need to include 'main' xcore target directory to grab private headers
|
||||||
|
CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
|
||||||
|
|
||||||
|
include $(LEVEL)/Makefile.common
|
96
lib/Target/XCore/InstPrinter/XCoreInstPrinter.cpp
Normal file
96
lib/Target/XCore/InstPrinter/XCoreInstPrinter.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
//===-- XCoreInstPrinter.cpp - Convert XCore MCInst to assembly syntax ----===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This class prints an XCore MCInst to a .s file.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#define DEBUG_TYPE "asm-printer"
|
||||||
|
#include "XCoreInstPrinter.h"
|
||||||
|
#include "llvm/ADT/StringExtras.h"
|
||||||
|
#include "llvm/MC/MCExpr.h"
|
||||||
|
#include "llvm/MC/MCInst.h"
|
||||||
|
#include "llvm/MC/MCInstrInfo.h"
|
||||||
|
#include "llvm/MC/MCSymbol.h"
|
||||||
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
#include "XCoreGenAsmWriter.inc"
|
||||||
|
|
||||||
|
void XCoreInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
|
||||||
|
OS << StringRef(getRegisterName(RegNo)).lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCoreInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
|
||||||
|
StringRef Annot) {
|
||||||
|
printInstruction(MI, O);
|
||||||
|
printAnnotation(O, Annot);
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCoreInstPrinter::
|
||||||
|
printInlineJT(const MCInst *MI, int opNum, raw_ostream &O) {
|
||||||
|
report_fatal_error("can't handle InlineJT");
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCoreInstPrinter::
|
||||||
|
printInlineJT32(const MCInst *MI, int opNum, raw_ostream &O) {
|
||||||
|
report_fatal_error("can't handle InlineJT32");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printExpr(const MCExpr *Expr, raw_ostream &OS) {
|
||||||
|
int Offset = 0;
|
||||||
|
const MCSymbolRefExpr *SRE;
|
||||||
|
|
||||||
|
if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) {
|
||||||
|
SRE = dyn_cast<MCSymbolRefExpr>(BE->getLHS());
|
||||||
|
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS());
|
||||||
|
assert(SRE && CE && "Binary expression must be sym+const.");
|
||||||
|
Offset = CE->getValue();
|
||||||
|
} else if (!(SRE = dyn_cast<MCSymbolRefExpr>(Expr))) {
|
||||||
|
assert(false && "Unexpected MCExpr type.");
|
||||||
|
}
|
||||||
|
assert(SRE->getKind() == MCSymbolRefExpr::VK_None);
|
||||||
|
|
||||||
|
OS << SRE->getSymbol();
|
||||||
|
|
||||||
|
if (Offset) {
|
||||||
|
if (Offset > 0)
|
||||||
|
OS << '+';
|
||||||
|
OS << Offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCoreInstPrinter::
|
||||||
|
printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
|
||||||
|
const MCOperand &Op = MI->getOperand(OpNo);
|
||||||
|
if (Op.isReg()) {
|
||||||
|
printRegName(O, Op.getReg());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Op.isImm()) {
|
||||||
|
O << Op.getImm();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(Op.isExpr() && "unknown operand kind in printOperand");
|
||||||
|
printExpr(Op.getExpr(), O);
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCoreInstPrinter::
|
||||||
|
printMemOperand(const MCInst *MI, int opNum, raw_ostream &O) {
|
||||||
|
printOperand(MI, opNum, O);
|
||||||
|
|
||||||
|
if (MI->getOperand(opNum+1).isImm() && MI->getOperand(opNum+1).getImm() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
O << "+";
|
||||||
|
printOperand(MI, opNum+1, O);
|
||||||
|
}
|
42
lib/Target/XCore/InstPrinter/XCoreInstPrinter.h
Normal file
42
lib/Target/XCore/InstPrinter/XCoreInstPrinter.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
//== XCoreInstPrinter.h - Convert XCore MCInst to assembly syntax -*- C++ -*-=//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This class prints a XCore MCInst to a .s file.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef XCOREINSTPRINTER_H
|
||||||
|
#define XCOREINSTPRINTER_H
|
||||||
|
#include "llvm/MC/MCInstPrinter.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class TargetMachine;
|
||||||
|
|
||||||
|
class XCoreInstPrinter : public MCInstPrinter {
|
||||||
|
public:
|
||||||
|
XCoreInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
|
||||||
|
const MCRegisterInfo &MRI)
|
||||||
|
: MCInstPrinter(MAI, MII, MRI) {}
|
||||||
|
|
||||||
|
// Autogenerated by tblgen.
|
||||||
|
void printInstruction(const MCInst *MI, raw_ostream &O);
|
||||||
|
static const char *getRegisterName(unsigned RegNo);
|
||||||
|
|
||||||
|
virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
|
||||||
|
virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);
|
||||||
|
private:
|
||||||
|
void printInlineJT(const MCInst *MI, int opNum, raw_ostream &O);
|
||||||
|
void printInlineJT32(const MCInst *MI, int opNum, raw_ostream &O);
|
||||||
|
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
|
||||||
|
};
|
||||||
|
} // end namespace llvm
|
||||||
|
|
||||||
|
#endif
|
@ -16,7 +16,7 @@
|
|||||||
;===------------------------------------------------------------------------===;
|
;===------------------------------------------------------------------------===;
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
subdirectories = MCTargetDesc TargetInfo
|
subdirectories = InstPrinter MCTargetDesc TargetInfo
|
||||||
|
|
||||||
[component_0]
|
[component_0]
|
||||||
type = TargetGroup
|
type = TargetGroup
|
||||||
|
@ -19,5 +19,5 @@
|
|||||||
type = Library
|
type = Library
|
||||||
name = XCoreDesc
|
name = XCoreDesc
|
||||||
parent = XCore
|
parent = XCore
|
||||||
required_libraries = MC XCoreInfo
|
required_libraries = MC XCoreAsmPrinter XCoreInfo
|
||||||
add_to_library_groups = XCore
|
add_to_library_groups = XCore
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "XCoreMCTargetDesc.h"
|
#include "XCoreMCTargetDesc.h"
|
||||||
#include "XCoreMCAsmInfo.h"
|
#include "XCoreMCAsmInfo.h"
|
||||||
|
#include "InstPrinter/XCoreInstPrinter.h"
|
||||||
#include "llvm/MC/MCCodeGenInfo.h"
|
#include "llvm/MC/MCCodeGenInfo.h"
|
||||||
#include "llvm/MC/MCInstrInfo.h"
|
#include "llvm/MC/MCInstrInfo.h"
|
||||||
#include "llvm/MC/MCRegisterInfo.h"
|
#include "llvm/MC/MCRegisterInfo.h"
|
||||||
@ -69,6 +70,15 @@ static MCCodeGenInfo *createXCoreMCCodeGenInfo(StringRef TT, Reloc::Model RM,
|
|||||||
return X;
|
return X;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MCInstPrinter *createXCoreMCInstPrinter(const Target &T,
|
||||||
|
unsigned SyntaxVariant,
|
||||||
|
const MCAsmInfo &MAI,
|
||||||
|
const MCInstrInfo &MII,
|
||||||
|
const MCRegisterInfo &MRI,
|
||||||
|
const MCSubtargetInfo &STI) {
|
||||||
|
return new XCoreInstPrinter(MAI, MII, MRI);
|
||||||
|
}
|
||||||
|
|
||||||
// Force static initialization.
|
// Force static initialization.
|
||||||
extern "C" void LLVMInitializeXCoreTargetMC() {
|
extern "C" void LLVMInitializeXCoreTargetMC() {
|
||||||
// Register the MC asm info.
|
// Register the MC asm info.
|
||||||
@ -87,4 +97,8 @@ extern "C" void LLVMInitializeXCoreTargetMC() {
|
|||||||
// Register the MC subtarget info.
|
// Register the MC subtarget info.
|
||||||
TargetRegistry::RegisterMCSubtargetInfo(TheXCoreTarget,
|
TargetRegistry::RegisterMCSubtargetInfo(TheXCoreTarget,
|
||||||
createXCoreMCSubtargetInfo);
|
createXCoreMCSubtargetInfo);
|
||||||
|
|
||||||
|
// Register the MCInstPrinter
|
||||||
|
TargetRegistry::RegisterMCInstPrinter(TheXCoreTarget,
|
||||||
|
createXCoreMCInstPrinter);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ BUILT_SOURCES = XCoreGenRegisterInfo.inc XCoreGenInstrInfo.inc \
|
|||||||
XCoreGenDAGISel.inc XCoreGenCallingConv.inc \
|
XCoreGenDAGISel.inc XCoreGenCallingConv.inc \
|
||||||
XCoreGenSubtargetInfo.inc
|
XCoreGenSubtargetInfo.inc
|
||||||
|
|
||||||
DIRS = TargetInfo MCTargetDesc
|
DIRS = InstPrinter TargetInfo MCTargetDesc
|
||||||
|
|
||||||
include $(LEVEL)/Makefile.common
|
include $(LEVEL)/Makefile.common
|
||||||
|
|
||||||
|
@ -41,7 +41,13 @@ def : Proc<"xs1b-generic", []>;
|
|||||||
// Declare the target which we are implementing
|
// Declare the target which we are implementing
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
def XCoreAsmWriter : AsmWriter {
|
||||||
|
string AsmWriterClassName = "InstPrinter";
|
||||||
|
bit isMCAsmWriter = 1;
|
||||||
|
}
|
||||||
|
|
||||||
def XCore : Target {
|
def XCore : Target {
|
||||||
// Pull in Instruction Info:
|
// Pull in Instruction Info:
|
||||||
let InstructionSet = XCoreInstrInfo;
|
let InstructionSet = XCoreInstrInfo;
|
||||||
|
let AssemblyWriters = [XCoreAsmWriter];
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#define DEBUG_TYPE "asm-printer"
|
#define DEBUG_TYPE "asm-printer"
|
||||||
#include "XCore.h"
|
#include "XCore.h"
|
||||||
#include "XCoreInstrInfo.h"
|
#include "XCoreInstrInfo.h"
|
||||||
|
#include "XCoreMCInstLower.h"
|
||||||
|
#include "InstPrinter/XCoreInstPrinter.h"
|
||||||
#include "XCoreSubtarget.h"
|
#include "XCoreSubtarget.h"
|
||||||
#include "XCoreTargetMachine.h"
|
#include "XCoreTargetMachine.h"
|
||||||
#include "llvm/ADT/SmallString.h"
|
#include "llvm/ADT/SmallString.h"
|
||||||
@ -30,6 +32,7 @@
|
|||||||
#include "llvm/DebugInfo.h"
|
#include "llvm/DebugInfo.h"
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/MC/MCAsmInfo.h"
|
#include "llvm/MC/MCAsmInfo.h"
|
||||||
|
#include "llvm/MC/MCInst.h"
|
||||||
#include "llvm/MC/MCStreamer.h"
|
#include "llvm/MC/MCStreamer.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
@ -52,16 +55,17 @@ static cl::opt<unsigned> MaxThreads("xcore-max-threads", cl::Optional,
|
|||||||
namespace {
|
namespace {
|
||||||
class XCoreAsmPrinter : public AsmPrinter {
|
class XCoreAsmPrinter : public AsmPrinter {
|
||||||
const XCoreSubtarget &Subtarget;
|
const XCoreSubtarget &Subtarget;
|
||||||
|
XCoreMCInstLower MCInstLowering;
|
||||||
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
|
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
|
||||||
public:
|
public:
|
||||||
explicit XCoreAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
|
explicit XCoreAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
|
||||||
: AsmPrinter(TM, Streamer), Subtarget(TM.getSubtarget<XCoreSubtarget>()){}
|
: AsmPrinter(TM, Streamer), Subtarget(TM.getSubtarget<XCoreSubtarget>()),
|
||||||
|
MCInstLowering(*this) {}
|
||||||
|
|
||||||
virtual const char *getPassName() const {
|
virtual const char *getPassName() const {
|
||||||
return "XCore Assembly Printer";
|
return "XCore Assembly Printer";
|
||||||
}
|
}
|
||||||
|
|
||||||
void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
|
|
||||||
void printInlineJT(const MachineInstr *MI, int opNum, raw_ostream &O,
|
void printInlineJT(const MachineInstr *MI, int opNum, raw_ostream &O,
|
||||||
const std::string &directive = ".jmptable");
|
const std::string &directive = ".jmptable");
|
||||||
void printInlineJT32(const MachineInstr *MI, int opNum, raw_ostream &O) {
|
void printInlineJT32(const MachineInstr *MI, int opNum, raw_ostream &O) {
|
||||||
@ -75,18 +79,14 @@ namespace {
|
|||||||
void emitArrayBound(MCSymbol *Sym, const GlobalVariable *GV);
|
void emitArrayBound(MCSymbol *Sym, const GlobalVariable *GV);
|
||||||
virtual void EmitGlobalVariable(const GlobalVariable *GV);
|
virtual void EmitGlobalVariable(const GlobalVariable *GV);
|
||||||
|
|
||||||
void printInstruction(const MachineInstr *MI, raw_ostream &O); // autogen'd.
|
|
||||||
static const char *getRegisterName(unsigned RegNo);
|
|
||||||
|
|
||||||
void EmitFunctionEntryLabel();
|
void EmitFunctionEntryLabel();
|
||||||
void EmitInstruction(const MachineInstr *MI);
|
void EmitInstruction(const MachineInstr *MI);
|
||||||
|
void EmitFunctionBodyStart();
|
||||||
void EmitFunctionBodyEnd();
|
void EmitFunctionBodyEnd();
|
||||||
virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
|
virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
|
||||||
};
|
};
|
||||||
} // end of anonymous namespace
|
} // end of anonymous namespace
|
||||||
|
|
||||||
#include "XCoreGenAsmWriter.inc"
|
|
||||||
|
|
||||||
void XCoreAsmPrinter::emitArrayBound(MCSymbol *Sym, const GlobalVariable *GV) {
|
void XCoreAsmPrinter::emitArrayBound(MCSymbol *Sym, const GlobalVariable *GV) {
|
||||||
assert(((GV->hasExternalLinkage() ||
|
assert(((GV->hasExternalLinkage() ||
|
||||||
GV->hasWeakLinkage()) ||
|
GV->hasWeakLinkage()) ||
|
||||||
@ -177,6 +177,10 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
|||||||
OutStreamer.EmitRawText("\t.cc_bottom " + Twine(GVSym->getName()) + ".data");
|
OutStreamer.EmitRawText("\t.cc_bottom " + Twine(GVSym->getName()) + ".data");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XCoreAsmPrinter::EmitFunctionBodyStart() {
|
||||||
|
MCInstLowering.Initialize(Mang, &MF->getContext());
|
||||||
|
}
|
||||||
|
|
||||||
/// EmitFunctionBodyEnd - Targets can override this to emit stuff after
|
/// EmitFunctionBodyEnd - Targets can override this to emit stuff after
|
||||||
/// the last basic block in the function.
|
/// the last basic block in the function.
|
||||||
void XCoreAsmPrinter::EmitFunctionBodyEnd() {
|
void XCoreAsmPrinter::EmitFunctionBodyEnd() {
|
||||||
@ -192,17 +196,6 @@ void XCoreAsmPrinter::EmitFunctionEntryLabel() {
|
|||||||
OutStreamer.EmitLabel(CurrentFnSym);
|
OutStreamer.EmitLabel(CurrentFnSym);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XCoreAsmPrinter::printMemOperand(const MachineInstr *MI, int opNum,
|
|
||||||
raw_ostream &O) {
|
|
||||||
printOperand(MI, opNum, O);
|
|
||||||
|
|
||||||
if (MI->getOperand(opNum+1).isImm() && MI->getOperand(opNum+1).getImm() == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
O << "+";
|
|
||||||
printOperand(MI, opNum+1, O);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XCoreAsmPrinter::
|
void XCoreAsmPrinter::
|
||||||
printInlineJT(const MachineInstr *MI, int opNum, raw_ostream &O,
|
printInlineJT(const MachineInstr *MI, int opNum, raw_ostream &O,
|
||||||
const std::string &directive) {
|
const std::string &directive) {
|
||||||
@ -225,7 +218,7 @@ void XCoreAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
|
|||||||
const MachineOperand &MO = MI->getOperand(opNum);
|
const MachineOperand &MO = MI->getOperand(opNum);
|
||||||
switch (MO.getType()) {
|
switch (MO.getType()) {
|
||||||
case MachineOperand::MO_Register:
|
case MachineOperand::MO_Register:
|
||||||
O << getRegisterName(MO.getReg());
|
O << XCoreInstPrinter::getRegisterName(MO.getReg());
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_Immediate:
|
case MachineOperand::MO_Immediate:
|
||||||
O << MO.getImm();
|
O << MO.getImm();
|
||||||
@ -270,7 +263,7 @@ bool XCoreAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
|
|||||||
return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O);
|
return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O);
|
||||||
}
|
}
|
||||||
|
|
||||||
printOperand(MI, OpNo, O);
|
printOperand(MI, OpNo, O);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,15 +310,30 @@ void XCoreAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
|||||||
}
|
}
|
||||||
case XCore::ADD_2rus:
|
case XCore::ADD_2rus:
|
||||||
if (MI->getOperand(2).getImm() == 0) {
|
if (MI->getOperand(2).getImm() == 0) {
|
||||||
O << "\tmov " << getRegisterName(MI->getOperand(0).getReg()) << ", "
|
O << "\tmov "
|
||||||
<< getRegisterName(MI->getOperand(1).getReg());
|
<< XCoreInstPrinter::getRegisterName(MI->getOperand(0).getReg()) << ", "
|
||||||
|
<< XCoreInstPrinter::getRegisterName(MI->getOperand(1).getReg());
|
||||||
OutStreamer.EmitRawText(O.str());
|
OutStreamer.EmitRawText(O.str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case XCore::BR_JT:
|
||||||
|
case XCore::BR_JT32:
|
||||||
|
O << "\tbru "
|
||||||
|
<< XCoreInstPrinter::getRegisterName(MI->getOperand(1).getReg()) << '\n';
|
||||||
|
if (MI->getOpcode() == XCore::BR_JT)
|
||||||
|
printInlineJT(MI, 0, O);
|
||||||
|
else
|
||||||
|
printInlineJT32(MI, 0, O);
|
||||||
|
O << '\n';
|
||||||
|
OutStreamer.EmitRawText(O.str());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
printInstruction(MI, O);
|
|
||||||
OutStreamer.EmitRawText(O.str());
|
MCInst TmpInst;
|
||||||
|
MCInstLowering.Lower(MI, TmpInst);
|
||||||
|
|
||||||
|
OutStreamer.EmitInstruction(TmpInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force static initialization.
|
// Force static initialization.
|
||||||
|
116
lib/Target/XCore/XCoreMCInstLower.cpp
Normal file
116
lib/Target/XCore/XCoreMCInstLower.cpp
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
//===-- XCoreMCInstLower.cpp - Convert XCore MachineInstr to MCInst -------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains code to lower XCore MachineInstrs to their corresponding
|
||||||
|
// MCInst records.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#include "XCoreMCInstLower.h"
|
||||||
|
#include "llvm/CodeGen/AsmPrinter.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
#include "llvm/CodeGen/MachineInstr.h"
|
||||||
|
#include "llvm/CodeGen/MachineOperand.h"
|
||||||
|
#include "llvm/MC/MCContext.h"
|
||||||
|
#include "llvm/MC/MCExpr.h"
|
||||||
|
#include "llvm/MC/MCInst.h"
|
||||||
|
#include "llvm/Target/Mangler.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
XCoreMCInstLower::XCoreMCInstLower(class AsmPrinter &asmprinter)
|
||||||
|
: Printer(asmprinter) {}
|
||||||
|
|
||||||
|
void XCoreMCInstLower::Initialize(Mangler *M, MCContext *C) {
|
||||||
|
Mang = M;
|
||||||
|
Ctx = C;
|
||||||
|
}
|
||||||
|
|
||||||
|
MCOperand XCoreMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
|
||||||
|
MachineOperandType MOTy,
|
||||||
|
unsigned Offset) const {
|
||||||
|
MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None;
|
||||||
|
const MCSymbol *Symbol;
|
||||||
|
|
||||||
|
switch (MOTy) {
|
||||||
|
case MachineOperand::MO_MachineBasicBlock:
|
||||||
|
Symbol = MO.getMBB()->getSymbol();
|
||||||
|
break;
|
||||||
|
case MachineOperand::MO_GlobalAddress:
|
||||||
|
Symbol = Mang->getSymbol(MO.getGlobal());
|
||||||
|
Offset += MO.getOffset();
|
||||||
|
break;
|
||||||
|
case MachineOperand::MO_BlockAddress:
|
||||||
|
Symbol = Printer.GetBlockAddressSymbol(MO.getBlockAddress());
|
||||||
|
Offset += MO.getOffset();
|
||||||
|
break;
|
||||||
|
case MachineOperand::MO_ExternalSymbol:
|
||||||
|
Symbol = Printer.GetExternalSymbolSymbol(MO.getSymbolName());
|
||||||
|
Offset += MO.getOffset();
|
||||||
|
break;
|
||||||
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
|
Symbol = Printer.GetJTISymbol(MO.getIndex());
|
||||||
|
break;
|
||||||
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
|
Symbol = Printer.GetCPISymbol(MO.getIndex());
|
||||||
|
Offset += MO.getOffset();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
llvm_unreachable("<unknown operand type>");
|
||||||
|
}
|
||||||
|
|
||||||
|
const MCSymbolRefExpr *MCSym = MCSymbolRefExpr::Create(Symbol, Kind, *Ctx);
|
||||||
|
|
||||||
|
if (!Offset)
|
||||||
|
return MCOperand::CreateExpr(MCSym);
|
||||||
|
|
||||||
|
// Assume offset is never negative.
|
||||||
|
assert(Offset > 0);
|
||||||
|
|
||||||
|
const MCConstantExpr *OffsetExpr = MCConstantExpr::Create(Offset, *Ctx);
|
||||||
|
const MCBinaryExpr *Add = MCBinaryExpr::CreateAdd(MCSym, OffsetExpr, *Ctx);
|
||||||
|
return MCOperand::CreateExpr(Add);
|
||||||
|
}
|
||||||
|
|
||||||
|
MCOperand XCoreMCInstLower::LowerOperand(const MachineOperand &MO,
|
||||||
|
unsigned offset) const {
|
||||||
|
MachineOperandType MOTy = MO.getType();
|
||||||
|
|
||||||
|
switch (MOTy) {
|
||||||
|
default: llvm_unreachable("unknown operand type");
|
||||||
|
case MachineOperand::MO_Register:
|
||||||
|
// Ignore all implicit register operands.
|
||||||
|
if (MO.isImplicit()) break;
|
||||||
|
return MCOperand::CreateReg(MO.getReg());
|
||||||
|
case MachineOperand::MO_Immediate:
|
||||||
|
return MCOperand::CreateImm(MO.getImm() + offset);
|
||||||
|
case MachineOperand::MO_MachineBasicBlock:
|
||||||
|
case MachineOperand::MO_GlobalAddress:
|
||||||
|
case MachineOperand::MO_ExternalSymbol:
|
||||||
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
|
case MachineOperand::MO_BlockAddress:
|
||||||
|
return LowerSymbolOperand(MO, MOTy, offset);
|
||||||
|
case MachineOperand::MO_RegisterMask:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MCOperand();
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCoreMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
|
||||||
|
OutMI.setOpcode(MI->getOpcode());
|
||||||
|
|
||||||
|
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||||
|
const MachineOperand &MO = MI->getOperand(i);
|
||||||
|
MCOperand MCOp = LowerOperand(MO);
|
||||||
|
|
||||||
|
if (MCOp.isValid())
|
||||||
|
OutMI.addOperand(MCOp);
|
||||||
|
}
|
||||||
|
}
|
44
lib/Target/XCore/XCoreMCInstLower.h
Normal file
44
lib/Target/XCore/XCoreMCInstLower.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
//===-- XCoreMCInstLower.h - Lower MachineInstr to MCInst ------*- C++ -*--===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef XCOREMCINSTLOWER_H
|
||||||
|
#define XCOREMCINSTLOWER_H
|
||||||
|
#include "llvm/ADT/SmallVector.h"
|
||||||
|
#include "llvm/CodeGen/MachineOperand.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
class MCContext;
|
||||||
|
class MCInst;
|
||||||
|
class MCOperand;
|
||||||
|
class MachineInstr;
|
||||||
|
class MachineFunction;
|
||||||
|
class Mangler;
|
||||||
|
class AsmPrinter;
|
||||||
|
|
||||||
|
/// XCoreMCInstLower - This class is used to lower an MachineInstr into an
|
||||||
|
// MCInst.
|
||||||
|
class LLVM_LIBRARY_VISIBILITY XCoreMCInstLower {
|
||||||
|
typedef MachineOperand::MachineOperandType MachineOperandType;
|
||||||
|
MCContext *Ctx;
|
||||||
|
Mangler *Mang;
|
||||||
|
AsmPrinter &Printer;
|
||||||
|
public:
|
||||||
|
XCoreMCInstLower(class AsmPrinter &asmprinter);
|
||||||
|
void Initialize(Mangler *mang, MCContext *C);
|
||||||
|
void Lower(const MachineInstr *MI, MCInst &OutMI) const;
|
||||||
|
MCOperand LowerOperand(const MachineOperand& MO, unsigned offset = 0) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
MCOperand LowerSymbolOperand(const MachineOperand &MO,
|
||||||
|
MachineOperandType MOTy, unsigned Offset) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user