[InstCombine] Signed saturation patterns
[llvm-core.git] / lib / Target / Hexagon / MCTargetDesc / HexagonInstPrinter.cpp
blob6b9e63f5ac9e2402e67f7e1d6da69544af796ffe
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.
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"
22 using namespace llvm;
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);
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";
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";
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");
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;