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