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