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