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