133388ae8SLu Weining //===- LoongArchInstPrinter.cpp - Convert LoongArch MCInst to asm syntax --===//
233388ae8SLu Weining //
333388ae8SLu Weining // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
433388ae8SLu Weining // See https://llvm.org/LICENSE.txt for license information.
533388ae8SLu Weining // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
633388ae8SLu Weining //
733388ae8SLu Weining //===----------------------------------------------------------------------===//
833388ae8SLu Weining //
933388ae8SLu Weining // This class prints an LoongArch MCInst to a .s file.
1033388ae8SLu Weining //
1133388ae8SLu Weining //===----------------------------------------------------------------------===//
1233388ae8SLu Weining 
1333388ae8SLu Weining #include "LoongArchInstPrinter.h"
1433388ae8SLu Weining #include "LoongArchBaseInfo.h"
1533388ae8SLu Weining #include "llvm/MC/MCAsmInfo.h"
1633388ae8SLu Weining #include "llvm/MC/MCInst.h"
1733388ae8SLu Weining #include "llvm/MC/MCRegisterInfo.h"
1833388ae8SLu Weining #include "llvm/MC/MCSubtargetInfo.h"
1933388ae8SLu Weining #include "llvm/MC/MCSymbol.h"
2033388ae8SLu Weining using namespace llvm;
2133388ae8SLu Weining 
2233388ae8SLu Weining #define DEBUG_TYPE "loongarch-asm-printer"
2333388ae8SLu Weining 
2433388ae8SLu Weining // Include the auto-generated portion of the assembly writer.
2533388ae8SLu Weining #define PRINT_ALIAS_INSTR
2633388ae8SLu Weining #include "LoongArchGenAsmWriter.inc"
2733388ae8SLu Weining 
printInst(const MCInst * MI,uint64_t Address,StringRef Annot,const MCSubtargetInfo & STI,raw_ostream & O)2833388ae8SLu Weining void LoongArchInstPrinter::printInst(const MCInst *MI, uint64_t Address,
2933388ae8SLu Weining                                      StringRef Annot,
3033388ae8SLu Weining                                      const MCSubtargetInfo &STI,
3133388ae8SLu Weining                                      raw_ostream &O) {
3233388ae8SLu Weining   if (!printAliasInstr(MI, Address, STI, O))
3333388ae8SLu Weining     printInstruction(MI, Address, STI, O);
3433388ae8SLu Weining   printAnnotation(O, Annot);
3533388ae8SLu Weining }
3633388ae8SLu Weining 
printRegName(raw_ostream & O,unsigned RegNo) const3733388ae8SLu Weining void LoongArchInstPrinter::printRegName(raw_ostream &O, unsigned RegNo) const {
38*1d91537cSWeining Lu   O << '$' << getRegisterName(RegNo);
3933388ae8SLu Weining }
4033388ae8SLu Weining 
printOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4133388ae8SLu Weining void LoongArchInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
4233388ae8SLu Weining                                         const MCSubtargetInfo &STI,
4333388ae8SLu Weining                                         raw_ostream &O) {
4433388ae8SLu Weining   const MCOperand &MO = MI->getOperand(OpNo);
4533388ae8SLu Weining 
4633388ae8SLu Weining   if (MO.isReg()) {
4733388ae8SLu Weining     printRegName(O, MO.getReg());
4833388ae8SLu Weining     return;
4933388ae8SLu Weining   }
5033388ae8SLu Weining 
5133388ae8SLu Weining   if (MO.isImm()) {
5233388ae8SLu Weining     O << MO.getImm();
5333388ae8SLu Weining     return;
5433388ae8SLu Weining   }
5533388ae8SLu Weining 
5633388ae8SLu Weining   assert(MO.isExpr() && "Unknown operand kind in printOperand");
5733388ae8SLu Weining   MO.getExpr()->print(O, &MAI);
5833388ae8SLu Weining }
5933388ae8SLu Weining 
getRegisterName(unsigned RegNo)6033388ae8SLu Weining const char *LoongArchInstPrinter::getRegisterName(unsigned RegNo) {
6133388ae8SLu Weining   // Default print reg alias name
6233388ae8SLu Weining   return getRegisterName(RegNo, LoongArch::RegAliasName);
6333388ae8SLu Weining }
64