1 //===- HexagonInstPrinter.cpp - Convert Hexagon MCInst to assembly syntax -===//
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
7 //===----------------------------------------------------------------------===//
9 // This class prints an Hexagon MCInst to a .s file.
11 //===----------------------------------------------------------------------===//
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"
24 #define DEBUG_TYPE "asm-printer"
26 #define GET_INSTRUCTION_NAME
27 #include "HexagonGenAsmWriter.inc"
29 void HexagonInstPrinter::printRegName(raw_ostream
&O
, unsigned RegNo
) const {
30 O
<< getRegisterName(RegNo
);
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);
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
);
45 printInstruction(MCI
.getOperand(0).getInst(), OS
);
47 printInstruction(&MCI
, OS
);
48 HasExtender
= HexagonMCInstrInfo::isImmext(MCI
);
52 bool IsLoop0
= HexagonMCInstrInfo::isInnerLoop(*MI
);
53 bool IsLoop1
= HexagonMCInstrInfo::isOuterLoop(*MI
);
55 OS
<< (IsLoop1
? " :endloop01" : " :endloop0");
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
)))
66 MCOperand
const &MO
= MI
->getOperand(OpNo
);
68 O
<< getRegisterName(MO
.getReg());
69 } else if (MO
.isExpr()) {
71 if (MO
.getExpr()->evaluateAsAbsolute(Value
))
72 O
<< formatImm(Value
);
76 llvm_unreachable("Unknown operand");
80 void HexagonInstPrinter::printBrtarget(MCInst
const *MI
, unsigned OpNo
,
81 raw_ostream
&O
) const {
82 MCOperand
const &MO
= MI
->getOperand(OpNo
);
84 MCExpr
const &Expr
= *MO
.getExpr();
86 if (Expr
.evaluateAsAbsolute(Value
))
87 O
<< format("0x%" PRIx64
, Value
);
89 if (HasExtender
|| HexagonMCInstrInfo::isConstExtended(MII
, *MI
))
90 if (HexagonMCInstrInfo::getExtendableOp(MII
, *MI
) == OpNo
)