diff options
Diffstat (limited to 'llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp index c8920fbb4b4c..7001de999a51 100644 --- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp +++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "CSKYInstPrinter.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" @@ -95,6 +96,107 @@ void CSKYInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, MO.getExpr()->print(O, &MAI); } +void CSKYInstPrinter::printDataSymbol(const MCInst *MI, unsigned OpNo, + const MCSubtargetInfo &STI, + raw_ostream &O) { + const MCOperand &MO = MI->getOperand(OpNo); + + O << "["; + if (MO.isImm()) + O << MO.getImm(); + else + MO.getExpr()->print(O, &MAI); + O << "]"; +} + +void CSKYInstPrinter::printConstpool(const MCInst *MI, uint64_t Address, + unsigned OpNo, const MCSubtargetInfo &STI, + raw_ostream &O) { + const MCOperand &MO = MI->getOperand(OpNo); + + if (MO.isImm()) { + if (PrintBranchImmAsAddress) { + uint64_t Target = Address + MO.getImm(); + Target &= 0xfffffffc; + O << formatHex(Target); + } else { + O << MO.getImm(); + } + return; + } + + assert(MO.isExpr() && "Unknown operand kind in printConstpool"); + + O << "["; + MO.getExpr()->print(O, &MAI); + O << "]"; +} + +void CSKYInstPrinter::printCSKYSymbolOperand(const MCInst *MI, uint64_t Address, + unsigned OpNo, + const MCSubtargetInfo &STI, + raw_ostream &O) { + const MCOperand &MO = MI->getOperand(OpNo); + if (!MO.isImm()) { + return printOperand(MI, OpNo, STI, O); + } + + if (PrintBranchImmAsAddress) { + uint64_t Target = Address + MO.getImm(); + Target &= 0xffffffff; + O << formatHex(Target); + } else { + O << MO.getImm(); + } +} + +void CSKYInstPrinter::printRegisterSeq(const MCInst *MI, unsigned OpNum, + const MCSubtargetInfo &STI, + raw_ostream &O) { + printRegName(O, MI->getOperand(OpNum).getReg()); + O << "-"; + printRegName(O, MI->getOperand(OpNum + 1).getReg()); +} + +void CSKYInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum, + const MCSubtargetInfo &STI, + raw_ostream &O) { + auto V = MI->getOperand(OpNum).getImm(); + ListSeparator LS; + + if (V & 0xf) { + O << LS; + printRegName(O, CSKY::R4); + auto Offset = (V & 0xf) - 1; + if (Offset) { + O << "-"; + printRegName(O, CSKY::R4 + Offset); + } + } + + if ((V >> 4) & 0x1) { + O << LS; + printRegName(O, CSKY::R15); + } + + if ((V >> 5) & 0x7) { + O << LS; + printRegName(O, CSKY::R16); + + auto Offset = ((V >> 5) & 0x7) - 1; + + if (Offset) { + O << "-"; + printRegName(O, CSKY::R16 + Offset); + } + } + + if ((V >> 8) & 0x1) { + O << LS; + printRegName(O, CSKY::R28); + } +} + const char *CSKYInstPrinter::getRegisterName(unsigned RegNo) { return getRegisterName(RegNo, ArchRegNames ? CSKY::NoRegAltName : CSKY::ABIRegAltName); |
