Coverage Report

Created: 2025-12-05 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonev5/arch/ARM/ARMDisassembler.c
Line
Count
Source
1
//===-- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA --------------===//
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
/* Capstone Disassembly Engine */
11
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */
12
13
#ifdef CAPSTONE_HAS_ARM
14
15
#include <stdio.h>
16
#include <string.h>
17
#include <stdlib.h>
18
#include <capstone/platform.h>
19
20
#include "ARMAddressingModes.h"
21
#include "ARMBaseInfo.h"
22
#include "../../MCFixedLenDisassembler.h"
23
#include "../../MCInst.h"
24
#include "../../MCInstrDesc.h"
25
#include "../../MCRegisterInfo.h"
26
#include "../../LEB128.h"
27
#include "../../MCDisassembler.h"
28
#include "../../cs_priv.h"
29
#include "../../utils.h"
30
31
#include "ARMDisassembler.h"
32
#include "ARMMapping.h"
33
34
#define GET_SUBTARGETINFO_ENUM
35
#include "ARMGenSubtargetInfo.inc"
36
37
#define GET_INSTRINFO_MC_DESC
38
#include "ARMGenInstrInfo.inc"
39
40
#define GET_INSTRINFO_ENUM
41
#include "ARMGenInstrInfo.inc"
42
43
static bool ITStatus_push_back(ARM_ITStatus *it, char v)
44
11.9k
{
45
11.9k
  if (it->size >= sizeof(it->ITStates)) {
46
    // TODO: consider warning user.
47
0
    it->size = 0;
48
0
  }
49
11.9k
  it->ITStates[it->size] = v;
50
11.9k
  it->size++;
51
52
11.9k
  return true;
53
11.9k
}
54
55
// Returns true if the current instruction is in an IT block
56
static bool ITStatus_instrInITBlock(ARM_ITStatus *it)
57
1.06M
{
58
  //return !ITStates.empty();
59
1.06M
  return (it->size > 0);
60
1.06M
}
61
62
// Returns true if current instruction is the last instruction in an IT block
63
static bool ITStatus_instrLastInITBlock(ARM_ITStatus *it)
64
86
{
65
86
  return (it->size == 1);
66
86
}
67
68
// Handles the condition code status of instructions in IT blocks
69
70
// Returns the condition code for instruction in IT block
71
static unsigned ITStatus_getITCC(ARM_ITStatus *it)
72
449k
{
73
449k
  unsigned CC = ARMCC_AL;
74
75
449k
  if (ITStatus_instrInITBlock(it))
76
    //CC = ITStates.back();
77
11.6k
    CC = it->ITStates[it->size-1];
78
79
449k
  return CC;
80
449k
}
81
82
// Advances the IT block state to the next T or E
83
static void ITStatus_advanceITState(ARM_ITStatus *it)
84
11.6k
{
85
  //ITStates.pop_back();
86
11.6k
  it->size--;
87
11.6k
}
88
89
// Called when decoding an IT instruction. Sets the IT state for the following
90
// instructions that for the IT block. Firstcond and Mask correspond to the 
91
// fields in the IT instruction encoding.
92
static void ITStatus_setITState(ARM_ITStatus *it, char Firstcond, char Mask)
93
3.76k
{
94
  // (3 - the number of trailing zeros) is the number of then / else.
95
3.76k
  unsigned CondBit0 = Firstcond & 1;
96
3.76k
  unsigned NumTZ = CountTrailingZeros_32(Mask);
97
3.76k
  unsigned char CCBits = (unsigned char)Firstcond & 0xf;
98
3.76k
  unsigned Pos;
99
100
  //assert(NumTZ <= 3 && "Invalid IT mask!");
101
  // push condition codes onto the stack the correct order for the pops
102
11.9k
  for (Pos = NumTZ + 1; Pos <= 3; ++Pos) {
103
8.21k
    bool T = ((Mask >> Pos) & 1) == (int)CondBit0;
104
105
8.21k
    if (T)
106
4.07k
      ITStatus_push_back(it, CCBits);
107
4.13k
    else
108
4.13k
      ITStatus_push_back(it, CCBits ^ 1);
109
8.21k
  }
110
111
3.76k
  ITStatus_push_back(it, CCBits);
112
3.76k
}
113
114
/// ThumbDisassembler - Thumb disassembler for all Thumb platforms.
115
116
static bool Check(DecodeStatus *Out, DecodeStatus In)
117
2.96M
{
118
2.96M
  switch (In) {
119
2.82M
    case MCDisassembler_Success:
120
      // Out stays the same.
121
2.82M
      return true;
122
129k
    case MCDisassembler_SoftFail:
123
129k
      *Out = In;
124
129k
      return true;
125
16.0k
    case MCDisassembler_Fail:
126
16.0k
      *Out = In;
127
16.0k
      return false;
128
0
    default:  // never reached
129
0
      return false;
130
2.96M
  }
131
2.96M
}
132
133
// Forward declare these because the autogenerated code will reference them.
134
// Definitions are further down.
135
static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo,
136
    uint64_t Address, const void *Decoder);
137
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst,
138
    unsigned RegNo, uint64_t Address, const void *Decoder);
139
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst,
140
    unsigned RegNo, uint64_t Address, const void *Decoder);
141
static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo,
142
    uint64_t Address, const void *Decoder);
143
static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo,
144
    uint64_t Address, const void *Decoder);
145
static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo,
146
    uint64_t Address, const void *Decoder);
147
static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo,
148
    uint64_t Address, const void *Decoder);
149
static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo,
150
    uint64_t Address, const void *Decoder);
151
static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo,
152
    uint64_t Address, const void *Decoder);
153
static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
154
    uint64_t Address, const void *Decoder);
155
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst,
156
    unsigned RegNo, uint64_t Address, const void *Decoder);
157
static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo,
158
    uint64_t Address, const void *Decoder);
159
static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo,
160
    uint64_t Address, const void *Decoder);
161
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst,
162
    unsigned RegNo, uint64_t Address, const void *Decoder);
163
static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val,
164
    uint64_t Address, const void *Decoder);
165
static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val,
166
    uint64_t Address, const void *Decoder);
167
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val,
168
    uint64_t Address, const void *Decoder);
169
static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val,
170
    uint64_t Address, const void *Decoder);
171
static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val,
172
    uint64_t Address, const void *Decoder);
173
static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Insn,
174
    uint64_t Address, const void *Decoder);
175
static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn,
176
    uint64_t Address, const void *Decoder);
177
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst,
178
    unsigned Insn, uint64_t Address, const void *Decoder);
179
static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Insn,
180
    uint64_t Address, const void *Decoder);
181
static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst,unsigned Insn,
182
    uint64_t Address, const void *Decoder);
183
static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Insn,
184
    uint64_t Address, const void *Decoder);
185
static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Insn,
186
    uint64_t Address, const void *Decoder);
187
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst * Inst,
188
    unsigned Insn, uint64_t Adddress, const void *Decoder);
189
static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn,
190
    uint64_t Address, const void *Decoder);
191
static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn,
192
    uint64_t Address, const void *Decoder);
193
static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn,
194
    uint64_t Address, const void *Decoder);
195
static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn,
196
    uint64_t Address, const void *Decoder);
197
static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn,
198
    uint64_t Address, const void *Decoder);
199
static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val,
200
    uint64_t Address, const void *Decoder);
201
static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val,
202
    uint64_t Address, const void *Decoder);
203
static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val,
204
    uint64_t Address, const void *Decoder);
205
static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn,
206
    uint64_t Address, const void *Decoder);
207
static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst,unsigned Insn,
208
    uint64_t Address, const void *Decoder);
209
static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val,
210
    uint64_t Address, const void *Decoder);
211
static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Val,
212
    uint64_t Address, const void *Decoder);
213
static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Val,
214
    uint64_t Address, const void *Decoder);
215
static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Val,
216
    uint64_t Address, const void *Decoder);
217
static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Val,
218
    uint64_t Address, const void *Decoder);
219
static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Val,
220
    uint64_t Address, const void *Decoder);
221
static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Val,
222
    uint64_t Address, const void *Decoder);
223
static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Val,
224
    uint64_t Address, const void *Decoder);
225
static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Val,
226
    uint64_t Address, const void *Decoder);
227
static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Val,
228
    uint64_t Address, const void *Decoder);
229
static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Val,
230
    uint64_t Address, const void *Decoder);
231
static DecodeStatus DecodeNEONModImmInstruction(MCInst *Inst,unsigned Val,
232
    uint64_t Address, const void *Decoder);
233
static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Val,
234
    uint64_t Address, const void *Decoder);
235
static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val,
236
    uint64_t Address, const void *Decoder);
237
static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val,
238
    uint64_t Address, const void *Decoder);
239
static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val,
240
    uint64_t Address, const void *Decoder);
241
static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val,
242
    uint64_t Address, const void *Decoder);
243
static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn,
244
    uint64_t Address, const void *Decoder);
245
static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn,
246
    uint64_t Address, const void *Decoder);
247
static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Insn,
248
    uint64_t Address, const void *Decoder);
249
static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Insn,
250
    uint64_t Address, const void *Decoder);
251
static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Insn,
252
    uint64_t Address, const void *Decoder);
253
static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Insn,
254
    uint64_t Address, const void *Decoder);
255
static DecodeStatus DecodeBankedReg(MCInst *Inst, unsigned Insn,
256
    uint64_t Address, const void *Decoder);
257
static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn,
258
    uint64_t Address, const void *Decoder);
259
static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn,
260
    uint64_t Address, const void *Decoder);
261
static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn,
262
    uint64_t Address, const void *Decoder);
263
static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn,
264
    uint64_t Address, const void *Decoder);
265
static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn,
266
    uint64_t Address, const void *Decoder);
267
static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn,
268
    uint64_t Address, const void *Decoder);
269
static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn,
270
    uint64_t Address, const void *Decoder);
271
static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn,
272
    uint64_t Address, const void *Decoder);
273
static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn,
274
    uint64_t Address, const void *Decoder);
275
static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn,
276
    uint64_t Address, const void *Decoder);
277
static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn,
278
    uint64_t Address, const void *Decoder);
279
static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn,
280
    uint64_t Address, const void *Decoder);
281
static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn,
282
    uint64_t Address, const void *Decoder);
283
static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn,
284
    uint64_t Address, const void *Decoder);
285
static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn,
286
    uint64_t Address, const void *Decoder);
287
static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn,
288
    uint64_t Address, const void *Decoder);
289
static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn,
290
    uint64_t Address, const void *Decoder);
291
static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn,
292
    uint64_t Address, const void *Decoder);
293
static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn,
294
    uint64_t Address, const void *Decoder);
295
static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn,
296
    uint64_t Address, const void *Decoder);
297
static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val,
298
    uint64_t Address, const void *Decoder);
299
static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val,
300
    uint64_t Address, const void *Decoder);
301
static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val,
302
    uint64_t Address, const void *Decoder);
303
static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val,
304
    uint64_t Address, const void *Decoder);
305
static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val,
306
    uint64_t Address, const void *Decoder);
307
static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val,
308
    uint64_t Address, const void *Decoder);
309
static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val,
310
    uint64_t Address, const void *Decoder);
311
static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val,
312
    uint64_t Address, const void *Decoder);
313
static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Val,
314
    uint64_t Address, const void *Decoder);
315
static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn,
316
    uint64_t Address, const void* Decoder);
317
static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn,
318
    uint64_t Address, const void* Decoder);
319
static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn,
320
    uint64_t Address, const void* Decoder);
321
static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn,
322
    uint64_t Address, const void* Decoder);
323
static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val,
324
    uint64_t Address, const void *Decoder);
325
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val,
326
    uint64_t Address, const void *Decoder);
327
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst,unsigned Val,
328
    uint64_t Address, const void *Decoder);
329
static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val,
330
    uint64_t Address, const void *Decoder);
331
static DecodeStatus DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val,
332
    uint64_t Address, const void *Decoder);
333
static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Val,
334
    uint64_t Address, const void *Decoder);
335
static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn,
336
    uint64_t Address, const void *Decoder);
337
static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn,
338
    uint64_t Address, const void *Decoder);
339
static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn,
340
    uint64_t Address, const void *Decoder);
341
static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Insn,
342
    uint64_t Address, const void *Decoder);
343
static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val,
344
    uint64_t Address, const void *Decoder);
345
static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Val,
346
    uint64_t Address, const void *Decoder);
347
static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Val,
348
    uint64_t Address, const void *Decoder);
349
static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val,
350
    uint64_t Address, const void *Decoder);
351
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst,unsigned Val,
352
    uint64_t Address, const void *Decoder);
353
static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val,
354
    uint64_t Address, const void *Decoder);
355
static DecodeStatus DecodeIT(MCInst *Inst, unsigned Val,
356
    uint64_t Address, const void *Decoder);
357
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst,unsigned Insn,
358
    uint64_t Address, const void *Decoder);
359
static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst,unsigned Insn,
360
    uint64_t Address, const void *Decoder);
361
static DecodeStatus DecodeT2Adr(MCInst *Inst, uint32_t Val,
362
    uint64_t Address, const void *Decoder);
363
static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Val,
364
    uint64_t Address, const void *Decoder);
365
static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, uint32_t Val,
366
    uint64_t Address, const void *Decoder);
367
static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val,
368
    uint64_t Address, const void *Decoder);
369
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst *Inst, unsigned Val,
370
    uint64_t Address, const void *Decoder);
371
static DecodeStatus DecodeHINTInstruction(MCInst *Inst, unsigned Insn,
372
    uint64_t Address, const void *Decoder);
373
static DecodeStatus DecodeTSTInstruction(MCInst *Inst, unsigned Insn,
374
    uint64_t Address, const void *Decoder);
375
static DecodeStatus DecodeSETPANInstruction(MCInst *Inst, unsigned Insn,
376
    uint64_t Address, const void *Decoder);
377
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst *Inst, unsigned Val,
378
    uint64_t Address, const void *Decoder);
379
static DecodeStatus DecodeForVMRSandVMSR(MCInst *Inst, unsigned Val,
380
    uint64_t Address, const void *Decoder);
381
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst *Inst, unsigned Insn,
382
    uint64_t Address, const void *Decoder);
383
static DecodeStatus DecodeHPRRegisterClass(MCInst *Inst, unsigned RegNo,
384
    uint64_t Address, const void *Decoder);
385
386
// Hacky: enable all features for disassembler
387
bool ARM_getFeatureBits(unsigned int mode, unsigned int feature)
388
2.42M
{
389
2.42M
  if ((mode & CS_MODE_V8) == 0) {
390
    // not V8 mode
391
1.89M
    if (feature == ARM_HasV8Ops || feature == ARM_HasV8_1aOps ||
392
1.80M
      feature == ARM_HasV8_4aOps || feature == ARM_HasV8_3aOps)
393
      // HasV8MBaselineOps
394
97.9k
      return false;
395
1.89M
  }
396
2.32M
  if (feature == ARM_FeatureVFPOnlySP)
397
11.1k
    return false;
398
399
2.31M
  if ((mode & CS_MODE_MCLASS) == 0) {
400
1.58M
    if (feature == ARM_FeatureMClass)
401
81.8k
      return false;
402
1.58M
  }
403
404
2.23M
  if ((mode & CS_MODE_THUMB) == 0) {
405
    // not Thumb
406
344k
    if (feature == ARM_FeatureThumb2 || feature == ARM_ModeThumb)
407
215k
      return false;
408
    // FIXME: what mode enables D16?
409
128k
    if (feature == ARM_FeatureD16)
410
36.5k
      return false;
411
1.88M
  } else {
412
    // Thumb
413
1.88M
    if (feature == ARM_FeatureD16)
414
172k
      return false;
415
1.88M
  }
416
417
1.80M
  if (feature == ARM_FeatureMClass && (mode & CS_MODE_MCLASS) == 0)
418
0
    return false;
419
420
  // we support everything
421
1.80M
  return true;
422
1.80M
}
423
424
#include "ARMGenDisassemblerTables.inc"
425
426
static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val,
427
    uint64_t Address, const void *Decoder)
428
173k
{
429
173k
  if (Val == 0xF) return MCDisassembler_Fail;
430
431
  // AL predicate is not allowed on Thumb1 branches.
432
163k
  if (MCInst_getOpcode(Inst) == ARM_tBcc && Val == 0xE)
433
0
    return MCDisassembler_Fail;
434
435
163k
  MCOperand_CreateImm0(Inst, Val);
436
437
163k
  if (Val == ARMCC_AL) {
438
27.5k
    MCOperand_CreateReg0(Inst, 0);
439
27.5k
  } else
440
135k
    MCOperand_CreateReg0(Inst, ARM_CPSR);
441
442
163k
  return MCDisassembler_Success;
443
163k
}
444
445
#define GET_REGINFO_MC_DESC
446
#include "ARMGenRegisterInfo.inc"
447
void ARM_init(MCRegisterInfo *MRI)
448
11.3k
{
449
  /* 
450
    InitMCRegisterInfo(ARMRegDesc, 289,
451
    RA, PC,
452
    ARMMCRegisterClasses, 103,
453
    ARMRegUnitRoots, 77, ARMRegDiffLists, ARMRegStrings,
454
    ARMSubRegIdxLists, 57,
455
    ARMSubRegIdxRanges, ARMRegEncodingTable);
456
   */
457
458
11.3k
  MCRegisterInfo_InitMCRegisterInfo(MRI, ARMRegDesc, 289,
459
11.3k
      0, 0, 
460
11.3k
      ARMMCRegisterClasses, 103,
461
11.3k
      0, 0, ARMRegDiffLists, 0, 
462
11.3k
      ARMSubRegIdxLists, 57,
463
11.3k
      0);
464
11.3k
}
465
466
// Post-decoding checks
467
static DecodeStatus checkDecodedInstruction(MCInst *MI,
468
    uint32_t Insn,
469
    DecodeStatus Result)
470
140k
{
471
140k
  switch (MCInst_getOpcode(MI)) {
472
360
    case ARM_HVC: {
473
        // HVC is undefined if condition = 0xf otherwise upredictable
474
        // if condition != 0xe
475
360
        uint32_t Cond = (Insn >> 28) & 0xF;
476
477
360
        if (Cond == 0xF)
478
1
          return MCDisassembler_Fail;
479
480
359
        if (Cond != 0xE)
481
225
          return MCDisassembler_SoftFail;
482
483
134
        return Result;
484
359
      }
485
140k
    default:
486
140k
         return Result;
487
140k
  }
488
140k
}
489
490
static DecodeStatus _ARM_getInstruction(cs_struct *ud, MCInst *MI, const uint8_t *code, size_t code_len,
491
    uint16_t *Size, uint64_t Address)
492
162k
{
493
162k
  uint32_t insn;
494
162k
  DecodeStatus result;
495
496
162k
  *Size = 0;
497
498
162k
  if (code_len < 4)
499
    // not enough data
500
1.49k
    return MCDisassembler_Fail;
501
502
160k
  if (MI->flat_insn->detail) {
503
160k
    unsigned int i;
504
505
160k
    memset(MI->flat_insn->detail, 0, offsetof(cs_detail, arm) + sizeof(cs_arm));
506
507
5.94M
    for (i = 0; i < ARR_SIZE(MI->flat_insn->detail->arm.operands); i++) {
508
5.78M
      MI->flat_insn->detail->arm.operands[i].vector_index = -1;
509
5.78M
      MI->flat_insn->detail->arm.operands[i].neon_lane = -1;
510
5.78M
    }
511
160k
  }
512
513
160k
  if (MODE_IS_BIG_ENDIAN(ud->mode))
514
0
    insn = (code[3] << 0) | (code[2] << 8) |
515
0
      (code[1] <<  16) | ((uint32_t) code[0] << 24);
516
160k
  else
517
160k
    insn = ((uint32_t) code[3] << 24) | (code[2] << 16) |
518
160k
      (code[1] <<  8) | (code[0] <<  0);
519
520
  // Calling the auto-generated decoder function.
521
160k
  result = decodeInstruction_4(DecoderTableARM32, MI, insn, Address);
522
160k
  if (result != MCDisassembler_Fail) {
523
123k
    result = checkDecodedInstruction(MI, insn, result);
524
123k
    if (result != MCDisassembler_Fail)
525
123k
      *Size = 4;
526
527
123k
    return result;
528
123k
  }
529
530
  // VFP and NEON instructions, similarly, are shared between ARM
531
  // and Thumb modes.
532
36.8k
  MCInst_clear(MI);
533
36.8k
  result = decodeInstruction_4(DecoderTableVFP32, MI, insn, Address);
534
36.8k
  if (result != MCDisassembler_Fail) {
535
10.9k
    *Size = 4;
536
10.9k
    return result;
537
10.9k
  }
538
539
25.8k
  MCInst_clear(MI);
540
25.8k
  result = decodeInstruction_4(DecoderTableVFPV832, MI, insn, Address);
541
25.8k
  if (result != MCDisassembler_Fail) {
542
2.09k
    *Size = 4;
543
2.09k
    return result;
544
2.09k
  }
545
546
23.7k
  MCInst_clear(MI);
547
23.7k
  result = decodeInstruction_4(DecoderTableNEONData32, MI, insn, Address);
548
23.7k
  if (result != MCDisassembler_Fail) {
549
3.23k
    *Size = 4;
550
    // Add a fake predicate operand, because we share these instruction
551
    // definitions with Thumb2 where these instructions are predicable.
552
3.23k
    if (!DecodePredicateOperand(MI, 0xE, Address, NULL))
553
0
      return MCDisassembler_Fail;
554
3.23k
    return result;
555
3.23k
  }
556
557
20.5k
  MCInst_clear(MI);
558
20.5k
  result = decodeInstruction_4(DecoderTableNEONLoadStore32, MI, insn, Address);
559
20.5k
  if (result != MCDisassembler_Fail) {
560
2.44k
    *Size = 4;
561
    // Add a fake predicate operand, because we share these instruction
562
    // definitions with Thumb2 where these instructions are predicable.
563
2.44k
    if (!DecodePredicateOperand(MI, 0xE, Address, NULL))
564
0
      return MCDisassembler_Fail;
565
2.44k
    return result;
566
2.44k
  }
567
568
18.0k
  MCInst_clear(MI);
569
18.0k
  result = decodeInstruction_4(DecoderTableNEONDup32, MI, insn, Address);
570
18.0k
  if (result != MCDisassembler_Fail) {
571
385
    *Size = 4;
572
    // Add a fake predicate operand, because we share these instruction
573
    // definitions with Thumb2 where these instructions are predicable.
574
385
    if (!DecodePredicateOperand(MI, 0xE, Address, NULL))
575
0
      return MCDisassembler_Fail;
576
385
    return result;
577
385
  }
578
579
17.7k
  MCInst_clear(MI);
580
17.7k
  result = decodeInstruction_4(DecoderTablev8NEON32, MI, insn, Address);
581
17.7k
  if (result != MCDisassembler_Fail) {
582
74
    *Size = 4;
583
74
    return result;
584
74
  }
585
586
17.6k
  MCInst_clear(MI);
587
17.6k
  result = decodeInstruction_4(DecoderTablev8Crypto32, MI, insn, Address);
588
17.6k
  if (result != MCDisassembler_Fail) {
589
195
    *Size = 4;
590
195
    return result;
591
195
  }
592
593
17.4k
  result = decodeInstruction_4(DecoderTableCoProc32, MI, insn, Address);
594
17.4k
  if (result != MCDisassembler_Fail) {
595
16.8k
    result = checkDecodedInstruction(MI, insn, result);
596
16.8k
    if (result != MCDisassembler_Fail)
597
16.8k
      *Size = 4;
598
599
16.8k
    return result;
600
16.8k
  }
601
602
561
  MCInst_clear(MI);
603
561
  *Size = 0;
604
561
  return MCDisassembler_Fail;
605
17.4k
}
606
607
// Thumb1 instructions don't have explicit S bits. Rather, they
608
// implicitly set CPSR. Since it's not represented in the encoding, the
609
// auto-generated decoder won't inject the CPSR operand. We need to fix
610
// that as a post-pass.
611
static void AddThumb1SBit(MCInst *MI, bool InITBlock)
612
330k
{
613
330k
  const MCOperandInfo *OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo;
614
330k
  unsigned short NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands;
615
330k
  unsigned i;
616
617
675k
  for (i = 0; i < NumOps; ++i) {
618
667k
    if (i == MCInst_getNumOperands(MI)) break;
619
620
667k
    if (MCOperandInfo_isOptionalDef(&OpInfo[i]) && OpInfo[i].RegClass == ARM_CCRRegClassID) {
621
322k
      if (i > 0 && MCOperandInfo_isPredicate(&OpInfo[i - 1])) continue;
622
322k
      MCInst_insert0(MI, i, MCOperand_CreateReg1(MI, InITBlock ? 0 : ARM_CPSR));
623
322k
      return;
624
322k
    }
625
667k
  }
626
627
  //MI.insert(I, MCOperand_CreateReg0(Inst, InITBlock ? 0 : ARM_CPSR));
628
7.72k
  MCInst_insert0(MI, i, MCOperand_CreateReg1(MI, InITBlock ? 0 : ARM_CPSR));
629
7.72k
}
630
631
// Most Thumb instructions don't have explicit predicates in the
632
// encoding, but rather get their predicates from IT context. We need
633
// to fix up the predicate operands using this context information as a
634
// post-pass.
635
static DecodeStatus AddThumbPredicate(cs_struct *ud, MCInst *MI)
636
483k
{
637
483k
  DecodeStatus S = MCDisassembler_Success;
638
483k
  const MCOperandInfo *OpInfo;
639
483k
  unsigned short NumOps;
640
483k
  unsigned int i;
641
483k
  unsigned CC;
642
643
  // A few instructions actually have predicates encoded in them. Don't
644
  // try to overwrite it if we're seeing one of those.
645
483k
  switch (MCInst_getOpcode(MI)) {
646
10.5k
    case ARM_tBcc:
647
12.1k
    case ARM_t2Bcc:
648
13.2k
    case ARM_tCBZ:
649
15.3k
    case ARM_tCBNZ:
650
15.8k
    case ARM_tCPS:
651
16.1k
    case ARM_t2CPS3p:
652
16.3k
    case ARM_t2CPS2p:
653
16.6k
    case ARM_t2CPS1p:
654
44.5k
    case ARM_tMOVSr:
655
44.6k
    case ARM_tSETEND:
656
      // Some instructions (mostly conditional branches) are not
657
      // allowed in IT blocks.
658
44.6k
      if (ITStatus_instrInITBlock(&(ud->ITBlock)))
659
794
        S = MCDisassembler_SoftFail;
660
43.9k
      else
661
43.9k
        return MCDisassembler_Success;
662
794
      break;
663
664
2.15k
    case ARM_t2HINT:
665
2.15k
      if (MCOperand_getImm(MCInst_getOperand(MI, 0)) == 0x10)
666
76
        S = MCDisassembler_SoftFail;
667
2.15k
      break;
668
669
5.03k
    case ARM_tB:
670
5.62k
    case ARM_t2B:
671
5.96k
    case ARM_t2TBB:
672
6.50k
    case ARM_t2TBH:
673
      // Some instructions (mostly unconditional branches) can
674
      // only appears at the end of, or outside of, an IT.
675
      // if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
676
6.50k
      if (ITStatus_instrInITBlock(&(ud->ITBlock)) && !ITStatus_instrLastInITBlock(&(ud->ITBlock)))
677
52
        S = MCDisassembler_SoftFail;
678
6.50k
      break;
679
430k
    default:
680
430k
      break;
681
483k
  }
682
683
  // If we're in an IT block, base the predicate on that.  Otherwise,
684
  // assume a predicate of AL.
685
439k
  CC = ITStatus_getITCC(&(ud->ITBlock));
686
439k
  if (CC == 0xF) 
687
783
    CC = ARMCC_AL;
688
689
439k
  if (ITStatus_instrInITBlock(&(ud->ITBlock)))
690
10.2k
    ITStatus_advanceITState(&(ud->ITBlock));
691
692
439k
  OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo;
693
439k
  NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands;
694
695
1.81M
  for (i = 0; i < NumOps; ++i) {
696
1.81M
    if (i == MCInst_getNumOperands(MI)) break;
697
698
1.41M
    if (MCOperandInfo_isPredicate(&OpInfo[i])) {
699
31.3k
      MCInst_insert0(MI, i, MCOperand_CreateImm1(MI, CC));
700
701
31.3k
      if (CC == ARMCC_AL)
702
30.7k
        MCInst_insert0(MI, i+1, MCOperand_CreateReg1(MI, 0));
703
673
      else
704
673
        MCInst_insert0(MI, i+1, MCOperand_CreateReg1(MI, ARM_CPSR));
705
706
31.3k
      return S;
707
31.3k
    }
708
1.41M
  }
709
710
408k
  MCInst_insert0(MI, i, MCOperand_CreateImm1(MI, CC));
711
712
408k
  if (CC == ARMCC_AL)
713
400k
    MCInst_insert0(MI, i + 1, MCOperand_CreateReg1(MI, 0));
714
7.86k
  else
715
7.86k
    MCInst_insert0(MI, i + 1, MCOperand_CreateReg1(MI, ARM_CPSR));
716
717
408k
  return S;
718
439k
}
719
720
// Thumb VFP instructions are a special case. Because we share their
721
// encodings between ARM and Thumb modes, and they are predicable in ARM
722
// mode, the auto-generated decoder will give them an (incorrect)
723
// predicate operand. We need to rewrite these operands based on the IT
724
// context as a post-pass.
725
static void UpdateThumbVFPPredicate(cs_struct *ud, MCInst *MI)
726
10.5k
{
727
10.5k
  unsigned CC;
728
10.5k
  unsigned short NumOps;
729
10.5k
  const MCOperandInfo *OpInfo;
730
10.5k
  unsigned i;
731
732
10.5k
  CC = ITStatus_getITCC(&(ud->ITBlock));
733
10.5k
  if (ITStatus_instrInITBlock(&(ud->ITBlock)))
734
1.41k
    ITStatus_advanceITState(&(ud->ITBlock));
735
736
10.5k
  OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo;
737
10.5k
  NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands;
738
739
33.6k
  for (i = 0; i < NumOps; ++i) {
740
33.6k
    if (MCOperandInfo_isPredicate(&OpInfo[i])) {
741
10.5k
      MCOperand_setImm(MCInst_getOperand(MI, i), CC);
742
743
10.5k
      if (CC == ARMCC_AL)
744
9.25k
        MCOperand_setReg(MCInst_getOperand(MI, i + 1), 0);
745
1.25k
      else
746
1.25k
        MCOperand_setReg(MCInst_getOperand(MI, i + 1), ARM_CPSR);
747
748
10.5k
      return;
749
10.5k
    }
750
33.6k
  }
751
10.5k
}
752
753
static DecodeStatus _Thumb_getInstruction(cs_struct *ud, MCInst *MI, const uint8_t *code, size_t code_len,
754
    uint16_t *Size, uint64_t Address)
755
502k
{
756
502k
  uint16_t insn16;
757
502k
  DecodeStatus result;
758
502k
  bool InITBlock;
759
502k
  unsigned Firstcond, Mask; 
760
502k
  uint32_t NEONLdStInsn, insn32, NEONDataInsn, NEONCryptoInsn, NEONv8Insn;
761
502k
  size_t i;
762
763
  // We want to read exactly 2 bytes of data.
764
502k
  if (code_len < 2)
765
    // not enough data
766
1.70k
    return MCDisassembler_Fail;
767
768
500k
  if (MI->flat_insn->detail) {
769
500k
    memset(MI->flat_insn->detail, 0, offsetof(cs_detail, arm)+sizeof(cs_arm));
770
18.5M
    for (i = 0; i < ARR_SIZE(MI->flat_insn->detail->arm.operands); i++) {
771
18.0M
      MI->flat_insn->detail->arm.operands[i].vector_index = -1;
772
18.0M
      MI->flat_insn->detail->arm.operands[i].neon_lane = -1;
773
18.0M
    }
774
500k
  }
775
776
500k
  if (MODE_IS_BIG_ENDIAN(ud->mode))
777
0
    insn16 = (code[0] << 8) | code[1];
778
500k
  else
779
500k
    insn16 = (code[1] << 8) | code[0];
780
781
500k
  result = decodeInstruction_2(DecoderTableThumb16, MI, insn16, Address);
782
500k
  if (result != MCDisassembler_Fail) {
783
198k
    *Size = 2;
784
198k
    Check(&result, AddThumbPredicate(ud, MI));
785
198k
    return result;
786
198k
  }
787
788
301k
  MCInst_clear(MI);
789
301k
  result = decodeInstruction_2(DecoderTableThumbSBit16, MI, insn16, Address);
790
301k
  if (result) {
791
101k
    *Size = 2;
792
101k
    InITBlock = ITStatus_instrInITBlock(&(ud->ITBlock));
793
101k
    Check(&result, AddThumbPredicate(ud, MI));
794
101k
    AddThumb1SBit(MI, InITBlock);
795
101k
    return result;
796
101k
  }
797
798
199k
  MCInst_clear(MI);
799
199k
  result = decodeInstruction_2(DecoderTableThumb216, MI, insn16, Address);
800
199k
  if (result != MCDisassembler_Fail) {
801
6.40k
    *Size = 2;
802
803
    // Nested IT blocks are UNPREDICTABLE.  Must be checked before we add
804
    // the Thumb predicate.
805
6.40k
    if (MCInst_getOpcode(MI) == ARM_t2IT && ITStatus_instrInITBlock(&(ud->ITBlock)))
806
2.63k
      return MCDisassembler_SoftFail;
807
808
3.76k
    Check(&result, AddThumbPredicate(ud, MI));
809
810
    // If we find an IT instruction, we need to parse its condition
811
    // code and mask operands so that we can apply them correctly
812
    // to the subsequent instructions.
813
3.76k
    if (MCInst_getOpcode(MI) == ARM_t2IT) {
814
3.76k
      Firstcond = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, 0));
815
3.76k
      Mask = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, 1));
816
3.76k
      ITStatus_setITState(&(ud->ITBlock), (char)Firstcond, (char)Mask);
817
818
      // An IT instruction that would give a 'NV' predicate is unpredictable.
819
      // if (Firstcond == ARMCC_AL && !isPowerOf2_32(Mask))
820
      //  CS << "unpredictable IT predicate sequence";
821
3.76k
    }
822
823
3.76k
    return result;
824
6.40k
  }
825
826
  // We want to read exactly 4 bytes of data.
827
193k
  if (code_len < 4)
828
    // not enough data
829
427
    return MCDisassembler_Fail;
830
831
193k
  if (MODE_IS_BIG_ENDIAN(ud->mode))
832
0
    insn32 = (code[3] <<  0) | (code[2] <<  8) |
833
0
      (code[1] << 16) | ((uint32_t) code[0] << 24);
834
193k
  else
835
193k
    insn32 = (code[3] <<  8) | (code[2] <<  0) |
836
193k
      ((uint32_t) code[1] << 24) | (code[0] << 16);
837
838
193k
  MCInst_clear(MI);
839
193k
  result = decodeInstruction_4(DecoderTableThumb32, MI, insn32, Address);
840
193k
  if (result != MCDisassembler_Fail) {
841
2.70k
    *Size = 4;
842
2.70k
    InITBlock = ITStatus_instrInITBlock(&(ud->ITBlock));
843
2.70k
    Check(&result, AddThumbPredicate(ud, MI));
844
2.70k
    AddThumb1SBit(MI, InITBlock);
845
846
2.70k
    return result;
847
2.70k
  }
848
849
190k
  MCInst_clear(MI);
850
190k
  result = decodeInstruction_4(DecoderTableThumb232, MI, insn32, Address);
851
190k
  if (result != MCDisassembler_Fail) {
852
84.2k
    *Size = 4;
853
84.2k
    Check(&result, AddThumbPredicate(ud, MI));
854
84.2k
    return result;
855
84.2k
  }
856
857
106k
  if (fieldFromInstruction_4(insn32, 28, 4) == 0xE) {
858
26.0k
    MCInst_clear(MI);
859
26.0k
    result = decodeInstruction_4(DecoderTableVFP32, MI, insn32, Address);
860
26.0k
    if (result != MCDisassembler_Fail) {
861
10.5k
      *Size = 4;
862
10.5k
      UpdateThumbVFPPredicate(ud, MI);
863
10.5k
      return result;
864
10.5k
    }
865
26.0k
  }
866
867
95.6k
  MCInst_clear(MI);
868
95.6k
  result = decodeInstruction_4(DecoderTableVFPV832, MI, insn32, Address);
869
95.6k
  if (result != MCDisassembler_Fail) {
870
1.40k
    *Size = 4;
871
1.40k
    return result;
872
1.40k
  }
873
874
94.2k
  if (fieldFromInstruction_4(insn32, 28, 4) == 0xE) {
875
15.5k
    MCInst_clear(MI);
876
15.5k
    result = decodeInstruction_4(DecoderTableNEONDup32, MI, insn32, Address);
877
15.5k
    if (result != MCDisassembler_Fail) {
878
1.34k
      *Size = 4;
879
1.34k
      Check(&result, AddThumbPredicate(ud, MI));
880
1.34k
      return result;
881
1.34k
    }
882
15.5k
  }
883
884
92.9k
  if (fieldFromInstruction_4(insn32, 24, 8) == 0xF9) {
885
54.2k
    MCInst_clear(MI);
886
54.2k
    NEONLdStInsn = insn32;
887
54.2k
    NEONLdStInsn &= 0xF0FFFFFF;
888
54.2k
    NEONLdStInsn |= 0x04000000;
889
54.2k
    result = decodeInstruction_4(DecoderTableNEONLoadStore32, MI, NEONLdStInsn, Address);
890
54.2k
    if (result != MCDisassembler_Fail) {
891
53.9k
      *Size = 4;
892
53.9k
      Check(&result, AddThumbPredicate(ud, MI));
893
53.9k
      return result;
894
53.9k
    }
895
54.2k
  }
896
897
39.0k
  if (fieldFromInstruction_4(insn32, 24, 4) == 0xF) {
898
23.0k
    MCInst_clear(MI);
899
23.0k
    NEONDataInsn = insn32;
900
23.0k
    NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
901
23.0k
    NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
902
23.0k
    NEONDataInsn |= 0x12000000; // Set bits 28 and 25
903
23.0k
    result = decodeInstruction_4(DecoderTableNEONData32, MI, NEONDataInsn, Address);
904
23.0k
    if (result != MCDisassembler_Fail) {
905
22.4k
      *Size = 4;
906
22.4k
      Check(&result, AddThumbPredicate(ud, MI));
907
22.4k
      return result;
908
22.4k
    }
909
23.0k
  }
910
911
16.5k
  MCInst_clear(MI);
912
16.5k
  NEONCryptoInsn = insn32;
913
16.5k
  NEONCryptoInsn &= 0xF0FFFFFF; // Clear bits 27-24
914
16.5k
  NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
915
16.5k
  NEONCryptoInsn |= 0x12000000; // Set bits 28 and 25
916
16.5k
  result = decodeInstruction_4(DecoderTablev8Crypto32, MI, NEONCryptoInsn, Address);
917
16.5k
  if (result != MCDisassembler_Fail) {
918
395
    *Size = 4;
919
395
    return result;
920
395
  }
921
922
16.2k
  MCInst_clear(MI);
923
16.2k
  NEONv8Insn = insn32;
924
16.2k
  NEONv8Insn &= 0xF3FFFFFF; // Clear bits 27-26
925
16.2k
  result = decodeInstruction_4(DecoderTablev8NEON32, MI, NEONv8Insn, Address);
926
16.2k
  if (result != MCDisassembler_Fail) {
927
850
    *Size = 4;
928
850
    return result;
929
850
  }
930
931
15.3k
  MCInst_clear(MI);
932
15.3k
  result = decodeInstruction_4(DecoderTableThumb2CoProc32, MI, insn32, Address);
933
15.3k
  if (result != MCDisassembler_Fail) {
934
14.5k
    *Size = 4;
935
14.5k
    Check(&result, AddThumbPredicate(ud, MI));
936
14.5k
    return result;
937
14.5k
  }
938
939
767
  MCInst_clear(MI);
940
767
  *Size = 0;
941
942
767
  return MCDisassembler_Fail;
943
15.3k
}
944
945
bool Thumb_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr,
946
    uint16_t *size, uint64_t address, void *info)
947
502k
{
948
502k
  DecodeStatus status = _Thumb_getInstruction((cs_struct *)ud, instr, code, code_len, size, address);
949
950
  // TODO: fix table gen to eliminate these special cases
951
502k
  if (instr->Opcode == ARM_t__brkdiv0)
952
2
    return false;
953
954
  //return status == MCDisassembler_Success;
955
502k
  return status != MCDisassembler_Fail;
956
502k
}
957
958
bool ARM_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr,
959
    uint16_t *size, uint64_t address, void *info)
960
162k
{
961
162k
  DecodeStatus status = _ARM_getInstruction((cs_struct *)ud, instr, code, code_len, size, address);
962
963
  //return status == MCDisassembler_Success;
964
162k
  return status != MCDisassembler_Fail;
965
162k
}
966
967
static const uint16_t GPRDecoderTable[] = {
968
  ARM_R0, ARM_R1, ARM_R2, ARM_R3,
969
  ARM_R4, ARM_R5, ARM_R6, ARM_R7,
970
  ARM_R8, ARM_R9, ARM_R10, ARM_R11,
971
  ARM_R12, ARM_SP, ARM_LR, ARM_PC
972
};
973
974
static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo,
975
    uint64_t Address, const void *Decoder)
976
3.07M
{
977
3.07M
  unsigned Register;
978
979
3.07M
  if (RegNo > 15)
980
16
    return MCDisassembler_Fail;
981
982
3.07M
  Register = GPRDecoderTable[RegNo];
983
3.07M
  MCOperand_CreateReg0(Inst, Register);
984
985
3.07M
  return MCDisassembler_Success;
986
3.07M
}
987
988
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, unsigned RegNo,
989
    uint64_t Address, const void *Decoder)
990
219k
{
991
219k
  DecodeStatus S = MCDisassembler_Success;
992
993
219k
  if (RegNo == 15) 
994
58.6k
    S = MCDisassembler_SoftFail;
995
996
219k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
997
998
219k
  return S;
999
219k
}
1000
1001
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, unsigned RegNo,
1002
    uint64_t Address, const void *Decoder)
1003
7.82k
{
1004
7.82k
  DecodeStatus S = MCDisassembler_Success;
1005
1006
7.82k
  if (RegNo == 15) {
1007
1.81k
    MCOperand_CreateReg0(Inst, ARM_APSR_NZCV);
1008
1009
1.81k
    return MCDisassembler_Success;
1010
1.81k
  }
1011
1012
6.01k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1013
6.01k
  return S;
1014
7.82k
}
1015
1016
static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1017
    uint64_t Address, const void *Decoder)
1018
1.46M
{
1019
1.46M
  if (RegNo > 7)
1020
0
    return MCDisassembler_Fail;
1021
1022
1.46M
  return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
1023
1.46M
}
1024
1025
static const uint16_t GPRPairDecoderTable[] = {
1026
  ARM_R0_R1, ARM_R2_R3,   ARM_R4_R5,  ARM_R6_R7,
1027
  ARM_R8_R9, ARM_R10_R11, ARM_R12_SP
1028
};
1029
1030
static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo,
1031
    uint64_t Address, const void *Decoder)
1032
1.87k
{
1033
1.87k
  unsigned RegisterPair;
1034
1.87k
  DecodeStatus S = MCDisassembler_Success;
1035
1036
1.87k
  if (RegNo > 13)
1037
4
    return MCDisassembler_Fail;
1038
1039
1.87k
  if ((RegNo & 1) || RegNo == 0xe)
1040
1.04k
    S = MCDisassembler_SoftFail;
1041
1042
1.87k
  RegisterPair = GPRPairDecoderTable[RegNo / 2];
1043
1.87k
  MCOperand_CreateReg0(Inst, RegisterPair);
1044
1045
1.87k
  return S;
1046
1.87k
}
1047
1048
static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1049
    uint64_t Address, const void *Decoder)
1050
1.59k
{
1051
1.59k
  unsigned Register = 0;
1052
1053
1.59k
  switch (RegNo) {
1054
205
    case 0:
1055
205
      Register = ARM_R0;
1056
205
      break;
1057
376
    case 1:
1058
376
      Register = ARM_R1;
1059
376
      break;
1060
294
    case 2:
1061
294
      Register = ARM_R2;
1062
294
      break;
1063
379
    case 3:
1064
379
      Register = ARM_R3;
1065
379
      break;
1066
76
    case 9:
1067
76
      Register = ARM_R9;
1068
76
      break;
1069
255
    case 12:
1070
255
      Register = ARM_R12;
1071
255
      break;
1072
9
    default:
1073
9
      return MCDisassembler_Fail;
1074
1.59k
  }
1075
1076
1.58k
  MCOperand_CreateReg0(Inst, Register);
1077
1078
1.58k
  return MCDisassembler_Success;
1079
1.59k
}
1080
1081
static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1082
    uint64_t Address, const void *Decoder)
1083
253k
{
1084
253k
  DecodeStatus S = MCDisassembler_Success;
1085
1086
253k
  if ((RegNo == 13 && !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops)) || RegNo == 15)
1087
80.5k
    S = MCDisassembler_SoftFail;
1088
1089
253k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1090
1091
253k
  return S;
1092
253k
}
1093
1094
static const uint16_t SPRDecoderTable[] = {
1095
  ARM_S0,  ARM_S1,  ARM_S2,  ARM_S3,
1096
  ARM_S4,  ARM_S5,  ARM_S6,  ARM_S7,
1097
  ARM_S8,  ARM_S9, ARM_S10, ARM_S11,
1098
  ARM_S12, ARM_S13, ARM_S14, ARM_S15,
1099
  ARM_S16, ARM_S17, ARM_S18, ARM_S19,
1100
  ARM_S20, ARM_S21, ARM_S22, ARM_S23,
1101
  ARM_S24, ARM_S25, ARM_S26, ARM_S27,
1102
  ARM_S28, ARM_S29, ARM_S30, ARM_S31
1103
};
1104
1105
static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo,
1106
    uint64_t Address, const void *Decoder)
1107
90.4k
{
1108
90.4k
  unsigned Register;
1109
1110
90.4k
  if (RegNo > 31)
1111
7
    return MCDisassembler_Fail;
1112
1113
90.4k
  Register = SPRDecoderTable[RegNo];
1114
90.4k
  MCOperand_CreateReg0(Inst, Register);
1115
1116
90.4k
  return MCDisassembler_Success;
1117
90.4k
}
1118
1119
static DecodeStatus DecodeHPRRegisterClass(MCInst *Inst, unsigned RegNo,
1120
    uint64_t Address, const void *Decoder)
1121
16.2k
{
1122
16.2k
  return DecodeSPRRegisterClass(Inst, RegNo, Address, Decoder);
1123
16.2k
}
1124
1125
static const uint16_t DPRDecoderTable[] = {
1126
  ARM_D0,  ARM_D1,  ARM_D2,  ARM_D3,
1127
  ARM_D4,  ARM_D5,  ARM_D6,  ARM_D7,
1128
  ARM_D8,  ARM_D9, ARM_D10, ARM_D11,
1129
  ARM_D12, ARM_D13, ARM_D14, ARM_D15,
1130
  ARM_D16, ARM_D17, ARM_D18, ARM_D19,
1131
  ARM_D20, ARM_D21, ARM_D22, ARM_D23,
1132
  ARM_D24, ARM_D25, ARM_D26, ARM_D27,
1133
  ARM_D28, ARM_D29, ARM_D30, ARM_D31
1134
};
1135
1136
static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo,
1137
    uint64_t Address, const void *Decoder)
1138
209k
{
1139
209k
  unsigned Register;
1140
1141
209k
  if (RegNo > 31 || (ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureD16) && RegNo > 15))
1142
20
    return MCDisassembler_Fail;
1143
1144
209k
  Register = DPRDecoderTable[RegNo];
1145
209k
  MCOperand_CreateReg0(Inst, Register);
1146
1147
209k
  return MCDisassembler_Success;
1148
209k
}
1149
1150
static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
1151
    uint64_t Address, const void *Decoder)
1152
3.08k
{
1153
3.08k
  if (RegNo > 7)
1154
0
    return MCDisassembler_Fail;
1155
1156
3.08k
  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
1157
3.08k
}
1158
1159
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst, unsigned RegNo,
1160
    uint64_t Address, const void *Decoder)
1161
3.69k
{
1162
3.69k
  if (RegNo > 15)
1163
0
    return MCDisassembler_Fail;
1164
1165
3.69k
  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
1166
3.69k
}
1167
1168
static const uint16_t QPRDecoderTable[] = {
1169
  ARM_Q0,  ARM_Q1,  ARM_Q2,  ARM_Q3,
1170
  ARM_Q4,  ARM_Q5,  ARM_Q6,  ARM_Q7,
1171
  ARM_Q8,  ARM_Q9, ARM_Q10, ARM_Q11,
1172
  ARM_Q12, ARM_Q13, ARM_Q14, ARM_Q15
1173
};
1174
1175
static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo,
1176
    uint64_t Address, const void *Decoder)
1177
76.0k
{
1178
76.0k
  unsigned Register;
1179
1180
76.0k
  if (RegNo > 31 || (RegNo & 1) != 0)
1181
3.64k
    return MCDisassembler_Fail;
1182
1183
72.3k
  RegNo >>= 1;
1184
1185
72.3k
  Register = QPRDecoderTable[RegNo];
1186
72.3k
  MCOperand_CreateReg0(Inst, Register);
1187
1188
72.3k
  return MCDisassembler_Success;
1189
76.0k
}
1190
1191
static const uint16_t DPairDecoderTable[] = {
1192
  ARM_Q0,  ARM_D1_D2,   ARM_Q1,  ARM_D3_D4,   ARM_Q2,  ARM_D5_D6,
1193
  ARM_Q3,  ARM_D7_D8,   ARM_Q4,  ARM_D9_D10,  ARM_Q5,  ARM_D11_D12,
1194
  ARM_Q6,  ARM_D13_D14, ARM_Q7,  ARM_D15_D16, ARM_Q8,  ARM_D17_D18,
1195
  ARM_Q9,  ARM_D19_D20, ARM_Q10, ARM_D21_D22, ARM_Q11, ARM_D23_D24,
1196
  ARM_Q12, ARM_D25_D26, ARM_Q13, ARM_D27_D28, ARM_Q14, ARM_D29_D30,
1197
  ARM_Q15
1198
};
1199
1200
static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo,
1201
    uint64_t Address, const void *Decoder)
1202
21.7k
{
1203
21.7k
  unsigned Register;
1204
1205
21.7k
  if (RegNo > 30)
1206
14
    return MCDisassembler_Fail;
1207
1208
21.7k
  Register = DPairDecoderTable[RegNo];
1209
21.7k
  MCOperand_CreateReg0(Inst, Register);
1210
1211
21.7k
  return MCDisassembler_Success;
1212
21.7k
}
1213
1214
static const uint16_t DPairSpacedDecoderTable[] = {
1215
  ARM_D0_D2,   ARM_D1_D3,   ARM_D2_D4,   ARM_D3_D5,
1216
  ARM_D4_D6,   ARM_D5_D7,   ARM_D6_D8,   ARM_D7_D9,
1217
  ARM_D8_D10,  ARM_D9_D11,  ARM_D10_D12, ARM_D11_D13,
1218
  ARM_D12_D14, ARM_D13_D15, ARM_D14_D16, ARM_D15_D17,
1219
  ARM_D16_D18, ARM_D17_D19, ARM_D18_D20, ARM_D19_D21,
1220
  ARM_D20_D22, ARM_D21_D23, ARM_D22_D24, ARM_D23_D25,
1221
  ARM_D24_D26, ARM_D25_D27, ARM_D26_D28, ARM_D27_D29,
1222
  ARM_D28_D30, ARM_D29_D31
1223
};
1224
1225
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst,
1226
    unsigned RegNo, uint64_t Address, const void *Decoder)
1227
12.1k
{
1228
12.1k
  unsigned Register;
1229
1230
12.1k
  if (RegNo > 29)
1231
19
    return MCDisassembler_Fail;
1232
1233
12.1k
  Register = DPairSpacedDecoderTable[RegNo];
1234
12.1k
  MCOperand_CreateReg0(Inst, Register);
1235
1236
12.1k
  return MCDisassembler_Success;
1237
12.1k
}
1238
1239
static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val,
1240
    uint64_t Address, const void *Decoder)
1241
83.9k
{
1242
83.9k
  if (Val)
1243
33.0k
    MCOperand_CreateReg0(Inst, ARM_CPSR);
1244
50.8k
  else
1245
50.8k
    MCOperand_CreateReg0(Inst, 0);
1246
1247
83.9k
  return MCDisassembler_Success;
1248
83.9k
}
1249
1250
static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Val,
1251
    uint64_t Address, const void *Decoder)
1252
31.2k
{
1253
31.2k
  DecodeStatus S = MCDisassembler_Success;
1254
31.2k
  ARM_AM_ShiftOpc Shift;
1255
31.2k
  unsigned Op;
1256
31.2k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
1257
31.2k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1258
31.2k
  unsigned imm = fieldFromInstruction_4(Val, 7, 5);
1259
1260
  // Register-immediate
1261
31.2k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
1262
0
    return MCDisassembler_Fail;
1263
1264
31.2k
  Shift = ARM_AM_lsl;
1265
31.2k
  switch (type) {
1266
9.17k
    case 0:
1267
9.17k
      Shift = ARM_AM_lsl;
1268
9.17k
      break;
1269
7.31k
    case 1:
1270
7.31k
      Shift = ARM_AM_lsr;
1271
7.31k
      break;
1272
5.70k
    case 2:
1273
5.70k
      Shift = ARM_AM_asr;
1274
5.70k
      break;
1275
9.08k
    case 3:
1276
9.08k
      Shift = ARM_AM_ror;
1277
9.08k
      break;
1278
31.2k
  }
1279
1280
31.2k
  if (Shift == ARM_AM_ror && imm == 0)
1281
1.95k
    Shift = ARM_AM_rrx;
1282
1283
31.2k
  Op = Shift | (imm << 3);
1284
31.2k
  MCOperand_CreateImm0(Inst, Op);
1285
1286
31.2k
  return S;
1287
31.2k
}
1288
1289
static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Val,
1290
    uint64_t Address, const void *Decoder)
1291
13.6k
{
1292
13.6k
  DecodeStatus S = MCDisassembler_Success;
1293
13.6k
  ARM_AM_ShiftOpc Shift;
1294
1295
13.6k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
1296
13.6k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1297
13.6k
  unsigned Rs = fieldFromInstruction_4(Val, 8, 4);
1298
1299
  // Register-register
1300
13.6k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1301
0
    return MCDisassembler_Fail;
1302
13.6k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
1303
0
    return MCDisassembler_Fail;
1304
1305
13.6k
  Shift = ARM_AM_lsl;
1306
13.6k
  switch (type) {
1307
5.00k
    case 0:
1308
5.00k
      Shift = ARM_AM_lsl;
1309
5.00k
      break;
1310
2.63k
    case 1:
1311
2.63k
      Shift = ARM_AM_lsr;
1312
2.63k
      break;
1313
2.63k
    case 2:
1314
2.63k
      Shift = ARM_AM_asr;
1315
2.63k
      break;
1316
3.40k
    case 3:
1317
3.40k
      Shift = ARM_AM_ror;
1318
3.40k
      break;
1319
13.6k
  }
1320
1321
13.6k
  MCOperand_CreateImm0(Inst, Shift);
1322
1323
13.6k
  return S;
1324
13.6k
}
1325
1326
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val,
1327
    uint64_t Address, const void *Decoder)
1328
20.9k
{
1329
20.9k
  unsigned i;
1330
20.9k
  DecodeStatus S = MCDisassembler_Success;
1331
20.9k
  unsigned opcode;
1332
20.9k
  bool NeedDisjointWriteback = false;
1333
20.9k
  unsigned WritebackReg = 0;
1334
1335
20.9k
  opcode = MCInst_getOpcode(Inst);
1336
20.9k
  switch (opcode) {
1337
18.2k
    default:
1338
18.2k
      break;
1339
1340
18.2k
    case ARM_LDMIA_UPD:
1341
813
    case ARM_LDMDB_UPD:
1342
1.12k
    case ARM_LDMIB_UPD:
1343
1.44k
    case ARM_LDMDA_UPD:
1344
1.89k
    case ARM_t2LDMIA_UPD:
1345
2.13k
    case ARM_t2LDMDB_UPD:
1346
2.19k
    case ARM_t2STMIA_UPD:
1347
2.67k
    case ARM_t2STMDB_UPD:
1348
2.67k
      NeedDisjointWriteback = true;
1349
2.67k
      WritebackReg = MCOperand_getReg(MCInst_getOperand(Inst, 0));
1350
2.67k
      break;
1351
20.9k
  }
1352
1353
  // Empty register lists are not allowed.
1354
20.9k
  if (Val == 0) return MCDisassembler_Fail;
1355
1356
354k
  for (i = 0; i < 16; ++i) {
1357
333k
    if (Val & (1 << i)) {
1358
113k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, i, Address, Decoder)))
1359
0
        return MCDisassembler_Fail;
1360
1361
      // Writeback not allowed if Rn is in the target list.
1362
113k
      if (NeedDisjointWriteback && WritebackReg == MCOperand_getReg(&(Inst->Operands[Inst->size - 1])))
1363
838
        Check(&S, MCDisassembler_SoftFail);
1364
113k
    }
1365
333k
  }
1366
1367
20.8k
  return S;
1368
20.8k
}
1369
1370
static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val,
1371
    uint64_t Address, const void *Decoder)
1372
3.61k
{
1373
3.61k
  DecodeStatus S = MCDisassembler_Success;
1374
3.61k
  unsigned i;
1375
3.61k
  unsigned Vd = fieldFromInstruction_4(Val, 8, 5);
1376
3.61k
  unsigned regs = fieldFromInstruction_4(Val, 0, 8);
1377
1378
  // In case of unpredictable encoding, tweak the operands.
1379
3.61k
  if (regs == 0 || (Vd + regs) > 32) {
1380
2.24k
    regs = Vd + regs > 32 ? 32 - Vd : regs;
1381
2.24k
    regs = (1u > regs? 1u : regs);
1382
2.24k
    S = MCDisassembler_SoftFail;
1383
2.24k
  }
1384
1385
3.61k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
1386
0
    return MCDisassembler_Fail;
1387
1388
40.7k
  for (i = 0; i < (regs - 1); ++i) {
1389
37.1k
    if (!Check(&S, DecodeSPRRegisterClass(Inst, ++Vd, Address, Decoder)))
1390
0
      return MCDisassembler_Fail;
1391
37.1k
  }
1392
1393
3.61k
  return S;
1394
3.61k
}
1395
1396
static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val,
1397
    uint64_t Address, const void *Decoder)
1398
2.91k
{
1399
2.91k
  DecodeStatus S = MCDisassembler_Success;
1400
2.91k
  unsigned i;
1401
2.91k
  unsigned Vd = fieldFromInstruction_4(Val, 8, 5);
1402
2.91k
  unsigned regs = fieldFromInstruction_4(Val, 1, 7);
1403
1404
  // In case of unpredictable encoding, tweak the operands.
1405
2.91k
  if (regs == 0 || regs > 16 || (Vd + regs) > 32) {
1406
2.03k
    regs = Vd + regs > 32 ? 32 - Vd : regs;
1407
2.03k
    regs = (1u > regs? 1u : regs);
1408
2.03k
    regs = (16u > regs? regs : 16u);
1409
2.03k
    S = MCDisassembler_SoftFail;
1410
2.03k
  }
1411
1412
2.91k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
1413
0
    return MCDisassembler_Fail;
1414
1415
36.6k
  for (i = 0; i < (regs - 1); ++i) {
1416
33.7k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, ++Vd, Address, Decoder)))
1417
0
      return MCDisassembler_Fail;
1418
33.7k
  }
1419
1420
2.91k
  return S;
1421
2.91k
}
1422
1423
static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Val,
1424
    uint64_t Address, const void *Decoder)
1425
3.96k
{
1426
  // This operand encodes a mask of contiguous zeros between a specified MSB
1427
  // and LSB.  To decode it, we create the mask of all bits MSB-and-lower,
1428
  // the mask of all bits LSB-and-lower, and then xor them to create
1429
  // the mask of that's all ones on [msb, lsb].  Finally we not it to
1430
  // create the final mask.
1431
3.96k
  unsigned msb = fieldFromInstruction_4(Val, 5, 5);
1432
3.96k
  unsigned lsb = fieldFromInstruction_4(Val, 0, 5);
1433
3.96k
  uint32_t lsb_mask, msb_mask;
1434
1435
3.96k
  DecodeStatus S = MCDisassembler_Success;
1436
3.96k
  if (lsb > msb) {
1437
1.96k
    Check(&S, MCDisassembler_SoftFail);
1438
    // The check above will cause the warning for the "potentially undefined
1439
    // instruction encoding" but we can't build a bad MCOperand value here
1440
    // with a lsb > msb or else printing the MCInst will cause a crash.
1441
1.96k
    lsb = msb;
1442
1.96k
  }
1443
1444
3.96k
  msb_mask = 0xFFFFFFFF;
1445
3.96k
  if (msb != 31) msb_mask = (1U << (msb + 1)) - 1;
1446
3.96k
  lsb_mask = (1U << lsb) - 1;
1447
1448
3.96k
  MCOperand_CreateImm0(Inst, ~(msb_mask ^ lsb_mask));
1449
3.96k
  return S;
1450
3.96k
}
1451
1452
static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn,
1453
    uint64_t Address, const void *Decoder)
1454
21.1k
{
1455
21.1k
  DecodeStatus S = MCDisassembler_Success;
1456
1457
21.1k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1458
21.1k
  unsigned CRd = fieldFromInstruction_4(Insn, 12, 4);
1459
21.1k
  unsigned coproc = fieldFromInstruction_4(Insn, 8, 4);
1460
21.1k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
1461
21.1k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1462
21.1k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
1463
1464
21.1k
  switch (MCInst_getOpcode(Inst)) {
1465
338
    case ARM_LDC_OFFSET:
1466
710
    case ARM_LDC_PRE:
1467
1.23k
    case ARM_LDC_POST:
1468
1.59k
    case ARM_LDC_OPTION:
1469
2.02k
    case ARM_LDCL_OFFSET:
1470
2.58k
    case ARM_LDCL_PRE:
1471
2.98k
    case ARM_LDCL_POST:
1472
3.29k
    case ARM_LDCL_OPTION:
1473
3.99k
    case ARM_STC_OFFSET:
1474
4.35k
    case ARM_STC_PRE:
1475
4.67k
    case ARM_STC_POST:
1476
5.16k
    case ARM_STC_OPTION:
1477
5.75k
    case ARM_STCL_OFFSET:
1478
6.28k
    case ARM_STCL_PRE:
1479
6.71k
    case ARM_STCL_POST:
1480
6.95k
    case ARM_STCL_OPTION:
1481
7.17k
    case ARM_t2LDC_OFFSET:
1482
7.51k
    case ARM_t2LDC_PRE:
1483
7.80k
    case ARM_t2LDC_POST:
1484
8.13k
    case ARM_t2LDC_OPTION:
1485
8.37k
    case ARM_t2LDCL_OFFSET:
1486
8.60k
    case ARM_t2LDCL_PRE:
1487
8.91k
    case ARM_t2LDCL_POST:
1488
9.10k
    case ARM_t2LDCL_OPTION:
1489
9.50k
    case ARM_t2STC_OFFSET:
1490
10.2k
    case ARM_t2STC_PRE:
1491
10.4k
    case ARM_t2STC_POST:
1492
10.7k
    case ARM_t2STC_OPTION:
1493
10.9k
    case ARM_t2STCL_OFFSET:
1494
11.4k
    case ARM_t2STCL_PRE:
1495
11.8k
    case ARM_t2STCL_POST:
1496
12.1k
    case ARM_t2STCL_OPTION:
1497
12.1k
      if (coproc == 0xA || coproc == 0xB)
1498
10
        return MCDisassembler_Fail;
1499
12.0k
      break;
1500
12.0k
    default:
1501
9.03k
      break;
1502
21.1k
  }
1503
1504
21.1k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops) && (coproc != 14))
1505
33
    return MCDisassembler_Fail;
1506
1507
21.0k
  MCOperand_CreateImm0(Inst, coproc);
1508
21.0k
  MCOperand_CreateImm0(Inst, CRd);
1509
21.0k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1510
0
    return MCDisassembler_Fail;
1511
1512
21.0k
  switch (MCInst_getOpcode(Inst)) {
1513
310
    case ARM_t2LDC2_OFFSET:
1514
554
    case ARM_t2LDC2L_OFFSET:
1515
831
    case ARM_t2LDC2_PRE:
1516
1.54k
    case ARM_t2LDC2L_PRE:
1517
1.92k
    case ARM_t2STC2_OFFSET:
1518
2.20k
    case ARM_t2STC2L_OFFSET:
1519
2.44k
    case ARM_t2STC2_PRE:
1520
2.84k
    case ARM_t2STC2L_PRE:
1521
3.14k
    case ARM_LDC2_OFFSET:
1522
3.35k
    case ARM_LDC2L_OFFSET:
1523
3.90k
    case ARM_LDC2_PRE:
1524
4.38k
    case ARM_LDC2L_PRE:
1525
4.73k
    case ARM_STC2_OFFSET:
1526
4.94k
    case ARM_STC2L_OFFSET:
1527
5.19k
    case ARM_STC2_PRE:
1528
5.40k
    case ARM_STC2L_PRE:
1529
5.62k
    case ARM_t2LDC_OFFSET:
1530
5.86k
    case ARM_t2LDCL_OFFSET:
1531
6.20k
    case ARM_t2LDC_PRE:
1532
6.43k
    case ARM_t2LDCL_PRE:
1533
6.83k
    case ARM_t2STC_OFFSET:
1534
7.04k
    case ARM_t2STCL_OFFSET:
1535
7.79k
    case ARM_t2STC_PRE:
1536
8.22k
    case ARM_t2STCL_PRE:
1537
8.56k
    case ARM_LDC_OFFSET:
1538
8.99k
    case ARM_LDCL_OFFSET:
1539
9.36k
    case ARM_LDC_PRE:
1540
9.91k
    case ARM_LDCL_PRE:
1541
10.6k
    case ARM_STC_OFFSET:
1542
11.2k
    case ARM_STCL_OFFSET:
1543
11.5k
    case ARM_STC_PRE:
1544
12.0k
    case ARM_STCL_PRE:
1545
12.0k
      imm = ARM_AM_getAM5Opc(U ? ARM_AM_add : ARM_AM_sub, (unsigned char)imm);
1546
12.0k
      MCOperand_CreateImm0(Inst, imm);
1547
12.0k
      break;
1548
299
    case ARM_t2LDC2_POST:
1549
601
    case ARM_t2LDC2L_POST:
1550
1.11k
    case ARM_t2STC2_POST:
1551
1.48k
    case ARM_t2STC2L_POST:
1552
1.72k
    case ARM_LDC2_POST:
1553
2.14k
    case ARM_LDC2L_POST:
1554
2.38k
    case ARM_STC2_POST:
1555
2.77k
    case ARM_STC2L_POST:
1556
3.07k
    case ARM_t2LDC_POST:
1557
3.37k
    case ARM_t2LDCL_POST:
1558
3.60k
    case ARM_t2STC_POST:
1559
4.04k
    case ARM_t2STCL_POST:
1560
4.56k
    case ARM_LDC_POST:
1561
4.95k
    case ARM_LDCL_POST:
1562
5.27k
    case ARM_STC_POST:
1563
5.69k
    case ARM_STCL_POST:
1564
5.69k
      imm |= U << 8;
1565
      // fall through.
1566
9.00k
    default:
1567
      // The 'option' variant doesn't encode 'U' in the immediate since
1568
      // the immediate is unsigned [0,255].
1569
9.00k
      MCOperand_CreateImm0(Inst, imm);
1570
9.00k
      break;
1571
21.0k
  }
1572
1573
21.0k
  switch (MCInst_getOpcode(Inst)) {
1574
338
    case ARM_LDC_OFFSET:
1575
709
    case ARM_LDC_PRE:
1576
1.23k
    case ARM_LDC_POST:
1577
1.58k
    case ARM_LDC_OPTION:
1578
2.02k
    case ARM_LDCL_OFFSET:
1579
2.57k
    case ARM_LDCL_PRE:
1580
2.96k
    case ARM_LDCL_POST:
1581
3.27k
    case ARM_LDCL_OPTION:
1582
3.98k
    case ARM_STC_OFFSET:
1583
4.33k
    case ARM_STC_PRE:
1584
4.65k
    case ARM_STC_POST:
1585
5.14k
    case ARM_STC_OPTION:
1586
5.72k
    case ARM_STCL_OFFSET:
1587
6.26k
    case ARM_STCL_PRE:
1588
6.68k
    case ARM_STCL_POST:
1589
6.92k
    case ARM_STCL_OPTION:
1590
6.92k
      if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1591
2
        return MCDisassembler_Fail;
1592
6.92k
      break;
1593
14.1k
    default:
1594
14.1k
      break;
1595
21.0k
  }
1596
1597
21.0k
  return S;
1598
21.0k
}
1599
1600
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, unsigned Insn,
1601
    uint64_t Address, const void *Decoder)
1602
22.1k
{
1603
22.1k
  DecodeStatus S = MCDisassembler_Success;
1604
22.1k
  ARM_AM_AddrOpc Op;
1605
22.1k
  ARM_AM_ShiftOpc Opc;
1606
22.1k
  bool writeback;
1607
22.1k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1608
22.1k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
1609
22.1k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
1610
22.1k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
1611
22.1k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1612
22.1k
  unsigned reg = fieldFromInstruction_4(Insn, 25, 1);
1613
22.1k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
1614
22.1k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
1615
22.1k
  unsigned idx_mode = 0, amt, tmp;
1616
1617
  // On stores, the writeback operand precedes Rt.
1618
22.1k
  switch (MCInst_getOpcode(Inst)) {
1619
2.80k
    case ARM_STR_POST_IMM:
1620
4.38k
    case ARM_STR_POST_REG:
1621
6.26k
    case ARM_STRB_POST_IMM:
1622
7.14k
    case ARM_STRB_POST_REG:
1623
8.57k
    case ARM_STRT_POST_REG:
1624
10.0k
    case ARM_STRT_POST_IMM:
1625
11.0k
    case ARM_STRBT_POST_REG:
1626
14.6k
    case ARM_STRBT_POST_IMM:
1627
14.6k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1628
0
        return MCDisassembler_Fail;
1629
14.6k
      break;
1630
14.6k
    default:
1631
7.46k
      break;
1632
22.1k
  }
1633
1634
22.1k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1635
0
    return MCDisassembler_Fail;
1636
1637
  // On loads, the writeback operand comes after Rt.
1638
22.1k
  switch (MCInst_getOpcode(Inst)) {
1639
1.96k
    case ARM_LDR_POST_IMM:
1640
2.31k
    case ARM_LDR_POST_REG:
1641
3.42k
    case ARM_LDRB_POST_IMM:
1642
3.77k
    case ARM_LDRB_POST_REG:
1643
4.54k
    case ARM_LDRBT_POST_REG:
1644
6.08k
    case ARM_LDRBT_POST_IMM:
1645
6.55k
    case ARM_LDRT_POST_REG:
1646
7.46k
    case ARM_LDRT_POST_IMM:
1647
7.46k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1648
0
        return MCDisassembler_Fail;
1649
7.46k
      break;
1650
14.6k
    default:
1651
14.6k
      break;
1652
22.1k
  }
1653
1654
22.1k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1655
0
    return MCDisassembler_Fail;
1656
1657
22.1k
  Op = ARM_AM_add;
1658
22.1k
  if (!fieldFromInstruction_4(Insn, 23, 1))
1659
11.1k
    Op = ARM_AM_sub;
1660
1661
22.1k
  writeback = (P == 0) || (W == 1);
1662
22.1k
  if (P && writeback)
1663
0
    idx_mode = ARMII_IndexModePre;
1664
22.1k
  else if (!P && writeback)
1665
22.1k
    idx_mode = ARMII_IndexModePost;
1666
1667
22.1k
  if (writeback && (Rn == 15 || Rn == Rt))
1668
3.83k
    S = MCDisassembler_SoftFail; // UNPREDICTABLE
1669
1670
22.1k
  if (reg) {
1671
6.83k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1672
0
      return MCDisassembler_Fail;
1673
1674
6.83k
    Opc = ARM_AM_lsl;
1675
6.83k
    switch(fieldFromInstruction_4(Insn, 5, 2)) {
1676
2.05k
      case 0:
1677
2.05k
        Opc = ARM_AM_lsl;
1678
2.05k
        break;
1679
1.66k
      case 1:
1680
1.66k
        Opc = ARM_AM_lsr;
1681
1.66k
        break;
1682
1.12k
      case 2:
1683
1.12k
        Opc = ARM_AM_asr;
1684
1.12k
        break;
1685
1.98k
      case 3:
1686
1.98k
        Opc = ARM_AM_ror;
1687
1.98k
        break;
1688
0
      default:
1689
0
        return MCDisassembler_Fail;
1690
6.83k
    }
1691
1692
6.83k
    amt = fieldFromInstruction_4(Insn, 7, 5);
1693
6.83k
    if (Opc == ARM_AM_ror && amt == 0)
1694
438
      Opc = ARM_AM_rrx;
1695
1696
6.83k
    imm = ARM_AM_getAM2Opc(Op, amt, Opc, idx_mode);
1697
1698
6.83k
    MCOperand_CreateImm0(Inst, imm);
1699
15.3k
  } else {
1700
15.3k
    MCOperand_CreateReg0(Inst, 0);
1701
15.3k
    tmp = ARM_AM_getAM2Opc(Op, imm, ARM_AM_lsl, idx_mode);
1702
15.3k
    MCOperand_CreateImm0(Inst, tmp);
1703
15.3k
  }
1704
1705
22.1k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1706
4.24k
    return MCDisassembler_Fail;
1707
1708
17.8k
  return S;
1709
22.1k
}
1710
1711
static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Val,
1712
    uint64_t Address, const void *Decoder)
1713
13.8k
{
1714
13.8k
  DecodeStatus S = MCDisassembler_Success;
1715
13.8k
  ARM_AM_ShiftOpc ShOp;
1716
13.8k
  unsigned shift;
1717
13.8k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
1718
13.8k
  unsigned Rm = fieldFromInstruction_4(Val,  0, 4);
1719
13.8k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1720
13.8k
  unsigned imm = fieldFromInstruction_4(Val, 7, 5);
1721
13.8k
  unsigned U = fieldFromInstruction_4(Val, 12, 1);
1722
1723
13.8k
  ShOp = ARM_AM_lsl;
1724
13.8k
  switch (type) {
1725
4.29k
    case 0:
1726
4.29k
      ShOp = ARM_AM_lsl;
1727
4.29k
      break;
1728
3.37k
    case 1:
1729
3.37k
      ShOp = ARM_AM_lsr;
1730
3.37k
      break;
1731
2.70k
    case 2:
1732
2.70k
      ShOp = ARM_AM_asr;
1733
2.70k
      break;
1734
3.44k
    case 3:
1735
3.44k
      ShOp = ARM_AM_ror;
1736
3.44k
      break;
1737
13.8k
  }
1738
1739
13.8k
  if (ShOp == ARM_AM_ror && imm == 0)
1740
644
    ShOp = ARM_AM_rrx;
1741
1742
13.8k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1743
0
    return MCDisassembler_Fail;
1744
1745
13.8k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1746
0
    return MCDisassembler_Fail;
1747
1748
13.8k
  if (U)
1749
7.41k
    shift = ARM_AM_getAM2Opc(ARM_AM_add, imm, ShOp, 0);
1750
6.39k
  else
1751
6.39k
    shift = ARM_AM_getAM2Opc(ARM_AM_sub, imm, ShOp, 0);
1752
1753
13.8k
  MCOperand_CreateImm0(Inst, shift);
1754
1755
13.8k
  return S;
1756
13.8k
}
1757
1758
static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn,
1759
    uint64_t Address, const void *Decoder)
1760
23.0k
{
1761
23.0k
  DecodeStatus S = MCDisassembler_Success;
1762
1763
23.0k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
1764
23.0k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1765
23.0k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
1766
23.0k
  unsigned type = fieldFromInstruction_4(Insn, 22, 1);
1767
23.0k
  unsigned imm = fieldFromInstruction_4(Insn, 8, 4);
1768
23.0k
  unsigned U = ((~fieldFromInstruction_4(Insn, 23, 1)) & 1) << 8;
1769
23.0k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1770
23.0k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
1771
23.0k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
1772
23.0k
  unsigned Rt2 = Rt + 1;
1773
1774
23.0k
  bool writeback = (W == 1) | (P == 0);
1775
1776
  // For {LD,ST}RD, Rt must be even, else undefined.
1777
23.0k
  switch (MCInst_getOpcode(Inst)) {
1778
1.08k
    case ARM_STRD:
1779
1.78k
    case ARM_STRD_PRE:
1780
5.08k
    case ARM_STRD_POST:
1781
6.36k
    case ARM_LDRD:
1782
7.07k
    case ARM_LDRD_PRE:
1783
9.24k
    case ARM_LDRD_POST:
1784
9.24k
      if (Rt & 0x1)
1785
3.02k
        S = MCDisassembler_SoftFail;
1786
9.24k
      break;
1787
13.8k
    default:
1788
13.8k
      break;
1789
23.0k
  }
1790
1791
23.0k
  switch (MCInst_getOpcode(Inst)) {
1792
1.08k
    case ARM_STRD:
1793
1.78k
    case ARM_STRD_PRE:
1794
5.08k
    case ARM_STRD_POST:
1795
5.08k
      if (P == 0 && W == 1)
1796
0
        S = MCDisassembler_SoftFail;
1797
1798
5.08k
      if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1799
1.69k
        S = MCDisassembler_SoftFail;
1800
1801
5.08k
      if (type && Rm == 15)
1802
446
        S = MCDisassembler_SoftFail;
1803
1804
5.08k
      if (Rt2 == 15)
1805
860
        S = MCDisassembler_SoftFail;
1806
1807
5.08k
      if (!type && fieldFromInstruction_4(Insn, 8, 4))
1808
2.76k
        S = MCDisassembler_SoftFail;
1809
1810
5.08k
      break;
1811
1812
691
    case ARM_STRH:
1813
1.05k
    case ARM_STRH_PRE:
1814
3.07k
    case ARM_STRH_POST:
1815
3.07k
      if (Rt == 15)
1816
219
        S = MCDisassembler_SoftFail;
1817
1818
3.07k
      if (writeback && (Rn == 15 || Rn == Rt))
1819
1.04k
        S = MCDisassembler_SoftFail;
1820
1821
3.07k
      if (!type && Rm == 15)
1822
355
        S = MCDisassembler_SoftFail;
1823
1824
3.07k
      break;
1825
1826
1.28k
    case ARM_LDRD:
1827
1.99k
    case ARM_LDRD_PRE:
1828
4.16k
    case ARM_LDRD_POST:
1829
4.16k
      if (type && Rn == 15) {
1830
439
        if (Rt2 == 15)
1831
134
          S = MCDisassembler_SoftFail;
1832
439
        break;
1833
439
      }
1834
1835
3.72k
      if (P == 0 && W == 1)
1836
0
        S = MCDisassembler_SoftFail;
1837
1838
3.72k
      if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
1839
1.09k
        S = MCDisassembler_SoftFail;
1840
1841
3.72k
      if (!type && writeback && Rn == 15)
1842
483
        S = MCDisassembler_SoftFail;
1843
1844
3.72k
      if (writeback && (Rn == Rt || Rn == Rt2))
1845
714
        S = MCDisassembler_SoftFail;
1846
1847
3.72k
      break;
1848
1849
790
    case ARM_LDRH:
1850
2.01k
    case ARM_LDRH_PRE:
1851
3.58k
    case ARM_LDRH_POST:
1852
3.58k
      if (type && Rn == 15) {
1853
786
        if (Rt == 15)
1854
624
          S = MCDisassembler_SoftFail;
1855
786
        break;
1856
786
      }
1857
1858
2.79k
      if (Rt == 15)
1859
397
        S = MCDisassembler_SoftFail;
1860
1861
2.79k
      if (!type && Rm == 15)
1862
605
        S = MCDisassembler_SoftFail;
1863
1864
2.79k
      if (!type && writeback && (Rn == 15 || Rn == Rt))
1865
656
        S = MCDisassembler_SoftFail;
1866
2.79k
      break;
1867
1868
1.33k
    case ARM_LDRSH:
1869
2.30k
    case ARM_LDRSH_PRE:
1870
3.63k
    case ARM_LDRSH_POST:
1871
5.14k
    case ARM_LDRSB:
1872
5.70k
    case ARM_LDRSB_PRE:
1873
7.20k
    case ARM_LDRSB_POST:
1874
7.20k
      if (type && Rn == 15){
1875
974
        if (Rt == 15)
1876
512
          S = MCDisassembler_SoftFail;
1877
974
        break;
1878
974
      }
1879
1880
6.23k
      if (type && (Rt == 15 || (writeback && Rn == Rt)))
1881
668
        S = MCDisassembler_SoftFail;
1882
1883
6.23k
      if (!type && (Rt == 15 || Rm == 15))
1884
1.17k
        S = MCDisassembler_SoftFail;
1885
1886
6.23k
      if (!type && writeback && (Rn == 15 || Rn == Rt))
1887
515
        S = MCDisassembler_SoftFail;
1888
1889
6.23k
      break;
1890
1891
0
    default:
1892
0
      break;
1893
23.0k
  }
1894
1895
23.0k
  if (writeback) { // Writeback
1896
16.3k
    Inst->writeback = true;
1897
1898
16.3k
    if (P)
1899
4.53k
      U |= ARMII_IndexModePre << 9;
1900
11.8k
    else
1901
11.8k
      U |= ARMII_IndexModePost << 9;
1902
1903
    // On stores, the writeback operand precedes Rt.
1904
16.3k
    switch (MCInst_getOpcode(Inst)) {
1905
0
      case ARM_STRD:
1906
701
      case ARM_STRD_PRE:
1907
3.99k
      case ARM_STRD_POST:
1908
3.99k
      case ARM_STRH:
1909
4.36k
      case ARM_STRH_PRE:
1910
6.37k
      case ARM_STRH_POST:
1911
6.37k
        if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1912
0
          return MCDisassembler_Fail;
1913
6.37k
        break;
1914
10.0k
      default:
1915
10.0k
        break;
1916
16.3k
    }
1917
16.3k
  }
1918
1919
23.0k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1920
0
    return MCDisassembler_Fail;
1921
1922
23.0k
  switch (MCInst_getOpcode(Inst)) {
1923
1.08k
    case ARM_STRD:
1924
1.78k
    case ARM_STRD_PRE:
1925
5.08k
    case ARM_STRD_POST:
1926
6.36k
    case ARM_LDRD:
1927
7.07k
    case ARM_LDRD_PRE:
1928
9.24k
    case ARM_LDRD_POST:
1929
9.24k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt + 1, Address, Decoder)))
1930
16
        return MCDisassembler_Fail;
1931
9.22k
      break;
1932
13.8k
    default:
1933
13.8k
      break;
1934
23.0k
  }
1935
1936
23.0k
  if (writeback) {
1937
    // On loads, the writeback operand comes after Rt.
1938
16.3k
    switch (MCInst_getOpcode(Inst)) {
1939
0
      case ARM_LDRD:
1940
714
      case ARM_LDRD_PRE:
1941
2.87k
      case ARM_LDRD_POST:
1942
2.87k
      case ARM_LDRH:
1943
4.10k
      case ARM_LDRH_PRE:
1944
5.66k
      case ARM_LDRH_POST:
1945
5.66k
      case ARM_LDRSH:
1946
6.64k
      case ARM_LDRSH_PRE:
1947
7.96k
      case ARM_LDRSH_POST:
1948
7.96k
      case ARM_LDRSB:
1949
8.52k
      case ARM_LDRSB_PRE:
1950
10.0k
      case ARM_LDRSB_POST:
1951
10.0k
      case ARM_LDRHTr:
1952
10.0k
      case ARM_LDRSBTr:
1953
10.0k
        if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1954
0
          return MCDisassembler_Fail;
1955
10.0k
        break;
1956
10.0k
      default:
1957
6.36k
        break;
1958
16.3k
    }
1959
16.3k
  }
1960
1961
23.0k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1962
0
    return MCDisassembler_Fail;
1963
1964
23.0k
  if (type) {
1965
9.82k
    MCOperand_CreateReg0(Inst, 0);
1966
9.82k
    MCOperand_CreateImm0(Inst, U | (imm << 4) | Rm);
1967
13.2k
  } else {
1968
13.2k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1969
0
      return MCDisassembler_Fail;
1970
1971
13.2k
    MCOperand_CreateImm0(Inst, U);
1972
13.2k
  }
1973
1974
23.0k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1975
22
    return MCDisassembler_Fail;
1976
1977
23.0k
  return S;
1978
23.0k
}
1979
1980
static DecodeStatus DecodeRFEInstruction(MCInst *Inst, unsigned Insn,
1981
    uint64_t Address, const void *Decoder)
1982
1.02k
{
1983
1.02k
  DecodeStatus S = MCDisassembler_Success;
1984
1985
1.02k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1986
1.02k
  unsigned mode = fieldFromInstruction_4(Insn, 23, 2);
1987
1988
1.02k
  switch (mode) {
1989
310
    case 0:
1990
310
      mode = ARM_AM_da;
1991
310
      break;
1992
269
    case 1:
1993
269
      mode = ARM_AM_ia;
1994
269
      break;
1995
145
    case 2:
1996
145
      mode = ARM_AM_db;
1997
145
      break;
1998
304
    case 3:
1999
304
      mode = ARM_AM_ib;
2000
304
      break;
2001
1.02k
  }
2002
2003
1.02k
  MCOperand_CreateImm0(Inst, mode);
2004
2005
1.02k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2006
0
    return MCDisassembler_Fail;
2007
2008
1.02k
  return S;
2009
1.02k
}
2010
2011
static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn,
2012
    uint64_t Address, const void *Decoder)
2013
1.38k
{
2014
1.38k
  DecodeStatus S = MCDisassembler_Success;
2015
2016
1.38k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2017
1.38k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2018
1.38k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2019
1.38k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2020
2021
1.38k
  if (pred == 0xF)
2022
378
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
2023
2024
1.00k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2025
0
    return MCDisassembler_Fail;
2026
2027
1.00k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2028
0
    return MCDisassembler_Fail;
2029
2030
1.00k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2031
0
    return MCDisassembler_Fail;
2032
2033
1.00k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2034
0
    return MCDisassembler_Fail;
2035
2036
1.00k
  return S;
2037
1.00k
}
2038
2039
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst *Inst,
2040
    unsigned Insn, uint64_t Address, const void *Decoder)
2041
10.6k
{
2042
10.6k
  DecodeStatus S = MCDisassembler_Success;
2043
2044
10.6k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2045
10.6k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2046
10.6k
  unsigned reglist = fieldFromInstruction_4(Insn, 0, 16);
2047
2048
10.6k
  if (pred == 0xF) {
2049
    // Ambiguous with RFE and SRS
2050
1.06k
    switch (MCInst_getOpcode(Inst)) {
2051
0
      case ARM_LDMDA:
2052
0
        MCInst_setOpcode(Inst, ARM_RFEDA);
2053
0
        break;
2054
310
      case ARM_LDMDA_UPD:
2055
310
        MCInst_setOpcode(Inst, ARM_RFEDA_UPD);
2056
310
        break;
2057
0
      case ARM_LDMDB:
2058
0
        MCInst_setOpcode(Inst, ARM_RFEDB);
2059
0
        break;
2060
145
      case ARM_LDMDB_UPD:
2061
145
        MCInst_setOpcode(Inst, ARM_RFEDB_UPD);
2062
145
        break;
2063
0
      case ARM_LDMIA:
2064
0
        MCInst_setOpcode(Inst, ARM_RFEIA);
2065
0
        break;
2066
269
      case ARM_LDMIA_UPD:
2067
269
        MCInst_setOpcode(Inst, ARM_RFEIA_UPD);
2068
269
        break;
2069
0
      case ARM_LDMIB:
2070
0
        MCInst_setOpcode(Inst, ARM_RFEIB);
2071
0
        break;
2072
304
      case ARM_LDMIB_UPD:
2073
304
        MCInst_setOpcode(Inst, ARM_RFEIB_UPD);
2074
304
        break;
2075
0
      case ARM_STMDA:
2076
0
        MCInst_setOpcode(Inst, ARM_SRSDA);
2077
0
        break;
2078
5
      case ARM_STMDA_UPD:
2079
5
        MCInst_setOpcode(Inst, ARM_SRSDA_UPD);
2080
5
        break;
2081
0
      case ARM_STMDB:
2082
0
        MCInst_setOpcode(Inst, ARM_SRSDB);
2083
0
        break;
2084
5
      case ARM_STMDB_UPD:
2085
5
        MCInst_setOpcode(Inst, ARM_SRSDB_UPD);
2086
5
        break;
2087
0
      case ARM_STMIA:
2088
0
        MCInst_setOpcode(Inst, ARM_SRSIA);
2089
0
        break;
2090
3
      case ARM_STMIA_UPD:
2091
3
        MCInst_setOpcode(Inst, ARM_SRSIA_UPD);
2092
3
        break;
2093
0
      case ARM_STMIB:
2094
0
        MCInst_setOpcode(Inst, ARM_SRSIB);
2095
0
        break;
2096
2
      case ARM_STMIB_UPD:
2097
2
        MCInst_setOpcode(Inst, ARM_SRSIB_UPD);
2098
2
        break;
2099
18
      default:
2100
18
        return MCDisassembler_Fail;
2101
1.06k
    }
2102
2103
    // For stores (which become SRS's, the only operand is the mode.
2104
1.04k
    if (fieldFromInstruction_4(Insn, 20, 1) == 0) {
2105
      // Check SRS encoding constraints
2106
15
      if (!(fieldFromInstruction_4(Insn, 22, 1) == 1 &&
2107
0
            fieldFromInstruction_4(Insn, 20, 1) == 0))
2108
15
        return MCDisassembler_Fail;
2109
2110
0
      MCOperand_CreateImm0(Inst, fieldFromInstruction_4(Insn, 0, 4));
2111
0
      return S;
2112
15
    }
2113
2114
1.02k
    return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
2115
1.04k
  }
2116
2117
9.59k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2118
0
    return MCDisassembler_Fail;
2119
2120
9.59k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2121
0
    return MCDisassembler_Fail; // Tied
2122
2123
9.59k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2124
0
    return MCDisassembler_Fail;
2125
2126
9.59k
  if (!Check(&S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
2127
10
    return MCDisassembler_Fail;
2128
2129
9.58k
  return S;
2130
9.59k
}
2131
2132
// Check for UNPREDICTABLE predicated ESB instruction
2133
static DecodeStatus DecodeHINTInstruction(MCInst *Inst, unsigned Insn,
2134
                                 uint64_t Address, const void *Decoder)
2135
1.56k
{
2136
1.56k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2137
1.56k
  unsigned imm8 = fieldFromInstruction_4(Insn, 0, 8);
2138
1.56k
  DecodeStatus result = MCDisassembler_Success;
2139
2140
1.56k
  MCOperand_CreateImm0(Inst, imm8);
2141
2142
1.56k
  if (!Check(&result, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2143
202
    return MCDisassembler_Fail;
2144
2145
  // ESB is unpredictable if pred != AL. Without the RAS extension, it is a NOP,
2146
  // so all predicates should be allowed.
2147
1.36k
  if (imm8 == 0x10 && pred != 0xe && ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureRAS))
2148
66
    result = MCDisassembler_SoftFail;
2149
2150
1.36k
  return result;
2151
1.56k
}
2152
2153
static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn,
2154
    uint64_t Address, const void *Decoder)
2155
4.41k
{
2156
4.41k
  unsigned imod = fieldFromInstruction_4(Insn, 18, 2);
2157
4.41k
  unsigned M = fieldFromInstruction_4(Insn, 17, 1);
2158
4.41k
  unsigned iflags = fieldFromInstruction_4(Insn, 6, 3);
2159
4.41k
  unsigned mode = fieldFromInstruction_4(Insn, 0, 5);
2160
2161
4.41k
  DecodeStatus S = MCDisassembler_Success;
2162
2163
  // This decoder is called from multiple location that do not check
2164
  // the full encoding is valid before they do.
2165
4.41k
  if (fieldFromInstruction_4(Insn, 5, 1) != 0 ||
2166
4.41k
      fieldFromInstruction_4(Insn, 16, 1) != 0 ||
2167
4.41k
      fieldFromInstruction_4(Insn, 20, 8) != 0x10)
2168
10
    return MCDisassembler_Fail;
2169
2170
  // imod == '01' --> UNPREDICTABLE
2171
  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
2172
  // return failure here.  The '01' imod value is unprintable, so there's
2173
  // nothing useful we could do even if we returned UNPREDICTABLE.
2174
2175
4.40k
  if (imod == 1) return MCDisassembler_Fail;
2176
2177
4.40k
  if (imod && M) {
2178
431
    MCInst_setOpcode(Inst, ARM_CPS3p);
2179
431
    MCOperand_CreateImm0(Inst, imod);
2180
431
    MCOperand_CreateImm0(Inst, iflags);
2181
431
    MCOperand_CreateImm0(Inst, mode);
2182
3.97k
  } else if (imod && !M) {
2183
2.06k
    MCInst_setOpcode(Inst, ARM_CPS2p);
2184
2.06k
    MCOperand_CreateImm0(Inst, imod);
2185
2.06k
    MCOperand_CreateImm0(Inst, iflags);
2186
2.06k
    if (mode) S = MCDisassembler_SoftFail;
2187
2.06k
  } else if (!imod && M) {
2188
1.53k
    MCInst_setOpcode(Inst, ARM_CPS1p);
2189
1.53k
    MCOperand_CreateImm0(Inst, mode);
2190
1.53k
    if (iflags) S = MCDisassembler_SoftFail;
2191
1.53k
  } else {
2192
    // imod == '00' && M == '0' --> UNPREDICTABLE
2193
378
    MCInst_setOpcode(Inst, ARM_CPS1p);
2194
378
    MCOperand_CreateImm0(Inst, mode);
2195
378
    S = MCDisassembler_SoftFail;
2196
378
  }
2197
2198
4.40k
  return S;
2199
4.40k
}
2200
2201
static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn,
2202
    uint64_t Address, const void *Decoder)
2203
1.58k
{
2204
1.58k
  unsigned imod = fieldFromInstruction_4(Insn, 9, 2);
2205
1.58k
  unsigned M = fieldFromInstruction_4(Insn, 8, 1);
2206
1.58k
  unsigned iflags = fieldFromInstruction_4(Insn, 5, 3);
2207
1.58k
  unsigned mode = fieldFromInstruction_4(Insn, 0, 5);
2208
2209
1.58k
  DecodeStatus S = MCDisassembler_Success;
2210
2211
  // imod == '01' --> UNPREDICTABLE
2212
  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
2213
  // return failure here.  The '01' imod value is unprintable, so there's
2214
  // nothing useful we could do even if we returned UNPREDICTABLE.
2215
2216
1.58k
  if (imod == 1) return MCDisassembler_Fail;
2217
2218
1.58k
  if (imod && M) {
2219
334
    MCInst_setOpcode(Inst, ARM_t2CPS3p);
2220
334
    MCOperand_CreateImm0(Inst, imod);
2221
334
    MCOperand_CreateImm0(Inst, iflags);
2222
334
    MCOperand_CreateImm0(Inst, mode);
2223
1.25k
  } else if (imod && !M) {
2224
272
    MCInst_setOpcode(Inst, ARM_t2CPS2p);
2225
272
    MCOperand_CreateImm0(Inst, imod);
2226
272
    MCOperand_CreateImm0(Inst, iflags);
2227
272
    if (mode) S = MCDisassembler_SoftFail;
2228
981
  } else if (!imod && M) {
2229
981
    MCInst_setOpcode(Inst, ARM_t2CPS1p);
2230
981
    MCOperand_CreateImm0(Inst, mode);
2231
981
    if (iflags) S = MCDisassembler_SoftFail;
2232
981
  } else {
2233
    // imod == '00' && M == '0' --> this is a HINT instruction
2234
0
    int imm = fieldFromInstruction_4(Insn, 0, 8);
2235
    // HINT are defined only for immediate in [0..4]
2236
0
    if (imm > 4) return MCDisassembler_Fail;
2237
2238
0
    MCInst_setOpcode(Inst, ARM_t2HINT);
2239
0
    MCOperand_CreateImm0(Inst, imm);
2240
0
  }
2241
2242
1.58k
  return S;
2243
1.58k
}
2244
2245
static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn,
2246
    uint64_t Address, const void *Decoder)
2247
944
{
2248
944
  DecodeStatus S = MCDisassembler_Success;
2249
2250
944
  unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
2251
944
  unsigned imm = 0;
2252
2253
944
  imm |= (fieldFromInstruction_4(Insn, 0, 8) << 0);
2254
944
  imm |= (fieldFromInstruction_4(Insn, 12, 3) << 8);
2255
944
  imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12);
2256
944
  imm |= (fieldFromInstruction_4(Insn, 26, 1) << 11);
2257
2258
944
  if (MCInst_getOpcode(Inst) == ARM_t2MOVTi16)
2259
700
    if (!Check(&S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2260
0
      return MCDisassembler_Fail;
2261
2262
944
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2263
0
    return MCDisassembler_Fail;
2264
2265
944
  MCOperand_CreateImm0(Inst, imm);
2266
2267
944
  return S;
2268
944
}
2269
2270
static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn,
2271
    uint64_t Address, const void *Decoder)
2272
1.39k
{
2273
1.39k
  DecodeStatus S = MCDisassembler_Success;
2274
2275
1.39k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2276
1.39k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2277
1.39k
  unsigned imm = 0;
2278
2279
1.39k
  imm |= (fieldFromInstruction_4(Insn, 0, 12) << 0);
2280
1.39k
  imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12);
2281
2282
1.39k
  if (MCInst_getOpcode(Inst) == ARM_MOVTi16)
2283
523
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2284
0
      return MCDisassembler_Fail;
2285
2286
1.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2287
0
    return MCDisassembler_Fail;
2288
2289
1.39k
  MCOperand_CreateImm0(Inst, imm);
2290
2291
1.39k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2292
123
    return MCDisassembler_Fail;
2293
2294
1.27k
  return S;
2295
1.39k
}
2296
2297
static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn,
2298
    uint64_t Address, const void *Decoder)
2299
3.71k
{
2300
3.71k
  DecodeStatus S = MCDisassembler_Success;
2301
2302
3.71k
  unsigned Rd = fieldFromInstruction_4(Insn, 16, 4);
2303
3.71k
  unsigned Rn = fieldFromInstruction_4(Insn, 0, 4);
2304
3.71k
  unsigned Rm = fieldFromInstruction_4(Insn, 8, 4);
2305
3.71k
  unsigned Ra = fieldFromInstruction_4(Insn, 12, 4);
2306
3.71k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2307
2308
3.71k
  if (pred == 0xF)
2309
1.32k
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
2310
2311
2.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2312
0
    return MCDisassembler_Fail;
2313
2314
2.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2315
0
    return MCDisassembler_Fail;
2316
2317
2.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2318
0
    return MCDisassembler_Fail;
2319
2320
2.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
2321
0
    return MCDisassembler_Fail;
2322
2323
2.39k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2324
0
    return MCDisassembler_Fail;
2325
2326
2.39k
  return S;
2327
2.39k
}
2328
2329
static DecodeStatus DecodeTSTInstruction(MCInst *Inst, unsigned Insn,
2330
    uint64_t Address, const void *Decoder)
2331
1.67k
{
2332
1.67k
  DecodeStatus S = MCDisassembler_Success;
2333
1.67k
  unsigned Pred = fieldFromInstruction_4(Insn, 28, 4);
2334
1.67k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2335
1.67k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2336
2337
1.67k
  if (Pred == 0xF)
2338
1.32k
    return DecodeSETPANInstruction(Inst, Insn, Address, Decoder);
2339
2340
352
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2341
0
    return MCDisassembler_Fail;
2342
2343
352
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2344
0
    return MCDisassembler_Fail;
2345
2346
352
  if (!Check(&S, DecodePredicateOperand(Inst, Pred, Address, Decoder)))
2347
0
    return MCDisassembler_Fail;
2348
2349
352
  return S;
2350
352
}
2351
2352
static DecodeStatus DecodeSETPANInstruction(MCInst *Inst, unsigned Insn,
2353
    uint64_t Address, const void *Decoder)
2354
1.32k
{
2355
1.32k
  DecodeStatus S = MCDisassembler_Success;
2356
1.32k
  unsigned Imm = fieldFromInstruction_4(Insn, 9, 1);
2357
2358
1.32k
  if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8_1aOps) || !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops))
2359
2
    return MCDisassembler_Fail;
2360
2361
  // Decoder can be called from DecodeTST, which does not check the full
2362
  // encoding is valid.
2363
1.32k
  if (fieldFromInstruction_4(Insn, 20, 12) != 0xf11 ||
2364
1.32k
      fieldFromInstruction_4(Insn, 4, 4) != 0)
2365
0
    return MCDisassembler_Fail;
2366
2367
1.32k
  if (fieldFromInstruction_4(Insn, 10, 10) != 0 ||
2368
742
      fieldFromInstruction_4(Insn, 0, 4) != 0)
2369
1.13k
    S = MCDisassembler_SoftFail;
2370
2371
1.32k
  MCInst_setOpcode(Inst, ARM_SETPAN);
2372
1.32k
  MCOperand_CreateImm0(Inst, Imm);
2373
2374
1.32k
  return S;
2375
1.32k
}
2376
2377
static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val,
2378
    uint64_t Address, const void *Decoder)
2379
7.02k
{
2380
7.02k
  DecodeStatus S = MCDisassembler_Success;
2381
7.02k
  unsigned add = fieldFromInstruction_4(Val, 12, 1);
2382
7.02k
  unsigned imm = fieldFromInstruction_4(Val, 0, 12);
2383
7.02k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
2384
2385
7.02k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2386
0
    return MCDisassembler_Fail;
2387
2388
7.02k
  if (!add) imm *= (unsigned int)-1;
2389
7.02k
  if (imm == 0 && !add) imm = (unsigned int)INT32_MIN;
2390
2391
7.02k
  MCOperand_CreateImm0(Inst, imm);
2392
  //if (Rn == 15)
2393
  //  tryAddingPcLoadReferenceComment(Address, Address + imm + 8, Decoder);
2394
2395
7.02k
  return S;
2396
7.02k
}
2397
2398
static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val,
2399
    uint64_t Address, const void *Decoder)
2400
2.16k
{
2401
2.16k
  DecodeStatus S = MCDisassembler_Success;
2402
2.16k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
2403
  // U == 1 to add imm, 0 to subtract it.
2404
2.16k
  unsigned U = fieldFromInstruction_4(Val, 8, 1);
2405
2.16k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
2406
2407
2.16k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2408
0
    return MCDisassembler_Fail;
2409
2410
2.16k
  if (U)
2411
745
    MCOperand_CreateImm0(Inst, ARM_AM_getAM5Opc(ARM_AM_add, (unsigned char)imm));
2412
1.41k
  else
2413
1.41k
    MCOperand_CreateImm0(Inst, ARM_AM_getAM5Opc(ARM_AM_sub, (unsigned char)imm));
2414
2415
2.16k
  return S;
2416
2.16k
}
2417
2418
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst *Inst, unsigned Val,
2419
    uint64_t Address, const void *Decoder)
2420
1.96k
{
2421
1.96k
  DecodeStatus S = MCDisassembler_Success;
2422
1.96k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
2423
  // U == 1 to add imm, 0 to subtract it.
2424
1.96k
  unsigned U = fieldFromInstruction_4(Val, 8, 1);
2425
1.96k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
2426
2427
1.96k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2428
0
    return MCDisassembler_Fail;
2429
2430
1.96k
  if (U)
2431
997
    MCOperand_CreateImm0(Inst, getAM5FP16Opc(ARM_AM_add, imm));
2432
966
  else
2433
966
    MCOperand_CreateImm0(Inst, getAM5FP16Opc(ARM_AM_sub, imm));
2434
2435
1.96k
  return S;
2436
1.96k
}
2437
2438
static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val,
2439
    uint64_t Address, const void *Decoder)
2440
14.3k
{
2441
14.3k
  return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
2442
14.3k
}
2443
2444
static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn,
2445
    uint64_t Address, const void *Decoder)
2446
594
{
2447
594
  DecodeStatus Status = MCDisassembler_Success;
2448
2449
  // Note the J1 and J2 values are from the encoded instruction.  So here
2450
  // change them to I1 and I2 values via as documented:
2451
  // I1 = NOT(J1 EOR S);
2452
  // I2 = NOT(J2 EOR S);
2453
  // and build the imm32 with one trailing zero as documented:
2454
  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
2455
594
  unsigned S = fieldFromInstruction_4(Insn, 26, 1);
2456
594
  unsigned J1 = fieldFromInstruction_4(Insn, 13, 1);
2457
594
  unsigned J2 = fieldFromInstruction_4(Insn, 11, 1);
2458
594
  unsigned I1 = !(J1 ^ S);
2459
594
  unsigned I2 = !(J2 ^ S);
2460
594
  unsigned imm10 = fieldFromInstruction_4(Insn, 16, 10);
2461
594
  unsigned imm11 = fieldFromInstruction_4(Insn, 0, 11);
2462
594
  unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
2463
594
  int imm32 = SignExtend32(tmp << 1, 25);
2464
2465
594
  MCOperand_CreateImm0(Inst, imm32);
2466
2467
594
  return Status;
2468
594
}
2469
2470
static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst, unsigned Insn,
2471
    uint64_t Address, const void *Decoder)
2472
6.36k
{
2473
6.36k
  DecodeStatus S = MCDisassembler_Success;
2474
2475
6.36k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2476
6.36k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 24) << 2;
2477
2478
6.36k
  if (pred == 0xF) {
2479
437
    MCInst_setOpcode(Inst, ARM_BLXi);
2480
437
    imm |= fieldFromInstruction_4(Insn, 24, 1) << 1;
2481
437
    MCOperand_CreateImm0(Inst, SignExtend32(imm, 26));
2482
437
    return S;
2483
437
  }
2484
2485
5.92k
  MCOperand_CreateImm0(Inst, SignExtend32(imm, 26));
2486
2487
5.92k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2488
0
    return MCDisassembler_Fail;
2489
2490
5.92k
  return S;
2491
5.92k
}
2492
2493
2494
static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val,
2495
    uint64_t Address, const void *Decoder)
2496
73.4k
{
2497
73.4k
  DecodeStatus S = MCDisassembler_Success;
2498
2499
73.4k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
2500
73.4k
  unsigned align = fieldFromInstruction_4(Val, 4, 2);
2501
2502
73.4k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2503
0
    return MCDisassembler_Fail;
2504
2505
73.4k
  if (!align)
2506
41.5k
    MCOperand_CreateImm0(Inst, 0);
2507
31.8k
  else
2508
31.8k
    MCOperand_CreateImm0(Inst, 4 << align);
2509
2510
73.4k
  return S;
2511
73.4k
}
2512
2513
static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Insn,
2514
    uint64_t Address, const void *Decoder)
2515
18.7k
{
2516
18.7k
  DecodeStatus S = MCDisassembler_Success;
2517
18.7k
  unsigned wb, Rn, Rm;
2518
18.7k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2519
18.7k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
2520
18.7k
  wb = fieldFromInstruction_4(Insn, 16, 4);
2521
18.7k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
2522
18.7k
  Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4;
2523
18.7k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
2524
2525
  // First output register
2526
18.7k
  switch (MCInst_getOpcode(Inst)) {
2527
876
    case ARM_VLD1q16: case ARM_VLD1q32: case ARM_VLD1q64: case ARM_VLD1q8:
2528
1.39k
    case ARM_VLD1q16wb_fixed: case ARM_VLD1q16wb_register:
2529
1.68k
    case ARM_VLD1q32wb_fixed: case ARM_VLD1q32wb_register:
2530
2.27k
    case ARM_VLD1q64wb_fixed: case ARM_VLD1q64wb_register:
2531
2.57k
    case ARM_VLD1q8wb_fixed: case ARM_VLD1q8wb_register:
2532
3.03k
    case ARM_VLD2d16: case ARM_VLD2d32: case ARM_VLD2d8:
2533
3.48k
    case ARM_VLD2d16wb_fixed: case ARM_VLD2d16wb_register:
2534
3.63k
    case ARM_VLD2d32wb_fixed: case ARM_VLD2d32wb_register:
2535
3.94k
    case ARM_VLD2d8wb_fixed: case ARM_VLD2d8wb_register:
2536
3.94k
      if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2537
3
        return MCDisassembler_Fail;
2538
3.94k
      break;
2539
2540
3.94k
    case ARM_VLD2b16:
2541
493
    case ARM_VLD2b32:
2542
1.09k
    case ARM_VLD2b8:
2543
1.24k
    case ARM_VLD2b16wb_fixed:
2544
1.45k
    case ARM_VLD2b16wb_register:
2545
1.66k
    case ARM_VLD2b32wb_fixed:
2546
1.88k
    case ARM_VLD2b32wb_register:
2547
2.17k
    case ARM_VLD2b8wb_fixed:
2548
2.33k
    case ARM_VLD2b8wb_register:
2549
2.33k
      if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
2550
6
        return MCDisassembler_Fail;
2551
2.33k
      break;
2552
2553
12.4k
    default:
2554
12.4k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2555
0
        return MCDisassembler_Fail;
2556
18.7k
  }
2557
2558
  // Second output register
2559
18.7k
  switch (MCInst_getOpcode(Inst)) {
2560
389
    case ARM_VLD3d8:
2561
587
    case ARM_VLD3d16:
2562
798
    case ARM_VLD3d32:
2563
1.02k
    case ARM_VLD3d8_UPD:
2564
1.29k
    case ARM_VLD3d16_UPD:
2565
1.49k
    case ARM_VLD3d32_UPD:
2566
1.95k
    case ARM_VLD4d8:
2567
2.35k
    case ARM_VLD4d16:
2568
2.55k
    case ARM_VLD4d32:
2569
2.95k
    case ARM_VLD4d8_UPD:
2570
3.25k
    case ARM_VLD4d16_UPD:
2571
3.43k
    case ARM_VLD4d32_UPD:
2572
3.43k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 1) % 32, Address, Decoder)))
2573
0
        return MCDisassembler_Fail;
2574
3.43k
      break;
2575
2576
3.43k
    case ARM_VLD3q8:
2577
484
    case ARM_VLD3q16:
2578
707
    case ARM_VLD3q32:
2579
943
    case ARM_VLD3q8_UPD:
2580
1.01k
    case ARM_VLD3q16_UPD:
2581
1.69k
    case ARM_VLD3q32_UPD:
2582
1.93k
    case ARM_VLD4q8:
2583
2.13k
    case ARM_VLD4q16:
2584
2.43k
    case ARM_VLD4q32:
2585
2.53k
    case ARM_VLD4q8_UPD:
2586
2.78k
    case ARM_VLD4q16_UPD:
2587
3.26k
    case ARM_VLD4q32_UPD:
2588
3.26k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32, Address, Decoder)))
2589
0
        return MCDisassembler_Fail;
2590
2591
15.2k
    default:
2592
15.2k
      break;
2593
18.7k
  }
2594
2595
  // Third output register
2596
18.7k
  switch(MCInst_getOpcode(Inst)) {
2597
389
    case ARM_VLD3d8:
2598
587
    case ARM_VLD3d16:
2599
798
    case ARM_VLD3d32:
2600
1.02k
    case ARM_VLD3d8_UPD:
2601
1.29k
    case ARM_VLD3d16_UPD:
2602
1.49k
    case ARM_VLD3d32_UPD:
2603
1.95k
    case ARM_VLD4d8:
2604
2.35k
    case ARM_VLD4d16:
2605
2.55k
    case ARM_VLD4d32:
2606
2.95k
    case ARM_VLD4d8_UPD:
2607
3.25k
    case ARM_VLD4d16_UPD:
2608
3.43k
    case ARM_VLD4d32_UPD:
2609
3.43k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32, Address, Decoder)))
2610
0
        return MCDisassembler_Fail;
2611
3.43k
      break;
2612
3.43k
    case ARM_VLD3q8:
2613
484
    case ARM_VLD3q16:
2614
707
    case ARM_VLD3q32:
2615
943
    case ARM_VLD3q8_UPD:
2616
1.01k
    case ARM_VLD3q16_UPD:
2617
1.69k
    case ARM_VLD3q32_UPD:
2618
1.93k
    case ARM_VLD4q8:
2619
2.13k
    case ARM_VLD4q16:
2620
2.43k
    case ARM_VLD4q32:
2621
2.53k
    case ARM_VLD4q8_UPD:
2622
2.78k
    case ARM_VLD4q16_UPD:
2623
3.26k
    case ARM_VLD4q32_UPD:
2624
3.26k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 4) % 32, Address, Decoder)))
2625
0
        return MCDisassembler_Fail;
2626
3.26k
      break;
2627
12.0k
    default:
2628
12.0k
      break;
2629
18.7k
  }
2630
2631
  // Fourth output register
2632
18.7k
  switch (MCInst_getOpcode(Inst)) {
2633
457
    case ARM_VLD4d8:
2634
858
    case ARM_VLD4d16:
2635
1.05k
    case ARM_VLD4d32:
2636
1.45k
    case ARM_VLD4d8_UPD:
2637
1.75k
    case ARM_VLD4d16_UPD:
2638
1.94k
    case ARM_VLD4d32_UPD:
2639
1.94k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3) % 32, Address, Decoder)))
2640
0
        return MCDisassembler_Fail;
2641
1.94k
      break;
2642
1.94k
    case ARM_VLD4q8:
2643
436
    case ARM_VLD4q16:
2644
738
    case ARM_VLD4q32:
2645
839
    case ARM_VLD4q8_UPD:
2646
1.08k
    case ARM_VLD4q16_UPD:
2647
1.56k
    case ARM_VLD4q32_UPD:
2648
1.56k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 6) % 32, Address, Decoder)))
2649
0
        return MCDisassembler_Fail;
2650
1.56k
      break;
2651
15.2k
    default:
2652
15.2k
      break;
2653
18.7k
  }
2654
2655
  // Writeback operand
2656
18.7k
  switch (MCInst_getOpcode(Inst)) {
2657
203
    case ARM_VLD1d8wb_fixed:
2658
298
    case ARM_VLD1d16wb_fixed:
2659
497
    case ARM_VLD1d32wb_fixed:
2660
807
    case ARM_VLD1d64wb_fixed:
2661
876
    case ARM_VLD1d8wb_register:
2662
944
    case ARM_VLD1d16wb_register:
2663
1.13k
    case ARM_VLD1d32wb_register:
2664
1.20k
    case ARM_VLD1d64wb_register:
2665
1.40k
    case ARM_VLD1q8wb_fixed:
2666
1.71k
    case ARM_VLD1q16wb_fixed:
2667
1.80k
    case ARM_VLD1q32wb_fixed:
2668
1.93k
    case ARM_VLD1q64wb_fixed:
2669
2.03k
    case ARM_VLD1q8wb_register:
2670
2.24k
    case ARM_VLD1q16wb_register:
2671
2.44k
    case ARM_VLD1q32wb_register:
2672
2.90k
    case ARM_VLD1q64wb_register:
2673
3.00k
    case ARM_VLD1d8Twb_fixed:
2674
3.10k
    case ARM_VLD1d8Twb_register:
2675
3.24k
    case ARM_VLD1d16Twb_fixed:
2676
3.54k
    case ARM_VLD1d16Twb_register:
2677
3.61k
    case ARM_VLD1d32Twb_fixed:
2678
3.88k
    case ARM_VLD1d32Twb_register:
2679
4.08k
    case ARM_VLD1d64Twb_fixed:
2680
4.52k
    case ARM_VLD1d64Twb_register:
2681
4.61k
    case ARM_VLD1d8Qwb_fixed:
2682
4.98k
    case ARM_VLD1d8Qwb_register:
2683
5.21k
    case ARM_VLD1d16Qwb_fixed:
2684
5.37k
    case ARM_VLD1d16Qwb_register:
2685
5.70k
    case ARM_VLD1d32Qwb_fixed:
2686
5.95k
    case ARM_VLD1d32Qwb_register:
2687
6.04k
    case ARM_VLD1d64Qwb_fixed:
2688
6.12k
    case ARM_VLD1d64Qwb_register:
2689
6.22k
    case ARM_VLD2d8wb_fixed:
2690
6.52k
    case ARM_VLD2d16wb_fixed:
2691
6.59k
    case ARM_VLD2d32wb_fixed:
2692
6.78k
    case ARM_VLD2q8wb_fixed:
2693
7.01k
    case ARM_VLD2q16wb_fixed:
2694
7.13k
    case ARM_VLD2q32wb_fixed:
2695
7.35k
    case ARM_VLD2d8wb_register:
2696
7.50k
    case ARM_VLD2d16wb_register:
2697
7.57k
    case ARM_VLD2d32wb_register:
2698
7.95k
    case ARM_VLD2q8wb_register:
2699
8.17k
    case ARM_VLD2q16wb_register:
2700
8.27k
    case ARM_VLD2q32wb_register:
2701
8.56k
    case ARM_VLD2b8wb_fixed:
2702
8.71k
    case ARM_VLD2b16wb_fixed:
2703
8.92k
    case ARM_VLD2b32wb_fixed:
2704
9.08k
    case ARM_VLD2b8wb_register:
2705
9.29k
    case ARM_VLD2b16wb_register:
2706
9.51k
    case ARM_VLD2b32wb_register:
2707
9.51k
      MCOperand_CreateImm0(Inst, 0);
2708
9.51k
      break;
2709
2710
230
    case ARM_VLD3d8_UPD:
2711
493
    case ARM_VLD3d16_UPD:
2712
696
    case ARM_VLD3d32_UPD:
2713
932
    case ARM_VLD3q8_UPD:
2714
1.00k
    case ARM_VLD3q16_UPD:
2715
1.68k
    case ARM_VLD3q32_UPD:
2716
2.08k
    case ARM_VLD4d8_UPD:
2717
2.38k
    case ARM_VLD4d16_UPD:
2718
2.57k
    case ARM_VLD4d32_UPD:
2719
2.67k
    case ARM_VLD4q8_UPD:
2720
2.92k
    case ARM_VLD4q16_UPD:
2721
3.40k
    case ARM_VLD4q32_UPD:
2722
3.40k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
2723
0
        return MCDisassembler_Fail;
2724
3.40k
      break;
2725
2726
5.80k
    default:
2727
5.80k
      break;
2728
18.7k
  }
2729
2730
  // AddrMode6 Base (register+alignment)
2731
18.7k
  if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
2732
0
    return MCDisassembler_Fail;
2733
2734
  // AddrMode6 Offset (register)
2735
18.7k
  switch (MCInst_getOpcode(Inst)) {
2736
12.9k
    default:
2737
      // The below have been updated to have explicit am6offset split
2738
      // between fixed and register offset. For those instructions not
2739
      // yet updated, we need to add an additional reg0 operand for the
2740
      // fixed variant.
2741
      //
2742
      // The fixed offset encodes as Rm == 0xd, so we check for that.
2743
12.9k
      if (Rm == 0xd) {
2744
1.35k
        MCOperand_CreateReg0(Inst, 0);
2745
1.35k
        break;
2746
1.35k
      }
2747
      // Fall through to handle the register offset variant.
2748
2749
11.7k
    case ARM_VLD1d8wb_fixed:
2750
11.8k
    case ARM_VLD1d16wb_fixed:
2751
12.0k
    case ARM_VLD1d32wb_fixed:
2752
12.3k
    case ARM_VLD1d64wb_fixed:
2753
12.4k
    case ARM_VLD1d8Twb_fixed:
2754
12.5k
    case ARM_VLD1d16Twb_fixed:
2755
12.6k
    case ARM_VLD1d32Twb_fixed:
2756
12.8k
    case ARM_VLD1d64Twb_fixed:
2757
12.9k
    case ARM_VLD1d8Qwb_fixed:
2758
13.1k
    case ARM_VLD1d16Qwb_fixed:
2759
13.5k
    case ARM_VLD1d32Qwb_fixed:
2760
13.6k
    case ARM_VLD1d64Qwb_fixed:
2761
13.6k
    case ARM_VLD1d8wb_register:
2762
13.7k
    case ARM_VLD1d16wb_register:
2763
13.9k
    case ARM_VLD1d32wb_register:
2764
14.0k
    case ARM_VLD1d64wb_register:
2765
14.2k
    case ARM_VLD1q8wb_fixed:
2766
14.5k
    case ARM_VLD1q16wb_fixed:
2767
14.6k
    case ARM_VLD1q32wb_fixed:
2768
14.7k
    case ARM_VLD1q64wb_fixed:
2769
14.8k
    case ARM_VLD1q8wb_register:
2770
15.0k
    case ARM_VLD1q16wb_register:
2771
15.2k
    case ARM_VLD1q32wb_register:
2772
15.7k
    case ARM_VLD1q64wb_register:
2773
      // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
2774
      // variant encodes Rm == 0xf. Anything else is a register offset post-
2775
      // increment and we need to add the register operand to the instruction.
2776
15.7k
      if (Rm != 0xD && Rm != 0xF &&
2777
7.09k
          !Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2778
0
        return MCDisassembler_Fail;
2779
15.7k
      break;
2780
2781
15.7k
    case ARM_VLD2d8wb_fixed:
2782
400
    case ARM_VLD2d16wb_fixed:
2783
468
    case ARM_VLD2d32wb_fixed:
2784
761
    case ARM_VLD2b8wb_fixed:
2785
908
    case ARM_VLD2b16wb_fixed:
2786
1.11k
    case ARM_VLD2b32wb_fixed:
2787
1.31k
    case ARM_VLD2q8wb_fixed:
2788
1.53k
    case ARM_VLD2q16wb_fixed:
2789
1.66k
    case ARM_VLD2q32wb_fixed:
2790
1.66k
      break;
2791
18.7k
  }
2792
2793
18.7k
  return S;
2794
18.7k
}
2795
2796
static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Insn,
2797
    uint64_t Address, const void *Decoder)
2798
29.4k
{
2799
29.4k
  unsigned load;
2800
29.4k
  unsigned type = fieldFromInstruction_4(Insn, 8, 4);
2801
29.4k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
2802
29.4k
  if (type == 6 && (align & 2)) return MCDisassembler_Fail;
2803
29.4k
  if (type == 7 && (align & 2)) return MCDisassembler_Fail;
2804
29.4k
  if (type == 10 && align == 3) return MCDisassembler_Fail;
2805
2806
29.4k
  load = fieldFromInstruction_4(Insn, 21, 1);
2807
2808
29.4k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2809
29.4k
    : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
2810
29.4k
}
2811
2812
static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Insn,
2813
    uint64_t Address, const void *Decoder)
2814
21.4k
{
2815
21.4k
  unsigned type, align, load;
2816
21.4k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
2817
21.4k
  if (size == 3) return MCDisassembler_Fail;
2818
2819
21.4k
  type = fieldFromInstruction_4(Insn, 8, 4);
2820
21.4k
  align = fieldFromInstruction_4(Insn, 4, 2);
2821
21.4k
  if (type == 8 && align == 3) return MCDisassembler_Fail;
2822
21.4k
  if (type == 9 && align == 3) return MCDisassembler_Fail;
2823
2824
21.4k
  load = fieldFromInstruction_4(Insn, 21, 1);
2825
2826
21.4k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2827
21.4k
    : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
2828
21.4k
}
2829
2830
static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Insn,
2831
    uint64_t Address, const void *Decoder)
2832
11.1k
{
2833
11.1k
  unsigned align, load;
2834
11.1k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
2835
11.1k
  if (size == 3) return MCDisassembler_Fail;
2836
2837
11.1k
  align = fieldFromInstruction_4(Insn, 4, 2);
2838
11.1k
  if (align & 2) return MCDisassembler_Fail;
2839
2840
11.1k
  load = fieldFromInstruction_4(Insn, 21, 1);
2841
2842
11.1k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2843
11.1k
    : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
2844
11.1k
}
2845
2846
static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Insn,
2847
    uint64_t Address, const void *Decoder)
2848
11.4k
{
2849
11.4k
  unsigned load;
2850
11.4k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
2851
11.4k
  if (size == 3) return MCDisassembler_Fail;
2852
2853
11.4k
  load = fieldFromInstruction_4(Insn, 21, 1);
2854
2855
11.4k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2856
11.4k
    : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
2857
11.4k
}
2858
2859
static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Insn,
2860
    uint64_t Address, const void *Decoder)
2861
38.2k
{
2862
38.2k
  DecodeStatus S = MCDisassembler_Success;
2863
38.2k
  unsigned wb, Rn, Rm;
2864
38.2k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2865
38.2k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
2866
38.2k
  wb = fieldFromInstruction_4(Insn, 16, 4);
2867
38.2k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
2868
38.2k
  Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4;
2869
38.2k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
2870
2871
  // Writeback Operand
2872
38.2k
  switch (MCInst_getOpcode(Inst)) {
2873
208
    case ARM_VST1d8wb_fixed:
2874
609
    case ARM_VST1d16wb_fixed:
2875
757
    case ARM_VST1d32wb_fixed:
2876
989
    case ARM_VST1d64wb_fixed:
2877
1.42k
    case ARM_VST1d8wb_register:
2878
2.12k
    case ARM_VST1d16wb_register:
2879
2.52k
    case ARM_VST1d32wb_register:
2880
2.84k
    case ARM_VST1d64wb_register:
2881
3.26k
    case ARM_VST1q8wb_fixed:
2882
3.72k
    case ARM_VST1q16wb_fixed:
2883
4.03k
    case ARM_VST1q32wb_fixed:
2884
4.50k
    case ARM_VST1q64wb_fixed:
2885
4.84k
    case ARM_VST1q8wb_register:
2886
5.25k
    case ARM_VST1q16wb_register:
2887
5.63k
    case ARM_VST1q32wb_register:
2888
6.00k
    case ARM_VST1q64wb_register:
2889
6.34k
    case ARM_VST1d8Twb_fixed:
2890
6.64k
    case ARM_VST1d16Twb_fixed:
2891
6.92k
    case ARM_VST1d32Twb_fixed:
2892
7.37k
    case ARM_VST1d64Twb_fixed:
2893
8.22k
    case ARM_VST1d8Twb_register:
2894
8.80k
    case ARM_VST1d16Twb_register:
2895
9.18k
    case ARM_VST1d32Twb_register:
2896
9.47k
    case ARM_VST1d64Twb_register:
2897
10.3k
    case ARM_VST1d8Qwb_fixed:
2898
10.7k
    case ARM_VST1d16Qwb_fixed:
2899
11.1k
    case ARM_VST1d32Qwb_fixed:
2900
11.3k
    case ARM_VST1d64Qwb_fixed:
2901
11.7k
    case ARM_VST1d8Qwb_register:
2902
12.0k
    case ARM_VST1d16Qwb_register:
2903
12.2k
    case ARM_VST1d32Qwb_register:
2904
12.4k
    case ARM_VST1d64Qwb_register:
2905
12.9k
    case ARM_VST2d8wb_fixed:
2906
13.2k
    case ARM_VST2d16wb_fixed:
2907
13.6k
    case ARM_VST2d32wb_fixed:
2908
14.1k
    case ARM_VST2d8wb_register:
2909
14.4k
    case ARM_VST2d16wb_register:
2910
14.7k
    case ARM_VST2d32wb_register:
2911
15.3k
    case ARM_VST2q8wb_fixed:
2912
16.0k
    case ARM_VST2q16wb_fixed:
2913
16.2k
    case ARM_VST2q32wb_fixed:
2914
16.8k
    case ARM_VST2q8wb_register:
2915
17.4k
    case ARM_VST2q16wb_register:
2916
17.9k
    case ARM_VST2q32wb_register:
2917
18.5k
    case ARM_VST2b8wb_fixed:
2918
19.0k
    case ARM_VST2b16wb_fixed:
2919
19.5k
    case ARM_VST2b32wb_fixed:
2920
20.5k
    case ARM_VST2b8wb_register:
2921
20.8k
    case ARM_VST2b16wb_register:
2922
21.2k
    case ARM_VST2b32wb_register:
2923
21.2k
      if (Rm == 0xF)
2924
0
        return MCDisassembler_Fail;
2925
21.2k
      MCOperand_CreateImm0(Inst, 0);
2926
21.2k
      break;
2927
397
    case ARM_VST3d8_UPD:
2928
706
    case ARM_VST3d16_UPD:
2929
1.09k
    case ARM_VST3d32_UPD:
2930
1.66k
    case ARM_VST3q8_UPD:
2931
2.13k
    case ARM_VST3q16_UPD:
2932
2.74k
    case ARM_VST3q32_UPD:
2933
3.36k
    case ARM_VST4d8_UPD:
2934
3.97k
    case ARM_VST4d16_UPD:
2935
4.73k
    case ARM_VST4d32_UPD:
2936
5.01k
    case ARM_VST4q8_UPD:
2937
5.42k
    case ARM_VST4q16_UPD:
2938
6.87k
    case ARM_VST4q32_UPD:
2939
6.87k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
2940
0
        return MCDisassembler_Fail;
2941
6.87k
      break;
2942
10.0k
    default:
2943
10.0k
      break;
2944
38.2k
  }
2945
2946
  // AddrMode6 Base (register+alignment)
2947
38.2k
  if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
2948
0
    return MCDisassembler_Fail;
2949
2950
  // AddrMode6 Offset (register)
2951
38.2k
  switch (MCInst_getOpcode(Inst)) {
2952
28.2k
    default:
2953
28.2k
      if (Rm == 0xD)
2954
1.34k
        MCOperand_CreateReg0(Inst, 0);
2955
26.8k
      else if (Rm != 0xF) {
2956
16.7k
        if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2957
0
          return MCDisassembler_Fail;
2958
16.7k
      }
2959
28.2k
      break;
2960
2961
28.2k
    case ARM_VST1d8wb_fixed:
2962
609
    case ARM_VST1d16wb_fixed:
2963
757
    case ARM_VST1d32wb_fixed:
2964
989
    case ARM_VST1d64wb_fixed:
2965
1.40k
    case ARM_VST1q8wb_fixed:
2966
1.87k
    case ARM_VST1q16wb_fixed:
2967
2.17k
    case ARM_VST1q32wb_fixed:
2968
2.65k
    case ARM_VST1q64wb_fixed:
2969
2.99k
    case ARM_VST1d8Twb_fixed:
2970
3.29k
    case ARM_VST1d16Twb_fixed:
2971
3.57k
    case ARM_VST1d32Twb_fixed:
2972
4.02k
    case ARM_VST1d64Twb_fixed:
2973
4.93k
    case ARM_VST1d8Qwb_fixed:
2974
5.25k
    case ARM_VST1d16Qwb_fixed:
2975
5.65k
    case ARM_VST1d32Qwb_fixed:
2976
5.89k
    case ARM_VST1d64Qwb_fixed:
2977
6.34k
    case ARM_VST2d8wb_fixed:
2978
6.62k
    case ARM_VST2d16wb_fixed:
2979
7.03k
    case ARM_VST2d32wb_fixed:
2980
7.58k
    case ARM_VST2q8wb_fixed:
2981
8.29k
    case ARM_VST2q16wb_fixed:
2982
8.49k
    case ARM_VST2q32wb_fixed:
2983
9.05k
    case ARM_VST2b8wb_fixed:
2984
9.59k
    case ARM_VST2b16wb_fixed:
2985
10.0k
    case ARM_VST2b32wb_fixed:
2986
10.0k
      break;
2987
38.2k
  }
2988
2989
2990
  // First input register
2991
38.2k
  switch (MCInst_getOpcode(Inst)) {
2992
681
    case ARM_VST1q16:
2993
972
    case ARM_VST1q32:
2994
1.26k
    case ARM_VST1q64:
2995
1.57k
    case ARM_VST1q8:
2996
2.04k
    case ARM_VST1q16wb_fixed:
2997
2.45k
    case ARM_VST1q16wb_register:
2998
2.76k
    case ARM_VST1q32wb_fixed:
2999
3.14k
    case ARM_VST1q32wb_register:
3000
3.61k
    case ARM_VST1q64wb_fixed:
3001
3.98k
    case ARM_VST1q64wb_register:
3002
4.40k
    case ARM_VST1q8wb_fixed:
3003
4.73k
    case ARM_VST1q8wb_register:
3004
5.05k
    case ARM_VST2d16:
3005
5.66k
    case ARM_VST2d32:
3006
6.47k
    case ARM_VST2d8:
3007
6.75k
    case ARM_VST2d16wb_fixed:
3008
7.06k
    case ARM_VST2d16wb_register:
3009
7.47k
    case ARM_VST2d32wb_fixed:
3010
7.79k
    case ARM_VST2d32wb_register:
3011
8.24k
    case ARM_VST2d8wb_fixed:
3012
8.76k
    case ARM_VST2d8wb_register:
3013
8.76k
      if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
3014
3
        return MCDisassembler_Fail;
3015
8.75k
      break;
3016
3017
8.75k
    case ARM_VST2b16:
3018
712
    case ARM_VST2b32:
3019
1.19k
    case ARM_VST2b8:
3020
1.73k
    case ARM_VST2b16wb_fixed:
3021
2.04k
    case ARM_VST2b16wb_register:
3022
2.46k
    case ARM_VST2b32wb_fixed:
3023
2.84k
    case ARM_VST2b32wb_register:
3024
3.40k
    case ARM_VST2b8wb_fixed:
3025
4.46k
    case ARM_VST2b8wb_register:
3026
4.46k
      if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
3027
5
        return MCDisassembler_Fail;
3028
4.46k
      break;
3029
3030
25.0k
    default:
3031
25.0k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3032
0
        return MCDisassembler_Fail;
3033
38.2k
  }
3034
3035
  // Second input register
3036
38.2k
  switch (MCInst_getOpcode(Inst)) {
3037
245
    case ARM_VST3d8:
3038
663
    case ARM_VST3d16:
3039
1.32k
    case ARM_VST3d32:
3040
1.71k
    case ARM_VST3d8_UPD:
3041
2.02k
    case ARM_VST3d16_UPD:
3042
2.41k
    case ARM_VST3d32_UPD:
3043
2.73k
    case ARM_VST4d8:
3044
2.87k
    case ARM_VST4d16:
3045
3.22k
    case ARM_VST4d32:
3046
3.84k
    case ARM_VST4d8_UPD:
3047
4.44k
    case ARM_VST4d16_UPD:
3048
5.20k
    case ARM_VST4d32_UPD:
3049
5.20k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 1) % 32, Address, Decoder)))
3050
0
        return MCDisassembler_Fail;
3051
5.20k
      break;
3052
3053
5.20k
    case ARM_VST3q8:
3054
556
    case ARM_VST3q16:
3055
990
    case ARM_VST3q32:
3056
1.55k
    case ARM_VST3q8_UPD:
3057
2.02k
    case ARM_VST3q16_UPD:
3058
2.64k
    case ARM_VST3q32_UPD:
3059
2.96k
    case ARM_VST4q8:
3060
3.32k
    case ARM_VST4q16:
3061
3.75k
    case ARM_VST4q32:
3062
4.03k
    case ARM_VST4q8_UPD:
3063
4.43k
    case ARM_VST4q16_UPD:
3064
5.89k
    case ARM_VST4q32_UPD:
3065
5.89k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32, Address, Decoder)))
3066
0
        return MCDisassembler_Fail;
3067
5.89k
      break;
3068
27.1k
    default:
3069
27.1k
      break;
3070
38.2k
  }
3071
3072
  // Third input register
3073
38.2k
  switch (MCInst_getOpcode(Inst)) {
3074
245
    case ARM_VST3d8:
3075
663
    case ARM_VST3d16:
3076
1.32k
    case ARM_VST3d32:
3077
1.71k
    case ARM_VST3d8_UPD:
3078
2.02k
    case ARM_VST3d16_UPD:
3079
2.41k
    case ARM_VST3d32_UPD:
3080
2.73k
    case ARM_VST4d8:
3081
2.87k
    case ARM_VST4d16:
3082
3.22k
    case ARM_VST4d32:
3083
3.84k
    case ARM_VST4d8_UPD:
3084
4.44k
    case ARM_VST4d16_UPD:
3085
5.20k
    case ARM_VST4d32_UPD:
3086
5.20k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32, Address, Decoder)))
3087
0
        return MCDisassembler_Fail;
3088
5.20k
      break;
3089
3090
5.20k
    case ARM_VST3q8:
3091
556
    case ARM_VST3q16:
3092
990
    case ARM_VST3q32:
3093
1.55k
    case ARM_VST3q8_UPD:
3094
2.02k
    case ARM_VST3q16_UPD:
3095
2.64k
    case ARM_VST3q32_UPD:
3096
2.96k
    case ARM_VST4q8:
3097
3.32k
    case ARM_VST4q16:
3098
3.75k
    case ARM_VST4q32:
3099
4.03k
    case ARM_VST4q8_UPD:
3100
4.43k
    case ARM_VST4q16_UPD:
3101
5.89k
    case ARM_VST4q32_UPD:
3102
5.89k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 4) % 32, Address, Decoder)))
3103
0
        return MCDisassembler_Fail;
3104
5.89k
      break;
3105
27.1k
    default:
3106
27.1k
      break;
3107
38.2k
  }
3108
3109
  // Fourth input register
3110
38.2k
  switch (MCInst_getOpcode(Inst)) {
3111
319
    case ARM_VST4d8:
3112
461
    case ARM_VST4d16:
3113
803
    case ARM_VST4d32:
3114
1.42k
    case ARM_VST4d8_UPD:
3115
2.02k
    case ARM_VST4d16_UPD:
3116
2.79k
    case ARM_VST4d32_UPD:
3117
2.79k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3) % 32, Address, Decoder)))
3118
0
        return MCDisassembler_Fail;
3119
2.79k
      break;
3120
3121
2.79k
    case ARM_VST4q8:
3122
678
    case ARM_VST4q16:
3123
1.10k
    case ARM_VST4q32:
3124
1.38k
    case ARM_VST4q8_UPD:
3125
1.79k
    case ARM_VST4q16_UPD:
3126
3.24k
    case ARM_VST4q32_UPD:
3127
3.24k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 6) % 32, Address, Decoder)))
3128
0
        return MCDisassembler_Fail;
3129
3.24k
      break;
3130
32.1k
    default:
3131
32.1k
      break;
3132
38.2k
  }
3133
3134
38.2k
  return S;
3135
38.2k
}
3136
3137
static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Insn,
3138
    uint64_t Address, const void *Decoder)
3139
1.65k
{
3140
1.65k
  DecodeStatus S = MCDisassembler_Success;
3141
1.65k
  unsigned Rn, Rm, align, size;
3142
1.65k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3143
1.65k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3144
1.65k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
3145
1.65k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
3146
1.65k
  align = fieldFromInstruction_4(Insn, 4, 1);
3147
1.65k
  size = fieldFromInstruction_4(Insn, 6, 2);
3148
3149
1.65k
  if (size == 0 && align == 1)
3150
2
    return MCDisassembler_Fail;
3151
3152
1.65k
  align *= (1 << size);
3153
3154
1.65k
  switch (MCInst_getOpcode(Inst)) {
3155
337
    case ARM_VLD1DUPq16: case ARM_VLD1DUPq32: case ARM_VLD1DUPq8:
3156
815
    case ARM_VLD1DUPq16wb_fixed: case ARM_VLD1DUPq16wb_register:
3157
839
    case ARM_VLD1DUPq32wb_fixed: case ARM_VLD1DUPq32wb_register:
3158
1.08k
    case ARM_VLD1DUPq8wb_fixed: case ARM_VLD1DUPq8wb_register:
3159
1.08k
      if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
3160
3
        return MCDisassembler_Fail;
3161
1.08k
      break;
3162
3163
1.08k
    default:
3164
570
      if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3165
0
        return MCDisassembler_Fail;
3166
570
      break;
3167
1.65k
  }
3168
3169
1.65k
  if (Rm != 0xF) {
3170
1.00k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3171
0
      return MCDisassembler_Fail;
3172
1.00k
  }
3173
3174
1.65k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3175
0
    return MCDisassembler_Fail;
3176
3177
1.65k
  MCOperand_CreateImm0(Inst, align);
3178
3179
  // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3180
  // variant encodes Rm == 0xf. Anything else is a register offset post-
3181
  // increment and we need to add the register operand to the instruction.
3182
1.65k
  if (Rm != 0xD && Rm != 0xF &&
3183
312
      !Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3184
0
    return MCDisassembler_Fail;
3185
3186
1.65k
  return S;
3187
1.65k
}
3188
3189
static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Insn,
3190
    uint64_t Address, const void *Decoder)
3191
6.54k
{
3192
6.54k
  DecodeStatus S = MCDisassembler_Success;
3193
6.54k
  unsigned Rn, Rm, align, size;
3194
6.54k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3195
6.54k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3196
6.54k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
3197
6.54k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
3198
6.54k
  align = fieldFromInstruction_4(Insn, 4, 1);
3199
6.54k
  size = 1 << fieldFromInstruction_4(Insn, 6, 2);
3200
6.54k
  align *= 2 * size;
3201
3202
6.54k
  switch (MCInst_getOpcode(Inst)) {
3203
1.29k
    case ARM_VLD2DUPd16: case ARM_VLD2DUPd32: case ARM_VLD2DUPd8:
3204
1.89k
    case ARM_VLD2DUPd16wb_fixed: case ARM_VLD2DUPd16wb_register:
3205
2.71k
    case ARM_VLD2DUPd32wb_fixed: case ARM_VLD2DUPd32wb_register:
3206
3.34k
    case ARM_VLD2DUPd8wb_fixed: case ARM_VLD2DUPd8wb_register:
3207
3.34k
      if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
3208
2
        return MCDisassembler_Fail;
3209
3.34k
      break;
3210
3211
3.34k
    case ARM_VLD2DUPd16x2: case ARM_VLD2DUPd32x2: case ARM_VLD2DUPd8x2:
3212
1.68k
    case ARM_VLD2DUPd16x2wb_fixed: case ARM_VLD2DUPd16x2wb_register:
3213
2.65k
    case ARM_VLD2DUPd32x2wb_fixed: case ARM_VLD2DUPd32x2wb_register:
3214
3.20k
    case ARM_VLD2DUPd8x2wb_fixed: case ARM_VLD2DUPd8x2wb_register:
3215
3.20k
      if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
3216
4
        return MCDisassembler_Fail;
3217
3.19k
      break;
3218
3219
3.19k
    default:
3220
0
      if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3221
0
        return MCDisassembler_Fail;
3222
0
      break;
3223
6.54k
  }
3224
3225
6.54k
  if (Rm != 0xF)
3226
4.05k
    MCOperand_CreateImm0(Inst, 0);
3227
3228
6.54k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3229
0
    return MCDisassembler_Fail;
3230
3231
6.54k
  MCOperand_CreateImm0(Inst, align);
3232
3233
6.54k
  if (Rm != 0xD && Rm != 0xF) {
3234
1.90k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3235
0
      return MCDisassembler_Fail;
3236
1.90k
  }
3237
3238
6.54k
  return S;
3239
6.54k
}
3240
3241
static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Insn,
3242
    uint64_t Address, const void *Decoder)
3243
1.68k
{
3244
1.68k
  DecodeStatus S = MCDisassembler_Success;
3245
1.68k
  unsigned Rn, Rm, inc;
3246
1.68k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3247
1.68k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3248
1.68k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
3249
1.68k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
3250
1.68k
  inc = fieldFromInstruction_4(Insn, 5, 1) + 1;
3251
3252
1.68k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3253
0
    return MCDisassembler_Fail;
3254
3255
1.68k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + inc) % 32, Address, Decoder)))
3256
0
    return MCDisassembler_Fail;
3257
3258
1.68k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2*inc) % 32, Address, Decoder)))
3259
0
    return MCDisassembler_Fail;
3260
3261
1.68k
  if (Rm != 0xF) {
3262
1.50k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3263
0
      return MCDisassembler_Fail;
3264
1.50k
  }
3265
3266
1.68k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3267
0
    return MCDisassembler_Fail;
3268
3269
1.68k
  MCOperand_CreateImm0(Inst, 0);
3270
3271
1.68k
  if (Rm == 0xD)
3272
616
    MCOperand_CreateReg0(Inst, 0);
3273
1.06k
  else if (Rm != 0xF) {
3274
890
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3275
0
      return MCDisassembler_Fail;
3276
890
  }
3277
3278
1.68k
  return S;
3279
1.68k
}
3280
3281
static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Insn,
3282
    uint64_t Address, const void *Decoder)
3283
2.07k
{
3284
2.07k
  DecodeStatus S = MCDisassembler_Success;
3285
2.07k
  unsigned Rn, Rm, size, inc, align;
3286
2.07k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3287
2.07k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3288
2.07k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
3289
2.07k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
3290
2.07k
  size = fieldFromInstruction_4(Insn, 6, 2);
3291
2.07k
  inc = fieldFromInstruction_4(Insn, 5, 1) + 1;
3292
2.07k
  align = fieldFromInstruction_4(Insn, 4, 1);
3293
3294
2.07k
  if (size == 0x3) {
3295
392
    if (align == 0)
3296
2
      return MCDisassembler_Fail;
3297
390
    align = 16;
3298
1.68k
  } else {
3299
1.68k
    if (size == 2) {
3300
767
      align *= 8;
3301
920
    } else {
3302
920
      size = 1 << size;
3303
920
      align *= 4 * size;
3304
920
    }
3305
1.68k
  }
3306
3307
2.07k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3308
0
    return MCDisassembler_Fail;
3309
3310
2.07k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + inc) % 32, Address, Decoder)))
3311
0
    return MCDisassembler_Fail;
3312
3313
2.07k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2*inc) % 32, Address, Decoder)))
3314
0
    return MCDisassembler_Fail;
3315
3316
2.07k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3*inc) % 32, Address, Decoder)))
3317
0
    return MCDisassembler_Fail;
3318
3319
2.07k
  if (Rm != 0xF) {
3320
1.55k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3321
0
      return MCDisassembler_Fail;
3322
1.55k
  }
3323
3324
2.07k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3325
0
    return MCDisassembler_Fail;
3326
3327
2.07k
  MCOperand_CreateImm0(Inst, align);
3328
3329
2.07k
  if (Rm == 0xD)
3330
763
    MCOperand_CreateReg0(Inst, 0);
3331
1.31k
  else if (Rm != 0xF) {
3332
796
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3333
0
      return MCDisassembler_Fail;
3334
796
  }
3335
3336
2.07k
  return S;
3337
2.07k
}
3338
3339
static DecodeStatus DecodeNEONModImmInstruction(MCInst *Inst, unsigned Insn,
3340
    uint64_t Address, const void *Decoder)
3341
4.68k
{
3342
4.68k
  DecodeStatus S = MCDisassembler_Success;
3343
4.68k
  unsigned imm, Q;
3344
4.68k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3345
4.68k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3346
4.68k
  imm = fieldFromInstruction_4(Insn, 0, 4);
3347
4.68k
  imm |= fieldFromInstruction_4(Insn, 16, 3) << 4;
3348
4.68k
  imm |= fieldFromInstruction_4(Insn, 24, 1) << 7;
3349
4.68k
  imm |= fieldFromInstruction_4(Insn, 8, 4) << 8;
3350
4.68k
  imm |= fieldFromInstruction_4(Insn, 5, 1) << 12;
3351
4.68k
  Q = fieldFromInstruction_4(Insn, 6, 1);
3352
3353
4.68k
  if (Q) {
3354
1.99k
    if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3355
6
      return MCDisassembler_Fail;
3356
2.69k
  } else {
3357
2.69k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3358
0
      return MCDisassembler_Fail;
3359
2.69k
  }
3360
3361
4.68k
  MCOperand_CreateImm0(Inst, imm);
3362
3363
4.68k
  switch (MCInst_getOpcode(Inst)) {
3364
99
    case ARM_VORRiv4i16:
3365
376
    case ARM_VORRiv2i32:
3366
579
    case ARM_VBICiv4i16:
3367
673
    case ARM_VBICiv2i32:
3368
673
      if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3369
0
        return MCDisassembler_Fail;
3370
673
      break;
3371
673
    case ARM_VORRiv8i16:
3372
608
    case ARM_VORRiv4i32:
3373
678
    case ARM_VBICiv8i16:
3374
915
    case ARM_VBICiv4i32:
3375
915
      if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3376
0
        return MCDisassembler_Fail;
3377
915
      break;
3378
3.09k
    default:
3379
3.09k
      break;
3380
4.68k
  }
3381
3382
4.68k
  return S;
3383
4.68k
}
3384
3385
static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Insn,
3386
    uint64_t Address, const void *Decoder)
3387
562
{
3388
562
  DecodeStatus S = MCDisassembler_Success;
3389
562
  unsigned Rm, size;
3390
562
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3391
562
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3392
562
  Rm = fieldFromInstruction_4(Insn, 0, 4);
3393
562
  Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4;
3394
562
  size = fieldFromInstruction_4(Insn, 18, 2);
3395
3396
562
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3397
2
    return MCDisassembler_Fail;
3398
3399
560
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3400
0
    return MCDisassembler_Fail;
3401
3402
560
  MCOperand_CreateImm0(Inst, 8 << size);
3403
3404
560
  return S;
3405
560
}
3406
3407
static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val,
3408
    uint64_t Address, const void *Decoder)
3409
3.79k
{
3410
3.79k
  MCOperand_CreateImm0(Inst, 8 - Val);
3411
3412
3.79k
  return MCDisassembler_Success;
3413
3.79k
}
3414
3415
static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val,
3416
    uint64_t Address, const void *Decoder)
3417
2.09k
{
3418
2.09k
  MCOperand_CreateImm0(Inst, 16 - Val);
3419
3420
2.09k
  return MCDisassembler_Success;
3421
2.09k
}
3422
3423
static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val,
3424
    uint64_t Address, const void *Decoder)
3425
2.43k
{
3426
2.43k
  MCOperand_CreateImm0(Inst, 32 - Val);
3427
3428
2.43k
  return MCDisassembler_Success;
3429
2.43k
}
3430
3431
static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val,
3432
    uint64_t Address, const void *Decoder)
3433
1.60k
{
3434
1.60k
  MCOperand_CreateImm0(Inst, 64 - Val);
3435
3436
1.60k
  return MCDisassembler_Success;
3437
1.60k
}
3438
3439
static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn,
3440
    uint64_t Address, const void *Decoder)
3441
3.34k
{
3442
3.34k
  DecodeStatus S = MCDisassembler_Success;
3443
3.34k
  unsigned Rn, Rm, op;
3444
3.34k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3445
3.34k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3446
3.34k
  Rn = fieldFromInstruction_4(Insn, 16, 4);
3447
3.34k
  Rn |= fieldFromInstruction_4(Insn, 7, 1) << 4;
3448
3.34k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
3449
3.34k
  Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4;
3450
3.34k
  op = fieldFromInstruction_4(Insn, 6, 1);
3451
3452
3.34k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3453
0
    return MCDisassembler_Fail;
3454
3455
3.34k
  if (op) {
3456
2.04k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3457
0
      return MCDisassembler_Fail; // Writeback
3458
2.04k
  }
3459
3460
3.34k
  switch (MCInst_getOpcode(Inst)) {
3461
418
    case ARM_VTBL2:
3462
1.01k
    case ARM_VTBX2:
3463
1.01k
      if (!Check(&S, DecodeDPairRegisterClass(Inst, Rn, Address, Decoder)))
3464
2
        return MCDisassembler_Fail;
3465
1.01k
      break;
3466
2.33k
    default:
3467
2.33k
      if (!Check(&S, DecodeDPRRegisterClass(Inst, Rn, Address, Decoder)))
3468
0
        return MCDisassembler_Fail;
3469
3.34k
  }
3470
3471
3.34k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3472
0
    return MCDisassembler_Fail;
3473
3474
3.34k
  return S;
3475
3.34k
}
3476
3477
static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn,
3478
    uint64_t Address, const void *Decoder)
3479
43.0k
{
3480
43.0k
  DecodeStatus S = MCDisassembler_Success;
3481
43.0k
  unsigned dst = fieldFromInstruction_2(Insn, 8, 3);
3482
43.0k
  unsigned imm = fieldFromInstruction_2(Insn, 0, 8);
3483
3484
43.0k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
3485
0
    return MCDisassembler_Fail;
3486
3487
43.0k
  switch(MCInst_getOpcode(Inst)) {
3488
0
    default:
3489
0
      return MCDisassembler_Fail;
3490
21.9k
    case ARM_tADR:
3491
21.9k
      break; // tADR does not explicitly represent the PC as an operand.
3492
21.0k
    case ARM_tADDrSPi:
3493
21.0k
      MCOperand_CreateReg0(Inst, ARM_SP);
3494
21.0k
      break;
3495
43.0k
  }
3496
3497
43.0k
  MCOperand_CreateImm0(Inst, imm);
3498
3499
43.0k
  return S;
3500
43.0k
}
3501
3502
static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val,
3503
    uint64_t Address, const void *Decoder)
3504
5.03k
{
3505
5.03k
  MCOperand_CreateImm0(Inst, SignExtend32(Val << 1, 12));
3506
3507
5.03k
  return MCDisassembler_Success;
3508
5.03k
}
3509
3510
static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val,
3511
    uint64_t Address, const void *Decoder)
3512
1.57k
{
3513
1.57k
  MCOperand_CreateImm0(Inst, SignExtend32(Val, 21));
3514
3515
1.57k
  return MCDisassembler_Success;
3516
1.57k
}
3517
3518
static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val,
3519
    uint64_t Address, const void *Decoder)
3520
3.20k
{
3521
3.20k
  MCOperand_CreateImm0(Inst, Val << 1);
3522
3523
3.20k
  return MCDisassembler_Success;
3524
3.20k
}
3525
3526
static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val,
3527
    uint64_t Address, const void *Decoder)
3528
32.6k
{
3529
32.6k
  DecodeStatus S = MCDisassembler_Success;
3530
32.6k
  unsigned Rn = fieldFromInstruction_4(Val, 0, 3);
3531
32.6k
  unsigned Rm = fieldFromInstruction_4(Val, 3, 3);
3532
3533
32.6k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
3534
0
    return MCDisassembler_Fail;
3535
3536
32.6k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
3537
0
    return MCDisassembler_Fail;
3538
3539
32.6k
  return S;
3540
32.6k
}
3541
3542
static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val,
3543
    uint64_t Address, const void *Decoder)
3544
175k
{
3545
175k
  DecodeStatus S = MCDisassembler_Success;
3546
175k
  unsigned Rn = fieldFromInstruction_4(Val, 0, 3);
3547
175k
  unsigned imm = fieldFromInstruction_4(Val, 3, 5);
3548
3549
175k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
3550
0
    return MCDisassembler_Fail;
3551
3552
175k
  MCOperand_CreateImm0(Inst, imm);
3553
3554
175k
  return S;
3555
175k
}
3556
3557
static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val,
3558
    uint64_t Address, const void *Decoder)
3559
28.5k
{
3560
28.5k
  unsigned imm = Val << 2;
3561
3562
28.5k
  MCOperand_CreateImm0(Inst, imm);
3563
  //tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4, Decoder);
3564
3565
28.5k
  return MCDisassembler_Success;
3566
28.5k
}
3567
3568
static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val,
3569
    uint64_t Address, const void *Decoder)
3570
37.2k
{
3571
37.2k
  MCOperand_CreateReg0(Inst, ARM_SP);
3572
37.2k
  MCOperand_CreateImm0(Inst, Val);
3573
3574
37.2k
  return MCDisassembler_Success;
3575
37.2k
}
3576
3577
static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val,
3578
    uint64_t Address, const void *Decoder)
3579
2.70k
{
3580
2.70k
  DecodeStatus S = MCDisassembler_Success;
3581
2.70k
  unsigned Rn = fieldFromInstruction_4(Val, 6, 4);
3582
2.70k
  unsigned Rm = fieldFromInstruction_4(Val, 2, 4);
3583
2.70k
  unsigned imm = fieldFromInstruction_4(Val, 0, 2);
3584
3585
  // Thumb stores cannot use PC as dest register.
3586
2.70k
  switch (MCInst_getOpcode(Inst)) {
3587
455
    case ARM_t2STRHs:
3588
885
    case ARM_t2STRBs:
3589
1.16k
    case ARM_t2STRs:
3590
1.16k
      if (Rn == 15)
3591
2
        return MCDisassembler_Fail;
3592
2.70k
    default:
3593
2.70k
      break;
3594
2.70k
  }
3595
3596
2.70k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3597
0
    return MCDisassembler_Fail;
3598
3599
2.70k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
3600
0
    return MCDisassembler_Fail;
3601
3602
2.70k
  MCOperand_CreateImm0(Inst, imm);
3603
3604
2.70k
  return S;
3605
2.70k
}
3606
3607
static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Insn,
3608
    uint64_t Address, const void *Decoder)
3609
3.27k
{
3610
3.27k
  DecodeStatus S = MCDisassembler_Success;
3611
3.27k
  unsigned addrmode;
3612
3.27k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
3613
3.27k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3614
3.27k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
3615
3.27k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
3616
3617
3.27k
  if (Rn == 15) {
3618
1.73k
    switch (MCInst_getOpcode(Inst)) {
3619
202
      case ARM_t2LDRBs:
3620
202
        MCInst_setOpcode(Inst, ARM_t2LDRBpci);
3621
202
        break;
3622
242
      case ARM_t2LDRHs:
3623
242
        MCInst_setOpcode(Inst, ARM_t2LDRHpci);
3624
242
        break;
3625
68
      case ARM_t2LDRSHs:
3626
68
        MCInst_setOpcode(Inst, ARM_t2LDRSHpci);
3627
68
        break;
3628
212
      case ARM_t2LDRSBs:
3629
212
        MCInst_setOpcode(Inst, ARM_t2LDRSBpci);
3630
212
        break;
3631
261
      case ARM_t2LDRs:
3632
261
        MCInst_setOpcode(Inst, ARM_t2LDRpci);
3633
261
        break;
3634
198
      case ARM_t2PLDs:
3635
198
        MCInst_setOpcode(Inst, ARM_t2PLDpci);
3636
198
        break;
3637
555
      case ARM_t2PLIs:
3638
555
        MCInst_setOpcode(Inst, ARM_t2PLIpci);
3639
555
        break;
3640
1
      default:
3641
1
        return MCDisassembler_Fail;
3642
1.73k
    }
3643
3644
1.73k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3645
1.73k
  }
3646
3647
1.53k
  if (Rt == 15) {
3648
955
    switch (MCInst_getOpcode(Inst)) {
3649
1
      case ARM_t2LDRSHs:
3650
1
        return MCDisassembler_Fail;
3651
0
      case ARM_t2LDRHs:
3652
0
        MCInst_setOpcode(Inst, ARM_t2PLDWs);
3653
0
        break;
3654
0
      case ARM_t2LDRSBs:
3655
0
        MCInst_setOpcode(Inst, ARM_t2PLIs);
3656
954
      default:
3657
954
        break;
3658
955
    }
3659
955
  }
3660
3661
1.53k
  switch (MCInst_getOpcode(Inst)) {
3662
470
    case ARM_t2PLDs:
3663
470
      break;
3664
280
    case ARM_t2PLIs:
3665
280
      if (!hasV7Ops)
3666
0
        return MCDisassembler_Fail;
3667
280
      break;
3668
280
    case ARM_t2PLDWs:
3669
198
      if (!hasV7Ops || !hasMP)
3670
0
        return MCDisassembler_Fail;
3671
198
      break;
3672
590
    default:
3673
590
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3674
0
        return MCDisassembler_Fail;
3675
1.53k
  }
3676
3677
1.53k
  addrmode = fieldFromInstruction_4(Insn, 4, 2);
3678
1.53k
  addrmode |= fieldFromInstruction_4(Insn, 0, 4) << 2;
3679
1.53k
  addrmode |= fieldFromInstruction_4(Insn, 16, 4) << 6;
3680
3681
1.53k
  if (!Check(&S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
3682
0
    return MCDisassembler_Fail;
3683
3684
1.53k
  return S;
3685
1.53k
}
3686
3687
static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn,
3688
    uint64_t Address, const void* Decoder)
3689
3.45k
{
3690
3.45k
  DecodeStatus S = MCDisassembler_Success;
3691
3.45k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3692
3.45k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
3693
3.45k
  unsigned U = fieldFromInstruction_4(Insn, 9, 1);
3694
3.45k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
3695
3.45k
  unsigned add = fieldFromInstruction_4(Insn, 9, 1);
3696
3.45k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
3697
3.45k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
3698
3699
3.45k
  imm |= (U << 8);
3700
3.45k
  imm |= (Rn << 9);
3701
3702
3.45k
  if (Rn == 15) {
3703
2.37k
    switch (MCInst_getOpcode(Inst)) {
3704
345
      case ARM_t2LDRi8:
3705
345
        MCInst_setOpcode(Inst, ARM_t2LDRpci);
3706
345
        break;
3707
402
      case ARM_t2LDRBi8:
3708
402
        MCInst_setOpcode(Inst, ARM_t2LDRBpci);
3709
402
        break;
3710
153
      case ARM_t2LDRSBi8:
3711
153
        MCInst_setOpcode(Inst, ARM_t2LDRSBpci);
3712
153
        break;
3713
426
      case ARM_t2LDRHi8:
3714
426
        MCInst_setOpcode(Inst, ARM_t2LDRHpci);
3715
426
        break;
3716
463
      case ARM_t2LDRSHi8:
3717
463
        MCInst_setOpcode(Inst, ARM_t2LDRSHpci);
3718
463
        break;
3719
316
      case ARM_t2PLDi8:
3720
316
        MCInst_setOpcode(Inst, ARM_t2PLDpci);
3721
316
        break;
3722
266
      case ARM_t2PLIi8:
3723
266
        MCInst_setOpcode(Inst, ARM_t2PLIpci);
3724
266
        break;
3725
3
      default:
3726
3
        return MCDisassembler_Fail;
3727
2.37k
    }
3728
3729
2.37k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3730
2.37k
  }
3731
3732
1.08k
  if (Rt == 15) {
3733
650
    switch (MCInst_getOpcode(Inst)) {
3734
2
      case ARM_t2LDRSHi8:
3735
2
        return MCDisassembler_Fail;
3736
0
      case ARM_t2LDRHi8:
3737
0
        if (!add)
3738
0
          MCInst_setOpcode(Inst, ARM_t2PLDWi8);
3739
0
        break;
3740
0
      case ARM_t2LDRSBi8:
3741
0
        MCInst_setOpcode(Inst, ARM_t2PLIi8);
3742
0
        break;
3743
648
      default:
3744
648
        break;
3745
650
    }
3746
650
  }
3747
3748
1.08k
  switch (MCInst_getOpcode(Inst)) {
3749
155
    case ARM_t2PLDi8:
3750
155
      break;
3751
152
    case ARM_t2PLIi8:
3752
152
      if (!hasV7Ops)
3753
0
        return MCDisassembler_Fail;
3754
152
      break;
3755
319
    case ARM_t2PLDWi8:
3756
319
      if (!hasV7Ops || !hasMP)
3757
0
        return MCDisassembler_Fail;
3758
319
      break;
3759
454
    default:
3760
454
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3761
0
        return MCDisassembler_Fail;
3762
1.08k
  }
3763
3764
1.08k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
3765
0
    return MCDisassembler_Fail;
3766
3767
1.08k
  return S;
3768
1.08k
}
3769
3770
static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn,
3771
    uint64_t Address, const void* Decoder)
3772
5.30k
{
3773
5.30k
  DecodeStatus S = MCDisassembler_Success;
3774
5.30k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3775
5.30k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
3776
5.30k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
3777
5.30k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
3778
5.30k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
3779
3780
5.30k
  imm |= (Rn << 13);
3781
3782
5.30k
  if (Rn == 15) {
3783
2.61k
    switch (MCInst_getOpcode(Inst)) {
3784
314
      case ARM_t2LDRi12:
3785
314
        MCInst_setOpcode(Inst, ARM_t2LDRpci);
3786
314
        break;
3787
318
      case ARM_t2LDRHi12:
3788
318
        MCInst_setOpcode(Inst, ARM_t2LDRHpci);
3789
318
        break;
3790
310
      case ARM_t2LDRSHi12:
3791
310
        MCInst_setOpcode(Inst, ARM_t2LDRSHpci);
3792
310
        break;
3793
389
      case ARM_t2LDRBi12:
3794
389
        MCInst_setOpcode(Inst, ARM_t2LDRBpci);
3795
389
        break;
3796
389
      case ARM_t2LDRSBi12:
3797
389
        MCInst_setOpcode(Inst, ARM_t2LDRSBpci);
3798
389
        break;
3799
574
      case ARM_t2PLDi12:
3800
574
        MCInst_setOpcode(Inst, ARM_t2PLDpci);
3801
574
        break;
3802
317
      case ARM_t2PLIi12:
3803
317
        MCInst_setOpcode(Inst, ARM_t2PLIpci);
3804
317
        break;
3805
3
      default:
3806
3
        return MCDisassembler_Fail;
3807
2.61k
    }
3808
2.61k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3809
2.61k
  }
3810
3811
2.69k
  if (Rt == 15) {
3812
1.15k
    switch (MCInst_getOpcode(Inst)) {
3813
3
      case ARM_t2LDRSHi12:
3814
3
        return MCDisassembler_Fail;
3815
0
      case ARM_t2LDRHi12:
3816
0
        MCInst_setOpcode(Inst, ARM_t2PLDWi12);
3817
0
        break;
3818
0
      case ARM_t2LDRSBi12:
3819
0
        MCInst_setOpcode(Inst, ARM_t2PLIi12);
3820
0
        break;
3821
1.15k
      default:
3822
1.15k
        break;
3823
1.15k
    }
3824
1.15k
  }
3825
3826
2.69k
  switch (MCInst_getOpcode(Inst)) {
3827
545
    case ARM_t2PLDi12:
3828
545
      break;
3829
162
    case ARM_t2PLIi12:
3830
162
      if (!hasV7Ops)
3831
0
        return MCDisassembler_Fail;
3832
162
      break;
3833
422
    case ARM_t2PLDWi12:
3834
422
      if (!hasV7Ops || !hasMP)
3835
0
        return MCDisassembler_Fail;
3836
422
      break;
3837
1.56k
    default:
3838
1.56k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3839
0
        return MCDisassembler_Fail;
3840
2.69k
  }
3841
3842
2.69k
  if (!Check(&S, DecodeT2AddrModeImm12(Inst, imm, Address, Decoder)))
3843
0
    return MCDisassembler_Fail;
3844
3845
2.69k
  return S;
3846
2.69k
}
3847
3848
static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn,
3849
    uint64_t Address, const void* Decoder)
3850
4.63k
{
3851
4.63k
  DecodeStatus S = MCDisassembler_Success;
3852
3853
4.63k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3854
4.63k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
3855
4.63k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
3856
4.63k
  imm |= (Rn << 9);
3857
3858
4.63k
  if (Rn == 15) {
3859
2.07k
    switch (MCInst_getOpcode(Inst)) {
3860
417
      case ARM_t2LDRT:
3861
417
        MCInst_setOpcode(Inst, ARM_t2LDRpci);
3862
417
        break;
3863
568
      case ARM_t2LDRBT:
3864
568
        MCInst_setOpcode(Inst, ARM_t2LDRBpci);
3865
568
        break;
3866
347
      case ARM_t2LDRHT:
3867
347
        MCInst_setOpcode(Inst, ARM_t2LDRHpci);
3868
347
        break;
3869
461
      case ARM_t2LDRSBT:
3870
461
        MCInst_setOpcode(Inst, ARM_t2LDRSBpci);
3871
461
        break;
3872
282
      case ARM_t2LDRSHT:
3873
282
        MCInst_setOpcode(Inst, ARM_t2LDRSHpci);
3874
282
        break;
3875
0
      default:
3876
0
        return MCDisassembler_Fail;
3877
2.07k
    }
3878
3879
2.07k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3880
2.07k
  }
3881
3882
2.56k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
3883
0
    return MCDisassembler_Fail;
3884
3885
2.56k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
3886
0
    return MCDisassembler_Fail;
3887
3888
2.56k
  return S;
3889
2.56k
}
3890
3891
static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn,
3892
    uint64_t Address, const void* Decoder)
3893
17.0k
{
3894
17.0k
  DecodeStatus S = MCDisassembler_Success;
3895
17.0k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
3896
17.0k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
3897
17.0k
  int imm = fieldFromInstruction_4(Insn, 0, 12);
3898
17.0k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
3899
3900
17.0k
  if (Rt == 15) {
3901
6.06k
    switch (MCInst_getOpcode(Inst)) {
3902
601
      case ARM_t2LDRBpci:
3903
1.04k
      case ARM_t2LDRHpci:
3904
1.04k
        MCInst_setOpcode(Inst, ARM_t2PLDpci);
3905
1.04k
        break;
3906
381
      case ARM_t2LDRSBpci:
3907
381
        MCInst_setOpcode(Inst, ARM_t2PLIpci);
3908
381
        break;
3909
11
      case ARM_t2LDRSHpci:
3910
11
        return MCDisassembler_Fail;
3911
4.62k
      default:
3912
4.62k
        break;
3913
6.06k
    }
3914
6.06k
  }
3915
3916
17.0k
  switch(MCInst_getOpcode(Inst)) {
3917
3.07k
    case ARM_t2PLDpci:
3918
3.07k
      break;
3919
2.74k
    case ARM_t2PLIpci:
3920
2.74k
      if (!hasV7Ops)
3921
0
        return MCDisassembler_Fail;
3922
2.74k
      break;
3923
11.2k
    default:
3924
11.2k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3925
0
        return MCDisassembler_Fail;
3926
17.0k
  }
3927
3928
17.0k
  if (!U) {
3929
    // Special case for #-0.
3930
14.4k
    if (imm == 0)
3931
2.31k
      imm = INT32_MIN;
3932
12.1k
    else
3933
12.1k
      imm = -imm;
3934
14.4k
  }
3935
3936
17.0k
  MCOperand_CreateImm0(Inst, imm);
3937
3938
17.0k
  return S;
3939
17.0k
}
3940
3941
static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val,
3942
    uint64_t Address, const void *Decoder)
3943
17.1k
{
3944
17.1k
  if (Val == 0)
3945
1.99k
    MCOperand_CreateImm0(Inst, INT32_MIN);
3946
15.2k
  else {
3947
15.2k
    int imm = Val & 0xFF;
3948
3949
15.2k
    if (!(Val & 0x100)) imm *= -1;
3950
3951
15.2k
    MCOperand_CreateImm0(Inst, imm * 4);
3952
15.2k
  }
3953
3954
17.1k
  return MCDisassembler_Success;
3955
17.1k
}
3956
3957
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val,
3958
    uint64_t Address, const void *Decoder)
3959
13.3k
{
3960
13.3k
  DecodeStatus S = MCDisassembler_Success;
3961
13.3k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
3962
13.3k
  unsigned imm = fieldFromInstruction_4(Val, 0, 9);
3963
3964
13.3k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3965
0
    return MCDisassembler_Fail;
3966
3967
13.3k
  if (!Check(&S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
3968
0
    return MCDisassembler_Fail;
3969
3970
13.3k
  return S;
3971
13.3k
}
3972
3973
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst,unsigned Val,
3974
    uint64_t Address, const void *Decoder)
3975
1.54k
{
3976
1.54k
  DecodeStatus S = MCDisassembler_Success;
3977
1.54k
  unsigned Rn = fieldFromInstruction_4(Val, 8, 4);
3978
1.54k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
3979
3980
1.54k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
3981
0
    return MCDisassembler_Fail;
3982
3983
1.54k
  MCOperand_CreateImm0(Inst, imm);
3984
3985
1.54k
  return S;
3986
1.54k
}
3987
3988
static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val,
3989
    uint64_t Address, const void *Decoder)
3990
9.81k
{
3991
9.81k
  int imm = Val & 0xFF;
3992
3993
9.81k
  if (Val == 0)
3994
1.14k
    imm = INT32_MIN;
3995
8.67k
  else if (!(Val & 0x100))
3996
3.54k
    imm *= -1;
3997
3998
9.81k
  MCOperand_CreateImm0(Inst, imm);
3999
4000
9.81k
  return MCDisassembler_Success;
4001
9.81k
}
4002
4003
static DecodeStatus DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val,
4004
    uint64_t Address, const void *Decoder)
4005
9.82k
{
4006
9.82k
  DecodeStatus S = MCDisassembler_Success;
4007
4008
9.82k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
4009
9.82k
  unsigned imm = fieldFromInstruction_4(Val, 0, 9);
4010
4011
  // Thumb stores cannot use PC as dest register.
4012
9.82k
  switch (MCInst_getOpcode(Inst)) {
4013
206
    case ARM_t2STRT:
4014
539
    case ARM_t2STRBT:
4015
1.05k
    case ARM_t2STRHT:
4016
1.37k
    case ARM_t2STRi8:
4017
1.88k
    case ARM_t2STRHi8:
4018
2.14k
    case ARM_t2STRBi8:
4019
2.14k
      if (Rn == 15)
4020
9
        return MCDisassembler_Fail;
4021
2.13k
      break;
4022
7.67k
    default:
4023
7.67k
      break;
4024
9.82k
  }
4025
4026
  // Some instructions always use an additive offset.
4027
9.81k
  switch (MCInst_getOpcode(Inst)) {
4028
797
    case ARM_t2LDRT:
4029
904
    case ARM_t2LDRBT:
4030
1.72k
    case ARM_t2LDRHT:
4031
2.00k
    case ARM_t2LDRSBT:
4032
2.56k
    case ARM_t2LDRSHT:
4033
2.76k
    case ARM_t2STRT:
4034
3.10k
    case ARM_t2STRBT:
4035
3.61k
    case ARM_t2STRHT:
4036
3.61k
      imm |= 0x100;
4037
3.61k
      break;
4038
6.20k
    default:
4039
6.20k
      break;
4040
9.81k
  }
4041
4042
9.81k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4043
0
    return MCDisassembler_Fail;
4044
4045
9.81k
  if (!Check(&S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
4046
0
    return MCDisassembler_Fail;
4047
4048
9.81k
  return S;
4049
9.81k
}
4050
4051
static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Insn,
4052
    uint64_t Address, const void *Decoder)
4053
8.33k
{
4054
8.33k
  DecodeStatus S = MCDisassembler_Success;
4055
8.33k
  unsigned load;
4056
8.33k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4057
8.33k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4058
8.33k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
4059
8.33k
  addr |= fieldFromInstruction_4(Insn, 9, 1) << 8;
4060
8.33k
  addr |= Rn << 9;
4061
8.33k
  load = fieldFromInstruction_4(Insn, 20, 1);
4062
4063
8.33k
  if (Rn == 15) {
4064
4.29k
    switch (MCInst_getOpcode(Inst)) {
4065
486
      case ARM_t2LDR_PRE:
4066
766
      case ARM_t2LDR_POST:
4067
766
        MCInst_setOpcode(Inst, ARM_t2LDRpci);
4068
766
        break;
4069
716
      case ARM_t2LDRB_PRE:
4070
1.02k
      case ARM_t2LDRB_POST:
4071
1.02k
        MCInst_setOpcode(Inst, ARM_t2LDRBpci);
4072
1.02k
        break;
4073
522
      case ARM_t2LDRH_PRE:
4074
1.09k
      case ARM_t2LDRH_POST:
4075
1.09k
        MCInst_setOpcode(Inst, ARM_t2LDRHpci);
4076
1.09k
        break;
4077
371
      case ARM_t2LDRSB_PRE:
4078
993
      case ARM_t2LDRSB_POST:
4079
993
        if (Rt == 15)
4080
413
          MCInst_setOpcode(Inst, ARM_t2PLIpci);
4081
580
        else
4082
580
          MCInst_setOpcode(Inst, ARM_t2LDRSBpci);
4083
993
        break;
4084
269
      case ARM_t2LDRSH_PRE:
4085
415
      case ARM_t2LDRSH_POST:
4086
415
        MCInst_setOpcode(Inst, ARM_t2LDRSHpci);
4087
415
        break;
4088
7
      default:
4089
7
        return MCDisassembler_Fail;
4090
4.29k
    }
4091
4092
4.29k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4093
4.29k
  }
4094
4095
4.03k
  if (!load) {
4096
2.03k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4097
0
      return MCDisassembler_Fail;
4098
2.03k
  }
4099
4100
4.03k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4101
0
    return MCDisassembler_Fail;
4102
4103
4.03k
  if (load) {
4104
1.99k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4105
0
      return MCDisassembler_Fail;
4106
1.99k
  }
4107
4108
4.03k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder)))
4109
0
    return MCDisassembler_Fail;
4110
4111
4.03k
  return S;
4112
4.03k
}
4113
4114
static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val,
4115
    uint64_t Address, const void *Decoder)
4116
2.43k
{
4117
2.43k
  DecodeStatus S = MCDisassembler_Success;
4118
2.43k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
4119
2.43k
  unsigned imm = fieldFromInstruction_4(Val, 0, 12);
4120
4121
  // Thumb stores cannot use PC as dest register.
4122
2.43k
  switch (MCInst_getOpcode(Inst)) {
4123
313
    case ARM_t2STRi12:
4124
698
    case ARM_t2STRBi12:
4125
1.00k
    case ARM_t2STRHi12:
4126
1.00k
      if (Rn == 15)
4127
3
        return MCDisassembler_Fail;
4128
2.43k
    default:
4129
2.43k
      break;
4130
2.43k
  }
4131
4132
2.43k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4133
0
    return MCDisassembler_Fail;
4134
4135
2.43k
  MCOperand_CreateImm0(Inst, imm);
4136
4137
2.43k
  return S;
4138
2.43k
}
4139
4140
static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Insn,
4141
    uint64_t Address, const void *Decoder)
4142
3.04k
{
4143
3.04k
  unsigned imm = fieldFromInstruction_2(Insn, 0, 7);
4144
4145
3.04k
  MCOperand_CreateReg0(Inst, ARM_SP);
4146
3.04k
  MCOperand_CreateReg0(Inst, ARM_SP);
4147
3.04k
  MCOperand_CreateImm0(Inst, imm);
4148
4149
3.04k
  return MCDisassembler_Success;
4150
3.04k
}
4151
4152
static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn,
4153
    uint64_t Address, const void *Decoder)
4154
1.41k
{
4155
1.41k
  DecodeStatus S = MCDisassembler_Success;
4156
4157
1.41k
  if (MCInst_getOpcode(Inst) == ARM_tADDrSP) {
4158
904
    unsigned Rdm = fieldFromInstruction_2(Insn, 0, 3);
4159
904
    Rdm |= fieldFromInstruction_2(Insn, 7, 1) << 3;
4160
4161
904
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
4162
0
      return MCDisassembler_Fail;
4163
4164
904
    MCOperand_CreateReg0(Inst, ARM_SP);
4165
4166
904
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
4167
0
      return MCDisassembler_Fail;
4168
904
  } else if (MCInst_getOpcode(Inst) == ARM_tADDspr) {
4169
509
    unsigned Rm = fieldFromInstruction_2(Insn, 3, 4);
4170
4171
509
    MCOperand_CreateReg0(Inst, ARM_SP);
4172
509
    MCOperand_CreateReg0(Inst, ARM_SP);
4173
4174
509
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4175
0
      return MCDisassembler_Fail;
4176
509
  }
4177
4178
1.41k
  return S;
4179
1.41k
}
4180
4181
static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn,
4182
    uint64_t Address, const void *Decoder)
4183
602
{
4184
602
  unsigned imod = fieldFromInstruction_2(Insn, 4, 1) | 0x2;
4185
602
  unsigned flags = fieldFromInstruction_2(Insn, 0, 3);
4186
4187
602
  MCOperand_CreateImm0(Inst, imod);
4188
602
  MCOperand_CreateImm0(Inst, flags);
4189
4190
602
  return MCDisassembler_Success;
4191
602
}
4192
4193
static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn,
4194
    uint64_t Address, const void *Decoder)
4195
4.11k
{
4196
4.11k
  DecodeStatus S = MCDisassembler_Success;
4197
4.11k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4198
4.11k
  unsigned add = fieldFromInstruction_4(Insn, 4, 1);
4199
4200
4.11k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
4201
0
    return MCDisassembler_Fail;
4202
4203
4.11k
  MCOperand_CreateImm0(Inst, add);
4204
4205
4.11k
  return S;
4206
4.11k
}
4207
4208
static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Val,
4209
    uint64_t Address, const void *Decoder)
4210
535
{
4211
  // Val is passed in as S:J1:J2:imm10H:imm10L:'0'
4212
  // Note only one trailing zero not two.  Also the J1 and J2 values are from
4213
  // the encoded instruction.  So here change to I1 and I2 values via:
4214
  // I1 = NOT(J1 EOR S);
4215
  // I2 = NOT(J2 EOR S);
4216
  // and build the imm32 with two trailing zeros as documented:
4217
  // imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32);
4218
535
  unsigned S = (Val >> 23) & 1;
4219
535
  unsigned J1 = (Val >> 22) & 1;
4220
535
  unsigned J2 = (Val >> 21) & 1;
4221
535
  unsigned I1 = !(J1 ^ S);
4222
535
  unsigned I2 = !(J2 ^ S);
4223
535
  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4224
535
  int imm32 = SignExtend32(tmp << 1, 25);
4225
4226
535
  MCOperand_CreateImm0(Inst, imm32);
4227
4228
535
  return MCDisassembler_Success;
4229
535
}
4230
4231
static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Val,
4232
    uint64_t Address, const void *Decoder)
4233
12.6k
{
4234
12.6k
  if (Val == 0xA || Val == 0xB)
4235
1.07k
    return MCDisassembler_Fail;
4236
4237
11.5k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops) && !(Val == 14 || Val == 15))
4238
8
    return MCDisassembler_Fail;
4239
4240
11.5k
  MCOperand_CreateImm0(Inst, Val);
4241
4242
11.5k
  return MCDisassembler_Success;
4243
11.5k
}
4244
4245
static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Insn,
4246
    uint64_t Address, const void *Decoder)
4247
879
{
4248
879
  DecodeStatus S = MCDisassembler_Success;
4249
879
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4250
879
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4251
4252
879
  if (Rn == ARM_SP) S = MCDisassembler_SoftFail;
4253
4254
879
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4255
0
    return MCDisassembler_Fail;
4256
4257
879
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
4258
0
    return MCDisassembler_Fail;
4259
4260
879
  return S;
4261
879
}
4262
4263
static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Insn,
4264
    uint64_t Address, const void *Decoder)
4265
4.35k
{
4266
4.35k
  DecodeStatus S = MCDisassembler_Success;
4267
4.35k
  unsigned brtarget;
4268
4.35k
  unsigned pred = fieldFromInstruction_4(Insn, 22, 4);
4269
4270
4.35k
  if (pred == 0xE || pred == 0xF) {
4271
208
    unsigned imm;
4272
208
    unsigned opc = fieldFromInstruction_4(Insn, 4, 28);
4273
208
    switch (opc) {
4274
208
      default:
4275
208
        return MCDisassembler_Fail;
4276
0
      case 0xf3bf8f4:
4277
0
        MCInst_setOpcode(Inst, ARM_t2DSB);
4278
0
        break;
4279
0
      case 0xf3bf8f5:
4280
0
        MCInst_setOpcode(Inst, ARM_t2DMB);
4281
0
        break;
4282
0
      case 0xf3bf8f6:
4283
0
        MCInst_setOpcode(Inst, ARM_t2ISB);
4284
0
        break;
4285
208
    }
4286
4287
0
    imm = fieldFromInstruction_4(Insn, 0, 4);
4288
0
    return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
4289
208
  }
4290
4291
4.14k
  brtarget = fieldFromInstruction_4(Insn, 0, 11) << 1;
4292
4.14k
  brtarget |= fieldFromInstruction_4(Insn, 11, 1) << 19;
4293
4.14k
  brtarget |= fieldFromInstruction_4(Insn, 13, 1) << 18;
4294
4.14k
  brtarget |= fieldFromInstruction_4(Insn, 16, 6) << 12;
4295
4.14k
  brtarget |= fieldFromInstruction_4(Insn, 26, 1) << 20;
4296
4297
4.14k
  if (!Check(&S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
4298
0
    return MCDisassembler_Fail;
4299
4300
4.14k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4301
0
    return MCDisassembler_Fail;
4302
4303
4.14k
  return S;
4304
4.14k
}
4305
4306
// Decode a shifted immediate operand.  These basically consist
4307
// of an 8-bit value, and a 4-bit directive that specifies either
4308
// a splat operation or a rotation.
4309
static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val,
4310
    uint64_t Address, const void *Decoder)
4311
9.12k
{
4312
9.12k
  unsigned ctrl = fieldFromInstruction_4(Val, 10, 2);
4313
4314
9.12k
  if (ctrl == 0) {
4315
4.68k
    unsigned byte = fieldFromInstruction_4(Val, 8, 2);
4316
4.68k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8);
4317
4318
4.68k
    switch (byte) {
4319
1.88k
      case 0:
4320
1.88k
        MCOperand_CreateImm0(Inst, imm);
4321
1.88k
        break;
4322
1.14k
      case 1:
4323
1.14k
        MCOperand_CreateImm0(Inst, (imm << 16) | imm);
4324
1.14k
        break;
4325
969
      case 2:
4326
969
        MCOperand_CreateImm0(Inst, (imm << 24) | (imm << 8));
4327
969
        break;
4328
689
      case 3:
4329
689
        MCOperand_CreateImm0(Inst, (imm << 24) | (imm << 16) | (imm << 8)  |  imm);
4330
689
        break;
4331
4.68k
    }
4332
4.68k
  } else {
4333
4.44k
    unsigned unrot = fieldFromInstruction_4(Val, 0, 7) | 0x80;
4334
4.44k
    unsigned rot = fieldFromInstruction_4(Val, 7, 5);
4335
4.44k
    unsigned imm = (unrot >> rot) | (unrot << ((32 - rot) & 31));
4336
4337
4.44k
    MCOperand_CreateImm0(Inst, imm);
4338
4.44k
  }
4339
4340
9.12k
  return MCDisassembler_Success;
4341
9.12k
}
4342
4343
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst, unsigned Val,
4344
    uint64_t Address, const void *Decoder)
4345
10.5k
{
4346
10.5k
  MCOperand_CreateImm0(Inst, SignExtend32(Val << 1, 9));
4347
4348
10.5k
  return MCDisassembler_Success;
4349
10.5k
}
4350
4351
static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val,
4352
    uint64_t Address, const void *Decoder)
4353
2.17k
{
4354
  // Val is passed in as S:J1:J2:imm10:imm11
4355
  // Note no trailing zero after imm11.  Also the J1 and J2 values are from
4356
  // the encoded instruction.  So here change to I1 and I2 values via:
4357
  // I1 = NOT(J1 EOR S);
4358
  // I2 = NOT(J2 EOR S);
4359
  // and build the imm32 with one trailing zero as documented:
4360
  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
4361
2.17k
  unsigned S = (Val >> 23) & 1;
4362
2.17k
  unsigned J1 = (Val >> 22) & 1;
4363
2.17k
  unsigned J2 = (Val >> 21) & 1;
4364
2.17k
  unsigned I1 = !(J1 ^ S);
4365
2.17k
  unsigned I2 = !(J2 ^ S);
4366
2.17k
  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4367
2.17k
  int imm32 = SignExtend32(tmp << 1, 25);
4368
4369
2.17k
  MCOperand_CreateImm0(Inst, imm32);
4370
4371
2.17k
  return MCDisassembler_Success;
4372
2.17k
}
4373
4374
static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Val,
4375
    uint64_t Address, const void *Decoder)
4376
7.80k
{
4377
7.80k
  if (Val & ~0xf)
4378
0
    return MCDisassembler_Fail;
4379
4380
7.80k
  MCOperand_CreateImm0(Inst, Val);
4381
4382
7.80k
  return MCDisassembler_Success;
4383
7.80k
}
4384
4385
static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Val,
4386
    uint64_t Address, const void *Decoder)
4387
3.81k
{
4388
3.81k
  if (Val & ~0xf)
4389
0
    return MCDisassembler_Fail;
4390
4391
3.81k
  MCOperand_CreateImm0(Inst, Val);
4392
4393
3.81k
  return MCDisassembler_Success;
4394
3.81k
}
4395
4396
static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Val,
4397
    uint64_t Address, const void *Decoder)
4398
10.1k
{
4399
10.1k
  DecodeStatus S = MCDisassembler_Success;
4400
4401
10.1k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMClass)) {
4402
7.68k
    unsigned ValLow = Val & 0xff;
4403
4404
    // Validate the SYSm value first.
4405
7.68k
    switch (ValLow) {
4406
416
      case  0: // apsr
4407
623
      case  1: // iapsr
4408
692
      case  2: // eapsr
4409
901
      case  3: // xpsr
4410
967
      case  5: // ipsr
4411
1.19k
      case  6: // epsr
4412
1.38k
      case  7: // iepsr
4413
1.58k
      case  8: // msp
4414
1.65k
      case  9: // psp
4415
2.02k
      case 16: // primask
4416
2.54k
      case 20: // control
4417
2.54k
        break;
4418
414
      case 17: // basepri
4419
666
      case 18: // basepri_max
4420
875
      case 19: // faultmask
4421
875
        if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops))
4422
          // Values basepri, basepri_max and faultmask are only valid for v7m.
4423
0
          return MCDisassembler_Fail;
4424
875
        break;
4425
875
      case 0x8a: // msplim_ns
4426
343
      case 0x8b: // psplim_ns
4427
549
      case 0x91: // basepri_ns
4428
750
      case 0x93: // faultmask_ns
4429
750
        if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8MMainlineOps))
4430
0
          return MCDisassembler_Fail;
4431
        // LLVM_FALLTHROUGH;
4432
995
      case 10:   // msplim
4433
1.20k
      case 11:   // psplim
4434
1.88k
      case 0x88: // msp_ns
4435
2.14k
      case 0x89: // psp_ns
4436
2.80k
      case 0x90: // primask_ns
4437
2.87k
      case 0x94: // control_ns
4438
3.19k
      case 0x98: // sp_ns
4439
3.19k
        if (!ARM_getFeatureBits(Inst->csh->mode, ARM_Feature8MSecExt))
4440
0
          return MCDisassembler_Fail;
4441
3.19k
        break;
4442
3.19k
      default:
4443
1.07k
        return MCDisassembler_SoftFail;
4444
7.68k
    }
4445
4446
6.61k
    if (MCInst_getOpcode(Inst) == ARM_t2MSR_M) {
4447
5.32k
      unsigned Mask = fieldFromInstruction_4(Val, 10, 2);
4448
5.32k
      if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops)) {
4449
        // The ARMv6-M MSR bits {11-10} can be only 0b10, other values are
4450
        // unpredictable.
4451
0
        if (Mask != 2)
4452
0
          S = MCDisassembler_SoftFail;
4453
5.32k
      } else {
4454
        // The ARMv7-M architecture stores an additional 2-bit mask value in
4455
        // MSR bits {11-10}. The mask is used only with apsr, iapsr, eapsr and
4456
        // xpsr, it has to be 0b10 in other cases. Bit mask{1} indicates if
4457
        // the NZCVQ bits should be moved by the instruction. Bit mask{0}
4458
        // indicates the move for the GE{3:0} bits, the mask{0} bit can be set
4459
        // only if the processor includes the DSP extension.
4460
5.32k
        if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
4461
2.27k
            (!ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureDSP) && (Mask & 1)))
4462
3.05k
          S = MCDisassembler_SoftFail;
4463
5.32k
      }
4464
5.32k
    }
4465
6.61k
  } else {
4466
    // A/R class
4467
2.47k
    if (Val == 0)
4468
202
      return MCDisassembler_Fail;
4469
2.47k
  }
4470
4471
8.88k
  MCOperand_CreateImm0(Inst, Val);
4472
8.88k
  return S;
4473
10.1k
}
4474
4475
static DecodeStatus DecodeBankedReg(MCInst *Inst, unsigned Val,
4476
    uint64_t Address, const void *Decoder)
4477
1.80k
{
4478
1.80k
  unsigned R = fieldFromInstruction_4(Val, 5, 1);
4479
1.80k
  unsigned SysM = fieldFromInstruction_4(Val, 0, 5);
4480
4481
  // The table of encodings for these banked registers comes from B9.2.3 of the
4482
  // ARM ARM. There are patterns, but nothing regular enough to make this logic
4483
  // neater. So by fiat, these values are UNPREDICTABLE:
4484
1.80k
  if (!lookupBankedRegByEncoding((R << 5) | SysM))
4485
209
    return MCDisassembler_Fail;
4486
4487
1.59k
  MCOperand_CreateImm0(Inst, Val);
4488
4489
1.59k
  return MCDisassembler_Success;
4490
1.80k
}
4491
4492
static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn,
4493
    uint64_t Address, const void *Decoder)
4494
1.44k
{
4495
1.44k
  DecodeStatus S = MCDisassembler_Success;
4496
1.44k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4497
1.44k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4498
1.44k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
4499
4500
1.44k
  if (Rn == 0xF)
4501
943
    S = MCDisassembler_SoftFail;
4502
4503
1.44k
  if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
4504
2
    return MCDisassembler_Fail;
4505
4506
1.43k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4507
0
    return MCDisassembler_Fail;
4508
4509
1.43k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4510
2
    return MCDisassembler_Fail;
4511
4512
1.43k
  return S;
4513
1.43k
}
4514
4515
static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn,
4516
    uint64_t Address, const void *Decoder)
4517
2.00k
{
4518
2.00k
  DecodeStatus S = MCDisassembler_Success;
4519
2.00k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
4520
2.00k
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
4521
2.00k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4522
2.00k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
4523
4524
2.00k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
4525
0
    return MCDisassembler_Fail;
4526
4527
2.00k
  if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt + 1)
4528
1.37k
    S = MCDisassembler_SoftFail;
4529
4530
2.00k
  if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
4531
4
    return MCDisassembler_Fail;
4532
4533
1.99k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4534
0
    return MCDisassembler_Fail;
4535
4536
1.99k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4537
3
    return MCDisassembler_Fail;
4538
4539
1.99k
  return S;
4540
1.99k
}
4541
4542
static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn,
4543
    uint64_t Address, const void *Decoder)
4544
3.26k
{
4545
3.26k
  DecodeStatus S = MCDisassembler_Success;
4546
3.26k
  unsigned pred;
4547
3.26k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4548
3.26k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4549
3.26k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
4550
3.26k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
4551
3.26k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
4552
3.26k
  pred = fieldFromInstruction_4(Insn, 28, 4);
4553
4554
3.26k
  if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail;
4555
4556
3.26k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4557
0
    return MCDisassembler_Fail;
4558
4559
3.26k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4560
0
    return MCDisassembler_Fail;
4561
4562
3.26k
  if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
4563
0
    return MCDisassembler_Fail;
4564
4565
3.26k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4566
20
    return MCDisassembler_Fail;
4567
4568
3.24k
  return S;
4569
3.26k
}
4570
4571
static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn,
4572
    uint64_t Address, const void *Decoder)
4573
3.50k
{
4574
3.50k
  DecodeStatus S = MCDisassembler_Success;
4575
3.50k
  unsigned pred, Rm;
4576
3.50k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4577
3.50k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4578
3.50k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
4579
3.50k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
4580
3.50k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
4581
3.50k
  pred = fieldFromInstruction_4(Insn, 28, 4);
4582
3.50k
  Rm = fieldFromInstruction_4(Insn, 0, 4);
4583
4584
3.50k
  if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail;
4585
3.50k
  if (Rm == 0xF) S = MCDisassembler_SoftFail;
4586
4587
3.50k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4588
0
    return MCDisassembler_Fail;
4589
4590
3.50k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4591
0
    return MCDisassembler_Fail;
4592
4593
3.50k
  if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
4594
0
    return MCDisassembler_Fail;
4595
4596
3.50k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4597
6
    return MCDisassembler_Fail;
4598
4599
3.49k
  return S;
4600
3.50k
}
4601
4602
static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn,
4603
    uint64_t Address, const void *Decoder)
4604
4.16k
{
4605
4.16k
  DecodeStatus S = MCDisassembler_Success;
4606
4.16k
  unsigned pred;
4607
4.16k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4608
4.16k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4609
4.16k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
4610
4.16k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
4611
4.16k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
4612
4.16k
  pred = fieldFromInstruction_4(Insn, 28, 4);
4613
4614
4.16k
  if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail;
4615
4616
4.16k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4617
0
    return MCDisassembler_Fail;
4618
4619
4.16k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4620
0
    return MCDisassembler_Fail;
4621
4622
4.16k
  if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
4623
0
    return MCDisassembler_Fail;
4624
4625
4.16k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4626
8
    return MCDisassembler_Fail;
4627
4628
4.15k
  return S;
4629
4.16k
}
4630
4631
static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn,
4632
    uint64_t Address, const void *Decoder)
4633
4.77k
{
4634
4.77k
  DecodeStatus S = MCDisassembler_Success;
4635
4.77k
  unsigned pred;
4636
4.77k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4637
4.77k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4638
4.77k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
4639
4.77k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
4640
4.77k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
4641
4.77k
  pred = fieldFromInstruction_4(Insn, 28, 4);
4642
4643
4.77k
  if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail;
4644
4645
4.77k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4646
0
    return MCDisassembler_Fail;
4647
4648
4.77k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4649
0
    return MCDisassembler_Fail;
4650
4651
4.77k
  if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
4652
0
    return MCDisassembler_Fail;
4653
4654
4.77k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4655
2
    return MCDisassembler_Fail;
4656
4657
4.77k
  return S;
4658
4.77k
}
4659
4660
static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn,
4661
    uint64_t Address, const void *Decoder)
4662
2.51k
{
4663
2.51k
  DecodeStatus S = MCDisassembler_Success;
4664
2.51k
  unsigned size, align = 0, index = 0;
4665
2.51k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4666
2.51k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4667
2.51k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
4668
2.51k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
4669
2.51k
  size = fieldFromInstruction_4(Insn, 10, 2);
4670
4671
2.51k
  switch (size) {
4672
0
    default:
4673
0
      return MCDisassembler_Fail;
4674
1.14k
    case 0:
4675
1.14k
      if (fieldFromInstruction_4(Insn, 4, 1))
4676
0
        return MCDisassembler_Fail; // UNDEFINED
4677
1.14k
      index = fieldFromInstruction_4(Insn, 5, 3);
4678
1.14k
      break;
4679
1.04k
    case 1:
4680
1.04k
      if (fieldFromInstruction_4(Insn, 5, 1))
4681
2
        return MCDisassembler_Fail; // UNDEFINED
4682
1.04k
      index = fieldFromInstruction_4(Insn, 6, 2);
4683
1.04k
      if (fieldFromInstruction_4(Insn, 4, 1))
4684
400
        align = 2;
4685
1.04k
      break;
4686
326
    case 2:
4687
326
      if (fieldFromInstruction_4(Insn, 6, 1))
4688
0
        return MCDisassembler_Fail; // UNDEFINED
4689
4690
326
      index = fieldFromInstruction_4(Insn, 7, 1);
4691
4692
326
      switch (fieldFromInstruction_4(Insn, 4, 2)) {
4693
186
        case 0 :
4694
186
          align = 0; break;
4695
138
        case 3:
4696
138
          align = 4; break;
4697
2
        default:
4698
2
          return MCDisassembler_Fail;
4699
326
      }
4700
324
      break;
4701
2.51k
  }
4702
4703
2.51k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4704
0
    return MCDisassembler_Fail;
4705
4706
2.51k
  if (Rm != 0xF) { // Writeback
4707
1.56k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4708
0
      return MCDisassembler_Fail;
4709
1.56k
  }
4710
4711
2.51k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4712
0
    return MCDisassembler_Fail;
4713
4714
2.51k
  MCOperand_CreateImm0(Inst, align);
4715
4716
2.51k
  if (Rm != 0xF) {
4717
1.56k
    if (Rm != 0xD) {
4718
1.04k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4719
0
        return MCDisassembler_Fail;
4720
1.04k
    } else
4721
522
      MCOperand_CreateReg0(Inst, 0);
4722
1.56k
  }
4723
4724
2.51k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4725
0
    return MCDisassembler_Fail;
4726
4727
2.51k
  MCOperand_CreateImm0(Inst, index);
4728
4729
2.51k
  return S;
4730
2.51k
}
4731
4732
static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn,
4733
    uint64_t Address, const void *Decoder)
4734
2.37k
{
4735
2.37k
  DecodeStatus S = MCDisassembler_Success;
4736
2.37k
  unsigned size, align = 0, index = 0;
4737
2.37k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4738
2.37k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4739
2.37k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
4740
2.37k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
4741
2.37k
  size = fieldFromInstruction_4(Insn, 10, 2);
4742
4743
2.37k
  switch (size) {
4744
0
    default:
4745
0
      return MCDisassembler_Fail;
4746
675
    case 0:
4747
675
      if (fieldFromInstruction_4(Insn, 4, 1))
4748
0
        return MCDisassembler_Fail; // UNDEFINED
4749
4750
675
      index = fieldFromInstruction_4(Insn, 5, 3);
4751
675
      break;
4752
848
    case 1:
4753
848
      if (fieldFromInstruction_4(Insn, 5, 1))
4754
0
        return MCDisassembler_Fail; // UNDEFINED
4755
4756
848
      index = fieldFromInstruction_4(Insn, 6, 2);
4757
848
      if (fieldFromInstruction_4(Insn, 4, 1))
4758
129
        align = 2;
4759
848
      break;
4760
856
    case 2:
4761
856
      if (fieldFromInstruction_4(Insn, 6, 1))
4762
0
        return MCDisassembler_Fail; // UNDEFINED
4763
4764
856
      index = fieldFromInstruction_4(Insn, 7, 1);
4765
4766
856
      switch (fieldFromInstruction_4(Insn, 4, 2)) {
4767
520
        case 0: 
4768
520
          align = 0; break;
4769
332
        case 3:
4770
332
          align = 4; break;
4771
4
        default:
4772
4
          return MCDisassembler_Fail;
4773
856
      }
4774
852
      break;
4775
2.37k
  }
4776
4777
2.37k
  if (Rm != 0xF) { // Writeback
4778
1.99k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4779
0
      return MCDisassembler_Fail;
4780
1.99k
  }
4781
4782
2.37k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4783
0
    return MCDisassembler_Fail;
4784
4785
2.37k
  MCOperand_CreateImm0(Inst, align);
4786
4787
2.37k
  if (Rm != 0xF) {
4788
1.99k
    if (Rm != 0xD) {
4789
1.63k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4790
0
        return MCDisassembler_Fail;
4791
1.63k
    } else
4792
357
      MCOperand_CreateReg0(Inst, 0);
4793
1.99k
  }
4794
4795
2.37k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4796
0
    return MCDisassembler_Fail;
4797
4798
2.37k
  MCOperand_CreateImm0(Inst, index);
4799
4800
2.37k
  return S;
4801
2.37k
}
4802
4803
static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn,
4804
    uint64_t Address, const void *Decoder)
4805
3.61k
{
4806
3.61k
  DecodeStatus S = MCDisassembler_Success;
4807
3.61k
  unsigned size, align = 0, index = 0, inc = 1;
4808
3.61k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4809
3.61k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4810
3.61k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
4811
3.61k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
4812
3.61k
  size = fieldFromInstruction_4(Insn, 10, 2);
4813
4814
3.61k
  switch (size) {
4815
0
    default:
4816
0
      return MCDisassembler_Fail;
4817
985
    case 0:
4818
985
      index = fieldFromInstruction_4(Insn, 5, 3);
4819
985
      if (fieldFromInstruction_4(Insn, 4, 1))
4820
483
        align = 2;
4821
985
      break;
4822
1.30k
    case 1:
4823
1.30k
      index = fieldFromInstruction_4(Insn, 6, 2);
4824
1.30k
      if (fieldFromInstruction_4(Insn, 4, 1))
4825
184
        align = 4;
4826
1.30k
      if (fieldFromInstruction_4(Insn, 5, 1))
4827
404
        inc = 2;
4828
1.30k
      break;
4829
1.32k
    case 2:
4830
1.32k
      if (fieldFromInstruction_4(Insn, 5, 1))
4831
0
        return MCDisassembler_Fail; // UNDEFINED
4832
4833
1.32k
      index = fieldFromInstruction_4(Insn, 7, 1);
4834
1.32k
      if (fieldFromInstruction_4(Insn, 4, 1) != 0)
4835
590
        align = 8;
4836
1.32k
      if (fieldFromInstruction_4(Insn, 6, 1))
4837
597
        inc = 2;
4838
1.32k
      break;
4839
3.61k
  }
4840
4841
3.61k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4842
0
    return MCDisassembler_Fail;
4843
4844
3.61k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
4845
9
    return MCDisassembler_Fail;
4846
4847
3.61k
  if (Rm != 0xF) { // Writeback
4848
2.73k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4849
0
      return MCDisassembler_Fail;
4850
2.73k
  }
4851
4852
3.61k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4853
0
    return MCDisassembler_Fail;
4854
4855
3.61k
  MCOperand_CreateImm0(Inst, align);
4856
4857
3.61k
  if (Rm != 0xF) {
4858
2.73k
    if (Rm != 0xD) {
4859
1.38k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4860
0
        return MCDisassembler_Fail;
4861
1.38k
    } else
4862
1.35k
      MCOperand_CreateReg0(Inst, 0);
4863
2.73k
  }
4864
4865
3.61k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4866
0
    return MCDisassembler_Fail;
4867
4868
3.61k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
4869
0
    return MCDisassembler_Fail;
4870
4871
3.61k
  MCOperand_CreateImm0(Inst, index);
4872
4873
3.61k
  return S;
4874
3.61k
}
4875
4876
static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn,
4877
    uint64_t Address, const void *Decoder)
4878
4.55k
{
4879
4.55k
  DecodeStatus S = MCDisassembler_Success;
4880
4.55k
  unsigned size, align = 0, index = 0, inc = 1;
4881
4.55k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4882
4.55k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4883
4.55k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
4884
4.55k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
4885
4.55k
  size = fieldFromInstruction_4(Insn, 10, 2);
4886
4887
4.55k
  switch (size) {
4888
0
    default:
4889
0
      return MCDisassembler_Fail;
4890
1.88k
    case 0:
4891
1.88k
      index = fieldFromInstruction_4(Insn, 5, 3);
4892
1.88k
      if (fieldFromInstruction_4(Insn, 4, 1))
4893
761
        align = 2;
4894
1.88k
      break;
4895
1.34k
    case 1:
4896
1.34k
      index = fieldFromInstruction_4(Insn, 6, 2);
4897
1.34k
      if (fieldFromInstruction_4(Insn, 4, 1))
4898
470
        align = 4;
4899
1.34k
      if (fieldFromInstruction_4(Insn, 5, 1))
4900
701
        inc = 2;
4901
1.34k
      break;
4902
1.32k
    case 2:
4903
1.32k
      if (fieldFromInstruction_4(Insn, 5, 1))
4904
0
        return MCDisassembler_Fail; // UNDEFINED
4905
4906
1.32k
      index = fieldFromInstruction_4(Insn, 7, 1);
4907
1.32k
      if (fieldFromInstruction_4(Insn, 4, 1) != 0)
4908
868
        align = 8;
4909
1.32k
      if (fieldFromInstruction_4(Insn, 6, 1))
4910
882
        inc = 2;
4911
1.32k
      break;
4912
4.55k
  }
4913
4914
4.55k
  if (Rm != 0xF) { // Writeback
4915
3.01k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4916
0
      return MCDisassembler_Fail;
4917
3.01k
  }
4918
4919
4.55k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4920
0
    return MCDisassembler_Fail;
4921
4922
4.55k
  MCOperand_CreateImm0(Inst, align);
4923
4924
4.55k
  if (Rm != 0xF) {
4925
3.01k
    if (Rm != 0xD) {
4926
2.05k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4927
0
        return MCDisassembler_Fail;
4928
2.05k
    } else
4929
957
      MCOperand_CreateReg0(Inst, 0);
4930
3.01k
  }
4931
4932
4.55k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4933
0
    return MCDisassembler_Fail;
4934
4935
4.55k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
4936
2
    return MCDisassembler_Fail;
4937
4938
4.55k
  MCOperand_CreateImm0(Inst, index);
4939
4940
4.55k
  return S;
4941
4.55k
}
4942
4943
static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn,
4944
    uint64_t Address, const void *Decoder)
4945
2.66k
{
4946
2.66k
  DecodeStatus S = MCDisassembler_Success;
4947
2.66k
  unsigned size, align = 0, index = 0, inc = 1;
4948
2.66k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4949
2.66k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4950
2.66k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
4951
2.66k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
4952
2.66k
  size = fieldFromInstruction_4(Insn, 10, 2);
4953
4954
2.66k
  switch (size) {
4955
0
    default:
4956
0
      return MCDisassembler_Fail;
4957
699
    case 0:
4958
699
      if (fieldFromInstruction_4(Insn, 4, 1))
4959
0
        return MCDisassembler_Fail; // UNDEFINED
4960
699
      index = fieldFromInstruction_4(Insn, 5, 3);
4961
699
      break;
4962
1.18k
    case 1:
4963
1.18k
      if (fieldFromInstruction_4(Insn, 4, 1))
4964
0
        return MCDisassembler_Fail; // UNDEFINED
4965
1.18k
      index = fieldFromInstruction_4(Insn, 6, 2);
4966
1.18k
      if (fieldFromInstruction_4(Insn, 5, 1))
4967
539
        inc = 2;
4968
1.18k
      break;
4969
781
    case 2:
4970
781
      if (fieldFromInstruction_4(Insn, 4, 2))
4971
0
        return MCDisassembler_Fail; // UNDEFINED
4972
781
      index = fieldFromInstruction_4(Insn, 7, 1);
4973
781
      if (fieldFromInstruction_4(Insn, 6, 1))
4974
502
        inc = 2;
4975
781
      break;
4976
2.66k
  }
4977
4978
2.66k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4979
0
    return MCDisassembler_Fail;
4980
2.66k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
4981
3
    return MCDisassembler_Fail;
4982
2.66k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2*inc, Address, Decoder)))
4983
2
    return MCDisassembler_Fail;
4984
4985
2.66k
  if (Rm != 0xF) { // Writeback
4986
1.70k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4987
0
      return MCDisassembler_Fail;
4988
1.70k
  }
4989
4990
2.66k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4991
0
    return MCDisassembler_Fail;
4992
4993
2.66k
  MCOperand_CreateImm0(Inst, align);
4994
4995
2.66k
  if (Rm != 0xF) {
4996
1.70k
    if (Rm != 0xD) {
4997
620
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4998
0
        return MCDisassembler_Fail;
4999
620
    } else
5000
1.08k
      MCOperand_CreateReg0(Inst, 0);
5001
1.70k
  }
5002
5003
2.66k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5004
0
    return MCDisassembler_Fail;
5005
5006
2.66k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5007
0
    return MCDisassembler_Fail;
5008
5009
2.66k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2*inc, Address, Decoder)))
5010
0
    return MCDisassembler_Fail;
5011
5012
2.66k
  MCOperand_CreateImm0(Inst, index);
5013
5014
2.66k
  return S;
5015
2.66k
}
5016
5017
static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn,
5018
    uint64_t Address, const void *Decoder)
5019
3.31k
{
5020
3.31k
  DecodeStatus S = MCDisassembler_Success;
5021
3.31k
  unsigned size, align = 0, index = 0, inc = 1;
5022
3.31k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5023
3.31k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5024
3.31k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5025
3.31k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5026
3.31k
  size = fieldFromInstruction_4(Insn, 10, 2);
5027
5028
3.31k
  switch (size) {
5029
0
    default:
5030
0
      return MCDisassembler_Fail;
5031
789
    case 0:
5032
789
      if (fieldFromInstruction_4(Insn, 4, 1))
5033
0
        return MCDisassembler_Fail; // UNDEFINED
5034
789
      index = fieldFromInstruction_4(Insn, 5, 3);
5035
789
      break;
5036
1.48k
    case 1:
5037
1.48k
      if (fieldFromInstruction_4(Insn, 4, 1))
5038
0
        return MCDisassembler_Fail; // UNDEFINED
5039
1.48k
      index = fieldFromInstruction_4(Insn, 6, 2);
5040
1.48k
      if (fieldFromInstruction_4(Insn, 5, 1))
5041
531
        inc = 2;
5042
1.48k
      break;
5043
1.04k
    case 2:
5044
1.04k
      if (fieldFromInstruction_4(Insn, 4, 2))
5045
0
        return MCDisassembler_Fail; // UNDEFINED
5046
1.04k
      index = fieldFromInstruction_4(Insn, 7, 1);
5047
1.04k
      if (fieldFromInstruction_4(Insn, 6, 1))
5048
391
        inc = 2;
5049
1.04k
      break;
5050
3.31k
  }
5051
5052
3.31k
  if (Rm != 0xF) { // Writeback
5053
2.03k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5054
0
      return MCDisassembler_Fail;
5055
2.03k
  }
5056
5057
3.31k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5058
0
    return MCDisassembler_Fail;
5059
5060
3.31k
  MCOperand_CreateImm0(Inst, align);
5061
5062
3.31k
  if (Rm != 0xF) {
5063
2.03k
    if (Rm != 0xD) {
5064
1.22k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
5065
0
        return MCDisassembler_Fail;
5066
1.22k
    } else
5067
808
      MCOperand_CreateReg0(Inst, 0);
5068
2.03k
  }
5069
5070
3.31k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5071
0
    return MCDisassembler_Fail;
5072
5073
3.31k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5074
2
    return MCDisassembler_Fail;
5075
5076
3.31k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2*inc, Address, Decoder)))
5077
3
    return MCDisassembler_Fail;
5078
5079
3.31k
  MCOperand_CreateImm0(Inst, index);
5080
5081
3.31k
  return S;
5082
3.31k
}
5083
5084
static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn,
5085
    uint64_t Address, const void *Decoder)
5086
4.05k
{
5087
4.05k
  DecodeStatus S = MCDisassembler_Success;
5088
4.05k
  unsigned size, align = 0, index = 0, inc = 1;
5089
4.05k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5090
4.05k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5091
4.05k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5092
4.05k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5093
4.05k
  size = fieldFromInstruction_4(Insn, 10, 2);
5094
5095
4.05k
  switch (size) {
5096
0
    default:
5097
0
      return MCDisassembler_Fail;
5098
1.54k
    case 0:
5099
1.54k
      if (fieldFromInstruction_4(Insn, 4, 1))
5100
326
        align = 4;
5101
1.54k
      index = fieldFromInstruction_4(Insn, 5, 3);
5102
1.54k
      break;
5103
1.29k
    case 1:
5104
1.29k
      if (fieldFromInstruction_4(Insn, 4, 1))
5105
719
        align = 8;
5106
1.29k
      index = fieldFromInstruction_4(Insn, 6, 2);
5107
1.29k
      if (fieldFromInstruction_4(Insn, 5, 1))
5108
623
        inc = 2;
5109
1.29k
      break;
5110
1.21k
    case 2:
5111
1.21k
      switch (fieldFromInstruction_4(Insn, 4, 2)) {
5112
599
        case 0:
5113
599
          align = 0; break;
5114
3
        case 3:
5115
3
          return MCDisassembler_Fail;
5116
615
        default:
5117
615
          align = 4 << fieldFromInstruction_4(Insn, 4, 2); break;
5118
1.21k
      }
5119
5120
1.21k
      index = fieldFromInstruction_4(Insn, 7, 1);
5121
1.21k
      if (fieldFromInstruction_4(Insn, 6, 1))
5122
309
        inc = 2;
5123
1.21k
      break;
5124
4.05k
  }
5125
5126
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5127
0
    return MCDisassembler_Fail;
5128
5129
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5130
2
    return MCDisassembler_Fail;
5131
5132
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2*inc, Address, Decoder)))
5133
3
    return MCDisassembler_Fail;
5134
5135
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3*inc, Address, Decoder)))
5136
2
    return MCDisassembler_Fail;
5137
5138
4.04k
  if (Rm != 0xF) { // Writeback
5139
2.67k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5140
0
      return MCDisassembler_Fail;
5141
2.67k
  }
5142
5143
4.04k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5144
0
    return MCDisassembler_Fail;
5145
5146
4.04k
  MCOperand_CreateImm0(Inst, align);
5147
5148
4.04k
  if (Rm != 0xF) {
5149
2.67k
    if (Rm != 0xD) {
5150
1.72k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
5151
0
        return MCDisassembler_Fail;
5152
1.72k
    } else
5153
950
      MCOperand_CreateReg0(Inst, 0);
5154
2.67k
  }
5155
5156
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5157
0
    return MCDisassembler_Fail;
5158
5159
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5160
0
    return MCDisassembler_Fail;
5161
5162
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2*inc, Address, Decoder)))
5163
0
    return MCDisassembler_Fail;
5164
5165
4.04k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3*inc, Address, Decoder)))
5166
0
    return MCDisassembler_Fail;
5167
5168
4.04k
  MCOperand_CreateImm0(Inst, index);
5169
5170
4.04k
  return S;
5171
4.04k
}
5172
5173
static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn,
5174
    uint64_t Address, const void *Decoder)
5175
4.43k
{
5176
4.43k
  DecodeStatus S = MCDisassembler_Success;
5177
4.43k
  unsigned size, align = 0, index = 0, inc = 1;
5178
4.43k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5179
4.43k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5180
4.43k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5181
4.43k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5182
4.43k
  size = fieldFromInstruction_4(Insn, 10, 2);
5183
5184
4.43k
  switch (size) {
5185
0
    default:
5186
0
      return MCDisassembler_Fail;
5187
1.49k
    case 0:
5188
1.49k
      if (fieldFromInstruction_4(Insn, 4, 1))
5189
444
        align = 4;
5190
1.49k
      index = fieldFromInstruction_4(Insn, 5, 3);
5191
1.49k
      break;
5192
2.12k
    case 1:
5193
2.12k
      if (fieldFromInstruction_4(Insn, 4, 1))
5194
486
        align = 8;
5195
2.12k
      index = fieldFromInstruction_4(Insn, 6, 2);
5196
2.12k
      if (fieldFromInstruction_4(Insn, 5, 1))
5197
974
        inc = 2;
5198
2.12k
      break;
5199
822
    case 2:
5200
822
      switch (fieldFromInstruction_4(Insn, 4, 2)) {
5201
334
        case 0:
5202
334
          align = 0; break;
5203
2
        case 3:
5204
2
          return MCDisassembler_Fail;
5205
486
        default:
5206
486
          align = 4 << fieldFromInstruction_4(Insn, 4, 2); break;
5207
822
      }
5208
5209
820
      index = fieldFromInstruction_4(Insn, 7, 1);
5210
820
      if (fieldFromInstruction_4(Insn, 6, 1))
5211
308
        inc = 2;
5212
820
      break;
5213
4.43k
  }
5214
5215
4.43k
  if (Rm != 0xF) { // Writeback
5216
2.58k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5217
0
      return MCDisassembler_Fail;
5218
2.58k
  }
5219
5220
4.43k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5221
0
    return MCDisassembler_Fail;
5222
5223
4.43k
  MCOperand_CreateImm0(Inst, align);
5224
5225
4.43k
  if (Rm != 0xF) {
5226
2.58k
    if (Rm != 0xD) {
5227
2.16k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
5228
0
        return MCDisassembler_Fail;
5229
2.16k
    } else
5230
424
      MCOperand_CreateReg0(Inst, 0);
5231
2.58k
  }
5232
5233
4.43k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5234
0
    return MCDisassembler_Fail;
5235
5236
4.43k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5237
2
    return MCDisassembler_Fail;
5238
5239
4.43k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2*inc, Address, Decoder)))
5240
4
    return MCDisassembler_Fail;
5241
5242
4.43k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3*inc, Address, Decoder)))
5243
4
    return MCDisassembler_Fail;
5244
5245
4.42k
  MCOperand_CreateImm0(Inst, index);
5246
5247
4.42k
  return S;
5248
4.43k
}
5249
5250
static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn,
5251
    uint64_t Address, const void *Decoder)
5252
1.76k
{
5253
1.76k
  DecodeStatus S = MCDisassembler_Success;
5254
1.76k
  unsigned Rt  = fieldFromInstruction_4(Insn, 12, 4);
5255
1.76k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
5256
1.76k
  unsigned Rm  = fieldFromInstruction_4(Insn,  5, 1);
5257
1.76k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5258
1.76k
  Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1;
5259
5260
1.76k
  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5261
719
    S = MCDisassembler_SoftFail;
5262
5263
1.76k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
5264
0
    return MCDisassembler_Fail;
5265
5266
1.76k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm + 1, Address, Decoder)))
5267
2
    return MCDisassembler_Fail;
5268
5269
1.76k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
5270
0
    return MCDisassembler_Fail;
5271
5272
1.76k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
5273
0
    return MCDisassembler_Fail;
5274
5275
1.76k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5276
2
    return MCDisassembler_Fail;
5277
5278
1.75k
  return S;
5279
1.76k
}
5280
5281
static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn,
5282
    uint64_t Address, const void *Decoder)
5283
1.21k
{
5284
1.21k
  DecodeStatus S = MCDisassembler_Success;
5285
1.21k
  unsigned Rt  = fieldFromInstruction_4(Insn, 12, 4);
5286
1.21k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
5287
1.21k
  unsigned Rm  = fieldFromInstruction_4(Insn,  5, 1);
5288
1.21k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5289
1.21k
  Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1;
5290
5291
1.21k
  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5292
940
    S = MCDisassembler_SoftFail;
5293
5294
1.21k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
5295
0
    return MCDisassembler_Fail;
5296
5297
1.21k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
5298
0
    return MCDisassembler_Fail;
5299
5300
1.21k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
5301
0
    return MCDisassembler_Fail;
5302
5303
1.21k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm + 1, Address, Decoder)))
5304
5
    return MCDisassembler_Fail;
5305
5306
1.20k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5307
4
    return MCDisassembler_Fail;
5308
5309
1.20k
  return S;
5310
1.20k
}
5311
5312
static DecodeStatus DecodeIT(MCInst *Inst, unsigned Insn,
5313
    uint64_t Address, const void *Decoder)
5314
6.40k
{
5315
6.40k
  DecodeStatus S = MCDisassembler_Success;
5316
6.40k
  unsigned pred = fieldFromInstruction_4(Insn, 4, 4);
5317
6.40k
  unsigned mask = fieldFromInstruction_4(Insn, 0, 4);
5318
5319
6.40k
  if (pred == 0xF) {
5320
607
    pred = 0xE;
5321
607
    S = MCDisassembler_SoftFail;
5322
607
  }
5323
5324
6.40k
  if (mask == 0x0)
5325
0
    return MCDisassembler_Fail;
5326
5327
6.40k
  MCOperand_CreateImm0(Inst, pred);
5328
6.40k
  MCOperand_CreateImm0(Inst, mask);
5329
5330
6.40k
  return S;
5331
6.40k
}
5332
5333
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst, unsigned Insn,
5334
    uint64_t Address, const void *Decoder)
5335
5.09k
{
5336
5.09k
  DecodeStatus S = MCDisassembler_Success;
5337
5.09k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5338
5.09k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4);
5339
5.09k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5340
5.09k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
5341
5.09k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
5342
5.09k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
5343
5.09k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
5344
5.09k
  bool writeback = (W == 1) | (P == 0);
5345
5346
5.09k
  addr |= (U << 8) | (Rn << 9);
5347
5348
5.09k
  if (writeback && (Rn == Rt || Rn == Rt2))
5349
2.20k
    Check(&S, MCDisassembler_SoftFail);
5350
5351
5.09k
  if (Rt == Rt2)
5352
1.05k
    Check(&S, MCDisassembler_SoftFail);
5353
5354
  // Rt
5355
5.09k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
5356
0
    return MCDisassembler_Fail;
5357
5358
  // Rt2
5359
5.09k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5360
0
    return MCDisassembler_Fail;
5361
5362
  // Writeback operand
5363
5.09k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
5364
0
    return MCDisassembler_Fail;
5365
5366
  // addr
5367
5.09k
  if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
5368
0
    return MCDisassembler_Fail;
5369
5370
5.09k
  return S;
5371
5.09k
}
5372
5373
static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst, unsigned Insn,
5374
    uint64_t Address, const void *Decoder)
5375
6.48k
{
5376
6.48k
  DecodeStatus S = MCDisassembler_Success;
5377
6.48k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5378
6.48k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4);
5379
6.48k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5380
6.48k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
5381
6.48k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
5382
6.48k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
5383
6.48k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
5384
6.48k
  bool writeback = (W == 1) | (P == 0);
5385
5386
6.48k
  addr |= (U << 8) | (Rn << 9);
5387
5388
6.48k
  if (writeback && (Rn == Rt || Rn == Rt2))
5389
3.52k
    Check(&S, MCDisassembler_SoftFail);
5390
5391
  // Writeback operand
5392
6.48k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
5393
0
    return MCDisassembler_Fail;
5394
5395
  // Rt
5396
6.48k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
5397
0
    return MCDisassembler_Fail;
5398
5399
  // Rt2
5400
6.48k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5401
0
    return MCDisassembler_Fail;
5402
5403
  // addr
5404
6.48k
  if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
5405
0
    return MCDisassembler_Fail;
5406
5407
6.48k
  return S;
5408
6.48k
}
5409
5410
static DecodeStatus DecodeT2Adr(MCInst *Inst, uint32_t Insn,
5411
    uint64_t Address, const void *Decoder)
5412
2
{
5413
2
  unsigned Val;
5414
2
  unsigned sign1 = fieldFromInstruction_4(Insn, 21, 1);
5415
2
  unsigned sign2 = fieldFromInstruction_4(Insn, 23, 1);
5416
5417
2
  if (sign1 != sign2) return MCDisassembler_Fail;
5418
5419
0
  Val = fieldFromInstruction_4(Insn, 0, 8);
5420
0
  Val |= fieldFromInstruction_4(Insn, 12, 3) << 8;
5421
0
  Val |= fieldFromInstruction_4(Insn, 26, 1) << 11;
5422
0
  Val |= sign1 << 12;
5423
5424
0
  MCOperand_CreateImm0(Inst, SignExtend32(Val, 13));
5425
5426
0
  return MCDisassembler_Success;
5427
2
}
5428
5429
static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, uint32_t Val,
5430
    uint64_t Address, const void *Decoder)
5431
1.70k
{
5432
  // Shift of "asr #32" is not allowed in Thumb2 mode.
5433
1.70k
  if (Val == 0x20)
5434
197
    return MCDisassembler_Fail;
5435
5436
1.50k
  MCOperand_CreateImm0(Inst, Val);
5437
5438
1.50k
  return MCDisassembler_Success;
5439
1.70k
}
5440
5441
static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn,
5442
    uint64_t Address, const void *Decoder)
5443
3.52k
{
5444
3.52k
  DecodeStatus S;
5445
3.52k
  unsigned Rt   = fieldFromInstruction_4(Insn, 12, 4);
5446
3.52k
  unsigned Rt2  = fieldFromInstruction_4(Insn, 0,  4);
5447
3.52k
  unsigned Rn   = fieldFromInstruction_4(Insn, 16, 4);
5448
3.52k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5449
5450
3.52k
  if (pred == 0xF)
5451
803
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
5452
5453
2.72k
  S = MCDisassembler_Success;
5454
5455
2.72k
  if (Rt == Rn || Rn == Rt2)
5456
1.67k
    S = MCDisassembler_SoftFail;
5457
5458
2.72k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5459
0
    return MCDisassembler_Fail;
5460
5461
2.72k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
5462
0
    return MCDisassembler_Fail;
5463
5464
2.72k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
5465
0
    return MCDisassembler_Fail;
5466
5467
2.72k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5468
0
    return MCDisassembler_Fail;
5469
5470
2.72k
  return S;
5471
2.72k
}
5472
5473
static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn,
5474
    uint64_t Address, const void *Decoder)
5475
3.45k
{
5476
3.45k
  DecodeStatus S = MCDisassembler_Success;
5477
3.45k
  bool hasFullFP16 = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureFullFP16);
5478
3.45k
  unsigned Vm, imm, cmode, op;
5479
3.45k
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
5480
5481
3.45k
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
5482
3.45k
  Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
5483
3.45k
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
5484
3.45k
  imm = fieldFromInstruction_4(Insn, 16, 6);
5485
3.45k
  cmode = fieldFromInstruction_4(Insn, 8, 4);
5486
3.45k
  op = fieldFromInstruction_4(Insn, 5, 1);
5487
5488
  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
5489
3.45k
  if (!(imm & 0x38)) {
5490
2.05k
    if (cmode == 0xF) {
5491
506
      if (op == 1) return MCDisassembler_Fail;
5492
504
      MCInst_setOpcode(Inst, ARM_VMOVv2f32);
5493
504
    }
5494
5495
2.05k
    if (hasFullFP16) {
5496
2.05k
      if (cmode == 0xE) {
5497
0
        if (op == 1) {
5498
0
          MCInst_setOpcode(Inst, ARM_VMOVv1i64);
5499
0
        } else {
5500
0
          MCInst_setOpcode(Inst, ARM_VMOVv8i8);
5501
0
        }
5502
0
      }
5503
5504
2.05k
      if (cmode == 0xD) {
5505
920
        if (op == 1) {
5506
193
          MCInst_setOpcode(Inst, ARM_VMVNv2i32);
5507
727
        } else {
5508
727
          MCInst_setOpcode(Inst, ARM_VMOVv2i32);
5509
727
        }
5510
920
      }
5511
5512
2.05k
      if (cmode == 0xC) {
5513
629
        if (op == 1) {
5514
271
          MCInst_setOpcode(Inst, ARM_VMVNv2i32);
5515
358
        } else {
5516
358
          MCInst_setOpcode(Inst, ARM_VMOVv2i32);
5517
358
        }
5518
629
      }
5519
2.05k
    }
5520
5521
2.05k
    return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
5522
2.05k
  }
5523
5524
1.39k
  if (!(imm & 0x20)) return MCDisassembler_Fail;
5525
5526
1.39k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
5527
0
    return MCDisassembler_Fail;
5528
5529
1.39k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
5530
0
    return MCDisassembler_Fail;
5531
5532
1.39k
  MCOperand_CreateImm0(Inst, 64 - imm);
5533
5534
1.39k
  return S;
5535
1.39k
}
5536
5537
static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn,
5538
    uint64_t Address, const void *Decoder)
5539
1.62k
{
5540
1.62k
  DecodeStatus S = MCDisassembler_Success;
5541
1.62k
  bool hasFullFP16 = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureFullFP16);
5542
1.62k
  unsigned Vm, imm, cmode, op;
5543
1.62k
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
5544
5545
1.62k
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
5546
1.62k
  Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
5547
1.62k
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
5548
1.62k
  imm = fieldFromInstruction_4(Insn, 16, 6);
5549
1.62k
  cmode = fieldFromInstruction_4(Insn, 8, 4);
5550
1.62k
  op = fieldFromInstruction_4(Insn, 5, 1);
5551
5552
  // VMOVv4f32 is ambiguous with these decodings.
5553
1.62k
  if (!(imm & 0x38) && cmode == 0xF) {
5554
117
    if (op == 1) return MCDisassembler_Fail;
5555
116
    MCInst_setOpcode(Inst, ARM_VMOVv4f32);
5556
116
    return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
5557
117
  }
5558
5559
  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
5560
1.50k
  if (!(imm & 0x38)) {
5561
774
    if (cmode == 0xF) {
5562
0
      if (op == 1) return MCDisassembler_Fail;
5563
0
      MCInst_setOpcode(Inst, ARM_VMOVv4f32);
5564
0
    }
5565
5566
774
    if (hasFullFP16) {
5567
774
      if (cmode == 0xE) {
5568
0
        if (op == 1) {
5569
0
          MCInst_setOpcode(Inst, ARM_VMOVv2i64);
5570
0
        } else {
5571
0
          MCInst_setOpcode(Inst, ARM_VMOVv16i8);
5572
0
        }
5573
0
      }
5574
5575
774
      if (cmode == 0xD) {
5576
282
        if (op == 1) {
5577
68
          MCInst_setOpcode(Inst, ARM_VMVNv4i32);
5578
214
        } else {
5579
214
          MCInst_setOpcode(Inst, ARM_VMOVv4i32);
5580
214
        }
5581
282
      }
5582
5583
774
      if (cmode == 0xC) {
5584
492
        if (op == 1) {
5585
125
          MCInst_setOpcode(Inst, ARM_VMVNv4i32);
5586
367
        } else {
5587
367
          MCInst_setOpcode(Inst, ARM_VMOVv4i32);
5588
367
        }
5589
492
      }
5590
774
    }
5591
5592
774
    return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
5593
774
  }
5594
5595
734
  if (!(imm & 0x20)) return MCDisassembler_Fail;
5596
5597
733
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
5598
1
    return MCDisassembler_Fail;
5599
5600
732
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder)))
5601
1
    return MCDisassembler_Fail;
5602
5603
731
  MCOperand_CreateImm0(Inst, 64 - imm);
5604
5605
731
  return S;
5606
732
}
5607
5608
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst *Inst, unsigned Insn,
5609
    uint64_t Address, const void *Decoder)
5610
544
{
5611
544
  DecodeStatus S = MCDisassembler_Success;
5612
544
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
5613
544
  unsigned Vn = (fieldFromInstruction_4(Insn, 16, 4) << 0);
5614
544
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
5615
544
  unsigned q = (fieldFromInstruction_4(Insn, 6, 1) << 0);
5616
544
  unsigned rotate = (fieldFromInstruction_4(Insn, 20, 2) << 0);
5617
5618
544
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
5619
544
  Vn |= (fieldFromInstruction_4(Insn, 7, 1) << 4);
5620
544
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
5621
5622
544
  if (q) {
5623
111
    if (!Check(&S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
5624
1
      return MCDisassembler_Fail;
5625
5626
110
    if (!Check(&S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
5627
0
      return MCDisassembler_Fail;
5628
5629
110
    if (!Check(&S, DecodeQPRRegisterClass(Inst, Vn, Address, Decoder)))
5630
1
      return MCDisassembler_Fail;
5631
433
  } else {
5632
433
    if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
5633
0
      return MCDisassembler_Fail;
5634
5635
433
    if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
5636
0
      return MCDisassembler_Fail;
5637
5638
433
    if (!Check(&S, DecodeDPRRegisterClass(Inst, Vn, Address, Decoder)))
5639
0
      return MCDisassembler_Fail;
5640
433
  }
5641
5642
542
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
5643
0
    return MCDisassembler_Fail;
5644
5645
  // The lane index does not have any bits in the encoding, because it can only
5646
  // be 0.
5647
542
  MCOperand_CreateImm0(Inst, 0);
5648
542
  MCOperand_CreateImm0(Inst, rotate);
5649
5650
542
  return S;
5651
542
}
5652
5653
static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val,
5654
    uint64_t Address, const void *Decoder)
5655
3.39k
{
5656
3.39k
  DecodeStatus S = MCDisassembler_Success;
5657
3.39k
  unsigned Cond;
5658
3.39k
  unsigned Rn = fieldFromInstruction_4(Val, 16, 4);
5659
3.39k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
5660
3.39k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
5661
5662
3.39k
  Rm |= (fieldFromInstruction_4(Val, 23, 1) << 4);
5663
3.39k
  Cond = fieldFromInstruction_4(Val, 28, 4);
5664
5665
3.39k
  if (fieldFromInstruction_4(Val, 8, 4) != 0 || Rn == Rt)
5666
1.20k
    S = MCDisassembler_SoftFail;
5667
5668
3.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5669
0
    return MCDisassembler_Fail;
5670
5671
3.39k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
5672
0
    return MCDisassembler_Fail;
5673
5674
3.39k
  if (!Check(&S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder))) 
5675
0
    return MCDisassembler_Fail;
5676
5677
3.39k
  if (!Check(&S, DecodePostIdxReg(Inst, Rm, Address, Decoder)))
5678
0
    return MCDisassembler_Fail;
5679
5680
3.39k
  if (!Check(&S, DecodePredicateOperand(Inst, Cond, Address, Decoder)))
5681
2
    return MCDisassembler_Fail;
5682
5683
3.39k
  return S;
5684
3.39k
}
5685
5686
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst *Inst, unsigned Val,
5687
    uint64_t Address, const void *Decoder)
5688
2.03k
{
5689
2.03k
  DecodeStatus result = MCDisassembler_Success;
5690
2.03k
  unsigned CRm = fieldFromInstruction_4(Val, 0, 4);
5691
2.03k
  unsigned opc1 = fieldFromInstruction_4(Val, 4, 4);
5692
2.03k
  unsigned cop = fieldFromInstruction_4(Val, 8, 4);
5693
2.03k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
5694
2.03k
  unsigned Rt2 = fieldFromInstruction_4(Val, 16, 4);
5695
5696
2.03k
  if ((cop & ~0x1) == 0xa)
5697
10
    return MCDisassembler_Fail;
5698
5699
2.02k
  if (Rt == Rt2)
5700
670
    result = MCDisassembler_SoftFail;
5701
5702
  // We have to check if the instruction is MRRC2
5703
  // or MCRR2 when constructing the operands for
5704
  // Inst. Reason is because MRRC2 stores to two
5705
  // registers so it's tablegen desc has has two
5706
  // outputs whereas MCRR doesn't store to any
5707
  // registers so all of it's operands are listed
5708
  // as inputs, therefore the operand order for
5709
  // MRRC2 needs to be [Rt, Rt2, cop, opc1, CRm]
5710
  // and MCRR2 operand order is [cop, opc1, Rt, Rt2, CRm]
5711
5712
2.02k
  if (MCInst_getOpcode(Inst) == ARM_MRRC2) {
5713
778
    if (!Check(&result, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5714
0
      return MCDisassembler_Fail;
5715
5716
778
    if (!Check(&result, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
5717
0
      return MCDisassembler_Fail;
5718
778
  }
5719
5720
2.02k
  MCOperand_CreateImm0(Inst, cop);
5721
2.02k
  MCOperand_CreateImm0(Inst, opc1);
5722
5723
2.02k
  if (MCInst_getOpcode(Inst) == ARM_MCRR2) {
5724
1.24k
    if (!Check(&result, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5725
0
      return MCDisassembler_Fail;
5726
5727
1.24k
    if (!Check(&result, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
5728
0
      return MCDisassembler_Fail;
5729
1.24k
  }
5730
5731
2.02k
  MCOperand_CreateImm0(Inst, CRm);
5732
5733
2.02k
  return result;
5734
2.02k
}
5735
5736
static DecodeStatus DecodeForVMRSandVMSR(MCInst *Inst, unsigned Val,
5737
    uint64_t Address, const void *Decoder)
5738
2.94k
{
5739
2.94k
  DecodeStatus result = MCDisassembler_Success;
5740
2.94k
  bool HasV8Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops);
5741
2.94k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
5742
5743
2.94k
  if ((Inst->csh->mode & CS_MODE_THUMB) && !HasV8Ops)  {
5744
1.43k
    if (Rt == 13 || Rt == 15)
5745
767
      result = MCDisassembler_SoftFail;
5746
5747
1.43k
    Check(&result, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder));
5748
1.43k
  } else
5749
1.50k
    Check(&result, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder));
5750
5751
2.94k
  if (Inst->csh->mode & CS_MODE_THUMB) {
5752
1.75k
    MCOperand_CreateImm0(Inst, ARMCC_AL);
5753
1.75k
    MCOperand_CreateReg0(Inst, 0);
5754
1.75k
  } else {
5755
1.18k
    unsigned pred = fieldFromInstruction_4(Val, 28, 4);
5756
1.18k
    if (!Check(&result, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5757
1
      return MCDisassembler_Fail;
5758
1.18k
  }
5759
5760
2.94k
  return result;
5761
2.94k
}
5762
5763
#endif