14bdb136bSRichard Trieu //===-- PPCInstPrinter.cpp - Convert PPC MCInst to assembly syntax --------===//
24bdb136bSRichard Trieu //
34bdb136bSRichard Trieu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44bdb136bSRichard Trieu // See https://llvm.org/LICENSE.txt for license information.
54bdb136bSRichard Trieu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64bdb136bSRichard Trieu //
74bdb136bSRichard Trieu //===----------------------------------------------------------------------===//
84bdb136bSRichard Trieu //
94bdb136bSRichard Trieu // This class prints an PPC MCInst to a .s file.
104bdb136bSRichard Trieu //
114bdb136bSRichard Trieu //===----------------------------------------------------------------------===//
124bdb136bSRichard Trieu
134bdb136bSRichard Trieu #include "MCTargetDesc/PPCInstPrinter.h"
144bdb136bSRichard Trieu #include "MCTargetDesc/PPCMCTargetDesc.h"
154bdb136bSRichard Trieu #include "MCTargetDesc/PPCPredicates.h"
164bdb136bSRichard Trieu #include "PPCInstrInfo.h"
174bdb136bSRichard Trieu #include "llvm/CodeGen/TargetOpcodes.h"
184bdb136bSRichard Trieu #include "llvm/MC/MCExpr.h"
194bdb136bSRichard Trieu #include "llvm/MC/MCInst.h"
204bdb136bSRichard Trieu #include "llvm/MC/MCInstrInfo.h"
214bdb136bSRichard Trieu #include "llvm/MC/MCRegisterInfo.h"
224bdb136bSRichard Trieu #include "llvm/MC/MCSubtargetInfo.h"
234bdb136bSRichard Trieu #include "llvm/MC/MCSymbol.h"
244bdb136bSRichard Trieu #include "llvm/Support/CommandLine.h"
254bdb136bSRichard Trieu #include "llvm/Support/raw_ostream.h"
264bdb136bSRichard Trieu using namespace llvm;
274bdb136bSRichard Trieu
284bdb136bSRichard Trieu #define DEBUG_TYPE "asm-printer"
294bdb136bSRichard Trieu
304bdb136bSRichard Trieu // FIXME: Once the integrated assembler supports full register names, tie this
314bdb136bSRichard Trieu // to the verbose-asm setting.
324bdb136bSRichard Trieu static cl::opt<bool>
334bdb136bSRichard Trieu FullRegNames("ppc-asm-full-reg-names", cl::Hidden, cl::init(false),
344bdb136bSRichard Trieu cl::desc("Use full register names when printing assembly"));
354bdb136bSRichard Trieu
364bdb136bSRichard Trieu // Useful for testing purposes. Prints vs{31-63} as v{0-31} respectively.
374bdb136bSRichard Trieu static cl::opt<bool>
384bdb136bSRichard Trieu ShowVSRNumsAsVR("ppc-vsr-nums-as-vr", cl::Hidden, cl::init(false),
394bdb136bSRichard Trieu cl::desc("Prints full register names with vs{31-63} as v{0-31}"));
404bdb136bSRichard Trieu
414bdb136bSRichard Trieu // Prints full register names with percent symbol.
424bdb136bSRichard Trieu static cl::opt<bool>
434bdb136bSRichard Trieu FullRegNamesWithPercent("ppc-reg-with-percent-prefix", cl::Hidden,
444bdb136bSRichard Trieu cl::init(false),
454bdb136bSRichard Trieu cl::desc("Prints full register names with percent"));
464bdb136bSRichard Trieu
474bdb136bSRichard Trieu #define PRINT_ALIAS_INSTR
484bdb136bSRichard Trieu #include "PPCGenAsmWriter.inc"
494bdb136bSRichard Trieu
printRegName(raw_ostream & OS,unsigned RegNo) const504bdb136bSRichard Trieu void PPCInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
514bdb136bSRichard Trieu const char *RegName = getRegisterName(RegNo);
524bdb136bSRichard Trieu OS << RegName;
534bdb136bSRichard Trieu }
544bdb136bSRichard Trieu
printInst(const MCInst * MI,uint64_t Address,StringRef Annot,const MCSubtargetInfo & STI,raw_ostream & O)55aa708763SFangrui Song void PPCInstPrinter::printInst(const MCInst *MI, uint64_t Address,
56aa708763SFangrui Song StringRef Annot, const MCSubtargetInfo &STI,
57aa708763SFangrui Song raw_ostream &O) {
58ffe2ec51SXiangling Liao // Customize printing of the addis instruction on AIX. When an operand is a
59ffe2ec51SXiangling Liao // symbol reference, the instruction syntax is changed to look like a load
60ffe2ec51SXiangling Liao // operation, i.e:
61ffe2ec51SXiangling Liao // Transform: addis $rD, $rA, $src --> addis $rD, $src($rA).
62ffe2ec51SXiangling Liao if (TT.isOSAIX() &&
63ffe2ec51SXiangling Liao (MI->getOpcode() == PPC::ADDIS8 || MI->getOpcode() == PPC::ADDIS) &&
64ffe2ec51SXiangling Liao MI->getOperand(2).isExpr()) {
65ffe2ec51SXiangling Liao assert((MI->getOperand(0).isReg() && MI->getOperand(1).isReg()) &&
66ffe2ec51SXiangling Liao "The first and the second operand of an addis instruction"
67ffe2ec51SXiangling Liao " should be registers.");
68ffe2ec51SXiangling Liao
69ffe2ec51SXiangling Liao assert(isa<MCSymbolRefExpr>(MI->getOperand(2).getExpr()) &&
70ffe2ec51SXiangling Liao "The third operand of an addis instruction should be a symbol "
71ffe2ec51SXiangling Liao "reference expression if it is an expression at all.");
72ffe2ec51SXiangling Liao
73ffe2ec51SXiangling Liao O << "\taddis ";
7493b54b7cSJinsong Ji printOperand(MI, 0, STI, O);
75ffe2ec51SXiangling Liao O << ", ";
7693b54b7cSJinsong Ji printOperand(MI, 2, STI, O);
77ffe2ec51SXiangling Liao O << "(";
7893b54b7cSJinsong Ji printOperand(MI, 1, STI, O);
79ffe2ec51SXiangling Liao O << ")";
80ffe2ec51SXiangling Liao return;
81ffe2ec51SXiangling Liao }
82ffe2ec51SXiangling Liao
83a60251d7SStefan Pintilie // Check if the last operand is an expression with the variant kind
84a60251d7SStefan Pintilie // VK_PPC_PCREL_OPT. If this is the case then this is a linker optimization
85a60251d7SStefan Pintilie // relocation and the .reloc directive needs to be added.
86a60251d7SStefan Pintilie unsigned LastOp = MI->getNumOperands() - 1;
87a60251d7SStefan Pintilie if (MI->getNumOperands() > 1) {
88a60251d7SStefan Pintilie const MCOperand &Operand = MI->getOperand(LastOp);
89a60251d7SStefan Pintilie if (Operand.isExpr()) {
90a60251d7SStefan Pintilie const MCExpr *Expr = Operand.getExpr();
91a60251d7SStefan Pintilie const MCSymbolRefExpr *SymExpr =
92a60251d7SStefan Pintilie static_cast<const MCSymbolRefExpr *>(Expr);
93a60251d7SStefan Pintilie
94a60251d7SStefan Pintilie if (SymExpr && SymExpr->getKind() == MCSymbolRefExpr::VK_PPC_PCREL_OPT) {
95a60251d7SStefan Pintilie const MCSymbol &Symbol = SymExpr->getSymbol();
96a60251d7SStefan Pintilie if (MI->getOpcode() == PPC::PLDpc) {
9793b54b7cSJinsong Ji printInstruction(MI, Address, STI, O);
98a60251d7SStefan Pintilie O << "\n";
99a60251d7SStefan Pintilie Symbol.print(O, &MAI);
100a60251d7SStefan Pintilie O << ":";
101a60251d7SStefan Pintilie return;
102a60251d7SStefan Pintilie } else {
103a60251d7SStefan Pintilie O << "\t.reloc ";
104a60251d7SStefan Pintilie Symbol.print(O, &MAI);
105a60251d7SStefan Pintilie O << "-8,R_PPC64_PCREL_OPT,.-(";
106a60251d7SStefan Pintilie Symbol.print(O, &MAI);
107a60251d7SStefan Pintilie O << "-8)\n";
108a60251d7SStefan Pintilie }
109a60251d7SStefan Pintilie }
110a60251d7SStefan Pintilie }
111a60251d7SStefan Pintilie }
112a60251d7SStefan Pintilie
1134bdb136bSRichard Trieu // Check for slwi/srwi mnemonics.
1144bdb136bSRichard Trieu if (MI->getOpcode() == PPC::RLWINM) {
1154bdb136bSRichard Trieu unsigned char SH = MI->getOperand(2).getImm();
1164bdb136bSRichard Trieu unsigned char MB = MI->getOperand(3).getImm();
1174bdb136bSRichard Trieu unsigned char ME = MI->getOperand(4).getImm();
1184bdb136bSRichard Trieu bool useSubstituteMnemonic = false;
1194bdb136bSRichard Trieu if (SH <= 31 && MB == 0 && ME == (31-SH)) {
1204bdb136bSRichard Trieu O << "\tslwi "; useSubstituteMnemonic = true;
1214bdb136bSRichard Trieu }
1224bdb136bSRichard Trieu if (SH <= 31 && MB == (32-SH) && ME == 31) {
1234bdb136bSRichard Trieu O << "\tsrwi "; useSubstituteMnemonic = true;
1244bdb136bSRichard Trieu SH = 32-SH;
1254bdb136bSRichard Trieu }
1264bdb136bSRichard Trieu if (useSubstituteMnemonic) {
12793b54b7cSJinsong Ji printOperand(MI, 0, STI, O);
1284bdb136bSRichard Trieu O << ", ";
12993b54b7cSJinsong Ji printOperand(MI, 1, STI, O);
1304bdb136bSRichard Trieu O << ", " << (unsigned int)SH;
1314bdb136bSRichard Trieu
1324bdb136bSRichard Trieu printAnnotation(O, Annot);
1334bdb136bSRichard Trieu return;
1344bdb136bSRichard Trieu }
1354bdb136bSRichard Trieu }
1364bdb136bSRichard Trieu
1374bdb136bSRichard Trieu if (MI->getOpcode() == PPC::RLDICR ||
1384bdb136bSRichard Trieu MI->getOpcode() == PPC::RLDICR_32) {
1394bdb136bSRichard Trieu unsigned char SH = MI->getOperand(2).getImm();
1404bdb136bSRichard Trieu unsigned char ME = MI->getOperand(3).getImm();
1414bdb136bSRichard Trieu // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH
1424bdb136bSRichard Trieu if (63-SH == ME) {
1434bdb136bSRichard Trieu O << "\tsldi ";
14493b54b7cSJinsong Ji printOperand(MI, 0, STI, O);
1454bdb136bSRichard Trieu O << ", ";
14693b54b7cSJinsong Ji printOperand(MI, 1, STI, O);
1474bdb136bSRichard Trieu O << ", " << (unsigned int)SH;
1484bdb136bSRichard Trieu printAnnotation(O, Annot);
1494bdb136bSRichard Trieu return;
1504bdb136bSRichard Trieu }
1514bdb136bSRichard Trieu }
1524bdb136bSRichard Trieu
1534bdb136bSRichard Trieu // dcbt[st] is printed manually here because:
1544bdb136bSRichard Trieu // 1. The assembly syntax is different between embedded and server targets
1554bdb136bSRichard Trieu // 2. We must print the short mnemonics for TH == 0 because the
1564bdb136bSRichard Trieu // embedded/server syntax default will not be stable across assemblers
1574bdb136bSRichard Trieu // The syntax for dcbt is:
1584bdb136bSRichard Trieu // dcbt ra, rb, th [server]
1594bdb136bSRichard Trieu // dcbt th, ra, rb [embedded]
1604bdb136bSRichard Trieu // where th can be omitted when it is 0. dcbtst is the same.
161*b4b9f9b4SAlbion Fung // On AIX, only emit the extended mnemonics for dcbt and dcbtst if
162*b4b9f9b4SAlbion Fung // the "modern assembler" is available.
163*b4b9f9b4SAlbion Fung if ((MI->getOpcode() == PPC::DCBT || MI->getOpcode() == PPC::DCBTST) &&
164*b4b9f9b4SAlbion Fung (!TT.isOSAIX() || STI.getFeatureBits()[PPC::FeatureModernAIXAs])) {
1654bdb136bSRichard Trieu unsigned char TH = MI->getOperand(0).getImm();
1664bdb136bSRichard Trieu O << "\tdcbt";
1674bdb136bSRichard Trieu if (MI->getOpcode() == PPC::DCBTST)
1684bdb136bSRichard Trieu O << "st";
1694bdb136bSRichard Trieu if (TH == 16)
1704bdb136bSRichard Trieu O << "t";
1714bdb136bSRichard Trieu O << " ";
1724bdb136bSRichard Trieu
1734bdb136bSRichard Trieu bool IsBookE = STI.getFeatureBits()[PPC::FeatureBookE];
1744bdb136bSRichard Trieu if (IsBookE && TH != 0 && TH != 16)
1754bdb136bSRichard Trieu O << (unsigned int) TH << ", ";
1764bdb136bSRichard Trieu
17793b54b7cSJinsong Ji printOperand(MI, 1, STI, O);
1784bdb136bSRichard Trieu O << ", ";
17993b54b7cSJinsong Ji printOperand(MI, 2, STI, O);
1804bdb136bSRichard Trieu
1814bdb136bSRichard Trieu if (!IsBookE && TH != 0 && TH != 16)
1824bdb136bSRichard Trieu O << ", " << (unsigned int) TH;
1834bdb136bSRichard Trieu
1844bdb136bSRichard Trieu printAnnotation(O, Annot);
1854bdb136bSRichard Trieu return;
1864bdb136bSRichard Trieu }
1874bdb136bSRichard Trieu
1884bdb136bSRichard Trieu if (MI->getOpcode() == PPC::DCBF) {
1894bdb136bSRichard Trieu unsigned char L = MI->getOperand(0).getImm();
19028fdeea9SEsme-Yi if (!L || L == 1 || L == 3 || L == 4 || L == 6) {
19128fdeea9SEsme-Yi O << "\tdcb";
19228fdeea9SEsme-Yi if (L != 6)
19328fdeea9SEsme-Yi O << "f";
19428fdeea9SEsme-Yi if (L == 1)
1954bdb136bSRichard Trieu O << "l";
1964bdb136bSRichard Trieu if (L == 3)
19728fdeea9SEsme-Yi O << "lp";
19828fdeea9SEsme-Yi if (L == 4)
19928fdeea9SEsme-Yi O << "ps";
20028fdeea9SEsme-Yi if (L == 6)
20128fdeea9SEsme-Yi O << "stps";
2024bdb136bSRichard Trieu O << " ";
2034bdb136bSRichard Trieu
20493b54b7cSJinsong Ji printOperand(MI, 1, STI, O);
2054bdb136bSRichard Trieu O << ", ";
20693b54b7cSJinsong Ji printOperand(MI, 2, STI, O);
2074bdb136bSRichard Trieu
2084bdb136bSRichard Trieu printAnnotation(O, Annot);
2094bdb136bSRichard Trieu return;
2104bdb136bSRichard Trieu }
2114bdb136bSRichard Trieu }
2124bdb136bSRichard Trieu
21393b54b7cSJinsong Ji if (!printAliasInstr(MI, Address, STI, O))
21493b54b7cSJinsong Ji printInstruction(MI, Address, STI, O);
2154bdb136bSRichard Trieu printAnnotation(O, Annot);
2164bdb136bSRichard Trieu }
2174bdb136bSRichard Trieu
printPredicateOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O,const char * Modifier)2184bdb136bSRichard Trieu void PPCInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNo,
21993b54b7cSJinsong Ji const MCSubtargetInfo &STI,
2204bdb136bSRichard Trieu raw_ostream &O,
2214bdb136bSRichard Trieu const char *Modifier) {
2224bdb136bSRichard Trieu unsigned Code = MI->getOperand(OpNo).getImm();
2234bdb136bSRichard Trieu
2244bdb136bSRichard Trieu if (StringRef(Modifier) == "cc") {
2254bdb136bSRichard Trieu switch ((PPC::Predicate)Code) {
2264bdb136bSRichard Trieu case PPC::PRED_LT_MINUS:
2274bdb136bSRichard Trieu case PPC::PRED_LT_PLUS:
2284bdb136bSRichard Trieu case PPC::PRED_LT:
2294bdb136bSRichard Trieu O << "lt";
2304bdb136bSRichard Trieu return;
2314bdb136bSRichard Trieu case PPC::PRED_LE_MINUS:
2324bdb136bSRichard Trieu case PPC::PRED_LE_PLUS:
2334bdb136bSRichard Trieu case PPC::PRED_LE:
2344bdb136bSRichard Trieu O << "le";
2354bdb136bSRichard Trieu return;
2364bdb136bSRichard Trieu case PPC::PRED_EQ_MINUS:
2374bdb136bSRichard Trieu case PPC::PRED_EQ_PLUS:
2384bdb136bSRichard Trieu case PPC::PRED_EQ:
2394bdb136bSRichard Trieu O << "eq";
2404bdb136bSRichard Trieu return;
2414bdb136bSRichard Trieu case PPC::PRED_GE_MINUS:
2424bdb136bSRichard Trieu case PPC::PRED_GE_PLUS:
2434bdb136bSRichard Trieu case PPC::PRED_GE:
2444bdb136bSRichard Trieu O << "ge";
2454bdb136bSRichard Trieu return;
2464bdb136bSRichard Trieu case PPC::PRED_GT_MINUS:
2474bdb136bSRichard Trieu case PPC::PRED_GT_PLUS:
2484bdb136bSRichard Trieu case PPC::PRED_GT:
2494bdb136bSRichard Trieu O << "gt";
2504bdb136bSRichard Trieu return;
2514bdb136bSRichard Trieu case PPC::PRED_NE_MINUS:
2524bdb136bSRichard Trieu case PPC::PRED_NE_PLUS:
2534bdb136bSRichard Trieu case PPC::PRED_NE:
2544bdb136bSRichard Trieu O << "ne";
2554bdb136bSRichard Trieu return;
2564bdb136bSRichard Trieu case PPC::PRED_UN_MINUS:
2574bdb136bSRichard Trieu case PPC::PRED_UN_PLUS:
2584bdb136bSRichard Trieu case PPC::PRED_UN:
2594bdb136bSRichard Trieu O << "un";
2604bdb136bSRichard Trieu return;
2614bdb136bSRichard Trieu case PPC::PRED_NU_MINUS:
2624bdb136bSRichard Trieu case PPC::PRED_NU_PLUS:
2634bdb136bSRichard Trieu case PPC::PRED_NU:
2644bdb136bSRichard Trieu O << "nu";
2654bdb136bSRichard Trieu return;
2664bdb136bSRichard Trieu case PPC::PRED_BIT_SET:
2674bdb136bSRichard Trieu case PPC::PRED_BIT_UNSET:
2684bdb136bSRichard Trieu llvm_unreachable("Invalid use of bit predicate code");
2694bdb136bSRichard Trieu }
2704bdb136bSRichard Trieu llvm_unreachable("Invalid predicate code");
2714bdb136bSRichard Trieu }
2724bdb136bSRichard Trieu
2734bdb136bSRichard Trieu if (StringRef(Modifier) == "pm") {
2744bdb136bSRichard Trieu switch ((PPC::Predicate)Code) {
2754bdb136bSRichard Trieu case PPC::PRED_LT:
2764bdb136bSRichard Trieu case PPC::PRED_LE:
2774bdb136bSRichard Trieu case PPC::PRED_EQ:
2784bdb136bSRichard Trieu case PPC::PRED_GE:
2794bdb136bSRichard Trieu case PPC::PRED_GT:
2804bdb136bSRichard Trieu case PPC::PRED_NE:
2814bdb136bSRichard Trieu case PPC::PRED_UN:
2824bdb136bSRichard Trieu case PPC::PRED_NU:
2834bdb136bSRichard Trieu return;
2844bdb136bSRichard Trieu case PPC::PRED_LT_MINUS:
2854bdb136bSRichard Trieu case PPC::PRED_LE_MINUS:
2864bdb136bSRichard Trieu case PPC::PRED_EQ_MINUS:
2874bdb136bSRichard Trieu case PPC::PRED_GE_MINUS:
2884bdb136bSRichard Trieu case PPC::PRED_GT_MINUS:
2894bdb136bSRichard Trieu case PPC::PRED_NE_MINUS:
2904bdb136bSRichard Trieu case PPC::PRED_UN_MINUS:
2914bdb136bSRichard Trieu case PPC::PRED_NU_MINUS:
2924bdb136bSRichard Trieu O << "-";
2934bdb136bSRichard Trieu return;
2944bdb136bSRichard Trieu case PPC::PRED_LT_PLUS:
2954bdb136bSRichard Trieu case PPC::PRED_LE_PLUS:
2964bdb136bSRichard Trieu case PPC::PRED_EQ_PLUS:
2974bdb136bSRichard Trieu case PPC::PRED_GE_PLUS:
2984bdb136bSRichard Trieu case PPC::PRED_GT_PLUS:
2994bdb136bSRichard Trieu case PPC::PRED_NE_PLUS:
3004bdb136bSRichard Trieu case PPC::PRED_UN_PLUS:
3014bdb136bSRichard Trieu case PPC::PRED_NU_PLUS:
3024bdb136bSRichard Trieu O << "+";
3034bdb136bSRichard Trieu return;
3044bdb136bSRichard Trieu case PPC::PRED_BIT_SET:
3054bdb136bSRichard Trieu case PPC::PRED_BIT_UNSET:
3064bdb136bSRichard Trieu llvm_unreachable("Invalid use of bit predicate code");
3074bdb136bSRichard Trieu }
3084bdb136bSRichard Trieu llvm_unreachable("Invalid predicate code");
3094bdb136bSRichard Trieu }
3104bdb136bSRichard Trieu
3114bdb136bSRichard Trieu assert(StringRef(Modifier) == "reg" &&
3124bdb136bSRichard Trieu "Need to specify 'cc', 'pm' or 'reg' as predicate op modifier!");
31393b54b7cSJinsong Ji printOperand(MI, OpNo + 1, STI, O);
3144bdb136bSRichard Trieu }
3154bdb136bSRichard Trieu
printATBitsAsHint(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3164bdb136bSRichard Trieu void PPCInstPrinter::printATBitsAsHint(const MCInst *MI, unsigned OpNo,
31793b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3184bdb136bSRichard Trieu raw_ostream &O) {
3194bdb136bSRichard Trieu unsigned Code = MI->getOperand(OpNo).getImm();
3204bdb136bSRichard Trieu if (Code == 2)
3214bdb136bSRichard Trieu O << "-";
3224bdb136bSRichard Trieu else if (Code == 3)
3234bdb136bSRichard Trieu O << "+";
3244bdb136bSRichard Trieu }
3254bdb136bSRichard Trieu
printU1ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3264bdb136bSRichard Trieu void PPCInstPrinter::printU1ImmOperand(const MCInst *MI, unsigned OpNo,
32793b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3284bdb136bSRichard Trieu raw_ostream &O) {
3294bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3304bdb136bSRichard Trieu assert(Value <= 1 && "Invalid u1imm argument!");
3314bdb136bSRichard Trieu O << (unsigned int)Value;
3324bdb136bSRichard Trieu }
3334bdb136bSRichard Trieu
printU2ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3344bdb136bSRichard Trieu void PPCInstPrinter::printU2ImmOperand(const MCInst *MI, unsigned OpNo,
33593b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3364bdb136bSRichard Trieu raw_ostream &O) {
3374bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3384bdb136bSRichard Trieu assert(Value <= 3 && "Invalid u2imm argument!");
3394bdb136bSRichard Trieu O << (unsigned int)Value;
3404bdb136bSRichard Trieu }
3414bdb136bSRichard Trieu
printU3ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3424bdb136bSRichard Trieu void PPCInstPrinter::printU3ImmOperand(const MCInst *MI, unsigned OpNo,
34393b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3444bdb136bSRichard Trieu raw_ostream &O) {
3454bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3464bdb136bSRichard Trieu assert(Value <= 8 && "Invalid u3imm argument!");
3474bdb136bSRichard Trieu O << (unsigned int)Value;
3484bdb136bSRichard Trieu }
3494bdb136bSRichard Trieu
printU4ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3504bdb136bSRichard Trieu void PPCInstPrinter::printU4ImmOperand(const MCInst *MI, unsigned OpNo,
35193b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3524bdb136bSRichard Trieu raw_ostream &O) {
3534bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3544bdb136bSRichard Trieu assert(Value <= 15 && "Invalid u4imm argument!");
3554bdb136bSRichard Trieu O << (unsigned int)Value;
3564bdb136bSRichard Trieu }
3574bdb136bSRichard Trieu
printS5ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3584bdb136bSRichard Trieu void PPCInstPrinter::printS5ImmOperand(const MCInst *MI, unsigned OpNo,
35993b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3604bdb136bSRichard Trieu raw_ostream &O) {
3614bdb136bSRichard Trieu int Value = MI->getOperand(OpNo).getImm();
3624bdb136bSRichard Trieu Value = SignExtend32<5>(Value);
3634bdb136bSRichard Trieu O << (int)Value;
3644bdb136bSRichard Trieu }
3654bdb136bSRichard Trieu
printImmZeroOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3665cee3401SVictor Huang void PPCInstPrinter::printImmZeroOperand(const MCInst *MI, unsigned OpNo,
36793b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3685cee3401SVictor Huang raw_ostream &O) {
3695cee3401SVictor Huang unsigned int Value = MI->getOperand(OpNo).getImm();
3705cee3401SVictor Huang assert(Value == 0 && "Operand must be zero");
3715cee3401SVictor Huang O << (unsigned int)Value;
3725cee3401SVictor Huang }
3735cee3401SVictor Huang
printU5ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3744bdb136bSRichard Trieu void PPCInstPrinter::printU5ImmOperand(const MCInst *MI, unsigned OpNo,
37593b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3764bdb136bSRichard Trieu raw_ostream &O) {
3774bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3784bdb136bSRichard Trieu assert(Value <= 31 && "Invalid u5imm argument!");
3794bdb136bSRichard Trieu O << (unsigned int)Value;
3804bdb136bSRichard Trieu }
3814bdb136bSRichard Trieu
printU6ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3824bdb136bSRichard Trieu void PPCInstPrinter::printU6ImmOperand(const MCInst *MI, unsigned OpNo,
38393b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3844bdb136bSRichard Trieu raw_ostream &O) {
3854bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3864bdb136bSRichard Trieu assert(Value <= 63 && "Invalid u6imm argument!");
3874bdb136bSRichard Trieu O << (unsigned int)Value;
3884bdb136bSRichard Trieu }
3894bdb136bSRichard Trieu
printU7ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)3904bdb136bSRichard Trieu void PPCInstPrinter::printU7ImmOperand(const MCInst *MI, unsigned OpNo,
39193b54b7cSJinsong Ji const MCSubtargetInfo &STI,
3924bdb136bSRichard Trieu raw_ostream &O) {
3934bdb136bSRichard Trieu unsigned int Value = MI->getOperand(OpNo).getImm();
3944bdb136bSRichard Trieu assert(Value <= 127 && "Invalid u7imm argument!");
3954bdb136bSRichard Trieu O << (unsigned int)Value;
3964bdb136bSRichard Trieu }
3974bdb136bSRichard Trieu
3984bdb136bSRichard Trieu // Operands of BUILD_VECTOR are signed and we use this to print operands
3994bdb136bSRichard Trieu // of XXSPLTIB which are unsigned. So we simply truncate to 8 bits and
4004bdb136bSRichard Trieu // print as unsigned.
printU8ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4014bdb136bSRichard Trieu void PPCInstPrinter::printU8ImmOperand(const MCInst *MI, unsigned OpNo,
40293b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4034bdb136bSRichard Trieu raw_ostream &O) {
4044bdb136bSRichard Trieu unsigned char Value = MI->getOperand(OpNo).getImm();
4054bdb136bSRichard Trieu O << (unsigned int)Value;
4064bdb136bSRichard Trieu }
4074bdb136bSRichard Trieu
printU10ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4084bdb136bSRichard Trieu void PPCInstPrinter::printU10ImmOperand(const MCInst *MI, unsigned OpNo,
40993b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4104bdb136bSRichard Trieu raw_ostream &O) {
4114bdb136bSRichard Trieu unsigned short Value = MI->getOperand(OpNo).getImm();
4124bdb136bSRichard Trieu assert(Value <= 1023 && "Invalid u10imm argument!");
4134bdb136bSRichard Trieu O << (unsigned short)Value;
4144bdb136bSRichard Trieu }
4154bdb136bSRichard Trieu
printU12ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4164bdb136bSRichard Trieu void PPCInstPrinter::printU12ImmOperand(const MCInst *MI, unsigned OpNo,
41793b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4184bdb136bSRichard Trieu raw_ostream &O) {
4194bdb136bSRichard Trieu unsigned short Value = MI->getOperand(OpNo).getImm();
4204bdb136bSRichard Trieu assert(Value <= 4095 && "Invalid u12imm argument!");
4214bdb136bSRichard Trieu O << (unsigned short)Value;
4224bdb136bSRichard Trieu }
4234bdb136bSRichard Trieu
printS16ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4244bdb136bSRichard Trieu void PPCInstPrinter::printS16ImmOperand(const MCInst *MI, unsigned OpNo,
42593b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4264bdb136bSRichard Trieu raw_ostream &O) {
4274bdb136bSRichard Trieu if (MI->getOperand(OpNo).isImm())
4284bdb136bSRichard Trieu O << (short)MI->getOperand(OpNo).getImm();
4294bdb136bSRichard Trieu else
43093b54b7cSJinsong Ji printOperand(MI, OpNo, STI, O);
4314bdb136bSRichard Trieu }
4324bdb136bSRichard Trieu
printS34ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4335cee3401SVictor Huang void PPCInstPrinter::printS34ImmOperand(const MCInst *MI, unsigned OpNo,
43493b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4355cee3401SVictor Huang raw_ostream &O) {
43675828ef6SStefan Pintilie if (MI->getOperand(OpNo).isImm()) {
4375cee3401SVictor Huang long long Value = MI->getOperand(OpNo).getImm();
4385cee3401SVictor Huang assert(isInt<34>(Value) && "Invalid s34imm argument!");
4395cee3401SVictor Huang O << (long long)Value;
4405cee3401SVictor Huang }
44175828ef6SStefan Pintilie else
44293b54b7cSJinsong Ji printOperand(MI, OpNo, STI, O);
44375828ef6SStefan Pintilie }
4445cee3401SVictor Huang
printU16ImmOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4454bdb136bSRichard Trieu void PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
44693b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4474bdb136bSRichard Trieu raw_ostream &O) {
4484bdb136bSRichard Trieu if (MI->getOperand(OpNo).isImm())
4494bdb136bSRichard Trieu O << (unsigned short)MI->getOperand(OpNo).getImm();
4504bdb136bSRichard Trieu else
45193b54b7cSJinsong Ji printOperand(MI, OpNo, STI, O);
4524bdb136bSRichard Trieu }
4534bdb136bSRichard Trieu
printBranchOperand(const MCInst * MI,uint64_t Address,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4543eef4740SFangrui Song void PPCInstPrinter::printBranchOperand(const MCInst *MI, uint64_t Address,
45593b54b7cSJinsong Ji unsigned OpNo,
45693b54b7cSJinsong Ji const MCSubtargetInfo &STI,
45793b54b7cSJinsong Ji raw_ostream &O) {
4584bdb136bSRichard Trieu if (!MI->getOperand(OpNo).isImm())
45993b54b7cSJinsong Ji return printOperand(MI, OpNo, STI, O);
4603eef4740SFangrui Song int32_t Imm = SignExtend32<32>((unsigned)MI->getOperand(OpNo).getImm() << 2);
461cbd3969eSFangrui Song if (PrintBranchImmAsAddress) {
4623eef4740SFangrui Song uint64_t Target = Address + Imm;
4633eef4740SFangrui Song if (!TT.isPPC64())
4643eef4740SFangrui Song Target &= 0xffffffff;
4653eef4740SFangrui Song O << formatHex(Target);
4663eef4740SFangrui Song } else {
4674bdb136bSRichard Trieu // Branches can take an immediate operand. This is used by the branch
4683eef4740SFangrui Song // selection pass to print, for example `.+8` (for ELF) or `$+8` (for AIX)
4693eef4740SFangrui Song // to express an eight byte displacement from the program counter.
4708b39341fSSean Fertile if (!TT.isOSAIX())
4714bdb136bSRichard Trieu O << ".";
4728b39341fSSean Fertile else
4738b39341fSSean Fertile O << "$";
4748b39341fSSean Fertile
4754bdb136bSRichard Trieu if (Imm >= 0)
4764bdb136bSRichard Trieu O << "+";
4774bdb136bSRichard Trieu O << Imm;
4784bdb136bSRichard Trieu }
4793eef4740SFangrui Song }
4804bdb136bSRichard Trieu
printAbsBranchOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4814bdb136bSRichard Trieu void PPCInstPrinter::printAbsBranchOperand(const MCInst *MI, unsigned OpNo,
48293b54b7cSJinsong Ji const MCSubtargetInfo &STI,
4834bdb136bSRichard Trieu raw_ostream &O) {
4844bdb136bSRichard Trieu if (!MI->getOperand(OpNo).isImm())
48593b54b7cSJinsong Ji return printOperand(MI, OpNo, STI, O);
4864bdb136bSRichard Trieu
4874bdb136bSRichard Trieu O << SignExtend32<32>((unsigned)MI->getOperand(OpNo).getImm() << 2);
4884bdb136bSRichard Trieu }
4894bdb136bSRichard Trieu
printcrbitm(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)4904bdb136bSRichard Trieu void PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo,
49193b54b7cSJinsong Ji const MCSubtargetInfo &STI, raw_ostream &O) {
4924bdb136bSRichard Trieu unsigned CCReg = MI->getOperand(OpNo).getReg();
4934bdb136bSRichard Trieu unsigned RegNo;
4944bdb136bSRichard Trieu switch (CCReg) {
4954bdb136bSRichard Trieu default: llvm_unreachable("Unknown CR register");
4964bdb136bSRichard Trieu case PPC::CR0: RegNo = 0; break;
4974bdb136bSRichard Trieu case PPC::CR1: RegNo = 1; break;
4984bdb136bSRichard Trieu case PPC::CR2: RegNo = 2; break;
4994bdb136bSRichard Trieu case PPC::CR3: RegNo = 3; break;
5004bdb136bSRichard Trieu case PPC::CR4: RegNo = 4; break;
5014bdb136bSRichard Trieu case PPC::CR5: RegNo = 5; break;
5024bdb136bSRichard Trieu case PPC::CR6: RegNo = 6; break;
5034bdb136bSRichard Trieu case PPC::CR7: RegNo = 7; break;
5044bdb136bSRichard Trieu }
5054bdb136bSRichard Trieu O << (0x80 >> RegNo);
5064bdb136bSRichard Trieu }
5074bdb136bSRichard Trieu
printMemRegImm(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)5084bdb136bSRichard Trieu void PPCInstPrinter::printMemRegImm(const MCInst *MI, unsigned OpNo,
50993b54b7cSJinsong Ji const MCSubtargetInfo &STI,
5104bdb136bSRichard Trieu raw_ostream &O) {
51193b54b7cSJinsong Ji printS16ImmOperand(MI, OpNo, STI, O);
5124bdb136bSRichard Trieu O << '(';
5134bdb136bSRichard Trieu if (MI->getOperand(OpNo+1).getReg() == PPC::R0)
5144bdb136bSRichard Trieu O << "0";
5154bdb136bSRichard Trieu else
51693b54b7cSJinsong Ji printOperand(MI, OpNo + 1, STI, O);
5174bdb136bSRichard Trieu O << ')';
5184bdb136bSRichard Trieu }
5194bdb136bSRichard Trieu
printMemRegImmHash(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)520f28cb01bSStefan Pintilie void PPCInstPrinter::printMemRegImmHash(const MCInst *MI, unsigned OpNo,
521f28cb01bSStefan Pintilie const MCSubtargetInfo &STI,
522f28cb01bSStefan Pintilie raw_ostream &O) {
523f28cb01bSStefan Pintilie O << MI->getOperand(OpNo).getImm();
524f28cb01bSStefan Pintilie O << '(';
525f28cb01bSStefan Pintilie printOperand(MI, OpNo + 1, STI, O);
526f28cb01bSStefan Pintilie O << ')';
527f28cb01bSStefan Pintilie }
528f28cb01bSStefan Pintilie
printMemRegImm34PCRel(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)5294b414d9aSVictor Huang void PPCInstPrinter::printMemRegImm34PCRel(const MCInst *MI, unsigned OpNo,
53093b54b7cSJinsong Ji const MCSubtargetInfo &STI,
5314b414d9aSVictor Huang raw_ostream &O) {
53293b54b7cSJinsong Ji printS34ImmOperand(MI, OpNo, STI, O);
5334b414d9aSVictor Huang O << '(';
53493b54b7cSJinsong Ji printImmZeroOperand(MI, OpNo + 1, STI, O);
5354b414d9aSVictor Huang O << ')';
5364b414d9aSVictor Huang }
5374b414d9aSVictor Huang
printMemRegImm34(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)5384b414d9aSVictor Huang void PPCInstPrinter::printMemRegImm34(const MCInst *MI, unsigned OpNo,
53993b54b7cSJinsong Ji const MCSubtargetInfo &STI,
5404b414d9aSVictor Huang raw_ostream &O) {
54193b54b7cSJinsong Ji printS34ImmOperand(MI, OpNo, STI, O);
5424b414d9aSVictor Huang O << '(';
54393b54b7cSJinsong Ji printOperand(MI, OpNo + 1, STI, O);
5444b414d9aSVictor Huang O << ')';
5454b414d9aSVictor Huang }
5464b414d9aSVictor Huang
printMemRegReg(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)5474bdb136bSRichard Trieu void PPCInstPrinter::printMemRegReg(const MCInst *MI, unsigned OpNo,
54893b54b7cSJinsong Ji const MCSubtargetInfo &STI,
5494bdb136bSRichard Trieu raw_ostream &O) {
5504bdb136bSRichard Trieu // When used as the base register, r0 reads constant zero rather than
5514bdb136bSRichard Trieu // the value contained in the register. For this reason, the darwin
5524bdb136bSRichard Trieu // assembler requires that we print r0 as 0 (no r) when used as the base.
5534bdb136bSRichard Trieu if (MI->getOperand(OpNo).getReg() == PPC::R0)
5544bdb136bSRichard Trieu O << "0";
5554bdb136bSRichard Trieu else
55693b54b7cSJinsong Ji printOperand(MI, OpNo, STI, O);
5574bdb136bSRichard Trieu O << ", ";
55893b54b7cSJinsong Ji printOperand(MI, OpNo + 1, STI, O);
5594bdb136bSRichard Trieu }
5604bdb136bSRichard Trieu
printTLSCall(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)5614bdb136bSRichard Trieu void PPCInstPrinter::printTLSCall(const MCInst *MI, unsigned OpNo,
56293b54b7cSJinsong Ji const MCSubtargetInfo &STI, raw_ostream &O) {
5634bdb136bSRichard Trieu // On PPC64, VariantKind is VK_None, but on PPC32, it's VK_PLT, and it must
5644bdb136bSRichard Trieu // come at the _end_ of the expression.
5654bdb136bSRichard Trieu const MCOperand &Op = MI->getOperand(OpNo);
5664bdb136bSRichard Trieu const MCSymbolRefExpr *RefExp = nullptr;
5674bdb136bSRichard Trieu const MCConstantExpr *ConstExp = nullptr;
5684bdb136bSRichard Trieu if (const MCBinaryExpr *BinExpr = dyn_cast<MCBinaryExpr>(Op.getExpr())) {
5694bdb136bSRichard Trieu RefExp = cast<MCSymbolRefExpr>(BinExpr->getLHS());
5704bdb136bSRichard Trieu ConstExp = cast<MCConstantExpr>(BinExpr->getRHS());
5714bdb136bSRichard Trieu } else
5724bdb136bSRichard Trieu RefExp = cast<MCSymbolRefExpr>(Op.getExpr());
5734bdb136bSRichard Trieu
5744bdb136bSRichard Trieu O << RefExp->getSymbol().getName();
575b74b80bbSKamau Bridgeman // The variant kind VK_PPC_NOTOC needs to be handled as a special case
576b74b80bbSKamau Bridgeman // because we do not want the assembly to print out the @notoc at the
577b74b80bbSKamau Bridgeman // end like __tls_get_addr(x@tlsgd)@notoc. Instead we want it to look
578b74b80bbSKamau Bridgeman // like __tls_get_addr@notoc(x@tlsgd).
579b74b80bbSKamau Bridgeman if (RefExp->getKind() == MCSymbolRefExpr::VK_PPC_NOTOC)
580b74b80bbSKamau Bridgeman O << '@' << MCSymbolRefExpr::getVariantKindName(RefExp->getKind());
5814bdb136bSRichard Trieu O << '(';
58293b54b7cSJinsong Ji printOperand(MI, OpNo + 1, STI, O);
5834bdb136bSRichard Trieu O << ')';
584b74b80bbSKamau Bridgeman if (RefExp->getKind() != MCSymbolRefExpr::VK_None &&
585b74b80bbSKamau Bridgeman RefExp->getKind() != MCSymbolRefExpr::VK_PPC_NOTOC)
5864bdb136bSRichard Trieu O << '@' << MCSymbolRefExpr::getVariantKindName(RefExp->getKind());
5874bdb136bSRichard Trieu if (ConstExp != nullptr)
5884bdb136bSRichard Trieu O << '+' << ConstExp->getValue();
5894bdb136bSRichard Trieu }
5904bdb136bSRichard Trieu
5914bdb136bSRichard Trieu /// showRegistersWithPercentPrefix - Check if this register name should be
5924bdb136bSRichard Trieu /// printed with a percentage symbol as prefix.
showRegistersWithPercentPrefix(const char * RegName) const5934bdb136bSRichard Trieu bool PPCInstPrinter::showRegistersWithPercentPrefix(const char *RegName) const {
59401a2508aSFangrui Song if (!FullRegNamesWithPercent || TT.getOS() == Triple::AIX)
5954bdb136bSRichard Trieu return false;
5964bdb136bSRichard Trieu
5974bdb136bSRichard Trieu switch (RegName[0]) {
5984bdb136bSRichard Trieu default:
5994bdb136bSRichard Trieu return false;
6004bdb136bSRichard Trieu case 'r':
6014bdb136bSRichard Trieu case 'f':
6024bdb136bSRichard Trieu case 'q':
6034bdb136bSRichard Trieu case 'v':
6044bdb136bSRichard Trieu case 'c':
6054bdb136bSRichard Trieu return true;
6064bdb136bSRichard Trieu }
6074bdb136bSRichard Trieu }
6084bdb136bSRichard Trieu
6094bdb136bSRichard Trieu /// getVerboseConditionalRegName - This method expands the condition register
6104bdb136bSRichard Trieu /// when requested explicitly or targetting Darwin.
getVerboseConditionRegName(unsigned RegNum,unsigned RegEncoding) const6114bdb136bSRichard Trieu const char *PPCInstPrinter::getVerboseConditionRegName(unsigned RegNum,
6124bdb136bSRichard Trieu unsigned RegEncoding)
6134bdb136bSRichard Trieu const {
61401a2508aSFangrui Song if (!FullRegNames)
6154bdb136bSRichard Trieu return nullptr;
6164bdb136bSRichard Trieu if (RegNum < PPC::CR0EQ || RegNum > PPC::CR7UN)
6174bdb136bSRichard Trieu return nullptr;
6184bdb136bSRichard Trieu const char *CRBits[] = {
6194bdb136bSRichard Trieu "lt", "gt", "eq", "un",
6204bdb136bSRichard Trieu "4*cr1+lt", "4*cr1+gt", "4*cr1+eq", "4*cr1+un",
6214bdb136bSRichard Trieu "4*cr2+lt", "4*cr2+gt", "4*cr2+eq", "4*cr2+un",
6224bdb136bSRichard Trieu "4*cr3+lt", "4*cr3+gt", "4*cr3+eq", "4*cr3+un",
6234bdb136bSRichard Trieu "4*cr4+lt", "4*cr4+gt", "4*cr4+eq", "4*cr4+un",
6244bdb136bSRichard Trieu "4*cr5+lt", "4*cr5+gt", "4*cr5+eq", "4*cr5+un",
6254bdb136bSRichard Trieu "4*cr6+lt", "4*cr6+gt", "4*cr6+eq", "4*cr6+un",
6264bdb136bSRichard Trieu "4*cr7+lt", "4*cr7+gt", "4*cr7+eq", "4*cr7+un"
6274bdb136bSRichard Trieu };
6284bdb136bSRichard Trieu return CRBits[RegEncoding];
6294bdb136bSRichard Trieu }
6304bdb136bSRichard Trieu
6314bdb136bSRichard Trieu // showRegistersWithPrefix - This method determines whether registers
6324bdb136bSRichard Trieu // should be number-only or include the prefix.
showRegistersWithPrefix() const6334bdb136bSRichard Trieu bool PPCInstPrinter::showRegistersWithPrefix() const {
63401a2508aSFangrui Song return FullRegNamesWithPercent || FullRegNames;
6354bdb136bSRichard Trieu }
6364bdb136bSRichard Trieu
printOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)6374bdb136bSRichard Trieu void PPCInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
63893b54b7cSJinsong Ji const MCSubtargetInfo &STI, raw_ostream &O) {
6394bdb136bSRichard Trieu const MCOperand &Op = MI->getOperand(OpNo);
6404bdb136bSRichard Trieu if (Op.isReg()) {
6414bdb136bSRichard Trieu unsigned Reg = Op.getReg();
6424bdb136bSRichard Trieu if (!ShowVSRNumsAsVR)
6434bdb136bSRichard Trieu Reg = PPCInstrInfo::getRegNumForOperand(MII.get(MI->getOpcode()),
6444bdb136bSRichard Trieu Reg, OpNo);
6454bdb136bSRichard Trieu
6464bdb136bSRichard Trieu const char *RegName;
6474bdb136bSRichard Trieu RegName = getVerboseConditionRegName(Reg, MRI.getEncodingValue(Reg));
6484bdb136bSRichard Trieu if (RegName == nullptr)
6494bdb136bSRichard Trieu RegName = getRegisterName(Reg);
6504bdb136bSRichard Trieu if (showRegistersWithPercentPrefix(RegName))
6514bdb136bSRichard Trieu O << "%";
6524bdb136bSRichard Trieu if (!showRegistersWithPrefix())
6534bdb136bSRichard Trieu RegName = PPCRegisterInfo::stripRegisterPrefix(RegName);
6544bdb136bSRichard Trieu
6554bdb136bSRichard Trieu O << RegName;
6564bdb136bSRichard Trieu return;
6574bdb136bSRichard Trieu }
6584bdb136bSRichard Trieu
6594bdb136bSRichard Trieu if (Op.isImm()) {
6604bdb136bSRichard Trieu O << Op.getImm();
6614bdb136bSRichard Trieu return;
6624bdb136bSRichard Trieu }
6634bdb136bSRichard Trieu
6644bdb136bSRichard Trieu assert(Op.isExpr() && "unknown operand kind in printOperand");
6654bdb136bSRichard Trieu Op.getExpr()->print(O, &MAI);
6664bdb136bSRichard Trieu }
667