18ba622baSZi Xuan Wu //===-- CSKYInstPrinter.cpp - Convert CSKY MCInst to asm syntax ---------===// 28ba622baSZi Xuan Wu // 38ba622baSZi Xuan Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48ba622baSZi Xuan Wu // See https://llvm.org/LICENSE.txt for license information. 58ba622baSZi Xuan Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68ba622baSZi Xuan Wu // 78ba622baSZi Xuan Wu //===----------------------------------------------------------------------===// 88ba622baSZi Xuan Wu // 98ba622baSZi Xuan Wu // This class prints an CSKY MCInst to a .s file. 108ba622baSZi Xuan Wu // 118ba622baSZi Xuan Wu //===----------------------------------------------------------------------===// 128ba622baSZi Xuan Wu 138ba622baSZi Xuan Wu #include "CSKYInstPrinter.h" 14de10a02fSZi Xuan Wu #include "llvm/ADT/StringExtras.h" 158ba622baSZi Xuan Wu #include "llvm/MC/MCAsmInfo.h" 168ba622baSZi Xuan Wu #include "llvm/MC/MCExpr.h" 178ba622baSZi Xuan Wu #include "llvm/MC/MCInst.h" 188ba622baSZi Xuan Wu #include "llvm/MC/MCRegisterInfo.h" 198ba622baSZi Xuan Wu #include "llvm/MC/MCSubtargetInfo.h" 208ba622baSZi Xuan Wu #include "llvm/MC/MCSymbol.h" 218ba622baSZi Xuan Wu #include "llvm/Support/CommandLine.h" 228ba622baSZi Xuan Wu #include "llvm/Support/ErrorHandling.h" 238ba622baSZi Xuan Wu #include "llvm/Support/FormattedStream.h" 248ba622baSZi Xuan Wu 258ba622baSZi Xuan Wu using namespace llvm; 268ba622baSZi Xuan Wu 278ba622baSZi Xuan Wu #define DEBUG_TYPE "csky-asm-printer" 288ba622baSZi Xuan Wu 298ba622baSZi Xuan Wu // Include the auto-generated portion of the assembly writer. 308ba622baSZi Xuan Wu #define PRINT_ALIAS_INSTR 318ba622baSZi Xuan Wu #include "CSKYGenAsmWriter.inc" 328ba622baSZi Xuan Wu 338ba622baSZi Xuan Wu static cl::opt<bool> 348ba622baSZi Xuan Wu NoAliases("csky-no-aliases", 358ba622baSZi Xuan Wu cl::desc("Disable the emission of assembler pseudo instructions"), 368ba622baSZi Xuan Wu cl::init(false), cl::Hidden); 378ba622baSZi Xuan Wu 388ba622baSZi Xuan Wu static cl::opt<bool> 398ba622baSZi Xuan Wu ArchRegNames("csky-arch-reg-names", 408ba622baSZi Xuan Wu cl::desc("Print architectural register names rather than the " 418ba622baSZi Xuan Wu "ABI names (such as r14 instead of sp)"), 428ba622baSZi Xuan Wu cl::init(false), cl::Hidden); 438ba622baSZi Xuan Wu 448ba622baSZi Xuan Wu // The command-line flags above are used by llvm-mc and llc. They can be used by 458ba622baSZi Xuan Wu // `llvm-objdump`, but we override their values here to handle options passed to 468ba622baSZi Xuan Wu // `llvm-objdump` with `-M` (which matches GNU objdump). There did not seem to 478ba622baSZi Xuan Wu // be an easier way to allow these options in all these tools, without doing it 488ba622baSZi Xuan Wu // this way. 498ba622baSZi Xuan Wu bool CSKYInstPrinter::applyTargetSpecificCLOption(StringRef Opt) { 508ba622baSZi Xuan Wu if (Opt == "no-aliases") { 518ba622baSZi Xuan Wu NoAliases = true; 528ba622baSZi Xuan Wu return true; 538ba622baSZi Xuan Wu } 548ba622baSZi Xuan Wu if (Opt == "numeric") { 558ba622baSZi Xuan Wu ArchRegNames = true; 568ba622baSZi Xuan Wu return true; 578ba622baSZi Xuan Wu } 588ba622baSZi Xuan Wu 598ba622baSZi Xuan Wu return false; 608ba622baSZi Xuan Wu } 618ba622baSZi Xuan Wu 628ba622baSZi Xuan Wu void CSKYInstPrinter::printInst(const MCInst *MI, uint64_t Address, 638ba622baSZi Xuan Wu StringRef Annot, const MCSubtargetInfo &STI, 648ba622baSZi Xuan Wu raw_ostream &O) { 658ba622baSZi Xuan Wu const MCInst *NewMI = MI; 668ba622baSZi Xuan Wu 678ba622baSZi Xuan Wu if (NoAliases || !printAliasInstr(NewMI, Address, STI, O)) 688ba622baSZi Xuan Wu printInstruction(NewMI, Address, STI, O); 698ba622baSZi Xuan Wu printAnnotation(O, Annot); 708ba622baSZi Xuan Wu } 718ba622baSZi Xuan Wu 728ba622baSZi Xuan Wu void CSKYInstPrinter::printRegName(raw_ostream &O, unsigned RegNo) const { 738ba622baSZi Xuan Wu O << getRegisterName(RegNo); 748ba622baSZi Xuan Wu } 758ba622baSZi Xuan Wu 76*4ad517e6SZi Xuan Wu void CSKYInstPrinter::printFPRRegName(raw_ostream &O, unsigned RegNo) const { 77*4ad517e6SZi Xuan Wu if (PrintBranchImmAsAddress) 78*4ad517e6SZi Xuan Wu O << getRegisterName(RegNo, CSKY::NoRegAltName); 79*4ad517e6SZi Xuan Wu else 80*4ad517e6SZi Xuan Wu O << getRegisterName(RegNo); 81*4ad517e6SZi Xuan Wu } 82*4ad517e6SZi Xuan Wu 838ba622baSZi Xuan Wu void CSKYInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 848ba622baSZi Xuan Wu const MCSubtargetInfo &STI, raw_ostream &O, 858ba622baSZi Xuan Wu const char *Modifier) { 868ba622baSZi Xuan Wu assert((Modifier == 0 || Modifier[0] == 0) && "No modifiers supported"); 878ba622baSZi Xuan Wu const MCOperand &MO = MI->getOperand(OpNo); 888ba622baSZi Xuan Wu 898ba622baSZi Xuan Wu if (MO.isReg()) { 908ba622baSZi Xuan Wu if (MO.getReg() == CSKY::C) 918ba622baSZi Xuan Wu O << ""; 928ba622baSZi Xuan Wu else 938ba622baSZi Xuan Wu printRegName(O, MO.getReg()); 948ba622baSZi Xuan Wu return; 958ba622baSZi Xuan Wu } 968ba622baSZi Xuan Wu 978ba622baSZi Xuan Wu if (MO.isImm()) { 988ba622baSZi Xuan Wu O << formatImm(MO.getImm()); 998ba622baSZi Xuan Wu return; 1008ba622baSZi Xuan Wu } 1018ba622baSZi Xuan Wu 1028ba622baSZi Xuan Wu assert(MO.isExpr() && "Unknown operand kind in printOperand"); 1038ba622baSZi Xuan Wu MO.getExpr()->print(O, &MAI); 1048ba622baSZi Xuan Wu } 1058ba622baSZi Xuan Wu 106de10a02fSZi Xuan Wu void CSKYInstPrinter::printDataSymbol(const MCInst *MI, unsigned OpNo, 107de10a02fSZi Xuan Wu const MCSubtargetInfo &STI, 108de10a02fSZi Xuan Wu raw_ostream &O) { 109de10a02fSZi Xuan Wu const MCOperand &MO = MI->getOperand(OpNo); 110de10a02fSZi Xuan Wu 111de10a02fSZi Xuan Wu O << "["; 112de10a02fSZi Xuan Wu if (MO.isImm()) 113de10a02fSZi Xuan Wu O << MO.getImm(); 114de10a02fSZi Xuan Wu else 115de10a02fSZi Xuan Wu MO.getExpr()->print(O, &MAI); 116de10a02fSZi Xuan Wu O << "]"; 117de10a02fSZi Xuan Wu } 118de10a02fSZi Xuan Wu 119de10a02fSZi Xuan Wu void CSKYInstPrinter::printConstpool(const MCInst *MI, uint64_t Address, 120de10a02fSZi Xuan Wu unsigned OpNo, const MCSubtargetInfo &STI, 121de10a02fSZi Xuan Wu raw_ostream &O) { 122de10a02fSZi Xuan Wu const MCOperand &MO = MI->getOperand(OpNo); 123de10a02fSZi Xuan Wu 124de10a02fSZi Xuan Wu if (MO.isImm()) { 125de10a02fSZi Xuan Wu if (PrintBranchImmAsAddress) { 126de10a02fSZi Xuan Wu uint64_t Target = Address + MO.getImm(); 127de10a02fSZi Xuan Wu Target &= 0xfffffffc; 128de10a02fSZi Xuan Wu O << formatHex(Target); 129de10a02fSZi Xuan Wu } else { 130de10a02fSZi Xuan Wu O << MO.getImm(); 131de10a02fSZi Xuan Wu } 132de10a02fSZi Xuan Wu return; 133de10a02fSZi Xuan Wu } 134de10a02fSZi Xuan Wu 135de10a02fSZi Xuan Wu assert(MO.isExpr() && "Unknown operand kind in printConstpool"); 136de10a02fSZi Xuan Wu 137de10a02fSZi Xuan Wu O << "["; 138de10a02fSZi Xuan Wu MO.getExpr()->print(O, &MAI); 139de10a02fSZi Xuan Wu O << "]"; 140de10a02fSZi Xuan Wu } 141de10a02fSZi Xuan Wu 142de10a02fSZi Xuan Wu void CSKYInstPrinter::printCSKYSymbolOperand(const MCInst *MI, uint64_t Address, 143de10a02fSZi Xuan Wu unsigned OpNo, 144de10a02fSZi Xuan Wu const MCSubtargetInfo &STI, 145de10a02fSZi Xuan Wu raw_ostream &O) { 146de10a02fSZi Xuan Wu const MCOperand &MO = MI->getOperand(OpNo); 147de10a02fSZi Xuan Wu if (!MO.isImm()) { 148de10a02fSZi Xuan Wu return printOperand(MI, OpNo, STI, O); 149de10a02fSZi Xuan Wu } 150de10a02fSZi Xuan Wu 151de10a02fSZi Xuan Wu if (PrintBranchImmAsAddress) { 152de10a02fSZi Xuan Wu uint64_t Target = Address + MO.getImm(); 153de10a02fSZi Xuan Wu Target &= 0xffffffff; 154de10a02fSZi Xuan Wu O << formatHex(Target); 155de10a02fSZi Xuan Wu } else { 156de10a02fSZi Xuan Wu O << MO.getImm(); 157de10a02fSZi Xuan Wu } 158de10a02fSZi Xuan Wu } 159de10a02fSZi Xuan Wu 160de10a02fSZi Xuan Wu void CSKYInstPrinter::printRegisterSeq(const MCInst *MI, unsigned OpNum, 161de10a02fSZi Xuan Wu const MCSubtargetInfo &STI, 162de10a02fSZi Xuan Wu raw_ostream &O) { 163de10a02fSZi Xuan Wu printRegName(O, MI->getOperand(OpNum).getReg()); 164de10a02fSZi Xuan Wu O << "-"; 165de10a02fSZi Xuan Wu printRegName(O, MI->getOperand(OpNum + 1).getReg()); 166de10a02fSZi Xuan Wu } 167de10a02fSZi Xuan Wu 168de10a02fSZi Xuan Wu void CSKYInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum, 169de10a02fSZi Xuan Wu const MCSubtargetInfo &STI, 170de10a02fSZi Xuan Wu raw_ostream &O) { 171de10a02fSZi Xuan Wu auto V = MI->getOperand(OpNum).getImm(); 172de10a02fSZi Xuan Wu ListSeparator LS; 173de10a02fSZi Xuan Wu 174de10a02fSZi Xuan Wu if (V & 0xf) { 175de10a02fSZi Xuan Wu O << LS; 176de10a02fSZi Xuan Wu printRegName(O, CSKY::R4); 177de10a02fSZi Xuan Wu auto Offset = (V & 0xf) - 1; 178de10a02fSZi Xuan Wu if (Offset) { 179de10a02fSZi Xuan Wu O << "-"; 180de10a02fSZi Xuan Wu printRegName(O, CSKY::R4 + Offset); 181de10a02fSZi Xuan Wu } 182de10a02fSZi Xuan Wu } 183de10a02fSZi Xuan Wu 184de10a02fSZi Xuan Wu if ((V >> 4) & 0x1) { 185de10a02fSZi Xuan Wu O << LS; 186de10a02fSZi Xuan Wu printRegName(O, CSKY::R15); 187de10a02fSZi Xuan Wu } 188de10a02fSZi Xuan Wu 189de10a02fSZi Xuan Wu if ((V >> 5) & 0x7) { 190de10a02fSZi Xuan Wu O << LS; 191de10a02fSZi Xuan Wu printRegName(O, CSKY::R16); 192de10a02fSZi Xuan Wu 193de10a02fSZi Xuan Wu auto Offset = ((V >> 5) & 0x7) - 1; 194de10a02fSZi Xuan Wu 195de10a02fSZi Xuan Wu if (Offset) { 196de10a02fSZi Xuan Wu O << "-"; 197de10a02fSZi Xuan Wu printRegName(O, CSKY::R16 + Offset); 198de10a02fSZi Xuan Wu } 199de10a02fSZi Xuan Wu } 200de10a02fSZi Xuan Wu 201de10a02fSZi Xuan Wu if ((V >> 8) & 0x1) { 202de10a02fSZi Xuan Wu O << LS; 203de10a02fSZi Xuan Wu printRegName(O, CSKY::R28); 204de10a02fSZi Xuan Wu } 205de10a02fSZi Xuan Wu } 206de10a02fSZi Xuan Wu 2078ba622baSZi Xuan Wu const char *CSKYInstPrinter::getRegisterName(unsigned RegNo) { 2088ba622baSZi Xuan Wu return getRegisterName(RegNo, ArchRegNames ? CSKY::NoRegAltName 2098ba622baSZi Xuan Wu : CSKY::ABIRegAltName); 2108ba622baSZi Xuan Wu } 211*4ad517e6SZi Xuan Wu 212*4ad517e6SZi Xuan Wu void CSKYInstPrinter::printFPR(const MCInst *MI, unsigned OpNo, 213*4ad517e6SZi Xuan Wu const MCSubtargetInfo &STI, raw_ostream &O) { 214*4ad517e6SZi Xuan Wu const MCOperand &MO = MI->getOperand(OpNo); 215*4ad517e6SZi Xuan Wu assert(MO.isReg()); 216*4ad517e6SZi Xuan Wu 217*4ad517e6SZi Xuan Wu printFPRRegName(O, MO.getReg()); 218*4ad517e6SZi Xuan Wu } 219