1*81ad6265SDimitry Andric //===-- LoongArchMCTargetDesc.cpp - LoongArch Target Descriptions ---------===// 2*81ad6265SDimitry Andric // 3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*81ad6265SDimitry Andric // 7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 8*81ad6265SDimitry Andric // 9*81ad6265SDimitry Andric // This file provides LoongArch specific target descriptions. 10*81ad6265SDimitry Andric // 11*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 12*81ad6265SDimitry Andric 13*81ad6265SDimitry Andric #include "LoongArchMCTargetDesc.h" 14*81ad6265SDimitry Andric #include "LoongArchBaseInfo.h" 15*81ad6265SDimitry Andric #include "LoongArchInstPrinter.h" 16*81ad6265SDimitry Andric #include "LoongArchMCAsmInfo.h" 17*81ad6265SDimitry Andric #include "TargetInfo/LoongArchTargetInfo.h" 18*81ad6265SDimitry Andric #include "llvm/MC/MCAsmInfo.h" 19*81ad6265SDimitry Andric #include "llvm/MC/MCDwarf.h" 20*81ad6265SDimitry Andric #include "llvm/MC/MCInstrAnalysis.h" 21*81ad6265SDimitry Andric #include "llvm/MC/MCInstrInfo.h" 22*81ad6265SDimitry Andric #include "llvm/MC/MCRegisterInfo.h" 23*81ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 24*81ad6265SDimitry Andric #include "llvm/MC/TargetRegistry.h" 25*81ad6265SDimitry Andric #include "llvm/Support/Compiler.h" 26*81ad6265SDimitry Andric 27*81ad6265SDimitry Andric #define GET_INSTRINFO_MC_DESC 28*81ad6265SDimitry Andric #include "LoongArchGenInstrInfo.inc" 29*81ad6265SDimitry Andric 30*81ad6265SDimitry Andric #define GET_REGINFO_MC_DESC 31*81ad6265SDimitry Andric #include "LoongArchGenRegisterInfo.inc" 32*81ad6265SDimitry Andric 33*81ad6265SDimitry Andric #define GET_SUBTARGETINFO_MC_DESC 34*81ad6265SDimitry Andric #include "LoongArchGenSubtargetInfo.inc" 35*81ad6265SDimitry Andric 36*81ad6265SDimitry Andric using namespace llvm; 37*81ad6265SDimitry Andric 38*81ad6265SDimitry Andric static MCRegisterInfo *createLoongArchMCRegisterInfo(const Triple &TT) { 39*81ad6265SDimitry Andric MCRegisterInfo *X = new MCRegisterInfo(); 40*81ad6265SDimitry Andric InitLoongArchMCRegisterInfo(X, LoongArch::R1); 41*81ad6265SDimitry Andric return X; 42*81ad6265SDimitry Andric } 43*81ad6265SDimitry Andric 44*81ad6265SDimitry Andric static MCInstrInfo *createLoongArchMCInstrInfo() { 45*81ad6265SDimitry Andric MCInstrInfo *X = new MCInstrInfo(); 46*81ad6265SDimitry Andric InitLoongArchMCInstrInfo(X); 47*81ad6265SDimitry Andric return X; 48*81ad6265SDimitry Andric } 49*81ad6265SDimitry Andric 50*81ad6265SDimitry Andric static MCSubtargetInfo * 51*81ad6265SDimitry Andric createLoongArchMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 52*81ad6265SDimitry Andric if (CPU.empty()) 53*81ad6265SDimitry Andric CPU = TT.isArch64Bit() ? "la464" : "generic-la32"; 54*81ad6265SDimitry Andric return createLoongArchMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); 55*81ad6265SDimitry Andric } 56*81ad6265SDimitry Andric 57*81ad6265SDimitry Andric static MCAsmInfo *createLoongArchMCAsmInfo(const MCRegisterInfo &MRI, 58*81ad6265SDimitry Andric const Triple &TT, 59*81ad6265SDimitry Andric const MCTargetOptions &Options) { 60*81ad6265SDimitry Andric MCAsmInfo *MAI = new LoongArchMCAsmInfo(TT); 61*81ad6265SDimitry Andric 62*81ad6265SDimitry Andric // Initial state of the frame pointer is sp(r3). 63*81ad6265SDimitry Andric MCRegister SP = MRI.getDwarfRegNum(LoongArch::R3, true); 64*81ad6265SDimitry Andric MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, SP, 0); 65*81ad6265SDimitry Andric MAI->addInitialFrameState(Inst); 66*81ad6265SDimitry Andric 67*81ad6265SDimitry Andric return MAI; 68*81ad6265SDimitry Andric } 69*81ad6265SDimitry Andric 70*81ad6265SDimitry Andric static MCInstPrinter *createLoongArchMCInstPrinter(const Triple &T, 71*81ad6265SDimitry Andric unsigned SyntaxVariant, 72*81ad6265SDimitry Andric const MCAsmInfo &MAI, 73*81ad6265SDimitry Andric const MCInstrInfo &MII, 74*81ad6265SDimitry Andric const MCRegisterInfo &MRI) { 75*81ad6265SDimitry Andric return new LoongArchInstPrinter(MAI, MII, MRI); 76*81ad6265SDimitry Andric } 77*81ad6265SDimitry Andric 78*81ad6265SDimitry Andric namespace { 79*81ad6265SDimitry Andric 80*81ad6265SDimitry Andric class LoongArchMCInstrAnalysis : public MCInstrAnalysis { 81*81ad6265SDimitry Andric public: 82*81ad6265SDimitry Andric explicit LoongArchMCInstrAnalysis(const MCInstrInfo *Info) 83*81ad6265SDimitry Andric : MCInstrAnalysis(Info) {} 84*81ad6265SDimitry Andric 85*81ad6265SDimitry Andric bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size, 86*81ad6265SDimitry Andric uint64_t &Target) const override { 87*81ad6265SDimitry Andric unsigned NumOps = Inst.getNumOperands(); 88*81ad6265SDimitry Andric if (isBranch(Inst) || Inst.getOpcode() == LoongArch::BL) { 89*81ad6265SDimitry Andric Target = Addr + Inst.getOperand(NumOps - 1).getImm(); 90*81ad6265SDimitry Andric return true; 91*81ad6265SDimitry Andric } 92*81ad6265SDimitry Andric 93*81ad6265SDimitry Andric return false; 94*81ad6265SDimitry Andric } 95*81ad6265SDimitry Andric }; 96*81ad6265SDimitry Andric 97*81ad6265SDimitry Andric } // end anonymous namespace 98*81ad6265SDimitry Andric 99*81ad6265SDimitry Andric static MCInstrAnalysis *createLoongArchInstrAnalysis(const MCInstrInfo *Info) { 100*81ad6265SDimitry Andric return new LoongArchMCInstrAnalysis(Info); 101*81ad6265SDimitry Andric } 102*81ad6265SDimitry Andric 103*81ad6265SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeLoongArchTargetMC() { 104*81ad6265SDimitry Andric for (Target *T : {&getTheLoongArch32Target(), &getTheLoongArch64Target()}) { 105*81ad6265SDimitry Andric TargetRegistry::RegisterMCRegInfo(*T, createLoongArchMCRegisterInfo); 106*81ad6265SDimitry Andric TargetRegistry::RegisterMCInstrInfo(*T, createLoongArchMCInstrInfo); 107*81ad6265SDimitry Andric TargetRegistry::RegisterMCSubtargetInfo(*T, createLoongArchMCSubtargetInfo); 108*81ad6265SDimitry Andric TargetRegistry::RegisterMCAsmInfo(*T, createLoongArchMCAsmInfo); 109*81ad6265SDimitry Andric TargetRegistry::RegisterMCCodeEmitter(*T, createLoongArchMCCodeEmitter); 110*81ad6265SDimitry Andric TargetRegistry::RegisterMCAsmBackend(*T, createLoongArchAsmBackend); 111*81ad6265SDimitry Andric TargetRegistry::RegisterMCInstPrinter(*T, createLoongArchMCInstPrinter); 112*81ad6265SDimitry Andric TargetRegistry::RegisterMCInstrAnalysis(*T, createLoongArchInstrAnalysis); 113*81ad6265SDimitry Andric } 114*81ad6265SDimitry Andric } 115