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