mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Define class MipsMCInstLower.
llvm-svn: 134633
This commit is contained in:
parent
382742199f
commit
9cddf51671
@ -17,6 +17,7 @@ add_llvm_target(MipsCodeGen
|
||||
MipsISelLowering.cpp
|
||||
MipsFrameLowering.cpp
|
||||
MipsMCAsmInfo.cpp
|
||||
MipsMCInstLower.cpp
|
||||
MipsMCSymbolRefExpr.cpp
|
||||
MipsRegisterInfo.cpp
|
||||
MipsSubtarget.cpp
|
||||
|
117
lib/Target/Mips/MipsMCInstLower.cpp
Normal file
117
lib/Target/Mips/MipsMCInstLower.cpp
Normal file
@ -0,0 +1,117 @@
|
||||
//===-- MipsMCInstLower.cpp - Convert Mips 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 Mips MachineInstrs to their corresponding
|
||||
// MCInst records.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MipsMCInstLower.h"
|
||||
#include "MipsAsmPrinter.h"
|
||||
#include "MipsInstrInfo.h"
|
||||
#include "MipsMCSymbolRefExpr.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/Target/Mangler.h"
|
||||
using namespace llvm;
|
||||
|
||||
MipsMCInstLower::MipsMCInstLower(Mangler *mang, const MachineFunction &mf,
|
||||
MipsAsmPrinter &asmprinter)
|
||||
: Ctx(mf.getContext()), Mang(mang), AsmPrinter(asmprinter) {}
|
||||
|
||||
MCOperand MipsMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
|
||||
MachineOperandType MOTy) const {
|
||||
MipsMCSymbolRefExpr::VariantKind Kind;
|
||||
const MCSymbol *Symbol;
|
||||
int Offset = 0;
|
||||
|
||||
switch(MO.getTargetFlags()) {
|
||||
case MipsII::MO_NO_FLAG: Kind = MipsMCSymbolRefExpr::VK_Mips_None; break;
|
||||
case MipsII::MO_GPREL: Kind = MipsMCSymbolRefExpr::VK_Mips_GPREL; break;
|
||||
case MipsII::MO_GOT_CALL: Kind = MipsMCSymbolRefExpr::VK_Mips_GOT_CALL; break;
|
||||
case MipsII::MO_GOT: Kind = MipsMCSymbolRefExpr::VK_Mips_GOT; break;
|
||||
case MipsII::MO_ABS_HI: Kind = MipsMCSymbolRefExpr::VK_Mips_ABS_HI; break;
|
||||
case MipsII::MO_ABS_LO: Kind = MipsMCSymbolRefExpr::VK_Mips_ABS_LO; break;
|
||||
case MipsII::MO_TLSGD: Kind = MipsMCSymbolRefExpr::VK_Mips_TLSGD; break;
|
||||
case MipsII::MO_GOTTPREL: Kind = MipsMCSymbolRefExpr::VK_Mips_GOTTPREL; break;
|
||||
case MipsII::MO_TPREL_HI: Kind = MipsMCSymbolRefExpr::VK_Mips_TPREL_HI; break;
|
||||
case MipsII::MO_TPREL_LO: Kind = MipsMCSymbolRefExpr::VK_Mips_TPREL_LO; break;
|
||||
}
|
||||
|
||||
switch (MOTy) {
|
||||
case MachineOperand::MO_MachineBasicBlock:
|
||||
Symbol = MO.getMBB()->getSymbol();
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_GlobalAddress:
|
||||
Symbol = Mang->getSymbol(MO.getGlobal());
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_BlockAddress:
|
||||
Symbol = AsmPrinter.GetBlockAddressSymbol(MO.getBlockAddress());
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_ExternalSymbol:
|
||||
Symbol = AsmPrinter.GetExternalSymbolSymbol(MO.getSymbolName());
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
Symbol = AsmPrinter.GetJTISymbol(MO.getIndex());
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
Symbol = AsmPrinter.GetCPISymbol(MO.getIndex());
|
||||
if (MO.getOffset())
|
||||
Offset = MO.getOffset();
|
||||
break;
|
||||
|
||||
default:
|
||||
llvm_unreachable("<unknown operand type>");
|
||||
}
|
||||
|
||||
return MCOperand::CreateExpr(MipsMCSymbolRefExpr::Create(Kind, Symbol, Offset,
|
||||
Ctx));
|
||||
}
|
||||
|
||||
void MipsMCInstLower::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;
|
||||
MachineOperandType MOTy = MO.getType();
|
||||
|
||||
switch (MOTy) {
|
||||
default:
|
||||
MI->dump();
|
||||
llvm_unreachable("unknown operand type");
|
||||
case MachineOperand::MO_Register:
|
||||
// Ignore all implicit register operands.
|
||||
if (MO.isImplicit()) continue;
|
||||
MCOp = MCOperand::CreateReg(MO.getReg());
|
||||
break;
|
||||
case MachineOperand::MO_Immediate:
|
||||
MCOp = MCOperand::CreateImm(MO.getImm());
|
||||
break;
|
||||
case MachineOperand::MO_MachineBasicBlock:
|
||||
case MachineOperand::MO_GlobalAddress:
|
||||
case MachineOperand::MO_ExternalSymbol:
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
case MachineOperand::MO_BlockAddress:
|
||||
MCOp = LowerSymbolOperand(MO, MOTy);
|
||||
break;
|
||||
}
|
||||
|
||||
OutMI.addOperand(MCOp);
|
||||
}
|
||||
}
|
43
lib/Target/Mips/MipsMCInstLower.h
Normal file
43
lib/Target/Mips/MipsMCInstLower.h
Normal file
@ -0,0 +1,43 @@
|
||||
//===-- MipsMCInstLower.h - Lower MachineInstr to MCInst -------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef MIPSMCINSTLOWER_H
|
||||
#define MIPSMCINSTLOWER_H
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
namespace llvm {
|
||||
class MCAsmInfo;
|
||||
class MCContext;
|
||||
class MCInst;
|
||||
class MCOperand;
|
||||
class MCSymbol;
|
||||
class MachineInstr;
|
||||
class MachineFunction;
|
||||
class Mangler;
|
||||
class MipsAsmPrinter;
|
||||
|
||||
/// MipsMCInstLower - This class is used to lower an MachineInstr into an
|
||||
// MCInst.
|
||||
class LLVM_LIBRARY_VISIBILITY MipsMCInstLower {
|
||||
typedef MachineOperand::MachineOperandType MachineOperandType;
|
||||
MCContext &Ctx;
|
||||
Mangler *Mang;
|
||||
MipsAsmPrinter &AsmPrinter;
|
||||
public:
|
||||
MipsMCInstLower(Mangler *mang, const MachineFunction &MF,
|
||||
MipsAsmPrinter &asmprinter);
|
||||
void Lower(const MachineInstr *MI, MCInst &OutMI) const;
|
||||
private:
|
||||
MCOperand LowerSymbolOperand(const MachineOperand &MO,
|
||||
MachineOperandType MOTy) const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user