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