]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonInstPrinter.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / lib / Target / Hexagon / MCTargetDesc / HexagonInstPrinter.cpp
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 }