1 //===-- ARMInstPrinter.cpp - Convert ARM MCInst to assembly syntax --------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This class prints an ARM MCInst to a .s file.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "asm-printer"
15 #include "ARMInstPrinter.h"
16 #include "MCTargetDesc/ARMBaseInfo.h"
17 #include "MCTargetDesc/ARMAddressingModes.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCAsmInfo.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/MC/MCInstrInfo.h"
22 #include "llvm/MC/MCRegisterInfo.h"
23 #include "llvm/Support/raw_ostream.h"
26 #include "ARMGenAsmWriter.inc"
28 /// translateShiftImm - Convert shift immediate from 0-31 to 1-32 for printing.
30 /// getSORegOffset returns an integer from 0-31, representing '32' as 0.
31 static unsigned translateShiftImm(unsigned imm) {
32 // lsr #32 and asr #32 exist, but should be encoded as a 0.
33 assert((imm & ~0x1f) == 0 && "Invalid shift encoding");
40 /// Prints the shift value with an immediate value.
41 static void printRegImmShift(raw_ostream &O, ARM_AM::ShiftOpc ShOpc,
42 unsigned ShImm, bool UseMarkup) {
43 if (ShOpc == ARM_AM::no_shift || (ShOpc == ARM_AM::lsl && !ShImm))
47 assert (!(ShOpc == ARM_AM::ror && !ShImm) && "Cannot have ror #0");
48 O << getShiftOpcStr(ShOpc);
50 if (ShOpc != ARM_AM::rrx){
54 O << "#" << translateShiftImm(ShImm);
60 ARMInstPrinter::ARMInstPrinter(const MCAsmInfo &MAI,
61 const MCInstrInfo &MII,
62 const MCRegisterInfo &MRI,
63 const MCSubtargetInfo &STI) :
64 MCInstPrinter(MAI, MII, MRI) {
65 // Initialize the set of available features.
66 setAvailableFeatures(STI.getFeatureBits());
69 void ARMInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
72 OS << getRegisterName(RegNo);
77 void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
79 unsigned Opcode = MI->getOpcode();
81 // Check for HINT instructions w/ canonical names.
82 if (Opcode == ARM::HINT || Opcode == ARM::t2HINT) {
83 switch (MI->getOperand(0).getImm()) {
84 case 0: O << "\tnop"; break;
85 case 1: O << "\tyield"; break;
86 case 2: O << "\twfe"; break;
87 case 3: O << "\twfi"; break;
88 case 4: O << "\tsev"; break;
90 // Anything else should just print normally.
91 printInstruction(MI, O);
92 printAnnotation(O, Annot);
95 printPredicateOperand(MI, 1, O);
96 if (Opcode == ARM::t2HINT)
98 printAnnotation(O, Annot);
102 // Check for MOVs and print canonical forms, instead.
103 if (Opcode == ARM::MOVsr) {
104 // FIXME: Thumb variants?
105 const MCOperand &Dst = MI->getOperand(0);
106 const MCOperand &MO1 = MI->getOperand(1);
107 const MCOperand &MO2 = MI->getOperand(2);
108 const MCOperand &MO3 = MI->getOperand(3);
110 O << '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3.getImm()));
111 printSBitModifierOperand(MI, 6, O);
112 printPredicateOperand(MI, 4, O);
115 printRegName(O, Dst.getReg());
117 printRegName(O, MO1.getReg());
120 printRegName(O, MO2.getReg());
121 assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
122 printAnnotation(O, Annot);
126 if (Opcode == ARM::MOVsi) {
127 // FIXME: Thumb variants?
128 const MCOperand &Dst = MI->getOperand(0);
129 const MCOperand &MO1 = MI->getOperand(1);
130 const MCOperand &MO2 = MI->getOperand(2);
132 O << '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO2.getImm()));
133 printSBitModifierOperand(MI, 5, O);
134 printPredicateOperand(MI, 3, O);
137 printRegName(O, Dst.getReg());
139 printRegName(O, MO1.getReg());
141 if (ARM_AM::getSORegShOp(MO2.getImm()) == ARM_AM::rrx) {
142 printAnnotation(O, Annot);
149 O << "#" << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm()));
152 printAnnotation(O, Annot);
158 if ((Opcode == ARM::STMDB_UPD || Opcode == ARM::t2STMDB_UPD) &&
159 MI->getOperand(0).getReg() == ARM::SP &&
160 MI->getNumOperands() > 5) {
161 // Should only print PUSH if there are at least two registers in the list.
163 printPredicateOperand(MI, 2, O);
164 if (Opcode == ARM::t2STMDB_UPD)
167 printRegisterList(MI, 4, O);
168 printAnnotation(O, Annot);
171 if (Opcode == ARM::STR_PRE_IMM && MI->getOperand(2).getReg() == ARM::SP &&
172 MI->getOperand(3).getImm() == -4) {
174 printPredicateOperand(MI, 4, O);
176 printRegName(O, MI->getOperand(1).getReg());
178 printAnnotation(O, Annot);
183 if ((Opcode == ARM::LDMIA_UPD || Opcode == ARM::t2LDMIA_UPD) &&
184 MI->getOperand(0).getReg() == ARM::SP &&
185 MI->getNumOperands() > 5) {
186 // Should only print POP if there are at least two registers in the list.
188 printPredicateOperand(MI, 2, O);
189 if (Opcode == ARM::t2LDMIA_UPD)
192 printRegisterList(MI, 4, O);
193 printAnnotation(O, Annot);
196 if (Opcode == ARM::LDR_POST_IMM && MI->getOperand(2).getReg() == ARM::SP &&
197 MI->getOperand(4).getImm() == 4) {
199 printPredicateOperand(MI, 5, O);
201 printRegName(O, MI->getOperand(0).getReg());
203 printAnnotation(O, Annot);
209 if ((Opcode == ARM::VSTMSDB_UPD || Opcode == ARM::VSTMDDB_UPD) &&
210 MI->getOperand(0).getReg() == ARM::SP) {
211 O << '\t' << "vpush";
212 printPredicateOperand(MI, 2, O);
214 printRegisterList(MI, 4, O);
215 printAnnotation(O, Annot);
220 if ((Opcode == ARM::VLDMSIA_UPD || Opcode == ARM::VLDMDIA_UPD) &&
221 MI->getOperand(0).getReg() == ARM::SP) {
223 printPredicateOperand(MI, 2, O);
225 printRegisterList(MI, 4, O);
226 printAnnotation(O, Annot);
230 if (Opcode == ARM::tLDMIA) {
231 bool Writeback = true;
232 unsigned BaseReg = MI->getOperand(0).getReg();
233 for (unsigned i = 3; i < MI->getNumOperands(); ++i) {
234 if (MI->getOperand(i).getReg() == BaseReg)
240 printPredicateOperand(MI, 1, O);
242 printRegName(O, BaseReg);
243 if (Writeback) O << "!";
245 printRegisterList(MI, 3, O);
246 printAnnotation(O, Annot);
251 if (Opcode == ARM::tMOVr && MI->getOperand(0).getReg() == ARM::R8 &&
252 MI->getOperand(1).getReg() == ARM::R8) {
254 printPredicateOperand(MI, 2, O);
255 printAnnotation(O, Annot);
259 printInstruction(MI, O);
260 printAnnotation(O, Annot);
263 void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
265 const MCOperand &Op = MI->getOperand(OpNo);
267 unsigned Reg = Op.getReg();
268 printRegName(O, Reg);
269 } else if (Op.isImm()) {
272 O << '#' << Op.getImm();
276 assert(Op.isExpr() && "unknown operand kind in printOperand");
277 // If a symbolic branch target was added as a constant expression then print
278 // that address in hex. And only print 32 unsigned bits for the address.
279 const MCConstantExpr *BranchTarget = dyn_cast<MCConstantExpr>(Op.getExpr());
281 if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) {
283 O.write_hex((uint32_t)Address);
286 // Otherwise, just print the expression.
292 void ARMInstPrinter::printT2LdrLabelOperand(const MCInst *MI, unsigned OpNum,
294 const MCOperand &MO1 = MI->getOperand(OpNum);
297 else if (MO1.isImm()) {
312 llvm_unreachable("Unknown LDR label operand?");
315 // so_reg is a 4-operand unit corresponding to register forms of the A5.1
316 // "Addressing Mode 1 - Data-processing operands" forms. This includes:
318 // REG REG 0,SH_OPC - e.g. R5, ROR R3
319 // REG 0 IMM,SH_OPC - e.g. R5, LSL #3
320 void ARMInstPrinter::printSORegRegOperand(const MCInst *MI, unsigned OpNum,
322 const MCOperand &MO1 = MI->getOperand(OpNum);
323 const MCOperand &MO2 = MI->getOperand(OpNum+1);
324 const MCOperand &MO3 = MI->getOperand(OpNum+2);
326 printRegName(O, MO1.getReg());
328 // Print the shift opc.
329 ARM_AM::ShiftOpc ShOpc = ARM_AM::getSORegShOp(MO3.getImm());
330 O << ", " << ARM_AM::getShiftOpcStr(ShOpc);
331 if (ShOpc == ARM_AM::rrx)
335 printRegName(O, MO2.getReg());
336 assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
339 void ARMInstPrinter::printSORegImmOperand(const MCInst *MI, unsigned OpNum,
341 const MCOperand &MO1 = MI->getOperand(OpNum);
342 const MCOperand &MO2 = MI->getOperand(OpNum+1);
344 printRegName(O, MO1.getReg());
346 // Print the shift opc.
347 printRegImmShift(O, ARM_AM::getSORegShOp(MO2.getImm()),
348 ARM_AM::getSORegOffset(MO2.getImm()), UseMarkup);
352 //===--------------------------------------------------------------------===//
353 // Addressing Mode #2
354 //===--------------------------------------------------------------------===//
356 void ARMInstPrinter::printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
358 const MCOperand &MO1 = MI->getOperand(Op);
359 const MCOperand &MO2 = MI->getOperand(Op+1);
360 const MCOperand &MO3 = MI->getOperand(Op+2);
365 printRegName(O, MO1.getReg());
368 if (ARM_AM::getAM2Offset(MO3.getImm())) { // Don't print +0.
373 O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()));
374 O << ARM_AM::getAM2Offset(MO3.getImm());
385 O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()));
386 printRegName(O, MO2.getReg());
388 printRegImmShift(O, ARM_AM::getAM2ShiftOpc(MO3.getImm()),
389 ARM_AM::getAM2Offset(MO3.getImm()), UseMarkup);
395 void ARMInstPrinter::printAddrModeTBB(const MCInst *MI, unsigned Op,
397 const MCOperand &MO1 = MI->getOperand(Op);
398 const MCOperand &MO2 = MI->getOperand(Op+1);
402 printRegName(O, MO1.getReg());
404 printRegName(O, MO2.getReg());
410 void ARMInstPrinter::printAddrModeTBH(const MCInst *MI, unsigned Op,
412 const MCOperand &MO1 = MI->getOperand(Op);
413 const MCOperand &MO2 = MI->getOperand(Op+1);
417 printRegName(O, MO1.getReg());
419 printRegName(O, MO2.getReg());
431 void ARMInstPrinter::printAddrMode2Operand(const MCInst *MI, unsigned Op,
433 const MCOperand &MO1 = MI->getOperand(Op);
435 if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
436 printOperand(MI, Op, O);
441 const MCOperand &MO3 = MI->getOperand(Op+2);
442 unsigned IdxMode = ARM_AM::getAM2IdxMode(MO3.getImm());
443 assert(IdxMode != ARMII::IndexModePost &&
444 "Should be pre or offset index op");
447 printAM2PreOrOffsetIndexOp(MI, Op, O);
450 void ARMInstPrinter::printAddrMode2OffsetOperand(const MCInst *MI,
453 const MCOperand &MO1 = MI->getOperand(OpNum);
454 const MCOperand &MO2 = MI->getOperand(OpNum+1);
457 unsigned ImmOffs = ARM_AM::getAM2Offset(MO2.getImm());
461 << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()))
468 O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()));
469 printRegName(O, MO1.getReg());
471 printRegImmShift(O, ARM_AM::getAM2ShiftOpc(MO2.getImm()),
472 ARM_AM::getAM2Offset(MO2.getImm()), UseMarkup);
475 //===--------------------------------------------------------------------===//
476 // Addressing Mode #3
477 //===--------------------------------------------------------------------===//
479 void ARMInstPrinter::printAM3PostIndexOp(const MCInst *MI, unsigned Op,
481 const MCOperand &MO1 = MI->getOperand(Op);
482 const MCOperand &MO2 = MI->getOperand(Op+1);
483 const MCOperand &MO3 = MI->getOperand(Op+2);
488 printRegName(O, MO1.getReg());
494 O << (char)ARM_AM::getAM3Op(MO3.getImm());
495 printRegName(O, MO2.getReg());
499 unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
503 << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()))
509 void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
511 const MCOperand &MO1 = MI->getOperand(Op);
512 const MCOperand &MO2 = MI->getOperand(Op+1);
513 const MCOperand &MO3 = MI->getOperand(Op+2);
518 printRegName(O, MO1.getReg());
522 O << getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()));
523 printRegName(O, MO2.getReg());
530 //If the op is sub we have to print the immediate even if it is 0
531 unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
532 ARM_AM::AddrOpc op = ARM_AM::getAM3Op(MO3.getImm());
534 if (ImmOffs || (op == ARM_AM::sub)) {
539 << ARM_AM::getAddrOpcStr(op)
549 void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
551 const MCOperand &MO1 = MI->getOperand(Op);
552 if (!MO1.isReg()) { // For label symbolic references.
553 printOperand(MI, Op, O);
557 const MCOperand &MO3 = MI->getOperand(Op+2);
558 unsigned IdxMode = ARM_AM::getAM3IdxMode(MO3.getImm());
560 if (IdxMode == ARMII::IndexModePost) {
561 printAM3PostIndexOp(MI, Op, O);
564 printAM3PreOrOffsetIndexOp(MI, Op, O);
567 void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst *MI,
570 const MCOperand &MO1 = MI->getOperand(OpNum);
571 const MCOperand &MO2 = MI->getOperand(OpNum+1);
574 O << getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()));
575 printRegName(O, MO1.getReg());
579 unsigned ImmOffs = ARM_AM::getAM3Offset(MO2.getImm());
583 << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()))
589 void ARMInstPrinter::printPostIdxImm8Operand(const MCInst *MI,
592 const MCOperand &MO = MI->getOperand(OpNum);
593 unsigned Imm = MO.getImm();
596 O << '#' << ((Imm & 256) ? "" : "-") << (Imm & 0xff);
601 void ARMInstPrinter::printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
603 const MCOperand &MO1 = MI->getOperand(OpNum);
604 const MCOperand &MO2 = MI->getOperand(OpNum+1);
606 O << (MO2.getImm() ? "" : "-");
607 printRegName(O, MO1.getReg());
610 void ARMInstPrinter::printPostIdxImm8s4Operand(const MCInst *MI,
613 const MCOperand &MO = MI->getOperand(OpNum);
614 unsigned Imm = MO.getImm();
617 O << '#' << ((Imm & 256) ? "" : "-") << ((Imm & 0xff) << 2);
623 void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
625 ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MI->getOperand(OpNum)
627 O << ARM_AM::getAMSubModeStr(Mode);
630 void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
632 const MCOperand &MO1 = MI->getOperand(OpNum);
633 const MCOperand &MO2 = MI->getOperand(OpNum+1);
635 if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
636 printOperand(MI, OpNum, O);
643 printRegName(O, MO1.getReg());
645 unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm());
646 unsigned Op = ARM_AM::getAM5Op(MO2.getImm());
647 if (ImmOffs || Op == ARM_AM::sub) {
652 << ARM_AM::getAddrOpcStr(ARM_AM::getAM5Op(MO2.getImm()))
662 void ARMInstPrinter::printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
664 const MCOperand &MO1 = MI->getOperand(OpNum);
665 const MCOperand &MO2 = MI->getOperand(OpNum+1);
670 printRegName(O, MO1.getReg());
672 // FIXME: Both darwin as and GNU as violate ARM docs here.
673 O << ", :" << (MO2.getImm() << 3);
680 void ARMInstPrinter::printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
682 const MCOperand &MO1 = MI->getOperand(OpNum);
686 printRegName(O, MO1.getReg());
692 void ARMInstPrinter::printAddrMode6OffsetOperand(const MCInst *MI,
695 const MCOperand &MO = MI->getOperand(OpNum);
696 if (MO.getReg() == 0)
700 printRegName(O, MO.getReg());
704 void ARMInstPrinter::printBitfieldInvMaskImmOperand(const MCInst *MI,
707 const MCOperand &MO = MI->getOperand(OpNum);
708 uint32_t v = ~MO.getImm();
709 int32_t lsb = CountTrailingZeros_32(v);
710 int32_t width = (32 - CountLeadingZeros_32 (v)) - lsb;
711 assert(MO.isImm() && "Not a valid bf_inv_mask_imm value!");
725 void ARMInstPrinter::printMemBOption(const MCInst *MI, unsigned OpNum,
727 unsigned val = MI->getOperand(OpNum).getImm();
728 O << ARM_MB::MemBOptToString(val);
731 void ARMInstPrinter::printShiftImmOperand(const MCInst *MI, unsigned OpNum,
733 unsigned ShiftOp = MI->getOperand(OpNum).getImm();
734 bool isASR = (ShiftOp & (1 << 5)) != 0;
735 unsigned Amt = ShiftOp & 0x1f;
740 O << "#" << (Amt == 0 ? 32 : Amt);
754 void ARMInstPrinter::printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
756 unsigned Imm = MI->getOperand(OpNum).getImm();
759 assert(Imm > 0 && Imm < 32 && "Invalid PKH shift immediate value!");
768 void ARMInstPrinter::printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
770 unsigned Imm = MI->getOperand(OpNum).getImm();
771 // A shift amount of 32 is encoded as 0.
774 assert(Imm > 0 && Imm <= 32 && "Invalid PKH shift immediate value!");
783 void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum,
786 for (unsigned i = OpNum, e = MI->getNumOperands(); i != e; ++i) {
787 if (i != OpNum) O << ", ";
788 printRegName(O, MI->getOperand(i).getReg());
793 void ARMInstPrinter::printSetendOperand(const MCInst *MI, unsigned OpNum,
795 const MCOperand &Op = MI->getOperand(OpNum);
802 void ARMInstPrinter::printCPSIMod(const MCInst *MI, unsigned OpNum,
804 const MCOperand &Op = MI->getOperand(OpNum);
805 O << ARM_PROC::IModToString(Op.getImm());
808 void ARMInstPrinter::printCPSIFlag(const MCInst *MI, unsigned OpNum,
810 const MCOperand &Op = MI->getOperand(OpNum);
811 unsigned IFlags = Op.getImm();
812 for (int i=2; i >= 0; --i)
813 if (IFlags & (1 << i))
814 O << ARM_PROC::IFlagsToString(1 << i);
820 void ARMInstPrinter::printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
822 const MCOperand &Op = MI->getOperand(OpNum);
823 unsigned SpecRegRBit = Op.getImm() >> 4;
824 unsigned Mask = Op.getImm() & 0xf;
826 if (getAvailableFeatures() & ARM::FeatureMClass) {
827 unsigned SYSm = Op.getImm();
828 unsigned Opcode = MI->getOpcode();
829 // For reads of the special registers ignore the "mask encoding" bits
830 // which are only for writes.
831 if (Opcode == ARM::t2MRS_M)
834 default: llvm_unreachable("Unexpected mask value!");
836 case 0x800: O << "apsr"; return; // with _nzcvq bits is an alias for aspr
837 case 0x400: O << "apsr_g"; return;
838 case 0xc00: O << "apsr_nzcvqg"; return;
840 case 0x801: O << "iapsr"; return; // with _nzcvq bits is an alias for iapsr
841 case 0x401: O << "iapsr_g"; return;
842 case 0xc01: O << "iapsr_nzcvqg"; return;
844 case 0x802: O << "eapsr"; return; // with _nzcvq bits is an alias for eapsr
845 case 0x402: O << "eapsr_g"; return;
846 case 0xc02: O << "eapsr_nzcvqg"; return;
848 case 0x803: O << "xpsr"; return; // with _nzcvq bits is an alias for xpsr
849 case 0x403: O << "xpsr_g"; return;
850 case 0xc03: O << "xpsr_nzcvqg"; return;
852 case 0x805: O << "ipsr"; return;
854 case 0x806: O << "epsr"; return;
856 case 0x807: O << "iepsr"; return;
858 case 0x808: O << "msp"; return;
860 case 0x809: O << "psp"; return;
862 case 0x810: O << "primask"; return;
864 case 0x811: O << "basepri"; return;
866 case 0x812: O << "basepri_max"; return;
868 case 0x813: O << "faultmask"; return;
870 case 0x814: O << "control"; return;
874 // As special cases, CPSR_f, CPSR_s and CPSR_fs prefer printing as
875 // APSR_nzcvq, APSR_g and APSRnzcvqg, respectively.
876 if (!SpecRegRBit && (Mask == 8 || Mask == 4 || Mask == 12)) {
879 default: llvm_unreachable("Unexpected mask value!");
880 case 4: O << "g"; return;
881 case 8: O << "nzcvq"; return;
882 case 12: O << "nzcvqg"; return;
893 if (Mask & 8) O << 'f';
894 if (Mask & 4) O << 's';
895 if (Mask & 2) O << 'x';
896 if (Mask & 1) O << 'c';
900 void ARMInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNum,
902 ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
903 // Handle the undefined 15 CC value here for printing so we don't abort().
904 if ((unsigned)CC == 15)
906 else if (CC != ARMCC::AL)
907 O << ARMCondCodeToString(CC);
910 void ARMInstPrinter::printMandatoryPredicateOperand(const MCInst *MI,
913 ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
914 O << ARMCondCodeToString(CC);
917 void ARMInstPrinter::printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
919 if (MI->getOperand(OpNum).getReg()) {
920 assert(MI->getOperand(OpNum).getReg() == ARM::CPSR &&
921 "Expect ARM CPSR register!");
926 void ARMInstPrinter::printNoHashImmediate(const MCInst *MI, unsigned OpNum,
928 O << MI->getOperand(OpNum).getImm();
931 void ARMInstPrinter::printPImmediate(const MCInst *MI, unsigned OpNum,
933 O << "p" << MI->getOperand(OpNum).getImm();
936 void ARMInstPrinter::printCImmediate(const MCInst *MI, unsigned OpNum,
938 O << "c" << MI->getOperand(OpNum).getImm();
941 void ARMInstPrinter::printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
943 O << "{" << MI->getOperand(OpNum).getImm() << "}";
946 void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum,
948 llvm_unreachable("Unhandled PC-relative pseudo-instruction!");
951 void ARMInstPrinter::printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
953 const MCOperand &MO = MI->getOperand(OpNum);
960 int32_t OffImm = (int32_t)MO.getImm();
964 if (OffImm == INT32_MIN)
967 O << "#-" << -OffImm;
974 void ARMInstPrinter::printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
978 O << "#" << MI->getOperand(OpNum).getImm() * 4;
983 void ARMInstPrinter::printThumbSRImm(const MCInst *MI, unsigned OpNum,
985 unsigned Imm = MI->getOperand(OpNum).getImm();
988 O << "#" << (Imm == 0 ? 32 : Imm);
993 void ARMInstPrinter::printThumbITMask(const MCInst *MI, unsigned OpNum,
995 // (3 - the number of trailing zeros) is the number of then / else.
996 unsigned Mask = MI->getOperand(OpNum).getImm();
997 unsigned Firstcond = MI->getOperand(OpNum-1).getImm();
998 unsigned CondBit0 = Firstcond & 1;
999 unsigned NumTZ = CountTrailingZeros_32(Mask);
1000 assert(NumTZ <= 3 && "Invalid IT mask!");
1001 for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) {
1002 bool T = ((Mask >> Pos) & 1) == CondBit0;
1010 void ARMInstPrinter::printThumbAddrModeRROperand(const MCInst *MI, unsigned Op,
1012 const MCOperand &MO1 = MI->getOperand(Op);
1013 const MCOperand &MO2 = MI->getOperand(Op + 1);
1015 if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
1016 printOperand(MI, Op, O);
1023 printRegName(O, MO1.getReg());
1024 if (unsigned RegNum = MO2.getReg()) {
1026 printRegName(O, RegNum);
1033 void ARMInstPrinter::printThumbAddrModeImm5SOperand(const MCInst *MI,
1037 const MCOperand &MO1 = MI->getOperand(Op);
1038 const MCOperand &MO2 = MI->getOperand(Op + 1);
1040 if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
1041 printOperand(MI, Op, O);
1048 printRegName(O, MO1.getReg());
1049 if (unsigned ImmOffs = MO2.getImm()) {
1053 O << "#" << ImmOffs * Scale;
1062 void ARMInstPrinter::printThumbAddrModeImm5S1Operand(const MCInst *MI,
1065 printThumbAddrModeImm5SOperand(MI, Op, O, 1);
1068 void ARMInstPrinter::printThumbAddrModeImm5S2Operand(const MCInst *MI,
1071 printThumbAddrModeImm5SOperand(MI, Op, O, 2);
1074 void ARMInstPrinter::printThumbAddrModeImm5S4Operand(const MCInst *MI,
1077 printThumbAddrModeImm5SOperand(MI, Op, O, 4);
1080 void ARMInstPrinter::printThumbAddrModeSPOperand(const MCInst *MI, unsigned Op,
1082 printThumbAddrModeImm5SOperand(MI, Op, O, 4);
1085 // Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2
1086 // register with shift forms.
1087 // REG 0 0 - e.g. R5
1088 // REG IMM, SH_OPC - e.g. R5, LSL #3
1089 void ARMInstPrinter::printT2SOOperand(const MCInst *MI, unsigned OpNum,
1091 const MCOperand &MO1 = MI->getOperand(OpNum);
1092 const MCOperand &MO2 = MI->getOperand(OpNum+1);
1094 unsigned Reg = MO1.getReg();
1095 printRegName(O, Reg);
1097 // Print the shift opc.
1098 assert(MO2.isImm() && "Not a valid t2_so_reg value!");
1099 printRegImmShift(O, ARM_AM::getSORegShOp(MO2.getImm()),
1100 ARM_AM::getSORegOffset(MO2.getImm()), UseMarkup);
1103 void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
1105 const MCOperand &MO1 = MI->getOperand(OpNum);
1106 const MCOperand &MO2 = MI->getOperand(OpNum+1);
1108 if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
1109 printOperand(MI, OpNum, O);
1116 printRegName(O, MO1.getReg());
1118 int32_t OffImm = (int32_t)MO2.getImm();
1119 bool isSub = OffImm < 0;
1120 // Special value for #-0. All others are normal.
1121 if (OffImm == INT32_MIN)
1127 O << "#-" << -OffImm;
1131 else if (OffImm > 0) {
1144 void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst *MI,
1147 const MCOperand &MO1 = MI->getOperand(OpNum);
1148 const MCOperand &MO2 = MI->getOperand(OpNum+1);
1153 printRegName(O, MO1.getReg());
1155 int32_t OffImm = (int32_t)MO2.getImm();
1159 if (OffImm != 0 && UseMarkup)
1161 if (OffImm == INT32_MIN)
1163 else if (OffImm < 0)
1164 O << "#-" << -OffImm;
1165 else if (OffImm > 0)
1167 if (OffImm != 0 && UseMarkup)
1174 void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst *MI,
1177 const MCOperand &MO1 = MI->getOperand(OpNum);
1178 const MCOperand &MO2 = MI->getOperand(OpNum+1);
1180 if (!MO1.isReg()) { // For label symbolic references.
1181 printOperand(MI, OpNum, O);
1188 printRegName(O, MO1.getReg());
1190 int32_t OffImm = (int32_t)MO2.getImm();
1192 assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
1197 if (OffImm != 0 && UseMarkup)
1199 if (OffImm == INT32_MIN)
1201 else if (OffImm < 0)
1202 O << "#-" << -OffImm;
1203 else if (OffImm > 0)
1205 if (OffImm != 0 && UseMarkup)
1212 void ARMInstPrinter::printT2AddrModeImm0_1020s4Operand(const MCInst *MI,
1215 const MCOperand &MO1 = MI->getOperand(OpNum);
1216 const MCOperand &MO2 = MI->getOperand(OpNum+1);
1221 printRegName(O, MO1.getReg());
1226 O << "#" << MO2.getImm() * 4;
1235 void ARMInstPrinter::printT2AddrModeImm8OffsetOperand(const MCInst *MI,
1238 const MCOperand &MO1 = MI->getOperand(OpNum);
1239 int32_t OffImm = (int32_t)MO1.getImm();
1244 O << "#-" << -OffImm;
1251 void ARMInstPrinter::printT2AddrModeImm8s4OffsetOperand(const MCInst *MI,
1254 const MCOperand &MO1 = MI->getOperand(OpNum);
1255 int32_t OffImm = (int32_t)MO1.getImm();
1257 assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
1262 if (OffImm != 0 && UseMarkup)
1264 if (OffImm == INT32_MIN)
1266 else if (OffImm < 0)
1267 O << "#-" << -OffImm;
1268 else if (OffImm > 0)
1270 if (OffImm != 0 && UseMarkup)
1274 void ARMInstPrinter::printT2AddrModeSoRegOperand(const MCInst *MI,
1277 const MCOperand &MO1 = MI->getOperand(OpNum);
1278 const MCOperand &MO2 = MI->getOperand(OpNum+1);
1279 const MCOperand &MO3 = MI->getOperand(OpNum+2);
1284 printRegName(O, MO1.getReg());
1286 assert(MO2.getReg() && "Invalid so_reg load / store address!");
1288 printRegName(O, MO2.getReg());
1290 unsigned ShAmt = MO3.getImm();
1292 assert(ShAmt <= 3 && "Not a valid Thumb2 addressing mode!");
1305 void ARMInstPrinter::printFPImmOperand(const MCInst *MI, unsigned OpNum,
1307 const MCOperand &MO = MI->getOperand(OpNum);
1310 O << '#' << ARM_AM::getFPImmFloat(MO.getImm());
1315 void ARMInstPrinter::printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
1317 unsigned EncodedImm = MI->getOperand(OpNum).getImm();
1319 uint64_t Val = ARM_AM::decodeNEONModImm(EncodedImm, EltBits);
1328 void ARMInstPrinter::printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
1330 unsigned Imm = MI->getOperand(OpNum).getImm();
1333 O << "#" << Imm + 1;
1338 void ARMInstPrinter::printRotImmOperand(const MCInst *MI, unsigned OpNum,
1340 unsigned Imm = MI->getOperand(OpNum).getImm();
1348 default: assert (0 && "illegal ror immediate!");
1349 case 1: O << "8"; break;
1350 case 2: O << "16"; break;
1351 case 3: O << "24"; break;
1357 void ARMInstPrinter::printFBits16(const MCInst *MI, unsigned OpNum,
1361 O << "#" << 16 - MI->getOperand(OpNum).getImm();
1366 void ARMInstPrinter::printFBits32(const MCInst *MI, unsigned OpNum,
1370 O << "#" << 32 - MI->getOperand(OpNum).getImm();
1375 void ARMInstPrinter::printVectorIndex(const MCInst *MI, unsigned OpNum,
1379 O << "[" << MI->getOperand(OpNum).getImm() << "]";
1384 void ARMInstPrinter::printVectorListOne(const MCInst *MI, unsigned OpNum,
1387 printRegName(O, MI->getOperand(OpNum).getReg());
1391 void ARMInstPrinter::printVectorListTwo(const MCInst *MI, unsigned OpNum,
1393 unsigned Reg = MI->getOperand(OpNum).getReg();
1394 unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1395 unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_1);
1397 printRegName(O, Reg0);
1399 printRegName(O, Reg1);
1403 void ARMInstPrinter::printVectorListTwoSpaced(const MCInst *MI,
1406 unsigned Reg = MI->getOperand(OpNum).getReg();
1407 unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1408 unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_2);
1410 printRegName(O, Reg0);
1412 printRegName(O, Reg1);
1416 void ARMInstPrinter::printVectorListThree(const MCInst *MI, unsigned OpNum,
1418 // Normally, it's not safe to use register enum values directly with
1419 // addition to get the next register, but for VFP registers, the
1420 // sort order is guaranteed because they're all of the form D<n>.
1422 printRegName(O, MI->getOperand(OpNum).getReg());
1424 printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1426 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1430 void ARMInstPrinter::printVectorListFour(const MCInst *MI, unsigned OpNum,
1432 // Normally, it's not safe to use register enum values directly with
1433 // addition to get the next register, but for VFP registers, the
1434 // sort order is guaranteed because they're all of the form D<n>.
1436 printRegName(O, MI->getOperand(OpNum).getReg());
1438 printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1440 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1442 printRegName(O, MI->getOperand(OpNum).getReg() + 3);
1446 void ARMInstPrinter::printVectorListOneAllLanes(const MCInst *MI,
1450 printRegName(O, MI->getOperand(OpNum).getReg());
1454 void ARMInstPrinter::printVectorListTwoAllLanes(const MCInst *MI,
1457 unsigned Reg = MI->getOperand(OpNum).getReg();
1458 unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1459 unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_1);
1461 printRegName(O, Reg0);
1463 printRegName(O, Reg1);
1467 void ARMInstPrinter::printVectorListThreeAllLanes(const MCInst *MI,
1470 // Normally, it's not safe to use register enum values directly with
1471 // addition to get the next register, but for VFP registers, the
1472 // sort order is guaranteed because they're all of the form D<n>.
1474 printRegName(O, MI->getOperand(OpNum).getReg());
1476 printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1478 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1482 void ARMInstPrinter::printVectorListFourAllLanes(const MCInst *MI,
1485 // Normally, it's not safe to use register enum values directly with
1486 // addition to get the next register, but for VFP registers, the
1487 // sort order is guaranteed because they're all of the form D<n>.
1489 printRegName(O, MI->getOperand(OpNum).getReg());
1491 printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1493 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1495 printRegName(O, MI->getOperand(OpNum).getReg() + 3);
1499 void ARMInstPrinter::printVectorListTwoSpacedAllLanes(const MCInst *MI,
1502 unsigned Reg = MI->getOperand(OpNum).getReg();
1503 unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1504 unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_2);
1506 printRegName(O, Reg0);
1508 printRegName(O, Reg1);
1512 void ARMInstPrinter::printVectorListThreeSpacedAllLanes(const MCInst *MI,
1515 // Normally, it's not safe to use register enum values directly with
1516 // addition to get the next register, but for VFP registers, the
1517 // sort order is guaranteed because they're all of the form D<n>.
1519 printRegName(O, MI->getOperand(OpNum).getReg());
1521 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1523 printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1527 void ARMInstPrinter::printVectorListFourSpacedAllLanes(const MCInst *MI,
1530 // Normally, it's not safe to use register enum values directly with
1531 // addition to get the next register, but for VFP registers, the
1532 // sort order is guaranteed because they're all of the form D<n>.
1534 printRegName(O, MI->getOperand(OpNum).getReg());
1536 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1538 printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1540 printRegName(O, MI->getOperand(OpNum).getReg() + 6);
1544 void ARMInstPrinter::printVectorListThreeSpaced(const MCInst *MI,
1547 // Normally, it's not safe to use register enum values directly with
1548 // addition to get the next register, but for VFP registers, the
1549 // sort order is guaranteed because they're all of the form D<n>.
1551 printRegName(O, MI->getOperand(OpNum).getReg());
1553 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1555 printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1559 void ARMInstPrinter::printVectorListFourSpaced(const MCInst *MI,
1562 // Normally, it's not safe to use register enum values directly with
1563 // addition to get the next register, but for VFP registers, the
1564 // sort order is guaranteed because they're all of the form D<n>.
1566 printRegName(O, MI->getOperand(OpNum).getReg());
1568 printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1570 printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1572 printRegName(O, MI->getOperand(OpNum).getReg() + 6);