Add sanity checking for invalid register encodings for signed/unsigned extend instruc...
[oota-llvm.git] / lib / Target / ARM / Disassembler / ARMDisassemblerCore.cpp
1 //===- ARMDisassemblerCore.cpp - ARM disassembler helpers -------*- C++ -*-===//
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 file is part of the ARM Disassembler.
11 // It contains code to represent the core concepts of Builder and DisassembleFP
12 // to solve the problem of disassembling an ARM instr.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #define DEBUG_TYPE "arm-disassembler"
17
18 #include "ARMDisassemblerCore.h"
19 #include "ARMAddressingModes.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/raw_ostream.h"
22
23 //#define DEBUG(X) do { X; } while (0)
24
25 /// ARMGenInstrInfo.inc - ARMGenInstrInfo.inc contains the static const
26 /// TargetInstrDesc ARMInsts[] definition and the TargetOperandInfo[]'s
27 /// describing the operand info for each ARMInsts[i].
28 ///
29 /// Together with an instruction's encoding format, we can take advantage of the
30 /// NumOperands and the OpInfo fields of the target instruction description in
31 /// the quest to build out the MCOperand list for an MCInst.
32 ///
33 /// The general guideline is that with a known format, the number of dst and src
34 /// operands are well-known.  The dst is built first, followed by the src
35 /// operand(s).  The operands not yet used at this point are for the Implicit
36 /// Uses and Defs by this instr.  For the Uses part, the pred:$p operand is
37 /// defined with two components:
38 ///
39 /// def pred { // Operand PredicateOperand
40 ///   ValueType Type = OtherVT;
41 ///   string PrintMethod = "printPredicateOperand";
42 ///   string AsmOperandLowerMethod = ?;
43 ///   dag MIOperandInfo = (ops i32imm, CCR);
44 ///   AsmOperandClass ParserMatchClass = ImmAsmOperand;
45 ///   dag DefaultOps = (ops (i32 14), (i32 zero_reg));
46 /// }
47 ///
48 /// which is manifested by the TargetOperandInfo[] of:
49 ///
50 /// { 0, 0|(1<<TOI::Predicate), 0 },
51 /// { ARM::CCRRegClassID, 0|(1<<TOI::Predicate), 0 }
52 ///
53 /// So the first predicate MCOperand corresponds to the immediate part of the
54 /// ARM condition field (Inst{31-28}), and the second predicate MCOperand
55 /// corresponds to a register kind of ARM::CPSR.
56 ///
57 /// For the Defs part, in the simple case of only cc_out:$s, we have:
58 ///
59 /// def cc_out { // Operand OptionalDefOperand
60 ///   ValueType Type = OtherVT;
61 ///   string PrintMethod = "printSBitModifierOperand";
62 ///   string AsmOperandLowerMethod = ?;
63 ///   dag MIOperandInfo = (ops CCR);
64 ///   AsmOperandClass ParserMatchClass = ImmAsmOperand;
65 ///   dag DefaultOps = (ops (i32 zero_reg));
66 /// }
67 ///
68 /// which is manifested by the one TargetOperandInfo of:
69 ///
70 /// { ARM::CCRRegClassID, 0|(1<<TOI::OptionalDef), 0 }
71 ///
72 /// And this maps to one MCOperand with the regsiter kind of ARM::CPSR.
73 #include "ARMGenInstrInfo.inc"
74
75 using namespace llvm;
76
77 const char *ARMUtils::OpcodeName(unsigned Opcode) {
78   return ARMInsts[Opcode].Name;
79 }
80
81 // Return the register enum Based on RegClass and the raw register number.
82 // FIXME: Auto-gened?
83 static unsigned
84 getRegisterEnum(BO B, unsigned RegClassID, unsigned RawRegister) {
85   if (RegClassID == ARM::rGPRRegClassID) {
86     // Check for The register numbers 13 and 15 that are not permitted for many
87     // Thumb register specifiers.
88     if (RawRegister == 13 || RawRegister == 15) {
89       B->SetErr(-1);
90       return 0;
91     }
92     // For this purpose, we can treat rGPR as if it were GPR.
93     RegClassID = ARM::GPRRegClassID;
94   }
95
96   // See also decodeNEONRd(), decodeNEONRn(), decodeNEONRm().
97   // A7.3 register encoding
98   //     Qd -> bit[12] == 0
99   //     Qn -> bit[16] == 0
100   //     Qm -> bit[0]  == 0
101   //
102   // If one of these bits is 1, the instruction is UNDEFINED.
103   if (RegClassID == ARM::QPRRegClassID && slice(RawRegister, 0, 0) == 1) {
104     B->SetErr(-1);
105     return 0;
106   }
107   unsigned RegNum =
108     RegClassID == ARM::QPRRegClassID ? RawRegister >> 1 : RawRegister;
109
110   switch (RegNum) {
111   default:
112     break;
113   case 0:
114     switch (RegClassID) {
115     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R0;
116     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
117     case ARM::DPR_VFP2RegClassID:
118       return ARM::D0;
119     case ARM::QPRRegClassID: case ARM::QPR_8RegClassID:
120     case ARM::QPR_VFP2RegClassID:
121       return ARM::Q0;
122     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S0;
123     }
124     break;
125   case 1:
126     switch (RegClassID) {
127     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R1;
128     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
129     case ARM::DPR_VFP2RegClassID:
130       return ARM::D1;
131     case ARM::QPRRegClassID: case ARM::QPR_8RegClassID:
132     case ARM::QPR_VFP2RegClassID:
133       return ARM::Q1;
134     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S1;
135     }
136     break;
137   case 2:
138     switch (RegClassID) {
139     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R2;
140     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
141     case ARM::DPR_VFP2RegClassID:
142       return ARM::D2;
143     case ARM::QPRRegClassID: case ARM::QPR_8RegClassID:
144     case ARM::QPR_VFP2RegClassID:
145       return ARM::Q2;
146     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S2;
147     }
148     break;
149   case 3:
150     switch (RegClassID) {
151     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R3;
152     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
153     case ARM::DPR_VFP2RegClassID:
154       return ARM::D3;
155     case ARM::QPRRegClassID: case ARM::QPR_8RegClassID:
156     case ARM::QPR_VFP2RegClassID:
157       return ARM::Q3;
158     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S3;
159     }
160     break;
161   case 4:
162     switch (RegClassID) {
163     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R4;
164     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
165     case ARM::DPR_VFP2RegClassID:
166       return ARM::D4;
167     case ARM::QPRRegClassID: case ARM::QPR_VFP2RegClassID: return ARM::Q4;
168     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S4;
169     }
170     break;
171   case 5:
172     switch (RegClassID) {
173     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R5;
174     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
175     case ARM::DPR_VFP2RegClassID:
176       return ARM::D5;
177     case ARM::QPRRegClassID: case ARM::QPR_VFP2RegClassID: return ARM::Q5;
178     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S5;
179     }
180     break;
181   case 6:
182     switch (RegClassID) {
183     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R6;
184     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
185     case ARM::DPR_VFP2RegClassID:
186       return ARM::D6;
187     case ARM::QPRRegClassID: case ARM::QPR_VFP2RegClassID: return ARM::Q6;
188     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S6;
189     }
190     break;
191   case 7:
192     switch (RegClassID) {
193     case ARM::GPRRegClassID: case ARM::tGPRRegClassID: return ARM::R7;
194     case ARM::DPRRegClassID: case ARM::DPR_8RegClassID:
195     case ARM::DPR_VFP2RegClassID:
196       return ARM::D7;
197     case ARM::QPRRegClassID: case ARM::QPR_VFP2RegClassID: return ARM::Q7;
198     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S7;
199     }
200     break;
201   case 8:
202     switch (RegClassID) {
203     case ARM::GPRRegClassID: return ARM::R8;
204     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D8;
205     case ARM::QPRRegClassID: return ARM::Q8;
206     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S8;
207     }
208     break;
209   case 9:
210     switch (RegClassID) {
211     case ARM::GPRRegClassID: return ARM::R9;
212     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D9;
213     case ARM::QPRRegClassID: return ARM::Q9;
214     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S9;
215     }
216     break;
217   case 10:
218     switch (RegClassID) {
219     case ARM::GPRRegClassID: return ARM::R10;
220     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D10;
221     case ARM::QPRRegClassID: return ARM::Q10;
222     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S10;
223     }
224     break;
225   case 11:
226     switch (RegClassID) {
227     case ARM::GPRRegClassID: return ARM::R11;
228     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D11;
229     case ARM::QPRRegClassID: return ARM::Q11;
230     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S11;
231     }
232     break;
233   case 12:
234     switch (RegClassID) {
235     case ARM::GPRRegClassID: return ARM::R12;
236     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D12;
237     case ARM::QPRRegClassID: return ARM::Q12;
238     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S12;
239     }
240     break;
241   case 13:
242     switch (RegClassID) {
243     case ARM::GPRRegClassID: return ARM::SP;
244     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D13;
245     case ARM::QPRRegClassID: return ARM::Q13;
246     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S13;
247     }
248     break;
249   case 14:
250     switch (RegClassID) {
251     case ARM::GPRRegClassID: return ARM::LR;
252     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D14;
253     case ARM::QPRRegClassID: return ARM::Q14;
254     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S14;
255     }
256     break;
257   case 15:
258     switch (RegClassID) {
259     case ARM::GPRRegClassID: return ARM::PC;
260     case ARM::DPRRegClassID: case ARM::DPR_VFP2RegClassID: return ARM::D15;
261     case ARM::QPRRegClassID: return ARM::Q15;
262     case ARM::SPRRegClassID: case ARM::SPR_8RegClassID: return ARM::S15;
263     }
264     break;
265   case 16:
266     switch (RegClassID) {
267     case ARM::DPRRegClassID: return ARM::D16;
268     case ARM::SPRRegClassID: return ARM::S16;
269     }
270     break;
271   case 17:
272     switch (RegClassID) {
273     case ARM::DPRRegClassID: return ARM::D17;
274     case ARM::SPRRegClassID: return ARM::S17;
275     }
276     break;
277   case 18:
278     switch (RegClassID) {
279     case ARM::DPRRegClassID: return ARM::D18;
280     case ARM::SPRRegClassID: return ARM::S18;
281     }
282     break;
283   case 19:
284     switch (RegClassID) {
285     case ARM::DPRRegClassID: return ARM::D19;
286     case ARM::SPRRegClassID: return ARM::S19;
287     }
288     break;
289   case 20:
290     switch (RegClassID) {
291     case ARM::DPRRegClassID: return ARM::D20;
292     case ARM::SPRRegClassID: return ARM::S20;
293     }
294     break;
295   case 21:
296     switch (RegClassID) {
297     case ARM::DPRRegClassID: return ARM::D21;
298     case ARM::SPRRegClassID: return ARM::S21;
299     }
300     break;
301   case 22:
302     switch (RegClassID) {
303     case ARM::DPRRegClassID: return ARM::D22;
304     case ARM::SPRRegClassID: return ARM::S22;
305     }
306     break;
307   case 23:
308     switch (RegClassID) {
309     case ARM::DPRRegClassID: return ARM::D23;
310     case ARM::SPRRegClassID: return ARM::S23;
311     }
312     break;
313   case 24:
314     switch (RegClassID) {
315     case ARM::DPRRegClassID: return ARM::D24;
316     case ARM::SPRRegClassID: return ARM::S24;
317     }
318     break;
319   case 25:
320     switch (RegClassID) {
321     case ARM::DPRRegClassID: return ARM::D25;
322     case ARM::SPRRegClassID: return ARM::S25;
323     }
324     break;
325   case 26:
326     switch (RegClassID) {
327     case ARM::DPRRegClassID: return ARM::D26;
328     case ARM::SPRRegClassID: return ARM::S26;
329     }
330     break;
331   case 27:
332     switch (RegClassID) {
333     case ARM::DPRRegClassID: return ARM::D27;
334     case ARM::SPRRegClassID: return ARM::S27;
335     }
336     break;
337   case 28:
338     switch (RegClassID) {
339     case ARM::DPRRegClassID: return ARM::D28;
340     case ARM::SPRRegClassID: return ARM::S28;
341     }
342     break;
343   case 29:
344     switch (RegClassID) {
345     case ARM::DPRRegClassID: return ARM::D29;
346     case ARM::SPRRegClassID: return ARM::S29;
347     }
348     break;
349   case 30:
350     switch (RegClassID) {
351     case ARM::DPRRegClassID: return ARM::D30;
352     case ARM::SPRRegClassID: return ARM::S30;
353     }
354     break;
355   case 31:
356     switch (RegClassID) {
357     case ARM::DPRRegClassID: return ARM::D31;
358     case ARM::SPRRegClassID: return ARM::S31;
359     }
360     break;
361   }
362   DEBUG(errs() << "Invalid (RegClassID, RawRegister) combination\n");
363   // Encoding error.  Mark the builder with error code != 0.
364   B->SetErr(-1);
365   return 0;
366 }
367
368 ///////////////////////////////
369 //                           //
370 //     Utility Functions     //
371 //                           //
372 ///////////////////////////////
373
374 // Extract/Decode Rd: Inst{15-12}.
375 static inline unsigned decodeRd(uint32_t insn) {
376   return (insn >> ARMII::RegRdShift) & ARMII::GPRRegMask;
377 }
378
379 // Extract/Decode Rn: Inst{19-16}.
380 static inline unsigned decodeRn(uint32_t insn) {
381   return (insn >> ARMII::RegRnShift) & ARMII::GPRRegMask;
382 }
383
384 // Extract/Decode Rm: Inst{3-0}.
385 static inline unsigned decodeRm(uint32_t insn) {
386   return (insn & ARMII::GPRRegMask);
387 }
388
389 // Extract/Decode Rs: Inst{11-8}.
390 static inline unsigned decodeRs(uint32_t insn) {
391   return (insn >> ARMII::RegRsShift) & ARMII::GPRRegMask;
392 }
393
394 static inline unsigned getCondField(uint32_t insn) {
395   return (insn >> ARMII::CondShift);
396 }
397
398 static inline unsigned getIBit(uint32_t insn) {
399   return (insn >> ARMII::I_BitShift) & 1;
400 }
401
402 static inline unsigned getAM3IBit(uint32_t insn) {
403   return (insn >> ARMII::AM3_I_BitShift) & 1;
404 }
405
406 static inline unsigned getPBit(uint32_t insn) {
407   return (insn >> ARMII::P_BitShift) & 1;
408 }
409
410 static inline unsigned getUBit(uint32_t insn) {
411   return (insn >> ARMII::U_BitShift) & 1;
412 }
413
414 static inline unsigned getPUBits(uint32_t insn) {
415   return (insn >> ARMII::U_BitShift) & 3;
416 }
417
418 static inline unsigned getSBit(uint32_t insn) {
419   return (insn >> ARMII::S_BitShift) & 1;
420 }
421
422 static inline unsigned getWBit(uint32_t insn) {
423   return (insn >> ARMII::W_BitShift) & 1;
424 }
425
426 static inline unsigned getDBit(uint32_t insn) {
427   return (insn >> ARMII::D_BitShift) & 1;
428 }
429
430 static inline unsigned getNBit(uint32_t insn) {
431   return (insn >> ARMII::N_BitShift) & 1;
432 }
433
434 static inline unsigned getMBit(uint32_t insn) {
435   return (insn >> ARMII::M_BitShift) & 1;
436 }
437
438 // See A8.4 Shifts applied to a register.
439 //     A8.4.2 Register controlled shifts.
440 //
441 // getShiftOpcForBits - getShiftOpcForBits translates from the ARM encoding bits
442 // into llvm enums for shift opcode.  The API clients should pass in the value
443 // encoded with two bits, so the assert stays to signal a wrong API usage.
444 //
445 // A8-12: DecodeRegShift()
446 static inline ARM_AM::ShiftOpc getShiftOpcForBits(unsigned bits) {
447   switch (bits) {
448   default: assert(0 && "No such value"); return ARM_AM::no_shift;
449   case 0:  return ARM_AM::lsl;
450   case 1:  return ARM_AM::lsr;
451   case 2:  return ARM_AM::asr;
452   case 3:  return ARM_AM::ror;
453   }
454 }
455
456 // See A8.4 Shifts applied to a register.
457 //     A8.4.1 Constant shifts.
458 //
459 // getImmShiftSE - getImmShiftSE translates from the raw ShiftOpc and raw Imm5
460 // encodings into the intended ShiftOpc and shift amount.
461 //
462 // A8-11: DecodeImmShift()
463 static inline void getImmShiftSE(ARM_AM::ShiftOpc &ShOp, unsigned &ShImm) {
464   if (ShImm != 0)
465     return;
466   switch (ShOp) {
467   case ARM_AM::no_shift:
468   case ARM_AM::rrx:
469     break;
470   case ARM_AM::lsl:
471     ShOp = ARM_AM::no_shift;
472     break;
473   case ARM_AM::lsr:
474   case ARM_AM::asr:
475     ShImm = 32;
476     break;
477   case ARM_AM::ror:
478     ShOp = ARM_AM::rrx;
479     break;
480   }
481 }
482
483 // getAMSubModeForBits - getAMSubModeForBits translates from the ARM encoding
484 // bits Inst{24-23} (P(24) and U(23)) into llvm enums for AMSubMode.  The API
485 // clients should pass in the value encoded with two bits, so the assert stays
486 // to signal a wrong API usage.
487 static inline ARM_AM::AMSubMode getAMSubModeForBits(unsigned bits) {
488   switch (bits) {
489   default: assert(0 && "No such value"); return ARM_AM::bad_am_submode;
490   case 1:  return ARM_AM::ia;   // P=0 U=1
491   case 3:  return ARM_AM::ib;   // P=1 U=1
492   case 0:  return ARM_AM::da;   // P=0 U=0
493   case 2:  return ARM_AM::db;   // P=1 U=0
494   }
495 }
496
497 ////////////////////////////////////////////
498 //                                        //
499 //    Disassemble function definitions    //
500 //                                        //
501 ////////////////////////////////////////////
502
503 /// There is a separate Disassemble*Frm function entry for disassembly of an ARM
504 /// instr into a list of MCOperands in the appropriate order, with possible dst,
505 /// followed by possible src(s).
506 ///
507 /// The processing of the predicate, and the 'S' modifier bit, if MI modifies
508 /// the CPSR, is factored into ARMBasicMCBuilder's method named
509 /// TryPredicateAndSBitModifier.
510
511 static bool DisassemblePseudo(MCInst &MI, unsigned Opcode, uint32_t insn,
512     unsigned short NumOps, unsigned &NumOpsAdded, BO) {
513
514   assert(0 && "Unexpected pseudo instruction!");
515   return false;
516 }
517
518 // A8.6.94 MLA
519 // if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE;
520 //
521 // A8.6.105 MUL
522 // if d == 15 || n == 15 || m == 15 then UNPREDICTABLE;
523 //
524 // A8.6.246 UMULL
525 // if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE;
526 // if dHi == dLo then UNPREDICTABLE;
527 static bool BadRegsMulFrm(unsigned Opcode, uint32_t insn) {
528   unsigned R19_16 = slice(insn, 19, 16);
529   unsigned R15_12 = slice(insn, 15, 12);
530   unsigned R11_8  = slice(insn, 11, 8);
531   unsigned R3_0   = slice(insn, 3, 0);
532   switch (Opcode) {
533   default:
534     // Did we miss an opcode?
535     assert(0 && "Unexpected opcode!");
536     return false;
537   case ARM::MLA:     case ARM::MLS:     case ARM::SMLABB:  case ARM::SMLABT:
538   case ARM::SMLATB:  case ARM::SMLATT:  case ARM::SMLAWB:  case ARM::SMLAWT:
539   case ARM::SMMLA:   case ARM::SMMLS:   case ARM::USADA8:
540     if (R19_16 == 15 || R15_12 == 15 || R11_8 == 15 || R3_0 == 15)
541       return true;
542     return false;
543   case ARM::MUL:     case ARM::SMMUL:   case ARM::SMULBB:  case ARM::SMULBT:
544   case ARM::SMULTB:  case ARM::SMULTT:  case ARM::SMULWB:  case ARM::SMULWT:
545   case ARM::SMUAD:   case ARM::SMUADX:
546   // A8.6.167 SMLAD & A8.6.172 SMLSD
547   case ARM::SMLAD:   case ARM::SMLADX:  case ARM::SMLSD:   case ARM::SMLSDX:
548   case ARM::USAD8:
549     if (R19_16 == 15 || R11_8 == 15 || R3_0 == 15)
550       return true;
551     return false;
552   case ARM::SMLAL:   case ARM::SMULL:   case ARM::UMAAL:   case ARM::UMLAL:
553   case ARM::UMULL:
554   case ARM::SMLALBB: case ARM::SMLALBT: case ARM::SMLALTB: case ARM::SMLALTT:
555   case ARM::SMLALD:  case ARM::SMLALDX: case ARM::SMLSLD:  case ARM::SMLSLDX:
556     if (R19_16 == 15 || R15_12 == 15 || R11_8 == 15 || R3_0 == 15)
557       return true;
558     if (R19_16 == R15_12)
559       return true;
560     return false;;
561   }
562 }
563
564 // Multiply Instructions.
565 // MLA, MLS, SMLABB, SMLABT, SMLATB, SMLATT, SMLAWB, SMLAWT, SMMLA, SMMLS,
566 // SMLAD, SMLADX, SMLSD, SMLSDX, USADA8 (for convenience):
567 //     Rd{19-16} Rn{3-0} Rm{11-8} Ra{15-12}
568 // But note that register checking for {SMLAD, SMLADX, SMLSD, SMLSDX} is
569 // only for {d, n, m}.
570 //
571 // MUL, SMMUL, SMULBB, SMULBT, SMULTB, SMULTT, SMULWB, SMULWT, SMUAD, SMUADX,
572 // USAD8 (for convenience):
573 //     Rd{19-16} Rn{3-0} Rm{11-8}
574 //
575 // SMLAL, SMULL, UMAAL, UMLAL, UMULL, SMLALBB, SMLALBT, SMLALTB, SMLALTT,
576 // SMLALD, SMLADLX, SMLSLD, SMLSLDX:
577 //     RdLo{15-12} RdHi{19-16} Rn{3-0} Rm{11-8}
578 //
579 // The mapping of the multiply registers to the "regular" ARM registers, where
580 // there are convenience decoder functions, is:
581 //
582 // Inst{15-12} => Rd
583 // Inst{19-16} => Rn
584 // Inst{3-0} => Rm
585 // Inst{11-8} => Rs
586 static bool DisassembleMulFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
587     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
588
589   const TargetInstrDesc &TID = ARMInsts[Opcode];
590   unsigned short NumDefs = TID.getNumDefs();
591   const TargetOperandInfo *OpInfo = TID.OpInfo;
592   unsigned &OpIdx = NumOpsAdded;
593
594   OpIdx = 0;
595
596   assert(NumDefs > 0 && "NumDefs should be greater than 0 for MulFrm");
597   assert(NumOps >= 3
598          && OpInfo[0].RegClass == ARM::GPRRegClassID
599          && OpInfo[1].RegClass == ARM::GPRRegClassID
600          && OpInfo[2].RegClass == ARM::GPRRegClassID
601          && "Expect three register operands");
602
603   // Sanity check for the register encodings.
604   if (BadRegsMulFrm(Opcode, insn))
605     return false;
606
607   // Instructions with two destination registers have RdLo{15-12} first.
608   if (NumDefs == 2) {
609     assert(NumOps >= 4 && OpInfo[3].RegClass == ARM::GPRRegClassID &&
610            "Expect 4th register operand");
611     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
612                                                        decodeRd(insn))));
613     ++OpIdx;
614   }
615
616   // The destination register: RdHi{19-16} or Rd{19-16}.
617   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
618                                                      decodeRn(insn))));
619
620   // The two src regsiters: Rn{3-0}, then Rm{11-8}.
621   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
622                                                      decodeRm(insn))));
623   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
624                                                      decodeRs(insn))));
625   OpIdx += 3;
626
627   // Many multiply instructions (e.g., MLA) have three src registers.
628   // The third register operand is Ra{15-12}.
629   if (OpIdx < NumOps && OpInfo[OpIdx].RegClass == ARM::GPRRegClassID) {
630     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
631                                                        decodeRd(insn))));
632     ++OpIdx;
633   }
634
635   return true;
636 }
637
638 // Helper routines for disassembly of coprocessor instructions.
639
640 static bool LdStCopOpcode(unsigned Opcode) {
641   if ((Opcode >= ARM::LDC2L_OFFSET && Opcode <= ARM::LDC_PRE) ||
642       (Opcode >= ARM::STC2L_OFFSET && Opcode <= ARM::STC_PRE))
643     return true;
644   return false;
645 }
646 static bool CoprocessorOpcode(unsigned Opcode) {
647   if (LdStCopOpcode(Opcode))
648     return true;
649
650   switch (Opcode) {
651   default:
652     return false;
653   case ARM::CDP:  case ARM::CDP2:
654   case ARM::MCR:  case ARM::MCR2:  case ARM::MRC:  case ARM::MRC2:
655   case ARM::MCRR: case ARM::MCRR2: case ARM::MRRC: case ARM::MRRC2:
656     return true;
657   }
658 }
659 static inline unsigned GetCoprocessor(uint32_t insn) {
660   return slice(insn, 11, 8);
661 }
662 static inline unsigned GetCopOpc1(uint32_t insn, bool CDP) {
663   return CDP ? slice(insn, 23, 20) : slice(insn, 23, 21);
664 }
665 static inline unsigned GetCopOpc2(uint32_t insn) {
666   return slice(insn, 7, 5);
667 }
668 static inline unsigned GetCopOpc(uint32_t insn) {
669   return slice(insn, 7, 4);
670 }
671 // Most of the operands are in immediate forms, except Rd and Rn, which are ARM
672 // core registers.
673 //
674 // CDP, CDP2:                cop opc1 CRd CRn CRm opc2
675 //
676 // MCR, MCR2, MRC, MRC2:     cop opc1 Rd CRn CRm opc2
677 //
678 // MCRR, MCRR2, MRRC, MRRc2: cop opc Rd Rn CRm
679 //
680 // LDC_OFFSET, LDC_PRE, LDC_POST: cop CRd Rn R0 [+/-]imm8:00
681 // and friends
682 // STC_OFFSET, STC_PRE, STC_POST: cop CRd Rn R0 [+/-]imm8:00
683 // and friends
684 //                                        <-- addrmode2 -->
685 //
686 // LDC_OPTION:                    cop CRd Rn imm8
687 // and friends
688 // STC_OPTION:                    cop CRd Rn imm8
689 // and friends
690 //
691 static bool DisassembleCoprocessor(MCInst &MI, unsigned Opcode, uint32_t insn,
692     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
693
694   assert(NumOps >= 4 && "Num of operands >= 4 for coprocessor instr");
695
696   unsigned &OpIdx = NumOpsAdded;
697   // A8.6.92
698   // if coproc == '101x' then SEE "Advanced SIMD and VFP"
699   // But since the special instructions have more explicit encoding bits
700   // specified, if coproc == 10 or 11, we should reject it as invalid.
701   unsigned coproc = GetCoprocessor(insn);
702   if ((Opcode == ARM::MCR || Opcode == ARM::MCRR ||
703        Opcode == ARM::MRC || Opcode == ARM::MRRC) &&
704       (coproc == 10 || coproc == 11)) {
705     DEBUG(errs() << "Encoding error: coproc == 10 or 11 for MCR[R]/MR[R]C\n");
706     return false;
707   }
708
709   bool OneCopOpc = (Opcode == ARM::MCRR || Opcode == ARM::MCRR2 ||
710                     Opcode == ARM::MRRC || Opcode == ARM::MRRC2);
711
712   // CDP/CDP2 has no GPR operand; the opc1 operand is also wider (Inst{23-20}).
713   bool NoGPR = (Opcode == ARM::CDP || Opcode == ARM::CDP2);
714   bool LdStCop = LdStCopOpcode(Opcode);
715   bool RtOut = (Opcode == ARM::MRC || Opcode == ARM::MRC2);
716
717   OpIdx = 0;
718
719   if (RtOut) {
720     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
721                                                        decodeRd(insn))));
722     ++OpIdx;
723   }
724   MI.addOperand(MCOperand::CreateImm(coproc));
725   ++OpIdx;
726
727   if (LdStCop) {
728     // Unindex if P:W = 0b00 --> _OPTION variant
729     unsigned PW = getPBit(insn) << 1 | getWBit(insn);
730
731     MI.addOperand(MCOperand::CreateImm(decodeRd(insn)));
732
733     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
734                                                        decodeRn(insn))));
735     OpIdx += 2;
736
737     if (PW) {
738       MI.addOperand(MCOperand::CreateReg(0));
739       ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
740       const TargetInstrDesc &TID = ARMInsts[Opcode];
741       unsigned IndexMode =
742                   (TID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
743       unsigned Offset = ARM_AM::getAM2Opc(AddrOpcode, slice(insn, 7, 0) << 2,
744                                           ARM_AM::no_shift, IndexMode);
745       MI.addOperand(MCOperand::CreateImm(Offset));
746       OpIdx += 2;
747     } else {
748       MI.addOperand(MCOperand::CreateImm(slice(insn, 7, 0)));
749       ++OpIdx;
750     }
751   } else {
752     MI.addOperand(MCOperand::CreateImm(OneCopOpc ? GetCopOpc(insn)
753                                                  : GetCopOpc1(insn, NoGPR)));
754     ++OpIdx;
755
756     if (!RtOut) {
757       MI.addOperand(NoGPR ? MCOperand::CreateImm(decodeRd(insn))
758                           : MCOperand::CreateReg(
759                                 getRegisterEnum(B, ARM::GPRRegClassID,
760                                                 decodeRd(insn))));
761       ++OpIdx;
762     }
763
764     MI.addOperand(OneCopOpc ? MCOperand::CreateReg(
765                                 getRegisterEnum(B, ARM::GPRRegClassID,
766                                                 decodeRn(insn)))
767                             : MCOperand::CreateImm(decodeRn(insn)));
768
769     MI.addOperand(MCOperand::CreateImm(decodeRm(insn)));
770
771     OpIdx += 2;
772
773     if (!OneCopOpc) {
774       MI.addOperand(MCOperand::CreateImm(GetCopOpc2(insn)));
775       ++OpIdx;
776     }
777   }
778
779   return true;
780 }
781
782 // Branch Instructions.
783 // BL: SignExtend(Imm24:'00', 32)
784 // Bcc, BL_pred: SignExtend(Imm24:'00', 32) Pred0 Pred1
785 // SMC: ZeroExtend(imm4, 32)
786 // SVC: ZeroExtend(Imm24, 32)
787 //
788 // Various coprocessor instructions are assigned BrFrm arbitrarily.
789 // Delegates to DisassembleCoprocessor() helper function.
790 //
791 // MRS/MRSsys: Rd
792 // MSR/MSRsys: Rm mask=Inst{19-16}
793 // BXJ:        Rm
794 // MSRi/MSRsysi: so_imm
795 // SRSW/SRS: ldstm_mode:$amode mode_imm
796 // RFEW/RFE: ldstm_mode:$amode Rn
797 static bool DisassembleBrFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
798     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
799
800   if (CoprocessorOpcode(Opcode))
801     return DisassembleCoprocessor(MI, Opcode, insn, NumOps, NumOpsAdded, B);
802
803   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
804   if (!OpInfo) return false;
805
806   // MRS and MRSsys take one GPR reg Rd.
807   if (Opcode == ARM::MRS || Opcode == ARM::MRSsys) {
808     assert(NumOps >= 1 && OpInfo[0].RegClass == ARM::GPRRegClassID &&
809            "Reg operand expected");
810     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
811                                                        decodeRd(insn))));
812     NumOpsAdded = 1;
813     return true;
814   }
815   // BXJ takes one GPR reg Rm.
816   if (Opcode == ARM::BXJ) {
817     assert(NumOps >= 1 && OpInfo[0].RegClass == ARM::GPRRegClassID &&
818            "Reg operand expected");
819     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
820                                                        decodeRm(insn))));
821     NumOpsAdded = 1;
822     return true;
823   }
824   // MSR take a mask, followed by one GPR reg Rm. The mask contains the R Bit in
825   // bit 4, and the special register fields in bits 3-0.
826   if (Opcode == ARM::MSR) {
827     assert(NumOps >= 1 && OpInfo[1].RegClass == ARM::GPRRegClassID &&
828            "Reg operand expected");
829     MI.addOperand(MCOperand::CreateImm(slice(insn, 22, 22) << 4 /* R Bit */ |
830                                        slice(insn, 19, 16) /* Special Reg */ ));
831     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
832                                                        decodeRm(insn))));
833     NumOpsAdded = 2;
834     return true;
835   }
836   // MSRi take a mask, followed by one so_imm operand. The mask contains the
837   // R Bit in bit 4, and the special register fields in bits 3-0.
838   if (Opcode == ARM::MSRi) {
839     // A5.2.11 MSR (immediate), and hints & B6.1.6 MSR (immediate)
840     // The hints instructions have more specific encodings, so if mask == 0,
841     // we should reject this as an invalid instruction.
842     if (slice(insn, 19, 16) == 0)
843       return false;
844     MI.addOperand(MCOperand::CreateImm(slice(insn, 22, 22) << 4 /* R Bit */ |
845                                        slice(insn, 19, 16) /* Special Reg */ ));
846     // SOImm is 4-bit rotate amount in bits 11-8 with 8-bit imm in bits 7-0.
847     // A5.2.4 Rotate amount is twice the numeric value of Inst{11-8}.
848     // See also ARMAddressingModes.h: getSOImmValImm() and getSOImmValRot().
849     unsigned Rot = (insn >> ARMII::SoRotImmShift) & 0xF;
850     unsigned Imm = insn & 0xFF;
851     MI.addOperand(MCOperand::CreateImm(ARM_AM::rotr32(Imm, 2*Rot)));
852     NumOpsAdded = 2;
853     return true;
854   }
855   if (Opcode == ARM::SRSW || Opcode == ARM::SRS ||
856       Opcode == ARM::RFEW || Opcode == ARM::RFE) {
857     ARM_AM::AMSubMode SubMode = getAMSubModeForBits(getPUBits(insn));
858     MI.addOperand(MCOperand::CreateImm(ARM_AM::getAM4ModeImm(SubMode)));
859
860     if (Opcode == ARM::SRSW || Opcode == ARM::SRS)
861       MI.addOperand(MCOperand::CreateImm(slice(insn, 4, 0)));
862     else
863       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
864                                                          decodeRn(insn))));
865     NumOpsAdded = 3;
866     return true;
867   }
868
869   assert((Opcode == ARM::Bcc || Opcode == ARM::BL || Opcode == ARM::BL_pred
870           || Opcode == ARM::SMC || Opcode == ARM::SVC) &&
871          "Unexpected Opcode");
872
873   assert(NumOps >= 1 && OpInfo[0].RegClass < 0 && "Imm operand expected");
874
875   int Imm32 = 0;
876   if (Opcode == ARM::SMC) {
877     // ZeroExtend(imm4, 32) where imm24 = Inst{3-0}.
878     Imm32 = slice(insn, 3, 0);
879   } else if (Opcode == ARM::SVC) {
880     // ZeroExtend(imm24, 32) where imm24 = Inst{23-0}.
881     Imm32 = slice(insn, 23, 0);
882   } else {
883     // SignExtend(imm24:'00', 32) where imm24 = Inst{23-0}.
884     unsigned Imm26 = slice(insn, 23, 0) << 2;
885     //Imm32 = signextend<signed int, 26>(Imm26);
886     Imm32 = SignExtend32<26>(Imm26);
887   }
888
889   MI.addOperand(MCOperand::CreateImm(Imm32));
890   NumOpsAdded = 1;
891
892   return true;
893 }
894
895 // Misc. Branch Instructions.
896 // BLX, BLXi, BX
897 // BX, BX_RET
898 static bool DisassembleBrMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
899     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
900
901   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
902   if (!OpInfo) return false;
903
904   unsigned &OpIdx = NumOpsAdded;
905
906   OpIdx = 0;
907
908   // BX_RET and MOVPCLR have only two predicate operands; do an early return.
909   if (Opcode == ARM::BX_RET || Opcode == ARM::MOVPCLR)
910     return true;
911
912   // BLX and BX take one GPR reg.
913   if (Opcode == ARM::BLX || Opcode == ARM::BLX_pred ||
914       Opcode == ARM::BX) {
915     assert(NumOps >= 1 && OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
916            "Reg operand expected");
917     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
918                                                        decodeRm(insn))));
919     OpIdx = 1;
920     return true;
921   }
922
923   // BLXi takes imm32 (the PC offset).
924   if (Opcode == ARM::BLXi) {
925     assert(NumOps >= 1 && OpInfo[0].RegClass < 0 && "Imm operand expected");
926     // SignExtend(imm24:H:'0', 32) where imm24 = Inst{23-0} and H = Inst{24}.
927     unsigned Imm26 = slice(insn, 23, 0) << 2 | slice(insn, 24, 24) << 1;
928     int Imm32 = SignExtend32<26>(Imm26);
929     MI.addOperand(MCOperand::CreateImm(Imm32));
930     OpIdx = 1;
931     return true;
932   }
933
934   return false;
935 }
936
937 static inline bool getBFCInvMask(uint32_t insn, uint32_t &mask) {
938   uint32_t lsb = slice(insn, 11, 7);
939   uint32_t msb = slice(insn, 20, 16);
940   uint32_t Val = 0;
941   if (msb < lsb) {
942     DEBUG(errs() << "Encoding error: msb < lsb\n");
943     return false;
944   }
945
946   for (uint32_t i = lsb; i <= msb; ++i)
947     Val |= (1 << i);
948   mask = ~Val;
949   return true;
950 }
951
952 // A major complication is the fact that some of the saturating add/subtract
953 // operations have Rd Rm Rn, instead of the "normal" Rd Rn Rm.
954 // They are QADD, QDADD, QDSUB, and QSUB.
955 static bool DisassembleDPFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
956     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
957
958   const TargetInstrDesc &TID = ARMInsts[Opcode];
959   unsigned short NumDefs = TID.getNumDefs();
960   bool isUnary = isUnaryDP(TID.TSFlags);
961   const TargetOperandInfo *OpInfo = TID.OpInfo;
962   unsigned &OpIdx = NumOpsAdded;
963
964   OpIdx = 0;
965
966   // Disassemble register def if there is one.
967   if (NumDefs && (OpInfo[OpIdx].RegClass == ARM::GPRRegClassID)) {
968     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
969                                                        decodeRd(insn))));
970     ++OpIdx;
971   }
972
973   // Now disassemble the src operands.
974   if (OpIdx >= NumOps)
975     return false;
976
977   // Special-case handling of BFC/BFI/SBFX/UBFX.
978   if (Opcode == ARM::BFC || Opcode == ARM::BFI) {
979     MI.addOperand(MCOperand::CreateReg(0));
980     if (Opcode == ARM::BFI) {
981       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
982                                                          decodeRm(insn))));
983       ++OpIdx;
984     }
985     uint32_t mask = 0;
986     if (!getBFCInvMask(insn, mask))
987       return false;
988
989     MI.addOperand(MCOperand::CreateImm(mask));
990     OpIdx += 2;
991     return true;
992   }
993   if (Opcode == ARM::SBFX || Opcode == ARM::UBFX) {
994     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
995                                                        decodeRm(insn))));
996     MI.addOperand(MCOperand::CreateImm(slice(insn, 11, 7)));
997     MI.addOperand(MCOperand::CreateImm(slice(insn, 20, 16) + 1));
998     OpIdx += 3;
999     return true;
1000   }
1001
1002   bool RmRn = (Opcode == ARM::QADD || Opcode == ARM::QDADD ||
1003                Opcode == ARM::QDSUB || Opcode == ARM::QSUB);
1004
1005   // BinaryDP has an Rn operand.
1006   if (!isUnary) {
1007     assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1008            "Reg operand expected");
1009     MI.addOperand(MCOperand::CreateReg(
1010                     getRegisterEnum(B, ARM::GPRRegClassID,
1011                                     RmRn ? decodeRm(insn) : decodeRn(insn))));
1012     ++OpIdx;
1013   }
1014
1015   // If this is a two-address operand, skip it, e.g., MOVCCr operand 1.
1016   if (isUnary && (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)) {
1017     MI.addOperand(MCOperand::CreateReg(0));
1018     ++OpIdx;
1019   }
1020
1021   // Now disassemble operand 2.
1022   if (OpIdx >= NumOps)
1023     return false;
1024
1025   if (OpInfo[OpIdx].RegClass == ARM::GPRRegClassID) {
1026     // We have a reg/reg form.
1027     // Assert disabled because saturating operations, e.g., A8.6.127 QASX, are
1028     // routed here as well.
1029     // assert(getIBit(insn) == 0 && "I_Bit != '0' reg/reg form");
1030     MI.addOperand(MCOperand::CreateReg(
1031                     getRegisterEnum(B, ARM::GPRRegClassID,
1032                                     RmRn? decodeRn(insn) : decodeRm(insn))));
1033     ++OpIdx;
1034   } else if (Opcode == ARM::MOVi16 || Opcode == ARM::MOVTi16) {
1035     // We have an imm16 = imm4:imm12 (imm4=Inst{19:16}, imm12 = Inst{11:0}).
1036     assert(getIBit(insn) == 1 && "I_Bit != '1' reg/imm form");
1037     unsigned Imm16 = slice(insn, 19, 16) << 12 | slice(insn, 11, 0);
1038     MI.addOperand(MCOperand::CreateImm(Imm16));
1039     ++OpIdx;
1040   } else {
1041     // We have a reg/imm form.
1042     // SOImm is 4-bit rotate amount in bits 11-8 with 8-bit imm in bits 7-0.
1043     // A5.2.4 Rotate amount is twice the numeric value of Inst{11-8}.
1044     // See also ARMAddressingModes.h: getSOImmValImm() and getSOImmValRot().
1045     assert(getIBit(insn) == 1 && "I_Bit != '1' reg/imm form");
1046     unsigned Rot = (insn >> ARMII::SoRotImmShift) & 0xF;
1047     unsigned Imm = insn & 0xFF;
1048     MI.addOperand(MCOperand::CreateImm(ARM_AM::rotr32(Imm, 2*Rot)));
1049     ++OpIdx;
1050   }
1051
1052   return true;
1053 }
1054
1055 static bool DisassembleDPSoRegFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1056     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1057
1058   const TargetInstrDesc &TID = ARMInsts[Opcode];
1059   unsigned short NumDefs = TID.getNumDefs();
1060   bool isUnary = isUnaryDP(TID.TSFlags);
1061   const TargetOperandInfo *OpInfo = TID.OpInfo;
1062   unsigned &OpIdx = NumOpsAdded;
1063
1064   OpIdx = 0;
1065
1066   // Disassemble register def if there is one.
1067   if (NumDefs && (OpInfo[OpIdx].RegClass == ARM::GPRRegClassID)) {
1068     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1069                                                        decodeRd(insn))));
1070     ++OpIdx;
1071   }
1072
1073   // Disassemble the src operands.
1074   if (OpIdx >= NumOps)
1075     return false;
1076
1077   // BinaryDP has an Rn operand.
1078   if (!isUnary) {
1079     assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1080            "Reg operand expected");
1081     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1082                                                        decodeRn(insn))));
1083     ++OpIdx;
1084   }
1085
1086   // If this is a two-address operand, skip it, e.g., MOVCCs operand 1.
1087   if (isUnary && (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1)) {
1088     MI.addOperand(MCOperand::CreateReg(0));
1089     ++OpIdx;
1090   }
1091
1092   // Disassemble operand 2, which consists of three components.
1093   if (OpIdx + 2 >= NumOps)
1094     return false;
1095
1096   assert((OpInfo[OpIdx].RegClass == ARM::GPRRegClassID) &&
1097          (OpInfo[OpIdx+1].RegClass == ARM::GPRRegClassID) &&
1098          (OpInfo[OpIdx+2].RegClass < 0) &&
1099          "Expect 3 reg operands");
1100
1101   // Register-controlled shifts have Inst{7} = 0 and Inst{4} = 1.
1102   unsigned Rs = slice(insn, 4, 4);
1103
1104   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1105                                                      decodeRm(insn))));
1106   if (Rs) {
1107     // If Inst{7} != 0, we should reject this insn as an invalid encoding.
1108     if (slice(insn, 7, 7))
1109       return false;
1110
1111     // A8.6.3 ADC (register-shifted register)
1112     // if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE;
1113     // 
1114     // This also accounts for shift instructions (register) where, fortunately,
1115     // Inst{19-16} = 0b0000.
1116     // A8.6.89 LSL (register)
1117     // if d == 15 || n == 15 || m == 15 then UNPREDICTABLE;
1118     if (decodeRd(insn) == 15 || decodeRn(insn) == 15 ||
1119         decodeRm(insn) == 15 || decodeRs(insn) == 15)
1120       return false;
1121     
1122     // Register-controlled shifts: [Rm, Rs, shift].
1123     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1124                                                        decodeRs(insn))));
1125     // Inst{6-5} encodes the shift opcode.
1126     ARM_AM::ShiftOpc ShOp = getShiftOpcForBits(slice(insn, 6, 5));
1127     MI.addOperand(MCOperand::CreateImm(ARM_AM::getSORegOpc(ShOp, 0)));
1128   } else {
1129     // Constant shifts: [Rm, reg0, shift_imm].
1130     MI.addOperand(MCOperand::CreateReg(0)); // NoRegister
1131     // Inst{6-5} encodes the shift opcode.
1132     ARM_AM::ShiftOpc ShOp = getShiftOpcForBits(slice(insn, 6, 5));
1133     // Inst{11-7} encodes the imm5 shift amount.
1134     unsigned ShImm = slice(insn, 11, 7);
1135
1136     // A8.4.1.  Possible rrx or shift amount of 32...
1137     getImmShiftSE(ShOp, ShImm);
1138     MI.addOperand(MCOperand::CreateImm(ARM_AM::getSORegOpc(ShOp, ShImm)));
1139   }
1140   OpIdx += 3;
1141
1142   return true;
1143 }
1144
1145 static bool DisassembleLdStFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1146     unsigned short NumOps, unsigned &NumOpsAdded, bool isStore, BO B) {
1147
1148   const TargetInstrDesc &TID = ARMInsts[Opcode];
1149   bool isPrePost = isPrePostLdSt(TID.TSFlags);
1150   const TargetOperandInfo *OpInfo = TID.OpInfo;
1151   if (!OpInfo) return false;
1152
1153   unsigned &OpIdx = NumOpsAdded;
1154
1155   OpIdx = 0;
1156
1157   assert(((!isStore && TID.getNumDefs() > 0) ||
1158           (isStore && (TID.getNumDefs() == 0 || isPrePost)))
1159          && "Invalid arguments");
1160
1161   // Operand 0 of a pre- and post-indexed store is the address base writeback.
1162   if (isPrePost && isStore) {
1163     assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1164            "Reg operand expected");
1165     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1166                                                        decodeRn(insn))));
1167     ++OpIdx;
1168   }
1169
1170   // Disassemble the dst/src operand.
1171   if (OpIdx >= NumOps)
1172     return false;
1173
1174   assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1175          "Reg operand expected");
1176   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1177                                                      decodeRd(insn))));
1178   ++OpIdx;
1179
1180   // After dst of a pre- and post-indexed load is the address base writeback.
1181   if (isPrePost && !isStore) {
1182     assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1183            "Reg operand expected");
1184     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1185                                                        decodeRn(insn))));
1186     ++OpIdx;
1187   }
1188
1189   // Disassemble the base operand.
1190   if (OpIdx >= NumOps)
1191     return false;
1192
1193   assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1194          "Reg operand expected");
1195   assert((!isPrePost || (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1))
1196          && "Index mode or tied_to operand expected");
1197   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1198                                                      decodeRn(insn))));
1199   ++OpIdx;
1200
1201   // For reg/reg form, base reg is followed by +/- reg shop imm.
1202   // For immediate form, it is followed by +/- imm12.
1203   // See also ARMAddressingModes.h (Addressing Mode #2).
1204   if (OpIdx + 1 >= NumOps)
1205     return false;
1206
1207   ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
1208   unsigned IndexMode =
1209                (TID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
1210   if (getIBit(insn) == 0) {
1211     // For pre- and post-indexed case, add a reg0 operand (Addressing Mode #2).
1212     // Otherwise, skip the reg operand since for addrmode_imm12, Rn has already
1213     // been populated.
1214     if (isPrePost) {
1215       MI.addOperand(MCOperand::CreateReg(0));
1216       OpIdx += 1;
1217     }
1218
1219     unsigned Imm12 = slice(insn, 11, 0);
1220     if (Opcode == ARM::LDRBi12 || Opcode == ARM::LDRi12 ||
1221         Opcode == ARM::STRBi12 || Opcode == ARM::STRi12) {
1222       // Disassemble the 12-bit immediate offset, which is the second operand in
1223       // $addrmode_imm12 => (ops GPR:$base, i32imm:$offsimm).    
1224       int Offset = AddrOpcode == ARM_AM::add ? 1 * Imm12 : -1 * Imm12;
1225       MI.addOperand(MCOperand::CreateImm(Offset));
1226     } else {
1227       // Disassemble the 12-bit immediate offset, which is the second operand in
1228       // $am2offset => (ops GPR, i32imm).
1229       unsigned Offset = ARM_AM::getAM2Opc(AddrOpcode, Imm12, ARM_AM::no_shift,
1230                                           IndexMode);
1231       MI.addOperand(MCOperand::CreateImm(Offset));
1232     }
1233     OpIdx += 1;
1234   } else {
1235     // If Inst{25} = 1 and Inst{4} != 0, we should reject this as invalid.
1236     if (slice(insn,4,4) == 1)
1237       return false;
1238
1239     // Disassemble the offset reg (Rm), shift type, and immediate shift length.
1240     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1241                                                        decodeRm(insn))));
1242     // Inst{6-5} encodes the shift opcode.
1243     ARM_AM::ShiftOpc ShOp = getShiftOpcForBits(slice(insn, 6, 5));
1244     // Inst{11-7} encodes the imm5 shift amount.
1245     unsigned ShImm = slice(insn, 11, 7);
1246
1247     // A8.4.1.  Possible rrx or shift amount of 32...
1248     getImmShiftSE(ShOp, ShImm);
1249     MI.addOperand(MCOperand::CreateImm(
1250                     ARM_AM::getAM2Opc(AddrOpcode, ShImm, ShOp, IndexMode)));
1251     OpIdx += 2;
1252   }
1253
1254   return true;
1255 }
1256
1257 static bool DisassembleLdFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1258     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1259   return DisassembleLdStFrm(MI, Opcode, insn, NumOps, NumOpsAdded, false, B);
1260 }
1261
1262 static bool DisassembleStFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1263     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1264   return DisassembleLdStFrm(MI, Opcode, insn, NumOps, NumOpsAdded, true, B);
1265 }
1266
1267 static bool HasDualReg(unsigned Opcode) {
1268   switch (Opcode) {
1269   default:
1270     return false;
1271   case ARM::LDRD: case ARM::LDRD_PRE: case ARM::LDRD_POST:
1272   case ARM::STRD: case ARM::STRD_PRE: case ARM::STRD_POST:
1273     return true;
1274   }
1275 }
1276
1277 static bool DisassembleLdStMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1278     unsigned short NumOps, unsigned &NumOpsAdded, bool isStore, BO B) {
1279
1280   const TargetInstrDesc &TID = ARMInsts[Opcode];
1281   bool isPrePost = isPrePostLdSt(TID.TSFlags);
1282   const TargetOperandInfo *OpInfo = TID.OpInfo;
1283   if (!OpInfo) return false;
1284
1285   unsigned &OpIdx = NumOpsAdded;
1286
1287   OpIdx = 0;
1288
1289   assert(((!isStore && TID.getNumDefs() > 0) ||
1290           (isStore && (TID.getNumDefs() == 0 || isPrePost)))
1291          && "Invalid arguments");
1292
1293   // Operand 0 of a pre- and post-indexed store is the address base writeback.
1294   if (isPrePost && isStore) {
1295     assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1296            "Reg operand expected");
1297     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1298                                                        decodeRn(insn))));
1299     ++OpIdx;
1300   }
1301
1302   // Disassemble the dst/src operand.
1303   if (OpIdx >= NumOps)
1304     return false;
1305
1306   assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1307          "Reg operand expected");
1308   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1309                                                      decodeRd(insn))));
1310   ++OpIdx;
1311
1312   // Fill in LDRD and STRD's second operand Rt operand.
1313   if (HasDualReg(Opcode)) {
1314     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1315                                                        decodeRd(insn) + 1)));
1316     ++OpIdx;
1317   }
1318
1319   // After dst of a pre- and post-indexed load is the address base writeback.
1320   if (isPrePost && !isStore) {
1321     assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1322            "Reg operand expected");
1323     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1324                                                        decodeRn(insn))));
1325     ++OpIdx;
1326   }
1327
1328   // Disassemble the base operand.
1329   if (OpIdx >= NumOps)
1330     return false;
1331
1332   assert(OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
1333          "Reg operand expected");
1334   assert((!isPrePost || (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1))
1335          && "Offset mode or tied_to operand expected");
1336   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1337                                                      decodeRn(insn))));
1338   ++OpIdx;
1339
1340   // For reg/reg form, base reg is followed by +/- reg.
1341   // For immediate form, it is followed by +/- imm8.
1342   // See also ARMAddressingModes.h (Addressing Mode #3).
1343   if (OpIdx + 1 >= NumOps)
1344     return false;
1345
1346   assert((OpInfo[OpIdx].RegClass == ARM::GPRRegClassID) &&
1347          (OpInfo[OpIdx+1].RegClass < 0) &&
1348          "Expect 1 reg operand followed by 1 imm operand");
1349
1350   ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
1351   unsigned IndexMode =
1352                   (TID.TSFlags & ARMII::IndexModeMask) >> ARMII::IndexModeShift;
1353   if (getAM3IBit(insn) == 1) {
1354     MI.addOperand(MCOperand::CreateReg(0));
1355
1356     // Disassemble the 8-bit immediate offset.
1357     unsigned Imm4H = (insn >> ARMII::ImmHiShift) & 0xF;
1358     unsigned Imm4L = insn & 0xF;
1359     unsigned Offset = ARM_AM::getAM3Opc(AddrOpcode, (Imm4H << 4) | Imm4L,
1360                                         IndexMode);
1361     MI.addOperand(MCOperand::CreateImm(Offset));
1362   } else {
1363     // Disassemble the offset reg (Rm).
1364     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1365                                                        decodeRm(insn))));
1366     unsigned Offset = ARM_AM::getAM3Opc(AddrOpcode, 0, IndexMode);
1367     MI.addOperand(MCOperand::CreateImm(Offset));
1368   }
1369   OpIdx += 2;
1370
1371   return true;
1372 }
1373
1374 static bool DisassembleLdMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1375     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1376   return DisassembleLdStMiscFrm(MI, Opcode, insn, NumOps, NumOpsAdded, false,
1377                                 B);
1378 }
1379
1380 static bool DisassembleStMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1381     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1382   return DisassembleLdStMiscFrm(MI, Opcode, insn, NumOps, NumOpsAdded, true, B);
1383 }
1384
1385 // The algorithm for disassembly of LdStMulFrm is different from others because
1386 // it explicitly populates the two predicate operands after the base register.
1387 // After that, we need to populate the reglist with each affected register
1388 // encoded as an MCOperand.
1389 static bool DisassembleLdStMulFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1390     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1391
1392   assert(NumOps >= 4 && "LdStMulFrm expects NumOps >= 4");
1393   NumOpsAdded = 0;
1394
1395   unsigned Base = getRegisterEnum(B, ARM::GPRRegClassID, decodeRn(insn));
1396
1397   // Writeback to base, if necessary.
1398   if (Opcode == ARM::LDMIA_UPD || Opcode == ARM::STMIA_UPD ||
1399       Opcode == ARM::LDMDA_UPD || Opcode == ARM::STMDA_UPD ||
1400       Opcode == ARM::LDMDB_UPD || Opcode == ARM::STMDB_UPD ||
1401       Opcode == ARM::LDMIB_UPD || Opcode == ARM::STMIB_UPD) {
1402     MI.addOperand(MCOperand::CreateReg(Base));
1403     ++NumOpsAdded;
1404   }
1405
1406   // Add the base register operand.
1407   MI.addOperand(MCOperand::CreateReg(Base));
1408
1409   // Handling the two predicate operands before the reglist.
1410   int64_t CondVal = getCondField(insn);
1411   if (CondVal == 0xF)
1412     return false;
1413   MI.addOperand(MCOperand::CreateImm(CondVal));
1414   MI.addOperand(MCOperand::CreateReg(ARM::CPSR));
1415
1416   NumOpsAdded += 3;
1417
1418   // Fill the variadic part of reglist.
1419   unsigned RegListBits = insn & ((1 << 16) - 1);
1420   for (unsigned i = 0; i < 16; ++i) {
1421     if ((RegListBits >> i) & 1) {
1422       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1423                                                          i)));
1424       ++NumOpsAdded;
1425     }
1426   }
1427
1428   return true;
1429 }
1430
1431 // LDREX, LDREXB, LDREXH: Rd Rn
1432 // LDREXD:                Rd Rd+1 Rn
1433 // STREX, STREXB, STREXH: Rd Rm Rn
1434 // STREXD:                Rd Rm Rm+1 Rn
1435 //
1436 // SWP, SWPB:             Rd Rm Rn
1437 static bool DisassembleLdStExFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1438     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1439
1440   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
1441   if (!OpInfo) return false;
1442
1443   unsigned &OpIdx = NumOpsAdded;
1444
1445   OpIdx = 0;
1446
1447   assert(NumOps >= 2
1448          && OpInfo[0].RegClass == ARM::GPRRegClassID
1449          && OpInfo[1].RegClass == ARM::GPRRegClassID
1450          && "Expect 2 reg operands");
1451
1452   bool isStore = slice(insn, 20, 20) == 0;
1453   bool isDW = (Opcode == ARM::LDREXD || Opcode == ARM::STREXD);
1454
1455   // Add the destination operand.
1456   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1457                                                      decodeRd(insn))));
1458   ++OpIdx;
1459
1460   // Store register Exclusive needs a source operand.
1461   if (isStore) {
1462     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1463                                                        decodeRm(insn))));
1464     ++OpIdx;
1465
1466     if (isDW) {
1467       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1468                                                          decodeRm(insn)+1)));
1469       ++OpIdx;
1470     }
1471   } else if (isDW) {
1472     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1473                                                        decodeRd(insn)+1)));
1474     ++OpIdx;
1475   }
1476
1477   // Finally add the pointer operand.
1478   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1479                                                      decodeRn(insn))));
1480   ++OpIdx;
1481
1482   return true;
1483 }
1484
1485 // Misc. Arithmetic Instructions.
1486 // CLZ: Rd Rm
1487 // PKHBT, PKHTB: Rd Rn Rm , LSL/ASR #imm5
1488 // RBIT, REV, REV16, REVSH: Rd Rm
1489 static bool DisassembleArithMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1490     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1491
1492   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
1493   unsigned &OpIdx = NumOpsAdded;
1494
1495   OpIdx = 0;
1496
1497   assert(NumOps >= 2
1498          && OpInfo[0].RegClass == ARM::GPRRegClassID
1499          && OpInfo[1].RegClass == ARM::GPRRegClassID
1500          && "Expect 2 reg operands");
1501
1502   bool ThreeReg = NumOps > 2 && OpInfo[2].RegClass == ARM::GPRRegClassID;
1503
1504   // Sanity check the registers, which should not be 15.
1505   if (decodeRd(insn) == 15 || decodeRm(insn) == 15)
1506     return false;
1507   if (ThreeReg && decodeRn(insn) == 15)
1508     return false;
1509
1510   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1511                                                      decodeRd(insn))));
1512   ++OpIdx;
1513
1514   if (ThreeReg) {
1515     assert(NumOps >= 4 && "Expect >= 4 operands");
1516     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1517                                                        decodeRn(insn))));
1518     ++OpIdx;
1519   }
1520
1521   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1522                                                      decodeRm(insn))));
1523   ++OpIdx;
1524
1525   // If there is still an operand info left which is an immediate operand, add
1526   // an additional imm5 LSL/ASR operand.
1527   if (ThreeReg && OpInfo[OpIdx].RegClass < 0
1528       && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
1529     // Extract the 5-bit immediate field Inst{11-7}.
1530     unsigned ShiftAmt = (insn >> ARMII::ShiftShift) & 0x1F;
1531     ARM_AM::ShiftOpc Opc = ARM_AM::no_shift;
1532     if (Opcode == ARM::PKHBT)
1533       Opc = ARM_AM::lsl;
1534     else if (Opcode == ARM::PKHTB)
1535       Opc = ARM_AM::asr;
1536     getImmShiftSE(Opc, ShiftAmt);
1537     MI.addOperand(MCOperand::CreateImm(ARM_AM::getSORegOpc(Opc, ShiftAmt)));
1538     ++OpIdx;
1539   }
1540
1541   return true;
1542 }
1543
1544 /// DisassembleSatFrm - Disassemble saturate instructions:
1545 /// SSAT, SSAT16, USAT, and USAT16.
1546 static bool DisassembleSatFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1547     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1548
1549   // A8.6.183 SSAT
1550   // if d == 15 || n == 15 then UNPREDICTABLE;
1551   if (decodeRd(insn) == 15 || decodeRm(insn) == 15)
1552     return false;
1553
1554   const TargetInstrDesc &TID = ARMInsts[Opcode];
1555   NumOpsAdded = TID.getNumOperands() - 2; // ignore predicate operands
1556
1557   // Disassemble register def.
1558   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1559                                                      decodeRd(insn))));
1560
1561   unsigned Pos = slice(insn, 20, 16);
1562   if (Opcode == ARM::SSAT || Opcode == ARM::SSAT16)
1563     Pos += 1;
1564   MI.addOperand(MCOperand::CreateImm(Pos));
1565
1566   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1567                                                      decodeRm(insn))));
1568
1569   if (NumOpsAdded == 4) {
1570     ARM_AM::ShiftOpc Opc = (slice(insn, 6, 6) != 0 ? ARM_AM::asr : ARM_AM::lsl);
1571     // Inst{11-7} encodes the imm5 shift amount.
1572     unsigned ShAmt = slice(insn, 11, 7);
1573     if (ShAmt == 0) {
1574       // A8.6.183.  Possible ASR shift amount of 32...
1575       if (Opc == ARM_AM::asr)
1576         ShAmt = 32;
1577       else
1578         Opc = ARM_AM::no_shift;
1579     }
1580     MI.addOperand(MCOperand::CreateImm(ARM_AM::getSORegOpc(Opc, ShAmt)));
1581   }
1582   return true;
1583 }
1584
1585 // Extend instructions.
1586 // SXT* and UXT*: Rd [Rn] Rm [rot_imm].
1587 // The 2nd operand register is Rn and the 3rd operand regsiter is Rm for the
1588 // three register operand form.  Otherwise, Rn=0b1111 and only Rm is used.
1589 static bool DisassembleExtFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1590     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1591
1592   // A8.6.220 SXTAB
1593   // if d == 15 || m == 15 then UNPREDICTABLE;
1594   if (decodeRd(insn) == 15 || decodeRm(insn) == 15)
1595     return false;
1596
1597   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
1598   unsigned &OpIdx = NumOpsAdded;
1599
1600   OpIdx = 0;
1601
1602   assert(NumOps >= 2
1603          && OpInfo[0].RegClass == ARM::GPRRegClassID
1604          && OpInfo[1].RegClass == ARM::GPRRegClassID
1605          && "Expect 2 reg operands");
1606
1607   bool ThreeReg = NumOps > 2 && OpInfo[2].RegClass == ARM::GPRRegClassID;
1608
1609   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1610                                                      decodeRd(insn))));
1611   ++OpIdx;
1612
1613   if (ThreeReg) {
1614     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1615                                                        decodeRn(insn))));
1616     ++OpIdx;
1617   }
1618
1619   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1620                                                      decodeRm(insn))));
1621   ++OpIdx;
1622
1623   // If there is still an operand info left which is an immediate operand, add
1624   // an additional rotate immediate operand.
1625   if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
1626       && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
1627     // Extract the 2-bit rotate field Inst{11-10}.
1628     unsigned rot = (insn >> ARMII::ExtRotImmShift) & 3;
1629     // Rotation by 8, 16, or 24 bits.
1630     MI.addOperand(MCOperand::CreateImm(rot << 3));
1631     ++OpIdx;
1632   }
1633
1634   return true;
1635 }
1636
1637 /////////////////////////////////////
1638 //                                 //
1639 //    Utility Functions For VFP    //
1640 //                                 //
1641 /////////////////////////////////////
1642
1643 // Extract/Decode Dd/Sd:
1644 //
1645 // SP => d = UInt(Vd:D)
1646 // DP => d = UInt(D:Vd)
1647 static unsigned decodeVFPRd(uint32_t insn, bool isSPVFP) {
1648   return isSPVFP ? (decodeRd(insn) << 1 | getDBit(insn))
1649                  : (decodeRd(insn) | getDBit(insn) << 4);
1650 }
1651
1652 // Extract/Decode Dn/Sn:
1653 //
1654 // SP => n = UInt(Vn:N)
1655 // DP => n = UInt(N:Vn)
1656 static unsigned decodeVFPRn(uint32_t insn, bool isSPVFP) {
1657   return isSPVFP ? (decodeRn(insn) << 1 | getNBit(insn))
1658                  : (decodeRn(insn) | getNBit(insn) << 4);
1659 }
1660
1661 // Extract/Decode Dm/Sm:
1662 //
1663 // SP => m = UInt(Vm:M)
1664 // DP => m = UInt(M:Vm)
1665 static unsigned decodeVFPRm(uint32_t insn, bool isSPVFP) {
1666   return isSPVFP ? (decodeRm(insn) << 1 | getMBit(insn))
1667                  : (decodeRm(insn) | getMBit(insn) << 4);
1668 }
1669
1670 // A7.5.1
1671 static APInt VFPExpandImm(unsigned char byte, unsigned N) {
1672   assert(N == 32 || N == 64);
1673
1674   uint64_t Result;
1675   unsigned bit6 = slice(byte, 6, 6);
1676   if (N == 32) {
1677     Result = slice(byte, 7, 7) << 31 | slice(byte, 5, 0) << 19;
1678     if (bit6)
1679       Result |= 0x1f << 25;
1680     else
1681       Result |= 0x1 << 30;
1682   } else {
1683     Result = (uint64_t)slice(byte, 7, 7) << 63 |
1684              (uint64_t)slice(byte, 5, 0) << 48;
1685     if (bit6)
1686       Result |= 0xffULL << 54;
1687     else
1688       Result |= 0x1ULL << 62;
1689   }
1690   return APInt(N, Result);
1691 }
1692
1693 // VFP Unary Format Instructions:
1694 //
1695 // VCMP[E]ZD, VCMP[E]ZS: compares one floating-point register with zero
1696 // VCVTDS, VCVTSD: converts between double-precision and single-precision
1697 // The rest of the instructions have homogeneous [VFP]Rd and [VFP]Rm registers.
1698 static bool DisassembleVFPUnaryFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1699     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1700
1701   assert(NumOps >= 1 && "VFPUnaryFrm expects NumOps >= 1");
1702
1703   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
1704   unsigned &OpIdx = NumOpsAdded;
1705
1706   OpIdx = 0;
1707
1708   unsigned RegClass = OpInfo[OpIdx].RegClass;
1709   assert((RegClass == ARM::SPRRegClassID || RegClass == ARM::DPRRegClassID) &&
1710          "Reg operand expected");
1711   bool isSP = (RegClass == ARM::SPRRegClassID);
1712
1713   MI.addOperand(MCOperand::CreateReg(
1714                   getRegisterEnum(B, RegClass, decodeVFPRd(insn, isSP))));
1715   ++OpIdx;
1716
1717   // Early return for compare with zero instructions.
1718   if (Opcode == ARM::VCMPEZD || Opcode == ARM::VCMPEZS
1719       || Opcode == ARM::VCMPZD || Opcode == ARM::VCMPZS)
1720     return true;
1721
1722   RegClass = OpInfo[OpIdx].RegClass;
1723   assert((RegClass == ARM::SPRRegClassID || RegClass == ARM::DPRRegClassID) &&
1724          "Reg operand expected");
1725   isSP = (RegClass == ARM::SPRRegClassID);
1726
1727   MI.addOperand(MCOperand::CreateReg(
1728                   getRegisterEnum(B, RegClass, decodeVFPRm(insn, isSP))));
1729   ++OpIdx;
1730
1731   return true;
1732 }
1733
1734 // All the instructions have homogeneous [VFP]Rd, [VFP]Rn, and [VFP]Rm regs.
1735 // Some of them have operand constraints which tie the first operand in the
1736 // InOperandList to that of the dst.  As far as asm printing is concerned, this
1737 // tied_to operand is simply skipped.
1738 static bool DisassembleVFPBinaryFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1739     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1740
1741   assert(NumOps >= 3 && "VFPBinaryFrm expects NumOps >= 3");
1742
1743   const TargetInstrDesc &TID = ARMInsts[Opcode];
1744   const TargetOperandInfo *OpInfo = TID.OpInfo;
1745   unsigned &OpIdx = NumOpsAdded;
1746
1747   OpIdx = 0;
1748
1749   unsigned RegClass = OpInfo[OpIdx].RegClass;
1750   assert((RegClass == ARM::SPRRegClassID || RegClass == ARM::DPRRegClassID) &&
1751          "Reg operand expected");
1752   bool isSP = (RegClass == ARM::SPRRegClassID);
1753
1754   MI.addOperand(MCOperand::CreateReg(
1755                   getRegisterEnum(B, RegClass, decodeVFPRd(insn, isSP))));
1756   ++OpIdx;
1757
1758   // Skip tied_to operand constraint.
1759   if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
1760     assert(NumOps >= 4 && "Expect >=4 operands");
1761     MI.addOperand(MCOperand::CreateReg(0));
1762     ++OpIdx;
1763   }
1764
1765   MI.addOperand(MCOperand::CreateReg(
1766                   getRegisterEnum(B, RegClass, decodeVFPRn(insn, isSP))));
1767   ++OpIdx;
1768
1769   MI.addOperand(MCOperand::CreateReg(
1770                   getRegisterEnum(B, RegClass, decodeVFPRm(insn, isSP))));
1771   ++OpIdx;
1772
1773   return true;
1774 }
1775
1776 // A8.6.295 vcvt (floating-point <-> integer)
1777 // Int to FP: VSITOD, VSITOS, VUITOD, VUITOS
1778 // FP to Int: VTOSI[Z|R]D, VTOSI[Z|R]S, VTOUI[Z|R]D, VTOUI[Z|R]S
1779 //
1780 // A8.6.297 vcvt (floating-point and fixed-point)
1781 // Dd|Sd Dd|Sd(TIED_TO) #fbits(= 16|32 - UInt(imm4:i))
1782 static bool DisassembleVFPConv1Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
1783     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1784
1785   assert(NumOps >= 2 && "VFPConv1Frm expects NumOps >= 2");
1786
1787   const TargetInstrDesc &TID = ARMInsts[Opcode];
1788   const TargetOperandInfo *OpInfo = TID.OpInfo;
1789   if (!OpInfo) return false;
1790
1791   bool SP = slice(insn, 8, 8) == 0; // A8.6.295 & A8.6.297
1792   bool fixed_point = slice(insn, 17, 17) == 1; // A8.6.297
1793   unsigned RegClassID = SP ? ARM::SPRRegClassID : ARM::DPRRegClassID;
1794
1795   if (fixed_point) {
1796     // A8.6.297
1797     assert(NumOps >= 3 && "Expect >= 3 operands");
1798     int size = slice(insn, 7, 7) == 0 ? 16 : 32;
1799     int fbits = size - (slice(insn,3,0) << 1 | slice(insn,5,5));
1800     MI.addOperand(MCOperand::CreateReg(
1801                     getRegisterEnum(B, RegClassID,
1802                                     decodeVFPRd(insn, SP))));
1803
1804     assert(TID.getOperandConstraint(1, TOI::TIED_TO) != -1 &&
1805            "Tied to operand expected");
1806     MI.addOperand(MI.getOperand(0));
1807
1808     assert(OpInfo[2].RegClass < 0 && !OpInfo[2].isPredicate() &&
1809            !OpInfo[2].isOptionalDef() && "Imm operand expected");
1810     MI.addOperand(MCOperand::CreateImm(fbits));
1811
1812     NumOpsAdded = 3;
1813   } else {
1814     // A8.6.295
1815     // The Rd (destination) and Rm (source) bits have different interpretations
1816     // depending on their single-precisonness.
1817     unsigned d, m;
1818     if (slice(insn, 18, 18) == 1) { // to_integer operation
1819       d = decodeVFPRd(insn, true /* Is Single Precision */);
1820       MI.addOperand(MCOperand::CreateReg(
1821                       getRegisterEnum(B, ARM::SPRRegClassID, d)));
1822       m = decodeVFPRm(insn, SP);
1823       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassID, m)));
1824     } else {
1825       d = decodeVFPRd(insn, SP);
1826       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassID, d)));
1827       m = decodeVFPRm(insn, true /* Is Single Precision */);
1828       MI.addOperand(MCOperand::CreateReg(
1829                       getRegisterEnum(B, ARM::SPRRegClassID, m)));
1830     }
1831     NumOpsAdded = 2;
1832   }
1833
1834   return true;
1835 }
1836
1837 // VMOVRS - A8.6.330
1838 // Rt => Rd; Sn => UInt(Vn:N)
1839 static bool DisassembleVFPConv2Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
1840     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1841
1842   assert(NumOps >= 2 && "VFPConv2Frm expects NumOps >= 2");
1843
1844   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1845                                                      decodeRd(insn))));
1846   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::SPRRegClassID,
1847                                                      decodeVFPRn(insn, true))));
1848   NumOpsAdded = 2;
1849   return true;
1850 }
1851
1852 // VMOVRRD - A8.6.332
1853 // Rt => Rd; Rt2 => Rn; Dm => UInt(M:Vm)
1854 //
1855 // VMOVRRS - A8.6.331
1856 // Rt => Rd; Rt2 => Rn; Sm => UInt(Vm:M); Sm1 = Sm+1
1857 static bool DisassembleVFPConv3Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
1858     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1859
1860   assert(NumOps >= 3 && "VFPConv3Frm expects NumOps >= 3");
1861
1862   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
1863   unsigned &OpIdx = NumOpsAdded;
1864
1865   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1866                                                      decodeRd(insn))));
1867   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1868                                                      decodeRn(insn))));
1869   OpIdx = 2;
1870
1871   if (OpInfo[OpIdx].RegClass == ARM::SPRRegClassID) {
1872     unsigned Sm = decodeVFPRm(insn, true);
1873     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::SPRRegClassID,
1874                                                        Sm)));
1875     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::SPRRegClassID,
1876                                                        Sm+1)));
1877     OpIdx += 2;
1878   } else {
1879     MI.addOperand(MCOperand::CreateReg(
1880                     getRegisterEnum(B, ARM::DPRRegClassID,
1881                                     decodeVFPRm(insn, false))));
1882     ++OpIdx;
1883   }
1884   return true;
1885 }
1886
1887 // VMOVSR - A8.6.330
1888 // Rt => Rd; Sn => UInt(Vn:N)
1889 static bool DisassembleVFPConv4Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
1890     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1891
1892   assert(NumOps >= 2 && "VFPConv4Frm expects NumOps >= 2");
1893
1894   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::SPRRegClassID,
1895                                                      decodeVFPRn(insn, true))));
1896   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1897                                                      decodeRd(insn))));
1898   NumOpsAdded = 2;
1899   return true;
1900 }
1901
1902 // VMOVDRR - A8.6.332
1903 // Rt => Rd; Rt2 => Rn; Dm => UInt(M:Vm)
1904 //
1905 // VMOVRRS - A8.6.331
1906 // Rt => Rd; Rt2 => Rn; Sm => UInt(Vm:M); Sm1 = Sm+1
1907 static bool DisassembleVFPConv5Frm(MCInst &MI, unsigned Opcode, uint32_t insn,
1908     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1909
1910   assert(NumOps >= 3 && "VFPConv5Frm expects NumOps >= 3");
1911
1912   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
1913   unsigned &OpIdx = NumOpsAdded;
1914
1915   OpIdx = 0;
1916
1917   if (OpInfo[OpIdx].RegClass == ARM::SPRRegClassID) {
1918     unsigned Sm = decodeVFPRm(insn, true);
1919     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::SPRRegClassID,
1920                                                        Sm)));
1921     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::SPRRegClassID,
1922                                                        Sm+1)));
1923     OpIdx += 2;
1924   } else {
1925     MI.addOperand(MCOperand::CreateReg(
1926                     getRegisterEnum(B, ARM::DPRRegClassID,
1927                                     decodeVFPRm(insn, false))));
1928     ++OpIdx;
1929   }
1930
1931   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1932                                                      decodeRd(insn))));
1933   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
1934                                                      decodeRn(insn))));
1935   OpIdx += 2;
1936   return true;
1937 }
1938
1939 // VFP Load/Store Instructions.
1940 // VLDRD, VLDRS, VSTRD, VSTRS
1941 static bool DisassembleVFPLdStFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1942     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1943
1944   assert(NumOps >= 3 && "VFPLdStFrm expects NumOps >= 3");
1945
1946   bool isSPVFP = (Opcode == ARM::VLDRS || Opcode == ARM::VSTRS);
1947   unsigned RegClassID = isSPVFP ? ARM::SPRRegClassID : ARM::DPRRegClassID;
1948
1949   // Extract Dd/Sd for operand 0.
1950   unsigned RegD = decodeVFPRd(insn, isSPVFP);
1951
1952   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassID, RegD)));
1953
1954   unsigned Base = getRegisterEnum(B, ARM::GPRRegClassID, decodeRn(insn));
1955   MI.addOperand(MCOperand::CreateReg(Base));
1956
1957   // Next comes the AM5 Opcode.
1958   ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
1959   unsigned char Imm8 = insn & 0xFF;
1960   MI.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(AddrOpcode, Imm8)));
1961
1962   NumOpsAdded = 3;
1963
1964   return true;
1965 }
1966
1967 // VFP Load/Store Multiple Instructions.
1968 // We have an optional write back reg, the base, and two predicate operands.
1969 // It is then followed by a reglist of either DPR(s) or SPR(s).
1970 //
1971 // VLDMD[_UPD], VLDMS[_UPD], VSTMD[_UPD], VSTMS[_UPD]
1972 static bool DisassembleVFPLdStMulFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
1973     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
1974
1975   assert(NumOps >= 4 && "VFPLdStMulFrm expects NumOps >= 4");
1976
1977   unsigned &OpIdx = NumOpsAdded;
1978
1979   OpIdx = 0;
1980
1981   unsigned Base = getRegisterEnum(B, ARM::GPRRegClassID, decodeRn(insn));
1982
1983   // Writeback to base, if necessary.
1984   if (Opcode == ARM::VLDMDIA_UPD || Opcode == ARM::VLDMSIA_UPD ||
1985       Opcode == ARM::VLDMDDB_UPD || Opcode == ARM::VLDMSDB_UPD ||
1986       Opcode == ARM::VSTMDIA_UPD || Opcode == ARM::VSTMSIA_UPD ||
1987       Opcode == ARM::VSTMDDB_UPD || Opcode == ARM::VSTMSDB_UPD) {
1988     MI.addOperand(MCOperand::CreateReg(Base));
1989     ++OpIdx;
1990   }
1991
1992   MI.addOperand(MCOperand::CreateReg(Base));
1993
1994   // Handling the two predicate operands before the reglist.
1995   int64_t CondVal = getCondField(insn);
1996   if (CondVal == 0xF)
1997     return false;
1998   MI.addOperand(MCOperand::CreateImm(CondVal));
1999   MI.addOperand(MCOperand::CreateReg(ARM::CPSR));
2000
2001   OpIdx += 3;
2002
2003   bool isSPVFP = (Opcode == ARM::VLDMSIA     ||
2004                   Opcode == ARM::VLDMSIA_UPD || Opcode == ARM::VLDMSDB_UPD ||
2005                   Opcode == ARM::VSTMSIA     ||
2006                   Opcode == ARM::VSTMSIA_UPD || Opcode == ARM::VSTMSDB_UPD);
2007   unsigned RegClassID = isSPVFP ? ARM::SPRRegClassID : ARM::DPRRegClassID;
2008
2009   // Extract Dd/Sd.
2010   unsigned RegD = decodeVFPRd(insn, isSPVFP);
2011
2012   // Fill the variadic part of reglist.
2013   unsigned char Imm8 = insn & 0xFF;
2014   unsigned Regs = isSPVFP ? Imm8 : Imm8/2;
2015
2016   // Apply some sanity checks before proceeding.
2017   if (Regs == 0 || (RegD + Regs) > 32 || (!isSPVFP && Regs > 16))
2018     return false;
2019
2020   for (unsigned i = 0; i < Regs; ++i) {
2021     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassID,
2022                                                        RegD + i)));
2023     ++OpIdx;
2024   }
2025
2026   return true;
2027 }
2028
2029 // Misc. VFP Instructions.
2030 // FMSTAT (vmrs with Rt=0b1111, i.e., to apsr_nzcv and no register operand)
2031 // FCONSTD (DPR and a VFPf64Imm operand)
2032 // FCONSTS (SPR and a VFPf32Imm operand)
2033 // VMRS/VMSR (GPR operand)
2034 static bool DisassembleVFPMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
2035     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2036
2037   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
2038   unsigned &OpIdx = NumOpsAdded;
2039
2040   OpIdx = 0;
2041
2042   if (Opcode == ARM::FMSTAT)
2043     return true;
2044
2045   assert(NumOps >= 2 && "VFPMiscFrm expects >=2 operands");
2046
2047   unsigned RegEnum = 0;
2048   switch (OpInfo[0].RegClass) {
2049   case ARM::DPRRegClassID:
2050     RegEnum = getRegisterEnum(B, ARM::DPRRegClassID, decodeVFPRd(insn, false));
2051     break;
2052   case ARM::SPRRegClassID:
2053     RegEnum = getRegisterEnum(B, ARM::SPRRegClassID, decodeVFPRd(insn, true));
2054     break;
2055   case ARM::GPRRegClassID:
2056     RegEnum = getRegisterEnum(B, ARM::GPRRegClassID, decodeRd(insn));
2057     break;
2058   default:
2059     assert(0 && "Invalid reg class id");
2060     return false;
2061   }
2062
2063   MI.addOperand(MCOperand::CreateReg(RegEnum));
2064   ++OpIdx;
2065
2066   // Extract/decode the f64/f32 immediate.
2067   if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
2068         && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
2069     // The asm syntax specifies the floating point value, not the 8-bit literal.
2070     APInt immRaw = VFPExpandImm(slice(insn,19,16) << 4 | slice(insn, 3, 0),
2071                              Opcode == ARM::FCONSTD ? 64 : 32);
2072     APFloat immFP = APFloat(immRaw, true);
2073     double imm = Opcode == ARM::FCONSTD ? immFP.convertToDouble() :
2074       immFP.convertToFloat();
2075     MI.addOperand(MCOperand::CreateFPImm(imm));
2076
2077     ++OpIdx;
2078   }
2079
2080   return true;
2081 }
2082
2083 // DisassembleThumbFrm() is defined in ThumbDisassemblerCore.h file.
2084 #include "ThumbDisassemblerCore.h"
2085
2086 /////////////////////////////////////////////////////
2087 //                                                 //
2088 //     Utility Functions For ARM Advanced SIMD     //
2089 //                                                 //
2090 /////////////////////////////////////////////////////
2091
2092 // The following NEON namings are based on A8.6.266 VABA, VABAL.  Notice that
2093 // A8.6.303 VDUP (ARM core register)'s D/Vd pair is the N/Vn pair of VABA/VABAL.
2094
2095 // A7.3 Register encoding
2096
2097 // Extract/Decode NEON D/Vd:
2098 //
2099 // Note that for quadword, Qd = UInt(D:Vd<3:1>) = Inst{22:15-13}, whereas for
2100 // doubleword, Dd = UInt(D:Vd).  We compensate for this difference by
2101 // handling it in the getRegisterEnum() utility function.
2102 // D = Inst{22}, Vd = Inst{15-12}
2103 static unsigned decodeNEONRd(uint32_t insn) {
2104   return ((insn >> ARMII::NEON_D_BitShift) & 1) << 4
2105     | ((insn >> ARMII::NEON_RegRdShift) & ARMII::NEONRegMask);
2106 }
2107
2108 // Extract/Decode NEON N/Vn:
2109 //
2110 // Note that for quadword, Qn = UInt(N:Vn<3:1>) = Inst{7:19-17}, whereas for
2111 // doubleword, Dn = UInt(N:Vn).  We compensate for this difference by
2112 // handling it in the getRegisterEnum() utility function.
2113 // N = Inst{7}, Vn = Inst{19-16}
2114 static unsigned decodeNEONRn(uint32_t insn) {
2115   return ((insn >> ARMII::NEON_N_BitShift) & 1) << 4
2116     | ((insn >> ARMII::NEON_RegRnShift) & ARMII::NEONRegMask);
2117 }
2118
2119 // Extract/Decode NEON M/Vm:
2120 //
2121 // Note that for quadword, Qm = UInt(M:Vm<3:1>) = Inst{5:3-1}, whereas for
2122 // doubleword, Dm = UInt(M:Vm).  We compensate for this difference by
2123 // handling it in the getRegisterEnum() utility function.
2124 // M = Inst{5}, Vm = Inst{3-0}
2125 static unsigned decodeNEONRm(uint32_t insn) {
2126   return ((insn >> ARMII::NEON_M_BitShift) & 1) << 4
2127     | ((insn >> ARMII::NEON_RegRmShift) & ARMII::NEONRegMask);
2128 }
2129
2130 namespace {
2131 enum ElemSize {
2132   ESizeNA = 0,
2133   ESize8 = 8,
2134   ESize16 = 16,
2135   ESize32 = 32,
2136   ESize64 = 64
2137 };
2138 } // End of unnamed namespace
2139
2140 // size        field -> Inst{11-10}
2141 // index_align field -> Inst{7-4}
2142 //
2143 // The Lane Index interpretation depends on the Data Size:
2144 //   8  (encoded as size = 0b00) -> Index = index_align[3:1]
2145 //   16 (encoded as size = 0b01) -> Index = index_align[3:2]
2146 //   32 (encoded as size = 0b10) -> Index = index_align[3]
2147 //
2148 // Ref: A8.6.317 VLD4 (single 4-element structure to one lane).
2149 static unsigned decodeLaneIndex(uint32_t insn) {
2150   unsigned size = insn >> 10 & 3;
2151   assert((size == 0 || size == 1 || size == 2) &&
2152          "Encoding error: size should be either 0, 1, or 2");
2153
2154   unsigned index_align = insn >> 4 & 0xF;
2155   return (index_align >> 1) >> size;
2156 }
2157
2158 // imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4)
2159 // op = Inst{5}, cmode = Inst{11-8}
2160 // i = Inst{24} (ARM architecture)
2161 // imm3 = Inst{18-16}, imm4 = Inst{3-0}
2162 // Ref: Table A7-15 Modified immediate values for Advanced SIMD instructions.
2163 static uint64_t decodeN1VImm(uint32_t insn, ElemSize esize) {
2164   unsigned char op = (insn >> 5) & 1;
2165   unsigned char cmode = (insn >> 8) & 0xF;
2166   unsigned char Imm8 = ((insn >> 24) & 1) << 7 |
2167                        ((insn >> 16) & 7) << 4 |
2168                        (insn & 0xF);
2169   return (op << 12) | (cmode << 8) | Imm8;
2170 }
2171
2172 // A8.6.339 VMUL, VMULL (by scalar)
2173 // ESize16 => m = Inst{2-0} (Vm<2:0>) D0-D7
2174 // ESize32 => m = Inst{3-0} (Vm<3:0>) D0-D15
2175 static unsigned decodeRestrictedDm(uint32_t insn, ElemSize esize) {
2176   switch (esize) {
2177   case ESize16:
2178     return insn & 7;
2179   case ESize32:
2180     return insn & 0xF;
2181   default:
2182     assert(0 && "Unreachable code!");
2183     return 0;
2184   }
2185 }
2186
2187 // A8.6.339 VMUL, VMULL (by scalar)
2188 // ESize16 => index = Inst{5:3} (M:Vm<3>) D0-D7
2189 // ESize32 => index = Inst{5}   (M)       D0-D15
2190 static unsigned decodeRestrictedDmIndex(uint32_t insn, ElemSize esize) {
2191   switch (esize) {
2192   case ESize16:
2193     return (((insn >> 5) & 1) << 1) | ((insn >> 3) & 1);
2194   case ESize32:
2195     return (insn >> 5) & 1;
2196   default:
2197     assert(0 && "Unreachable code!");
2198     return 0;
2199   }
2200 }
2201
2202 // A8.6.296 VCVT (between floating-point and fixed-point, Advanced SIMD)
2203 // (64 - <fbits>) is encoded as imm6, i.e., Inst{21-16}.
2204 static unsigned decodeVCVTFractionBits(uint32_t insn) {
2205   return 64 - ((insn >> 16) & 0x3F);
2206 }
2207
2208 // A8.6.302 VDUP (scalar)
2209 // ESize8  => index = Inst{19-17}
2210 // ESize16 => index = Inst{19-18}
2211 // ESize32 => index = Inst{19}
2212 static unsigned decodeNVLaneDupIndex(uint32_t insn, ElemSize esize) {
2213   switch (esize) {
2214   case ESize8:
2215     return (insn >> 17) & 7;
2216   case ESize16:
2217     return (insn >> 18) & 3;
2218   case ESize32:
2219     return (insn >> 19) & 1;
2220   default:
2221     assert(0 && "Unspecified element size!");
2222     return 0;
2223   }
2224 }
2225
2226 // A8.6.328 VMOV (ARM core register to scalar)
2227 // A8.6.329 VMOV (scalar to ARM core register)
2228 // ESize8  => index = Inst{21:6-5}
2229 // ESize16 => index = Inst{21:6}
2230 // ESize32 => index = Inst{21}
2231 static unsigned decodeNVLaneOpIndex(uint32_t insn, ElemSize esize) {
2232   switch (esize) {
2233   case ESize8:
2234     return ((insn >> 21) & 1) << 2 | ((insn >> 5) & 3);
2235   case ESize16:
2236     return ((insn >> 21) & 1) << 1 | ((insn >> 6) & 1);
2237   case ESize32:
2238     return ((insn >> 21) & 1);
2239   default:
2240     assert(0 && "Unspecified element size!");
2241     return 0;
2242   }
2243 }
2244
2245 // Imm6 = Inst{21-16}, L = Inst{7}
2246 //
2247 // LeftShift == true (A8.6.367 VQSHL, A8.6.387 VSLI):
2248 // case L:imm6 of
2249 //   '0001xxx' => esize = 8; shift_amount = imm6 - 8
2250 //   '001xxxx' => esize = 16; shift_amount = imm6 - 16
2251 //   '01xxxxx' => esize = 32; shift_amount = imm6 - 32
2252 //   '1xxxxxx' => esize = 64; shift_amount = imm6
2253 //
2254 // LeftShift == false (A8.6.376 VRSHR, A8.6.368 VQSHRN):
2255 // case L:imm6 of
2256 //   '0001xxx' => esize = 8; shift_amount = 16 - imm6
2257 //   '001xxxx' => esize = 16; shift_amount = 32 - imm6
2258 //   '01xxxxx' => esize = 32; shift_amount = 64 - imm6
2259 //   '1xxxxxx' => esize = 64; shift_amount = 64 - imm6
2260 //
2261 static unsigned decodeNVSAmt(uint32_t insn, bool LeftShift) {
2262   ElemSize esize = ESizeNA;
2263   unsigned L = (insn >> 7) & 1;
2264   unsigned imm6 = (insn >> 16) & 0x3F;
2265   if (L == 0) {
2266     if (imm6 >> 3 == 1)
2267       esize = ESize8;
2268     else if (imm6 >> 4 == 1)
2269       esize = ESize16;
2270     else if (imm6 >> 5 == 1)
2271       esize = ESize32;
2272     else
2273       assert(0 && "Wrong encoding of Inst{7:21-16}!");
2274   } else
2275     esize = ESize64;
2276
2277   if (LeftShift)
2278     return esize == ESize64 ? imm6 : (imm6 - esize);
2279   else
2280     return esize == ESize64 ? (esize - imm6) : (2*esize - imm6);
2281 }
2282
2283 // A8.6.305 VEXT
2284 // Imm4 = Inst{11-8}
2285 static unsigned decodeN3VImm(uint32_t insn) {
2286   return (insn >> 8) & 0xF;
2287 }
2288
2289 // VLD*
2290 //   D[d] D[d2] ... Rn [TIED_TO Rn] align [Rm]
2291 // VLD*LN*
2292 //   D[d] D[d2] ... Rn [TIED_TO Rn] align [Rm] TIED_TO ... imm(idx)
2293 // VST*
2294 //   Rn [TIED_TO Rn] align [Rm] D[d] D[d2] ...
2295 // VST*LN*
2296 //   Rn [TIED_TO Rn] align [Rm] D[d] D[d2] ... [imm(idx)]
2297 //
2298 // Correctly set VLD*/VST*'s TIED_TO GPR, as the asm printer needs it.
2299 static bool DisassembleNLdSt0(MCInst &MI, unsigned Opcode, uint32_t insn,
2300     unsigned short NumOps, unsigned &NumOpsAdded, bool Store, bool DblSpaced,
2301     unsigned alignment, BO B) {
2302
2303   const TargetInstrDesc &TID = ARMInsts[Opcode];
2304   const TargetOperandInfo *OpInfo = TID.OpInfo;
2305
2306   // At least one DPR register plus addressing mode #6.
2307   assert(NumOps >= 3 && "Expect >= 3 operands");
2308
2309   unsigned &OpIdx = NumOpsAdded;
2310
2311   OpIdx = 0;
2312
2313   // We have homogeneous NEON registers for Load/Store.
2314   unsigned RegClass = 0;
2315
2316   // Double-spaced registers have increments of 2.
2317   unsigned Inc = DblSpaced ? 2 : 1;
2318
2319   unsigned Rn = decodeRn(insn);
2320   unsigned Rm = decodeRm(insn);
2321   unsigned Rd = decodeNEONRd(insn);
2322
2323   // A7.7.1 Advanced SIMD addressing mode.
2324   bool WB = Rm != 15;
2325
2326   // LLVM Addressing Mode #6.
2327   unsigned RmEnum = 0;
2328   if (WB && Rm != 13)
2329     RmEnum = getRegisterEnum(B, ARM::GPRRegClassID, Rm);
2330
2331   if (Store) {
2332     // Consume possible WB, AddrMode6, possible increment reg, the DPR/QPR's,
2333     // then possible lane index.
2334     assert(OpIdx < NumOps && OpInfo[0].RegClass == ARM::GPRRegClassID &&
2335            "Reg operand expected");
2336
2337     if (WB) {
2338       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
2339                                                          Rn)));
2340       ++OpIdx;
2341     }
2342
2343     assert((OpIdx+1) < NumOps && OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
2344            OpInfo[OpIdx + 1].RegClass < 0 && "Addrmode #6 Operands expected");
2345     // addrmode6 := (ops GPR:$addr, i32imm)
2346     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
2347                                                        Rn)));
2348     MI.addOperand(MCOperand::CreateImm(alignment)); // Alignment
2349     OpIdx += 2;
2350
2351     if (WB) {
2352       MI.addOperand(MCOperand::CreateReg(RmEnum));
2353       ++OpIdx;
2354     }
2355
2356     assert(OpIdx < NumOps &&
2357            (OpInfo[OpIdx].RegClass == ARM::DPRRegClassID ||
2358             OpInfo[OpIdx].RegClass == ARM::QPRRegClassID) &&
2359            "Reg operand expected");
2360
2361     RegClass = OpInfo[OpIdx].RegClass;
2362     while (OpIdx < NumOps && (unsigned)OpInfo[OpIdx].RegClass == RegClass) {
2363       MI.addOperand(MCOperand::CreateReg(
2364                       getRegisterEnum(B, RegClass, Rd)));
2365       Rd += Inc;
2366       ++OpIdx;
2367     }
2368
2369     // Handle possible lane index.
2370     if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
2371         && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
2372       MI.addOperand(MCOperand::CreateImm(decodeLaneIndex(insn)));
2373       ++OpIdx;
2374     }
2375
2376   } else {
2377     // Consume the DPR/QPR's, possible WB, AddrMode6, possible incrment reg,
2378     // possible TIED_TO DPR/QPR's (ignored), then possible lane index.
2379     RegClass = OpInfo[0].RegClass;
2380
2381     while (OpIdx < NumOps && (unsigned)OpInfo[OpIdx].RegClass == RegClass) {
2382       MI.addOperand(MCOperand::CreateReg(
2383                       getRegisterEnum(B, RegClass, Rd)));
2384       Rd += Inc;
2385       ++OpIdx;
2386     }
2387
2388     if (WB) {
2389       MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
2390                                                          Rn)));
2391       ++OpIdx;
2392     }
2393
2394     assert((OpIdx+1) < NumOps && OpInfo[OpIdx].RegClass == ARM::GPRRegClassID &&
2395            OpInfo[OpIdx + 1].RegClass < 0 && "Addrmode #6 Operands expected");
2396     // addrmode6 := (ops GPR:$addr, i32imm)
2397     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
2398                                                        Rn)));
2399     MI.addOperand(MCOperand::CreateImm(alignment)); // Alignment
2400     OpIdx += 2;
2401
2402     if (WB) {
2403       MI.addOperand(MCOperand::CreateReg(RmEnum));
2404       ++OpIdx;
2405     }
2406
2407     while (OpIdx < NumOps && (unsigned)OpInfo[OpIdx].RegClass == RegClass) {
2408       assert(TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1 &&
2409              "Tied to operand expected");
2410       MI.addOperand(MCOperand::CreateReg(0));
2411       ++OpIdx;
2412     }
2413
2414     // Handle possible lane index.
2415     if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
2416         && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
2417       MI.addOperand(MCOperand::CreateImm(decodeLaneIndex(insn)));
2418       ++OpIdx;
2419     }
2420   }
2421
2422   // Accessing registers past the end of the NEON register file is not
2423   // defined.
2424   if (Rd > 32)
2425     return false;
2426
2427   return true;
2428 }
2429
2430 // A8.6.308, A8.6.311, A8.6.314, A8.6.317.
2431 static bool Align4OneLaneInst(unsigned elem, unsigned size,
2432     unsigned index_align, unsigned & alignment) {
2433   unsigned bits = 0;
2434   switch (elem) {
2435   default:
2436     return false;
2437   case 1:
2438     // A8.6.308
2439     if (size == 0)
2440       return slice(index_align, 0, 0) == 0;
2441     else if (size == 1) {
2442       bits = slice(index_align, 1, 0);
2443       if (bits != 0 && bits != 1)
2444         return false;
2445       if (bits == 1)
2446         alignment = 16;
2447       return true;
2448     } else if (size == 2) {
2449       bits = slice(index_align, 2, 0);
2450       if (bits != 0 && bits != 3)
2451         return false;
2452       if (bits == 3)
2453         alignment = 32;
2454       return true;;
2455     }
2456     return true;
2457   case 2:
2458     // A8.6.311
2459     if (size == 0) {
2460       if (slice(index_align, 0, 0) == 1)
2461         alignment = 16;
2462       return true;
2463     } if (size == 1) {
2464       if (slice(index_align, 0, 0) == 1)
2465         alignment = 32;
2466       return true;
2467     } else if (size == 2) {
2468       if (slice(index_align, 1, 1) != 0)
2469         return false;
2470       if (slice(index_align, 0, 0) == 1)
2471         alignment = 64;
2472       return true;;
2473     }
2474     return true;
2475   case 3:
2476     // A8.6.314
2477     if (size == 0) {
2478       if (slice(index_align, 0, 0) != 0)
2479         return false;
2480       return true;
2481     } if (size == 1) {
2482       if (slice(index_align, 0, 0) != 0)
2483         return false;
2484       return true;
2485       return true;
2486     } else if (size == 2) {
2487       if (slice(index_align, 1, 0) != 0)
2488         return false;
2489       return true;;
2490     }
2491     return true;
2492   case 4:
2493     // A8.6.317
2494     if (size == 0) {
2495       if (slice(index_align, 0, 0) == 1)
2496         alignment = 32;
2497       return true;
2498     } if (size == 1) {
2499       if (slice(index_align, 0, 0) == 1)
2500         alignment = 64;
2501       return true;
2502     } else if (size == 2) {
2503       bits = slice(index_align, 1, 0);
2504       if (bits == 3)
2505         return false;
2506       if (bits == 1)
2507         alignment = 64;
2508       else if (bits == 2)
2509         alignment = 128;
2510       return true;;
2511     }
2512     return true;
2513   }
2514 }
2515
2516 // A7.7
2517 // If L (Inst{21}) == 0, store instructions.
2518 // Find out about double-spaced-ness of the Opcode and pass it on to
2519 // DisassembleNLdSt0().
2520 static bool DisassembleNLdSt(MCInst &MI, unsigned Opcode, uint32_t insn,
2521     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2522
2523   const StringRef Name = ARMInsts[Opcode].Name;
2524   bool DblSpaced = false;
2525   // 0 represents standard alignment, i.e., unaligned data access.
2526   unsigned alignment = 0;
2527
2528   unsigned elem = 0; // legal values: {1, 2, 3, 4}
2529   if (Name.startswith("VST1") || Name.startswith("VLD1"))
2530     elem = 1;
2531
2532   if (Name.startswith("VST2") || Name.startswith("VLD2"))
2533     elem = 2;
2534
2535   if (Name.startswith("VST3") || Name.startswith("VLD3"))
2536     elem = 3;
2537
2538   if (Name.startswith("VST4") || Name.startswith("VLD4"))
2539     elem = 4;
2540
2541   if (Name.find("LN") != std::string::npos) {
2542     // To one lane instructions.
2543     // See, for example, 8.6.317 VLD4 (single 4-element structure to one lane).
2544
2545     // Utility function takes number of elements, size, and index_align.
2546     if (!Align4OneLaneInst(elem,
2547                            slice(insn, 11, 10),
2548                            slice(insn, 7, 4),
2549                            alignment))
2550       return false;
2551
2552     // <size> == 16 && Inst{5} == 1 --> DblSpaced = true
2553     if (Name.endswith("16") || Name.endswith("16_UPD"))
2554       DblSpaced = slice(insn, 5, 5) == 1;
2555
2556     // <size> == 32 && Inst{6} == 1 --> DblSpaced = true
2557     if (Name.endswith("32") || Name.endswith("32_UPD"))
2558       DblSpaced = slice(insn, 6, 6) == 1;
2559   } else {
2560     // Multiple n-element structures with type encoded as Inst{11-8}.
2561     // See, for example, A8.6.316 VLD4 (multiple 4-element structures).
2562
2563     // Inst{5-4} encodes alignment.
2564     unsigned align = slice(insn, 5, 4);
2565     switch (align) {
2566     default:
2567       break;
2568     case 1:
2569       alignment = 64; break;
2570     case 2:
2571       alignment = 128; break;
2572     case 3:
2573       alignment = 256; break;
2574     }
2575
2576     unsigned type = slice(insn, 11, 8);
2577     // Reject UNDEFINED instructions based on type and align.
2578     // Plus set DblSpaced flag where appropriate.
2579     switch (elem) {
2580     default:
2581       break;
2582     case 1:
2583       // n == 1
2584       // A8.6.307 & A8.6.391
2585       if ((type == 7  && slice(align, 1, 1) == 1) ||
2586           (type == 10 && align == 3) ||
2587           (type == 6  && slice(align, 1, 1) == 1))
2588         return false;
2589       break;
2590     case 2:
2591       // n == 2 && type == 0b1001 -> DblSpaced = true
2592       // A8.6.310 & A8.6.393
2593       if ((type == 8 || type == 9) && align == 3)
2594         return false;
2595       DblSpaced = (type == 9);
2596       break;
2597     case 3:
2598       // n == 3 && type == 0b0101 -> DblSpaced = true
2599       // A8.6.313 & A8.6.395
2600       if (slice(insn, 7, 6) == 3 || slice(align, 1, 1) == 1)
2601         return false;
2602       DblSpaced = (type == 5);
2603       break;
2604     case 4:
2605       // n == 4 && type == 0b0001 -> DblSpaced = true
2606       // A8.6.316 & A8.6.397
2607       if (slice(insn, 7, 6) == 3)
2608         return false;
2609       DblSpaced = (type == 1);
2610       break;
2611     }
2612   }
2613   return DisassembleNLdSt0(MI, Opcode, insn, NumOps, NumOpsAdded,
2614                            slice(insn, 21, 21) == 0, DblSpaced, alignment/8, B);
2615 }
2616
2617 // VMOV (immediate)
2618 //   Qd/Dd imm
2619 // VBIC (immediate)
2620 // VORR (immediate)
2621 //   Qd/Dd imm src(=Qd/Dd)
2622 static bool DisassembleN1RegModImmFrm(MCInst &MI, unsigned Opcode,
2623     uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2624
2625   const TargetInstrDesc &TID = ARMInsts[Opcode];
2626   const TargetOperandInfo *OpInfo = TID.OpInfo;
2627
2628   assert(NumOps >= 2 &&
2629          (OpInfo[0].RegClass == ARM::DPRRegClassID ||
2630           OpInfo[0].RegClass == ARM::QPRRegClassID) &&
2631          (OpInfo[1].RegClass < 0) &&
2632          "Expect 1 reg operand followed by 1 imm operand");
2633
2634   // Qd/Dd = Inst{22:15-12} => NEON Rd
2635   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[0].RegClass,
2636                                                      decodeNEONRd(insn))));
2637
2638   ElemSize esize = ESizeNA;
2639   switch (Opcode) {
2640   case ARM::VMOVv8i8:
2641   case ARM::VMOVv16i8:
2642     esize = ESize8;
2643     break;
2644   case ARM::VMOVv4i16:
2645   case ARM::VMOVv8i16:
2646   case ARM::VMVNv4i16:
2647   case ARM::VMVNv8i16:
2648   case ARM::VBICiv4i16:
2649   case ARM::VBICiv8i16:
2650   case ARM::VORRiv4i16:
2651   case ARM::VORRiv8i16:
2652     esize = ESize16;
2653     break;
2654   case ARM::VMOVv2i32:
2655   case ARM::VMOVv4i32:
2656   case ARM::VMVNv2i32:
2657   case ARM::VMVNv4i32:
2658   case ARM::VBICiv2i32:
2659   case ARM::VBICiv4i32:
2660   case ARM::VORRiv2i32:
2661   case ARM::VORRiv4i32:
2662     esize = ESize32;
2663     break;
2664   case ARM::VMOVv1i64:
2665   case ARM::VMOVv2i64:
2666     esize = ESize64;
2667     break;
2668   default:
2669     assert(0 && "Unexpected opcode!");
2670     return false;
2671   }
2672
2673   // One register and a modified immediate value.
2674   // Add the imm operand.
2675   MI.addOperand(MCOperand::CreateImm(decodeN1VImm(insn, esize)));
2676
2677   NumOpsAdded = 2;
2678
2679   // VBIC/VORRiv*i* variants have an extra $src = $Vd to be filled in.
2680   if (NumOps >= 3 &&
2681       (OpInfo[2].RegClass == ARM::DPRRegClassID ||
2682        OpInfo[2].RegClass == ARM::QPRRegClassID)) {
2683     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[0].RegClass,
2684                                                      decodeNEONRd(insn))));
2685     NumOpsAdded += 1;
2686   }
2687
2688   return true;
2689 }
2690
2691 namespace {
2692 enum N2VFlag {
2693   N2V_None,
2694   N2V_VectorDupLane,
2695   N2V_VectorConvert_Between_Float_Fixed
2696 };
2697 } // End of unnamed namespace
2698
2699 // Vector Convert [between floating-point and fixed-point]
2700 //   Qd/Dd Qm/Dm [fbits]
2701 //
2702 // Vector Duplicate Lane (from scalar to all elements) Instructions.
2703 // VDUPLN16d, VDUPLN16q, VDUPLN32d, VDUPLN32q, VDUPLN8d, VDUPLN8q:
2704 //   Qd/Dd Dm index
2705 //
2706 // Vector Move Long:
2707 //   Qd Dm
2708 //
2709 // Vector Move Narrow:
2710 //   Dd Qm
2711 //
2712 // Others
2713 static bool DisassembleNVdVmOptImm(MCInst &MI, unsigned Opc, uint32_t insn,
2714     unsigned short NumOps, unsigned &NumOpsAdded, N2VFlag Flag, BO B) {
2715
2716   const TargetInstrDesc &TID = ARMInsts[Opc];
2717   const TargetOperandInfo *OpInfo = TID.OpInfo;
2718
2719   assert(NumOps >= 2 &&
2720          (OpInfo[0].RegClass == ARM::DPRRegClassID ||
2721           OpInfo[0].RegClass == ARM::QPRRegClassID) &&
2722          (OpInfo[1].RegClass == ARM::DPRRegClassID ||
2723           OpInfo[1].RegClass == ARM::QPRRegClassID) &&
2724          "Expect >= 2 operands and first 2 as reg operands");
2725
2726   unsigned &OpIdx = NumOpsAdded;
2727
2728   OpIdx = 0;
2729
2730   ElemSize esize = ESizeNA;
2731   if (Flag == N2V_VectorDupLane) {
2732     // VDUPLN has its index embedded.  Its size can be inferred from the Opcode.
2733     assert(Opc >= ARM::VDUPLN16d && Opc <= ARM::VDUPLN8q &&
2734            "Unexpected Opcode");
2735     esize = (Opc == ARM::VDUPLN8d || Opc == ARM::VDUPLN8q) ? ESize8
2736        : ((Opc == ARM::VDUPLN16d || Opc == ARM::VDUPLN16q) ? ESize16
2737                                                            : ESize32);
2738   }
2739
2740   // Qd/Dd = Inst{22:15-12} => NEON Rd
2741   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
2742                                                      decodeNEONRd(insn))));
2743   ++OpIdx;
2744
2745   // VPADAL...
2746   if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
2747     // TIED_TO operand.
2748     MI.addOperand(MCOperand::CreateReg(0));
2749     ++OpIdx;
2750   }
2751
2752   // Dm = Inst{5:3-0} => NEON Rm
2753   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
2754                                                      decodeNEONRm(insn))));
2755   ++OpIdx;
2756
2757   // VZIP and others have two TIED_TO reg operands.
2758   int Idx;
2759   while (OpIdx < NumOps &&
2760          (Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
2761     // Add TIED_TO operand.
2762     MI.addOperand(MI.getOperand(Idx));
2763     ++OpIdx;
2764   }
2765
2766   // Add the imm operand, if required.
2767   if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
2768       && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
2769
2770     unsigned imm = 0xFFFFFFFF;
2771
2772     if (Flag == N2V_VectorDupLane)
2773       imm = decodeNVLaneDupIndex(insn, esize);
2774     if (Flag == N2V_VectorConvert_Between_Float_Fixed)
2775       imm = decodeVCVTFractionBits(insn);
2776
2777     assert(imm != 0xFFFFFFFF && "Internal error");
2778     MI.addOperand(MCOperand::CreateImm(imm));
2779     ++OpIdx;
2780   }
2781
2782   return true;
2783 }
2784
2785 static bool DisassembleN2RegFrm(MCInst &MI, unsigned Opc, uint32_t insn,
2786     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2787
2788   return DisassembleNVdVmOptImm(MI, Opc, insn, NumOps, NumOpsAdded,
2789                                 N2V_None, B);
2790 }
2791 static bool DisassembleNVCVTFrm(MCInst &MI, unsigned Opc, uint32_t insn,
2792     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2793
2794   return DisassembleNVdVmOptImm(MI, Opc, insn, NumOps, NumOpsAdded,
2795                                 N2V_VectorConvert_Between_Float_Fixed, B);
2796 }
2797 static bool DisassembleNVecDupLnFrm(MCInst &MI, unsigned Opc, uint32_t insn,
2798     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2799
2800   return DisassembleNVdVmOptImm(MI, Opc, insn, NumOps, NumOpsAdded,
2801                                 N2V_VectorDupLane, B);
2802 }
2803
2804 // Vector Shift [Accumulate] Instructions.
2805 // Qd/Dd [Qd/Dd (TIED_TO)] Qm/Dm ShiftAmt
2806 //
2807 // Vector Shift Left Long (with maximum shift count) Instructions.
2808 // VSHLLi16, VSHLLi32, VSHLLi8: Qd Dm imm (== size)
2809 //
2810 static bool DisassembleNVectorShift(MCInst &MI, unsigned Opcode, uint32_t insn,
2811     unsigned short NumOps, unsigned &NumOpsAdded, bool LeftShift, BO B) {
2812
2813   const TargetInstrDesc &TID = ARMInsts[Opcode];
2814   const TargetOperandInfo *OpInfo = TID.OpInfo;
2815
2816   assert(NumOps >= 3 &&
2817          (OpInfo[0].RegClass == ARM::DPRRegClassID ||
2818           OpInfo[0].RegClass == ARM::QPRRegClassID) &&
2819          (OpInfo[1].RegClass == ARM::DPRRegClassID ||
2820           OpInfo[1].RegClass == ARM::QPRRegClassID) &&
2821          "Expect >= 3 operands and first 2 as reg operands");
2822
2823   unsigned &OpIdx = NumOpsAdded;
2824
2825   OpIdx = 0;
2826
2827   // Qd/Dd = Inst{22:15-12} => NEON Rd
2828   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
2829                                                      decodeNEONRd(insn))));
2830   ++OpIdx;
2831
2832   if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
2833     // TIED_TO operand.
2834     MI.addOperand(MCOperand::CreateReg(0));
2835     ++OpIdx;
2836   }
2837
2838   assert((OpInfo[OpIdx].RegClass == ARM::DPRRegClassID ||
2839           OpInfo[OpIdx].RegClass == ARM::QPRRegClassID) &&
2840          "Reg operand expected");
2841
2842   // Qm/Dm = Inst{5:3-0} => NEON Rm
2843   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
2844                                                      decodeNEONRm(insn))));
2845   ++OpIdx;
2846
2847   assert(OpInfo[OpIdx].RegClass < 0 && "Imm operand expected");
2848
2849   // Add the imm operand.
2850
2851   // VSHLL has maximum shift count as the imm, inferred from its size.
2852   unsigned Imm;
2853   switch (Opcode) {
2854   default:
2855     Imm = decodeNVSAmt(insn, LeftShift);
2856     break;
2857   case ARM::VSHLLi8:
2858     Imm = 8;
2859     break;
2860   case ARM::VSHLLi16:
2861     Imm = 16;
2862     break;
2863   case ARM::VSHLLi32:
2864     Imm = 32;
2865     break;
2866   }
2867   MI.addOperand(MCOperand::CreateImm(Imm));
2868   ++OpIdx;
2869
2870   return true;
2871 }
2872
2873 // Left shift instructions.
2874 static bool DisassembleN2RegVecShLFrm(MCInst &MI, unsigned Opcode,
2875     uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2876
2877   return DisassembleNVectorShift(MI, Opcode, insn, NumOps, NumOpsAdded, true,
2878                                  B);
2879 }
2880 // Right shift instructions have different shift amount interpretation.
2881 static bool DisassembleN2RegVecShRFrm(MCInst &MI, unsigned Opcode,
2882     uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2883
2884   return DisassembleNVectorShift(MI, Opcode, insn, NumOps, NumOpsAdded, false,
2885                                  B);
2886 }
2887
2888 namespace {
2889 enum N3VFlag {
2890   N3V_None,
2891   N3V_VectorExtract,
2892   N3V_VectorShift,
2893   N3V_Multiply_By_Scalar
2894 };
2895 } // End of unnamed namespace
2896
2897 // NEON Three Register Instructions with Optional Immediate Operand
2898 //
2899 // Vector Extract Instructions.
2900 // Qd/Dd Qn/Dn Qm/Dm imm4
2901 //
2902 // Vector Shift (Register) Instructions.
2903 // Qd/Dd Qm/Dm Qn/Dn (notice the order of m, n)
2904 //
2905 // Vector Multiply [Accumulate/Subtract] [Long] By Scalar Instructions.
2906 // Qd/Dd Qn/Dn RestrictedDm index
2907 //
2908 // Others
2909 static bool DisassembleNVdVnVmOptImm(MCInst &MI, unsigned Opcode, uint32_t insn,
2910     unsigned short NumOps, unsigned &NumOpsAdded, N3VFlag Flag, BO B) {
2911
2912   const TargetInstrDesc &TID = ARMInsts[Opcode];
2913   const TargetOperandInfo *OpInfo = TID.OpInfo;
2914
2915   // No checking for OpInfo[2] because of MOVDneon/MOVQ with only two regs.
2916   assert(NumOps >= 3 &&
2917          (OpInfo[0].RegClass == ARM::DPRRegClassID ||
2918           OpInfo[0].RegClass == ARM::QPRRegClassID) &&
2919          (OpInfo[1].RegClass == ARM::DPRRegClassID ||
2920           OpInfo[1].RegClass == ARM::QPRRegClassID) &&
2921          "Expect >= 3 operands and first 2 as reg operands");
2922
2923   unsigned &OpIdx = NumOpsAdded;
2924
2925   OpIdx = 0;
2926
2927   bool VdVnVm = Flag == N3V_VectorShift ? false : true;
2928   bool IsImm4 = Flag == N3V_VectorExtract ? true : false;
2929   bool IsDmRestricted = Flag == N3V_Multiply_By_Scalar ? true : false;
2930   ElemSize esize = ESizeNA;
2931   if (Flag == N3V_Multiply_By_Scalar) {
2932     unsigned size = (insn >> 20) & 3;
2933     if (size == 1) esize = ESize16;
2934     if (size == 2) esize = ESize32;
2935     assert (esize == ESize16 || esize == ESize32);
2936   }
2937
2938   // Qd/Dd = Inst{22:15-12} => NEON Rd
2939   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
2940                                                      decodeNEONRd(insn))));
2941   ++OpIdx;
2942
2943   // VABA, VABAL, VBSLd, VBSLq, ...
2944   if (TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
2945     // TIED_TO operand.
2946     MI.addOperand(MCOperand::CreateReg(0));
2947     ++OpIdx;
2948   }
2949
2950   // Dn = Inst{7:19-16} => NEON Rn
2951   // or
2952   // Dm = Inst{5:3-0} => NEON Rm
2953   MI.addOperand(MCOperand::CreateReg(
2954                   getRegisterEnum(B, OpInfo[OpIdx].RegClass,
2955                                   VdVnVm ? decodeNEONRn(insn)
2956                                          : decodeNEONRm(insn))));
2957   ++OpIdx;
2958
2959   // Special case handling for VMOVDneon and VMOVQ because they are marked as
2960   // N3RegFrm.
2961   if (Opcode == ARM::VMOVDneon || Opcode == ARM::VMOVQ)
2962     return true;
2963
2964   // Dm = Inst{5:3-0} => NEON Rm
2965   // or
2966   // Dm is restricted to D0-D7 if size is 16, D0-D15 otherwise
2967   // or
2968   // Dn = Inst{7:19-16} => NEON Rn
2969   unsigned m = VdVnVm ? (IsDmRestricted ? decodeRestrictedDm(insn, esize)
2970                                         : decodeNEONRm(insn))
2971                       : decodeNEONRn(insn);
2972
2973   MI.addOperand(MCOperand::CreateReg(
2974                   getRegisterEnum(B, OpInfo[OpIdx].RegClass, m)));
2975   ++OpIdx;
2976
2977   if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
2978       && !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
2979     // Add the imm operand.
2980     unsigned Imm = 0;
2981     if (IsImm4)
2982       Imm = decodeN3VImm(insn);
2983     else if (IsDmRestricted)
2984       Imm = decodeRestrictedDmIndex(insn, esize);
2985     else {
2986       assert(0 && "Internal error: unreachable code!");
2987       return false;
2988     }
2989
2990     MI.addOperand(MCOperand::CreateImm(Imm));
2991     ++OpIdx;
2992   }
2993
2994   return true;
2995 }
2996
2997 static bool DisassembleN3RegFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
2998     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
2999
3000   return DisassembleNVdVnVmOptImm(MI, Opcode, insn, NumOps, NumOpsAdded,
3001                                   N3V_None, B);
3002 }
3003 static bool DisassembleN3RegVecShFrm(MCInst &MI, unsigned Opcode,
3004     uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3005
3006   return DisassembleNVdVnVmOptImm(MI, Opcode, insn, NumOps, NumOpsAdded,
3007                                   N3V_VectorShift, B);
3008 }
3009 static bool DisassembleNVecExtractFrm(MCInst &MI, unsigned Opcode,
3010     uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3011
3012   return DisassembleNVdVnVmOptImm(MI, Opcode, insn, NumOps, NumOpsAdded,
3013                                   N3V_VectorExtract, B);
3014 }
3015 static bool DisassembleNVecMulScalarFrm(MCInst &MI, unsigned Opcode,
3016     uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3017
3018   return DisassembleNVdVnVmOptImm(MI, Opcode, insn, NumOps, NumOpsAdded,
3019                                   N3V_Multiply_By_Scalar, B);
3020 }
3021
3022 // Vector Table Lookup
3023 //
3024 // VTBL1, VTBX1: Dd [Dd(TIED_TO)] Dn Dm
3025 // VTBL2, VTBX2: Dd [Dd(TIED_TO)] Dn Dn+1 Dm
3026 // VTBL3, VTBX3: Dd [Dd(TIED_TO)] Dn Dn+1 Dn+2 Dm
3027 // VTBL4, VTBX4: Dd [Dd(TIED_TO)] Dn Dn+1 Dn+2 Dn+3 Dm
3028 static bool DisassembleNVTBLFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
3029     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3030
3031   const TargetInstrDesc &TID = ARMInsts[Opcode];
3032   const TargetOperandInfo *OpInfo = TID.OpInfo;
3033   if (!OpInfo) return false;
3034
3035   assert(NumOps >= 3 &&
3036          OpInfo[0].RegClass == ARM::DPRRegClassID &&
3037          OpInfo[1].RegClass == ARM::DPRRegClassID &&
3038          OpInfo[2].RegClass == ARM::DPRRegClassID &&
3039          "Expect >= 3 operands and first 3 as reg operands");
3040
3041   unsigned &OpIdx = NumOpsAdded;
3042
3043   OpIdx = 0;
3044
3045   unsigned Rn = decodeNEONRn(insn);
3046
3047   // {Dn} encoded as len = 0b00
3048   // {Dn Dn+1} encoded as len = 0b01
3049   // {Dn Dn+1 Dn+2 } encoded as len = 0b10
3050   // {Dn Dn+1 Dn+2 Dn+3} encoded as len = 0b11
3051   unsigned Len = slice(insn, 9, 8) + 1;
3052
3053   // Dd (the destination vector)
3054   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::DPRRegClassID,
3055                                                      decodeNEONRd(insn))));
3056   ++OpIdx;
3057
3058   // Process tied_to operand constraint.
3059   int Idx;
3060   if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) {
3061     MI.addOperand(MI.getOperand(Idx));
3062     ++OpIdx;
3063   }
3064
3065   // Do the <list> now.
3066   for (unsigned i = 0; i < Len; ++i) {
3067     assert(OpIdx < NumOps && OpInfo[OpIdx].RegClass == ARM::DPRRegClassID &&
3068            "Reg operand expected");
3069     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::DPRRegClassID,
3070                                                        Rn + i)));
3071     ++OpIdx;
3072   }
3073
3074   // Dm (the index vector)
3075   assert(OpIdx < NumOps && OpInfo[OpIdx].RegClass == ARM::DPRRegClassID &&
3076          "Reg operand (index vector) expected");
3077   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::DPRRegClassID,
3078                                                      decodeNEONRm(insn))));
3079   ++OpIdx;
3080
3081   return true;
3082 }
3083
3084 // Vector Get Lane (move scalar to ARM core register) Instructions.
3085 // VGETLNi32, VGETLNs16, VGETLNs8, VGETLNu16, VGETLNu8: Rt Dn index
3086 static bool DisassembleNGetLnFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
3087     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3088
3089   const TargetInstrDesc &TID = ARMInsts[Opcode];
3090   const TargetOperandInfo *OpInfo = TID.OpInfo;
3091   if (!OpInfo) return false;
3092
3093   assert(TID.getNumDefs() == 1 && NumOps >= 3 &&
3094          OpInfo[0].RegClass == ARM::GPRRegClassID &&
3095          OpInfo[1].RegClass == ARM::DPRRegClassID &&
3096          OpInfo[2].RegClass < 0 &&
3097          "Expect >= 3 operands with one dst operand");
3098
3099   ElemSize esize =
3100     Opcode == ARM::VGETLNi32 ? ESize32
3101       : ((Opcode == ARM::VGETLNs16 || Opcode == ARM::VGETLNu16) ? ESize16
3102                                                                 : ESize8);
3103
3104   // Rt = Inst{15-12} => ARM Rd
3105   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
3106                                                      decodeRd(insn))));
3107
3108   // Dn = Inst{7:19-16} => NEON Rn
3109   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::DPRRegClassID,
3110                                                      decodeNEONRn(insn))));
3111
3112   MI.addOperand(MCOperand::CreateImm(decodeNVLaneOpIndex(insn, esize)));
3113
3114   NumOpsAdded = 3;
3115   return true;
3116 }
3117
3118 // Vector Set Lane (move ARM core register to scalar) Instructions.
3119 // VSETLNi16, VSETLNi32, VSETLNi8: Dd Dd (TIED_TO) Rt index
3120 static bool DisassembleNSetLnFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
3121     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3122
3123   const TargetInstrDesc &TID = ARMInsts[Opcode];
3124   const TargetOperandInfo *OpInfo = TID.OpInfo;
3125   if (!OpInfo) return false;
3126
3127   assert(TID.getNumDefs() == 1 && NumOps >= 3 &&
3128          OpInfo[0].RegClass == ARM::DPRRegClassID &&
3129          OpInfo[1].RegClass == ARM::DPRRegClassID &&
3130          TID.getOperandConstraint(1, TOI::TIED_TO) != -1 &&
3131          OpInfo[2].RegClass == ARM::GPRRegClassID &&
3132          OpInfo[3].RegClass < 0 &&
3133          "Expect >= 3 operands with one dst operand");
3134
3135   ElemSize esize =
3136     Opcode == ARM::VSETLNi8 ? ESize8
3137                             : (Opcode == ARM::VSETLNi16 ? ESize16
3138                                                         : ESize32);
3139
3140   // Dd = Inst{7:19-16} => NEON Rn
3141   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::DPRRegClassID,
3142                                                      decodeNEONRn(insn))));
3143
3144   // TIED_TO operand.
3145   MI.addOperand(MCOperand::CreateReg(0));
3146
3147   // Rt = Inst{15-12} => ARM Rd
3148   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
3149                                                      decodeRd(insn))));
3150
3151   MI.addOperand(MCOperand::CreateImm(decodeNVLaneOpIndex(insn, esize)));
3152
3153   NumOpsAdded = 4;
3154   return true;
3155 }
3156
3157 // Vector Duplicate Instructions (from ARM core register to all elements).
3158 // VDUP8d, VDUP16d, VDUP32d, VDUP8q, VDUP16q, VDUP32q: Qd/Dd Rt
3159 static bool DisassembleNDupFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
3160     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3161
3162   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
3163
3164   assert(NumOps >= 2 &&
3165          (OpInfo[0].RegClass == ARM::DPRRegClassID ||
3166           OpInfo[0].RegClass == ARM::QPRRegClassID) &&
3167          OpInfo[1].RegClass == ARM::GPRRegClassID &&
3168          "Expect >= 2 operands and first 2 as reg operand");
3169
3170   unsigned RegClass = OpInfo[0].RegClass;
3171
3172   // Qd/Dd = Inst{7:19-16} => NEON Rn
3173   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClass,
3174                                                      decodeNEONRn(insn))));
3175
3176   // Rt = Inst{15-12} => ARM Rd
3177   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
3178                                                      decodeRd(insn))));
3179
3180   NumOpsAdded = 2;
3181   return true;
3182 }
3183
3184 // A8.6.41 DMB
3185 // A8.6.42 DSB
3186 // A8.6.49 ISB
3187 static inline bool MemBarrierInstr(uint32_t insn) {
3188   unsigned op7_4 = slice(insn, 7, 4);
3189   if (slice(insn, 31, 8) == 0xf57ff0 && (op7_4 >= 4 && op7_4 <= 6))
3190     return true;
3191
3192   return false;
3193 }
3194
3195 static inline bool PreLoadOpcode(unsigned Opcode) {
3196   switch(Opcode) {
3197   case ARM::PLDi12:  case ARM::PLDrs:
3198   case ARM::PLDWi12: case ARM::PLDWrs:
3199   case ARM::PLIi12:  case ARM::PLIrs:
3200     return true;
3201   default:
3202     return false;
3203   }
3204 }
3205
3206 static bool DisassemblePreLoadFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
3207     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3208
3209   // Preload Data/Instruction requires either 2 or 3 operands.
3210   // PLDi12, PLDWi12, PLIi12: addrmode_imm12
3211   // PLDrs, PLDWrs, PLIrs:    ldst_so_reg
3212
3213   MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
3214                                                      decodeRn(insn))));
3215
3216   if (Opcode == ARM::PLDi12 || Opcode == ARM::PLDWi12
3217       || Opcode == ARM::PLIi12) {
3218     unsigned Imm12 = slice(insn, 11, 0);
3219     bool Negative = getUBit(insn) == 0;
3220
3221     // A8.6.118 PLD (literal) PLDWi12 with Rn=PC is transformed to PLDi12.
3222     if (Opcode == ARM::PLDWi12 && slice(insn, 19, 16) == 0xF) {
3223       DEBUG(errs() << "Rn == '1111': PLDWi12 morphed to PLDi12\n");
3224       MI.setOpcode(ARM::PLDi12);
3225     }
3226     
3227     // -0 is represented specially. All other values are as normal.
3228     int Offset = Negative ? -1 * Imm12 : Imm12;
3229     if (Imm12 == 0 && Negative)
3230       Offset = INT32_MIN;
3231
3232     MI.addOperand(MCOperand::CreateImm(Offset));
3233     NumOpsAdded = 2;
3234   } else {
3235     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
3236                                                        decodeRm(insn))));
3237
3238     ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub;
3239
3240     // Inst{6-5} encodes the shift opcode.
3241     ARM_AM::ShiftOpc ShOp = getShiftOpcForBits(slice(insn, 6, 5));
3242     // Inst{11-7} encodes the imm5 shift amount.
3243     unsigned ShImm = slice(insn, 11, 7);
3244
3245     // A8.4.1.  Possible rrx or shift amount of 32...
3246     getImmShiftSE(ShOp, ShImm);
3247     MI.addOperand(MCOperand::CreateImm(
3248                     ARM_AM::getAM2Opc(AddrOpcode, ShImm, ShOp)));
3249     NumOpsAdded = 3;
3250   }
3251
3252   return true;
3253 }
3254
3255 static bool DisassembleMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
3256     unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
3257
3258   if (MemBarrierInstr(insn)) {
3259     // DMBsy, DSBsy, and ISBsy instructions have zero operand and are taken care
3260     // of within the generic ARMBasicMCBuilder::BuildIt() method.
3261     //
3262     // Inst{3-0} encodes the memory barrier option for the variants.
3263     MI.addOperand(MCOperand::CreateImm(slice(insn, 3, 0)));
3264     NumOpsAdded = 1;
3265     return true;
3266   }
3267
3268   switch (Opcode) {
3269   case ARM::CLREX:
3270   case ARM::NOP:
3271   case ARM::TRAP:
3272   case ARM::YIELD:
3273   case ARM::WFE:
3274   case ARM::WFI:
3275   case ARM::SEV:
3276     return true;
3277   case ARM::SWP:
3278   case ARM::SWPB:
3279     // SWP, SWPB: Rd Rm Rn
3280     // Delegate to DisassembleLdStExFrm()....
3281     return DisassembleLdStExFrm(MI, Opcode, insn, NumOps, NumOpsAdded, B);
3282   default:
3283     break;
3284   }
3285
3286   if (Opcode == ARM::SETEND) {
3287     NumOpsAdded = 1;
3288     MI.addOperand(MCOperand::CreateImm(slice(insn, 9, 9)));
3289     return true;
3290   }
3291
3292   // FIXME: To enable correct asm parsing and disasm of CPS we need 3 different
3293   // opcodes which match the same real instruction. This is needed since there's
3294   // no current handling of optional arguments. Fix here when a better handling
3295   // of optional arguments is implemented.
3296   if (Opcode == ARM::CPS3p) {   // M = 1
3297     // Let's reject these impossible imod values by returning false:
3298     // 1. (imod=0b01)
3299     //
3300     // AsmPrinter cannot handle imod=0b00, plus (imod=0b00,M=1,iflags!=0) is an
3301     // invalid combination, so we just check for imod=0b00 here.
3302     if (slice(insn, 19, 18) == 0 || slice(insn, 19, 18) == 1)
3303       return false;
3304     MI.addOperand(MCOperand::CreateImm(slice(insn, 19, 18))); // imod
3305     MI.addOperand(MCOperand::CreateImm(slice(insn, 8, 6)));   // iflags
3306     MI.addOperand(MCOperand::CreateImm(slice(insn, 4, 0)));   // mode
3307     NumOpsAdded = 3;
3308     return true;
3309   }
3310   if (Opcode == ARM::CPS2p) { // mode = 0, M = 0
3311     // Let's reject these impossible imod values by returning false:
3312     // 1. (imod=0b00,M=0)
3313     // 2. (imod=0b01)
3314     if (slice(insn, 19, 18) == 0 || slice(insn, 19, 18) == 1)
3315       return false;
3316     MI.addOperand(MCOperand::CreateImm(slice(insn, 19, 18))); // imod
3317     MI.addOperand(MCOperand::CreateImm(slice(insn, 8, 6)));   // iflags
3318     NumOpsAdded = 2;
3319     return true;
3320   }
3321   if (Opcode == ARM::CPS1p) { // imod = 0, iflags = 0, M = 1
3322     MI.addOperand(MCOperand::CreateImm(slice(insn, 4, 0))); // mode
3323     NumOpsAdded = 1;
3324     return true;
3325   }
3326
3327   // DBG has its option specified in Inst{3-0}.
3328   if (Opcode == ARM::DBG) {
3329     MI.addOperand(MCOperand::CreateImm(slice(insn, 3, 0)));
3330     NumOpsAdded = 1;
3331     return true;
3332   }
3333
3334   // BKPT takes an imm32 val equal to ZeroExtend(Inst{19-8:3-0}).
3335   if (Opcode == ARM::BKPT) {
3336     MI.addOperand(MCOperand::CreateImm(slice(insn, 19, 8) << 4 |
3337                                        slice(insn, 3, 0)));
3338     NumOpsAdded = 1;
3339     return true;
3340   }
3341
3342   if (PreLoadOpcode(Opcode))
3343     return DisassemblePreLoadFrm(MI, Opcode, insn, NumOps, NumOpsAdded, B);
3344
3345   assert(0 && "Unexpected misc instruction!");
3346   return false;
3347 }
3348
3349 /// FuncPtrs - FuncPtrs maps ARMFormat to its corresponding DisassembleFP.
3350 /// We divide the disassembly task into different categories, with each one
3351 /// corresponding to a specific instruction encoding format.  There could be
3352 /// exceptions when handling a specific format, and that is why the Opcode is
3353 /// also present in the function prototype.
3354 static const DisassembleFP FuncPtrs[] = {
3355   &DisassemblePseudo,
3356   &DisassembleMulFrm,
3357   &DisassembleBrFrm,
3358   &DisassembleBrMiscFrm,
3359   &DisassembleDPFrm,
3360   &DisassembleDPSoRegFrm,
3361   &DisassembleLdFrm,
3362   &DisassembleStFrm,
3363   &DisassembleLdMiscFrm,
3364   &DisassembleStMiscFrm,
3365   &DisassembleLdStMulFrm,
3366   &DisassembleLdStExFrm,
3367   &DisassembleArithMiscFrm,
3368   &DisassembleSatFrm,
3369   &DisassembleExtFrm,
3370   &DisassembleVFPUnaryFrm,
3371   &DisassembleVFPBinaryFrm,
3372   &DisassembleVFPConv1Frm,
3373   &DisassembleVFPConv2Frm,
3374   &DisassembleVFPConv3Frm,
3375   &DisassembleVFPConv4Frm,
3376   &DisassembleVFPConv5Frm,
3377   &DisassembleVFPLdStFrm,
3378   &DisassembleVFPLdStMulFrm,
3379   &DisassembleVFPMiscFrm,
3380   &DisassembleThumbFrm,
3381   &DisassembleMiscFrm,
3382   &DisassembleNGetLnFrm,
3383   &DisassembleNSetLnFrm,
3384   &DisassembleNDupFrm,
3385
3386   // VLD and VST (including one lane) Instructions.
3387   &DisassembleNLdSt,
3388
3389   // A7.4.6 One register and a modified immediate value
3390   // 1-Register Instructions with imm.
3391   // LLVM only defines VMOVv instructions.
3392   &DisassembleN1RegModImmFrm,
3393
3394   // 2-Register Instructions with no imm.
3395   &DisassembleN2RegFrm,
3396
3397   // 2-Register Instructions with imm (vector convert float/fixed point).
3398   &DisassembleNVCVTFrm,
3399
3400   // 2-Register Instructions with imm (vector dup lane).
3401   &DisassembleNVecDupLnFrm,
3402
3403   // Vector Shift Left Instructions.
3404   &DisassembleN2RegVecShLFrm,
3405
3406   // Vector Shift Righ Instructions, which has different interpretation of the
3407   // shift amount from the imm6 field.
3408   &DisassembleN2RegVecShRFrm,
3409
3410   // 3-Register Data-Processing Instructions.
3411   &DisassembleN3RegFrm,
3412
3413   // Vector Shift (Register) Instructions.
3414   // D:Vd M:Vm N:Vn (notice that M:Vm is the first operand)
3415   &DisassembleN3RegVecShFrm,
3416
3417   // Vector Extract Instructions.
3418   &DisassembleNVecExtractFrm,
3419
3420   // Vector [Saturating Rounding Doubling] Multiply [Accumulate/Subtract] [Long]
3421   // By Scalar Instructions.
3422   &DisassembleNVecMulScalarFrm,
3423
3424   // Vector Table Lookup uses byte indexes in a control vector to look up byte
3425   // values in a table and generate a new vector.
3426   &DisassembleNVTBLFrm,
3427
3428   NULL
3429 };
3430
3431 /// BuildIt - BuildIt performs the build step for this ARM Basic MC Builder.
3432 /// The general idea is to set the Opcode for the MCInst, followed by adding
3433 /// the appropriate MCOperands to the MCInst.  ARM Basic MC Builder delegates
3434 /// to the Format-specific disassemble function for disassembly, followed by
3435 /// TryPredicateAndSBitModifier() to do PredicateOperand and OptionalDefOperand
3436 /// which follow the Dst/Src Operands.
3437 bool ARMBasicMCBuilder::BuildIt(MCInst &MI, uint32_t insn) {
3438   // Stage 1 sets the Opcode.
3439   MI.setOpcode(Opcode);
3440   // If the number of operands is zero, we're done!
3441   if (NumOps == 0)
3442     return true;
3443
3444   // Stage 2 calls the format-specific disassemble function to build the operand
3445   // list.
3446   if (Disasm == NULL)
3447     return false;
3448   unsigned NumOpsAdded = 0;
3449   bool OK = (*Disasm)(MI, Opcode, insn, NumOps, NumOpsAdded, this);
3450
3451   if (!OK || this->Err != 0) return false;
3452   if (NumOpsAdded >= NumOps)
3453     return true;
3454
3455   // Stage 3 deals with operands unaccounted for after stage 2 is finished.
3456   // FIXME: Should this be done selectively?
3457   return TryPredicateAndSBitModifier(MI, Opcode, insn, NumOps - NumOpsAdded);
3458 }
3459
3460 // A8.3 Conditional execution
3461 // A8.3.1 Pseudocode details of conditional execution
3462 // Condition bits '111x' indicate the instruction is always executed.
3463 static uint32_t CondCode(uint32_t CondField) {
3464   if (CondField == 0xF)
3465     return ARMCC::AL;
3466   return CondField;
3467 }
3468
3469 /// DoPredicateOperands - DoPredicateOperands process the predicate operands
3470 /// of some Thumb instructions which come before the reglist operands.  It
3471 /// returns true if the two predicate operands have been processed.
3472 bool ARMBasicMCBuilder::DoPredicateOperands(MCInst& MI, unsigned Opcode,
3473     uint32_t /* insn */, unsigned short NumOpsRemaining) {
3474
3475   assert(NumOpsRemaining > 0 && "Invalid argument");
3476
3477   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
3478   unsigned Idx = MI.getNumOperands();
3479
3480   // First, we check whether this instr specifies the PredicateOperand through
3481   // a pair of TargetOperandInfos with isPredicate() property.
3482   if (NumOpsRemaining >= 2 &&
3483       OpInfo[Idx].isPredicate() && OpInfo[Idx+1].isPredicate() &&
3484       OpInfo[Idx].RegClass < 0 &&
3485       OpInfo[Idx+1].RegClass == ARM::CCRRegClassID)
3486   {
3487     // If we are inside an IT block, get the IT condition bits maintained via
3488     // ARMBasicMCBuilder::ITState[7:0], through ARMBasicMCBuilder::GetITCond().
3489     // See also A2.5.2.
3490     if (InITBlock())
3491       MI.addOperand(MCOperand::CreateImm(GetITCond()));
3492     else
3493       MI.addOperand(MCOperand::CreateImm(ARMCC::AL));
3494     MI.addOperand(MCOperand::CreateReg(ARM::CPSR));
3495     return true;
3496   }
3497
3498   return false;
3499 }
3500
3501 /// TryPredicateAndSBitModifier - TryPredicateAndSBitModifier tries to process
3502 /// the possible Predicate and SBitModifier, to build the remaining MCOperand
3503 /// constituents.
3504 bool ARMBasicMCBuilder::TryPredicateAndSBitModifier(MCInst& MI, unsigned Opcode,
3505     uint32_t insn, unsigned short NumOpsRemaining) {
3506
3507   assert(NumOpsRemaining > 0 && "Invalid argument");
3508
3509   const TargetOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
3510   const std::string &Name = ARMInsts[Opcode].Name;
3511   unsigned Idx = MI.getNumOperands();
3512   uint64_t TSFlags = ARMInsts[Opcode].TSFlags;
3513
3514   // First, we check whether this instr specifies the PredicateOperand through
3515   // a pair of TargetOperandInfos with isPredicate() property.
3516   if (NumOpsRemaining >= 2 &&
3517       OpInfo[Idx].isPredicate() && OpInfo[Idx+1].isPredicate() &&
3518       OpInfo[Idx].RegClass < 0 &&
3519       OpInfo[Idx+1].RegClass == ARM::CCRRegClassID)
3520   {
3521     // If we are inside an IT block, get the IT condition bits maintained via
3522     // ARMBasicMCBuilder::ITState[7:0], through ARMBasicMCBuilder::GetITCond().
3523     // See also A2.5.2.
3524     if (InITBlock())
3525       MI.addOperand(MCOperand::CreateImm(GetITCond()));
3526     else {
3527       if (Name.length() > 1 && Name[0] == 't') {
3528         // Thumb conditional branch instructions have their cond field embedded,
3529         // like ARM.
3530         //
3531         // A8.6.16 B
3532         if (Name == "t2Bcc")
3533           MI.addOperand(MCOperand::CreateImm(CondCode(slice(insn, 25, 22))));
3534         else if (Name == "tBcc")
3535           MI.addOperand(MCOperand::CreateImm(CondCode(slice(insn, 11, 8))));
3536         else
3537           MI.addOperand(MCOperand::CreateImm(ARMCC::AL));
3538       } else {
3539         // ARM instructions get their condition field from Inst{31-28}.
3540         // We should reject Inst{31-28} = 0b1111 as invalid encoding.
3541         if (!isNEONDomain(TSFlags) && getCondField(insn) == 0xF)
3542           return false;
3543         MI.addOperand(MCOperand::CreateImm(CondCode(getCondField(insn))));
3544       }
3545     }
3546     MI.addOperand(MCOperand::CreateReg(ARM::CPSR));
3547     Idx += 2;
3548     NumOpsRemaining -= 2;
3549   }
3550
3551   if (NumOpsRemaining == 0)
3552     return true;
3553
3554   // Next, if OptionalDefOperand exists, we check whether the 'S' bit is set.
3555   if (OpInfo[Idx].isOptionalDef() && OpInfo[Idx].RegClass==ARM::CCRRegClassID) {
3556     MI.addOperand(MCOperand::CreateReg(getSBit(insn) == 1 ? ARM::CPSR : 0));
3557     --NumOpsRemaining;
3558   }
3559
3560   if (NumOpsRemaining == 0)
3561     return true;
3562   else
3563     return false;
3564 }
3565
3566 /// RunBuildAfterHook - RunBuildAfterHook performs operations deemed necessary
3567 /// after BuildIt is finished.
3568 bool ARMBasicMCBuilder::RunBuildAfterHook(bool Status, MCInst &MI,
3569     uint32_t insn) {
3570
3571   if (!SP) return Status;
3572
3573   if (Opcode == ARM::t2IT)
3574     Status = SP->InitIT(slice(insn, 7, 0)) ? Status : false;
3575   else if (InITBlock())
3576     SP->UpdateIT();
3577
3578   return Status;
3579 }
3580
3581 /// Opcode, Format, and NumOperands make up an ARM Basic MCBuilder.
3582 ARMBasicMCBuilder::ARMBasicMCBuilder(unsigned opc, ARMFormat format,
3583                                      unsigned short num)
3584   : Opcode(opc), Format(format), NumOps(num), SP(0), Err(0) {
3585   unsigned Idx = (unsigned)format;
3586   assert(Idx < (array_lengthof(FuncPtrs) - 1) && "Unknown format");
3587   Disasm = FuncPtrs[Idx];
3588 }
3589
3590 /// CreateMCBuilder - Return an ARMBasicMCBuilder that can build up the MC
3591 /// infrastructure of an MCInst given the Opcode and Format of the instr.
3592 /// Return NULL if it fails to create/return a proper builder.  API clients
3593 /// are responsible for freeing up of the allocated memory.  Cacheing can be
3594 /// performed by the API clients to improve performance.
3595 ARMBasicMCBuilder *llvm::CreateMCBuilder(unsigned Opcode, ARMFormat Format) {
3596   // For "Unknown format", fail by returning a NULL pointer.
3597   if ((unsigned)Format >= (array_lengthof(FuncPtrs) - 1)) {
3598     DEBUG(errs() << "Unknown format\n");
3599     return 0;
3600   }
3601
3602   return new ARMBasicMCBuilder(Opcode, Format,
3603                                ARMInsts[Opcode].getNumOperands());
3604 }