Make MCRegisterInfo available to the the MCInstPrinter.
[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/ARMBaseInfo.h"
17 #include "MCTargetDesc/ARMAddressingModes.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCAsmInfo.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/Support/raw_ostream.h"
22 using namespace llvm;
23
24 #define GET_INSTRUCTION_NAME
25 #include "ARMGenAsmWriter.inc"
26
27 /// translateShiftImm - Convert shift immediate from 0-31 to 1-32 for printing.
28 ///
29 /// getSORegOffset returns an integer from 0-31, representing '32' as 0.
30 static unsigned translateShiftImm(unsigned imm) {
31   if (imm == 0)
32     return 32;
33   return imm;
34 }
35
36
37 ARMInstPrinter::ARMInstPrinter(const MCAsmInfo &MAI,
38                                const MCRegisterInfo &MRI,
39                                const MCSubtargetInfo &STI) :
40   MCInstPrinter(MAI, MRI) {
41   // Initialize the set of available features.
42   setAvailableFeatures(STI.getFeatureBits());
43 }
44
45 StringRef ARMInstPrinter::getOpcodeName(unsigned Opcode) const {
46   return getInstructionName(Opcode);
47 }
48
49 void ARMInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
50   OS << getRegisterName(RegNo);
51 }
52
53 void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
54                                StringRef Annot) {
55   unsigned Opcode = MI->getOpcode();
56
57   // Check for MOVs and print canonical forms, instead.
58   if (Opcode == ARM::MOVsr) {
59     // FIXME: Thumb variants?
60     const MCOperand &Dst = MI->getOperand(0);
61     const MCOperand &MO1 = MI->getOperand(1);
62     const MCOperand &MO2 = MI->getOperand(2);
63     const MCOperand &MO3 = MI->getOperand(3);
64
65     O << '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3.getImm()));
66     printSBitModifierOperand(MI, 6, O);
67     printPredicateOperand(MI, 4, O);
68
69     O << '\t' << getRegisterName(Dst.getReg())
70       << ", " << getRegisterName(MO1.getReg());
71
72     O << ", " << getRegisterName(MO2.getReg());
73     assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
74     printAnnotation(O, Annot);
75     return;
76   }
77
78   if (Opcode == ARM::MOVsi) {
79     // FIXME: Thumb variants?
80     const MCOperand &Dst = MI->getOperand(0);
81     const MCOperand &MO1 = MI->getOperand(1);
82     const MCOperand &MO2 = MI->getOperand(2);
83
84     O << '\t' << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO2.getImm()));
85     printSBitModifierOperand(MI, 5, O);
86     printPredicateOperand(MI, 3, O);
87
88     O << '\t' << getRegisterName(Dst.getReg())
89       << ", " << getRegisterName(MO1.getReg());
90
91     if (ARM_AM::getSORegShOp(MO2.getImm()) == ARM_AM::rrx) {
92       printAnnotation(O, Annot);
93       return;
94     }
95
96     O << ", #" << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm()));
97     printAnnotation(O, Annot);
98     return;
99   }
100
101
102   // A8.6.123 PUSH
103   if ((Opcode == ARM::STMDB_UPD || Opcode == ARM::t2STMDB_UPD) &&
104       MI->getOperand(0).getReg() == ARM::SP &&
105       MI->getNumOperands() > 5) {
106     // Should only print PUSH if there are at least two registers in the list.
107     O << '\t' << "push";
108     printPredicateOperand(MI, 2, O);
109     if (Opcode == ARM::t2STMDB_UPD)
110       O << ".w";
111     O << '\t';
112     printRegisterList(MI, 4, O);
113     printAnnotation(O, Annot);
114     return;
115   }
116   if (Opcode == ARM::STR_PRE_IMM && MI->getOperand(2).getReg() == ARM::SP &&
117       MI->getOperand(3).getImm() == -4) {
118     O << '\t' << "push";
119     printPredicateOperand(MI, 4, O);
120     O << "\t{" << getRegisterName(MI->getOperand(1).getReg()) << "}";
121     printAnnotation(O, Annot);
122     return;
123   }
124
125   // A8.6.122 POP
126   if ((Opcode == ARM::LDMIA_UPD || Opcode == ARM::t2LDMIA_UPD) &&
127       MI->getOperand(0).getReg() == ARM::SP &&
128       MI->getNumOperands() > 5) {
129     // Should only print POP if there are at least two registers in the list.
130     O << '\t' << "pop";
131     printPredicateOperand(MI, 2, O);
132     if (Opcode == ARM::t2LDMIA_UPD)
133       O << ".w";
134     O << '\t';
135     printRegisterList(MI, 4, O);
136     printAnnotation(O, Annot);
137     return;
138   }
139   if (Opcode == ARM::LDR_POST_IMM && MI->getOperand(2).getReg() == ARM::SP &&
140       MI->getOperand(4).getImm() == 4) {
141     O << '\t' << "pop";
142     printPredicateOperand(MI, 5, O);
143     O << "\t{" << getRegisterName(MI->getOperand(0).getReg()) << "}";
144     printAnnotation(O, Annot);
145     return;
146   }
147
148
149   // A8.6.355 VPUSH
150   if ((Opcode == ARM::VSTMSDB_UPD || Opcode == ARM::VSTMDDB_UPD) &&
151       MI->getOperand(0).getReg() == ARM::SP) {
152     O << '\t' << "vpush";
153     printPredicateOperand(MI, 2, O);
154     O << '\t';
155     printRegisterList(MI, 4, O);
156     printAnnotation(O, Annot);
157     return;
158   }
159
160   // A8.6.354 VPOP
161   if ((Opcode == ARM::VLDMSIA_UPD || Opcode == ARM::VLDMDIA_UPD) &&
162       MI->getOperand(0).getReg() == ARM::SP) {
163     O << '\t' << "vpop";
164     printPredicateOperand(MI, 2, O);
165     O << '\t';
166     printRegisterList(MI, 4, O);
167     printAnnotation(O, Annot);
168     return;
169   }
170
171   if (Opcode == ARM::tLDMIA) {
172     bool Writeback = true;
173     unsigned BaseReg = MI->getOperand(0).getReg();
174     for (unsigned i = 3; i < MI->getNumOperands(); ++i) {
175       if (MI->getOperand(i).getReg() == BaseReg)
176         Writeback = false;
177     }
178
179     O << "\tldm";
180
181     printPredicateOperand(MI, 1, O);
182     O << '\t' << getRegisterName(BaseReg);
183     if (Writeback) O << "!";
184     O << ", ";
185     printRegisterList(MI, 3, O);
186     printAnnotation(O, Annot);
187     return;
188   }
189
190   // Thumb1 NOP
191   if (Opcode == ARM::tMOVr && MI->getOperand(0).getReg() == ARM::R8 &&
192       MI->getOperand(1).getReg() == ARM::R8) {
193     O << "\tnop";
194     printPredicateOperand(MI, 2, O);
195     printAnnotation(O, Annot);
196     return;
197   }
198
199   printInstruction(MI, O);
200   printAnnotation(O, Annot);
201 }
202
203 void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
204                                   raw_ostream &O) {
205   const MCOperand &Op = MI->getOperand(OpNo);
206   if (Op.isReg()) {
207     unsigned Reg = Op.getReg();
208     O << getRegisterName(Reg);
209   } else if (Op.isImm()) {
210     O << '#' << Op.getImm();
211   } else {
212     assert(Op.isExpr() && "unknown operand kind in printOperand");
213     // If a symbolic branch target was added as a constant expression then print
214     // that address in hex.
215     const MCConstantExpr *BranchTarget = dyn_cast<MCConstantExpr>(Op.getExpr());
216     int64_t Address;
217     if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) {
218       O << "0x";
219       O.write_hex(Address);
220     }
221     else {
222       // Otherwise, just print the expression.
223       O << *Op.getExpr();
224     }
225   }
226 }
227
228 void ARMInstPrinter::printT2LdrLabelOperand(const MCInst *MI, unsigned OpNum,
229                                        raw_ostream &O) {
230   const MCOperand &MO1 = MI->getOperand(OpNum);
231   if (MO1.isExpr())
232     O << *MO1.getExpr();
233   else if (MO1.isImm())
234     O << "[pc, #" << MO1.getImm() << "]";
235   else
236     llvm_unreachable("Unknown LDR label operand?");
237 }
238
239 // so_reg is a 4-operand unit corresponding to register forms of the A5.1
240 // "Addressing Mode 1 - Data-processing operands" forms.  This includes:
241 //    REG 0   0           - e.g. R5
242 //    REG REG 0,SH_OPC    - e.g. R5, ROR R3
243 //    REG 0   IMM,SH_OPC  - e.g. R5, LSL #3
244 void ARMInstPrinter::printSORegRegOperand(const MCInst *MI, unsigned OpNum,
245                                        raw_ostream &O) {
246   const MCOperand &MO1 = MI->getOperand(OpNum);
247   const MCOperand &MO2 = MI->getOperand(OpNum+1);
248   const MCOperand &MO3 = MI->getOperand(OpNum+2);
249
250   O << getRegisterName(MO1.getReg());
251
252   // Print the shift opc.
253   ARM_AM::ShiftOpc ShOpc = ARM_AM::getSORegShOp(MO3.getImm());
254   O << ", " << ARM_AM::getShiftOpcStr(ShOpc);
255   if (ShOpc == ARM_AM::rrx)
256     return;
257
258   O << ' ' << getRegisterName(MO2.getReg());
259   assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
260 }
261
262 void ARMInstPrinter::printSORegImmOperand(const MCInst *MI, unsigned OpNum,
263                                        raw_ostream &O) {
264   const MCOperand &MO1 = MI->getOperand(OpNum);
265   const MCOperand &MO2 = MI->getOperand(OpNum+1);
266
267   O << getRegisterName(MO1.getReg());
268
269   // Print the shift opc.
270   ARM_AM::ShiftOpc ShOpc = ARM_AM::getSORegShOp(MO2.getImm());
271   O << ", " << ARM_AM::getShiftOpcStr(ShOpc);
272   if (ShOpc == ARM_AM::rrx)
273     return;
274   O << " #" << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm()));
275 }
276
277
278 //===--------------------------------------------------------------------===//
279 // Addressing Mode #2
280 //===--------------------------------------------------------------------===//
281
282 void ARMInstPrinter::printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
283                                                 raw_ostream &O) {
284   const MCOperand &MO1 = MI->getOperand(Op);
285   const MCOperand &MO2 = MI->getOperand(Op+1);
286   const MCOperand &MO3 = MI->getOperand(Op+2);
287
288   O << "[" << getRegisterName(MO1.getReg());
289
290   if (!MO2.getReg()) {
291     if (ARM_AM::getAM2Offset(MO3.getImm())) // Don't print +0.
292       O << ", #"
293         << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
294         << ARM_AM::getAM2Offset(MO3.getImm());
295     O << "]";
296     return;
297   }
298
299   O << ", "
300     << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
301     << getRegisterName(MO2.getReg());
302
303   if (unsigned ShImm = ARM_AM::getAM2Offset(MO3.getImm()))
304     O << ", "
305     << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO3.getImm()))
306     << " #" << ShImm;
307   O << "]";
308 }
309
310 void ARMInstPrinter::printAM2PostIndexOp(const MCInst *MI, unsigned Op,
311                                          raw_ostream &O) {
312   const MCOperand &MO1 = MI->getOperand(Op);
313   const MCOperand &MO2 = MI->getOperand(Op+1);
314   const MCOperand &MO3 = MI->getOperand(Op+2);
315
316   O << "[" << getRegisterName(MO1.getReg()) << "], ";
317
318   if (!MO2.getReg()) {
319     unsigned ImmOffs = ARM_AM::getAM2Offset(MO3.getImm());
320     O << '#'
321       << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
322       << ImmOffs;
323     return;
324   }
325
326   O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
327     << getRegisterName(MO2.getReg());
328
329   if (unsigned ShImm = ARM_AM::getAM2Offset(MO3.getImm()))
330     O << ", "
331     << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO3.getImm()))
332     << " #" << ShImm;
333 }
334
335 void ARMInstPrinter::printAddrModeTBB(const MCInst *MI, unsigned Op,
336                                            raw_ostream &O) {
337   const MCOperand &MO1 = MI->getOperand(Op);
338   const MCOperand &MO2 = MI->getOperand(Op+1);
339   O << "[" << getRegisterName(MO1.getReg()) << ", "
340     << getRegisterName(MO2.getReg()) << "]";
341 }
342
343 void ARMInstPrinter::printAddrModeTBH(const MCInst *MI, unsigned Op,
344                                            raw_ostream &O) {
345   const MCOperand &MO1 = MI->getOperand(Op);
346   const MCOperand &MO2 = MI->getOperand(Op+1);
347   O << "[" << getRegisterName(MO1.getReg()) << ", "
348     << getRegisterName(MO2.getReg()) << ", lsl #1]";
349 }
350
351 void ARMInstPrinter::printAddrMode2Operand(const MCInst *MI, unsigned Op,
352                                            raw_ostream &O) {
353   const MCOperand &MO1 = MI->getOperand(Op);
354
355   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
356     printOperand(MI, Op, O);
357     return;
358   }
359
360   const MCOperand &MO3 = MI->getOperand(Op+2);
361   unsigned IdxMode = ARM_AM::getAM2IdxMode(MO3.getImm());
362
363   if (IdxMode == ARMII::IndexModePost) {
364     printAM2PostIndexOp(MI, Op, O);
365     return;
366   }
367   printAM2PreOrOffsetIndexOp(MI, Op, O);
368 }
369
370 void ARMInstPrinter::printAddrMode2OffsetOperand(const MCInst *MI,
371                                                  unsigned OpNum,
372                                                  raw_ostream &O) {
373   const MCOperand &MO1 = MI->getOperand(OpNum);
374   const MCOperand &MO2 = MI->getOperand(OpNum+1);
375
376   if (!MO1.getReg()) {
377     unsigned ImmOffs = ARM_AM::getAM2Offset(MO2.getImm());
378     O << '#'
379       << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()))
380       << ImmOffs;
381     return;
382   }
383
384   O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()))
385     << getRegisterName(MO1.getReg());
386
387   if (unsigned ShImm = ARM_AM::getAM2Offset(MO2.getImm()))
388     O << ", "
389     << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO2.getImm()))
390     << " #" << ShImm;
391 }
392
393 //===--------------------------------------------------------------------===//
394 // Addressing Mode #3
395 //===--------------------------------------------------------------------===//
396
397 void ARMInstPrinter::printAM3PostIndexOp(const MCInst *MI, unsigned Op,
398                                          raw_ostream &O) {
399   const MCOperand &MO1 = MI->getOperand(Op);
400   const MCOperand &MO2 = MI->getOperand(Op+1);
401   const MCOperand &MO3 = MI->getOperand(Op+2);
402
403   O << "[" << getRegisterName(MO1.getReg()) << "], ";
404
405   if (MO2.getReg()) {
406     O << (char)ARM_AM::getAM3Op(MO3.getImm())
407     << getRegisterName(MO2.getReg());
408     return;
409   }
410
411   unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
412   O << '#'
413     << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()))
414     << ImmOffs;
415 }
416
417 void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
418                                                 raw_ostream &O) {
419   const MCOperand &MO1 = MI->getOperand(Op);
420   const MCOperand &MO2 = MI->getOperand(Op+1);
421   const MCOperand &MO3 = MI->getOperand(Op+2);
422
423   O << '[' << getRegisterName(MO1.getReg());
424
425   if (MO2.getReg()) {
426     O << ", " << getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()))
427       << getRegisterName(MO2.getReg()) << ']';
428     return;
429   }
430
431   if (unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm()))
432     O << ", #"
433       << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()))
434       << ImmOffs;
435   O << ']';
436 }
437
438 void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
439                                            raw_ostream &O) {
440   const MCOperand &MO1 = MI->getOperand(Op);
441   if (!MO1.isReg()) {   //  For label symbolic references.
442     printOperand(MI, Op, O);
443     return;
444   }
445
446   const MCOperand &MO3 = MI->getOperand(Op+2);
447   unsigned IdxMode = ARM_AM::getAM3IdxMode(MO3.getImm());
448
449   if (IdxMode == ARMII::IndexModePost) {
450     printAM3PostIndexOp(MI, Op, O);
451     return;
452   }
453   printAM3PreOrOffsetIndexOp(MI, Op, O);
454 }
455
456 void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst *MI,
457                                                  unsigned OpNum,
458                                                  raw_ostream &O) {
459   const MCOperand &MO1 = MI->getOperand(OpNum);
460   const MCOperand &MO2 = MI->getOperand(OpNum+1);
461
462   if (MO1.getReg()) {
463     O << getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()))
464       << getRegisterName(MO1.getReg());
465     return;
466   }
467
468   unsigned ImmOffs = ARM_AM::getAM3Offset(MO2.getImm());
469   O << '#'
470     << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()))
471     << ImmOffs;
472 }
473
474 void ARMInstPrinter::printPostIdxImm8Operand(const MCInst *MI,
475                                              unsigned OpNum,
476                                              raw_ostream &O) {
477   const MCOperand &MO = MI->getOperand(OpNum);
478   unsigned Imm = MO.getImm();
479   O << '#' << ((Imm & 256) ? "" : "-") << (Imm & 0xff);
480 }
481
482 void ARMInstPrinter::printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
483                                             raw_ostream &O) {
484   const MCOperand &MO1 = MI->getOperand(OpNum);
485   const MCOperand &MO2 = MI->getOperand(OpNum+1);
486
487   O << (MO2.getImm() ? "" : "-") << getRegisterName(MO1.getReg());
488 }
489
490 void ARMInstPrinter::printPostIdxImm8s4Operand(const MCInst *MI,
491                                              unsigned OpNum,
492                                              raw_ostream &O) {
493   const MCOperand &MO = MI->getOperand(OpNum);
494   unsigned Imm = MO.getImm();
495   O << '#' << ((Imm & 256) ? "" : "-") << ((Imm & 0xff) << 2);
496 }
497
498
499 void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
500                                            raw_ostream &O) {
501   ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MI->getOperand(OpNum)
502                                                  .getImm());
503   O << ARM_AM::getAMSubModeStr(Mode);
504 }
505
506 void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
507                                            raw_ostream &O) {
508   const MCOperand &MO1 = MI->getOperand(OpNum);
509   const MCOperand &MO2 = MI->getOperand(OpNum+1);
510
511   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
512     printOperand(MI, OpNum, O);
513     return;
514   }
515
516   O << "[" << getRegisterName(MO1.getReg());
517
518   unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm());
519   unsigned Op = ARM_AM::getAM5Op(MO2.getImm());
520   if (ImmOffs || Op == ARM_AM::sub) {
521     O << ", #"
522       << ARM_AM::getAddrOpcStr(ARM_AM::getAM5Op(MO2.getImm()))
523       << ImmOffs * 4;
524   }
525   O << "]";
526 }
527
528 void ARMInstPrinter::printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
529                                            raw_ostream &O) {
530   const MCOperand &MO1 = MI->getOperand(OpNum);
531   const MCOperand &MO2 = MI->getOperand(OpNum+1);
532
533   O << "[" << getRegisterName(MO1.getReg());
534   if (MO2.getImm()) {
535     // FIXME: Both darwin as and GNU as violate ARM docs here.
536     O << ", :" << (MO2.getImm() << 3);
537   }
538   O << "]";
539 }
540
541 void ARMInstPrinter::printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
542                                            raw_ostream &O) {
543   const MCOperand &MO1 = MI->getOperand(OpNum);
544   O << "[" << getRegisterName(MO1.getReg()) << "]";
545 }
546
547 void ARMInstPrinter::printAddrMode6OffsetOperand(const MCInst *MI,
548                                                  unsigned OpNum,
549                                                  raw_ostream &O) {
550   const MCOperand &MO = MI->getOperand(OpNum);
551   if (MO.getReg() == 0)
552     O << "!";
553   else
554     O << ", " << getRegisterName(MO.getReg());
555 }
556
557 void ARMInstPrinter::printBitfieldInvMaskImmOperand(const MCInst *MI,
558                                                     unsigned OpNum,
559                                                     raw_ostream &O) {
560   const MCOperand &MO = MI->getOperand(OpNum);
561   uint32_t v = ~MO.getImm();
562   int32_t lsb = CountTrailingZeros_32(v);
563   int32_t width = (32 - CountLeadingZeros_32 (v)) - lsb;
564   assert(MO.isImm() && "Not a valid bf_inv_mask_imm value!");
565   O << '#' << lsb << ", #" << width;
566 }
567
568 void ARMInstPrinter::printMemBOption(const MCInst *MI, unsigned OpNum,
569                                      raw_ostream &O) {
570   unsigned val = MI->getOperand(OpNum).getImm();
571   O << ARM_MB::MemBOptToString(val);
572 }
573
574 void ARMInstPrinter::printShiftImmOperand(const MCInst *MI, unsigned OpNum,
575                                           raw_ostream &O) {
576   unsigned ShiftOp = MI->getOperand(OpNum).getImm();
577   bool isASR = (ShiftOp & (1 << 5)) != 0;
578   unsigned Amt = ShiftOp & 0x1f;
579   if (isASR)
580     O << ", asr #" << (Amt == 0 ? 32 : Amt);
581   else if (Amt)
582     O << ", lsl #" << Amt;
583 }
584
585 void ARMInstPrinter::printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
586                                          raw_ostream &O) {
587   unsigned Imm = MI->getOperand(OpNum).getImm();
588   if (Imm == 0)
589     return;
590   assert(Imm > 0 && Imm < 32 && "Invalid PKH shift immediate value!");
591   O << ", lsl #" << Imm;
592 }
593
594 void ARMInstPrinter::printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
595                                          raw_ostream &O) {
596   unsigned Imm = MI->getOperand(OpNum).getImm();
597   // A shift amount of 32 is encoded as 0.
598   if (Imm == 0)
599     Imm = 32;
600   assert(Imm > 0 && Imm <= 32 && "Invalid PKH shift immediate value!");
601   O << ", asr #" << Imm;
602 }
603
604 void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum,
605                                        raw_ostream &O) {
606   O << "{";
607   for (unsigned i = OpNum, e = MI->getNumOperands(); i != e; ++i) {
608     if (i != OpNum) O << ", ";
609     O << getRegisterName(MI->getOperand(i).getReg());
610   }
611   O << "}";
612 }
613
614 void ARMInstPrinter::printSetendOperand(const MCInst *MI, unsigned OpNum,
615                                         raw_ostream &O) {
616   const MCOperand &Op = MI->getOperand(OpNum);
617   if (Op.getImm())
618     O << "be";
619   else
620     O << "le";
621 }
622
623 void ARMInstPrinter::printCPSIMod(const MCInst *MI, unsigned OpNum,
624                                   raw_ostream &O) {
625   const MCOperand &Op = MI->getOperand(OpNum);
626   O << ARM_PROC::IModToString(Op.getImm());
627 }
628
629 void ARMInstPrinter::printCPSIFlag(const MCInst *MI, unsigned OpNum,
630                                    raw_ostream &O) {
631   const MCOperand &Op = MI->getOperand(OpNum);
632   unsigned IFlags = Op.getImm();
633   for (int i=2; i >= 0; --i)
634     if (IFlags & (1 << i))
635       O << ARM_PROC::IFlagsToString(1 << i);
636
637   if (IFlags == 0)
638     O << "none";
639 }
640
641 void ARMInstPrinter::printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
642                                          raw_ostream &O) {
643   const MCOperand &Op = MI->getOperand(OpNum);
644   unsigned SpecRegRBit = Op.getImm() >> 4;
645   unsigned Mask = Op.getImm() & 0xf;
646
647   if (getAvailableFeatures() & ARM::FeatureMClass) {
648     switch (Op.getImm()) {
649     default: llvm_unreachable("Unexpected mask value!");
650     case 0: O << "apsr"; return;
651     case 1: O << "iapsr"; return;
652     case 2: O << "eapsr"; return;
653     case 3: O << "xpsr"; return;
654     case 5: O << "ipsr"; return;
655     case 6: O << "epsr"; return;
656     case 7: O << "iepsr"; return;
657     case 8: O << "msp"; return;
658     case 9: O << "psp"; return;
659     case 16: O << "primask"; return;
660     case 17: O << "basepri"; return;
661     case 18: O << "basepri_max"; return;
662     case 19: O << "faultmask"; return;
663     case 20: O << "control"; return;
664     }
665   }
666
667   // As special cases, CPSR_f, CPSR_s and CPSR_fs prefer printing as
668   // APSR_nzcvq, APSR_g and APSRnzcvqg, respectively.
669   if (!SpecRegRBit && (Mask == 8 || Mask == 4 || Mask == 12)) {
670     O << "APSR_";
671     switch (Mask) {
672     default: llvm_unreachable("Unexpected mask value!");
673     case 4:  O << "g"; return;
674     case 8:  O << "nzcvq"; return;
675     case 12: O << "nzcvqg"; return;
676     }
677   }
678
679   if (SpecRegRBit)
680     O << "SPSR";
681   else
682     O << "CPSR";
683
684   if (Mask) {
685     O << '_';
686     if (Mask & 8) O << 'f';
687     if (Mask & 4) O << 's';
688     if (Mask & 2) O << 'x';
689     if (Mask & 1) O << 'c';
690   }
691 }
692
693 void ARMInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNum,
694                                            raw_ostream &O) {
695   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
696   // Handle the undefined 15 CC value here for printing so we don't abort().
697   if ((unsigned)CC == 15)
698     O << "<und>";
699   else if (CC != ARMCC::AL)
700     O << ARMCondCodeToString(CC);
701 }
702
703 void ARMInstPrinter::printMandatoryPredicateOperand(const MCInst *MI,
704                                                     unsigned OpNum,
705                                                     raw_ostream &O) {
706   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
707   O << ARMCondCodeToString(CC);
708 }
709
710 void ARMInstPrinter::printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
711                                               raw_ostream &O) {
712   if (MI->getOperand(OpNum).getReg()) {
713     assert(MI->getOperand(OpNum).getReg() == ARM::CPSR &&
714            "Expect ARM CPSR register!");
715     O << 's';
716   }
717 }
718
719 void ARMInstPrinter::printNoHashImmediate(const MCInst *MI, unsigned OpNum,
720                                           raw_ostream &O) {
721   O << MI->getOperand(OpNum).getImm();
722 }
723
724 void ARMInstPrinter::printPImmediate(const MCInst *MI, unsigned OpNum,
725                                      raw_ostream &O) {
726   O << "p" << MI->getOperand(OpNum).getImm();
727 }
728
729 void ARMInstPrinter::printCImmediate(const MCInst *MI, unsigned OpNum,
730                                      raw_ostream &O) {
731   O << "c" << MI->getOperand(OpNum).getImm();
732 }
733
734 void ARMInstPrinter::printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
735                                           raw_ostream &O) {
736   O << "{" << MI->getOperand(OpNum).getImm() << "}";
737 }
738
739 void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum,
740                                   raw_ostream &O) {
741   llvm_unreachable("Unhandled PC-relative pseudo-instruction!");
742 }
743
744 void ARMInstPrinter::printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
745                                             raw_ostream &O) {
746   O << "#" << MI->getOperand(OpNum).getImm() * 4;
747 }
748
749 void ARMInstPrinter::printThumbSRImm(const MCInst *MI, unsigned OpNum,
750                                      raw_ostream &O) {
751   unsigned Imm = MI->getOperand(OpNum).getImm();
752   O << "#" << (Imm == 0 ? 32 : Imm);
753 }
754
755 void ARMInstPrinter::printThumbITMask(const MCInst *MI, unsigned OpNum,
756                                       raw_ostream &O) {
757   // (3 - the number of trailing zeros) is the number of then / else.
758   unsigned Mask = MI->getOperand(OpNum).getImm();
759   unsigned CondBit0 = Mask >> 4 & 1;
760   unsigned NumTZ = CountTrailingZeros_32(Mask);
761   assert(NumTZ <= 3 && "Invalid IT mask!");
762   for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) {
763     bool T = ((Mask >> Pos) & 1) == CondBit0;
764     if (T)
765       O << 't';
766     else
767       O << 'e';
768   }
769 }
770
771 void ARMInstPrinter::printThumbAddrModeRROperand(const MCInst *MI, unsigned Op,
772                                                  raw_ostream &O) {
773   const MCOperand &MO1 = MI->getOperand(Op);
774   const MCOperand &MO2 = MI->getOperand(Op + 1);
775
776   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
777     printOperand(MI, Op, O);
778     return;
779   }
780
781   O << "[" << getRegisterName(MO1.getReg());
782   if (unsigned RegNum = MO2.getReg())
783     O << ", " << getRegisterName(RegNum);
784   O << "]";
785 }
786
787 void ARMInstPrinter::printThumbAddrModeImm5SOperand(const MCInst *MI,
788                                                     unsigned Op,
789                                                     raw_ostream &O,
790                                                     unsigned Scale) {
791   const MCOperand &MO1 = MI->getOperand(Op);
792   const MCOperand &MO2 = MI->getOperand(Op + 1);
793
794   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
795     printOperand(MI, Op, O);
796     return;
797   }
798
799   O << "[" << getRegisterName(MO1.getReg());
800   if (unsigned ImmOffs = MO2.getImm())
801     O << ", #" << ImmOffs * Scale;
802   O << "]";
803 }
804
805 void ARMInstPrinter::printThumbAddrModeImm5S1Operand(const MCInst *MI,
806                                                      unsigned Op,
807                                                      raw_ostream &O) {
808   printThumbAddrModeImm5SOperand(MI, Op, O, 1);
809 }
810
811 void ARMInstPrinter::printThumbAddrModeImm5S2Operand(const MCInst *MI,
812                                                      unsigned Op,
813                                                      raw_ostream &O) {
814   printThumbAddrModeImm5SOperand(MI, Op, O, 2);
815 }
816
817 void ARMInstPrinter::printThumbAddrModeImm5S4Operand(const MCInst *MI,
818                                                      unsigned Op,
819                                                      raw_ostream &O) {
820   printThumbAddrModeImm5SOperand(MI, Op, O, 4);
821 }
822
823 void ARMInstPrinter::printThumbAddrModeSPOperand(const MCInst *MI, unsigned Op,
824                                                  raw_ostream &O) {
825   printThumbAddrModeImm5SOperand(MI, Op, O, 4);
826 }
827
828 // Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2
829 // register with shift forms.
830 // REG 0   0           - e.g. R5
831 // REG IMM, SH_OPC     - e.g. R5, LSL #3
832 void ARMInstPrinter::printT2SOOperand(const MCInst *MI, unsigned OpNum,
833                                       raw_ostream &O) {
834   const MCOperand &MO1 = MI->getOperand(OpNum);
835   const MCOperand &MO2 = MI->getOperand(OpNum+1);
836
837   unsigned Reg = MO1.getReg();
838   O << getRegisterName(Reg);
839
840   // Print the shift opc.
841   assert(MO2.isImm() && "Not a valid t2_so_reg value!");
842   ARM_AM::ShiftOpc ShOpc = ARM_AM::getSORegShOp(MO2.getImm());
843   O << ", " << ARM_AM::getShiftOpcStr(ShOpc);
844   if (ShOpc != ARM_AM::rrx)
845     O << " #" << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm()));
846 }
847
848 void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
849                                                raw_ostream &O) {
850   const MCOperand &MO1 = MI->getOperand(OpNum);
851   const MCOperand &MO2 = MI->getOperand(OpNum+1);
852
853   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
854     printOperand(MI, OpNum, O);
855     return;
856   }
857
858   O << "[" << getRegisterName(MO1.getReg());
859
860   int32_t OffImm = (int32_t)MO2.getImm();
861   bool isSub = OffImm < 0;
862   // Special value for #-0. All others are normal.
863   if (OffImm == INT32_MIN)
864     OffImm = 0;
865   if (isSub)
866     O << ", #-" << -OffImm;
867   else if (OffImm > 0)
868     O << ", #" << OffImm;
869   O << "]";
870 }
871
872 void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst *MI,
873                                                 unsigned OpNum,
874                                                 raw_ostream &O) {
875   const MCOperand &MO1 = MI->getOperand(OpNum);
876   const MCOperand &MO2 = MI->getOperand(OpNum+1);
877
878   O << "[" << getRegisterName(MO1.getReg());
879
880   int32_t OffImm = (int32_t)MO2.getImm();
881   // Don't print +0.
882   if (OffImm == INT32_MIN)
883     O << ", #-0";
884   else if (OffImm < 0)
885     O << ", #-" << -OffImm;
886   else if (OffImm > 0)
887     O << ", #" << OffImm;
888   O << "]";
889 }
890
891 void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst *MI,
892                                                   unsigned OpNum,
893                                                   raw_ostream &O) {
894   const MCOperand &MO1 = MI->getOperand(OpNum);
895   const MCOperand &MO2 = MI->getOperand(OpNum+1);
896
897   if (!MO1.isReg()) {   //  For label symbolic references.
898     printOperand(MI, OpNum, O);
899     return;
900   }
901
902   O << "[" << getRegisterName(MO1.getReg());
903
904   int32_t OffImm = (int32_t)MO2.getImm() / 4;
905   // Don't print +0.
906   if (OffImm < 0)
907     O << ", #-" << -OffImm * 4;
908   else if (OffImm > 0)
909     O << ", #" << OffImm * 4;
910   O << "]";
911 }
912
913 void ARMInstPrinter::printT2AddrModeImm0_1020s4Operand(const MCInst *MI,
914                                                        unsigned OpNum,
915                                                        raw_ostream &O) {
916   const MCOperand &MO1 = MI->getOperand(OpNum);
917   const MCOperand &MO2 = MI->getOperand(OpNum+1);
918
919   O << "[" << getRegisterName(MO1.getReg());
920   if (MO2.getImm())
921     O << ", #" << MO2.getImm() * 4;
922   O << "]";
923 }
924
925 void ARMInstPrinter::printT2AddrModeImm8OffsetOperand(const MCInst *MI,
926                                                       unsigned OpNum,
927                                                       raw_ostream &O) {
928   const MCOperand &MO1 = MI->getOperand(OpNum);
929   int32_t OffImm = (int32_t)MO1.getImm();
930   // Don't print +0.
931   if (OffImm < 0)
932     O << ", #-" << -OffImm;
933   else
934     O << ", #" << OffImm;
935 }
936
937 void ARMInstPrinter::printT2AddrModeImm8s4OffsetOperand(const MCInst *MI,
938                                                         unsigned OpNum,
939                                                         raw_ostream &O) {
940   const MCOperand &MO1 = MI->getOperand(OpNum);
941   int32_t OffImm = (int32_t)MO1.getImm() / 4;
942   // Don't print +0.
943   if (OffImm != 0) {
944     O << ", ";
945     if (OffImm < 0)
946       O << "#-" << -OffImm * 4;
947     else if (OffImm > 0)
948       O << "#" << OffImm * 4;
949   }
950 }
951
952 void ARMInstPrinter::printT2AddrModeSoRegOperand(const MCInst *MI,
953                                                  unsigned OpNum,
954                                                  raw_ostream &O) {
955   const MCOperand &MO1 = MI->getOperand(OpNum);
956   const MCOperand &MO2 = MI->getOperand(OpNum+1);
957   const MCOperand &MO3 = MI->getOperand(OpNum+2);
958
959   O << "[" << getRegisterName(MO1.getReg());
960
961   assert(MO2.getReg() && "Invalid so_reg load / store address!");
962   O << ", " << getRegisterName(MO2.getReg());
963
964   unsigned ShAmt = MO3.getImm();
965   if (ShAmt) {
966     assert(ShAmt <= 3 && "Not a valid Thumb2 addressing mode!");
967     O << ", lsl #" << ShAmt;
968   }
969   O << "]";
970 }
971
972 void ARMInstPrinter::printFPImmOperand(const MCInst *MI, unsigned OpNum,
973                                        raw_ostream &O) {
974   const MCOperand &MO = MI->getOperand(OpNum);
975   O << '#' << ARM_AM::getFPImmFloat(MO.getImm());
976 }
977
978 void ARMInstPrinter::printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
979                                             raw_ostream &O) {
980   unsigned EncodedImm = MI->getOperand(OpNum).getImm();
981   unsigned EltBits;
982   uint64_t Val = ARM_AM::decodeNEONModImm(EncodedImm, EltBits);
983   O << "#0x";
984   O.write_hex(Val);
985 }
986
987 void ARMInstPrinter::printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
988                                             raw_ostream &O) {
989   unsigned Imm = MI->getOperand(OpNum).getImm();
990   O << "#" << Imm + 1;
991 }
992
993 void ARMInstPrinter::printRotImmOperand(const MCInst *MI, unsigned OpNum,
994                                         raw_ostream &O) {
995   unsigned Imm = MI->getOperand(OpNum).getImm();
996   if (Imm == 0)
997     return;
998   O << ", ror #";
999   switch (Imm) {
1000   default: assert (0 && "illegal ror immediate!");
1001   case 1: O << "8"; break;
1002   case 2: O << "16"; break;
1003   case 3: O << "24"; break;
1004   }
1005 }
1006
1007 void ARMInstPrinter::printFBits16(const MCInst *MI, unsigned OpNum,
1008                                   raw_ostream &O) {
1009   O << "#" << 16 - MI->getOperand(OpNum).getImm();
1010 }
1011
1012 void ARMInstPrinter::printFBits32(const MCInst *MI, unsigned OpNum,
1013                                   raw_ostream &O) {
1014   O << "#" << 32 - MI->getOperand(OpNum).getImm();
1015 }
1016
1017 void ARMInstPrinter::printVectorIndex(const MCInst *MI, unsigned OpNum,
1018                                       raw_ostream &O) {
1019   O << "[" << MI->getOperand(OpNum).getImm() << "]";
1020 }
1021
1022 void ARMInstPrinter::printVectorListOne(const MCInst *MI, unsigned OpNum,
1023                                         raw_ostream &O) {
1024   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "}";
1025 }
1026
1027 void ARMInstPrinter::printVectorListTwo(const MCInst *MI, unsigned OpNum,
1028                                         raw_ostream &O) {
1029   // Normally, it's not safe to use register enum values directly with
1030   // addition to get the next register, but for VFP registers, the
1031   // sort order is guaranteed because they're all of the form D<n>.
1032   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1033     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << "}";
1034 }
1035
1036 void ARMInstPrinter::printVectorListThree(const MCInst *MI, unsigned OpNum,
1037                                           raw_ostream &O) {
1038   // Normally, it's not safe to use register enum values directly with
1039   // addition to get the next register, but for VFP registers, the
1040   // sort order is guaranteed because they're all of the form D<n>.
1041   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1042     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << ", "
1043     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "}";
1044 }
1045
1046 void ARMInstPrinter::printVectorListFour(const MCInst *MI, unsigned OpNum,
1047                                          raw_ostream &O) {
1048   // Normally, it's not safe to use register enum values directly with
1049   // addition to get the next register, but for VFP registers, the
1050   // sort order is guaranteed because they're all of the form D<n>.
1051   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1052     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << ", "
1053     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << ", "
1054     << getRegisterName(MI->getOperand(OpNum).getReg() + 3) << "}";
1055 }
1056
1057 void ARMInstPrinter::printVectorListOneAllLanes(const MCInst *MI,
1058                                                 unsigned OpNum,
1059                                                 raw_ostream &O) {
1060   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[]}";
1061 }
1062
1063 void ARMInstPrinter::printVectorListTwoAllLanes(const MCInst *MI,
1064                                                 unsigned OpNum,
1065                                                 raw_ostream &O) {
1066   // Normally, it's not safe to use register enum values directly with
1067   // addition to get the next register, but for VFP registers, the
1068   // sort order is guaranteed because they're all of the form D<n>.
1069   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[], "
1070     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << "[]}";
1071 }
1072
1073 void ARMInstPrinter::printVectorListThreeAllLanes(const MCInst *MI,
1074                                                   unsigned OpNum,
1075                                                   raw_ostream &O) {
1076   // Normally, it's not safe to use register enum values directly with
1077   // addition to get the next register, but for VFP registers, the
1078   // sort order is guaranteed because they're all of the form D<n>.
1079   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[], "
1080     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << "[], "
1081     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[]}";
1082 }
1083
1084 void ARMInstPrinter::printVectorListFourAllLanes(const MCInst *MI,
1085                                                   unsigned OpNum,
1086                                                   raw_ostream &O) {
1087   // Normally, it's not safe to use register enum values directly with
1088   // addition to get the next register, but for VFP registers, the
1089   // sort order is guaranteed because they're all of the form D<n>.
1090   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[], "
1091     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << "[], "
1092     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[], "
1093     << getRegisterName(MI->getOperand(OpNum).getReg() + 3) << "[]}";
1094 }
1095
1096 void ARMInstPrinter::printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
1097                                               raw_ostream &O) {
1098   // Normally, it's not safe to use register enum values directly with
1099   // addition to get the next register, but for VFP registers, the
1100   // sort order is guaranteed because they're all of the form D<n>.
1101   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1102     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "}";
1103 }
1104
1105 void ARMInstPrinter::printVectorListTwoSpacedAllLanes(const MCInst *MI,
1106                                                       unsigned OpNum,
1107                                                       raw_ostream &O) {
1108   // Normally, it's not safe to use register enum values directly with
1109   // addition to get the next register, but for VFP registers, the
1110   // sort order is guaranteed because they're all of the form D<n>.
1111   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[], "
1112     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[]}";
1113 }
1114
1115 void ARMInstPrinter::printVectorListThreeSpacedAllLanes(const MCInst *MI,
1116                                                         unsigned OpNum,
1117                                                         raw_ostream &O) {
1118   // Normally, it's not safe to use register enum values directly with
1119   // addition to get the next register, but for VFP registers, the
1120   // sort order is guaranteed because they're all of the form D<n>.
1121   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[], "
1122     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[], "
1123     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << "[]}";
1124 }
1125
1126 void ARMInstPrinter::printVectorListFourSpacedAllLanes(const MCInst *MI,
1127                                                        unsigned OpNum,
1128                                                        raw_ostream &O) {
1129   // Normally, it's not safe to use register enum values directly with
1130   // addition to get the next register, but for VFP registers, the
1131   // sort order is guaranteed because they're all of the form D<n>.
1132   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[], "
1133     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[], "
1134     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << "[], "
1135     << getRegisterName(MI->getOperand(OpNum).getReg() + 6) << "[]}";
1136 }
1137
1138 void ARMInstPrinter::printVectorListThreeSpaced(const MCInst *MI,
1139                                                 unsigned OpNum,
1140                                                 raw_ostream &O) {
1141   // Normally, it's not safe to use register enum values directly with
1142   // addition to get the next register, but for VFP registers, the
1143   // sort order is guaranteed because they're all of the form D<n>.
1144   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1145     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << ", "
1146     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << "}";
1147 }
1148
1149 void ARMInstPrinter::printVectorListFourSpaced(const MCInst *MI,
1150                                                 unsigned OpNum,
1151                                                 raw_ostream &O) {
1152   // Normally, it's not safe to use register enum values directly with
1153   // addition to get the next register, but for VFP registers, the
1154   // sort order is guaranteed because they're all of the form D<n>.
1155   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1156     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << ", "
1157     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << ", "
1158     << getRegisterName(MI->getOperand(OpNum).getReg() + 6) << "}";
1159 }