1 //===- HexagonInstPrinter.cpp - Convert Hexagon MCInst to assembly syntax -===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This class prints an Hexagon MCInst to a .s file. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "HexagonInstPrinter.h" 14 #include "MCTargetDesc/HexagonBaseInfo.h" 15 #include "MCTargetDesc/HexagonMCInstrInfo.h" 16 #include "llvm/MC/MCAsmInfo.h" 17 #include "llvm/MC/MCExpr.h" 18 #include "llvm/MC/MCInst.h" 19 #include "llvm/Support/Debug.h" 20 #include "llvm/Support/raw_ostream.h" 21 22 using namespace llvm; 23 24 #define DEBUG_TYPE "asm-printer" 25 26 #define GET_INSTRUCTION_NAME 27 #include "HexagonGenAsmWriter.inc" 28 29 void HexagonInstPrinter::printRegName(raw_ostream &O, unsigned RegNo) const { 30 O << getRegisterName(RegNo); 31 } 32 33 void HexagonInstPrinter::printInst(const MCInst *MI, raw_ostream &OS, 34 StringRef Annot, const MCSubtargetInfo &STI) { 35 assert(HexagonMCInstrInfo::isBundle(*MI)); 36 assert(HexagonMCInstrInfo::bundleSize(*MI) <= HEXAGON_PACKET_SIZE); 37 assert(HexagonMCInstrInfo::bundleSize(*MI) > 0); 38 HasExtender = false; 39 for (auto const &I : HexagonMCInstrInfo::bundleInstructions(*MI)) { 40 MCInst const &MCI = *I.getInst(); 41 if (HexagonMCInstrInfo::isDuplex(MII, MCI)) { 42 printInstruction(MCI.getOperand(1).getInst(), OS); 43 OS << '\v'; 44 HasExtender = false; 45 printInstruction(MCI.getOperand(0).getInst(), OS); 46 } else 47 printInstruction(&MCI, OS); 48 HasExtender = HexagonMCInstrInfo::isImmext(MCI); 49 OS << "\n"; 50 } 51 52 bool IsLoop0 = HexagonMCInstrInfo::isInnerLoop(*MI); 53 bool IsLoop1 = HexagonMCInstrInfo::isOuterLoop(*MI); 54 if (IsLoop0) { 55 OS << (IsLoop1 ? " :endloop01" : " :endloop0"); 56 } else if (IsLoop1) { 57 OS << " :endloop1"; 58 } 59 } 60 61 void HexagonInstPrinter::printOperand(MCInst const *MI, unsigned OpNo, 62 raw_ostream &O) const { 63 if (HexagonMCInstrInfo::getExtendableOp(MII, *MI) == OpNo && 64 (HasExtender || HexagonMCInstrInfo::isConstExtended(MII, *MI))) 65 O << "#"; 66 MCOperand const &MO = MI->getOperand(OpNo); 67 if (MO.isReg()) { 68 O << getRegisterName(MO.getReg()); 69 } else if (MO.isExpr()) { 70 int64_t Value; 71 if (MO.getExpr()->evaluateAsAbsolute(Value)) 72 O << formatImm(Value); 73 else 74 O << *MO.getExpr(); 75 } else { 76 llvm_unreachable("Unknown operand"); 77 } 78 } 79 80 void HexagonInstPrinter::printBrtarget(MCInst const *MI, unsigned OpNo, 81 raw_ostream &O) const { 82 MCOperand const &MO = MI->getOperand(OpNo); 83 assert (MO.isExpr()); 84 MCExpr const &Expr = *MO.getExpr(); 85 int64_t Value; 86 if (Expr.evaluateAsAbsolute(Value)) 87 O << format("0x%" PRIx64, Value); 88 else { 89 if (HasExtender || HexagonMCInstrInfo::isConstExtended(MII, *MI)) 90 if (HexagonMCInstrInfo::getExtendableOp(MII, *MI) == OpNo) 91 O << "##"; 92 O << Expr; 93 } 94 } 95