[ARM] Add ARMv8.2-A FP16 scalar instructions
[oota-llvm.git] / lib / Target / ARM / InstPrinter / ARMInstPrinter.cpp
1 //===-- ARMInstPrinter.cpp - Convert ARM MCInst to assembly syntax --------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This class prints an ARM MCInst to a .s file.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "ARMInstPrinter.h"
15 #include "MCTargetDesc/ARMAddressingModes.h"
16 #include "MCTargetDesc/ARMBaseInfo.h"
17 #include "llvm/MC/MCAsmInfo.h"
18 #include "llvm/MC/MCExpr.h"
19 #include "llvm/MC/MCInst.h"
20 #include "llvm/MC/MCInstrInfo.h"
21 #include "llvm/MC/MCRegisterInfo.h"
22 #include "llvm/Support/raw_ostream.h"
23 using namespace llvm;
24
25 #define DEBUG_TYPE "asm-printer"
26
27 #include "ARMGenAsmWriter.inc"
28
29 /// translateShiftImm - Convert shift immediate from 0-31 to 1-32 for printing.
30 ///
31 /// getSORegOffset returns an integer from 0-31, representing '32' as 0.
32 static unsigned translateShiftImm(unsigned imm) {
33   // lsr #32 and asr #32 exist, but should be encoded as a 0.
34   assert((imm & ~0x1f) == 0 && "Invalid shift encoding");
35
36   if (imm == 0)
37     return 32;
38   return imm;
39 }
40
41 /// Prints the shift value with an immediate value.
42 static void printRegImmShift(raw_ostream &O, ARM_AM::ShiftOpc ShOpc,
43                              unsigned ShImm, bool UseMarkup) {
44   if (ShOpc == ARM_AM::no_shift || (ShOpc == ARM_AM::lsl && !ShImm))
45     return;
46   O << ", ";
47
48   assert(!(ShOpc == ARM_AM::ror && !ShImm) && "Cannot have ror #0");
49   O << getShiftOpcStr(ShOpc);
50
51   if (ShOpc != ARM_AM::rrx) {
52     O << " ";
53     if (UseMarkup)
54       O << "<imm:";
55     O << "#" << translateShiftImm(ShImm);
56     if (UseMarkup)
57       O << ">";
58   }
59 }
60
61 ARMInstPrinter::ARMInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
62                                const MCRegisterInfo &MRI)
63     : MCInstPrinter(MAI, MII, MRI) {}
64
65 void ARMInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
66   OS << markup("<reg:") << getRegisterName(RegNo) << markup(">");
67 }
68
69 void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
70                                StringRef Annot, const MCSubtargetInfo &STI) {
71   unsigned Opcode = MI->getOpcode();
72
73   switch (Opcode) {
74
75   // Check for HINT instructions w/ canonical names.
76   case ARM::HINT:
77   case ARM::tHINT:
78   case ARM::t2HINT:
79     switch (MI->getOperand(0).getImm()) {
80     case 0:
81       O << "\tnop";
82       break;
83     case 1:
84       O << "\tyield";
85       break;
86     case 2:
87       O << "\twfe";
88       break;
89     case 3:
90       O << "\twfi";
91       break;
92     case 4:
93       O << "\tsev";
94       break;
95     case 5:
96       if (STI.getFeatureBits()[ARM::HasV8Ops]) {
97         O << "\tsevl";
98         break;
99       } // Fallthrough for non-v8
100     default:
101       // Anything else should just print normally.
102       printInstruction(MI, STI, O);
103       printAnnotation(O, Annot);
104       return;
105     }
106     printPredicateOperand(MI, 1, STI, O);
107     if (Opcode == ARM::t2HINT)
108       O << ".w";
109     printAnnotation(O, Annot);
110     return;
111
112   // Check for MOVs and print canonical forms, instead.
113   case ARM::MOVsr: {
114     // FIXME: Thumb variants?
115     const MCOperand &Dst = MI->getOperand(0);
116     const MCOperand &MO1 = MI->getOperand(1);
117     const MCOperand &MO2 = MI->getOperand(2);
118     const MCOperand &MO3 = MI->getOperand(3);
119
120     O << '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3.getImm()));
121     printSBitModifierOperand(MI, 6, STI, O);
122     printPredicateOperand(MI, 4, STI, O);
123
124     O << '\t';
125     printRegName(O, Dst.getReg());
126     O << ", ";
127     printRegName(O, MO1.getReg());
128
129     O << ", ";
130     printRegName(O, MO2.getReg());
131     assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
132     printAnnotation(O, Annot);
133     return;
134   }
135
136   case ARM::MOVsi: {
137     // FIXME: Thumb variants?
138     const MCOperand &Dst = MI->getOperand(0);
139     const MCOperand &MO1 = MI->getOperand(1);
140     const MCOperand &MO2 = MI->getOperand(2);
141
142     O << '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO2.getImm()));
143     printSBitModifierOperand(MI, 5, STI, O);
144     printPredicateOperand(MI, 3, STI, O);
145
146     O << '\t';
147     printRegName(O, Dst.getReg());
148     O << ", ";
149     printRegName(O, MO1.getReg());
150
151     if (ARM_AM::getSORegShOp(MO2.getImm()) == ARM_AM::rrx) {
152       printAnnotation(O, Annot);
153       return;
154     }
155
156     O << ", " << markup("<imm:") << "#"
157       << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm())) << markup(">");
158     printAnnotation(O, Annot);
159     return;
160   }
161
162   // A8.6.123 PUSH
163   case ARM::STMDB_UPD:
164   case ARM::t2STMDB_UPD:
165     if (MI->getOperand(0).getReg() == ARM::SP && MI->getNumOperands() > 5) {
166       // Should only print PUSH if there are at least two registers in the list.
167       O << '\t' << "push";
168       printPredicateOperand(MI, 2, STI, O);
169       if (Opcode == ARM::t2STMDB_UPD)
170         O << ".w";
171       O << '\t';
172       printRegisterList(MI, 4, STI, O);
173       printAnnotation(O, Annot);
174       return;
175     } else
176       break;
177
178   case ARM::STR_PRE_IMM:
179     if (MI->getOperand(2).getReg() == ARM::SP &&
180         MI->getOperand(3).getImm() == -4) {
181       O << '\t' << "push";
182       printPredicateOperand(MI, 4, STI, O);
183       O << "\t{";
184       printRegName(O, MI->getOperand(1).getReg());
185       O << "}";
186       printAnnotation(O, Annot);
187       return;
188     } else
189       break;
190
191   // A8.6.122 POP
192   case ARM::LDMIA_UPD:
193   case ARM::t2LDMIA_UPD:
194     if (MI->getOperand(0).getReg() == ARM::SP && MI->getNumOperands() > 5) {
195       // Should only print POP if there are at least two registers in the list.
196       O << '\t' << "pop";
197       printPredicateOperand(MI, 2, STI, O);
198       if (Opcode == ARM::t2LDMIA_UPD)
199         O << ".w";
200       O << '\t';
201       printRegisterList(MI, 4, STI, O);
202       printAnnotation(O, Annot);
203       return;
204     } else
205       break;
206
207   case ARM::LDR_POST_IMM:
208     if (MI->getOperand(2).getReg() == ARM::SP &&
209         MI->getOperand(4).getImm() == 4) {
210       O << '\t' << "pop";
211       printPredicateOperand(MI, 5, STI, O);
212       O << "\t{";
213       printRegName(O, MI->getOperand(0).getReg());
214       O << "}";
215       printAnnotation(O, Annot);
216       return;
217     } else
218       break;
219
220   // A8.6.355 VPUSH
221   case ARM::VSTMSDB_UPD:
222   case ARM::VSTMDDB_UPD:
223     if (MI->getOperand(0).getReg() == ARM::SP) {
224       O << '\t' << "vpush";
225       printPredicateOperand(MI, 2, STI, O);
226       O << '\t';
227       printRegisterList(MI, 4, STI, O);
228       printAnnotation(O, Annot);
229       return;
230     } else
231       break;
232
233   // A8.6.354 VPOP
234   case ARM::VLDMSIA_UPD:
235   case ARM::VLDMDIA_UPD:
236     if (MI->getOperand(0).getReg() == ARM::SP) {
237       O << '\t' << "vpop";
238       printPredicateOperand(MI, 2, STI, O);
239       O << '\t';
240       printRegisterList(MI, 4, STI, O);
241       printAnnotation(O, Annot);
242       return;
243     } else
244       break;
245
246   case ARM::tLDMIA: {
247     bool Writeback = true;
248     unsigned BaseReg = MI->getOperand(0).getReg();
249     for (unsigned i = 3; i < MI->getNumOperands(); ++i) {
250       if (MI->getOperand(i).getReg() == BaseReg)
251         Writeback = false;
252     }
253
254     O << "\tldm";
255
256     printPredicateOperand(MI, 1, STI, O);
257     O << '\t';
258     printRegName(O, BaseReg);
259     if (Writeback)
260       O << "!";
261     O << ", ";
262     printRegisterList(MI, 3, STI, O);
263     printAnnotation(O, Annot);
264     return;
265   }
266
267   // Combine 2 GPRs from disassember into a GPRPair to match with instr def.
268   // ldrexd/strexd require even/odd GPR pair. To enforce this constraint,
269   // a single GPRPair reg operand is used in the .td file to replace the two
270   // GPRs. However, when decoding them, the two GRPs cannot be automatically
271   // expressed as a GPRPair, so we have to manually merge them.
272   // FIXME: We would really like to be able to tablegen'erate this.
273   case ARM::LDREXD:
274   case ARM::STREXD:
275   case ARM::LDAEXD:
276   case ARM::STLEXD: {
277     const MCRegisterClass &MRC = MRI.getRegClass(ARM::GPRRegClassID);
278     bool isStore = Opcode == ARM::STREXD || Opcode == ARM::STLEXD;
279     unsigned Reg = MI->getOperand(isStore ? 1 : 0).getReg();
280     if (MRC.contains(Reg)) {
281       MCInst NewMI;
282       MCOperand NewReg;
283       NewMI.setOpcode(Opcode);
284
285       if (isStore)
286         NewMI.addOperand(MI->getOperand(0));
287       NewReg = MCOperand::createReg(MRI.getMatchingSuperReg(
288           Reg, ARM::gsub_0, &MRI.getRegClass(ARM::GPRPairRegClassID)));
289       NewMI.addOperand(NewReg);
290
291       // Copy the rest operands into NewMI.
292       for (unsigned i = isStore ? 3 : 2; i < MI->getNumOperands(); ++i)
293         NewMI.addOperand(MI->getOperand(i));
294       printInstruction(&NewMI, STI, O);
295       return;
296     }
297     break;
298   }
299   // B9.3.3 ERET (Thumb)
300   // For a target that has Virtualization Extensions, ERET is the preferred
301   // disassembly of SUBS PC, LR, #0
302   case ARM::t2SUBS_PC_LR: {
303     if (MI->getNumOperands() == 3 && MI->getOperand(0).isImm() &&
304         MI->getOperand(0).getImm() == 0 &&
305         STI.getFeatureBits()[ARM::FeatureVirtualization]) {
306       O << "\teret";
307       printPredicateOperand(MI, 1, STI, O);
308       printAnnotation(O, Annot);
309       return;
310     }
311     break;
312   }
313   }
314
315   printInstruction(MI, STI, O);
316   printAnnotation(O, Annot);
317 }
318
319 void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
320                                   const MCSubtargetInfo &STI, raw_ostream &O) {
321   const MCOperand &Op = MI->getOperand(OpNo);
322   if (Op.isReg()) {
323     unsigned Reg = Op.getReg();
324     printRegName(O, Reg);
325   } else if (Op.isImm()) {
326     O << markup("<imm:") << '#' << formatImm(Op.getImm()) << markup(">");
327   } else {
328     assert(Op.isExpr() && "unknown operand kind in printOperand");
329     const MCExpr *Expr = Op.getExpr();
330     switch (Expr->getKind()) {
331     case MCExpr::Binary:
332       O << '#';
333       Expr->print(O, &MAI);
334       break;
335     case MCExpr::Constant: {
336       // If a symbolic branch target was added as a constant expression then
337       // print that address in hex. And only print 32 unsigned bits for the
338       // address.
339       const MCConstantExpr *Constant = cast<MCConstantExpr>(Expr);
340       int64_t TargetAddress;
341       if (!Constant->evaluateAsAbsolute(TargetAddress)) {
342         O << '#';
343         Expr->print(O, &MAI);
344       } else {
345         O << "0x";
346         O.write_hex(static_cast<uint32_t>(TargetAddress));
347       }
348       break;
349     }
350     default:
351       // FIXME: Should we always treat this as if it is a constant literal and
352       // prefix it with '#'?
353       Expr->print(O, &MAI);
354       break;
355     }
356   }
357 }
358
359 void ARMInstPrinter::printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
360                                                const MCSubtargetInfo &STI,
361                                                raw_ostream &O) {
362   const MCOperand &MO1 = MI->getOperand(OpNum);
363   if (MO1.isExpr()) {
364     MO1.getExpr()->print(O, &MAI);
365     return;
366   }
367
368   O << markup("<mem:") << "[pc, ";
369
370   int32_t OffImm = (int32_t)MO1.getImm();
371   bool isSub = OffImm < 0;
372
373   // Special value for #-0. All others are normal.
374   if (OffImm == INT32_MIN)
375     OffImm = 0;
376   if (isSub) {
377     O << markup("<imm:") << "#-" << formatImm(-OffImm) << markup(">");
378   } else {
379     O << markup("<imm:") << "#" << formatImm(OffImm) << markup(">");
380   }
381   O << "]" << markup(">");
382 }
383
384 // so_reg is a 4-operand unit corresponding to register forms of the A5.1
385 // "Addressing Mode 1 - Data-processing operands" forms.  This includes:
386 //    REG 0   0           - e.g. R5
387 //    REG REG 0,SH_OPC    - e.g. R5, ROR R3
388 //    REG 0   IMM,SH_OPC  - e.g. R5, LSL #3
389 void ARMInstPrinter::printSORegRegOperand(const MCInst *MI, unsigned OpNum,
390                                           const MCSubtargetInfo &STI,
391                                           raw_ostream &O) {
392   const MCOperand &MO1 = MI->getOperand(OpNum);
393   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
394   const MCOperand &MO3 = MI->getOperand(OpNum + 2);
395
396   printRegName(O, MO1.getReg());
397
398   // Print the shift opc.
399   ARM_AM::ShiftOpc ShOpc = ARM_AM::getSORegShOp(MO3.getImm());
400   O << ", " << ARM_AM::getShiftOpcStr(ShOpc);
401   if (ShOpc == ARM_AM::rrx)
402     return;
403
404   O << ' ';
405   printRegName(O, MO2.getReg());
406   assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
407 }
408
409 void ARMInstPrinter::printSORegImmOperand(const MCInst *MI, unsigned OpNum,
410                                           const MCSubtargetInfo &STI,
411                                           raw_ostream &O) {
412   const MCOperand &MO1 = MI->getOperand(OpNum);
413   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
414
415   printRegName(O, MO1.getReg());
416
417   // Print the shift opc.
418   printRegImmShift(O, ARM_AM::getSORegShOp(MO2.getImm()),
419                    ARM_AM::getSORegOffset(MO2.getImm()), UseMarkup);
420 }
421
422 //===--------------------------------------------------------------------===//
423 // Addressing Mode #2
424 //===--------------------------------------------------------------------===//
425
426 void ARMInstPrinter::printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
427                                                 const MCSubtargetInfo &STI,
428                                                 raw_ostream &O) {
429   const MCOperand &MO1 = MI->getOperand(Op);
430   const MCOperand &MO2 = MI->getOperand(Op + 1);
431   const MCOperand &MO3 = MI->getOperand(Op + 2);
432
433   O << markup("<mem:") << "[";
434   printRegName(O, MO1.getReg());
435
436   if (!MO2.getReg()) {
437     if (ARM_AM::getAM2Offset(MO3.getImm())) { // Don't print +0.
438       O << ", " << markup("<imm:") << "#"
439         << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
440         << ARM_AM::getAM2Offset(MO3.getImm()) << markup(">");
441     }
442     O << "]" << markup(">");
443     return;
444   }
445
446   O << ", ";
447   O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()));
448   printRegName(O, MO2.getReg());
449
450   printRegImmShift(O, ARM_AM::getAM2ShiftOpc(MO3.getImm()),
451                    ARM_AM::getAM2Offset(MO3.getImm()), UseMarkup);
452   O << "]" << markup(">");
453 }
454
455 void ARMInstPrinter::printAddrModeTBB(const MCInst *MI, unsigned Op,
456                                       const MCSubtargetInfo &STI,
457                                       raw_ostream &O) {
458   const MCOperand &MO1 = MI->getOperand(Op);
459   const MCOperand &MO2 = MI->getOperand(Op + 1);
460   O << markup("<mem:") << "[";
461   printRegName(O, MO1.getReg());
462   O << ", ";
463   printRegName(O, MO2.getReg());
464   O << "]" << markup(">");
465 }
466
467 void ARMInstPrinter::printAddrModeTBH(const MCInst *MI, unsigned Op,
468                                       const MCSubtargetInfo &STI,
469                                       raw_ostream &O) {
470   const MCOperand &MO1 = MI->getOperand(Op);
471   const MCOperand &MO2 = MI->getOperand(Op + 1);
472   O << markup("<mem:") << "[";
473   printRegName(O, MO1.getReg());
474   O << ", ";
475   printRegName(O, MO2.getReg());
476   O << ", lsl " << markup("<imm:") << "#1" << markup(">") << "]" << markup(">");
477 }
478
479 void ARMInstPrinter::printAddrMode2Operand(const MCInst *MI, unsigned Op,
480                                            const MCSubtargetInfo &STI,
481                                            raw_ostream &O) {
482   const MCOperand &MO1 = MI->getOperand(Op);
483
484   if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
485     printOperand(MI, Op, STI, O);
486     return;
487   }
488
489 #ifndef NDEBUG
490   const MCOperand &MO3 = MI->getOperand(Op + 2);
491   unsigned IdxMode = ARM_AM::getAM2IdxMode(MO3.getImm());
492   assert(IdxMode != ARMII::IndexModePost && "Should be pre or offset index op");
493 #endif
494
495   printAM2PreOrOffsetIndexOp(MI, Op, STI, O);
496 }
497
498 void ARMInstPrinter::printAddrMode2OffsetOperand(const MCInst *MI,
499                                                  unsigned OpNum,
500                                                  const MCSubtargetInfo &STI,
501                                                  raw_ostream &O) {
502   const MCOperand &MO1 = MI->getOperand(OpNum);
503   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
504
505   if (!MO1.getReg()) {
506     unsigned ImmOffs = ARM_AM::getAM2Offset(MO2.getImm());
507     O << markup("<imm:") << '#'
508       << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm())) << ImmOffs
509       << markup(">");
510     return;
511   }
512
513   O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()));
514   printRegName(O, MO1.getReg());
515
516   printRegImmShift(O, ARM_AM::getAM2ShiftOpc(MO2.getImm()),
517                    ARM_AM::getAM2Offset(MO2.getImm()), UseMarkup);
518 }
519
520 //===--------------------------------------------------------------------===//
521 // Addressing Mode #3
522 //===--------------------------------------------------------------------===//
523
524 void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
525                                                 raw_ostream &O,
526                                                 bool AlwaysPrintImm0) {
527   const MCOperand &MO1 = MI->getOperand(Op);
528   const MCOperand &MO2 = MI->getOperand(Op + 1);
529   const MCOperand &MO3 = MI->getOperand(Op + 2);
530
531   O << markup("<mem:") << '[';
532   printRegName(O, MO1.getReg());
533
534   if (MO2.getReg()) {
535     O << ", " << getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()));
536     printRegName(O, MO2.getReg());
537     O << ']' << markup(">");
538     return;
539   }
540
541   // If the op is sub we have to print the immediate even if it is 0
542   unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
543   ARM_AM::AddrOpc op = ARM_AM::getAM3Op(MO3.getImm());
544
545   if (AlwaysPrintImm0 || ImmOffs || (op == ARM_AM::sub)) {
546     O << ", " << markup("<imm:") << "#" << ARM_AM::getAddrOpcStr(op) << ImmOffs
547       << markup(">");
548   }
549   O << ']' << markup(">");
550 }
551
552 template <bool AlwaysPrintImm0>
553 void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
554                                            const MCSubtargetInfo &STI,
555                                            raw_ostream &O) {
556   const MCOperand &MO1 = MI->getOperand(Op);
557   if (!MO1.isReg()) { //  For label symbolic references.
558     printOperand(MI, Op, STI, O);
559     return;
560   }
561
562   assert(ARM_AM::getAM3IdxMode(MI->getOperand(Op + 2).getImm()) !=
563              ARMII::IndexModePost &&
564          "unexpected idxmode");
565   printAM3PreOrOffsetIndexOp(MI, Op, O, AlwaysPrintImm0);
566 }
567
568 void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst *MI,
569                                                  unsigned OpNum,
570                                                  const MCSubtargetInfo &STI,
571                                                  raw_ostream &O) {
572   const MCOperand &MO1 = MI->getOperand(OpNum);
573   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
574
575   if (MO1.getReg()) {
576     O << getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()));
577     printRegName(O, MO1.getReg());
578     return;
579   }
580
581   unsigned ImmOffs = ARM_AM::getAM3Offset(MO2.getImm());
582   O << markup("<imm:") << '#'
583     << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm())) << ImmOffs
584     << markup(">");
585 }
586
587 void ARMInstPrinter::printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
588                                              const MCSubtargetInfo &STI,
589                                              raw_ostream &O) {
590   const MCOperand &MO = MI->getOperand(OpNum);
591   unsigned Imm = MO.getImm();
592   O << markup("<imm:") << '#' << ((Imm & 256) ? "" : "-") << (Imm & 0xff)
593     << markup(">");
594 }
595
596 void ARMInstPrinter::printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
597                                             const MCSubtargetInfo &STI,
598                                             raw_ostream &O) {
599   const MCOperand &MO1 = MI->getOperand(OpNum);
600   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
601
602   O << (MO2.getImm() ? "" : "-");
603   printRegName(O, MO1.getReg());
604 }
605
606 void ARMInstPrinter::printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
607                                                const MCSubtargetInfo &STI,
608                                                raw_ostream &O) {
609   const MCOperand &MO = MI->getOperand(OpNum);
610   unsigned Imm = MO.getImm();
611   O << markup("<imm:") << '#' << ((Imm & 256) ? "" : "-") << ((Imm & 0xff) << 2)
612     << markup(">");
613 }
614
615 void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
616                                            const MCSubtargetInfo &STI,
617                                            raw_ostream &O) {
618   ARM_AM::AMSubMode Mode =
619       ARM_AM::getAM4SubMode(MI->getOperand(OpNum).getImm());
620   O << ARM_AM::getAMSubModeStr(Mode);
621 }
622
623 template <bool AlwaysPrintImm0>
624 void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
625                                            const MCSubtargetInfo &STI,
626                                            raw_ostream &O) {
627   const MCOperand &MO1 = MI->getOperand(OpNum);
628   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
629
630   if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
631     printOperand(MI, OpNum, STI, O);
632     return;
633   }
634
635   O << markup("<mem:") << "[";
636   printRegName(O, MO1.getReg());
637
638   unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm());
639   ARM_AM::AddrOpc Op = ARM_AM::getAM5Op(MO2.getImm());
640   if (AlwaysPrintImm0 || ImmOffs || Op == ARM_AM::sub) {
641     O << ", " << markup("<imm:") << "#" << ARM_AM::getAddrOpcStr(Op)
642       << ImmOffs * 4 << markup(">");
643   }
644   O << "]" << markup(">");
645 }
646
647 template <bool AlwaysPrintImm0>
648 void ARMInstPrinter::printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum,
649                                                const MCSubtargetInfo &STI,
650                                                raw_ostream &O) {
651   const MCOperand &MO1 = MI->getOperand(OpNum);
652   const MCOperand &MO2 = MI->getOperand(OpNum+1);
653
654   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
655     printOperand(MI, OpNum, STI, O);
656     return;
657   }
658
659   O << markup("<mem:") << "[";
660   printRegName(O, MO1.getReg());
661
662   unsigned ImmOffs = ARM_AM::getAM5FP16Offset(MO2.getImm());
663   unsigned Op = ARM_AM::getAM5FP16Op(MO2.getImm());
664   if (AlwaysPrintImm0 || ImmOffs || Op == ARM_AM::sub) {
665     O << ", "
666       << markup("<imm:")
667       << "#"
668       << ARM_AM::getAddrOpcStr(ARM_AM::getAM5FP16Op(MO2.getImm()))
669       << ImmOffs * 2
670       << markup(">");
671   }
672   O << "]" << markup(">");
673 }
674
675 void ARMInstPrinter::printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
676                                            const MCSubtargetInfo &STI,
677                                            raw_ostream &O) {
678   const MCOperand &MO1 = MI->getOperand(OpNum);
679   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
680
681   O << markup("<mem:") << "[";
682   printRegName(O, MO1.getReg());
683   if (MO2.getImm()) {
684     O << ":" << (MO2.getImm() << 3);
685   }
686   O << "]" << markup(">");
687 }
688
689 void ARMInstPrinter::printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
690                                            const MCSubtargetInfo &STI,
691                                            raw_ostream &O) {
692   const MCOperand &MO1 = MI->getOperand(OpNum);
693   O << markup("<mem:") << "[";
694   printRegName(O, MO1.getReg());
695   O << "]" << markup(">");
696 }
697
698 void ARMInstPrinter::printAddrMode6OffsetOperand(const MCInst *MI,
699                                                  unsigned OpNum,
700                                                  const MCSubtargetInfo &STI,
701                                                  raw_ostream &O) {
702   const MCOperand &MO = MI->getOperand(OpNum);
703   if (MO.getReg() == 0)
704     O << "!";
705   else {
706     O << ", ";
707     printRegName(O, MO.getReg());
708   }
709 }
710
711 void ARMInstPrinter::printBitfieldInvMaskImmOperand(const MCInst *MI,
712                                                     unsigned OpNum,
713                                                     const MCSubtargetInfo &STI,
714                                                     raw_ostream &O) {
715   const MCOperand &MO = MI->getOperand(OpNum);
716   uint32_t v = ~MO.getImm();
717   int32_t lsb = countTrailingZeros(v);
718   int32_t width = (32 - countLeadingZeros(v)) - lsb;
719   assert(MO.isImm() && "Not a valid bf_inv_mask_imm value!");
720   O << markup("<imm:") << '#' << lsb << markup(">") << ", " << markup("<imm:")
721     << '#' << width << markup(">");
722 }
723
724 void ARMInstPrinter::printMemBOption(const MCInst *MI, unsigned OpNum,
725                                      const MCSubtargetInfo &STI,
726                                      raw_ostream &O) {
727   unsigned val = MI->getOperand(OpNum).getImm();
728   O << ARM_MB::MemBOptToString(val, STI.getFeatureBits()[ARM::HasV8Ops]);
729 }
730
731 void ARMInstPrinter::printInstSyncBOption(const MCInst *MI, unsigned OpNum,
732                                           const MCSubtargetInfo &STI,
733                                           raw_ostream &O) {
734   unsigned val = MI->getOperand(OpNum).getImm();
735   O << ARM_ISB::InstSyncBOptToString(val);
736 }
737
738 void ARMInstPrinter::printShiftImmOperand(const MCInst *MI, unsigned OpNum,
739                                           const MCSubtargetInfo &STI,
740                                           raw_ostream &O) {
741   unsigned ShiftOp = MI->getOperand(OpNum).getImm();
742   bool isASR = (ShiftOp & (1 << 5)) != 0;
743   unsigned Amt = ShiftOp & 0x1f;
744   if (isASR) {
745     O << ", asr " << markup("<imm:") << "#" << (Amt == 0 ? 32 : Amt)
746       << markup(">");
747   } else if (Amt) {
748     O << ", lsl " << markup("<imm:") << "#" << Amt << markup(">");
749   }
750 }
751
752 void ARMInstPrinter::printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
753                                          const MCSubtargetInfo &STI,
754                                          raw_ostream &O) {
755   unsigned Imm = MI->getOperand(OpNum).getImm();
756   if (Imm == 0)
757     return;
758   assert(Imm > 0 && Imm < 32 && "Invalid PKH shift immediate value!");
759   O << ", lsl " << markup("<imm:") << "#" << Imm << markup(">");
760 }
761
762 void ARMInstPrinter::printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
763                                          const MCSubtargetInfo &STI,
764                                          raw_ostream &O) {
765   unsigned Imm = MI->getOperand(OpNum).getImm();
766   // A shift amount of 32 is encoded as 0.
767   if (Imm == 0)
768     Imm = 32;
769   assert(Imm > 0 && Imm <= 32 && "Invalid PKH shift immediate value!");
770   O << ", asr " << markup("<imm:") << "#" << Imm << markup(">");
771 }
772
773 void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum,
774                                        const MCSubtargetInfo &STI,
775                                        raw_ostream &O) {
776   O << "{";
777   for (unsigned i = OpNum, e = MI->getNumOperands(); i != e; ++i) {
778     if (i != OpNum)
779       O << ", ";
780     printRegName(O, MI->getOperand(i).getReg());
781   }
782   O << "}";
783 }
784
785 void ARMInstPrinter::printGPRPairOperand(const MCInst *MI, unsigned OpNum,
786                                          const MCSubtargetInfo &STI,
787                                          raw_ostream &O) {
788   unsigned Reg = MI->getOperand(OpNum).getReg();
789   printRegName(O, MRI.getSubReg(Reg, ARM::gsub_0));
790   O << ", ";
791   printRegName(O, MRI.getSubReg(Reg, ARM::gsub_1));
792 }
793
794 void ARMInstPrinter::printSetendOperand(const MCInst *MI, unsigned OpNum,
795                                         const MCSubtargetInfo &STI,
796                                         raw_ostream &O) {
797   const MCOperand &Op = MI->getOperand(OpNum);
798   if (Op.getImm())
799     O << "be";
800   else
801     O << "le";
802 }
803
804 void ARMInstPrinter::printCPSIMod(const MCInst *MI, unsigned OpNum,
805                                   const MCSubtargetInfo &STI, raw_ostream &O) {
806   const MCOperand &Op = MI->getOperand(OpNum);
807   O << ARM_PROC::IModToString(Op.getImm());
808 }
809
810 void ARMInstPrinter::printCPSIFlag(const MCInst *MI, unsigned OpNum,
811                                    const MCSubtargetInfo &STI, raw_ostream &O) {
812   const MCOperand &Op = MI->getOperand(OpNum);
813   unsigned IFlags = Op.getImm();
814   for (int i = 2; i >= 0; --i)
815     if (IFlags & (1 << i))
816       O << ARM_PROC::IFlagsToString(1 << i);
817
818   if (IFlags == 0)
819     O << "none";
820 }
821
822 void ARMInstPrinter::printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
823                                          const MCSubtargetInfo &STI,
824                                          raw_ostream &O) {
825   const MCOperand &Op = MI->getOperand(OpNum);
826   unsigned SpecRegRBit = Op.getImm() >> 4;
827   unsigned Mask = Op.getImm() & 0xf;
828   const FeatureBitset &FeatureBits = STI.getFeatureBits();
829
830   if (FeatureBits[ARM::FeatureMClass]) {
831     unsigned SYSm = Op.getImm();
832     unsigned Opcode = MI->getOpcode();
833
834     // For writes, handle extended mask bits if the DSP extension is present.
835     if (Opcode == ARM::t2MSR_M && FeatureBits[ARM::FeatureDSP]) {
836       switch (SYSm) {
837       case 0x400:
838         O << "apsr_g";
839         return;
840       case 0xc00:
841         O << "apsr_nzcvqg";
842         return;
843       case 0x401:
844         O << "iapsr_g";
845         return;
846       case 0xc01:
847         O << "iapsr_nzcvqg";
848         return;
849       case 0x402:
850         O << "eapsr_g";
851         return;
852       case 0xc02:
853         O << "eapsr_nzcvqg";
854         return;
855       case 0x403:
856         O << "xpsr_g";
857         return;
858       case 0xc03:
859         O << "xpsr_nzcvqg";
860         return;
861       }
862     }
863
864     // Handle the basic 8-bit mask.
865     SYSm &= 0xff;
866
867     if (Opcode == ARM::t2MSR_M && FeatureBits [ARM::HasV7Ops]) {
868       // ARMv7-M deprecates using MSR APSR without a _<bits> qualifier as an
869       // alias for MSR APSR_nzcvq.
870       switch (SYSm) {
871       case 0:
872         O << "apsr_nzcvq";
873         return;
874       case 1:
875         O << "iapsr_nzcvq";
876         return;
877       case 2:
878         O << "eapsr_nzcvq";
879         return;
880       case 3:
881         O << "xpsr_nzcvq";
882         return;
883       }
884     }
885
886     switch (SYSm) {
887     default:
888       llvm_unreachable("Unexpected mask value!");
889     case 0:
890       O << "apsr";
891       return;
892     case 1:
893       O << "iapsr";
894       return;
895     case 2:
896       O << "eapsr";
897       return;
898     case 3:
899       O << "xpsr";
900       return;
901     case 5:
902       O << "ipsr";
903       return;
904     case 6:
905       O << "epsr";
906       return;
907     case 7:
908       O << "iepsr";
909       return;
910     case 8:
911       O << "msp";
912       return;
913     case 9:
914       O << "psp";
915       return;
916     case 16:
917       O << "primask";
918       return;
919     case 17:
920       O << "basepri";
921       return;
922     case 18:
923       O << "basepri_max";
924       return;
925     case 19:
926       O << "faultmask";
927       return;
928     case 20:
929       O << "control";
930       return;
931     }
932   }
933
934   // As special cases, CPSR_f, CPSR_s and CPSR_fs prefer printing as
935   // APSR_nzcvq, APSR_g and APSRnzcvqg, respectively.
936   if (!SpecRegRBit && (Mask == 8 || Mask == 4 || Mask == 12)) {
937     O << "APSR_";
938     switch (Mask) {
939     default:
940       llvm_unreachable("Unexpected mask value!");
941     case 4:
942       O << "g";
943       return;
944     case 8:
945       O << "nzcvq";
946       return;
947     case 12:
948       O << "nzcvqg";
949       return;
950     }
951   }
952
953   if (SpecRegRBit)
954     O << "SPSR";
955   else
956     O << "CPSR";
957
958   if (Mask) {
959     O << '_';
960     if (Mask & 8)
961       O << 'f';
962     if (Mask & 4)
963       O << 's';
964     if (Mask & 2)
965       O << 'x';
966     if (Mask & 1)
967       O << 'c';
968   }
969 }
970
971 void ARMInstPrinter::printBankedRegOperand(const MCInst *MI, unsigned OpNum,
972                                            const MCSubtargetInfo &STI,
973                                            raw_ostream &O) {
974   uint32_t Banked = MI->getOperand(OpNum).getImm();
975   uint32_t R = (Banked & 0x20) >> 5;
976   uint32_t SysM = Banked & 0x1f;
977
978   // Nothing much we can do about this, the encodings are specified in B9.2.3 of
979   // the ARM ARM v7C, and are all over the shop.
980   if (R) {
981     O << "SPSR_";
982
983     switch (SysM) {
984     case 0x0e:
985       O << "fiq";
986       return;
987     case 0x10:
988       O << "irq";
989       return;
990     case 0x12:
991       O << "svc";
992       return;
993     case 0x14:
994       O << "abt";
995       return;
996     case 0x16:
997       O << "und";
998       return;
999     case 0x1c:
1000       O << "mon";
1001       return;
1002     case 0x1e:
1003       O << "hyp";
1004       return;
1005     default:
1006       llvm_unreachable("Invalid banked SPSR register");
1007     }
1008   }
1009
1010   assert(!R && "should have dealt with SPSR regs");
1011   const char *RegNames[] = {
1012       "r8_usr", "r9_usr", "r10_usr", "r11_usr", "r12_usr", "sp_usr",  "lr_usr",
1013       "",       "r8_fiq", "r9_fiq",  "r10_fiq", "r11_fiq", "r12_fiq", "sp_fiq",
1014       "lr_fiq", "",       "lr_irq",  "sp_irq",  "lr_svc",  "sp_svc",  "lr_abt",
1015       "sp_abt", "lr_und", "sp_und",  "",        "",        "",        "",
1016       "lr_mon", "sp_mon", "elr_hyp", "sp_hyp"};
1017   const char *Name = RegNames[SysM];
1018   assert(Name[0] && "invalid banked register operand");
1019
1020   O << Name;
1021 }
1022
1023 void ARMInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNum,
1024                                            const MCSubtargetInfo &STI,
1025                                            raw_ostream &O) {
1026   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
1027   // Handle the undefined 15 CC value here for printing so we don't abort().
1028   if ((unsigned)CC == 15)
1029     O << "<und>";
1030   else if (CC != ARMCC::AL)
1031     O << ARMCondCodeToString(CC);
1032 }
1033
1034 void ARMInstPrinter::printMandatoryPredicateOperand(const MCInst *MI,
1035                                                     unsigned OpNum,
1036                                                     const MCSubtargetInfo &STI,
1037                                                     raw_ostream &O) {
1038   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
1039   O << ARMCondCodeToString(CC);
1040 }
1041
1042 void ARMInstPrinter::printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
1043                                               const MCSubtargetInfo &STI,
1044                                               raw_ostream &O) {
1045   if (MI->getOperand(OpNum).getReg()) {
1046     assert(MI->getOperand(OpNum).getReg() == ARM::CPSR &&
1047            "Expect ARM CPSR register!");
1048     O << 's';
1049   }
1050 }
1051
1052 void ARMInstPrinter::printNoHashImmediate(const MCInst *MI, unsigned OpNum,
1053                                           const MCSubtargetInfo &STI,
1054                                           raw_ostream &O) {
1055   O << MI->getOperand(OpNum).getImm();
1056 }
1057
1058 void ARMInstPrinter::printPImmediate(const MCInst *MI, unsigned OpNum,
1059                                      const MCSubtargetInfo &STI,
1060                                      raw_ostream &O) {
1061   O << "p" << MI->getOperand(OpNum).getImm();
1062 }
1063
1064 void ARMInstPrinter::printCImmediate(const MCInst *MI, unsigned OpNum,
1065                                      const MCSubtargetInfo &STI,
1066                                      raw_ostream &O) {
1067   O << "c" << MI->getOperand(OpNum).getImm();
1068 }
1069
1070 void ARMInstPrinter::printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
1071                                           const MCSubtargetInfo &STI,
1072                                           raw_ostream &O) {
1073   O << "{" << MI->getOperand(OpNum).getImm() << "}";
1074 }
1075
1076 void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum,
1077                                   const MCSubtargetInfo &STI, raw_ostream &O) {
1078   llvm_unreachable("Unhandled PC-relative pseudo-instruction!");
1079 }
1080
1081 template <unsigned scale>
1082 void ARMInstPrinter::printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
1083                                           const MCSubtargetInfo &STI,
1084                                           raw_ostream &O) {
1085   const MCOperand &MO = MI->getOperand(OpNum);
1086
1087   if (MO.isExpr()) {
1088     MO.getExpr()->print(O, &MAI);
1089     return;
1090   }
1091
1092   int32_t OffImm = (int32_t)MO.getImm() << scale;
1093
1094   O << markup("<imm:");
1095   if (OffImm == INT32_MIN)
1096     O << "#-0";
1097   else if (OffImm < 0)
1098     O << "#-" << -OffImm;
1099   else
1100     O << "#" << OffImm;
1101   O << markup(">");
1102 }
1103
1104 void ARMInstPrinter::printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
1105                                             const MCSubtargetInfo &STI,
1106                                             raw_ostream &O) {
1107   O << markup("<imm:") << "#" << formatImm(MI->getOperand(OpNum).getImm() * 4)
1108     << markup(">");
1109 }
1110
1111 void ARMInstPrinter::printThumbSRImm(const MCInst *MI, unsigned OpNum,
1112                                      const MCSubtargetInfo &STI,
1113                                      raw_ostream &O) {
1114   unsigned Imm = MI->getOperand(OpNum).getImm();
1115   O << markup("<imm:") << "#" << formatImm((Imm == 0 ? 32 : Imm))
1116     << markup(">");
1117 }
1118
1119 void ARMInstPrinter::printThumbITMask(const MCInst *MI, unsigned OpNum,
1120                                       const MCSubtargetInfo &STI,
1121                                       raw_ostream &O) {
1122   // (3 - the number of trailing zeros) is the number of then / else.
1123   unsigned Mask = MI->getOperand(OpNum).getImm();
1124   unsigned Firstcond = MI->getOperand(OpNum - 1).getImm();
1125   unsigned CondBit0 = Firstcond & 1;
1126   unsigned NumTZ = countTrailingZeros(Mask);
1127   assert(NumTZ <= 3 && "Invalid IT mask!");
1128   for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) {
1129     bool T = ((Mask >> Pos) & 1) == CondBit0;
1130     if (T)
1131       O << 't';
1132     else
1133       O << 'e';
1134   }
1135 }
1136
1137 void ARMInstPrinter::printThumbAddrModeRROperand(const MCInst *MI, unsigned Op,
1138                                                  const MCSubtargetInfo &STI,
1139                                                  raw_ostream &O) {
1140   const MCOperand &MO1 = MI->getOperand(Op);
1141   const MCOperand &MO2 = MI->getOperand(Op + 1);
1142
1143   if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
1144     printOperand(MI, Op, STI, O);
1145     return;
1146   }
1147
1148   O << markup("<mem:") << "[";
1149   printRegName(O, MO1.getReg());
1150   if (unsigned RegNum = MO2.getReg()) {
1151     O << ", ";
1152     printRegName(O, RegNum);
1153   }
1154   O << "]" << markup(">");
1155 }
1156
1157 void ARMInstPrinter::printThumbAddrModeImm5SOperand(const MCInst *MI,
1158                                                     unsigned Op,
1159                                                     const MCSubtargetInfo &STI,
1160                                                     raw_ostream &O,
1161                                                     unsigned Scale) {
1162   const MCOperand &MO1 = MI->getOperand(Op);
1163   const MCOperand &MO2 = MI->getOperand(Op + 1);
1164
1165   if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
1166     printOperand(MI, Op, STI, O);
1167     return;
1168   }
1169
1170   O << markup("<mem:") << "[";
1171   printRegName(O, MO1.getReg());
1172   if (unsigned ImmOffs = MO2.getImm()) {
1173     O << ", " << markup("<imm:") << "#" << formatImm(ImmOffs * Scale)
1174       << markup(">");
1175   }
1176   O << "]" << markup(">");
1177 }
1178
1179 void ARMInstPrinter::printThumbAddrModeImm5S1Operand(const MCInst *MI,
1180                                                      unsigned Op,
1181                                                      const MCSubtargetInfo &STI,
1182                                                      raw_ostream &O) {
1183   printThumbAddrModeImm5SOperand(MI, Op, STI, O, 1);
1184 }
1185
1186 void ARMInstPrinter::printThumbAddrModeImm5S2Operand(const MCInst *MI,
1187                                                      unsigned Op,
1188                                                      const MCSubtargetInfo &STI,
1189                                                      raw_ostream &O) {
1190   printThumbAddrModeImm5SOperand(MI, Op, STI, O, 2);
1191 }
1192
1193 void ARMInstPrinter::printThumbAddrModeImm5S4Operand(const MCInst *MI,
1194                                                      unsigned Op,
1195                                                      const MCSubtargetInfo &STI,
1196                                                      raw_ostream &O) {
1197   printThumbAddrModeImm5SOperand(MI, Op, STI, O, 4);
1198 }
1199
1200 void ARMInstPrinter::printThumbAddrModeSPOperand(const MCInst *MI, unsigned Op,
1201                                                  const MCSubtargetInfo &STI,
1202                                                  raw_ostream &O) {
1203   printThumbAddrModeImm5SOperand(MI, Op, STI, O, 4);
1204 }
1205
1206 // Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2
1207 // register with shift forms.
1208 // REG 0   0           - e.g. R5
1209 // REG IMM, SH_OPC     - e.g. R5, LSL #3
1210 void ARMInstPrinter::printT2SOOperand(const MCInst *MI, unsigned OpNum,
1211                                       const MCSubtargetInfo &STI,
1212                                       raw_ostream &O) {
1213   const MCOperand &MO1 = MI->getOperand(OpNum);
1214   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
1215
1216   unsigned Reg = MO1.getReg();
1217   printRegName(O, Reg);
1218
1219   // Print the shift opc.
1220   assert(MO2.isImm() && "Not a valid t2_so_reg value!");
1221   printRegImmShift(O, ARM_AM::getSORegShOp(MO2.getImm()),
1222                    ARM_AM::getSORegOffset(MO2.getImm()), UseMarkup);
1223 }
1224
1225 template <bool AlwaysPrintImm0>
1226 void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
1227                                                const MCSubtargetInfo &STI,
1228                                                raw_ostream &O) {
1229   const MCOperand &MO1 = MI->getOperand(OpNum);
1230   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
1231
1232   if (!MO1.isReg()) { // FIXME: This is for CP entries, but isn't right.
1233     printOperand(MI, OpNum, STI, O);
1234     return;
1235   }
1236
1237   O << markup("<mem:") << "[";
1238   printRegName(O, MO1.getReg());
1239
1240   int32_t OffImm = (int32_t)MO2.getImm();
1241   bool isSub = OffImm < 0;
1242   // Special value for #-0. All others are normal.
1243   if (OffImm == INT32_MIN)
1244     OffImm = 0;
1245   if (isSub) {
1246     O << ", " << markup("<imm:") << "#-" << formatImm(-OffImm) << markup(">");
1247   } else if (AlwaysPrintImm0 || OffImm > 0) {
1248     O << ", " << markup("<imm:") << "#" << formatImm(OffImm) << markup(">");
1249   }
1250   O << "]" << markup(">");
1251 }
1252
1253 template <bool AlwaysPrintImm0>
1254 void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst *MI,
1255                                                 unsigned OpNum,
1256                                                 const MCSubtargetInfo &STI,
1257                                                 raw_ostream &O) {
1258   const MCOperand &MO1 = MI->getOperand(OpNum);
1259   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
1260
1261   O << markup("<mem:") << "[";
1262   printRegName(O, MO1.getReg());
1263
1264   int32_t OffImm = (int32_t)MO2.getImm();
1265   bool isSub = OffImm < 0;
1266   // Don't print +0.
1267   if (OffImm == INT32_MIN)
1268     OffImm = 0;
1269   if (isSub) {
1270     O << ", " << markup("<imm:") << "#-" << -OffImm << markup(">");
1271   } else if (AlwaysPrintImm0 || OffImm > 0) {
1272     O << ", " << markup("<imm:") << "#" << OffImm << markup(">");
1273   }
1274   O << "]" << markup(">");
1275 }
1276
1277 template <bool AlwaysPrintImm0>
1278 void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst *MI,
1279                                                   unsigned OpNum,
1280                                                   const MCSubtargetInfo &STI,
1281                                                   raw_ostream &O) {
1282   const MCOperand &MO1 = MI->getOperand(OpNum);
1283   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
1284
1285   if (!MO1.isReg()) { //  For label symbolic references.
1286     printOperand(MI, OpNum, STI, O);
1287     return;
1288   }
1289
1290   O << markup("<mem:") << "[";
1291   printRegName(O, MO1.getReg());
1292
1293   int32_t OffImm = (int32_t)MO2.getImm();
1294   bool isSub = OffImm < 0;
1295
1296   assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
1297
1298   // Don't print +0.
1299   if (OffImm == INT32_MIN)
1300     OffImm = 0;
1301   if (isSub) {
1302     O << ", " << markup("<imm:") << "#-" << -OffImm << markup(">");
1303   } else if (AlwaysPrintImm0 || OffImm > 0) {
1304     O << ", " << markup("<imm:") << "#" << OffImm << markup(">");
1305   }
1306   O << "]" << markup(">");
1307 }
1308
1309 void ARMInstPrinter::printT2AddrModeImm0_1020s4Operand(
1310     const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI,
1311     raw_ostream &O) {
1312   const MCOperand &MO1 = MI->getOperand(OpNum);
1313   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
1314
1315   O << markup("<mem:") << "[";
1316   printRegName(O, MO1.getReg());
1317   if (MO2.getImm()) {
1318     O << ", " << markup("<imm:") << "#" << formatImm(MO2.getImm() * 4)
1319       << markup(">");
1320   }
1321   O << "]" << markup(">");
1322 }
1323
1324 void ARMInstPrinter::printT2AddrModeImm8OffsetOperand(
1325     const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI,
1326     raw_ostream &O) {
1327   const MCOperand &MO1 = MI->getOperand(OpNum);
1328   int32_t OffImm = (int32_t)MO1.getImm();
1329   O << ", " << markup("<imm:");
1330   if (OffImm == INT32_MIN)
1331     O << "#-0";
1332   else if (OffImm < 0)
1333     O << "#-" << -OffImm;
1334   else
1335     O << "#" << OffImm;
1336   O << markup(">");
1337 }
1338
1339 void ARMInstPrinter::printT2AddrModeImm8s4OffsetOperand(
1340     const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI,
1341     raw_ostream &O) {
1342   const MCOperand &MO1 = MI->getOperand(OpNum);
1343   int32_t OffImm = (int32_t)MO1.getImm();
1344
1345   assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
1346
1347   O << ", " << markup("<imm:");
1348   if (OffImm == INT32_MIN)
1349     O << "#-0";
1350   else if (OffImm < 0)
1351     O << "#-" << -OffImm;
1352   else
1353     O << "#" << OffImm;
1354   O << markup(">");
1355 }
1356
1357 void ARMInstPrinter::printT2AddrModeSoRegOperand(const MCInst *MI,
1358                                                  unsigned OpNum,
1359                                                  const MCSubtargetInfo &STI,
1360                                                  raw_ostream &O) {
1361   const MCOperand &MO1 = MI->getOperand(OpNum);
1362   const MCOperand &MO2 = MI->getOperand(OpNum + 1);
1363   const MCOperand &MO3 = MI->getOperand(OpNum + 2);
1364
1365   O << markup("<mem:") << "[";
1366   printRegName(O, MO1.getReg());
1367
1368   assert(MO2.getReg() && "Invalid so_reg load / store address!");
1369   O << ", ";
1370   printRegName(O, MO2.getReg());
1371
1372   unsigned ShAmt = MO3.getImm();
1373   if (ShAmt) {
1374     assert(ShAmt <= 3 && "Not a valid Thumb2 addressing mode!");
1375     O << ", lsl " << markup("<imm:") << "#" << ShAmt << markup(">");
1376   }
1377   O << "]" << markup(">");
1378 }
1379
1380 void ARMInstPrinter::printFPImmOperand(const MCInst *MI, unsigned OpNum,
1381                                        const MCSubtargetInfo &STI,
1382                                        raw_ostream &O) {
1383   const MCOperand &MO = MI->getOperand(OpNum);
1384   O << markup("<imm:") << '#' << ARM_AM::getFPImmFloat(MO.getImm())
1385     << markup(">");
1386 }
1387
1388 void ARMInstPrinter::printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
1389                                             const MCSubtargetInfo &STI,
1390                                             raw_ostream &O) {
1391   unsigned EncodedImm = MI->getOperand(OpNum).getImm();
1392   unsigned EltBits;
1393   uint64_t Val = ARM_AM::decodeNEONModImm(EncodedImm, EltBits);
1394   O << markup("<imm:") << "#0x";
1395   O.write_hex(Val);
1396   O << markup(">");
1397 }
1398
1399 void ARMInstPrinter::printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
1400                                             const MCSubtargetInfo &STI,
1401                                             raw_ostream &O) {
1402   unsigned Imm = MI->getOperand(OpNum).getImm();
1403   O << markup("<imm:") << "#" << formatImm(Imm + 1) << markup(">");
1404 }
1405
1406 void ARMInstPrinter::printRotImmOperand(const MCInst *MI, unsigned OpNum,
1407                                         const MCSubtargetInfo &STI,
1408                                         raw_ostream &O) {
1409   unsigned Imm = MI->getOperand(OpNum).getImm();
1410   if (Imm == 0)
1411     return;
1412   assert(Imm <= 3 && "illegal ror immediate!");
1413   O << ", ror " << markup("<imm:") << "#" << 8 * Imm << markup(">");
1414 }
1415
1416 void ARMInstPrinter::printModImmOperand(const MCInst *MI, unsigned OpNum,
1417                                         const MCSubtargetInfo &STI,
1418                                         raw_ostream &O) {
1419   MCOperand Op = MI->getOperand(OpNum);
1420
1421   // Support for fixups (MCFixup)
1422   if (Op.isExpr())
1423     return printOperand(MI, OpNum, STI, O);
1424
1425   unsigned Bits = Op.getImm() & 0xFF;
1426   unsigned Rot = (Op.getImm() & 0xF00) >> 7;
1427
1428   bool PrintUnsigned = false;
1429   switch (MI->getOpcode()) {
1430   case ARM::MOVi:
1431     // Movs to PC should be treated unsigned
1432     PrintUnsigned = (MI->getOperand(OpNum - 1).getReg() == ARM::PC);
1433     break;
1434   case ARM::MSRi:
1435     // Movs to special registers should be treated unsigned
1436     PrintUnsigned = true;
1437     break;
1438   }
1439
1440   int32_t Rotated = ARM_AM::rotr32(Bits, Rot);
1441   if (ARM_AM::getSOImmVal(Rotated) == Op.getImm()) {
1442     // #rot has the least possible value
1443     O << "#" << markup("<imm:");
1444     if (PrintUnsigned)
1445       O << static_cast<uint32_t>(Rotated);
1446     else
1447       O << Rotated;
1448     O << markup(">");
1449     return;
1450   }
1451
1452   // Explicit #bits, #rot implied
1453   O << "#" << markup("<imm:") << Bits << markup(">") << ", #" << markup("<imm:")
1454     << Rot << markup(">");
1455 }
1456
1457 void ARMInstPrinter::printFBits16(const MCInst *MI, unsigned OpNum,
1458                                   const MCSubtargetInfo &STI, raw_ostream &O) {
1459   O << markup("<imm:") << "#" << 16 - MI->getOperand(OpNum).getImm()
1460     << markup(">");
1461 }
1462
1463 void ARMInstPrinter::printFBits32(const MCInst *MI, unsigned OpNum,
1464                                   const MCSubtargetInfo &STI, raw_ostream &O) {
1465   O << markup("<imm:") << "#" << 32 - MI->getOperand(OpNum).getImm()
1466     << markup(">");
1467 }
1468
1469 void ARMInstPrinter::printVectorIndex(const MCInst *MI, unsigned OpNum,
1470                                       const MCSubtargetInfo &STI,
1471                                       raw_ostream &O) {
1472   O << "[" << MI->getOperand(OpNum).getImm() << "]";
1473 }
1474
1475 void ARMInstPrinter::printVectorListOne(const MCInst *MI, unsigned OpNum,
1476                                         const MCSubtargetInfo &STI,
1477                                         raw_ostream &O) {
1478   O << "{";
1479   printRegName(O, MI->getOperand(OpNum).getReg());
1480   O << "}";
1481 }
1482
1483 void ARMInstPrinter::printVectorListTwo(const MCInst *MI, unsigned OpNum,
1484                                         const MCSubtargetInfo &STI,
1485                                         raw_ostream &O) {
1486   unsigned Reg = MI->getOperand(OpNum).getReg();
1487   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1488   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_1);
1489   O << "{";
1490   printRegName(O, Reg0);
1491   O << ", ";
1492   printRegName(O, Reg1);
1493   O << "}";
1494 }
1495
1496 void ARMInstPrinter::printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
1497                                               const MCSubtargetInfo &STI,
1498                                               raw_ostream &O) {
1499   unsigned Reg = MI->getOperand(OpNum).getReg();
1500   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1501   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_2);
1502   O << "{";
1503   printRegName(O, Reg0);
1504   O << ", ";
1505   printRegName(O, Reg1);
1506   O << "}";
1507 }
1508
1509 void ARMInstPrinter::printVectorListThree(const MCInst *MI, unsigned OpNum,
1510                                           const MCSubtargetInfo &STI,
1511                                           raw_ostream &O) {
1512   // Normally, it's not safe to use register enum values directly with
1513   // addition to get the next register, but for VFP registers, the
1514   // sort order is guaranteed because they're all of the form D<n>.
1515   O << "{";
1516   printRegName(O, MI->getOperand(OpNum).getReg());
1517   O << ", ";
1518   printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1519   O << ", ";
1520   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1521   O << "}";
1522 }
1523
1524 void ARMInstPrinter::printVectorListFour(const MCInst *MI, unsigned OpNum,
1525                                          const MCSubtargetInfo &STI,
1526                                          raw_ostream &O) {
1527   // Normally, it's not safe to use register enum values directly with
1528   // addition to get the next register, but for VFP registers, the
1529   // sort order is guaranteed because they're all of the form D<n>.
1530   O << "{";
1531   printRegName(O, MI->getOperand(OpNum).getReg());
1532   O << ", ";
1533   printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1534   O << ", ";
1535   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1536   O << ", ";
1537   printRegName(O, MI->getOperand(OpNum).getReg() + 3);
1538   O << "}";
1539 }
1540
1541 void ARMInstPrinter::printVectorListOneAllLanes(const MCInst *MI,
1542                                                 unsigned OpNum,
1543                                                 const MCSubtargetInfo &STI,
1544                                                 raw_ostream &O) {
1545   O << "{";
1546   printRegName(O, MI->getOperand(OpNum).getReg());
1547   O << "[]}";
1548 }
1549
1550 void ARMInstPrinter::printVectorListTwoAllLanes(const MCInst *MI,
1551                                                 unsigned OpNum,
1552                                                 const MCSubtargetInfo &STI,
1553                                                 raw_ostream &O) {
1554   unsigned Reg = MI->getOperand(OpNum).getReg();
1555   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1556   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_1);
1557   O << "{";
1558   printRegName(O, Reg0);
1559   O << "[], ";
1560   printRegName(O, Reg1);
1561   O << "[]}";
1562 }
1563
1564 void ARMInstPrinter::printVectorListThreeAllLanes(const MCInst *MI,
1565                                                   unsigned OpNum,
1566                                                   const MCSubtargetInfo &STI,
1567                                                   raw_ostream &O) {
1568   // Normally, it's not safe to use register enum values directly with
1569   // addition to get the next register, but for VFP registers, the
1570   // sort order is guaranteed because they're all of the form D<n>.
1571   O << "{";
1572   printRegName(O, MI->getOperand(OpNum).getReg());
1573   O << "[], ";
1574   printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1575   O << "[], ";
1576   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1577   O << "[]}";
1578 }
1579
1580 void ARMInstPrinter::printVectorListFourAllLanes(const MCInst *MI,
1581                                                  unsigned OpNum,
1582                                                  const MCSubtargetInfo &STI,
1583                                                  raw_ostream &O) {
1584   // Normally, it's not safe to use register enum values directly with
1585   // addition to get the next register, but for VFP registers, the
1586   // sort order is guaranteed because they're all of the form D<n>.
1587   O << "{";
1588   printRegName(O, MI->getOperand(OpNum).getReg());
1589   O << "[], ";
1590   printRegName(O, MI->getOperand(OpNum).getReg() + 1);
1591   O << "[], ";
1592   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1593   O << "[], ";
1594   printRegName(O, MI->getOperand(OpNum).getReg() + 3);
1595   O << "[]}";
1596 }
1597
1598 void ARMInstPrinter::printVectorListTwoSpacedAllLanes(
1599     const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI,
1600     raw_ostream &O) {
1601   unsigned Reg = MI->getOperand(OpNum).getReg();
1602   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1603   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_2);
1604   O << "{";
1605   printRegName(O, Reg0);
1606   O << "[], ";
1607   printRegName(O, Reg1);
1608   O << "[]}";
1609 }
1610
1611 void ARMInstPrinter::printVectorListThreeSpacedAllLanes(
1612     const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI,
1613     raw_ostream &O) {
1614   // Normally, it's not safe to use register enum values directly with
1615   // addition to get the next register, but for VFP registers, the
1616   // sort order is guaranteed because they're all of the form D<n>.
1617   O << "{";
1618   printRegName(O, MI->getOperand(OpNum).getReg());
1619   O << "[], ";
1620   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1621   O << "[], ";
1622   printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1623   O << "[]}";
1624 }
1625
1626 void ARMInstPrinter::printVectorListFourSpacedAllLanes(
1627     const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI,
1628     raw_ostream &O) {
1629   // Normally, it's not safe to use register enum values directly with
1630   // addition to get the next register, but for VFP registers, the
1631   // sort order is guaranteed because they're all of the form D<n>.
1632   O << "{";
1633   printRegName(O, MI->getOperand(OpNum).getReg());
1634   O << "[], ";
1635   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1636   O << "[], ";
1637   printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1638   O << "[], ";
1639   printRegName(O, MI->getOperand(OpNum).getReg() + 6);
1640   O << "[]}";
1641 }
1642
1643 void ARMInstPrinter::printVectorListThreeSpaced(const MCInst *MI,
1644                                                 unsigned OpNum,
1645                                                 const MCSubtargetInfo &STI,
1646                                                 raw_ostream &O) {
1647   // Normally, it's not safe to use register enum values directly with
1648   // addition to get the next register, but for VFP registers, the
1649   // sort order is guaranteed because they're all of the form D<n>.
1650   O << "{";
1651   printRegName(O, MI->getOperand(OpNum).getReg());
1652   O << ", ";
1653   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1654   O << ", ";
1655   printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1656   O << "}";
1657 }
1658
1659 void ARMInstPrinter::printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
1660                                                const MCSubtargetInfo &STI,
1661                                                raw_ostream &O) {
1662   // Normally, it's not safe to use register enum values directly with
1663   // addition to get the next register, but for VFP registers, the
1664   // sort order is guaranteed because they're all of the form D<n>.
1665   O << "{";
1666   printRegName(O, MI->getOperand(OpNum).getReg());
1667   O << ", ";
1668   printRegName(O, MI->getOperand(OpNum).getReg() + 2);
1669   O << ", ";
1670   printRegName(O, MI->getOperand(OpNum).getReg() + 4);
1671   O << ", ";
1672   printRegName(O, MI->getOperand(OpNum).getReg() + 6);
1673   O << "}";
1674 }