31#define GET_INSTRINFO_MC_DESC
32#define ENABLE_INSTR_PREDICATE_VERIFIER
33#include "LoongArchGenInstrInfo.inc"
35#define GET_REGINFO_MC_DESC
36#include "LoongArchGenRegisterInfo.inc"
38#define GET_SUBTARGETINFO_MC_DESC
39#include "LoongArchGenSubtargetInfo.inc"
45 InitLoongArchMCRegisterInfo(
X, LoongArch::R1);
51 InitLoongArchMCInstrInfo(
X);
57 if (CPU.empty() || CPU ==
"generic")
58 CPU = TT.isArch64Bit() ?
"generic-la64" :
"generic-la32";
59 return createLoongArchMCSubtargetInfoImpl(TT, CPU, CPU, FS);
76 unsigned SyntaxVariant,
103 int64_t GPRState[31] = {};
104 std::bitset<31> GPRValidMask;
106 static bool isGPR(MCRegister
Reg) {
107 return Reg >= LoongArch::R0 &&
Reg <= LoongArch::R31;
110 static unsigned getRegIndex(MCRegister
Reg) {
111 assert(isGPR(
Reg) &&
Reg != LoongArch::R0 &&
"Invalid GPR reg");
112 return Reg - LoongArch::R1;
115 void setGPRState(MCRegister
Reg, std::optional<int64_t>
Value) {
116 if (
Reg == LoongArch::R0)
123 GPRValidMask.set(Index);
125 GPRValidMask.reset(Index);
129 std::optional<int64_t> getGPRState(MCRegister
Reg)
const {
130 if (
Reg == LoongArch::R0)
135 if (GPRValidMask.test(Index))
136 return GPRState[
Index];
141 explicit LoongArchMCInstrAnalysis(
const MCInstrInfo *Info)
142 : MCInstrAnalysis(
Info) {}
144 void resetState()
override { GPRValidMask.reset(); }
146 void updateState(
const MCInst &Inst,
const MCSubtargetInfo *STI,
153 if (isTerminator(Inst) || isCall(Inst)) {
163 for (
unsigned I = 0;
I < NumDefs; ++
I) {
166 setGPRState(DefReg, std::nullopt);
170 case LoongArch::PCADDU18I:
182 if ((
isBranch(Inst) && !isIndirectBranch(Inst)) ||
188 if (Inst.
getOpcode() == LoongArch::JIRL) {
199 bool isTerminator(
const MCInst &Inst)
const override {
206 case LoongArch::JIRL:
211 bool isCall(
const MCInst &Inst)
const override {
218 case LoongArch::JIRL:
223 bool isReturn(
const MCInst &Inst)
const override {
230 case LoongArch::JIRL:
236 bool isBranch(
const MCInst &Inst)
const override {
243 case LoongArch::JIRL:
249 bool isUnconditionalBranch(
const MCInst &Inst)
const override {
256 case LoongArch::JIRL:
262 bool isIndirectBranch(
const MCInst &Inst)
const override {
269 case LoongArch::JIRL:
279 return new LoongArchMCInstrAnalysis(Info);
284 std::unique_ptr<MCAsmBackend> &&MAB,
285 std::unique_ptr<MCObjectWriter> &&MOW,
286 std::unique_ptr<MCCodeEmitter> &&MCE) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_EXTERNAL_VISIBILITY
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
static MCSubtargetInfo * createLoongArchMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
static MCTargetStreamer * createLoongArchObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
static MCInstPrinter * createLoongArchMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static MCRegisterInfo * createLoongArchMCRegisterInfo(const Triple &TT)
static MCTargetStreamer * createLoongArchAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
static MCAsmInfo * createLoongArchMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TT, const MCTargetOptions &Options)
static MCTargetStreamer * createLoongArchNullTargetStreamer(MCStreamer &S)
static MCInstrAnalysis * createLoongArchInstrAnalysis(const MCInstrInfo *Info)
static MCInstrInfo * createLoongArchMCInstrInfo()
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeLoongArchTargetMC()
static bool isBranch(unsigned Opcode)
This class is intended to be used as a base class for asm properties and features specific to the tar...
void addInitialFrameState(const MCCFIInstruction &Inst)
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
Context object for machine code objects.
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
unsigned getNumOperands() const
unsigned getOpcode() const
const MCOperand & getOperand(unsigned i) const
virtual bool isCall(const MCInst &Inst) const
virtual bool isBranch(const MCInst &Inst) const
virtual bool isUnconditionalBranch(const MCInst &Inst) const
virtual bool isTerminator(const MCInst &Inst) const
virtual bool isReturn(const MCInst &Inst) const
virtual bool isIndirectBranch(const MCInst &Inst) const
Interface to description of machine instruction set.
MCRegister getReg() const
Returns the register number.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
Streaming machine code generation interface.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
Target specific streamer interface.
Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
This is an optimization pass for GlobalISel generic memory operations.
Target & getTheLoongArch64Target()
MCCodeEmitter * createLoongArchMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
MCAsmBackend * createLoongArchAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
Target & getTheLoongArch32Target()
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
MCELFStreamer * createLoongArchELFStreamer(MCContext &C, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > MOW, std::unique_ptr< MCCodeEmitter > MCE)
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn)
RegisterMCAsmInfo - Register a MCAsmInfo implementation for the given target.
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)