Fix edge cases of ARM shift operands in arith instructions.
[oota-llvm.git] / lib / Target / ARM / InstPrinter / ARMInstPrinter.cpp
1 //===-- ARMInstPrinter.cpp - Convert ARM MCInst to assembly syntax --------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This class prints an ARM MCInst to a .s file.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "asm-printer"
15 #include "ARMInstPrinter.h"
16 #include "MCTargetDesc/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   printRegImmShift(O, ARM_AM::getSORegShOp(MO2.getImm()),
306                    ARM_AM::getSORegOffset(MO2.getImm()));
307 }
308
309
310 //===--------------------------------------------------------------------===//
311 // Addressing Mode #2
312 //===--------------------------------------------------------------------===//
313
314 void ARMInstPrinter::printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
315                                                 raw_ostream &O) {
316   const MCOperand &MO1 = MI->getOperand(Op);
317   const MCOperand &MO2 = MI->getOperand(Op+1);
318   const MCOperand &MO3 = MI->getOperand(Op+2);
319
320   O << "[" << getRegisterName(MO1.getReg());
321
322   if (!MO2.getReg()) {
323     if (ARM_AM::getAM2Offset(MO3.getImm())) // Don't print +0.
324       O << ", #"
325         << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
326         << ARM_AM::getAM2Offset(MO3.getImm());
327     O << "]";
328     return;
329   }
330
331   O << ", "
332     << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO3.getImm()))
333     << getRegisterName(MO2.getReg());
334
335   printRegImmShift(O, ARM_AM::getAM2ShiftOpc(MO3.getImm()),
336                    ARM_AM::getAM2Offset(MO3.getImm()));
337   O << "]";
338 }
339
340 void ARMInstPrinter::printAddrModeTBB(const MCInst *MI, unsigned Op,
341                                            raw_ostream &O) {
342   const MCOperand &MO1 = MI->getOperand(Op);
343   const MCOperand &MO2 = MI->getOperand(Op+1);
344   O << "[" << getRegisterName(MO1.getReg()) << ", "
345     << getRegisterName(MO2.getReg()) << "]";
346 }
347
348 void ARMInstPrinter::printAddrModeTBH(const MCInst *MI, unsigned Op,
349                                            raw_ostream &O) {
350   const MCOperand &MO1 = MI->getOperand(Op);
351   const MCOperand &MO2 = MI->getOperand(Op+1);
352   O << "[" << getRegisterName(MO1.getReg()) << ", "
353     << getRegisterName(MO2.getReg()) << ", lsl #1]";
354 }
355
356 void ARMInstPrinter::printAddrMode2Operand(const MCInst *MI, unsigned Op,
357                                            raw_ostream &O) {
358   const MCOperand &MO1 = MI->getOperand(Op);
359
360   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
361     printOperand(MI, Op, O);
362     return;
363   }
364
365   const MCOperand &MO3 = MI->getOperand(Op+2);
366   unsigned IdxMode = ARM_AM::getAM2IdxMode(MO3.getImm());
367   assert(IdxMode != ARMII::IndexModePost &&
368          "Should be pre or offset index op");
369
370   printAM2PreOrOffsetIndexOp(MI, Op, O);
371 }
372
373 void ARMInstPrinter::printAddrMode2OffsetOperand(const MCInst *MI,
374                                                  unsigned OpNum,
375                                                  raw_ostream &O) {
376   const MCOperand &MO1 = MI->getOperand(OpNum);
377   const MCOperand &MO2 = MI->getOperand(OpNum+1);
378
379   if (!MO1.getReg()) {
380     unsigned ImmOffs = ARM_AM::getAM2Offset(MO2.getImm());
381     O << '#'
382       << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()))
383       << ImmOffs;
384     return;
385   }
386
387   O << ARM_AM::getAddrOpcStr(ARM_AM::getAM2Op(MO2.getImm()))
388     << getRegisterName(MO1.getReg());
389
390   printRegImmShift(O, ARM_AM::getAM2ShiftOpc(MO2.getImm()),
391                    ARM_AM::getAM2Offset(MO2.getImm()));
392 }
393
394 //===--------------------------------------------------------------------===//
395 // Addressing Mode #3
396 //===--------------------------------------------------------------------===//
397
398 void ARMInstPrinter::printAM3PostIndexOp(const MCInst *MI, unsigned Op,
399                                          raw_ostream &O) {
400   const MCOperand &MO1 = MI->getOperand(Op);
401   const MCOperand &MO2 = MI->getOperand(Op+1);
402   const MCOperand &MO3 = MI->getOperand(Op+2);
403
404   O << "[" << getRegisterName(MO1.getReg()) << "], ";
405
406   if (MO2.getReg()) {
407     O << (char)ARM_AM::getAM3Op(MO3.getImm())
408     << getRegisterName(MO2.getReg());
409     return;
410   }
411
412   unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
413   O << '#'
414     << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()))
415     << ImmOffs;
416 }
417
418 void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
419                                                 raw_ostream &O) {
420   const MCOperand &MO1 = MI->getOperand(Op);
421   const MCOperand &MO2 = MI->getOperand(Op+1);
422   const MCOperand &MO3 = MI->getOperand(Op+2);
423
424   O << '[' << getRegisterName(MO1.getReg());
425
426   if (MO2.getReg()) {
427     O << ", " << getAddrOpcStr(ARM_AM::getAM3Op(MO3.getImm()))
428       << getRegisterName(MO2.getReg()) << ']';
429     return;
430   }
431
432   //If the op is sub we have to print the immediate even if it is 0 
433   unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
434   ARM_AM::AddrOpc op = ARM_AM::getAM3Op(MO3.getImm());
435  
436   if (ImmOffs || (op == ARM_AM::sub))
437     O << ", #"
438       << ARM_AM::getAddrOpcStr(op)
439       << ImmOffs;
440   O << ']';
441 }
442
443 void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
444                                            raw_ostream &O) {
445   const MCOperand &MO1 = MI->getOperand(Op);
446   if (!MO1.isReg()) {   //  For label symbolic references.
447     printOperand(MI, Op, O);
448     return;
449   }
450
451   const MCOperand &MO3 = MI->getOperand(Op+2);
452   unsigned IdxMode = ARM_AM::getAM3IdxMode(MO3.getImm());
453
454   if (IdxMode == ARMII::IndexModePost) {
455     printAM3PostIndexOp(MI, Op, O);
456     return;
457   }
458   printAM3PreOrOffsetIndexOp(MI, Op, O);
459 }
460
461 void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst *MI,
462                                                  unsigned OpNum,
463                                                  raw_ostream &O) {
464   const MCOperand &MO1 = MI->getOperand(OpNum);
465   const MCOperand &MO2 = MI->getOperand(OpNum+1);
466
467   if (MO1.getReg()) {
468     O << getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()))
469       << getRegisterName(MO1.getReg());
470     return;
471   }
472
473   unsigned ImmOffs = ARM_AM::getAM3Offset(MO2.getImm());
474   O << '#'
475     << ARM_AM::getAddrOpcStr(ARM_AM::getAM3Op(MO2.getImm()))
476     << ImmOffs;
477 }
478
479 void ARMInstPrinter::printPostIdxImm8Operand(const MCInst *MI,
480                                              unsigned OpNum,
481                                              raw_ostream &O) {
482   const MCOperand &MO = MI->getOperand(OpNum);
483   unsigned Imm = MO.getImm();
484   O << '#' << ((Imm & 256) ? "" : "-") << (Imm & 0xff);
485 }
486
487 void ARMInstPrinter::printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
488                                             raw_ostream &O) {
489   const MCOperand &MO1 = MI->getOperand(OpNum);
490   const MCOperand &MO2 = MI->getOperand(OpNum+1);
491
492   O << (MO2.getImm() ? "" : "-") << getRegisterName(MO1.getReg());
493 }
494
495 void ARMInstPrinter::printPostIdxImm8s4Operand(const MCInst *MI,
496                                              unsigned OpNum,
497                                              raw_ostream &O) {
498   const MCOperand &MO = MI->getOperand(OpNum);
499   unsigned Imm = MO.getImm();
500   O << '#' << ((Imm & 256) ? "" : "-") << ((Imm & 0xff) << 2);
501 }
502
503
504 void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
505                                            raw_ostream &O) {
506   ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MI->getOperand(OpNum)
507                                                  .getImm());
508   O << ARM_AM::getAMSubModeStr(Mode);
509 }
510
511 void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
512                                            raw_ostream &O) {
513   const MCOperand &MO1 = MI->getOperand(OpNum);
514   const MCOperand &MO2 = MI->getOperand(OpNum+1);
515
516   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
517     printOperand(MI, OpNum, O);
518     return;
519   }
520
521   O << "[" << getRegisterName(MO1.getReg());
522
523   unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm());
524   unsigned Op = ARM_AM::getAM5Op(MO2.getImm());
525   if (ImmOffs || Op == ARM_AM::sub) {
526     O << ", #"
527       << ARM_AM::getAddrOpcStr(ARM_AM::getAM5Op(MO2.getImm()))
528       << ImmOffs * 4;
529   }
530   O << "]";
531 }
532
533 void ARMInstPrinter::printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
534                                            raw_ostream &O) {
535   const MCOperand &MO1 = MI->getOperand(OpNum);
536   const MCOperand &MO2 = MI->getOperand(OpNum+1);
537
538   O << "[" << getRegisterName(MO1.getReg());
539   if (MO2.getImm()) {
540     // FIXME: Both darwin as and GNU as violate ARM docs here.
541     O << ", :" << (MO2.getImm() << 3);
542   }
543   O << "]";
544 }
545
546 void ARMInstPrinter::printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
547                                            raw_ostream &O) {
548   const MCOperand &MO1 = MI->getOperand(OpNum);
549   O << "[" << getRegisterName(MO1.getReg()) << "]";
550 }
551
552 void ARMInstPrinter::printAddrMode6OffsetOperand(const MCInst *MI,
553                                                  unsigned OpNum,
554                                                  raw_ostream &O) {
555   const MCOperand &MO = MI->getOperand(OpNum);
556   if (MO.getReg() == 0)
557     O << "!";
558   else
559     O << ", " << getRegisterName(MO.getReg());
560 }
561
562 void ARMInstPrinter::printBitfieldInvMaskImmOperand(const MCInst *MI,
563                                                     unsigned OpNum,
564                                                     raw_ostream &O) {
565   const MCOperand &MO = MI->getOperand(OpNum);
566   uint32_t v = ~MO.getImm();
567   int32_t lsb = CountTrailingZeros_32(v);
568   int32_t width = (32 - CountLeadingZeros_32 (v)) - lsb;
569   assert(MO.isImm() && "Not a valid bf_inv_mask_imm value!");
570   O << '#' << lsb << ", #" << width;
571 }
572
573 void ARMInstPrinter::printMemBOption(const MCInst *MI, unsigned OpNum,
574                                      raw_ostream &O) {
575   unsigned val = MI->getOperand(OpNum).getImm();
576   O << ARM_MB::MemBOptToString(val);
577 }
578
579 void ARMInstPrinter::printShiftImmOperand(const MCInst *MI, unsigned OpNum,
580                                           raw_ostream &O) {
581   unsigned ShiftOp = MI->getOperand(OpNum).getImm();
582   bool isASR = (ShiftOp & (1 << 5)) != 0;
583   unsigned Amt = ShiftOp & 0x1f;
584   if (isASR)
585     O << ", asr #" << (Amt == 0 ? 32 : Amt);
586   else if (Amt)
587     O << ", lsl #" << Amt;
588 }
589
590 void ARMInstPrinter::printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
591                                          raw_ostream &O) {
592   unsigned Imm = MI->getOperand(OpNum).getImm();
593   if (Imm == 0)
594     return;
595   assert(Imm > 0 && Imm < 32 && "Invalid PKH shift immediate value!");
596   O << ", lsl #" << Imm;
597 }
598
599 void ARMInstPrinter::printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
600                                          raw_ostream &O) {
601   unsigned Imm = MI->getOperand(OpNum).getImm();
602   // A shift amount of 32 is encoded as 0.
603   if (Imm == 0)
604     Imm = 32;
605   assert(Imm > 0 && Imm <= 32 && "Invalid PKH shift immediate value!");
606   O << ", asr #" << Imm;
607 }
608
609 void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum,
610                                        raw_ostream &O) {
611   O << "{";
612   for (unsigned i = OpNum, e = MI->getNumOperands(); i != e; ++i) {
613     if (i != OpNum) O << ", ";
614     O << getRegisterName(MI->getOperand(i).getReg());
615   }
616   O << "}";
617 }
618
619 void ARMInstPrinter::printSetendOperand(const MCInst *MI, unsigned OpNum,
620                                         raw_ostream &O) {
621   const MCOperand &Op = MI->getOperand(OpNum);
622   if (Op.getImm())
623     O << "be";
624   else
625     O << "le";
626 }
627
628 void ARMInstPrinter::printCPSIMod(const MCInst *MI, unsigned OpNum,
629                                   raw_ostream &O) {
630   const MCOperand &Op = MI->getOperand(OpNum);
631   O << ARM_PROC::IModToString(Op.getImm());
632 }
633
634 void ARMInstPrinter::printCPSIFlag(const MCInst *MI, unsigned OpNum,
635                                    raw_ostream &O) {
636   const MCOperand &Op = MI->getOperand(OpNum);
637   unsigned IFlags = Op.getImm();
638   for (int i=2; i >= 0; --i)
639     if (IFlags & (1 << i))
640       O << ARM_PROC::IFlagsToString(1 << i);
641
642   if (IFlags == 0)
643     O << "none";
644 }
645
646 void ARMInstPrinter::printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
647                                          raw_ostream &O) {
648   const MCOperand &Op = MI->getOperand(OpNum);
649   unsigned SpecRegRBit = Op.getImm() >> 4;
650   unsigned Mask = Op.getImm() & 0xf;
651
652   if (getAvailableFeatures() & ARM::FeatureMClass) {
653     unsigned SYSm = Op.getImm();
654     unsigned Opcode = MI->getOpcode();
655     // For reads of the special registers ignore the "mask encoding" bits
656     // which are only for writes.
657     if (Opcode == ARM::t2MRS_M)
658       SYSm &= 0xff;
659     switch (SYSm) {
660     default: llvm_unreachable("Unexpected mask value!");
661     case     0:
662     case 0x800: O << "apsr"; return; // with _nzcvq bits is an alias for aspr
663     case 0x400: O << "apsr_g"; return;
664     case 0xc00: O << "apsr_nzcvqg"; return;
665     case     1:
666     case 0x801: O << "iapsr"; return; // with _nzcvq bits is an alias for iapsr
667     case 0x401: O << "iapsr_g"; return;
668     case 0xc01: O << "iapsr_nzcvqg"; return;
669     case     2:
670     case 0x802: O << "eapsr"; return; // with _nzcvq bits is an alias for eapsr
671     case 0x402: O << "eapsr_g"; return;
672     case 0xc02: O << "eapsr_nzcvqg"; return;
673     case     3:
674     case 0x803: O << "xpsr"; return; // with _nzcvq bits is an alias for xpsr
675     case 0x403: O << "xpsr_g"; return;
676     case 0xc03: O << "xpsr_nzcvqg"; return;
677     case     5:
678     case 0x805: O << "ipsr"; return;
679     case     6:
680     case 0x806: O << "epsr"; return;
681     case     7:
682     case 0x807: O << "iepsr"; return;
683     case     8:
684     case 0x808: O << "msp"; return;
685     case     9:
686     case 0x809: O << "psp"; return;
687     case  0x10:
688     case 0x810: O << "primask"; return;
689     case  0x11:
690     case 0x811: O << "basepri"; return;
691     case  0x12:
692     case 0x812: O << "basepri_max"; return;
693     case  0x13:
694     case 0x813: O << "faultmask"; return;
695     case  0x14:
696     case 0x814: O << "control"; return;
697     }
698   }
699
700   // As special cases, CPSR_f, CPSR_s and CPSR_fs prefer printing as
701   // APSR_nzcvq, APSR_g and APSRnzcvqg, respectively.
702   if (!SpecRegRBit && (Mask == 8 || Mask == 4 || Mask == 12)) {
703     O << "APSR_";
704     switch (Mask) {
705     default: llvm_unreachable("Unexpected mask value!");
706     case 4:  O << "g"; return;
707     case 8:  O << "nzcvq"; return;
708     case 12: O << "nzcvqg"; return;
709     }
710   }
711
712   if (SpecRegRBit)
713     O << "SPSR";
714   else
715     O << "CPSR";
716
717   if (Mask) {
718     O << '_';
719     if (Mask & 8) O << 'f';
720     if (Mask & 4) O << 's';
721     if (Mask & 2) O << 'x';
722     if (Mask & 1) O << 'c';
723   }
724 }
725
726 void ARMInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNum,
727                                            raw_ostream &O) {
728   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
729   // Handle the undefined 15 CC value here for printing so we don't abort().
730   if ((unsigned)CC == 15)
731     O << "<und>";
732   else if (CC != ARMCC::AL)
733     O << ARMCondCodeToString(CC);
734 }
735
736 void ARMInstPrinter::printMandatoryPredicateOperand(const MCInst *MI,
737                                                     unsigned OpNum,
738                                                     raw_ostream &O) {
739   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
740   O << ARMCondCodeToString(CC);
741 }
742
743 void ARMInstPrinter::printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
744                                               raw_ostream &O) {
745   if (MI->getOperand(OpNum).getReg()) {
746     assert(MI->getOperand(OpNum).getReg() == ARM::CPSR &&
747            "Expect ARM CPSR register!");
748     O << 's';
749   }
750 }
751
752 void ARMInstPrinter::printNoHashImmediate(const MCInst *MI, unsigned OpNum,
753                                           raw_ostream &O) {
754   O << MI->getOperand(OpNum).getImm();
755 }
756
757 void ARMInstPrinter::printPImmediate(const MCInst *MI, unsigned OpNum,
758                                      raw_ostream &O) {
759   O << "p" << MI->getOperand(OpNum).getImm();
760 }
761
762 void ARMInstPrinter::printCImmediate(const MCInst *MI, unsigned OpNum,
763                                      raw_ostream &O) {
764   O << "c" << MI->getOperand(OpNum).getImm();
765 }
766
767 void ARMInstPrinter::printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
768                                           raw_ostream &O) {
769   O << "{" << MI->getOperand(OpNum).getImm() << "}";
770 }
771
772 void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum,
773                                   raw_ostream &O) {
774   llvm_unreachable("Unhandled PC-relative pseudo-instruction!");
775 }
776
777 void ARMInstPrinter::printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
778                                   raw_ostream &O) {
779   const MCOperand &MO = MI->getOperand(OpNum);
780
781   if (MO.isExpr()) {
782     O << *MO.getExpr();
783     return;
784   }
785
786   int32_t OffImm = (int32_t)MO.getImm();
787
788   if (OffImm == INT32_MIN)
789     O << "#-0";
790   else if (OffImm < 0)
791     O << "#-" << -OffImm;
792   else
793     O << "#" << OffImm;
794 }
795
796 void ARMInstPrinter::printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
797                                             raw_ostream &O) {
798   O << "#" << MI->getOperand(OpNum).getImm() * 4;
799 }
800
801 void ARMInstPrinter::printThumbSRImm(const MCInst *MI, unsigned OpNum,
802                                      raw_ostream &O) {
803   unsigned Imm = MI->getOperand(OpNum).getImm();
804   O << "#" << (Imm == 0 ? 32 : Imm);
805 }
806
807 void ARMInstPrinter::printThumbITMask(const MCInst *MI, unsigned OpNum,
808                                       raw_ostream &O) {
809   // (3 - the number of trailing zeros) is the number of then / else.
810   unsigned Mask = MI->getOperand(OpNum).getImm();
811   unsigned Firstcond = MI->getOperand(OpNum-1).getImm();
812   unsigned CondBit0 = Firstcond & 1;
813   unsigned NumTZ = CountTrailingZeros_32(Mask);
814   assert(NumTZ <= 3 && "Invalid IT mask!");
815   for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) {
816     bool T = ((Mask >> Pos) & 1) == CondBit0;
817     if (T)
818       O << 't';
819     else
820       O << 'e';
821   }
822 }
823
824 void ARMInstPrinter::printThumbAddrModeRROperand(const MCInst *MI, unsigned Op,
825                                                  raw_ostream &O) {
826   const MCOperand &MO1 = MI->getOperand(Op);
827   const MCOperand &MO2 = MI->getOperand(Op + 1);
828
829   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
830     printOperand(MI, Op, O);
831     return;
832   }
833
834   O << "[" << getRegisterName(MO1.getReg());
835   if (unsigned RegNum = MO2.getReg())
836     O << ", " << getRegisterName(RegNum);
837   O << "]";
838 }
839
840 void ARMInstPrinter::printThumbAddrModeImm5SOperand(const MCInst *MI,
841                                                     unsigned Op,
842                                                     raw_ostream &O,
843                                                     unsigned Scale) {
844   const MCOperand &MO1 = MI->getOperand(Op);
845   const MCOperand &MO2 = MI->getOperand(Op + 1);
846
847   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
848     printOperand(MI, Op, O);
849     return;
850   }
851
852   O << "[" << getRegisterName(MO1.getReg());
853   if (unsigned ImmOffs = MO2.getImm())
854     O << ", #" << ImmOffs * Scale;
855   O << "]";
856 }
857
858 void ARMInstPrinter::printThumbAddrModeImm5S1Operand(const MCInst *MI,
859                                                      unsigned Op,
860                                                      raw_ostream &O) {
861   printThumbAddrModeImm5SOperand(MI, Op, O, 1);
862 }
863
864 void ARMInstPrinter::printThumbAddrModeImm5S2Operand(const MCInst *MI,
865                                                      unsigned Op,
866                                                      raw_ostream &O) {
867   printThumbAddrModeImm5SOperand(MI, Op, O, 2);
868 }
869
870 void ARMInstPrinter::printThumbAddrModeImm5S4Operand(const MCInst *MI,
871                                                      unsigned Op,
872                                                      raw_ostream &O) {
873   printThumbAddrModeImm5SOperand(MI, Op, O, 4);
874 }
875
876 void ARMInstPrinter::printThumbAddrModeSPOperand(const MCInst *MI, unsigned Op,
877                                                  raw_ostream &O) {
878   printThumbAddrModeImm5SOperand(MI, Op, O, 4);
879 }
880
881 // Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2
882 // register with shift forms.
883 // REG 0   0           - e.g. R5
884 // REG IMM, SH_OPC     - e.g. R5, LSL #3
885 void ARMInstPrinter::printT2SOOperand(const MCInst *MI, unsigned OpNum,
886                                       raw_ostream &O) {
887   const MCOperand &MO1 = MI->getOperand(OpNum);
888   const MCOperand &MO2 = MI->getOperand(OpNum+1);
889
890   unsigned Reg = MO1.getReg();
891   O << getRegisterName(Reg);
892
893   // Print the shift opc.
894   assert(MO2.isImm() && "Not a valid t2_so_reg value!");
895   printRegImmShift(O, ARM_AM::getSORegShOp(MO2.getImm()),
896                    ARM_AM::getSORegOffset(MO2.getImm()));
897 }
898
899 void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
900                                                raw_ostream &O) {
901   const MCOperand &MO1 = MI->getOperand(OpNum);
902   const MCOperand &MO2 = MI->getOperand(OpNum+1);
903
904   if (!MO1.isReg()) {   // FIXME: This is for CP entries, but isn't right.
905     printOperand(MI, OpNum, O);
906     return;
907   }
908
909   O << "[" << getRegisterName(MO1.getReg());
910
911   int32_t OffImm = (int32_t)MO2.getImm();
912   bool isSub = OffImm < 0;
913   // Special value for #-0. All others are normal.
914   if (OffImm == INT32_MIN)
915     OffImm = 0;
916   if (isSub)
917     O << ", #-" << -OffImm;
918   else if (OffImm > 0)
919     O << ", #" << OffImm;
920   O << "]";
921 }
922
923 void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst *MI,
924                                                 unsigned OpNum,
925                                                 raw_ostream &O) {
926   const MCOperand &MO1 = MI->getOperand(OpNum);
927   const MCOperand &MO2 = MI->getOperand(OpNum+1);
928
929   O << "[" << getRegisterName(MO1.getReg());
930
931   int32_t OffImm = (int32_t)MO2.getImm();
932   // Don't print +0.
933   if (OffImm == INT32_MIN)
934     O << ", #-0";
935   else if (OffImm < 0)
936     O << ", #-" << -OffImm;
937   else if (OffImm > 0)
938     O << ", #" << OffImm;
939   O << "]";
940 }
941
942 void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst *MI,
943                                                   unsigned OpNum,
944                                                   raw_ostream &O) {
945   const MCOperand &MO1 = MI->getOperand(OpNum);
946   const MCOperand &MO2 = MI->getOperand(OpNum+1);
947
948   if (!MO1.isReg()) {   //  For label symbolic references.
949     printOperand(MI, OpNum, O);
950     return;
951   }
952
953   O << "[" << getRegisterName(MO1.getReg());
954
955   int32_t OffImm = (int32_t)MO2.getImm();
956
957   assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
958
959   // Don't print +0.
960   if (OffImm == INT32_MIN)
961     O << ", #-0";
962   else if (OffImm < 0)
963     O << ", #-" << -OffImm;
964   else if (OffImm > 0)
965     O << ", #" << OffImm;
966   O << "]";
967 }
968
969 void ARMInstPrinter::printT2AddrModeImm0_1020s4Operand(const MCInst *MI,
970                                                        unsigned OpNum,
971                                                        raw_ostream &O) {
972   const MCOperand &MO1 = MI->getOperand(OpNum);
973   const MCOperand &MO2 = MI->getOperand(OpNum+1);
974
975   O << "[" << getRegisterName(MO1.getReg());
976   if (MO2.getImm())
977     O << ", #" << MO2.getImm() * 4;
978   O << "]";
979 }
980
981 void ARMInstPrinter::printT2AddrModeImm8OffsetOperand(const MCInst *MI,
982                                                       unsigned OpNum,
983                                                       raw_ostream &O) {
984   const MCOperand &MO1 = MI->getOperand(OpNum);
985   int32_t OffImm = (int32_t)MO1.getImm();
986   // Don't print +0.
987   if (OffImm < 0)
988     O << ", #-" << -OffImm;
989   else
990     O << ", #" << OffImm;
991 }
992
993 void ARMInstPrinter::printT2AddrModeImm8s4OffsetOperand(const MCInst *MI,
994                                                         unsigned OpNum,
995                                                         raw_ostream &O) {
996   const MCOperand &MO1 = MI->getOperand(OpNum);
997   int32_t OffImm = (int32_t)MO1.getImm();
998
999   assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
1000
1001   // Don't print +0.
1002   if (OffImm == INT32_MIN)
1003     O << ", #-0";
1004   else if (OffImm < 0)
1005     O << ", #-" << -OffImm;
1006   else if (OffImm > 0)
1007     O << ", #" << OffImm;
1008 }
1009
1010 void ARMInstPrinter::printT2AddrModeSoRegOperand(const MCInst *MI,
1011                                                  unsigned OpNum,
1012                                                  raw_ostream &O) {
1013   const MCOperand &MO1 = MI->getOperand(OpNum);
1014   const MCOperand &MO2 = MI->getOperand(OpNum+1);
1015   const MCOperand &MO3 = MI->getOperand(OpNum+2);
1016
1017   O << "[" << getRegisterName(MO1.getReg());
1018
1019   assert(MO2.getReg() && "Invalid so_reg load / store address!");
1020   O << ", " << getRegisterName(MO2.getReg());
1021
1022   unsigned ShAmt = MO3.getImm();
1023   if (ShAmt) {
1024     assert(ShAmt <= 3 && "Not a valid Thumb2 addressing mode!");
1025     O << ", lsl #" << ShAmt;
1026   }
1027   O << "]";
1028 }
1029
1030 void ARMInstPrinter::printFPImmOperand(const MCInst *MI, unsigned OpNum,
1031                                        raw_ostream &O) {
1032   const MCOperand &MO = MI->getOperand(OpNum);
1033   O << '#' << ARM_AM::getFPImmFloat(MO.getImm());
1034 }
1035
1036 void ARMInstPrinter::printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
1037                                             raw_ostream &O) {
1038   unsigned EncodedImm = MI->getOperand(OpNum).getImm();
1039   unsigned EltBits;
1040   uint64_t Val = ARM_AM::decodeNEONModImm(EncodedImm, EltBits);
1041   O << "#0x";
1042   O.write_hex(Val);
1043 }
1044
1045 void ARMInstPrinter::printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
1046                                             raw_ostream &O) {
1047   unsigned Imm = MI->getOperand(OpNum).getImm();
1048   O << "#" << Imm + 1;
1049 }
1050
1051 void ARMInstPrinter::printRotImmOperand(const MCInst *MI, unsigned OpNum,
1052                                         raw_ostream &O) {
1053   unsigned Imm = MI->getOperand(OpNum).getImm();
1054   if (Imm == 0)
1055     return;
1056   O << ", ror #";
1057   switch (Imm) {
1058   default: assert (0 && "illegal ror immediate!");
1059   case 1: O << "8"; break;
1060   case 2: O << "16"; break;
1061   case 3: O << "24"; break;
1062   }
1063 }
1064
1065 void ARMInstPrinter::printFBits16(const MCInst *MI, unsigned OpNum,
1066                                   raw_ostream &O) {
1067   O << "#" << 16 - MI->getOperand(OpNum).getImm();
1068 }
1069
1070 void ARMInstPrinter::printFBits32(const MCInst *MI, unsigned OpNum,
1071                                   raw_ostream &O) {
1072   O << "#" << 32 - MI->getOperand(OpNum).getImm();
1073 }
1074
1075 void ARMInstPrinter::printVectorIndex(const MCInst *MI, unsigned OpNum,
1076                                       raw_ostream &O) {
1077   O << "[" << MI->getOperand(OpNum).getImm() << "]";
1078 }
1079
1080 void ARMInstPrinter::printVectorListOne(const MCInst *MI, unsigned OpNum,
1081                                         raw_ostream &O) {
1082   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "}";
1083 }
1084
1085 void ARMInstPrinter::printVectorListTwo(const MCInst *MI, unsigned OpNum,
1086                                           raw_ostream &O) {
1087   unsigned Reg = MI->getOperand(OpNum).getReg();
1088   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1089   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_1);
1090   O << "{" << getRegisterName(Reg0) << ", " << getRegisterName(Reg1) << "}";
1091 }
1092
1093 void ARMInstPrinter::printVectorListTwoSpaced(const MCInst *MI,
1094                                               unsigned OpNum,
1095                                               raw_ostream &O) {
1096   unsigned Reg = MI->getOperand(OpNum).getReg();
1097   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1098   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_2);
1099   O << "{" << getRegisterName(Reg0) << ", " << getRegisterName(Reg1) << "}";
1100 }
1101
1102 void ARMInstPrinter::printVectorListThree(const MCInst *MI, unsigned OpNum,
1103                                           raw_ostream &O) {
1104   // Normally, it's not safe to use register enum values directly with
1105   // addition to get the next register, but for VFP registers, the
1106   // sort order is guaranteed because they're all of the form D<n>.
1107   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1108     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << ", "
1109     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "}";
1110 }
1111
1112 void ARMInstPrinter::printVectorListFour(const MCInst *MI, unsigned OpNum,
1113                                          raw_ostream &O) {
1114   // Normally, it's not safe to use register enum values directly with
1115   // addition to get the next register, but for VFP registers, the
1116   // sort order is guaranteed because they're all of the form D<n>.
1117   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1118     << getRegisterName(MI->getOperand(OpNum).getReg() + 1) << ", "
1119     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << ", "
1120     << getRegisterName(MI->getOperand(OpNum).getReg() + 3) << "}";
1121 }
1122
1123 void ARMInstPrinter::printVectorListOneAllLanes(const MCInst *MI,
1124                                                 unsigned OpNum,
1125                                                 raw_ostream &O) {
1126   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << "[]}";
1127 }
1128
1129 void ARMInstPrinter::printVectorListTwoAllLanes(const MCInst *MI,
1130                                                 unsigned OpNum,
1131                                                 raw_ostream &O) {
1132   unsigned Reg = MI->getOperand(OpNum).getReg();
1133   unsigned Reg0 = MRI.getSubReg(Reg, ARM::dsub_0);
1134   unsigned Reg1 = MRI.getSubReg(Reg, ARM::dsub_1);
1135   O << "{" << getRegisterName(Reg0) << "[], " << getRegisterName(Reg1) << "[]}";
1136 }
1137
1138 void ARMInstPrinter::printVectorListThreeAllLanes(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() + 1) << "[], "
1146     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[]}";
1147 }
1148
1149 void ARMInstPrinter::printVectorListFourAllLanes(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() + 1) << "[], "
1157     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << "[], "
1158     << getRegisterName(MI->getOperand(OpNum).getReg() + 3) << "[]}";
1159 }
1160
1161 void ARMInstPrinter::printVectorListTwoSpacedAllLanes(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_2);
1167   O << "{" << getRegisterName(Reg0) << "[], " << getRegisterName(Reg1) << "[]}";
1168 }
1169
1170 void ARMInstPrinter::printVectorListThreeSpacedAllLanes(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() + 2) << "[], "
1178     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << "[]}";
1179 }
1180
1181 void ARMInstPrinter::printVectorListFourSpacedAllLanes(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() + 2) << "[], "
1189     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << "[], "
1190     << getRegisterName(MI->getOperand(OpNum).getReg() + 6) << "[]}";
1191 }
1192
1193 void ARMInstPrinter::printVectorListThreeSpaced(const MCInst *MI,
1194                                                 unsigned OpNum,
1195                                                 raw_ostream &O) {
1196   // Normally, it's not safe to use register enum values directly with
1197   // addition to get the next register, but for VFP registers, the
1198   // sort order is guaranteed because they're all of the form D<n>.
1199   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1200     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << ", "
1201     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << "}";
1202 }
1203
1204 void ARMInstPrinter::printVectorListFourSpaced(const MCInst *MI,
1205                                                 unsigned OpNum,
1206                                                 raw_ostream &O) {
1207   // Normally, it's not safe to use register enum values directly with
1208   // addition to get the next register, but for VFP registers, the
1209   // sort order is guaranteed because they're all of the form D<n>.
1210   O << "{" << getRegisterName(MI->getOperand(OpNum).getReg()) << ", "
1211     << getRegisterName(MI->getOperand(OpNum).getReg() + 2) << ", "
1212     << getRegisterName(MI->getOperand(OpNum).getReg() + 4) << ", "
1213     << getRegisterName(MI->getOperand(OpNum).getReg() + 6) << "}";
1214 }