181ad6265SDimitry Andric //===-- LoongArchMCTargetDesc.cpp - LoongArch Target Descriptions ---------===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This file provides LoongArch specific target descriptions. 1081ad6265SDimitry Andric // 1181ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1281ad6265SDimitry Andric 1381ad6265SDimitry Andric #include "LoongArchMCTargetDesc.h" 1481ad6265SDimitry Andric #include "LoongArchBaseInfo.h" 1581ad6265SDimitry Andric #include "LoongArchInstPrinter.h" 1681ad6265SDimitry Andric #include "LoongArchMCAsmInfo.h" 1781ad6265SDimitry Andric #include "TargetInfo/LoongArchTargetInfo.h" 1881ad6265SDimitry Andric #include "llvm/MC/MCAsmInfo.h" 1981ad6265SDimitry Andric #include "llvm/MC/MCDwarf.h" 2081ad6265SDimitry Andric #include "llvm/MC/MCInstrAnalysis.h" 2181ad6265SDimitry Andric #include "llvm/MC/MCInstrInfo.h" 2281ad6265SDimitry Andric #include "llvm/MC/MCRegisterInfo.h" 2381ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 2481ad6265SDimitry Andric #include "llvm/MC/TargetRegistry.h" 2581ad6265SDimitry Andric #include "llvm/Support/Compiler.h" 2681ad6265SDimitry Andric 2781ad6265SDimitry Andric #define GET_INSTRINFO_MC_DESC 28*753f127fSDimitry Andric #define ENABLE_INSTR_PREDICATE_VERIFIER 2981ad6265SDimitry Andric #include "LoongArchGenInstrInfo.inc" 3081ad6265SDimitry Andric 3181ad6265SDimitry Andric #define GET_REGINFO_MC_DESC 3281ad6265SDimitry Andric #include "LoongArchGenRegisterInfo.inc" 3381ad6265SDimitry Andric 3481ad6265SDimitry Andric #define GET_SUBTARGETINFO_MC_DESC 3581ad6265SDimitry Andric #include "LoongArchGenSubtargetInfo.inc" 3681ad6265SDimitry Andric 3781ad6265SDimitry Andric using namespace llvm; 3881ad6265SDimitry Andric 3981ad6265SDimitry Andric static MCRegisterInfo *createLoongArchMCRegisterInfo(const Triple &TT) { 4081ad6265SDimitry Andric MCRegisterInfo *X = new MCRegisterInfo(); 4181ad6265SDimitry Andric InitLoongArchMCRegisterInfo(X, LoongArch::R1); 4281ad6265SDimitry Andric return X; 4381ad6265SDimitry Andric } 4481ad6265SDimitry Andric 4581ad6265SDimitry Andric static MCInstrInfo *createLoongArchMCInstrInfo() { 4681ad6265SDimitry Andric MCInstrInfo *X = new MCInstrInfo(); 4781ad6265SDimitry Andric InitLoongArchMCInstrInfo(X); 4881ad6265SDimitry Andric return X; 4981ad6265SDimitry Andric } 5081ad6265SDimitry Andric 5181ad6265SDimitry Andric static MCSubtargetInfo * 5281ad6265SDimitry Andric createLoongArchMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 5381ad6265SDimitry Andric if (CPU.empty()) 5481ad6265SDimitry Andric CPU = TT.isArch64Bit() ? "la464" : "generic-la32"; 5581ad6265SDimitry Andric return createLoongArchMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); 5681ad6265SDimitry Andric } 5781ad6265SDimitry Andric 5881ad6265SDimitry Andric static MCAsmInfo *createLoongArchMCAsmInfo(const MCRegisterInfo &MRI, 5981ad6265SDimitry Andric const Triple &TT, 6081ad6265SDimitry Andric const MCTargetOptions &Options) { 6181ad6265SDimitry Andric MCAsmInfo *MAI = new LoongArchMCAsmInfo(TT); 6281ad6265SDimitry Andric 6381ad6265SDimitry Andric // Initial state of the frame pointer is sp(r3). 6481ad6265SDimitry Andric MCRegister SP = MRI.getDwarfRegNum(LoongArch::R3, true); 6581ad6265SDimitry Andric MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, SP, 0); 6681ad6265SDimitry Andric MAI->addInitialFrameState(Inst); 6781ad6265SDimitry Andric 6881ad6265SDimitry Andric return MAI; 6981ad6265SDimitry Andric } 7081ad6265SDimitry Andric 7181ad6265SDimitry Andric static MCInstPrinter *createLoongArchMCInstPrinter(const Triple &T, 7281ad6265SDimitry Andric unsigned SyntaxVariant, 7381ad6265SDimitry Andric const MCAsmInfo &MAI, 7481ad6265SDimitry Andric const MCInstrInfo &MII, 7581ad6265SDimitry Andric const MCRegisterInfo &MRI) { 7681ad6265SDimitry Andric return new LoongArchInstPrinter(MAI, MII, MRI); 7781ad6265SDimitry Andric } 7881ad6265SDimitry Andric 7981ad6265SDimitry Andric namespace { 8081ad6265SDimitry Andric 8181ad6265SDimitry Andric class LoongArchMCInstrAnalysis : public MCInstrAnalysis { 8281ad6265SDimitry Andric public: 8381ad6265SDimitry Andric explicit LoongArchMCInstrAnalysis(const MCInstrInfo *Info) 8481ad6265SDimitry Andric : MCInstrAnalysis(Info) {} 8581ad6265SDimitry Andric 8681ad6265SDimitry Andric bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size, 8781ad6265SDimitry Andric uint64_t &Target) const override { 8881ad6265SDimitry Andric unsigned NumOps = Inst.getNumOperands(); 8981ad6265SDimitry Andric if (isBranch(Inst) || Inst.getOpcode() == LoongArch::BL) { 9081ad6265SDimitry Andric Target = Addr + Inst.getOperand(NumOps - 1).getImm(); 9181ad6265SDimitry Andric return true; 9281ad6265SDimitry Andric } 9381ad6265SDimitry Andric 9481ad6265SDimitry Andric return false; 9581ad6265SDimitry Andric } 9681ad6265SDimitry Andric }; 9781ad6265SDimitry Andric 9881ad6265SDimitry Andric } // end anonymous namespace 9981ad6265SDimitry Andric 10081ad6265SDimitry Andric static MCInstrAnalysis *createLoongArchInstrAnalysis(const MCInstrInfo *Info) { 10181ad6265SDimitry Andric return new LoongArchMCInstrAnalysis(Info); 10281ad6265SDimitry Andric } 10381ad6265SDimitry Andric 10481ad6265SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeLoongArchTargetMC() { 10581ad6265SDimitry Andric for (Target *T : {&getTheLoongArch32Target(), &getTheLoongArch64Target()}) { 10681ad6265SDimitry Andric TargetRegistry::RegisterMCRegInfo(*T, createLoongArchMCRegisterInfo); 10781ad6265SDimitry Andric TargetRegistry::RegisterMCInstrInfo(*T, createLoongArchMCInstrInfo); 10881ad6265SDimitry Andric TargetRegistry::RegisterMCSubtargetInfo(*T, createLoongArchMCSubtargetInfo); 10981ad6265SDimitry Andric TargetRegistry::RegisterMCAsmInfo(*T, createLoongArchMCAsmInfo); 11081ad6265SDimitry Andric TargetRegistry::RegisterMCCodeEmitter(*T, createLoongArchMCCodeEmitter); 11181ad6265SDimitry Andric TargetRegistry::RegisterMCAsmBackend(*T, createLoongArchAsmBackend); 11281ad6265SDimitry Andric TargetRegistry::RegisterMCInstPrinter(*T, createLoongArchMCInstPrinter); 11381ad6265SDimitry Andric TargetRegistry::RegisterMCInstrAnalysis(*T, createLoongArchInstrAnalysis); 11481ad6265SDimitry Andric } 11581ad6265SDimitry Andric } 116