Coverage Report

Created: 2023-12-08 06:05

/src/capstonenext/arch/ARM/ARMDisassembler.c
Line
Count
Source (jump to first uncovered line)
1
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
2
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
3
/*    Rot127 <unisono@quyllur.org> 2022-2023 */
4
/* Automatically translated source file from LLVM. */
5
6
/* LLVM-commit: 464bda7750a3ba9e23823fc707d7e7b6fc38438d */
7
/* LLVM-tag: llvmorg-16.0.2-5-g464bda7750a3 */
8
9
/* Only small edits allowed. */
10
/* For multiple similiar edits, please create a Patch for the translator. */
11
12
/* Capstone's C++ file translator: */
13
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
14
15
//===- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA ---------------===//
16
//
17
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
18
// See https://llvm.org/LICENSE.txt for license information.
19
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
20
//
21
//===----------------------------------------------------------------------===//
22
23
#include <capstone/platform.h>
24
#include <stdio.h>
25
#include <stdlib.h>
26
#include <string.h>
27
28
#include "../../LEB128.h"
29
#include "../../MCDisassembler.h"
30
#include "../../MCFixedLenDisassembler.h"
31
#include "../../MCInst.h"
32
#include "../../MCInstrDesc.h"
33
#include "../../MCRegisterInfo.h"
34
#include "../../MathExtras.h"
35
#include "../../cs_priv.h"
36
#include "../../utils.h"
37
#include "ARMLinkage.h"
38
#include "ARMAddressingModes.h"
39
#include "ARMBaseInfo.h"
40
#include "ARMDisassemblerExtension.h"
41
#include "ARMMapping.h"
42
43
#define GET_INSTRINFO_MC_DESC
44
#include "ARMGenInstrInfo.inc"
45
46
12.8k
#define CONCAT(a, b) CONCAT_(a, b)
47
12.8k
#define CONCAT_(a, b) a##_##b
48
49
#define DEBUG_TYPE "arm-disassembler"
50
51
// Handles the condition code status of instructions in IT blocks
52
;
53
54
;
55
56
/// ARM disassembler for all ARM platforms.;
57
static DecodeStatus getInstruction(csh ud, const uint8_t *Bytes, size_t ByteLen,
58
           MCInst *MI, uint16_t *Size, uint64_t Address,
59
           void *Info);
60
DecodeStatus getARMInstruction(csh ud, const uint8_t *Bytes, size_t ByteLen,
61
             MCInst *MI, uint16_t *Size, uint64_t Address,
62
             void *Info);
63
DecodeStatus getThumbInstruction(csh ud, const uint8_t *Bytes, size_t ByteLen,
64
         MCInst *MI, uint16_t *Size, uint64_t Address,
65
         void *Info);
66
DecodeStatus AddThumbPredicate(MCInst *);
67
void UpdateThumbVFPPredicate(DecodeStatus, MCInst *);
68
;
69
70
// end anonymous namespace
71
72
// Forward declare these because the autogenerated code will reference them.
73
// Definitions are further down.
74
static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo,
75
             uint64_t Address,
76
             const void *Decoder);
77
static DecodeStatus DecodeCLRMGPRRegisterClass(MCInst *Inst, unsigned RegNo,
78
                 uint64_t Address,
79
                 const void *Decoder);
80
static DecodeStatus DecodetGPROddRegisterClass(MCInst *Inst, unsigned RegNo,
81
                 uint64_t Address,
82
                 const void *Decoder);
83
static DecodeStatus DecodetGPREvenRegisterClass(MCInst *Inst, unsigned RegNo,
84
            uint64_t Address,
85
            const void *Decoder);
86
static DecodeStatus
87
DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst *Inst, unsigned RegNo,
88
          uint64_t Address, const void *Decoder);
89
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, unsigned RegNo,
90
                 uint64_t Address,
91
                 const void *Decoder);
92
static DecodeStatus DecodeGPRnospRegisterClass(MCInst *Inst, unsigned RegNo,
93
                 uint64_t Address,
94
                 const void *Decoder);
95
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, unsigned RegNo,
96
               uint64_t Address,
97
               const void *Decoder);
98
static DecodeStatus DecodeGPRwithZRRegisterClass(MCInst *Inst, unsigned RegNo,
99
             uint64_t Address,
100
             const void *Decoder);
101
static DecodeStatus DecodeGPRwithZRnospRegisterClass(MCInst *Inst,
102
                 unsigned RegNo,
103
                 uint64_t Address,
104
                 const void *Decoder);
105
static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo,
106
              uint64_t Address,
107
              const void *Decoder);
108
static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo,
109
               uint64_t Address,
110
               const void *Decoder);
111
static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo,
112
              uint64_t Address,
113
              const void *Decoder);
114
static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo,
115
                 uint64_t Address,
116
                 const void *Decoder);
117
static DecodeStatus DecodeGPRPairnospRegisterClass(MCInst *Inst, unsigned RegNo,
118
               uint64_t Address,
119
               const void *Decoder);
120
static DecodeStatus DecodeGPRspRegisterClass(MCInst *Inst, unsigned RegNo,
121
               uint64_t Address,
122
               const void *Decoder);
123
static DecodeStatus DecodeHPRRegisterClass(MCInst *Inst, unsigned RegNo,
124
             uint64_t Address,
125
             const void *Decoder);
126
static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo,
127
             uint64_t Address,
128
             const void *Decoder);
129
static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo,
130
             uint64_t Address,
131
             const void *Decoder);
132
static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
133
               uint64_t Address,
134
               const void *Decoder);
135
static DecodeStatus DecodeSPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
136
               uint64_t Address,
137
               const void *Decoder);
138
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst, unsigned RegNo,
139
            uint64_t Address,
140
            const void *Decoder);
141
static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo,
142
             uint64_t Address,
143
             const void *Decoder);
144
static DecodeStatus DecodeMQPRRegisterClass(MCInst *Inst, unsigned RegNo,
145
              uint64_t Address,
146
              const void *Decoder);
147
static DecodeStatus DecodeMQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
148
               uint64_t Address,
149
               const void *Decoder);
150
static DecodeStatus DecodeMQQQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
151
                 uint64_t Address,
152
                 const void *Decoder);
153
static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo,
154
               uint64_t Address,
155
               const void *Decoder);
156
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst, unsigned RegNo,
157
               uint64_t Address,
158
               const void *Decoder);
159
160
static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val,
161
             uint64_t Address,
162
             const void *Decoder);
163
static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val,
164
               uint64_t Address, const void *Decoder);
165
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val,
166
           uint64_t Address, const void *Decoder);
167
static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val,
168
              uint64_t Address,
169
              const void *Decoder);
170
static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val,
171
              uint64_t Address,
172
              const void *Decoder);
173
174
static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Insn,
175
                uint64_t Address,
176
                const void *Decoder);
177
static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn,
178
              uint64_t Address,
179
              const void *Decoder);
180
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, unsigned Insn,
181
              uint64_t Address,
182
              const void *Decoder);
183
static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Insn,
184
            uint64_t Address,
185
            const void *Decoder);
186
static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn,
187
                 uint64_t Address,
188
                 const void *Decoder);
189
static DecodeStatus DecodeTSBInstruction(MCInst *Inst, unsigned Insn,
190
           uint64_t Address, const void *Decoder);
191
static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Insn,
192
            uint64_t Address,
193
            const void *Decoder);
194
static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Insn,
195
            uint64_t Address,
196
            const void *Decoder);
197
198
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst *Inst,
199
                unsigned Insn,
200
                uint64_t Adddress,
201
                const void *Decoder);
202
static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn,
203
               uint64_t Address,
204
               const void *Decoder);
205
static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn,
206
                uint64_t Address,
207
                const void *Decoder);
208
static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn,
209
            uint64_t Address,
210
            const void *Decoder);
211
static DecodeStatus DecodeHINTInstruction(MCInst *Inst, unsigned Insn,
212
            uint64_t Address,
213
            const void *Decoder);
214
static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn,
215
           uint64_t Address, const void *Decoder);
216
static DecodeStatus DecodeTSTInstruction(MCInst *Inst, unsigned Insn,
217
           uint64_t Address, const void *Decoder);
218
static DecodeStatus DecodeSETPANInstruction(MCInst *Inst, unsigned Insn,
219
              uint64_t Address,
220
              const void *Decoder);
221
static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn,
222
             uint64_t Address,
223
             const void *Decoder);
224
static DecodeStatus DecodeT2HintSpaceInstruction(MCInst *Inst, unsigned Insn,
225
             uint64_t Address,
226
             const void *Decoder);
227
static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val,
228
                 uint64_t Address,
229
                 const void *Decoder);
230
static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val,
231
             uint64_t Address,
232
             const void *Decoder);
233
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst *Inst, unsigned Val,
234
                 uint64_t Address,
235
                 const void *Decoder);
236
static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val,
237
             uint64_t Address,
238
             const void *Decoder);
239
static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn,
240
           uint64_t Address, const void *Decoder);
241
static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst, unsigned Insn,
242
                 uint64_t Address,
243
                 const void *Decoder);
244
static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val,
245
             uint64_t Address,
246
             const void *Decoder);
247
static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Val,
248
              uint64_t Address,
249
              const void *Decoder);
250
static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Val,
251
              uint64_t Address,
252
              const void *Decoder);
253
static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Val,
254
              uint64_t Address,
255
              const void *Decoder);
256
static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Val,
257
              uint64_t Address,
258
              const void *Decoder);
259
static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Val,
260
           uint64_t Address, const void *Decoder);
261
static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Val,
262
           uint64_t Address, const void *Decoder);
263
static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Val,
264
               uint64_t Address,
265
               const void *Decoder);
266
static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Val,
267
               uint64_t Address,
268
               const void *Decoder);
269
static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Val,
270
               uint64_t Address,
271
               const void *Decoder);
272
static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Val,
273
               uint64_t Address,
274
               const void *Decoder);
275
static DecodeStatus DecodeVMOVModImmInstruction(MCInst *Inst, unsigned Val,
276
            uint64_t Address,
277
            const void *Decoder);
278
static DecodeStatus DecodeMVEModImmInstruction(MCInst *Inst, unsigned Val,
279
                 uint64_t Address,
280
                 const void *Decoder);
281
static DecodeStatus DecodeMVEVADCInstruction(MCInst *Inst, unsigned Insn,
282
               uint64_t Address,
283
               const void *Decoder);
284
static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Val,
285
               uint64_t Address,
286
               const void *Decoder);
287
static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val,
288
           uint64_t Address, const void *Decoder);
289
static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val,
290
            uint64_t Address,
291
            const void *Decoder);
292
static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val,
293
            uint64_t Address,
294
            const void *Decoder);
295
static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val,
296
            uint64_t Address,
297
            const void *Decoder);
298
static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn,
299
           uint64_t Address, const void *Decoder);
300
static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn,
301
             uint64_t Address, const void *Decoder);
302
static DecodeStatus DecodeMveAddrModeRQ(MCInst *Inst, unsigned Insn,
303
          uint64_t Address, const void *Decoder);
304
#define DECLARE_DecodeMveAddrModeQ(shift) \
305
  static DecodeStatus CONCAT(DecodeMveAddrModeQ, shift)( \
306
    MCInst * Inst, unsigned Insn, uint64_t Address, \
307
    const void *Decoder);
308
DECLARE_DecodeMveAddrModeQ(2) DECLARE_DecodeMveAddrModeQ(3)
309
310
  static DecodeStatus
311
  DecodeCoprocessor(MCInst *Inst, unsigned Insn, uint64_t Address,
312
        const void *Decoder);
313
static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Insn,
314
             uint64_t Address,
315
             const void *Decoder);
316
static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Insn,
317
            uint64_t Address,
318
            const void *Decoder);
319
static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Insn, uint64_t Address,
320
          const void *Decoder);
321
static DecodeStatus DecodeBankedReg(MCInst *Inst, unsigned Insn,
322
            uint64_t Address, const void *Decoder);
323
static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn,
324
          uint64_t Address, const void *Decoder);
325
static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn,
326
           uint64_t Address, const void *Decoder);
327
static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn,
328
            uint64_t Address, const void *Decoder);
329
static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn,
330
            uint64_t Address, const void *Decoder);
331
static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn,
332
            uint64_t Address, const void *Decoder);
333
static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn,
334
            uint64_t Address, const void *Decoder);
335
static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
336
         const void *Decoder);
337
static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
338
         const void *Decoder);
339
static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
340
         const void *Decoder);
341
static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
342
         const void *Decoder);
343
static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
344
         const void *Decoder);
345
static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
346
         const void *Decoder);
347
static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
348
         const void *Decoder);
349
static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
350
         const void *Decoder);
351
static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn, uint64_t Address,
352
          const void *Decoder);
353
static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn, uint64_t Address,
354
          const void *Decoder);
355
static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn, uint64_t Address,
356
             const void *Decoder);
357
static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn, uint64_t Address,
358
        const void *Decoder);
359
static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn, uint64_t Address,
360
        const void *Decoder);
361
static DecodeStatus DecodeVCVTImmOperand(MCInst *Inst, unsigned Insn,
362
           uint64_t Address, const void *Decoder);
363
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst *Inst,
364
                   unsigned Val,
365
                   uint64_t Address,
366
                   const void *Decoder);
367
368
static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn,
369
               uint64_t Address,
370
               const void *Decoder);
371
static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val,
372
           uint64_t Address, const void *Decoder);
373
static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val,
374
              uint64_t Address, const void *Decoder);
375
static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val,
376
              uint64_t Address,
377
              const void *Decoder);
378
static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val,
379
            uint64_t Address,
380
            const void *Decoder);
381
static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val,
382
            uint64_t Address,
383
            const void *Decoder);
384
static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val,
385
            uint64_t Address,
386
            const void *Decoder);
387
static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val,
388
            uint64_t Address,
389
            const void *Decoder);
390
static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val,
391
            uint64_t Address,
392
            const void *Decoder);
393
static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Val,
394
              uint64_t Address, const void *Decoder);
395
static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn,
396
             uint64_t Address, const void *Decoder);
397
static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn,
398
              uint64_t Address, const void *Decoder);
399
static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn, uint64_t Address,
400
          const void *Decoder);
401
static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn,
402
              uint64_t Address, const void *Decoder);
403
static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val, uint64_t Address,
404
           const void *Decoder);
405
static DecodeStatus DecodeT2Imm7S4(MCInst *Inst, unsigned Val, uint64_t Address,
406
           const void *Decoder);
407
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val,
408
             uint64_t Address,
409
             const void *Decoder);
410
static DecodeStatus DecodeT2AddrModeImm7s4(MCInst *Inst, unsigned Val,
411
             uint64_t Address,
412
             const void *Decoder);
413
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst, unsigned Val,
414
            uint64_t Address,
415
            const void *Decoder);
416
static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val, uint64_t Address,
417
         const void *Decoder);
418
#define DECLARE_DecodeT2Imm7(shift) \
419
  static DecodeStatus CONCAT(DecodeT2Imm7, shift)(MCInst * Inst, \
420
              unsigned Val, \
421
              uint64_t Address, \
422
              const void *Decoder);
423
DECLARE_DecodeT2Imm7(0) DECLARE_DecodeT2Imm7(1) DECLARE_DecodeT2Imm7(2)
424
425
  static DecodeStatus
426
  DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val, uint64_t Address,
427
           const void *Decoder);
428
#define DECLARE_DecodeTAddrModeImm7(shift) \
429
  static DecodeStatus CONCAT(DecodeTAddrModeImm7, shift)( \
430
    MCInst * Inst, unsigned Val, uint64_t Address, \
431
    const void *Decoder);
432
DECLARE_DecodeTAddrModeImm7(0) DECLARE_DecodeTAddrModeImm7(1)
433
434
#define DECLARE_DecodeT2AddrModeImm7(shift, WriteBack) \
435
  static DecodeStatus CONCAT(DecodeT2AddrModeImm7, \
436
           CONCAT(shift, WriteBack))( \
437
    MCInst * Inst, unsigned Val, uint64_t Address, \
438
    const void *Decoder);
439
  DECLARE_DecodeT2AddrModeImm7(0, 0) DECLARE_DecodeT2AddrModeImm7(1, 0)
440
    DECLARE_DecodeT2AddrModeImm7(2, 0)
441
      DECLARE_DecodeT2AddrModeImm7(0, 1)
442
        DECLARE_DecodeT2AddrModeImm7(1, 1)
443
          DECLARE_DecodeT2AddrModeImm7(2, 1)
444
445
            static DecodeStatus
446
  DecodeThumbAddSPImm(MCInst *Inst, uint16_t Val, uint64_t Address,
447
          const void *Decoder);
448
static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn,
449
          uint64_t Address, const void *Decoder);
450
static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn,
451
           uint64_t Address, const void *Decoder);
452
static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn,
453
            uint64_t Address,
454
            const void *Decoder);
455
static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Insn,
456
           uint64_t Address, const void *Decoder);
457
static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val,
458
            uint64_t Address,
459
            const void *Decoder);
460
static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Val,
461
             uint64_t Address,
462
             const void *Decoder);
463
static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Val,
464
                 uint64_t Address,
465
                 const void *Decoder);
466
static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val, uint64_t Address,
467
          const void *Decoder);
468
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst, unsigned Val,
469
            uint64_t Address,
470
            const void *Decoder);
471
static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val,
472
                 uint64_t Address,
473
                 const void *Decoder);
474
static DecodeStatus DecodeIT(MCInst *Inst, unsigned Val, uint64_t Address,
475
           const void *Decoder);
476
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst, unsigned Insn,
477
                 uint64_t Address,
478
                 const void *Decoder);
479
static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst, unsigned Insn,
480
                 uint64_t Address,
481
                 const void *Decoder);
482
static DecodeStatus DecodeT2Adr(MCInst *Inst, unsigned Val, uint64_t Address,
483
        const void *Decoder);
484
static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Val,
485
            uint64_t Address, const void *Decoder);
486
static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, unsigned Val,
487
                uint64_t Address,
488
                const void *Decoder);
489
490
static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val, uint64_t Address,
491
            const void *Decoder);
492
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst *Inst, unsigned Val,
493
              uint64_t Address,
494
              const void *Decoder);
495
static DecodeStatus DecodeForVMRSandVMSR(MCInst *Inst, unsigned Val,
496
           uint64_t Address, const void *Decoder);
497
498
#define DECLARE_DecodeBFLabelOperand(isSigned, isNeg, zeroPermitted, size) \
499
  static DecodeStatus CONCAT( \
500
    DecodeBFLabelOperand, \
501
    CONCAT(isSigned, CONCAT(isNeg, CONCAT(zeroPermitted, size))))( \
502
    MCInst * Inst, unsigned val, uint64_t Address, \
503
    const void *Decoder);
504
DECLARE_DecodeBFLabelOperand(false, false, false,
505
           4) DECLARE_DecodeBFLabelOperand(true, false, true,
506
                   18)
507
  DECLARE_DecodeBFLabelOperand(true, false, true, 12)
508
    DECLARE_DecodeBFLabelOperand(true, false, true, 16)
509
      DECLARE_DecodeBFLabelOperand(false, true, true, 11)
510
        DECLARE_DecodeBFLabelOperand(false, false, true,
511
                   11)
512
513
          static DecodeStatus
514
  DecodeBFAfterTargetOperand(MCInst *Inst, unsigned val, uint64_t Address,
515
           const void *Decoder);
516
static DecodeStatus DecodePredNoALOperand(MCInst *Inst, unsigned Val,
517
            uint64_t Address,
518
            const void *Decoder);
519
static DecodeStatus DecodeLOLoop(MCInst *Inst, unsigned Insn, uint64_t Address,
520
         const void *Decoder);
521
static DecodeStatus DecodeLongShiftOperand(MCInst *Inst, unsigned Val,
522
             uint64_t Address,
523
             const void *Decoder);
524
static DecodeStatus DecodeVSCCLRM(MCInst *Inst, unsigned Insn, uint64_t Address,
525
          const void *Decoder);
526
static DecodeStatus DecodeVPTMaskOperand(MCInst *Inst, unsigned Val,
527
           uint64_t Address, const void *Decoder);
528
static DecodeStatus DecodeVpredROperand(MCInst *Inst, unsigned Val,
529
          uint64_t Address, const void *Decoder);
530
static DecodeStatus DecodeRestrictedIPredicateOperand(MCInst *Inst,
531
                  unsigned Val,
532
                  uint64_t Address,
533
                  const void *Decoder);
534
static DecodeStatus DecodeRestrictedSPredicateOperand(MCInst *Inst,
535
                  unsigned Val,
536
                  uint64_t Address,
537
                  const void *Decoder);
538
static DecodeStatus DecodeRestrictedUPredicateOperand(MCInst *Inst,
539
                  unsigned Val,
540
                  uint64_t Address,
541
                  const void *Decoder);
542
static DecodeStatus DecodeRestrictedFPPredicateOperand(MCInst *Inst,
543
                   unsigned Val,
544
                   uint64_t Address,
545
                   const void *Decoder);
546
#define DECLARE_DecodeVSTRVLDR_SYSREG(Writeback) \
547
  static DecodeStatus CONCAT(DecodeVSTRVLDR_SYSREG, Writeback)( \
548
    MCInst * Inst, unsigned Insn, uint64_t Address, \
549
    const void *Decoder);
550
DECLARE_DecodeVSTRVLDR_SYSREG(false) DECLARE_DecodeVSTRVLDR_SYSREG(true)
551
552
#define DECLARE_DecodeMVE_MEM_1_pre(shift) \
553
  static DecodeStatus CONCAT(DecodeMVE_MEM_1_pre, shift)( \
554
    MCInst * Inst, unsigned Val, uint64_t Address, \
555
    const void *Decoder);
556
  DECLARE_DecodeMVE_MEM_1_pre(0) DECLARE_DecodeMVE_MEM_1_pre(1)
557
558
#define DECLARE_DecodeMVE_MEM_2_pre(shift) \
559
  static DecodeStatus CONCAT(DecodeMVE_MEM_2_pre, shift)( \
560
    MCInst * Inst, unsigned Val, uint64_t Address, \
561
    const void *Decoder);
562
    DECLARE_DecodeMVE_MEM_2_pre(0) DECLARE_DecodeMVE_MEM_2_pre(
563
      1) DECLARE_DecodeMVE_MEM_2_pre(2)
564
565
#define DECLARE_DecodeMVE_MEM_3_pre(shift) \
566
  static DecodeStatus CONCAT(DecodeMVE_MEM_3_pre, shift)( \
567
    MCInst * Inst, unsigned Val, uint64_t Address, \
568
    const void *Decoder);
569
      DECLARE_DecodeMVE_MEM_3_pre(
570
        2) DECLARE_DecodeMVE_MEM_3_pre(3)
571
572
#define DECLARE_DecodePowerTwoOperand(MinLog, MaxLog) \
573
  static DecodeStatus CONCAT(DecodePowerTwoOperand, \
574
           CONCAT(MinLog, MaxLog))( \
575
    MCInst * Inst, unsigned Val, uint64_t Address, \
576
    const void *Decoder);
577
        DECLARE_DecodePowerTwoOperand(0, 3)
578
579
#define DECLARE_DecodeMVEPairVectorIndexOperand(start) \
580
  static DecodeStatus CONCAT(DecodeMVEPairVectorIndexOperand, start)( \
581
    MCInst * Inst, unsigned Val, uint64_t Address, \
582
    const void *Decoder);
583
          DECLARE_DecodeMVEPairVectorIndexOperand(
584
            2)
585
            DECLARE_DecodeMVEPairVectorIndexOperand(
586
              0)
587
588
              static DecodeStatus
589
  DecodeMVEVMOVQtoDReg(MCInst *Inst, unsigned Insn, uint64_t Address,
590
           const void *Decoder);
591
static DecodeStatus DecodeMVEVMOVDRegtoQ(MCInst *Inst, unsigned Insn,
592
           uint64_t Address, const void *Decoder);
593
static DecodeStatus DecodeMVEVCVTt1fp(MCInst *Inst, unsigned Insn,
594
              uint64_t Address, const void *Decoder);
595
typedef DecodeStatus OperandDecoder(MCInst *Inst, unsigned Val,
596
            uint64_t Address, const void *Decoder);
597
#define DECLARE_DecodeMVEVCMP(scalar, predicate_decoder) \
598
  static DecodeStatus CONCAT(DecodeMVEVCMP, \
599
           CONCAT(scalar, predicate_decoder))( \
600
    MCInst * Inst, unsigned Insn, uint64_t Address, \
601
    const void *Decoder);
602
DECLARE_DecodeMVEVCMP(false, DecodeRestrictedIPredicateOperand) DECLARE_DecodeMVEVCMP(
603
  false, DecodeRestrictedUPredicateOperand)
604
  DECLARE_DecodeMVEVCMP(false, DecodeRestrictedSPredicateOperand)
605
    DECLARE_DecodeMVEVCMP(true, DecodeRestrictedIPredicateOperand)
606
      DECLARE_DecodeMVEVCMP(true,
607
                DecodeRestrictedUPredicateOperand)
608
        DECLARE_DecodeMVEVCMP(
609
          true, DecodeRestrictedSPredicateOperand)
610
          DECLARE_DecodeMVEVCMP(
611
            false,
612
            DecodeRestrictedFPPredicateOperand)
613
            DECLARE_DecodeMVEVCMP(
614
              true,
615
              DecodeRestrictedFPPredicateOperand)
616
617
              static DecodeStatus
618
  DecodeMveVCTP(MCInst *Inst, unsigned Insn, uint64_t Address,
619
          const void *Decoder);
620
static DecodeStatus DecodeMVEVPNOT(MCInst *Inst, unsigned Insn,
621
           uint64_t Address, const void *Decoder);
622
static DecodeStatus DecodeMVEOverlappingLongShift(MCInst *Inst, unsigned Insn,
623
              uint64_t Address,
624
              const void *Decoder);
625
static DecodeStatus DecodeT2AddSubSPImm(MCInst *Inst, unsigned Insn,
626
          uint64_t Address, const void *Decoder);
627
628
#include "ARMGenDisassemblerTables.inc"
629
630
// Post-decoding checks
631
static DecodeStatus checkDecodedInstruction(MCInst *MI, uint32_t Insn,
632
              DecodeStatus Result)
633
173k
{
634
173k
  switch (MCInst_getOpcode(MI)) {
635
146
  case ARM_HVC: {
636
    // HVC is undefined if condition = 0xf otherwise upredictable
637
    // if condition != 0xe
638
146
    uint32_t Cond = (Insn >> 28) & 0xF;
639
146
    if (Cond == 0xF)
640
1
      return MCDisassembler_Fail;
641
145
    if (Cond != 0xE)
642
103
      return MCDisassembler_SoftFail;
643
42
    return Result;
644
145
  }
645
932
  case ARM_t2ADDri:
646
1.25k
  case ARM_t2ADDri12:
647
1.28k
  case ARM_t2ADDrr:
648
1.41k
  case ARM_t2ADDrs:
649
1.60k
  case ARM_t2SUBri:
650
2.10k
  case ARM_t2SUBri12:
651
2.18k
  case ARM_t2SUBrr:
652
2.99k
  case ARM_t2SUBrs:
653
2.99k
    if (MCOperand_getReg(MCInst_getOperand(MI, (0))) == ARM_SP &&
654
2.99k
        MCOperand_getReg(MCInst_getOperand(MI, (1))) != ARM_SP)
655
409
      return MCDisassembler_SoftFail;
656
2.58k
    return Result;
657
170k
  default:
658
170k
    return Result;
659
173k
  }
660
173k
}
661
662
static DecodeStatus getInstruction(csh ud, const uint8_t *Bytes,
663
           size_t BytesLen, MCInst *MI, uint16_t *Size,
664
           uint64_t Address, void *Info)
665
1.18M
{
666
1.18M
  DecodeStatus Result = MCDisassembler_Fail;
667
1.18M
  if (MI->csh->mode & CS_MODE_THUMB)
668
1.06M
    Result = getThumbInstruction(ud, Bytes, BytesLen, MI, Size,
669
1.06M
               Address, Info);
670
124k
  else
671
124k
    Result = getARMInstruction(ud, Bytes, BytesLen, MI, Size,
672
124k
             Address, Info);
673
1.18M
  MCInst_handleWriteback(MI, ARMInsts);
674
1.18M
  return Result;
675
1.18M
}
676
677
static inline uint32_t endianSensitiveOpcode32(MCInst *MI, const uint8_t *Bytes)
678
123k
{
679
123k
  uint32_t Insn;
680
123k
  if (MODE_IS_BIG_ENDIAN(MI->csh->mode))
681
0
    Insn = (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) |
682
0
           ((uint32_t)Bytes[0] << 24);
683
123k
  else
684
123k
    Insn = ((uint32_t)Bytes[3] << 24) | (Bytes[2] << 16) |
685
123k
           (Bytes[1] << 8) | (Bytes[0] << 0);
686
123k
  return Insn;
687
123k
}
688
689
static inline uint16_t endianSensitiveOpcode16(MCInst *MI, const uint8_t *Bytes)
690
1.29M
{
691
1.29M
  uint16_t Insn;
692
1.29M
  if (MODE_IS_BIG_ENDIAN(MI->csh->mode))
693
0
    Insn = (Bytes[0] << 8) | Bytes[1];
694
1.29M
  else
695
1.29M
    Insn = (Bytes[1] << 8) | Bytes[0];
696
697
1.29M
  return Insn;
698
1.29M
}
699
700
DecodeStatus getARMInstruction(csh ud, const uint8_t *Bytes, size_t BytesLen,
701
             MCInst *MI, uint16_t *Size, uint64_t Address,
702
             void *Info)
703
124k
{
704
  // We want to read exactly 4 bytes of data.
705
124k
  if (BytesLen < 4) {
706
1.04k
    *Size = 0;
707
1.04k
    return MCDisassembler_Fail;
708
1.04k
  }
709
710
  // Encoded as a 32-bit word in the stream.
711
123k
  uint32_t Insn = endianSensitiveOpcode32(MI, Bytes);
712
713
  // Calling the auto-generated decoder function.
714
123k
  DecodeStatus Result =
715
123k
    decodeInstruction_4(DecoderTableARM32, MI, Insn, Address);
716
123k
  if (Result != MCDisassembler_Fail) {
717
96.8k
    *Size = 4;
718
96.8k
    return checkDecodedInstruction(MI, Insn, Result);
719
96.8k
  }
720
721
26.1k
  typedef struct DecodeTable {
722
26.1k
    const uint8_t *P;
723
26.1k
    bool DecodePred;
724
26.1k
  } DecodeTable;
725
726
26.1k
  const DecodeTable Tables[] = {
727
26.1k
    { DecoderTableVFP32, false },
728
26.1k
    { DecoderTableVFPV832, false },
729
26.1k
    { DecoderTableNEONData32, true },
730
26.1k
    { DecoderTableNEONLoadStore32, true },
731
26.1k
    { DecoderTableNEONDup32, true },
732
26.1k
    { DecoderTablev8NEON32, false },
733
26.1k
    { DecoderTablev8Crypto32, false },
734
26.1k
  };
735
736
154k
  for (int i = 0; i < (sizeof(Tables) / sizeof(Tables[0])); ++i) {
737
137k
    MCInst_clear(MI);
738
137k
    DecodeTable Table = Tables[i];
739
137k
    Result = decodeInstruction_4(Table.P, MI, Insn, Address);
740
137k
    if (Result != MCDisassembler_Fail) {
741
9.13k
      *Size = 4;
742
      // Add a fake predicate operand, because we share these instruction
743
      // definitions with Thumb2 where these instructions are predicable.
744
9.13k
      if (Table.DecodePred &&
745
9.13k
          !DecodePredicateOperand(MI, 0xE, Address, Table.P))
746
0
        return MCDisassembler_Fail;
747
9.13k
      return Result;
748
9.13k
    }
749
137k
  }
750
751
17.0k
  Result = decodeInstruction_4(DecoderTableCoProc32, MI, Insn, Address);
752
17.0k
  if (Result != MCDisassembler_Fail) {
753
16.1k
    *Size = 4;
754
16.1k
    return checkDecodedInstruction(MI, Insn, Result);
755
16.1k
  }
756
757
857
  *Size = 4;
758
857
  return MCDisassembler_Fail;
759
17.0k
}
760
761
extern const MCInstrDesc ARMInsts[];
762
763
/// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
764
/// immediate Value in the MCInst.  The immediate Value has had any PC
765
/// adjustment made by the caller.  If the instruction is a branch instruction
766
/// then isBranch is true, else false.  If the getOpInfo() function was set as
767
/// part of the setupForSymbolicDisassembly() call then that function is called
768
/// to get any symbolic information at the Address for this instruction.  If
769
/// that returns non-zero then the symbolic information it returns is used to
770
/// create an MCExpr and that is added as an operand to the MCInst.  If
771
/// getOpInfo() returns zero and isBranch is true then a symbol look up for
772
/// Value is done and if a symbol is found an MCExpr is created with that, else
773
/// an MCExpr with Value is created.  This function returns true if it adds an
774
/// operand to the MCInst and false otherwise.
775
static bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value,
776
             bool isBranch, uint64_t InstSize,
777
             MCInst *MI, const void *Decoder)
778
62.6k
{
779
  // FIXME: Does it make sense for value to be negative?
780
  // return Decoder->tryAddingSymbolicOperand(MI, (uint32_t)Value, Address,
781
  //         isBranch, /*Offset=*/0, /*OpSize=*/0,
782
  //         InstSize);
783
62.6k
  return false;
784
62.6k
}
785
786
/// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
787
/// referenced by a load instruction with the base register that is the Pc.
788
/// These can often be values in a literal pool near the Address of the
789
/// instruction.  The Address of the instruction and its immediate Value are
790
/// used as a possible literal pool entry.  The SymbolLookUp call back will
791
/// return the name of a symbol referenced by the literal pool's entry if
792
/// the referenced address is that of a symbol.  Or it will return a pointer to
793
/// a literal 'C' string if the referenced address of the literal pool's entry
794
/// is an address into a section with 'C' string literals.
795
static void tryAddingPcLoadReferenceComment(uint64_t Address, int Value,
796
              const void *Decoder)
797
18.9k
{
798
  // Decoder->tryAddingPcLoadReferenceComment(Value, Address);
799
18.9k
}
800
801
// Thumb1 instructions don't have explicit S bits.  Rather, they
802
// implicitly set CPSR.  Since it's not represented in the encoding, the
803
// auto-generated decoder won't inject the CPSR operand.  We need to fix
804
// that as a post-pass.
805
static void AddThumb1SBit(MCInst *MI, bool InITBlock)
806
473k
{
807
473k
  const MCOperandInfo *OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo;
808
473k
  unsigned short NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands;
809
473k
  unsigned i;
810
811
962k
  for (i = 0; i < NumOps; ++i) {
812
954k
    if (i == MCInst_getNumOperands(MI))
813
0
      break;
814
954k
    if (MCOperandInfo_isOptionalDef(&OpInfo[i]) &&
815
954k
        OpInfo[i].RegClass == ARM_CCRRegClassID) {
816
466k
      if (i > 0 && MCOperandInfo_isPredicate(&OpInfo[i - 1]))
817
0
        continue;
818
466k
      MCInst_insert0(MI, i,
819
466k
               MCOperand_CreateReg1(
820
466k
                 MI, (InITBlock ? 0 : ARM_CPSR)));
821
466k
      return;
822
466k
    }
823
954k
  }
824
825
7.56k
  MCInst_insert0(MI, i,
826
7.56k
           MCOperand_CreateReg1(MI, (InITBlock ? 0 : ARM_CPSR)));
827
7.56k
}
828
829
static bool isVectorPredicable(unsigned Opcode)
830
2.67M
{
831
2.67M
  const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
832
2.67M
  unsigned short NumOps = ARMInsts[Opcode].NumOperands;
833
16.6M
  for (unsigned i = 0; i < NumOps; ++i) {
834
14.0M
    if (ARM_isVpred(OpInfo[i].OperandType))
835
86.4k
      return true;
836
14.0M
  }
837
2.58M
  return false;
838
2.67M
}
839
840
// Most Thumb instructions don't have explicit predicates in the
841
// encoding, but rather get their predicates from IT context.  We need
842
// to fix up the predicate operands using this context information as a
843
// post-pass.
844
DecodeStatus AddThumbPredicate(MCInst *MI)
845
1.04M
{
846
1.04M
  DecodeStatus S = MCDisassembler_Success;
847
848
  // A few instructions actually have predicates encoded in them.  Don't
849
  // try to overwrite it if we're seeing one of those.
850
1.04M
  switch (MCInst_getOpcode(MI)) {
851
20.4k
  case ARM_tBcc:
852
22.2k
  case ARM_t2Bcc:
853
26.1k
  case ARM_tCBZ:
854
28.9k
  case ARM_tCBNZ:
855
29.1k
  case ARM_tCPS:
856
29.1k
  case ARM_t2CPS3p:
857
29.2k
  case ARM_t2CPS2p:
858
30.4k
  case ARM_t2CPS1p:
859
30.9k
  case ARM_t2CSEL:
860
30.9k
  case ARM_t2CSINC:
861
31.0k
  case ARM_t2CSINV:
862
32.0k
  case ARM_t2CSNEG:
863
144k
  case ARM_tMOVSr:
864
144k
  case ARM_tSETEND:
865
    // Some instructions (mostly conditional branches) are not
866
    // allowed in IT blocks.
867
144k
    if (ITBlock_instrInITBlock(&(MI->csh->ITBlock)))
868
1.73k
      S = MCDisassembler_SoftFail;
869
142k
    else
870
142k
      return MCDisassembler_Success;
871
1.73k
    break;
872
1.73k
  case ARM_t2HINT:
873
173
    if (MCOperand_getImm(MCInst_getOperand(MI, (0))) == 0x10 &&
874
173
        (ARM_getFeatureBits(MI->csh->mode, ARM_FeatureRAS)) != 0)
875
0
      S = MCDisassembler_SoftFail;
876
173
    break;
877
17.5k
  case ARM_tB:
878
18.4k
  case ARM_t2B:
879
18.6k
  case ARM_t2TBB:
880
19.2k
  case ARM_t2TBH:
881
    // Some instructions (mostly unconditional branches) can
882
    // only appears at the end of, or outside of, an IT.
883
19.2k
    if (ITBlock_instrInITBlock(&(MI->csh->ITBlock)) &&
884
19.2k
        !ITBlock_instrLastInITBlock(&(MI->csh->ITBlock)))
885
752
      S = MCDisassembler_SoftFail;
886
19.2k
    break;
887
877k
  default:
888
877k
    break;
889
1.04M
  }
890
891
  // Warn on non-VPT predicable instruction in a VPT block and a VPT
892
  // predicable instruction in an IT block
893
898k
  if ((!isVectorPredicable(MCInst_getOpcode(MI)) &&
894
898k
       VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock))) ||
895
898k
      (isVectorPredicable(MCInst_getOpcode(MI)) &&
896
875k
       ITBlock_instrInITBlock(&(MI->csh->ITBlock))))
897
24.1k
    S = MCDisassembler_SoftFail;
898
899
  // If we're in an IT/VPT block, base the predicate on that.  Otherwise,
900
  // assume a predicate of AL.
901
898k
  unsigned CC = ARMCC_AL;
902
898k
  unsigned VCC = ARMVCC_None;
903
898k
  if (ITBlock_instrInITBlock(&(MI->csh->ITBlock))) {
904
27.9k
    CC = ITBlock_getITCC(&(MI->csh->ITBlock));
905
27.9k
    ITBlock_advanceITState(&(MI->csh->ITBlock));
906
870k
  } else if (VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock))) {
907
25.2k
    VCC = VPTBlock_getVPTPred(&(MI->csh->VPTBlock));
908
25.2k
    VPTBlock_advanceVPTState(&(MI->csh->VPTBlock));
909
25.2k
  }
910
911
898k
  const MCOperandInfo *OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo;
912
898k
  unsigned short NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands;
913
914
898k
  unsigned i;
915
3.61M
  for (i = 0; i < NumOps; ++i) {
916
3.57M
    if (MCOperandInfo_isPredicate(&OpInfo[i]) ||
917
3.57M
        i == MCInst_getNumOperands(MI))
918
865k
      break;
919
3.57M
  }
920
921
898k
  if (MCInst_isPredicable(&ARMInsts[MCInst_getOpcode(MI)])) {
922
840k
    MCInst_insert0(MI, i, MCOperand_CreateImm1(MI, (CC)));
923
924
840k
    if (CC == ARMCC_AL)
925
825k
      MCInst_insert0(MI, i + 1,
926
825k
               MCOperand_CreateReg1(MI, (0)));
927
14.2k
    else
928
14.2k
      MCInst_insert0(MI, i + 1,
929
14.2k
               MCOperand_CreateReg1(MI, (ARM_CPSR)));
930
840k
  } else if (CC != ARMCC_AL) {
931
10.2k
    Check(&S, MCDisassembler_SoftFail);
932
10.2k
  }
933
934
898k
  unsigned VCCPos;
935
5.33M
  for (VCCPos = 0; VCCPos < NumOps; ++VCCPos) {
936
4.73M
    if (ARM_isVpred(OpInfo[VCCPos].OperandType) ||
937
4.73M
        VCCPos == MCInst_getNumOperands(MI))
938
297k
      break;
939
4.73M
  }
940
941
898k
  if (isVectorPredicable(MCInst_getOpcode(MI))) {
942
28.8k
    MCInst_insert0(MI, VCCPos, MCOperand_CreateImm1(MI, (VCC)));
943
944
28.8k
    if (VCC == ARMVCC_None)
945
24.7k
      MCInst_insert0(MI, VCCPos + 1,
946
24.7k
               MCOperand_CreateReg1(MI, (0)));
947
4.07k
    else
948
4.07k
      MCInst_insert0(MI, VCCPos + 1,
949
4.07k
               MCOperand_CreateReg1(MI, (ARM_P0)));
950
28.8k
    MCInst_insert0(MI, VCCPos + 2, MCOperand_CreateReg1(MI, (0)));
951
28.8k
    if (OpInfo[VCCPos].OperandType == ARM_OP_VPRED_R) {
952
6.51k
      int TiedOp = MCOperandInfo_getOperandConstraint(
953
6.51k
        &ARMInsts[MCInst_getOpcode(MI)], VCCPos + 3,
954
6.51k
        MCOI_TIED_TO);
955
6.51k
      assert(TiedOp >= 0 &&
956
6.51k
             "Inactive register in vpred_r is not tied to an output!");
957
      // Copy the operand to ensure it's not invalidated when MI grows.
958
6.51k
      MCOperand *Op = malloc(sizeof(MCOperand));
959
6.51k
      memcpy(Op, MCInst_getOperand(MI, TiedOp),
960
6.51k
             sizeof(MCOperand));
961
6.51k
      MCInst_insert0(MI, VCCPos + 3, Op);
962
6.51k
      free(Op);
963
6.51k
    }
964
869k
  } else if (VCC != ARMVCC_None) {
965
21.2k
    Check(&S, MCDisassembler_SoftFail);
966
21.2k
  }
967
968
898k
  return S;
969
898k
}
970
971
// Thumb VFP instructions are a special case.  Because we share their
972
// encodings between ARM and Thumb modes, and they are predicable in ARM
973
// mode, the auto-generated decoder will give them an (incorrect)
974
// predicate operand.  We need to rewrite these operands based on the IT
975
// context as a post-pass.
976
void UpdateThumbVFPPredicate(DecodeStatus S, MCInst *MI)
977
12.4k
{
978
12.4k
  unsigned CC;
979
12.4k
  CC = ITBlock_getITCC(&(MI->csh->ITBlock));
980
12.4k
  if (CC == 0xF)
981
552
    CC = ARMCC_AL;
982
12.4k
  if (ITBlock_instrInITBlock(&(MI->csh->ITBlock)))
983
1.12k
    ITBlock_advanceITState(&(MI->csh->ITBlock));
984
11.3k
  else if (VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock))) {
985
282
    CC = VPTBlock_getVPTPred(&(MI->csh->VPTBlock));
986
282
    VPTBlock_advanceVPTState(&(MI->csh->VPTBlock));
987
282
  }
988
989
12.4k
  const MCOperandInfo *OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo;
990
12.4k
  unsigned short NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands;
991
43.5k
  for (unsigned i = 0; i < NumOps; ++i) {
992
43.5k
    if (MCOperandInfo_isPredicate(&OpInfo[i])) {
993
12.4k
      if (CC != ARMCC_AL &&
994
12.4k
          !MCInst_isPredicable(
995
844
            &ARMInsts[MCInst_getOpcode(MI)]))
996
0
        Check(&S, MCDisassembler_SoftFail);
997
12.4k
      MCOperand_setImm(MCInst_getOperand(MI, i), CC);
998
999
12.4k
      if (CC == ARMCC_AL)
1000
11.6k
        MCOperand_setReg(MCInst_getOperand(MI, i + 1),
1001
11.6k
             0);
1002
844
      else
1003
844
        MCOperand_setReg(MCInst_getOperand(MI, i + 1),
1004
844
             ARM_CPSR);
1005
1006
12.4k
      return;
1007
12.4k
    }
1008
43.5k
  }
1009
12.4k
}
1010
1011
DecodeStatus getThumbInstruction(csh ud, const uint8_t *Bytes, size_t BytesLen,
1012
         MCInst *MI, uint16_t *Size, uint64_t Address,
1013
         void *Info)
1014
1.06M
{
1015
  // We want to read exactly 2 bytes of data.
1016
1.06M
  if (BytesLen < 2) {
1017
1.95k
    *Size = 0;
1018
1.95k
    return MCDisassembler_Fail;
1019
1.95k
  }
1020
1021
1.05M
  uint16_t Insn16 = endianSensitiveOpcode16(MI, Bytes);
1022
1.05M
  DecodeStatus Result =
1023
1.05M
    decodeInstruction_2(DecoderTableThumb16, MI, Insn16, Address);
1024
1.05M
  if (Result != MCDisassembler_Fail) {
1025
540k
    *Size = 2;
1026
540k
    Check(&Result, AddThumbPredicate(MI));
1027
540k
    return Result;
1028
540k
  }
1029
1030
518k
  Result = decodeInstruction_2(DecoderTableThumbSBit16, MI, Insn16,
1031
518k
             Address);
1032
518k
  if (Result) {
1033
268k
    *Size = 2;
1034
268k
    bool InITBlock = ITBlock_instrInITBlock(&(MI->csh->ITBlock));
1035
268k
    Check(&Result, AddThumbPredicate(MI));
1036
268k
    AddThumb1SBit(MI, InITBlock);
1037
268k
    return Result;
1038
268k
  }
1039
1040
250k
  Result = decodeInstruction_2(DecoderTableThumb216, MI, Insn16, Address);
1041
250k
  if (Result != MCDisassembler_Fail) {
1042
12.4k
    *Size = 2;
1043
1044
    // Nested IT blocks are UNPREDICTABLE.  Must be checked before we add
1045
    // the Thumb predicate.
1046
12.4k
    if (MCInst_getOpcode(MI) == ARM_t2IT &&
1047
12.4k
        ITBlock_instrInITBlock(&(MI->csh->ITBlock)))
1048
8.16k
      Result = MCDisassembler_SoftFail;
1049
1050
12.4k
    Check(&Result, AddThumbPredicate(MI));
1051
1052
    // If we find an IT instruction, we need to parse its condition
1053
    // code and mask operands so that we can apply them correctly
1054
    // to the subsequent instructions.
1055
12.4k
    if (MCInst_getOpcode(MI) == ARM_t2IT) {
1056
12.4k
      unsigned Firstcond =
1057
12.4k
        MCOperand_getImm(MCInst_getOperand(MI, (0)));
1058
12.4k
      unsigned Mask =
1059
12.4k
        MCOperand_getImm(MCInst_getOperand(MI, (1)));
1060
12.4k
      ITBlock_setITState(&(MI->csh->ITBlock), (char)Firstcond,
1061
12.4k
             (char)Mask);
1062
1063
      // An IT instruction that would give a 'NV' predicate is
1064
      // unpredictable. if (Firstcond == ARMCC_AL && !isPowerOf2_32(Mask))
1065
      //  SStream_concat0(CS, "unpredictable IT predicate sequence");
1066
12.4k
    }
1067
1068
12.4k
    return Result;
1069
12.4k
  }
1070
1071
  // We want to read exactly 4 bytes of data.
1072
237k
  if (BytesLen < 4) {
1073
647
    *Size = 0;
1074
647
    return MCDisassembler_Fail;
1075
647
  }
1076
237k
  uint32_t Insn32 = (uint32_t)Insn16 << 16 |
1077
237k
        endianSensitiveOpcode16(MI, Bytes + 2);
1078
1079
237k
  Result = decodeInstruction_4(DecoderTableMVE32, MI, Insn32, Address);
1080
237k
  if (Result != MCDisassembler_Fail) {
1081
39.0k
    *Size = 4;
1082
1083
    // Nested VPT blocks are UNPREDICTABLE. Must be checked before we add
1084
    // the VPT predicate.
1085
39.0k
    if (isVPTOpcode(MCInst_getOpcode(MI)) &&
1086
39.0k
        VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock)))
1087
4.09k
      Result = MCDisassembler_SoftFail;
1088
1089
39.0k
    Check(&Result, AddThumbPredicate(MI));
1090
1091
39.0k
    if (isVPTOpcode(MCInst_getOpcode(MI))) {
1092
8.54k
      unsigned Mask =
1093
8.54k
        MCOperand_getImm(MCInst_getOperand(MI, (0)));
1094
8.54k
      VPTBlock_setVPTState(&(MI->csh->VPTBlock), Mask);
1095
8.54k
    }
1096
1097
39.0k
    return Result;
1098
39.0k
  }
1099
1100
198k
  Result = decodeInstruction_4(DecoderTableThumb32, MI, Insn32, Address);
1101
198k
  if (Result != MCDisassembler_Fail) {
1102
3.66k
    *Size = 4;
1103
3.66k
    bool InITBlock = ITBlock_instrInITBlock(&(MI->csh->ITBlock));
1104
3.66k
    Check(&Result, AddThumbPredicate(MI));
1105
3.66k
    AddThumb1SBit(MI, InITBlock);
1106
3.66k
    return Result;
1107
3.66k
  }
1108
1109
194k
  Result = decodeInstruction_4(DecoderTableThumb232, MI, Insn32, Address);
1110
194k
  if (Result != MCDisassembler_Fail) {
1111
60.6k
    *Size = 4;
1112
60.6k
    Check(&Result, AddThumbPredicate(MI));
1113
60.6k
    return checkDecodedInstruction(MI, Insn32, Result);
1114
60.6k
  }
1115
1116
133k
  if (fieldFromInstruction_4(Insn32, 28, 4) == 0xE) {
1117
47.0k
    Result = decodeInstruction_4(DecoderTableVFP32, MI, Insn32,
1118
47.0k
               Address);
1119
47.0k
    if (Result != MCDisassembler_Fail) {
1120
12.4k
      *Size = 4;
1121
12.4k
      UpdateThumbVFPPredicate(Result, MI);
1122
12.4k
      return Result;
1123
12.4k
    }
1124
47.0k
  }
1125
1126
121k
  Result = decodeInstruction_4(DecoderTableVFPV832, MI, Insn32, Address);
1127
121k
  if (Result != MCDisassembler_Fail) {
1128
2.47k
    *Size = 4;
1129
2.47k
    return Result;
1130
2.47k
  }
1131
1132
118k
  if (fieldFromInstruction_4(Insn32, 28, 4) == 0xE) {
1133
34.3k
    Result = decodeInstruction_4(DecoderTableNEONDup32, MI, Insn32,
1134
34.3k
               Address);
1135
34.3k
    if (Result != MCDisassembler_Fail) {
1136
1.51k
      *Size = 4;
1137
1.51k
      Check(&Result, AddThumbPredicate(MI));
1138
1.51k
      return Result;
1139
1.51k
    }
1140
34.3k
  }
1141
1142
117k
  if (fieldFromInstruction_4(Insn32, 24, 8) == 0xF9) {
1143
39.8k
    uint32_t NEONLdStInsn = Insn32;
1144
39.8k
    NEONLdStInsn &= 0xF0FFFFFF;
1145
39.8k
    NEONLdStInsn |= 0x04000000;
1146
39.8k
    Result = decodeInstruction_4(DecoderTableNEONLoadStore32, MI,
1147
39.8k
               NEONLdStInsn, Address);
1148
39.8k
    if (Result != MCDisassembler_Fail) {
1149
39.5k
      *Size = 4;
1150
39.5k
      Check(&Result, AddThumbPredicate(MI));
1151
39.5k
      return Result;
1152
39.5k
    }
1153
39.8k
  }
1154
1155
77.9k
  if (fieldFromInstruction_4(Insn32, 24, 4) == 0xF) {
1156
24.7k
    uint32_t NEONDataInsn = Insn32;
1157
24.7k
    NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
1158
24.7k
    NEONDataInsn |= (NEONDataInsn & 0x10000000) >>
1159
24.7k
        4;      // Move bit 28 to bit 24
1160
24.7k
    NEONDataInsn |= 0x12000000; // Set bits 28 and 25
1161
24.7k
    Result = decodeInstruction_4(DecoderTableNEONData32, MI,
1162
24.7k
               NEONDataInsn, Address);
1163
24.7k
    if (Result != MCDisassembler_Fail) {
1164
23.8k
      *Size = 4;
1165
23.8k
      Check(&Result, AddThumbPredicate(MI));
1166
23.8k
      return Result;
1167
23.8k
    }
1168
1169
921
    uint32_t NEONCryptoInsn = Insn32;
1170
921
    NEONCryptoInsn &= 0xF0FFFFFF; // Clear bits 27-24
1171
921
    NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >>
1172
921
          4;        // Move bit 28 to bit 24
1173
921
    NEONCryptoInsn |= 0x12000000; // Set bits 28 and 25
1174
921
    Result = decodeInstruction_4(DecoderTablev8Crypto32, MI,
1175
921
               NEONCryptoInsn, Address);
1176
921
    if (Result != MCDisassembler_Fail) {
1177
72
      *Size = 4;
1178
72
      return Result;
1179
72
    }
1180
1181
849
    uint32_t NEONv8Insn = Insn32;
1182
849
    NEONv8Insn &= 0xF3FFFFFF; // Clear bits 27-26
1183
849
    Result = decodeInstruction_4(DecoderTablev8NEON32, MI,
1184
849
               NEONv8Insn, Address);
1185
849
    if (Result != MCDisassembler_Fail) {
1186
163
      *Size = 4;
1187
163
      return Result;
1188
163
    }
1189
849
  }
1190
1191
53.8k
  uint32_t Coproc = fieldFromInstruction_4(Insn32, 8, 4);
1192
53.8k
  const uint8_t *DecoderTable = ARM_isCDECoproc(Coproc, MI) ?
1193
0
                DecoderTableThumb2CDE32 :
1194
53.8k
                DecoderTableThumb2CoProc32;
1195
53.8k
  Result = decodeInstruction_4(DecoderTable, MI, Insn32, Address);
1196
53.8k
  if (Result != MCDisassembler_Fail) {
1197
52.0k
    *Size = 4;
1198
52.0k
    Check(&Result, AddThumbPredicate(MI));
1199
52.0k
    return Result;
1200
52.0k
  }
1201
1202
1.78k
  *Size = 0;
1203
1.78k
  return MCDisassembler_Fail;
1204
53.8k
}
1205
1206
static const uint16_t GPRDecoderTable[] = { ARM_R0,  ARM_R1, ARM_R2,  ARM_R3,
1207
              ARM_R4,  ARM_R5, ARM_R6,  ARM_R7,
1208
              ARM_R8,  ARM_R9, ARM_R10, ARM_R11,
1209
              ARM_R12, ARM_SP, ARM_LR,  ARM_PC };
1210
1211
static const uint16_t CLRMGPRDecoderTable[] = {
1212
  ARM_R0, ARM_R1, ARM_R2,  ARM_R3,  ARM_R4,  ARM_R5, ARM_R6, ARM_R7,
1213
  ARM_R8, ARM_R9, ARM_R10, ARM_R11, ARM_R12, 0,    ARM_LR, ARM_APSR
1214
};
1215
1216
static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1217
             uint64_t Address,
1218
             const void *Decoder)
1219
4.04M
{
1220
4.04M
  if (RegNo > 15)
1221
26
    return MCDisassembler_Fail;
1222
1223
4.04M
  unsigned Register = GPRDecoderTable[RegNo];
1224
4.04M
  MCOperand_CreateReg0(Inst, (Register));
1225
4.04M
  return MCDisassembler_Success;
1226
4.04M
}
1227
1228
static DecodeStatus DecodeCLRMGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1229
                 uint64_t Address,
1230
                 const void *Decoder)
1231
539
{
1232
539
  if (RegNo > 15)
1233
0
    return MCDisassembler_Fail;
1234
1235
539
  unsigned Register = CLRMGPRDecoderTable[RegNo];
1236
539
  if (Register == 0)
1237
0
    return MCDisassembler_Fail;
1238
1239
539
  MCOperand_CreateReg0(Inst, (Register));
1240
539
  return MCDisassembler_Success;
1241
539
}
1242
1243
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, unsigned RegNo,
1244
                 uint64_t Address,
1245
                 const void *Decoder)
1246
170k
{
1247
170k
  DecodeStatus S = MCDisassembler_Success;
1248
1249
170k
  if (RegNo == 15)
1250
33.8k
    S = MCDisassembler_SoftFail;
1251
1252
170k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1253
1254
170k
  return S;
1255
170k
}
1256
1257
static DecodeStatus DecodeGPRnospRegisterClass(MCInst *Inst, unsigned RegNo,
1258
                 uint64_t Address,
1259
                 const void *Decoder)
1260
257
{
1261
257
  DecodeStatus S = MCDisassembler_Success;
1262
1263
257
  if (RegNo == 13)
1264
86
    S = MCDisassembler_SoftFail;
1265
1266
257
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1267
1268
257
  return S;
1269
257
}
1270
1271
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, unsigned RegNo,
1272
               uint64_t Address,
1273
               const void *Decoder)
1274
7.71k
{
1275
7.71k
  DecodeStatus S = MCDisassembler_Success;
1276
1277
7.71k
  if (RegNo == 15) {
1278
2.53k
    MCOperand_CreateReg0(Inst, (ARM_APSR_NZCV));
1279
2.53k
    return MCDisassembler_Success;
1280
2.53k
  }
1281
1282
5.17k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1283
5.17k
  return S;
1284
7.71k
}
1285
1286
static DecodeStatus DecodeGPRwithZRRegisterClass(MCInst *Inst, unsigned RegNo,
1287
             uint64_t Address,
1288
             const void *Decoder)
1289
9.71k
{
1290
9.71k
  DecodeStatus S = MCDisassembler_Success;
1291
1292
9.71k
  if (RegNo == 15) {
1293
5.25k
    MCOperand_CreateReg0(Inst, (ARM_ZR));
1294
5.25k
    return MCDisassembler_Success;
1295
5.25k
  }
1296
1297
4.46k
  if (RegNo == 13)
1298
1.12k
    Check(&S, MCDisassembler_SoftFail);
1299
1300
4.46k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1301
4.46k
  return S;
1302
9.71k
}
1303
1304
static DecodeStatus DecodeGPRwithZRnospRegisterClass(MCInst *Inst,
1305
                 unsigned RegNo,
1306
                 uint64_t Address,
1307
                 const void *Decoder)
1308
3.22k
{
1309
3.22k
  DecodeStatus S = MCDisassembler_Success;
1310
3.22k
  if (RegNo == 13)
1311
4
    return MCDisassembler_Fail;
1312
3.22k
  Check(&S, DecodeGPRwithZRRegisterClass(Inst, RegNo, Address, Decoder));
1313
3.22k
  return S;
1314
3.22k
}
1315
1316
static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1317
              uint64_t Address,
1318
              const void *Decoder)
1319
2.33M
{
1320
2.33M
  if (RegNo > 7)
1321
0
    return MCDisassembler_Fail;
1322
2.33M
  return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
1323
2.33M
}
1324
1325
static const uint16_t GPRPairDecoderTable[] = { ARM_R0_R1, ARM_R2_R3,
1326
            ARM_R4_R5, ARM_R6_R7,
1327
            ARM_R8_R9, ARM_R10_R11,
1328
            ARM_R12_SP };
1329
1330
static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo,
1331
                 uint64_t Address,
1332
                 const void *Decoder)
1333
391
{
1334
391
  DecodeStatus S = MCDisassembler_Success;
1335
1336
  // According to the Arm ARM RegNo = 14 is undefined, but we return fail
1337
  // rather than SoftFail as there is no GPRPair table entry for index 7.
1338
391
  if (RegNo > 13)
1339
2
    return MCDisassembler_Fail;
1340
1341
389
  if (RegNo & 1)
1342
284
    S = MCDisassembler_SoftFail;
1343
1344
389
  unsigned RegisterPair = GPRPairDecoderTable[RegNo / 2];
1345
389
  MCOperand_CreateReg0(Inst, (RegisterPair));
1346
389
  return S;
1347
391
}
1348
1349
static DecodeStatus DecodeGPRPairnospRegisterClass(MCInst *Inst, unsigned RegNo,
1350
               uint64_t Address,
1351
               const void *Decoder)
1352
0
{
1353
0
  if (RegNo > 13)
1354
0
    return MCDisassembler_Fail;
1355
1356
0
  unsigned RegisterPair = GPRPairDecoderTable[RegNo / 2];
1357
0
  MCOperand_CreateReg0(Inst, (RegisterPair));
1358
1359
0
  if ((RegNo & 1) || RegNo > 10)
1360
0
    return MCDisassembler_SoftFail;
1361
0
  return MCDisassembler_Success;
1362
0
}
1363
1364
static DecodeStatus DecodeGPRspRegisterClass(MCInst *Inst, unsigned RegNo,
1365
               uint64_t Address,
1366
               const void *Decoder)
1367
1.22k
{
1368
1.22k
  if (RegNo != 13)
1369
0
    return MCDisassembler_Fail;
1370
1371
1.22k
  unsigned Register = GPRDecoderTable[RegNo];
1372
1.22k
  MCOperand_CreateReg0(Inst, (Register));
1373
1.22k
  return MCDisassembler_Success;
1374
1.22k
}
1375
1376
static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1377
               uint64_t Address,
1378
               const void *Decoder)
1379
273
{
1380
273
  unsigned Register = 0;
1381
273
  switch (RegNo) {
1382
186
  case 0:
1383
186
    Register = ARM_R0;
1384
186
    break;
1385
66
  case 1:
1386
66
    Register = ARM_R1;
1387
66
    break;
1388
4
  case 2:
1389
4
    Register = ARM_R2;
1390
4
    break;
1391
0
  case 3:
1392
0
    Register = ARM_R3;
1393
0
    break;
1394
7
  case 9:
1395
7
    Register = ARM_R9;
1396
7
    break;
1397
0
  case 12:
1398
0
    Register = ARM_R12;
1399
0
    break;
1400
10
  default:
1401
10
    return MCDisassembler_Fail;
1402
273
  }
1403
1404
263
  MCOperand_CreateReg0(Inst, (Register));
1405
263
  return MCDisassembler_Success;
1406
273
}
1407
1408
static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1409
              uint64_t Address,
1410
              const void *Decoder)
1411
259k
{
1412
259k
  DecodeStatus S = MCDisassembler_Success;
1413
1414
259k
  if ((RegNo == 13 &&
1415
259k
       !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops)) ||
1416
259k
      RegNo == 15)
1417
74.7k
    S = MCDisassembler_SoftFail;
1418
1419
259k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1420
259k
  return S;
1421
259k
}
1422
1423
static const uint16_t SPRDecoderTable[] = {
1424
  ARM_S0,  ARM_S1,  ARM_S2,  ARM_S3,  ARM_S4,  ARM_S5,  ARM_S6,  ARM_S7,
1425
  ARM_S8,  ARM_S9,  ARM_S10, ARM_S11, ARM_S12, ARM_S13, ARM_S14, ARM_S15,
1426
  ARM_S16, ARM_S17, ARM_S18, ARM_S19, ARM_S20, ARM_S21, ARM_S22, ARM_S23,
1427
  ARM_S24, ARM_S25, ARM_S26, ARM_S27, ARM_S28, ARM_S29, ARM_S30, ARM_S31
1428
};
1429
1430
static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo,
1431
             uint64_t Address,
1432
             const void *Decoder)
1433
74.5k
{
1434
74.5k
  if (RegNo > 31)
1435
6
    return MCDisassembler_Fail;
1436
1437
74.5k
  unsigned Register = SPRDecoderTable[RegNo];
1438
74.5k
  MCOperand_CreateReg0(Inst, (Register));
1439
74.5k
  return MCDisassembler_Success;
1440
74.5k
}
1441
1442
static DecodeStatus DecodeHPRRegisterClass(MCInst *Inst, unsigned RegNo,
1443
             uint64_t Address,
1444
             const void *Decoder)
1445
15.4k
{
1446
15.4k
  return DecodeSPRRegisterClass(Inst, RegNo, Address, Decoder);
1447
15.4k
}
1448
1449
static const uint16_t DPRDecoderTable[] = {
1450
  ARM_D0,  ARM_D1,  ARM_D2,  ARM_D3,  ARM_D4,  ARM_D5,  ARM_D6,  ARM_D7,
1451
  ARM_D8,  ARM_D9,  ARM_D10, ARM_D11, ARM_D12, ARM_D13, ARM_D14, ARM_D15,
1452
  ARM_D16, ARM_D17, ARM_D18, ARM_D19, ARM_D20, ARM_D21, ARM_D22, ARM_D23,
1453
  ARM_D24, ARM_D25, ARM_D26, ARM_D27, ARM_D28, ARM_D29, ARM_D30, ARM_D31
1454
};
1455
1456
static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo,
1457
             uint64_t Address,
1458
             const void *Decoder)
1459
170k
{
1460
170k
  bool hasD32 = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureD32);
1461
1462
170k
  if (RegNo > 31 || (!hasD32 && RegNo > 15))
1463
15
    return MCDisassembler_Fail;
1464
1465
170k
  unsigned Register = DPRDecoderTable[RegNo];
1466
170k
  MCOperand_CreateReg0(Inst, (Register));
1467
170k
  return MCDisassembler_Success;
1468
170k
}
1469
1470
static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
1471
               uint64_t Address,
1472
               const void *Decoder)
1473
2.77k
{
1474
2.77k
  if (RegNo > 7)
1475
0
    return MCDisassembler_Fail;
1476
2.77k
  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
1477
2.77k
}
1478
1479
static DecodeStatus DecodeSPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
1480
               uint64_t Address,
1481
               const void *Decoder)
1482
83
{
1483
83
  if (RegNo > 15)
1484
0
    return MCDisassembler_Fail;
1485
83
  return DecodeSPRRegisterClass(Inst, RegNo, Address, Decoder);
1486
83
}
1487
1488
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst, unsigned RegNo,
1489
            uint64_t Address,
1490
            const void *Decoder)
1491
4.66k
{
1492
4.66k
  if (RegNo > 15)
1493
0
    return MCDisassembler_Fail;
1494
4.66k
  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
1495
4.66k
}
1496
1497
static const uint16_t QPRDecoderTable[] = {
1498
  ARM_Q0, ARM_Q1, ARM_Q2,  ARM_Q3,  ARM_Q4,  ARM_Q5,  ARM_Q6,  ARM_Q7,
1499
  ARM_Q8, ARM_Q9, ARM_Q10, ARM_Q11, ARM_Q12, ARM_Q13, ARM_Q14, ARM_Q15
1500
};
1501
1502
static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo,
1503
             uint64_t Address,
1504
             const void *Decoder)
1505
57.9k
{
1506
57.9k
  if (RegNo > 31 || (RegNo & 1) != 0)
1507
2.53k
    return MCDisassembler_Fail;
1508
55.3k
  RegNo >>= 1;
1509
1510
55.3k
  unsigned Register = QPRDecoderTable[RegNo];
1511
55.3k
  MCOperand_CreateReg0(Inst, (Register));
1512
55.3k
  return MCDisassembler_Success;
1513
57.9k
}
1514
1515
static const uint16_t DPairDecoderTable[] = {
1516
  ARM_Q0,  ARM_D1_D2,   ARM_Q1,  ARM_D3_D4,   ARM_Q2,  ARM_D5_D6,
1517
  ARM_Q3,  ARM_D7_D8,   ARM_Q4,  ARM_D9_D10,  ARM_Q5,  ARM_D11_D12,
1518
  ARM_Q6,  ARM_D13_D14, ARM_Q7,  ARM_D15_D16, ARM_Q8,  ARM_D17_D18,
1519
  ARM_Q9,  ARM_D19_D20, ARM_Q10, ARM_D21_D22, ARM_Q11, ARM_D23_D24,
1520
  ARM_Q12, ARM_D25_D26, ARM_Q13, ARM_D27_D28, ARM_Q14, ARM_D29_D30,
1521
  ARM_Q15
1522
};
1523
1524
static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo,
1525
               uint64_t Address,
1526
               const void *Decoder)
1527
15.1k
{
1528
15.1k
  if (RegNo > 30)
1529
14
    return MCDisassembler_Fail;
1530
1531
15.0k
  unsigned Register = DPairDecoderTable[RegNo];
1532
15.0k
  MCOperand_CreateReg0(Inst, (Register));
1533
15.0k
  return MCDisassembler_Success;
1534
15.1k
}
1535
1536
static const uint16_t DPairSpacedDecoderTable[] = {
1537
  ARM_D0_D2,   ARM_D1_D3,   ARM_D2_D4,   ARM_D3_D5,   ARM_D4_D6,
1538
  ARM_D5_D7,   ARM_D6_D8,   ARM_D7_D9,   ARM_D8_D10,  ARM_D9_D11,
1539
  ARM_D10_D12, ARM_D11_D13, ARM_D12_D14, ARM_D13_D15, ARM_D14_D16,
1540
  ARM_D15_D17, ARM_D16_D18, ARM_D17_D19, ARM_D18_D20, ARM_D19_D21,
1541
  ARM_D20_D22, ARM_D21_D23, ARM_D22_D24, ARM_D23_D25, ARM_D24_D26,
1542
  ARM_D25_D27, ARM_D26_D28, ARM_D27_D29, ARM_D28_D30, ARM_D29_D31
1543
};
1544
1545
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst, unsigned RegNo,
1546
               uint64_t Address,
1547
               const void *Decoder)
1548
9.43k
{
1549
9.43k
  if (RegNo > 29)
1550
24
    return MCDisassembler_Fail;
1551
1552
9.41k
  unsigned Register = DPairSpacedDecoderTable[RegNo];
1553
9.41k
  MCOperand_CreateReg0(Inst, (Register));
1554
9.41k
  return MCDisassembler_Success;
1555
9.43k
}
1556
1557
static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val,
1558
             uint64_t Address,
1559
             const void *Decoder)
1560
149k
{
1561
149k
  DecodeStatus S = MCDisassembler_Success;
1562
149k
  if (Val == 0xF)
1563
3.92k
    return MCDisassembler_Fail;
1564
  // AL predicate is not allowed on Thumb1 branches.
1565
145k
  if (MCInst_getOpcode(Inst) == ARM_tBcc && Val == 0xE)
1566
0
    return MCDisassembler_Fail;
1567
145k
  if (Val != ARMCC_AL &&
1568
145k
      !MCInst_isPredicable(&ARMInsts[MCInst_getOpcode(Inst)]))
1569
0
    Check(&S, MCDisassembler_SoftFail);
1570
145k
  MCOperand_CreateImm0(Inst, (Val));
1571
145k
  if (Val == ARMCC_AL) {
1572
21.3k
    MCOperand_CreateReg0(Inst, (0));
1573
21.3k
  } else
1574
124k
    MCOperand_CreateReg0(Inst, (ARM_CPSR));
1575
145k
  return S;
1576
145k
}
1577
1578
static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val,
1579
               uint64_t Address, const void *Decoder)
1580
92.3k
{
1581
92.3k
  if (Val)
1582
33.2k
    MCOperand_CreateReg0(Inst, (ARM_CPSR));
1583
59.1k
  else
1584
59.1k
    MCOperand_CreateReg0(Inst, (0));
1585
92.3k
  return MCDisassembler_Success;
1586
92.3k
}
1587
1588
static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Val,
1589
            uint64_t Address, const void *Decoder)
1590
34.8k
{
1591
34.8k
  DecodeStatus S = MCDisassembler_Success;
1592
1593
34.8k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
1594
34.8k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1595
34.8k
  unsigned imm = fieldFromInstruction_4(Val, 7, 5);
1596
1597
  // Register-immediate
1598
34.8k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
1599
0
    return MCDisassembler_Fail;
1600
1601
34.8k
  ARM_AM_ShiftOpc Shift = ARM_AM_lsl;
1602
34.8k
  switch (type) {
1603
11.2k
  case 0:
1604
11.2k
    Shift = ARM_AM_lsl;
1605
11.2k
    break;
1606
5.66k
  case 1:
1607
5.66k
    Shift = ARM_AM_lsr;
1608
5.66k
    break;
1609
7.99k
  case 2:
1610
7.99k
    Shift = ARM_AM_asr;
1611
7.99k
    break;
1612
9.94k
  case 3:
1613
9.94k
    Shift = ARM_AM_ror;
1614
9.94k
    break;
1615
34.8k
  }
1616
1617
34.8k
  if (Shift == ARM_AM_ror && imm == 0)
1618
1.95k
    Shift = ARM_AM_rrx;
1619
1620
34.8k
  unsigned Op = Shift | (imm << 3);
1621
34.8k
  MCOperand_CreateImm0(Inst, (Op));
1622
1623
34.8k
  return S;
1624
34.8k
}
1625
1626
static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Val,
1627
            uint64_t Address, const void *Decoder)
1628
12.4k
{
1629
12.4k
  DecodeStatus S = MCDisassembler_Success;
1630
1631
12.4k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
1632
12.4k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1633
12.4k
  unsigned Rs = fieldFromInstruction_4(Val, 8, 4);
1634
1635
  // Register-register
1636
12.4k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1637
0
    return MCDisassembler_Fail;
1638
12.4k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
1639
0
    return MCDisassembler_Fail;
1640
1641
12.4k
  ARM_AM_ShiftOpc Shift = ARM_AM_lsl;
1642
12.4k
  switch (type) {
1643
3.22k
  case 0:
1644
3.22k
    Shift = ARM_AM_lsl;
1645
3.22k
    break;
1646
2.00k
  case 1:
1647
2.00k
    Shift = ARM_AM_lsr;
1648
2.00k
    break;
1649
3.58k
  case 2:
1650
3.58k
    Shift = ARM_AM_asr;
1651
3.58k
    break;
1652
3.59k
  case 3:
1653
3.59k
    Shift = ARM_AM_ror;
1654
3.59k
    break;
1655
12.4k
  }
1656
1657
12.4k
  MCOperand_CreateImm0(Inst, (Shift));
1658
1659
12.4k
  return S;
1660
12.4k
}
1661
1662
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val,
1663
           uint64_t Address, const void *Decoder)
1664
50.7k
{
1665
50.7k
  DecodeStatus S = MCDisassembler_Success;
1666
1667
50.7k
  bool NeedDisjointWriteback = false;
1668
50.7k
  unsigned WritebackReg = 0;
1669
50.7k
  bool CLRM = false;
1670
50.7k
  switch (MCInst_getOpcode(Inst)) {
1671
48.1k
  default:
1672
48.1k
    break;
1673
48.1k
  case ARM_LDMIA_UPD:
1674
1.15k
  case ARM_LDMDB_UPD:
1675
1.70k
  case ARM_LDMIB_UPD:
1676
1.90k
  case ARM_LDMDA_UPD:
1677
2.23k
  case ARM_t2LDMIA_UPD:
1678
2.41k
  case ARM_t2LDMDB_UPD:
1679
2.45k
  case ARM_t2STMIA_UPD:
1680
2.51k
  case ARM_t2STMDB_UPD:
1681
2.51k
    NeedDisjointWriteback = true;
1682
2.51k
    WritebackReg = MCOperand_getReg(MCInst_getOperand(Inst, (0)));
1683
2.51k
    break;
1684
96
  case ARM_t2CLRM:
1685
96
    CLRM = true;
1686
96
    break;
1687
50.7k
  }
1688
1689
  // Empty register lists are not allowed.
1690
50.7k
  if (Val == 0)
1691
93
    return MCDisassembler_Fail;
1692
861k
  for (unsigned i = 0; i < 16; ++i) {
1693
811k
    if (Val & (1 << i)) {
1694
250k
      if (CLRM) {
1695
539
        if (!Check(&S, DecodeCLRMGPRRegisterClass(
1696
539
                   Inst, i, Address,
1697
539
                   Decoder))) {
1698
0
          return MCDisassembler_Fail;
1699
0
        }
1700
250k
      } else {
1701
250k
        if (!Check(&S, DecodeGPRRegisterClass(Inst, i,
1702
250k
                      Address,
1703
250k
                      Decoder)))
1704
0
          return MCDisassembler_Fail;
1705
        // Writeback not allowed if Rn is in the target list.
1706
250k
        if (NeedDisjointWriteback &&
1707
250k
            WritebackReg ==
1708
19.4k
              MCOperand_getReg(&(
1709
19.4k
                Inst->Operands[Inst->size -
1710
19.4k
                   1])))
1711
592
          Check(&S, MCDisassembler_SoftFail);
1712
250k
      }
1713
250k
    }
1714
811k
  }
1715
1716
50.6k
  return S;
1717
50.6k
}
1718
1719
static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val,
1720
              uint64_t Address,
1721
              const void *Decoder)
1722
2.72k
{
1723
2.72k
  DecodeStatus S = MCDisassembler_Success;
1724
1725
2.72k
  unsigned Vd = fieldFromInstruction_4(Val, 8, 5);
1726
2.72k
  unsigned regs = fieldFromInstruction_4(Val, 0, 8);
1727
1728
  // In case of unpredictable encoding, tweak the operands.
1729
2.72k
  if (regs == 0 || (Vd + regs) > 32) {
1730
1.83k
    regs = Vd + regs > 32 ? 32 - Vd : regs;
1731
1.83k
    regs = regs > 1u ? regs : 1u;
1732
1.83k
    S = MCDisassembler_SoftFail;
1733
1.83k
  }
1734
1735
2.72k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
1736
0
    return MCDisassembler_Fail;
1737
26.2k
  for (unsigned i = 0; i < (regs - 1); ++i) {
1738
23.4k
    if (!Check(&S, DecodeSPRRegisterClass(Inst, ++Vd, Address,
1739
23.4k
                  Decoder)))
1740
0
      return MCDisassembler_Fail;
1741
23.4k
  }
1742
1743
2.72k
  return S;
1744
2.72k
}
1745
1746
static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val,
1747
              uint64_t Address,
1748
              const void *Decoder)
1749
1.71k
{
1750
1.71k
  DecodeStatus S = MCDisassembler_Success;
1751
1752
1.71k
  unsigned Vd = fieldFromInstruction_4(Val, 8, 5);
1753
1.71k
  unsigned regs = fieldFromInstruction_4(Val, 1, 7);
1754
1755
  // In case of unpredictable encoding, tweak the operands.
1756
1.71k
  if (regs == 0 || regs > 16 || (Vd + regs) > 32) {
1757
711
    regs = Vd + regs > 32 ? 32 - Vd : regs;
1758
711
    regs = regs > 1u ? regs : 1u;
1759
711
    regs = regs < 16u ? regs : 16u;
1760
711
    S = MCDisassembler_SoftFail;
1761
711
  }
1762
1763
1.71k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
1764
0
    return MCDisassembler_Fail;
1765
21.8k
  for (unsigned i = 0; i < (regs - 1); ++i) {
1766
20.0k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, ++Vd, Address,
1767
20.0k
                  Decoder)))
1768
0
      return MCDisassembler_Fail;
1769
20.0k
  }
1770
1771
1.71k
  return S;
1772
1.71k
}
1773
1774
static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Val,
1775
                uint64_t Address,
1776
                const void *Decoder)
1777
2.16k
{
1778
  // This operand encodes a mask of contiguous zeros between a specified MSB
1779
  // and LSB.  To decode it, we create the mask of all bits MSB-and-lower,
1780
  // the mask of all bits LSB-and-lower, and then xor them to create
1781
  // the mask of that's all ones on [msb, lsb].  Finally we not it to
1782
  // create the final mask.
1783
2.16k
  unsigned msb = fieldFromInstruction_4(Val, 5, 5);
1784
2.16k
  unsigned lsb = fieldFromInstruction_4(Val, 0, 5);
1785
1786
2.16k
  DecodeStatus S = MCDisassembler_Success;
1787
2.16k
  if (lsb > msb) {
1788
769
    Check(&S, MCDisassembler_SoftFail);
1789
    // The check above will cause the warning for the "potentially undefined
1790
    // instruction encoding" but we can't build a bad MCOperand value here
1791
    // with a lsb > msb or else printing the MCInst will cause a crash.
1792
769
    lsb = msb;
1793
769
  }
1794
1795
2.16k
  uint32_t msb_mask = 0xFFFFFFFF;
1796
2.16k
  if (msb != 31)
1797
1.69k
    msb_mask = (1U << (msb + 1)) - 1;
1798
2.16k
  uint32_t lsb_mask = (1U << lsb) - 1;
1799
1800
2.16k
  MCOperand_CreateImm0(Inst, (~(msb_mask ^ lsb_mask)));
1801
2.16k
  return S;
1802
2.16k
}
1803
1804
static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn,
1805
              uint64_t Address,
1806
              const void *Decoder)
1807
33.0k
{
1808
33.0k
  DecodeStatus S = MCDisassembler_Success;
1809
1810
33.0k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
1811
33.0k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
1812
33.0k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1813
33.0k
  unsigned CRd = fieldFromInstruction_4(Insn, 12, 4);
1814
33.0k
  unsigned coproc = fieldFromInstruction_4(Insn, 8, 4);
1815
33.0k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
1816
33.0k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1817
33.0k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
1818
1819
  // Pre-Indexed implies writeback to Rn
1820
33.0k
  bool IsPreIndexed = (P == 1) && (W == 1);
1821
1822
33.0k
  switch (MCInst_getOpcode(Inst)) {
1823
734
  case ARM_LDC_OFFSET:
1824
1.12k
  case ARM_LDC_PRE:
1825
1.58k
  case ARM_LDC_POST:
1826
2.25k
  case ARM_LDC_OPTION:
1827
3.03k
  case ARM_LDCL_OFFSET:
1828
3.73k
  case ARM_LDCL_PRE:
1829
4.30k
  case ARM_LDCL_POST:
1830
4.46k
  case ARM_LDCL_OPTION:
1831
5.32k
  case ARM_STC_OFFSET:
1832
6.17k
  case ARM_STC_PRE:
1833
6.45k
  case ARM_STC_POST:
1834
7.07k
  case ARM_STC_OPTION:
1835
7.65k
  case ARM_STCL_OFFSET:
1836
8.01k
  case ARM_STCL_PRE:
1837
8.40k
  case ARM_STCL_POST:
1838
8.68k
  case ARM_STCL_OPTION:
1839
9.15k
  case ARM_t2LDC_OFFSET:
1840
10.2k
  case ARM_t2LDC_PRE:
1841
10.8k
  case ARM_t2LDC_POST:
1842
11.3k
  case ARM_t2LDC_OPTION:
1843
11.5k
  case ARM_t2LDCL_OFFSET:
1844
12.9k
  case ARM_t2LDCL_PRE:
1845
13.5k
  case ARM_t2LDCL_POST:
1846
13.7k
  case ARM_t2LDCL_OPTION:
1847
15.1k
  case ARM_t2STC_OFFSET:
1848
16.1k
  case ARM_t2STC_PRE:
1849
16.6k
  case ARM_t2STC_POST:
1850
17.0k
  case ARM_t2STC_OPTION:
1851
17.5k
  case ARM_t2STCL_OFFSET:
1852
19.3k
  case ARM_t2STCL_PRE:
1853
20.2k
  case ARM_t2STCL_POST:
1854
20.3k
  case ARM_t2STCL_OPTION:
1855
20.6k
  case ARM_t2LDC2_OFFSET:
1856
21.3k
  case ARM_t2LDC2L_OFFSET:
1857
21.9k
  case ARM_t2LDC2_PRE:
1858
22.9k
  case ARM_t2LDC2L_PRE:
1859
23.8k
  case ARM_t2STC2_OFFSET:
1860
24.9k
  case ARM_t2STC2L_OFFSET:
1861
25.2k
  case ARM_t2STC2_PRE:
1862
26.3k
  case ARM_t2STC2L_PRE:
1863
26.4k
  case ARM_LDC2_OFFSET:
1864
26.6k
  case ARM_LDC2L_OFFSET:
1865
26.7k
  case ARM_LDC2_PRE:
1866
26.8k
  case ARM_LDC2L_PRE:
1867
26.9k
  case ARM_STC2_OFFSET:
1868
27.1k
  case ARM_STC2L_OFFSET:
1869
27.2k
  case ARM_STC2_PRE:
1870
27.5k
  case ARM_STC2L_PRE:
1871
27.8k
  case ARM_t2LDC2_OPTION:
1872
28.1k
  case ARM_t2STC2_OPTION:
1873
28.8k
  case ARM_t2LDC2_POST:
1874
29.7k
  case ARM_t2LDC2L_POST:
1875
30.1k
  case ARM_t2STC2_POST:
1876
31.0k
  case ARM_t2STC2L_POST:
1877
31.4k
  case ARM_LDC2_POST:
1878
31.8k
  case ARM_LDC2L_POST:
1879
31.9k
  case ARM_STC2_POST:
1880
32.2k
  case ARM_STC2L_POST:
1881
32.2k
    if (coproc == 0xA || coproc == 0xB ||
1882
32.2k
        (ARM_getFeatureBits(Inst->csh->mode,
1883
32.2k
          ARM_HasV8_1MMainlineOps) &&
1884
32.2k
         (coproc == 0x8 || coproc == 0x9 || coproc == 0xA ||
1885
58
          coproc == 0xB || coproc == 0xE || coproc == 0xF)))
1886
58
      return MCDisassembler_Fail;
1887
32.2k
    break;
1888
32.2k
  default:
1889
744
    break;
1890
33.0k
  }
1891
1892
32.9k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops) && (coproc != 14))
1893
42
    return MCDisassembler_Fail;
1894
1895
32.9k
  if (IsPreIndexed)
1896
    // Dummy operand for Rn_wb.
1897
11.0k
    MCOperand_CreateImm0(Inst, (0));
1898
1899
32.9k
  MCOperand_CreateImm0(Inst, (coproc));
1900
32.9k
  MCOperand_CreateImm0(Inst, (CRd));
1901
32.9k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1902
0
    return MCDisassembler_Fail;
1903
1904
32.9k
  switch (MCInst_getOpcode(Inst)) {
1905
260
  case ARM_t2LDC2_OFFSET:
1906
972
  case ARM_t2LDC2L_OFFSET:
1907
1.58k
  case ARM_t2LDC2_PRE:
1908
2.55k
  case ARM_t2LDC2L_PRE:
1909
3.46k
  case ARM_t2STC2_OFFSET:
1910
4.55k
  case ARM_t2STC2L_OFFSET:
1911
4.88k
  case ARM_t2STC2_PRE:
1912
5.97k
  case ARM_t2STC2L_PRE:
1913
6.06k
  case ARM_LDC2_OFFSET:
1914
6.28k
  case ARM_LDC2L_OFFSET:
1915
6.39k
  case ARM_LDC2_PRE:
1916
6.51k
  case ARM_LDC2L_PRE:
1917
6.62k
  case ARM_STC2_OFFSET:
1918
6.79k
  case ARM_STC2L_OFFSET:
1919
6.84k
  case ARM_STC2_PRE:
1920
7.14k
  case ARM_STC2L_PRE:
1921
7.60k
  case ARM_t2LDC_OFFSET:
1922
7.87k
  case ARM_t2LDCL_OFFSET:
1923
8.95k
  case ARM_t2LDC_PRE:
1924
10.2k
  case ARM_t2LDCL_PRE:
1925
11.6k
  case ARM_t2STC_OFFSET:
1926
12.1k
  case ARM_t2STCL_OFFSET:
1927
13.2k
  case ARM_t2STC_PRE:
1928
14.9k
  case ARM_t2STCL_PRE:
1929
15.7k
  case ARM_LDC_OFFSET:
1930
16.4k
  case ARM_LDCL_OFFSET:
1931
16.8k
  case ARM_LDC_PRE:
1932
17.5k
  case ARM_LDCL_PRE:
1933
18.4k
  case ARM_STC_OFFSET:
1934
19.0k
  case ARM_STCL_OFFSET:
1935
19.8k
  case ARM_STC_PRE:
1936
20.2k
  case ARM_STCL_PRE:
1937
20.2k
    imm = ARM_AM_getAM5Opc(U ? ARM_AM_add : ARM_AM_sub, imm);
1938
20.2k
    MCOperand_CreateImm0(Inst, (imm));
1939
20.2k
    break;
1940
644
  case ARM_t2LDC2_POST:
1941
1.59k
  case ARM_t2LDC2L_POST:
1942
1.94k
  case ARM_t2STC2_POST:
1943
2.89k
  case ARM_t2STC2L_POST:
1944
3.20k
  case ARM_LDC2_POST:
1945
3.69k
  case ARM_LDC2L_POST:
1946
3.77k
  case ARM_STC2_POST:
1947
4.08k
  case ARM_STC2L_POST:
1948
4.70k
  case ARM_t2LDC_POST:
1949
5.28k
  case ARM_t2LDCL_POST:
1950
5.80k
  case ARM_t2STC_POST:
1951
6.73k
  case ARM_t2STCL_POST:
1952
7.20k
  case ARM_LDC_POST:
1953
7.76k
  case ARM_LDCL_POST:
1954
8.04k
  case ARM_STC_POST:
1955
8.43k
  case ARM_STCL_POST:
1956
8.43k
    imm |= U << 8;
1957
    // fall through
1958
12.7k
  default:
1959
    // The 'option' variant doesn't encode 'U' in the immediate since
1960
    // the immediate is unsigned [0,255].
1961
12.7k
    MCOperand_CreateImm0(Inst, (imm));
1962
12.7k
    break;
1963
32.9k
  }
1964
1965
32.9k
  switch (MCInst_getOpcode(Inst)) {
1966
734
  case ARM_LDC_OFFSET:
1967
1.11k
  case ARM_LDC_PRE:
1968
1.58k
  case ARM_LDC_POST:
1969
2.24k
  case ARM_LDC_OPTION:
1970
3.02k
  case ARM_LDCL_OFFSET:
1971
3.71k
  case ARM_LDCL_PRE:
1972
4.28k
  case ARM_LDCL_POST:
1973
4.44k
  case ARM_LDCL_OPTION:
1974
5.29k
  case ARM_STC_OFFSET:
1975
6.14k
  case ARM_STC_PRE:
1976
6.42k
  case ARM_STC_POST:
1977
7.04k
  case ARM_STC_OPTION:
1978
7.61k
  case ARM_STCL_OFFSET:
1979
7.98k
  case ARM_STCL_PRE:
1980
8.36k
  case ARM_STCL_POST:
1981
8.63k
  case ARM_STCL_OPTION:
1982
8.63k
    if (!Check(&S, DecodePredicateOperand(Inst, pred, Address,
1983
8.63k
                  Decoder)))
1984
0
      return MCDisassembler_Fail;
1985
8.63k
    break;
1986
24.2k
  default:
1987
24.2k
    break;
1988
32.9k
  }
1989
1990
32.9k
  return S;
1991
32.9k
}
1992
1993
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, unsigned Insn,
1994
              uint64_t Address,
1995
              const void *Decoder)
1996
22.4k
{
1997
22.4k
  DecodeStatus S = MCDisassembler_Success;
1998
1999
22.4k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2000
22.4k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
2001
22.4k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2002
22.4k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
2003
22.4k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2004
22.4k
  unsigned reg = fieldFromInstruction_4(Insn, 25, 1);
2005
22.4k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
2006
22.4k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
2007
2008
  // On stores, the writeback operand precedes Rt.
2009
22.4k
  switch (MCInst_getOpcode(Inst)) {
2010
2.80k
  case ARM_STR_POST_IMM:
2011
4.14k
  case ARM_STR_POST_REG:
2012
5.73k
  case ARM_STRB_POST_IMM:
2013
6.74k
  case ARM_STRB_POST_REG:
2014
8.27k
  case ARM_STRT_POST_REG:
2015
10.4k
  case ARM_STRT_POST_IMM:
2016
11.7k
  case ARM_STRBT_POST_REG:
2017
13.4k
  case ARM_STRBT_POST_IMM:
2018
13.4k
    if (!Check(&S,
2019
13.4k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2020
0
      return MCDisassembler_Fail;
2021
13.4k
    break;
2022
13.4k
  default:
2023
8.92k
    break;
2024
22.4k
  }
2025
2026
22.4k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2027
0
    return MCDisassembler_Fail;
2028
2029
  // On loads, the writeback operand comes after Rt.
2030
22.4k
  switch (MCInst_getOpcode(Inst)) {
2031
1.57k
  case ARM_LDR_POST_IMM:
2032
2.37k
  case ARM_LDR_POST_REG:
2033
3.76k
  case ARM_LDRB_POST_IMM:
2034
4.45k
  case ARM_LDRB_POST_REG:
2035
5.16k
  case ARM_LDRBT_POST_REG:
2036
6.69k
  case ARM_LDRBT_POST_IMM:
2037
7.68k
  case ARM_LDRT_POST_REG:
2038
8.92k
  case ARM_LDRT_POST_IMM:
2039
8.92k
    if (!Check(&S,
2040
8.92k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2041
0
      return MCDisassembler_Fail;
2042
8.92k
    break;
2043
13.4k
  default:
2044
13.4k
    break;
2045
22.4k
  }
2046
2047
22.4k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2048
0
    return MCDisassembler_Fail;
2049
2050
22.4k
  ARM_AM_AddrOpc Op = ARM_AM_add;
2051
22.4k
  if (!fieldFromInstruction_4(Insn, 23, 1))
2052
13.0k
    Op = ARM_AM_sub;
2053
2054
22.4k
  bool writeback = (P == 0) || (W == 1);
2055
22.4k
  unsigned idx_mode = 0;
2056
22.4k
  if (P && writeback)
2057
0
    idx_mode = ARMII_IndexModePre;
2058
22.4k
  else if (!P && writeback)
2059
22.4k
    idx_mode = ARMII_IndexModePost;
2060
2061
22.4k
  if (writeback && (Rn == 15 || Rn == Rt))
2062
3.62k
    S = MCDisassembler_SoftFail; // UNPREDICTABLE
2063
2064
22.4k
  if (reg) {
2065
8.29k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address,
2066
8.29k
                Decoder)))
2067
0
      return MCDisassembler_Fail;
2068
8.29k
    ARM_AM_ShiftOpc Opc = ARM_AM_lsl;
2069
8.29k
    switch (fieldFromInstruction_4(Insn, 5, 2)) {
2070
3.26k
    case 0:
2071
3.26k
      Opc = ARM_AM_lsl;
2072
3.26k
      break;
2073
1.77k
    case 1:
2074
1.77k
      Opc = ARM_AM_lsr;
2075
1.77k
      break;
2076
1.41k
    case 2:
2077
1.41k
      Opc = ARM_AM_asr;
2078
1.41k
      break;
2079
1.84k
    case 3:
2080
1.84k
      Opc = ARM_AM_ror;
2081
1.84k
      break;
2082
0
    default:
2083
0
      return MCDisassembler_Fail;
2084
8.29k
    }
2085
8.29k
    unsigned amt = fieldFromInstruction_4(Insn, 7, 5);
2086
8.29k
    if (Opc == ARM_AM_ror && amt == 0)
2087
311
      Opc = ARM_AM_rrx;
2088
8.29k
    unsigned imm = ARM_AM_getAM2Opc(Op, amt, Opc, idx_mode);
2089
2090
8.29k
    MCOperand_CreateImm0(Inst, (imm));
2091
14.1k
  } else {
2092
14.1k
    MCOperand_CreateReg0(Inst, (0));
2093
14.1k
    unsigned tmp = ARM_AM_getAM2Opc(Op, imm, ARM_AM_lsl, idx_mode);
2094
14.1k
    MCOperand_CreateImm0(Inst, (tmp));
2095
14.1k
  }
2096
2097
22.4k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2098
2.64k
    return MCDisassembler_Fail;
2099
2100
19.7k
  return S;
2101
22.4k
}
2102
2103
static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Val,
2104
            uint64_t Address, const void *Decoder)
2105
8.72k
{
2106
8.72k
  DecodeStatus S = MCDisassembler_Success;
2107
2108
8.72k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
2109
8.72k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
2110
8.72k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
2111
8.72k
  unsigned imm = fieldFromInstruction_4(Val, 7, 5);
2112
8.72k
  unsigned U = fieldFromInstruction_4(Val, 12, 1);
2113
2114
8.72k
  ARM_AM_ShiftOpc ShOp = ARM_AM_lsl;
2115
8.72k
  switch (type) {
2116
2.92k
  case 0:
2117
2.92k
    ShOp = ARM_AM_lsl;
2118
2.92k
    break;
2119
1.36k
  case 1:
2120
1.36k
    ShOp = ARM_AM_lsr;
2121
1.36k
    break;
2122
1.57k
  case 2:
2123
1.57k
    ShOp = ARM_AM_asr;
2124
1.57k
    break;
2125
2.84k
  case 3:
2126
2.84k
    ShOp = ARM_AM_ror;
2127
2.84k
    break;
2128
8.72k
  }
2129
2130
8.72k
  if (ShOp == ARM_AM_ror && imm == 0)
2131
393
    ShOp = ARM_AM_rrx;
2132
2133
8.72k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2134
0
    return MCDisassembler_Fail;
2135
8.72k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2136
0
    return MCDisassembler_Fail;
2137
8.72k
  unsigned shift;
2138
8.72k
  if (U)
2139
4.14k
    shift = ARM_AM_getAM2Opc(ARM_AM_add, imm, ShOp, 0);
2140
4.57k
  else
2141
4.57k
    shift = ARM_AM_getAM2Opc(ARM_AM_sub, imm, ShOp, 0);
2142
8.72k
  MCOperand_CreateImm0(Inst, (shift));
2143
2144
8.72k
  return S;
2145
8.72k
}
2146
2147
static DecodeStatus DecodeTSBInstruction(MCInst *Inst, unsigned Insn,
2148
           uint64_t Address, const void *Decoder)
2149
32
{
2150
32
  if (MCInst_getOpcode(Inst) != ARM_TSB &&
2151
32
      MCInst_getOpcode(Inst) != ARM_t2TSB)
2152
0
    return MCDisassembler_Fail;
2153
2154
  // The "csync" operand is not encoded into the "tsb" instruction (as this is
2155
  // the only available operand), but LLVM expects the instruction to have one
2156
  // operand, so we need to add the csync when decoding.
2157
32
  MCOperand_CreateImm0(Inst, (ARM_TSB_CSYNC));
2158
32
  return MCDisassembler_Success;
2159
32
}
2160
2161
static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn,
2162
                 uint64_t Address,
2163
                 const void *Decoder)
2164
24.7k
{
2165
24.7k
  DecodeStatus S = MCDisassembler_Success;
2166
2167
24.7k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
2168
24.7k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2169
24.7k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2170
24.7k
  unsigned type = fieldFromInstruction_4(Insn, 22, 1);
2171
24.7k
  unsigned imm = fieldFromInstruction_4(Insn, 8, 4);
2172
24.7k
  unsigned U = ((~fieldFromInstruction_4(Insn, 23, 1)) & 1) << 8;
2173
24.7k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2174
24.7k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
2175
24.7k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
2176
24.7k
  unsigned Rt2 = Rt + 1;
2177
2178
24.7k
  bool writeback = (W == 1) | (P == 0);
2179
2180
  // For {LD,ST}RD, Rt must be even, else undefined.
2181
24.7k
  switch (MCInst_getOpcode(Inst)) {
2182
930
  case ARM_STRD:
2183
1.68k
  case ARM_STRD_PRE:
2184
4.07k
  case ARM_STRD_POST:
2185
5.20k
  case ARM_LDRD:
2186
5.97k
  case ARM_LDRD_PRE:
2187
8.55k
  case ARM_LDRD_POST:
2188
8.55k
    if (Rt & 0x1)
2189
2.10k
      S = MCDisassembler_SoftFail;
2190
8.55k
    break;
2191
16.2k
  default:
2192
16.2k
    break;
2193
24.7k
  }
2194
24.7k
  switch (MCInst_getOpcode(Inst)) {
2195
930
  case ARM_STRD:
2196
1.68k
  case ARM_STRD_PRE:
2197
4.07k
  case ARM_STRD_POST:
2198
4.07k
    if (P == 0 && W == 1)
2199
0
      S = MCDisassembler_SoftFail;
2200
2201
4.07k
    if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
2202
1.33k
      S = MCDisassembler_SoftFail;
2203
4.07k
    if (type && Rm == 15)
2204
253
      S = MCDisassembler_SoftFail;
2205
4.07k
    if (Rt2 == 15)
2206
547
      S = MCDisassembler_SoftFail;
2207
4.07k
    if (!type && fieldFromInstruction_4(Insn, 8, 4))
2208
1.94k
      S = MCDisassembler_SoftFail;
2209
4.07k
    break;
2210
1.42k
  case ARM_STRH:
2211
2.22k
  case ARM_STRH_PRE:
2212
4.77k
  case ARM_STRH_POST:
2213
4.77k
    if (Rt == 15)
2214
1.80k
      S = MCDisassembler_SoftFail;
2215
4.77k
    if (writeback && (Rn == 15 || Rn == Rt))
2216
744
      S = MCDisassembler_SoftFail;
2217
4.77k
    if (!type && Rm == 15)
2218
350
      S = MCDisassembler_SoftFail;
2219
4.77k
    break;
2220
1.13k
  case ARM_LDRD:
2221
1.90k
  case ARM_LDRD_PRE:
2222
4.48k
  case ARM_LDRD_POST:
2223
4.48k
    if (type && Rn == 15) {
2224
818
      if (Rt2 == 15)
2225
657
        S = MCDisassembler_SoftFail;
2226
818
      break;
2227
818
    }
2228
3.66k
    if (P == 0 && W == 1)
2229
0
      S = MCDisassembler_SoftFail;
2230
3.66k
    if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
2231
1.45k
      S = MCDisassembler_SoftFail;
2232
3.66k
    if (!type && writeback && Rn == 15)
2233
634
      S = MCDisassembler_SoftFail;
2234
3.66k
    if (writeback && (Rn == Rt || Rn == Rt2))
2235
586
      S = MCDisassembler_SoftFail;
2236
3.66k
    break;
2237
732
  case ARM_LDRH:
2238
1.91k
  case ARM_LDRH_PRE:
2239
3.37k
  case ARM_LDRH_POST:
2240
3.37k
    if (type && Rn == 15) {
2241
725
      if (Rt == 15)
2242
125
        S = MCDisassembler_SoftFail;
2243
725
      break;
2244
725
    }
2245
2.65k
    if (Rt == 15)
2246
166
      S = MCDisassembler_SoftFail;
2247
2.65k
    if (!type && Rm == 15)
2248
168
      S = MCDisassembler_SoftFail;
2249
2.65k
    if (!type && writeback && (Rn == 15 || Rn == Rt))
2250
662
      S = MCDisassembler_SoftFail;
2251
2.65k
    break;
2252
693
  case ARM_LDRSH:
2253
2.09k
  case ARM_LDRSH_PRE:
2254
3.27k
  case ARM_LDRSH_POST:
2255
4.92k
  case ARM_LDRSB:
2256
6.72k
  case ARM_LDRSB_PRE:
2257
8.09k
  case ARM_LDRSB_POST:
2258
8.09k
    if (type && Rn == 15) {
2259
649
      if (Rt == 15)
2260
61
        S = MCDisassembler_SoftFail;
2261
649
      break;
2262
649
    }
2263
7.44k
    if (type && (Rt == 15 || (writeback && Rn == Rt)))
2264
690
      S = MCDisassembler_SoftFail;
2265
7.44k
    if (!type && (Rt == 15 || Rm == 15))
2266
1.02k
      S = MCDisassembler_SoftFail;
2267
7.44k
    if (!type && writeback && (Rn == 15 || Rn == Rt))
2268
1.25k
      S = MCDisassembler_SoftFail;
2269
7.44k
    break;
2270
0
  default:
2271
0
    break;
2272
24.7k
  }
2273
2274
24.7k
  if (writeback) { // Writeback
2275
18.2k
    if (P)
2276
6.71k
      U |= ARMII_IndexModePre << 9;
2277
11.5k
    else
2278
11.5k
      U |= ARMII_IndexModePost << 9;
2279
2280
    // On stores, the writeback operand precedes Rt.
2281
18.2k
    switch (MCInst_getOpcode(Inst)) {
2282
0
    case ARM_STRD:
2283
758
    case ARM_STRD_PRE:
2284
3.14k
    case ARM_STRD_POST:
2285
3.14k
    case ARM_STRH:
2286
3.94k
    case ARM_STRH_PRE:
2287
6.49k
    case ARM_STRH_POST:
2288
6.49k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address,
2289
6.49k
                    Decoder)))
2290
0
        return MCDisassembler_Fail;
2291
6.49k
      break;
2292
11.7k
    default:
2293
11.7k
      break;
2294
18.2k
    }
2295
18.2k
  }
2296
2297
24.7k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2298
0
    return MCDisassembler_Fail;
2299
24.7k
  switch (MCInst_getOpcode(Inst)) {
2300
930
  case ARM_STRD:
2301
1.68k
  case ARM_STRD_PRE:
2302
4.07k
  case ARM_STRD_POST:
2303
5.20k
  case ARM_LDRD:
2304
5.97k
  case ARM_LDRD_PRE:
2305
8.55k
  case ARM_LDRD_POST:
2306
8.55k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt + 1, Address,
2307
8.55k
                  Decoder)))
2308
26
      return MCDisassembler_Fail;
2309
8.52k
    break;
2310
16.2k
  default:
2311
16.2k
    break;
2312
24.7k
  }
2313
2314
24.7k
  if (writeback) {
2315
    // On loads, the writeback operand comes after Rt.
2316
18.2k
    switch (MCInst_getOpcode(Inst)) {
2317
0
    case ARM_LDRD:
2318
767
    case ARM_LDRD_PRE:
2319
3.34k
    case ARM_LDRD_POST:
2320
3.34k
    case ARM_LDRH:
2321
4.52k
    case ARM_LDRH_PRE:
2322
5.98k
    case ARM_LDRH_POST:
2323
5.98k
    case ARM_LDRSH:
2324
7.39k
    case ARM_LDRSH_PRE:
2325
8.56k
    case ARM_LDRSH_POST:
2326
8.56k
    case ARM_LDRSB:
2327
10.3k
    case ARM_LDRSB_PRE:
2328
11.7k
    case ARM_LDRSB_POST:
2329
11.7k
    case ARM_LDRHTr:
2330
11.7k
    case ARM_LDRSBTr:
2331
11.7k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address,
2332
11.7k
                    Decoder)))
2333
0
        return MCDisassembler_Fail;
2334
11.7k
      break;
2335
11.7k
    default:
2336
6.48k
      break;
2337
18.2k
    }
2338
18.2k
  }
2339
2340
24.7k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2341
0
    return MCDisassembler_Fail;
2342
2343
24.7k
  if (type) {
2344
10.7k
    MCOperand_CreateReg0(Inst, (0));
2345
10.7k
    MCOperand_CreateImm0(Inst, (U | (imm << 4) | Rm));
2346
13.9k
  } else {
2347
13.9k
    if (!Check(&S,
2348
13.9k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2349
0
      return MCDisassembler_Fail;
2350
13.9k
    MCOperand_CreateImm0(Inst, (U));
2351
13.9k
  }
2352
2353
24.7k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2354
23
    return MCDisassembler_Fail;
2355
2356
24.7k
  return S;
2357
24.7k
}
2358
2359
static DecodeStatus DecodeRFEInstruction(MCInst *Inst, unsigned Insn,
2360
           uint64_t Address, const void *Decoder)
2361
991
{
2362
991
  DecodeStatus S = MCDisassembler_Success;
2363
2364
991
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2365
991
  unsigned mode = fieldFromInstruction_4(Insn, 23, 2);
2366
2367
991
  switch (mode) {
2368
288
  case 0:
2369
288
    mode = ARM_AM_da;
2370
288
    break;
2371
121
  case 1:
2372
121
    mode = ARM_AM_ia;
2373
121
    break;
2374
416
  case 2:
2375
416
    mode = ARM_AM_db;
2376
416
    break;
2377
166
  case 3:
2378
166
    mode = ARM_AM_ib;
2379
166
    break;
2380
991
  }
2381
2382
991
  MCOperand_CreateImm0(Inst, (mode));
2383
991
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2384
0
    return MCDisassembler_Fail;
2385
2386
991
  return S;
2387
991
}
2388
2389
static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn,
2390
            uint64_t Address, const void *Decoder)
2391
1.29k
{
2392
1.29k
  DecodeStatus S = MCDisassembler_Success;
2393
2394
1.29k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2395
1.29k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2396
1.29k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2397
1.29k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2398
2399
1.29k
  if (pred == 0xF)
2400
959
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
2401
2402
340
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2403
0
    return MCDisassembler_Fail;
2404
340
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2405
0
    return MCDisassembler_Fail;
2406
340
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2407
0
    return MCDisassembler_Fail;
2408
340
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2409
0
    return MCDisassembler_Fail;
2410
340
  return S;
2411
340
}
2412
2413
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst *Inst,
2414
                unsigned Insn,
2415
                uint64_t Address,
2416
                const void *Decoder)
2417
12.6k
{
2418
12.6k
  DecodeStatus S = MCDisassembler_Success;
2419
2420
12.6k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2421
12.6k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2422
12.6k
  unsigned reglist = fieldFromInstruction_4(Insn, 0, 16);
2423
2424
12.6k
  if (pred == 0xF) {
2425
    // Ambiguous with RFE and SRS
2426
1.02k
    switch (MCInst_getOpcode(Inst)) {
2427
0
    case ARM_LDMDA:
2428
0
      MCInst_setOpcode(Inst, (ARM_RFEDA));
2429
0
      break;
2430
288
    case ARM_LDMDA_UPD:
2431
288
      MCInst_setOpcode(Inst, (ARM_RFEDA_UPD));
2432
288
      break;
2433
0
    case ARM_LDMDB:
2434
0
      MCInst_setOpcode(Inst, (ARM_RFEDB));
2435
0
      break;
2436
416
    case ARM_LDMDB_UPD:
2437
416
      MCInst_setOpcode(Inst, (ARM_RFEDB_UPD));
2438
416
      break;
2439
0
    case ARM_LDMIA:
2440
0
      MCInst_setOpcode(Inst, (ARM_RFEIA));
2441
0
      break;
2442
121
    case ARM_LDMIA_UPD:
2443
121
      MCInst_setOpcode(Inst, (ARM_RFEIA_UPD));
2444
121
      break;
2445
0
    case ARM_LDMIB:
2446
0
      MCInst_setOpcode(Inst, (ARM_RFEIB));
2447
0
      break;
2448
166
    case ARM_LDMIB_UPD:
2449
166
      MCInst_setOpcode(Inst, (ARM_RFEIB_UPD));
2450
166
      break;
2451
0
    case ARM_STMDA:
2452
0
      MCInst_setOpcode(Inst, (ARM_SRSDA));
2453
0
      break;
2454
2
    case ARM_STMDA_UPD:
2455
2
      MCInst_setOpcode(Inst, (ARM_SRSDA_UPD));
2456
2
      break;
2457
0
    case ARM_STMDB:
2458
0
      MCInst_setOpcode(Inst, (ARM_SRSDB));
2459
0
      break;
2460
5
    case ARM_STMDB_UPD:
2461
5
      MCInst_setOpcode(Inst, (ARM_SRSDB_UPD));
2462
5
      break;
2463
0
    case ARM_STMIA:
2464
0
      MCInst_setOpcode(Inst, (ARM_SRSIA));
2465
0
      break;
2466
4
    case ARM_STMIA_UPD:
2467
4
      MCInst_setOpcode(Inst, (ARM_SRSIA_UPD));
2468
4
      break;
2469
0
    case ARM_STMIB:
2470
0
      MCInst_setOpcode(Inst, (ARM_SRSIB));
2471
0
      break;
2472
4
    case ARM_STMIB_UPD:
2473
4
      MCInst_setOpcode(Inst, (ARM_SRSIB_UPD));
2474
4
      break;
2475
22
    default:
2476
22
      return MCDisassembler_Fail;
2477
1.02k
    }
2478
2479
    // For stores (which become SRS's, the only operand is the mode.
2480
1.00k
    if (fieldFromInstruction_4(Insn, 20, 1) == 0) {
2481
      // Check SRS encoding constraints
2482
15
      if (!(fieldFromInstruction_4(Insn, 22, 1) == 1 &&
2483
15
            fieldFromInstruction_4(Insn, 20, 1) == 0))
2484
15
        return MCDisassembler_Fail;
2485
2486
0
      MCOperand_CreateImm0(
2487
0
        Inst, (fieldFromInstruction_4(Insn, 0, 4)));
2488
0
      return S;
2489
15
    }
2490
2491
991
    return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
2492
1.00k
  }
2493
2494
11.6k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2495
0
    return MCDisassembler_Fail;
2496
11.6k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2497
0
    return MCDisassembler_Fail; // Tied
2498
11.6k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2499
0
    return MCDisassembler_Fail;
2500
11.6k
  if (!Check(&S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
2501
13
    return MCDisassembler_Fail;
2502
2503
11.6k
  return S;
2504
11.6k
}
2505
2506
// Check for UNPREDICTABLE predicated ESB instruction
2507
static DecodeStatus DecodeHINTInstruction(MCInst *Inst, unsigned Insn,
2508
            uint64_t Address, const void *Decoder)
2509
242
{
2510
242
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2511
242
  unsigned imm8 = fieldFromInstruction_4(Insn, 0, 8);
2512
2513
242
  DecodeStatus S = MCDisassembler_Success;
2514
2515
242
  MCOperand_CreateImm0(Inst, (imm8));
2516
2517
242
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2518
11
    return MCDisassembler_Fail;
2519
2520
  // ESB is unpredictable if pred != AL. Without the RAS extension, it is a
2521
  // NOP, so all predicates should be allowed.
2522
231
  if (imm8 == 0x10 && pred != 0xe &&
2523
231
      ((ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureRAS)) != 0))
2524
0
    S = MCDisassembler_SoftFail;
2525
2526
231
  return S;
2527
242
}
2528
2529
static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn,
2530
           uint64_t Address, const void *Decoder)
2531
4.32k
{
2532
4.32k
  unsigned imod = fieldFromInstruction_4(Insn, 18, 2);
2533
4.32k
  unsigned M = fieldFromInstruction_4(Insn, 17, 1);
2534
4.32k
  unsigned iflags = fieldFromInstruction_4(Insn, 6, 3);
2535
4.32k
  unsigned mode = fieldFromInstruction_4(Insn, 0, 5);
2536
2537
4.32k
  DecodeStatus S = MCDisassembler_Success;
2538
2539
  // This decoder is called from multiple location that do not check
2540
  // the full encoding is valid before they do.
2541
4.32k
  if (fieldFromInstruction_4(Insn, 5, 1) != 0 ||
2542
4.32k
      fieldFromInstruction_4(Insn, 16, 1) != 0 ||
2543
4.32k
      fieldFromInstruction_4(Insn, 20, 8) != 0x10)
2544
13
    return MCDisassembler_Fail;
2545
2546
  // imod == '01' --> UNPREDICTABLE
2547
  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
2548
  // return failure here.  The '01' imod value is unprintable, so there's
2549
  // nothing useful we could do even if we returned UNPREDICTABLE.
2550
2551
4.30k
  if (imod == 1)
2552
2
    return MCDisassembler_Fail;
2553
2554
4.30k
  if (imod && M) {
2555
429
    MCInst_setOpcode(Inst, (ARM_CPS3p));
2556
429
    MCOperand_CreateImm0(Inst, (imod));
2557
429
    MCOperand_CreateImm0(Inst, (iflags));
2558
429
    MCOperand_CreateImm0(Inst, (mode));
2559
3.87k
  } else if (imod && !M) {
2560
1.27k
    MCInst_setOpcode(Inst, (ARM_CPS2p));
2561
1.27k
    MCOperand_CreateImm0(Inst, (imod));
2562
1.27k
    MCOperand_CreateImm0(Inst, (iflags));
2563
1.27k
    if (mode)
2564
725
      S = MCDisassembler_SoftFail;
2565
2.60k
  } else if (!imod && M) {
2566
1.70k
    MCInst_setOpcode(Inst, (ARM_CPS1p));
2567
1.70k
    MCOperand_CreateImm0(Inst, (mode));
2568
1.70k
    if (iflags)
2569
1.10k
      S = MCDisassembler_SoftFail;
2570
1.70k
  } else {
2571
    // imod == '00' && M == '0' --> UNPREDICTABLE
2572
902
    MCInst_setOpcode(Inst, (ARM_CPS1p));
2573
902
    MCOperand_CreateImm0(Inst, (mode));
2574
902
    S = MCDisassembler_SoftFail;
2575
902
  }
2576
2577
4.30k
  return S;
2578
4.30k
}
2579
2580
static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn,
2581
             uint64_t Address,
2582
             const void *Decoder)
2583
1.78k
{
2584
1.78k
  unsigned imod = fieldFromInstruction_4(Insn, 9, 2);
2585
1.78k
  unsigned M = fieldFromInstruction_4(Insn, 8, 1);
2586
1.78k
  unsigned iflags = fieldFromInstruction_4(Insn, 5, 3);
2587
1.78k
  unsigned mode = fieldFromInstruction_4(Insn, 0, 5);
2588
2589
1.78k
  DecodeStatus S = MCDisassembler_Success;
2590
2591
  // imod == '01' --> UNPREDICTABLE
2592
  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
2593
  // return failure here.  The '01' imod value is unprintable, so there's
2594
  // nothing useful we could do even if we returned UNPREDICTABLE.
2595
2596
1.78k
  if (imod == 1)
2597
2
    return MCDisassembler_Fail;
2598
2599
1.78k
  if (imod && M) {
2600
309
    MCInst_setOpcode(Inst, (ARM_t2CPS3p));
2601
309
    MCOperand_CreateImm0(Inst, (imod));
2602
309
    MCOperand_CreateImm0(Inst, (iflags));
2603
309
    MCOperand_CreateImm0(Inst, (mode));
2604
1.47k
  } else if (imod && !M) {
2605
118
    MCInst_setOpcode(Inst, (ARM_t2CPS2p));
2606
118
    MCOperand_CreateImm0(Inst, (imod));
2607
118
    MCOperand_CreateImm0(Inst, (iflags));
2608
118
    if (mode)
2609
0
      S = MCDisassembler_SoftFail;
2610
1.35k
  } else if (!imod && M) {
2611
1.35k
    MCInst_setOpcode(Inst, (ARM_t2CPS1p));
2612
1.35k
    MCOperand_CreateImm0(Inst, (mode));
2613
1.35k
    if (iflags)
2614
885
      S = MCDisassembler_SoftFail;
2615
1.35k
  } else {
2616
    // imod == '00' && M == '0' --> this is a HINT instruction
2617
0
    int imm = fieldFromInstruction_4(Insn, 0, 8);
2618
    // HINT are defined only for immediate in [0..4]
2619
0
    if (imm > 4)
2620
0
      return MCDisassembler_Fail;
2621
0
    MCInst_setOpcode(Inst, (ARM_t2HINT));
2622
0
    MCOperand_CreateImm0(Inst, (imm));
2623
0
  }
2624
2625
1.78k
  return S;
2626
1.78k
}
2627
2628
static DecodeStatus DecodeT2HintSpaceInstruction(MCInst *Inst, unsigned Insn,
2629
             uint64_t Address,
2630
             const void *Decoder)
2631
323
{
2632
323
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
2633
2634
323
  unsigned Opcode = ARM_t2HINT;
2635
2636
323
  if (imm == 0x0D) {
2637
36
    Opcode = ARM_t2PACBTI;
2638
287
  } else if (imm == 0x1D) {
2639
19
    Opcode = ARM_t2PAC;
2640
268
  } else if (imm == 0x2D) {
2641
20
    Opcode = ARM_t2AUT;
2642
248
  } else if (imm == 0x0F) {
2643
75
    Opcode = ARM_t2BTI;
2644
75
  }
2645
2646
323
  MCInst_setOpcode(Inst, (Opcode));
2647
323
  if (Opcode == ARM_t2HINT) {
2648
173
    MCOperand_CreateImm0(Inst, (imm));
2649
173
  }
2650
2651
323
  return MCDisassembler_Success;
2652
323
}
2653
2654
static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn,
2655
               uint64_t Address,
2656
               const void *Decoder)
2657
1.60k
{
2658
1.60k
  DecodeStatus S = MCDisassembler_Success;
2659
2660
1.60k
  unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
2661
1.60k
  unsigned imm = 0;
2662
2663
1.60k
  imm |= (fieldFromInstruction_4(Insn, 0, 8) << 0);
2664
1.60k
  imm |= (fieldFromInstruction_4(Insn, 12, 3) << 8);
2665
1.60k
  imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12);
2666
1.60k
  imm |= (fieldFromInstruction_4(Insn, 26, 1) << 11);
2667
2668
1.60k
  if (MCInst_getOpcode(Inst) == ARM_t2MOVTi16)
2669
1.20k
    if (!Check(&S,
2670
1.20k
         DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2671
0
      return MCDisassembler_Fail;
2672
1.60k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2673
0
    return MCDisassembler_Fail;
2674
2675
1.60k
  if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
2676
1.60k
    MCOperand_CreateImm0(Inst, (imm));
2677
2678
1.60k
  return S;
2679
1.60k
}
2680
2681
static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn,
2682
                uint64_t Address,
2683
                const void *Decoder)
2684
2.76k
{
2685
2.76k
  DecodeStatus S = MCDisassembler_Success;
2686
2687
2.76k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2688
2.76k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2689
2.76k
  unsigned imm = 0;
2690
2691
2.76k
  imm |= (fieldFromInstruction_4(Insn, 0, 12) << 0);
2692
2.76k
  imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12);
2693
2694
2.76k
  if (MCInst_getOpcode(Inst) == ARM_MOVTi16)
2695
1.69k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address,
2696
1.69k
                Decoder)))
2697
0
      return MCDisassembler_Fail;
2698
2699
2.76k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2700
0
    return MCDisassembler_Fail;
2701
2702
2.76k
  if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
2703
2.76k
    MCOperand_CreateImm0(Inst, (imm));
2704
2705
2.76k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2706
219
    return MCDisassembler_Fail;
2707
2708
2.55k
  return S;
2709
2.76k
}
2710
2711
static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn,
2712
            uint64_t Address, const void *Decoder)
2713
3.42k
{
2714
3.42k
  DecodeStatus S = MCDisassembler_Success;
2715
2716
3.42k
  unsigned Rd = fieldFromInstruction_4(Insn, 16, 4);
2717
3.42k
  unsigned Rn = fieldFromInstruction_4(Insn, 0, 4);
2718
3.42k
  unsigned Rm = fieldFromInstruction_4(Insn, 8, 4);
2719
3.42k
  unsigned Ra = fieldFromInstruction_4(Insn, 12, 4);
2720
3.42k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2721
2722
3.42k
  if (pred == 0xF)
2723
1.23k
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
2724
2725
2.18k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2726
0
    return MCDisassembler_Fail;
2727
2.18k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2728
0
    return MCDisassembler_Fail;
2729
2.18k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2730
0
    return MCDisassembler_Fail;
2731
2.18k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
2732
0
    return MCDisassembler_Fail;
2733
2734
2.18k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2735
0
    return MCDisassembler_Fail;
2736
2737
2.18k
  return S;
2738
2.18k
}
2739
2740
static DecodeStatus DecodeTSTInstruction(MCInst *Inst, unsigned Insn,
2741
           uint64_t Address, const void *Decoder)
2742
501
{
2743
501
  DecodeStatus S = MCDisassembler_Success;
2744
2745
501
  unsigned Pred = fieldFromInstruction_4(Insn, 28, 4);
2746
501
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2747
501
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2748
2749
501
  if (Pred == 0xF)
2750
280
    return DecodeSETPANInstruction(Inst, Insn, Address, Decoder);
2751
2752
221
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2753
0
    return MCDisassembler_Fail;
2754
221
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2755
0
    return MCDisassembler_Fail;
2756
221
  if (!Check(&S, DecodePredicateOperand(Inst, Pred, Address, Decoder)))
2757
0
    return MCDisassembler_Fail;
2758
2759
221
  return S;
2760
221
}
2761
2762
static DecodeStatus DecodeSETPANInstruction(MCInst *Inst, unsigned Insn,
2763
              uint64_t Address,
2764
              const void *Decoder)
2765
280
{
2766
280
  DecodeStatus S = MCDisassembler_Success;
2767
2768
280
  unsigned Imm = fieldFromInstruction_4(Insn, 9, 1);
2769
2770
280
  if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8_1aOps) ||
2771
280
      !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops))
2772
2
    return MCDisassembler_Fail;
2773
2774
  // Decoder can be called from DecodeTST, which does not check the full
2775
  // encoding is valid.
2776
278
  if (fieldFromInstruction_4(Insn, 20, 12) != 0xf11 ||
2777
278
      fieldFromInstruction_4(Insn, 4, 4) != 0)
2778
0
    return MCDisassembler_Fail;
2779
278
  if (fieldFromInstruction_4(Insn, 10, 10) != 0 ||
2780
278
      fieldFromInstruction_4(Insn, 0, 4) != 0)
2781
165
    S = MCDisassembler_SoftFail;
2782
2783
278
  MCInst_setOpcode(Inst, (ARM_SETPAN));
2784
278
  MCOperand_CreateImm0(Inst, (Imm));
2785
2786
278
  return S;
2787
278
}
2788
2789
static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val,
2790
                 uint64_t Address,
2791
                 const void *Decoder)
2792
6.92k
{
2793
6.92k
  DecodeStatus S = MCDisassembler_Success;
2794
2795
6.92k
  unsigned add = fieldFromInstruction_4(Val, 12, 1);
2796
6.92k
  unsigned imm = fieldFromInstruction_4(Val, 0, 12);
2797
6.92k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
2798
2799
6.92k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2800
0
    return MCDisassembler_Fail;
2801
2802
6.92k
  if (!add)
2803
3.45k
    imm *= -1;
2804
6.92k
  if (imm == 0 && !add)
2805
224
    imm = INT32_MIN;
2806
6.92k
  MCOperand_CreateImm0(Inst, (imm));
2807
6.92k
  if (Rn == 15)
2808
522
    tryAddingPcLoadReferenceComment(Address, Address + imm + 8,
2809
522
            Decoder);
2810
2811
6.92k
  return S;
2812
6.92k
}
2813
2814
static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val,
2815
             uint64_t Address,
2816
             const void *Decoder)
2817
2.10k
{
2818
2.10k
  DecodeStatus S = MCDisassembler_Success;
2819
2820
2.10k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
2821
  // U == 1 to add imm, 0 to subtract it.
2822
2.10k
  unsigned U = fieldFromInstruction_4(Val, 8, 1);
2823
2.10k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
2824
2825
2.10k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2826
0
    return MCDisassembler_Fail;
2827
2828
2.10k
  if (U)
2829
905
    MCOperand_CreateImm0(Inst, (ARM_AM_getAM5Opc(ARM_AM_add, imm)));
2830
1.20k
  else
2831
1.20k
    MCOperand_CreateImm0(Inst, (ARM_AM_getAM5Opc(ARM_AM_sub, imm)));
2832
2833
2.10k
  return S;
2834
2.10k
}
2835
2836
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst *Inst, unsigned Val,
2837
                 uint64_t Address,
2838
                 const void *Decoder)
2839
1.61k
{
2840
1.61k
  DecodeStatus S = MCDisassembler_Success;
2841
2842
1.61k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
2843
  // U == 1 to add imm, 0 to subtract it.
2844
1.61k
  unsigned U = fieldFromInstruction_4(Val, 8, 1);
2845
1.61k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
2846
2847
1.61k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2848
0
    return MCDisassembler_Fail;
2849
2850
1.61k
  if (U)
2851
538
    MCOperand_CreateImm0(Inst,
2852
538
             (ARM_AM_getAM5FP16Opc(ARM_AM_add, imm)));
2853
1.07k
  else
2854
1.07k
    MCOperand_CreateImm0(Inst,
2855
1.07k
             (ARM_AM_getAM5FP16Opc(ARM_AM_sub, imm)));
2856
2857
1.61k
  return S;
2858
1.61k
}
2859
2860
static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val,
2861
             uint64_t Address,
2862
             const void *Decoder)
2863
12.5k
{
2864
12.5k
  return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
2865
12.5k
}
2866
2867
static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn,
2868
           uint64_t Address, const void *Decoder)
2869
855
{
2870
855
  DecodeStatus Status = MCDisassembler_Success;
2871
2872
  // Note the J1 and J2 values are from the encoded instruction.  So here
2873
  // change them to I1 and I2 values via as documented:
2874
  // I1 = NOT(J1 EOR S);
2875
  // I2 = NOT(J2 EOR S);
2876
  // and build the imm32 with one trailing zero as documented:
2877
  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
2878
855
  unsigned S = fieldFromInstruction_4(Insn, 26, 1);
2879
855
  unsigned J1 = fieldFromInstruction_4(Insn, 13, 1);
2880
855
  unsigned J2 = fieldFromInstruction_4(Insn, 11, 1);
2881
855
  unsigned I1 = !(J1 ^ S);
2882
855
  unsigned I2 = !(J2 ^ S);
2883
855
  unsigned imm10 = fieldFromInstruction_4(Insn, 16, 10);
2884
855
  unsigned imm11 = fieldFromInstruction_4(Insn, 0, 11);
2885
855
  unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) |
2886
855
           imm11;
2887
855
  int imm32 = SignExtend32((tmp << 1), 25);
2888
855
  if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4, true, 4,
2889
855
              Inst, Decoder))
2890
855
    MCOperand_CreateImm0(Inst, (imm32));
2891
2892
855
  return Status;
2893
855
}
2894
2895
static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst, unsigned Insn,
2896
                 uint64_t Address,
2897
                 const void *Decoder)
2898
5.83k
{
2899
5.83k
  DecodeStatus S = MCDisassembler_Success;
2900
2901
5.83k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2902
5.83k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 24) << 2;
2903
2904
5.83k
  if (pred == 0xF) {
2905
811
    MCInst_setOpcode(Inst, (ARM_BLXi));
2906
811
    imm |= fieldFromInstruction_4(Insn, 24, 1) << 1;
2907
811
    if (!tryAddingSymbolicOperand(
2908
811
          Address, Address + SignExtend32((imm), 26) + 8,
2909
811
          true, 4, Inst, Decoder))
2910
811
      MCOperand_CreateImm0(Inst, (SignExtend32((imm), 26)));
2911
811
    return S;
2912
811
  }
2913
2914
5.02k
  if (!tryAddingSymbolicOperand(Address,
2915
5.02k
              Address + SignExtend32((imm), 26) + 8,
2916
5.02k
              true, 4, Inst, Decoder))
2917
5.02k
    MCOperand_CreateImm0(Inst, (SignExtend32((imm), 26)));
2918
2919
  // We already have BL_pred for BL w/ predicate, no need to add addition
2920
  // predicate opreands for BL
2921
5.02k
  if (MCInst_getOpcode(Inst) != ARM_BL)
2922
4.78k
    if (!Check(&S, DecodePredicateOperand(Inst, pred, Address,
2923
4.78k
                  Decoder)))
2924
0
      return MCDisassembler_Fail;
2925
2926
5.02k
  return S;
2927
5.02k
}
2928
2929
static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val,
2930
             uint64_t Address,
2931
             const void *Decoder)
2932
59.6k
{
2933
59.6k
  DecodeStatus S = MCDisassembler_Success;
2934
2935
59.6k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
2936
59.6k
  unsigned align = fieldFromInstruction_4(Val, 4, 2);
2937
2938
59.6k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2939
0
    return MCDisassembler_Fail;
2940
59.6k
  if (!align)
2941
30.6k
    MCOperand_CreateImm0(Inst, (0));
2942
29.0k
  else
2943
29.0k
    MCOperand_CreateImm0(Inst, (4 << align));
2944
2945
59.6k
  return S;
2946
59.6k
}
2947
2948
static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Insn,
2949
           uint64_t Address, const void *Decoder)
2950
11.6k
{
2951
11.6k
  DecodeStatus S = MCDisassembler_Success;
2952
2953
11.6k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2954
11.6k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
2955
11.6k
  unsigned wb = fieldFromInstruction_4(Insn, 16, 4);
2956
11.6k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2957
11.6k
  Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4;
2958
11.6k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2959
2960
  // First output register
2961
11.6k
  switch (MCInst_getOpcode(Inst)) {
2962
46
  case ARM_VLD1q16:
2963
223
  case ARM_VLD1q32:
2964
279
  case ARM_VLD1q64:
2965
427
  case ARM_VLD1q8:
2966
483
  case ARM_VLD1q16wb_fixed:
2967
525
  case ARM_VLD1q16wb_register:
2968
724
  case ARM_VLD1q32wb_fixed:
2969
772
  case ARM_VLD1q32wb_register:
2970
810
  case ARM_VLD1q64wb_fixed:
2971
825
  case ARM_VLD1q64wb_register:
2972
901
  case ARM_VLD1q8wb_fixed:
2973
1.00k
  case ARM_VLD1q8wb_register:
2974
1.04k
  case ARM_VLD2d16:
2975
1.19k
  case ARM_VLD2d32:
2976
1.27k
  case ARM_VLD2d8:
2977
1.52k
  case ARM_VLD2d16wb_fixed:
2978
1.56k
  case ARM_VLD2d16wb_register:
2979
1.60k
  case ARM_VLD2d32wb_fixed:
2980
1.82k
  case ARM_VLD2d32wb_register:
2981
1.91k
  case ARM_VLD2d8wb_fixed:
2982
1.96k
  case ARM_VLD2d8wb_register:
2983
1.96k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
2984
1.96k
              Decoder)))
2985
3
      return MCDisassembler_Fail;
2986
1.96k
    break;
2987
1.96k
  case ARM_VLD2b16:
2988
40
  case ARM_VLD2b32:
2989
205
  case ARM_VLD2b8:
2990
249
  case ARM_VLD2b16wb_fixed:
2991
340
  case ARM_VLD2b16wb_register:
2992
692
  case ARM_VLD2b32wb_fixed:
2993
762
  case ARM_VLD2b32wb_register:
2994
865
  case ARM_VLD2b8wb_fixed:
2995
1.08k
  case ARM_VLD2b8wb_register:
2996
1.08k
    if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address,
2997
1.08k
                    Decoder)))
2998
4
      return MCDisassembler_Fail;
2999
1.07k
    break;
3000
8.55k
  default:
3001
8.55k
    if (!Check(&S,
3002
8.55k
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3003
0
      return MCDisassembler_Fail;
3004
11.6k
  }
3005
3006
  // Second output register
3007
11.5k
  switch (MCInst_getOpcode(Inst)) {
3008
266
  case ARM_VLD3d8:
3009
359
  case ARM_VLD3d16:
3010
912
  case ARM_VLD3d32:
3011
967
  case ARM_VLD3d8_UPD:
3012
1.01k
  case ARM_VLD3d16_UPD:
3013
1.40k
  case ARM_VLD3d32_UPD:
3014
1.45k
  case ARM_VLD4d8:
3015
1.88k
  case ARM_VLD4d16:
3016
2.10k
  case ARM_VLD4d32:
3017
2.32k
  case ARM_VLD4d8_UPD:
3018
2.77k
  case ARM_VLD4d16_UPD:
3019
2.83k
  case ARM_VLD4d32_UPD:
3020
2.83k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 1) % 32,
3021
2.83k
                  Address, Decoder)))
3022
0
      return MCDisassembler_Fail;
3023
2.83k
    break;
3024
2.83k
  case ARM_VLD3q8:
3025
307
  case ARM_VLD3q16:
3026
385
  case ARM_VLD3q32:
3027
549
  case ARM_VLD3q8_UPD:
3028
785
  case ARM_VLD3q16_UPD:
3029
894
  case ARM_VLD3q32_UPD:
3030
968
  case ARM_VLD4q8:
3031
1.08k
  case ARM_VLD4q16:
3032
1.31k
  case ARM_VLD4q32:
3033
1.44k
  case ARM_VLD4q8_UPD:
3034
1.57k
  case ARM_VLD4q16_UPD:
3035
1.77k
  case ARM_VLD4q32_UPD:
3036
1.77k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3037
1.77k
                  Address, Decoder)))
3038
0
      return MCDisassembler_Fail;
3039
1.77k
    break;
3040
6.99k
  default:
3041
6.99k
    break;
3042
11.5k
  }
3043
3044
  // Third output register
3045
11.5k
  switch (MCInst_getOpcode(Inst)) {
3046
266
  case ARM_VLD3d8:
3047
359
  case ARM_VLD3d16:
3048
912
  case ARM_VLD3d32:
3049
967
  case ARM_VLD3d8_UPD:
3050
1.01k
  case ARM_VLD3d16_UPD:
3051
1.40k
  case ARM_VLD3d32_UPD:
3052
1.45k
  case ARM_VLD4d8:
3053
1.88k
  case ARM_VLD4d16:
3054
2.10k
  case ARM_VLD4d32:
3055
2.32k
  case ARM_VLD4d8_UPD:
3056
2.77k
  case ARM_VLD4d16_UPD:
3057
2.83k
  case ARM_VLD4d32_UPD:
3058
2.83k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3059
2.83k
                  Address, Decoder)))
3060
0
      return MCDisassembler_Fail;
3061
2.83k
    break;
3062
2.83k
  case ARM_VLD3q8:
3063
307
  case ARM_VLD3q16:
3064
385
  case ARM_VLD3q32:
3065
549
  case ARM_VLD3q8_UPD:
3066
785
  case ARM_VLD3q16_UPD:
3067
894
  case ARM_VLD3q32_UPD:
3068
968
  case ARM_VLD4q8:
3069
1.08k
  case ARM_VLD4q16:
3070
1.31k
  case ARM_VLD4q32:
3071
1.44k
  case ARM_VLD4q8_UPD:
3072
1.57k
  case ARM_VLD4q16_UPD:
3073
1.77k
  case ARM_VLD4q32_UPD:
3074
1.77k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 4) % 32,
3075
1.77k
                  Address, Decoder)))
3076
0
      return MCDisassembler_Fail;
3077
1.77k
    break;
3078
6.99k
  default:
3079
6.99k
    break;
3080
11.5k
  }
3081
3082
  // Fourth output register
3083
11.5k
  switch (MCInst_getOpcode(Inst)) {
3084
52
  case ARM_VLD4d8:
3085
484
  case ARM_VLD4d16:
3086
708
  case ARM_VLD4d32:
3087
920
  case ARM_VLD4d8_UPD:
3088
1.36k
  case ARM_VLD4d16_UPD:
3089
1.43k
  case ARM_VLD4d32_UPD:
3090
1.43k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3) % 32,
3091
1.43k
                  Address, Decoder)))
3092
0
      return MCDisassembler_Fail;
3093
1.43k
    break;
3094
1.43k
  case ARM_VLD4q8:
3095
191
  case ARM_VLD4q16:
3096
422
  case ARM_VLD4q32:
3097
553
  case ARM_VLD4q8_UPD:
3098
681
  case ARM_VLD4q16_UPD:
3099
878
  case ARM_VLD4q32_UPD:
3100
878
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 6) % 32,
3101
878
                  Address, Decoder)))
3102
0
      return MCDisassembler_Fail;
3103
878
    break;
3104
9.29k
  default:
3105
9.29k
    break;
3106
11.5k
  }
3107
3108
  // Writeback operand
3109
11.5k
  switch (MCInst_getOpcode(Inst)) {
3110
502
  case ARM_VLD1d8wb_fixed:
3111
524
  case ARM_VLD1d16wb_fixed:
3112
627
  case ARM_VLD1d32wb_fixed:
3113
641
  case ARM_VLD1d64wb_fixed:
3114
741
  case ARM_VLD1d8wb_register:
3115
819
  case ARM_VLD1d16wb_register:
3116
848
  case ARM_VLD1d32wb_register:
3117
898
  case ARM_VLD1d64wb_register:
3118
974
  case ARM_VLD1q8wb_fixed:
3119
1.02k
  case ARM_VLD1q16wb_fixed:
3120
1.22k
  case ARM_VLD1q32wb_fixed:
3121
1.26k
  case ARM_VLD1q64wb_fixed:
3122
1.37k
  case ARM_VLD1q8wb_register:
3123
1.41k
  case ARM_VLD1q16wb_register:
3124
1.46k
  case ARM_VLD1q32wb_register:
3125
1.47k
  case ARM_VLD1q64wb_register:
3126
1.56k
  case ARM_VLD1d8Twb_fixed:
3127
1.61k
  case ARM_VLD1d8Twb_register:
3128
1.90k
  case ARM_VLD1d16Twb_fixed:
3129
1.93k
  case ARM_VLD1d16Twb_register:
3130
2.01k
  case ARM_VLD1d32Twb_fixed:
3131
2.04k
  case ARM_VLD1d32Twb_register:
3132
2.22k
  case ARM_VLD1d64Twb_fixed:
3133
2.34k
  case ARM_VLD1d64Twb_register:
3134
2.48k
  case ARM_VLD1d8Qwb_fixed:
3135
2.58k
  case ARM_VLD1d8Qwb_register:
3136
2.70k
  case ARM_VLD1d16Qwb_fixed:
3137
2.76k
  case ARM_VLD1d16Qwb_register:
3138
2.81k
  case ARM_VLD1d32Qwb_fixed:
3139
2.83k
  case ARM_VLD1d32Qwb_register:
3140
2.86k
  case ARM_VLD1d64Qwb_fixed:
3141
2.94k
  case ARM_VLD1d64Qwb_register:
3142
3.03k
  case ARM_VLD2d8wb_fixed:
3143
3.28k
  case ARM_VLD2d16wb_fixed:
3144
3.32k
  case ARM_VLD2d32wb_fixed:
3145
3.47k
  case ARM_VLD2q8wb_fixed:
3146
3.65k
  case ARM_VLD2q16wb_fixed:
3147
3.66k
  case ARM_VLD2q32wb_fixed:
3148
3.72k
  case ARM_VLD2d8wb_register:
3149
3.76k
  case ARM_VLD2d16wb_register:
3150
3.98k
  case ARM_VLD2d32wb_register:
3151
4.60k
  case ARM_VLD2q8wb_register:
3152
4.73k
  case ARM_VLD2q16wb_register:
3153
4.88k
  case ARM_VLD2q32wb_register:
3154
4.99k
  case ARM_VLD2b8wb_fixed:
3155
5.03k
  case ARM_VLD2b16wb_fixed:
3156
5.38k
  case ARM_VLD2b32wb_fixed:
3157
5.60k
  case ARM_VLD2b8wb_register:
3158
5.69k
  case ARM_VLD2b16wb_register:
3159
5.76k
  case ARM_VLD2b32wb_register:
3160
5.76k
    MCOperand_CreateImm0(Inst, (0));
3161
5.76k
    break;
3162
55
  case ARM_VLD3d8_UPD:
3163
104
  case ARM_VLD3d16_UPD:
3164
489
  case ARM_VLD3d32_UPD:
3165
653
  case ARM_VLD3q8_UPD:
3166
889
  case ARM_VLD3q16_UPD:
3167
998
  case ARM_VLD3q32_UPD:
3168
1.21k
  case ARM_VLD4d8_UPD:
3169
1.65k
  case ARM_VLD4d16_UPD:
3170
1.72k
  case ARM_VLD4d32_UPD:
3171
1.85k
  case ARM_VLD4q8_UPD:
3172
1.98k
  case ARM_VLD4q16_UPD:
3173
2.17k
  case ARM_VLD4q32_UPD:
3174
2.17k
    if (!Check(&S,
3175
2.17k
         DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
3176
0
      return MCDisassembler_Fail;
3177
2.17k
    break;
3178
3.65k
  default:
3179
3.65k
    break;
3180
11.5k
  }
3181
3182
  // AddrMode6 Base (register+alignment)
3183
11.5k
  if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
3184
0
    return MCDisassembler_Fail;
3185
3186
  // AddrMode6 Offset (register)
3187
11.5k
  switch (MCInst_getOpcode(Inst)) {
3188
7.92k
  default:
3189
    // The below have been updated to have explicit am6offset split
3190
    // between fixed and register offset. For those instructions not
3191
    // yet updated, we need to add an additional reg0 operand for the
3192
    // fixed variant.
3193
    //
3194
    // The fixed offset encodes as Rm == 0xd, so we check for that.
3195
7.92k
    if (Rm == 0xd) {
3196
266
      MCOperand_CreateReg0(Inst, (0));
3197
266
      break;
3198
266
    }
3199
    // Fall through to handle the register offset variant.
3200
    // fall through
3201
8.16k
  case ARM_VLD1d8wb_fixed:
3202
8.18k
  case ARM_VLD1d16wb_fixed:
3203
8.28k
  case ARM_VLD1d32wb_fixed:
3204
8.30k
  case ARM_VLD1d64wb_fixed:
3205
8.38k
  case ARM_VLD1d8Twb_fixed:
3206
8.68k
  case ARM_VLD1d16Twb_fixed:
3207
8.76k
  case ARM_VLD1d32Twb_fixed:
3208
8.94k
  case ARM_VLD1d64Twb_fixed:
3209
9.08k
  case ARM_VLD1d8Qwb_fixed:
3210
9.20k
  case ARM_VLD1d16Qwb_fixed:
3211
9.24k
  case ARM_VLD1d32Qwb_fixed:
3212
9.27k
  case ARM_VLD1d64Qwb_fixed:
3213
9.37k
  case ARM_VLD1d8wb_register:
3214
9.45k
  case ARM_VLD1d16wb_register:
3215
9.48k
  case ARM_VLD1d32wb_register:
3216
9.53k
  case ARM_VLD1d64wb_register:
3217
9.60k
  case ARM_VLD1q8wb_fixed:
3218
9.66k
  case ARM_VLD1q16wb_fixed:
3219
9.86k
  case ARM_VLD1q32wb_fixed:
3220
9.89k
  case ARM_VLD1q64wb_fixed:
3221
10.0k
  case ARM_VLD1q8wb_register:
3222
10.0k
  case ARM_VLD1q16wb_register:
3223
10.0k
  case ARM_VLD1q32wb_register:
3224
10.1k
  case ARM_VLD1q64wb_register:
3225
    // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3226
    // variant encodes Rm == 0xf. Anything else is a register offset post-
3227
    // increment and we need to add the register operand to the instruction.
3228
10.1k
    if (Rm != 0xD && Rm != 0xF &&
3229
10.1k
        !Check(&S,
3230
4.47k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3231
0
      return MCDisassembler_Fail;
3232
10.1k
    break;
3233
10.1k
  case ARM_VLD2d8wb_fixed:
3234
339
  case ARM_VLD2d16wb_fixed:
3235
378
  case ARM_VLD2d32wb_fixed:
3236
481
  case ARM_VLD2b8wb_fixed:
3237
525
  case ARM_VLD2b16wb_fixed:
3238
877
  case ARM_VLD2b32wb_fixed:
3239
1.03k
  case ARM_VLD2q8wb_fixed:
3240
1.21k
  case ARM_VLD2q16wb_fixed:
3241
1.22k
  case ARM_VLD2q32wb_fixed:
3242
1.22k
    break;
3243
11.5k
  }
3244
3245
11.5k
  return S;
3246
11.5k
}
3247
3248
static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Insn,
3249
              uint64_t Address,
3250
              const void *Decoder)
3251
24.0k
{
3252
24.0k
  unsigned type = fieldFromInstruction_4(Insn, 8, 4);
3253
24.0k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
3254
24.0k
  if (type == 6 && (align & 2))
3255
5
    return MCDisassembler_Fail;
3256
24.0k
  if (type == 7 && (align & 2))
3257
0
    return MCDisassembler_Fail;
3258
24.0k
  if (type == 10 && align == 3)
3259
3
    return MCDisassembler_Fail;
3260
3261
24.0k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3262
24.0k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3263
24.0k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3264
24.0k
}
3265
3266
static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Insn,
3267
              uint64_t Address,
3268
              const void *Decoder)
3269
17.2k
{
3270
17.2k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3271
17.2k
  if (size == 3)
3272
0
    return MCDisassembler_Fail;
3273
3274
17.2k
  unsigned type = fieldFromInstruction_4(Insn, 8, 4);
3275
17.2k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
3276
17.2k
  if (type == 8 && align == 3)
3277
5
    return MCDisassembler_Fail;
3278
17.2k
  if (type == 9 && align == 3)
3279
6
    return MCDisassembler_Fail;
3280
3281
17.2k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3282
17.2k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3283
17.2k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3284
17.2k
}
3285
3286
static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Insn,
3287
              uint64_t Address,
3288
              const void *Decoder)
3289
8.00k
{
3290
8.00k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3291
8.00k
  if (size == 3)
3292
0
    return MCDisassembler_Fail;
3293
3294
8.00k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
3295
8.00k
  if (align & 2)
3296
0
    return MCDisassembler_Fail;
3297
3298
8.00k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3299
8.00k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3300
8.00k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3301
8.00k
}
3302
3303
static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Insn,
3304
              uint64_t Address,
3305
              const void *Decoder)
3306
10.4k
{
3307
10.4k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3308
10.4k
  if (size == 3)
3309
0
    return MCDisassembler_Fail;
3310
3311
10.4k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3312
10.4k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3313
10.4k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3314
10.4k
}
3315
3316
static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Insn,
3317
           uint64_t Address, const void *Decoder)
3318
31.3k
{
3319
31.3k
  DecodeStatus S = MCDisassembler_Success;
3320
3321
31.3k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3322
31.3k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3323
31.3k
  unsigned wb = fieldFromInstruction_4(Insn, 16, 4);
3324
31.3k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3325
31.3k
  Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4;
3326
31.3k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3327
3328
  // Writeback Operand
3329
31.3k
  switch (MCInst_getOpcode(Inst)) {
3330
898
  case ARM_VST1d8wb_fixed:
3331
1.01k
  case ARM_VST1d16wb_fixed:
3332
1.11k
  case ARM_VST1d32wb_fixed:
3333
1.19k
  case ARM_VST1d64wb_fixed:
3334
1.71k
  case ARM_VST1d8wb_register:
3335
2.36k
  case ARM_VST1d16wb_register:
3336
2.48k
  case ARM_VST1d32wb_register:
3337
2.86k
  case ARM_VST1d64wb_register:
3338
3.44k
  case ARM_VST1q8wb_fixed:
3339
3.52k
  case ARM_VST1q16wb_fixed:
3340
4.07k
  case ARM_VST1q32wb_fixed:
3341
4.41k
  case ARM_VST1q64wb_fixed:
3342
4.88k
  case ARM_VST1q8wb_register:
3343
5.05k
  case ARM_VST1q16wb_register:
3344
5.29k
  case ARM_VST1q32wb_register:
3345
5.55k
  case ARM_VST1q64wb_register:
3346
6.36k
  case ARM_VST1d8Twb_fixed:
3347
6.49k
  case ARM_VST1d16Twb_fixed:
3348
6.67k
  case ARM_VST1d32Twb_fixed:
3349
6.90k
  case ARM_VST1d64Twb_fixed:
3350
7.75k
  case ARM_VST1d8Twb_register:
3351
8.15k
  case ARM_VST1d16Twb_register:
3352
8.55k
  case ARM_VST1d32Twb_register:
3353
8.98k
  case ARM_VST1d64Twb_register:
3354
9.23k
  case ARM_VST1d8Qwb_fixed:
3355
9.40k
  case ARM_VST1d16Qwb_fixed:
3356
9.82k
  case ARM_VST1d32Qwb_fixed:
3357
9.89k
  case ARM_VST1d64Qwb_fixed:
3358
10.1k
  case ARM_VST1d8Qwb_register:
3359
10.4k
  case ARM_VST1d16Qwb_register:
3360
10.5k
  case ARM_VST1d32Qwb_register:
3361
11.1k
  case ARM_VST1d64Qwb_register:
3362
11.4k
  case ARM_VST2d8wb_fixed:
3363
11.5k
  case ARM_VST2d16wb_fixed:
3364
11.7k
  case ARM_VST2d32wb_fixed:
3365
12.2k
  case ARM_VST2d8wb_register:
3366
12.4k
  case ARM_VST2d16wb_register:
3367
12.6k
  case ARM_VST2d32wb_register:
3368
13.0k
  case ARM_VST2q8wb_fixed:
3369
13.5k
  case ARM_VST2q16wb_fixed:
3370
13.6k
  case ARM_VST2q32wb_fixed:
3371
14.1k
  case ARM_VST2q8wb_register:
3372
14.8k
  case ARM_VST2q16wb_register:
3373
15.0k
  case ARM_VST2q32wb_register:
3374
15.2k
  case ARM_VST2b8wb_fixed:
3375
15.5k
  case ARM_VST2b16wb_fixed:
3376
15.8k
  case ARM_VST2b32wb_fixed:
3377
16.5k
  case ARM_VST2b8wb_register:
3378
17.5k
  case ARM_VST2b16wb_register:
3379
17.7k
  case ARM_VST2b32wb_register:
3380
17.7k
    if (Rm == 0xF)
3381
0
      return MCDisassembler_Fail;
3382
17.7k
    MCOperand_CreateImm0(Inst, (0));
3383
17.7k
    break;
3384
170
  case ARM_VST3d8_UPD:
3385
829
  case ARM_VST3d16_UPD:
3386
1.05k
  case ARM_VST3d32_UPD:
3387
1.55k
  case ARM_VST3q8_UPD:
3388
2.11k
  case ARM_VST3q16_UPD:
3389
2.27k
  case ARM_VST3q32_UPD:
3390
3.28k
  case ARM_VST4d8_UPD:
3391
3.85k
  case ARM_VST4d16_UPD:
3392
4.39k
  case ARM_VST4d32_UPD:
3393
4.84k
  case ARM_VST4q8_UPD:
3394
5.03k
  case ARM_VST4q16_UPD:
3395
5.30k
  case ARM_VST4q32_UPD:
3396
5.30k
    if (!Check(&S,
3397
5.30k
         DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
3398
0
      return MCDisassembler_Fail;
3399
5.30k
    break;
3400
8.28k
  default:
3401
8.28k
    break;
3402
31.3k
  }
3403
3404
  // AddrMode6 Base (register+alignment)
3405
31.3k
  if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
3406
0
    return MCDisassembler_Fail;
3407
3408
  // AddrMode6 Offset (register)
3409
31.3k
  switch (MCInst_getOpcode(Inst)) {
3410
23.9k
  default:
3411
23.9k
    if (Rm == 0xD)
3412
1.30k
      MCOperand_CreateReg0(Inst, (0));
3413
22.6k
    else if (Rm != 0xF) {
3414
14.3k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
3415
14.3k
                    Decoder)))
3416
0
        return MCDisassembler_Fail;
3417
14.3k
    }
3418
23.9k
    break;
3419
23.9k
  case ARM_VST1d8wb_fixed:
3420
1.01k
  case ARM_VST1d16wb_fixed:
3421
1.11k
  case ARM_VST1d32wb_fixed:
3422
1.19k
  case ARM_VST1d64wb_fixed:
3423
1.77k
  case ARM_VST1q8wb_fixed:
3424
1.85k
  case ARM_VST1q16wb_fixed:
3425
2.39k
  case ARM_VST1q32wb_fixed:
3426
2.74k
  case ARM_VST1q64wb_fixed:
3427
3.55k
  case ARM_VST1d8Twb_fixed:
3428
3.68k
  case ARM_VST1d16Twb_fixed:
3429
3.86k
  case ARM_VST1d32Twb_fixed:
3430
4.09k
  case ARM_VST1d64Twb_fixed:
3431
4.34k
  case ARM_VST1d8Qwb_fixed:
3432
4.51k
  case ARM_VST1d16Qwb_fixed:
3433
4.93k
  case ARM_VST1d32Qwb_fixed:
3434
5.00k
  case ARM_VST1d64Qwb_fixed:
3435
5.26k
  case ARM_VST2d8wb_fixed:
3436
5.44k
  case ARM_VST2d16wb_fixed:
3437
5.58k
  case ARM_VST2d32wb_fixed:
3438
5.92k
  case ARM_VST2q8wb_fixed:
3439
6.46k
  case ARM_VST2q16wb_fixed:
3440
6.58k
  case ARM_VST2q32wb_fixed:
3441
6.83k
  case ARM_VST2b8wb_fixed:
3442
7.07k
  case ARM_VST2b16wb_fixed:
3443
7.39k
  case ARM_VST2b32wb_fixed:
3444
7.39k
    break;
3445
31.3k
  }
3446
3447
  // First input register
3448
31.3k
  switch (MCInst_getOpcode(Inst)) {
3449
411
  case ARM_VST1q16:
3450
643
  case ARM_VST1q32:
3451
710
  case ARM_VST1q64:
3452
1.01k
  case ARM_VST1q8:
3453
1.09k
  case ARM_VST1q16wb_fixed:
3454
1.27k
  case ARM_VST1q16wb_register:
3455
1.81k
  case ARM_VST1q32wb_fixed:
3456
2.05k
  case ARM_VST1q32wb_register:
3457
2.39k
  case ARM_VST1q64wb_fixed:
3458
2.65k
  case ARM_VST1q64wb_register:
3459
3.23k
  case ARM_VST1q8wb_fixed:
3460
3.69k
  case ARM_VST1q8wb_register:
3461
4.22k
  case ARM_VST2d16:
3462
4.75k
  case ARM_VST2d32:
3463
4.93k
  case ARM_VST2d8:
3464
5.12k
  case ARM_VST2d16wb_fixed:
3465
5.26k
  case ARM_VST2d16wb_register:
3466
5.40k
  case ARM_VST2d32wb_fixed:
3467
5.64k
  case ARM_VST2d32wb_register:
3468
5.91k
  case ARM_VST2d8wb_fixed:
3469
6.46k
  case ARM_VST2d8wb_register:
3470
6.46k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
3471
6.46k
              Decoder)))
3472
3
      return MCDisassembler_Fail;
3473
6.46k
    break;
3474
6.46k
  case ARM_VST2b16:
3475
779
  case ARM_VST2b32:
3476
1.33k
  case ARM_VST2b8:
3477
1.57k
  case ARM_VST2b16wb_fixed:
3478
2.53k
  case ARM_VST2b16wb_register:
3479
2.85k
  case ARM_VST2b32wb_fixed:
3480
3.10k
  case ARM_VST2b32wb_register:
3481
3.35k
  case ARM_VST2b8wb_fixed:
3482
4.06k
  case ARM_VST2b8wb_register:
3483
4.06k
    if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address,
3484
4.06k
                    Decoder)))
3485
14
      return MCDisassembler_Fail;
3486
4.05k
    break;
3487
20.8k
  default:
3488
20.8k
    if (!Check(&S,
3489
20.8k
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3490
0
      return MCDisassembler_Fail;
3491
31.3k
  }
3492
3493
  // Second input register
3494
31.3k
  switch (MCInst_getOpcode(Inst)) {
3495
137
  case ARM_VST3d8:
3496
473
  case ARM_VST3d16:
3497
600
  case ARM_VST3d32:
3498
770
  case ARM_VST3d8_UPD:
3499
1.42k
  case ARM_VST3d16_UPD:
3500
1.65k
  case ARM_VST3d32_UPD:
3501
2.09k
  case ARM_VST4d8:
3502
2.28k
  case ARM_VST4d16:
3503
2.55k
  case ARM_VST4d32:
3504
3.56k
  case ARM_VST4d8_UPD:
3505
4.13k
  case ARM_VST4d16_UPD:
3506
4.67k
  case ARM_VST4d32_UPD:
3507
4.67k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 1) % 32,
3508
4.67k
                  Address, Decoder)))
3509
0
      return MCDisassembler_Fail;
3510
4.67k
    break;
3511
4.67k
  case ARM_VST3q8:
3512
636
  case ARM_VST3q16:
3513
738
  case ARM_VST3q32:
3514
1.23k
  case ARM_VST3q8_UPD:
3515
1.80k
  case ARM_VST3q16_UPD:
3516
1.95k
  case ARM_VST3q32_UPD:
3517
2.56k
  case ARM_VST4q8:
3518
3.04k
  case ARM_VST4q16:
3519
3.30k
  case ARM_VST4q32:
3520
3.75k
  case ARM_VST4q8_UPD:
3521
3.94k
  case ARM_VST4q16_UPD:
3522
4.21k
  case ARM_VST4q32_UPD:
3523
4.21k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3524
4.21k
                  Address, Decoder)))
3525
0
      return MCDisassembler_Fail;
3526
4.21k
    break;
3527
22.4k
  default:
3528
22.4k
    break;
3529
31.3k
  }
3530
3531
  // Third input register
3532
31.3k
  switch (MCInst_getOpcode(Inst)) {
3533
137
  case ARM_VST3d8:
3534
473
  case ARM_VST3d16:
3535
600
  case ARM_VST3d32:
3536
770
  case ARM_VST3d8_UPD:
3537
1.42k
  case ARM_VST3d16_UPD:
3538
1.65k
  case ARM_VST3d32_UPD:
3539
2.09k
  case ARM_VST4d8:
3540
2.28k
  case ARM_VST4d16:
3541
2.55k
  case ARM_VST4d32:
3542
3.56k
  case ARM_VST4d8_UPD:
3543
4.13k
  case ARM_VST4d16_UPD:
3544
4.67k
  case ARM_VST4d32_UPD:
3545
4.67k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3546
4.67k
                  Address, Decoder)))
3547
0
      return MCDisassembler_Fail;
3548
4.67k
    break;
3549
4.67k
  case ARM_VST3q8:
3550
636
  case ARM_VST3q16:
3551
738
  case ARM_VST3q32:
3552
1.23k
  case ARM_VST3q8_UPD:
3553
1.80k
  case ARM_VST3q16_UPD:
3554
1.95k
  case ARM_VST3q32_UPD:
3555
2.56k
  case ARM_VST4q8:
3556
3.04k
  case ARM_VST4q16:
3557
3.30k
  case ARM_VST4q32:
3558
3.75k
  case ARM_VST4q8_UPD:
3559
3.94k
  case ARM_VST4q16_UPD:
3560
4.21k
  case ARM_VST4q32_UPD:
3561
4.21k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 4) % 32,
3562
4.21k
                  Address, Decoder)))
3563
0
      return MCDisassembler_Fail;
3564
4.21k
    break;
3565
22.4k
  default:
3566
22.4k
    break;
3567
31.3k
  }
3568
3569
  // Fourth input register
3570
31.3k
  switch (MCInst_getOpcode(Inst)) {
3571
439
  case ARM_VST4d8:
3572
629
  case ARM_VST4d16:
3573
902
  case ARM_VST4d32:
3574
1.90k
  case ARM_VST4d8_UPD:
3575
2.48k
  case ARM_VST4d16_UPD:
3576
3.02k
  case ARM_VST4d32_UPD:
3577
3.02k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3) % 32,
3578
3.02k
                  Address, Decoder)))
3579
0
      return MCDisassembler_Fail;
3580
3.02k
    break;
3581
3.02k
  case ARM_VST4q8:
3582
1.08k
  case ARM_VST4q16:
3583
1.34k
  case ARM_VST4q32:
3584
1.79k
  case ARM_VST4q8_UPD:
3585
1.98k
  case ARM_VST4q16_UPD:
3586
2.25k
  case ARM_VST4q32_UPD:
3587
2.25k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 6) % 32,
3588
2.25k
                  Address, Decoder)))
3589
0
      return MCDisassembler_Fail;
3590
2.25k
    break;
3591
26.0k
  default:
3592
26.0k
    break;
3593
31.3k
  }
3594
3595
31.3k
  return S;
3596
31.3k
}
3597
3598
static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Insn,
3599
               uint64_t Address,
3600
               const void *Decoder)
3601
1.08k
{
3602
1.08k
  DecodeStatus S = MCDisassembler_Success;
3603
3604
1.08k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3605
1.08k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3606
1.08k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3607
1.08k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3608
1.08k
  unsigned align = fieldFromInstruction_4(Insn, 4, 1);
3609
1.08k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3610
3611
1.08k
  if (size == 0 && align == 1)
3612
2
    return MCDisassembler_Fail;
3613
1.07k
  align *= (1 << size);
3614
3615
1.07k
  switch (MCInst_getOpcode(Inst)) {
3616
0
  case ARM_VLD1DUPq16:
3617
0
  case ARM_VLD1DUPq32:
3618
22
  case ARM_VLD1DUPq8:
3619
24
  case ARM_VLD1DUPq16wb_fixed:
3620
87
  case ARM_VLD1DUPq16wb_register:
3621
87
  case ARM_VLD1DUPq32wb_fixed:
3622
105
  case ARM_VLD1DUPq32wb_register:
3623
107
  case ARM_VLD1DUPq8wb_fixed:
3624
259
  case ARM_VLD1DUPq8wb_register:
3625
259
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
3626
259
              Decoder)))
3627
2
      return MCDisassembler_Fail;
3628
257
    break;
3629
820
  default:
3630
820
    if (!Check(&S,
3631
820
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3632
0
      return MCDisassembler_Fail;
3633
820
    break;
3634
1.07k
  }
3635
1.07k
  if (Rm != 0xF) {
3636
657
    if (!Check(&S,
3637
657
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3638
0
      return MCDisassembler_Fail;
3639
657
  }
3640
3641
1.07k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3642
0
    return MCDisassembler_Fail;
3643
1.07k
  MCOperand_CreateImm0(Inst, (align));
3644
3645
  // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3646
  // variant encodes Rm == 0xf. Anything else is a register offset post-
3647
  // increment and we need to add the register operand to the instruction.
3648
1.07k
  if (Rm != 0xD && Rm != 0xF &&
3649
1.07k
      !Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3650
0
    return MCDisassembler_Fail;
3651
3652
1.07k
  return S;
3653
1.07k
}
3654
3655
static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Insn,
3656
               uint64_t Address,
3657
               const void *Decoder)
3658
4.72k
{
3659
4.72k
  DecodeStatus S = MCDisassembler_Success;
3660
3661
4.72k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3662
4.72k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3663
4.72k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3664
4.72k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3665
4.72k
  unsigned align = fieldFromInstruction_4(Insn, 4, 1);
3666
4.72k
  unsigned size = 1 << fieldFromInstruction_4(Insn, 6, 2);
3667
4.72k
  align *= 2 * size;
3668
3669
4.72k
  switch (MCInst_getOpcode(Inst)) {
3670
133
  case ARM_VLD2DUPd16:
3671
204
  case ARM_VLD2DUPd32:
3672
432
  case ARM_VLD2DUPd8:
3673
658
  case ARM_VLD2DUPd16wb_fixed:
3674
841
  case ARM_VLD2DUPd16wb_register:
3675
1.01k
  case ARM_VLD2DUPd32wb_fixed:
3676
1.23k
  case ARM_VLD2DUPd32wb_register:
3677
1.45k
  case ARM_VLD2DUPd8wb_fixed:
3678
2.06k
  case ARM_VLD2DUPd8wb_register:
3679
2.06k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
3680
2.06k
              Decoder)))
3681
3
      return MCDisassembler_Fail;
3682
2.05k
    break;
3683
2.05k
  case ARM_VLD2DUPd16x2:
3684
713
  case ARM_VLD2DUPd32x2:
3685
960
  case ARM_VLD2DUPd8x2:
3686
1.19k
  case ARM_VLD2DUPd16x2wb_fixed:
3687
1.29k
  case ARM_VLD2DUPd16x2wb_register:
3688
1.75k
  case ARM_VLD2DUPd32x2wb_fixed:
3689
1.95k
  case ARM_VLD2DUPd32x2wb_register:
3690
2.24k
  case ARM_VLD2DUPd8x2wb_fixed:
3691
2.66k
  case ARM_VLD2DUPd8x2wb_register:
3692
2.66k
    if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address,
3693
2.66k
                    Decoder)))
3694
2
      return MCDisassembler_Fail;
3695
2.65k
    break;
3696
2.65k
  default:
3697
0
    if (!Check(&S,
3698
0
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3699
0
      return MCDisassembler_Fail;
3700
0
    break;
3701
4.72k
  }
3702
3703
4.71k
  if (Rm != 0xF)
3704
3.32k
    MCOperand_CreateImm0(Inst, (0));
3705
3706
4.71k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3707
0
    return MCDisassembler_Fail;
3708
4.71k
  MCOperand_CreateImm0(Inst, (align));
3709
3710
4.71k
  if (Rm != 0xD && Rm != 0xF) {
3711
1.73k
    if (!Check(&S,
3712
1.73k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3713
0
      return MCDisassembler_Fail;
3714
1.73k
  }
3715
3716
4.71k
  return S;
3717
4.71k
}
3718
3719
static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Insn,
3720
               uint64_t Address,
3721
               const void *Decoder)
3722
1.09k
{
3723
1.09k
  DecodeStatus S = MCDisassembler_Success;
3724
3725
1.09k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3726
1.09k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3727
1.09k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3728
1.09k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3729
1.09k
  unsigned inc = fieldFromInstruction_4(Insn, 5, 1) + 1;
3730
3731
1.09k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3732
0
    return MCDisassembler_Fail;
3733
1.09k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + inc) % 32, Address,
3734
1.09k
                Decoder)))
3735
0
    return MCDisassembler_Fail;
3736
1.09k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2 * inc) % 32,
3737
1.09k
                Address, Decoder)))
3738
0
    return MCDisassembler_Fail;
3739
1.09k
  if (Rm != 0xF) {
3740
804
    if (!Check(&S,
3741
804
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3742
0
      return MCDisassembler_Fail;
3743
804
  }
3744
3745
1.09k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3746
0
    return MCDisassembler_Fail;
3747
1.09k
  MCOperand_CreateImm0(Inst, (0));
3748
3749
1.09k
  if (Rm == 0xD)
3750
454
    MCOperand_CreateReg0(Inst, (0));
3751
645
  else if (Rm != 0xF) {
3752
350
    if (!Check(&S,
3753
350
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3754
0
      return MCDisassembler_Fail;
3755
350
  }
3756
3757
1.09k
  return S;
3758
1.09k
}
3759
3760
static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Insn,
3761
               uint64_t Address,
3762
               const void *Decoder)
3763
1.61k
{
3764
1.61k
  DecodeStatus S = MCDisassembler_Success;
3765
3766
1.61k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3767
1.61k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3768
1.61k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3769
1.61k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3770
1.61k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3771
1.61k
  unsigned inc = fieldFromInstruction_4(Insn, 5, 1) + 1;
3772
1.61k
  unsigned align = fieldFromInstruction_4(Insn, 4, 1);
3773
3774
1.61k
  if (size == 0x3) {
3775
289
    if (align == 0)
3776
2
      return MCDisassembler_Fail;
3777
287
    align = 16;
3778
1.32k
  } else {
3779
1.32k
    if (size == 2) {
3780
558
      align *= 8;
3781
764
    } else {
3782
764
      size = 1 << size;
3783
764
      align *= 4 * size;
3784
764
    }
3785
1.32k
  }
3786
3787
1.60k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3788
0
    return MCDisassembler_Fail;
3789
1.60k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + inc) % 32, Address,
3790
1.60k
                Decoder)))
3791
0
    return MCDisassembler_Fail;
3792
1.60k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2 * inc) % 32,
3793
1.60k
                Address, Decoder)))
3794
0
    return MCDisassembler_Fail;
3795
1.60k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3 * inc) % 32,
3796
1.60k
                Address, Decoder)))
3797
0
    return MCDisassembler_Fail;
3798
1.60k
  if (Rm != 0xF) {
3799
1.06k
    if (!Check(&S,
3800
1.06k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3801
0
      return MCDisassembler_Fail;
3802
1.06k
  }
3803
3804
1.60k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3805
0
    return MCDisassembler_Fail;
3806
1.60k
  MCOperand_CreateImm0(Inst, (align));
3807
3808
1.60k
  if (Rm == 0xD)
3809
223
    MCOperand_CreateReg0(Inst, (0));
3810
1.38k
  else if (Rm != 0xF) {
3811
838
    if (!Check(&S,
3812
838
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3813
0
      return MCDisassembler_Fail;
3814
838
  }
3815
3816
1.60k
  return S;
3817
1.60k
}
3818
3819
static DecodeStatus DecodeVMOVModImmInstruction(MCInst *Inst, unsigned Insn,
3820
            uint64_t Address,
3821
            const void *Decoder)
3822
1.93k
{
3823
1.93k
  DecodeStatus S = MCDisassembler_Success;
3824
3825
1.93k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3826
1.93k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3827
1.93k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 4);
3828
1.93k
  imm |= fieldFromInstruction_4(Insn, 16, 3) << 4;
3829
1.93k
  imm |= fieldFromInstruction_4(Insn, 24, 1) << 7;
3830
1.93k
  imm |= fieldFromInstruction_4(Insn, 8, 4) << 8;
3831
1.93k
  imm |= fieldFromInstruction_4(Insn, 5, 1) << 12;
3832
1.93k
  unsigned Q = fieldFromInstruction_4(Insn, 6, 1);
3833
3834
1.93k
  if (Q) {
3835
1.07k
    if (!Check(&S,
3836
1.07k
         DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3837
6
      return MCDisassembler_Fail;
3838
1.07k
  } else {
3839
866
    if (!Check(&S,
3840
866
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3841
0
      return MCDisassembler_Fail;
3842
866
  }
3843
3844
1.93k
  MCOperand_CreateImm0(Inst, (imm));
3845
3846
1.93k
  switch (MCInst_getOpcode(Inst)) {
3847
25
  case ARM_VORRiv4i16:
3848
123
  case ARM_VORRiv2i32:
3849
414
  case ARM_VBICiv4i16:
3850
476
  case ARM_VBICiv2i32:
3851
476
    if (!Check(&S,
3852
476
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3853
0
      return MCDisassembler_Fail;
3854
476
    break;
3855
476
  case ARM_VORRiv8i16:
3856
90
  case ARM_VORRiv4i32:
3857
136
  case ARM_VBICiv8i16:
3858
373
  case ARM_VBICiv4i32:
3859
373
    if (!Check(&S,
3860
373
         DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3861
0
      return MCDisassembler_Fail;
3862
373
    break;
3863
1.08k
  default:
3864
1.08k
    break;
3865
1.93k
  }
3866
3867
1.93k
  return S;
3868
1.93k
}
3869
3870
static DecodeStatus DecodeMVEModImmInstruction(MCInst *Inst, unsigned Insn,
3871
                 uint64_t Address,
3872
                 const void *Decoder)
3873
943
{
3874
943
  DecodeStatus S = MCDisassembler_Success;
3875
3876
943
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
3877
943
           fieldFromInstruction_4(Insn, 13, 3));
3878
943
  unsigned cmode = fieldFromInstruction_4(Insn, 8, 4);
3879
943
  unsigned imm = fieldFromInstruction_4(Insn, 0, 4);
3880
943
  imm |= fieldFromInstruction_4(Insn, 16, 3) << 4;
3881
943
  imm |= fieldFromInstruction_4(Insn, 28, 1) << 7;
3882
943
  imm |= cmode << 8;
3883
943
  imm |= fieldFromInstruction_4(Insn, 5, 1) << 12;
3884
3885
943
  if (cmode == 0xF && MCInst_getOpcode(Inst) == ARM_MVE_VMVNimmi32)
3886
1
    return MCDisassembler_Fail;
3887
3888
942
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
3889
239
    return MCDisassembler_Fail;
3890
3891
703
  MCOperand_CreateImm0(Inst, (imm));
3892
3893
703
  MCOperand_CreateImm0(Inst, (ARMVCC_None));
3894
703
  MCOperand_CreateReg0(Inst, (0));
3895
703
  MCOperand_CreateImm0(Inst, (0));
3896
3897
703
  return S;
3898
942
}
3899
3900
static DecodeStatus DecodeMVEVADCInstruction(MCInst *Inst, unsigned Insn,
3901
               uint64_t Address,
3902
               const void *Decoder)
3903
1.10k
{
3904
1.10k
  DecodeStatus S = MCDisassembler_Success;
3905
3906
1.10k
  unsigned Qd = fieldFromInstruction_4(Insn, 13, 3);
3907
1.10k
  Qd |= fieldFromInstruction_4(Insn, 22, 1) << 3;
3908
1.10k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
3909
100
    return MCDisassembler_Fail;
3910
1.00k
  MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
3911
3912
1.00k
  unsigned Qn = fieldFromInstruction_4(Insn, 17, 3);
3913
1.00k
  Qn |= fieldFromInstruction_4(Insn, 7, 1) << 3;
3914
1.00k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, Decoder)))
3915
90
    return MCDisassembler_Fail;
3916
911
  unsigned Qm = fieldFromInstruction_4(Insn, 1, 3);
3917
911
  Qm |= fieldFromInstruction_4(Insn, 5, 1) << 3;
3918
911
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
3919
139
    return MCDisassembler_Fail;
3920
772
  if (!fieldFromInstruction_4(Insn, 12,
3921
772
            1)) // I bit clear => need input FPSCR
3922
230
    MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
3923
772
  MCOperand_CreateImm0(Inst, (Qd));
3924
3925
772
  return S;
3926
911
}
3927
3928
static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Insn,
3929
               uint64_t Address,
3930
               const void *Decoder)
3931
114
{
3932
114
  DecodeStatus S = MCDisassembler_Success;
3933
3934
114
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3935
114
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3936
114
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3937
114
  Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4;
3938
114
  unsigned size = fieldFromInstruction_4(Insn, 18, 2);
3939
3940
114
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3941
3
    return MCDisassembler_Fail;
3942
111
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3943
0
    return MCDisassembler_Fail;
3944
111
  MCOperand_CreateImm0(Inst, (8 << size));
3945
3946
111
  return S;
3947
111
}
3948
3949
static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val,
3950
           uint64_t Address, const void *Decoder)
3951
1.68k
{
3952
1.68k
  MCOperand_CreateImm0(Inst, (8 - Val));
3953
1.68k
  return MCDisassembler_Success;
3954
1.68k
}
3955
3956
static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val,
3957
            uint64_t Address, const void *Decoder)
3958
1.92k
{
3959
1.92k
  MCOperand_CreateImm0(Inst, (16 - Val));
3960
1.92k
  return MCDisassembler_Success;
3961
1.92k
}
3962
3963
static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val,
3964
            uint64_t Address, const void *Decoder)
3965
3.59k
{
3966
3.59k
  MCOperand_CreateImm0(Inst, (32 - Val));
3967
3.59k
  return MCDisassembler_Success;
3968
3.59k
}
3969
3970
static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val,
3971
            uint64_t Address, const void *Decoder)
3972
1.42k
{
3973
1.42k
  MCOperand_CreateImm0(Inst, (64 - Val));
3974
1.42k
  return MCDisassembler_Success;
3975
1.42k
}
3976
3977
static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn,
3978
           uint64_t Address, const void *Decoder)
3979
2.37k
{
3980
2.37k
  DecodeStatus S = MCDisassembler_Success;
3981
3982
2.37k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3983
2.37k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3984
2.37k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3985
2.37k
  Rn |= fieldFromInstruction_4(Insn, 7, 1) << 4;
3986
2.37k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3987
2.37k
  Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4;
3988
2.37k
  unsigned op = fieldFromInstruction_4(Insn, 6, 1);
3989
3990
2.37k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3991
0
    return MCDisassembler_Fail;
3992
2.37k
  if (op) {
3993
954
    if (!Check(&S,
3994
954
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3995
0
      return MCDisassembler_Fail; // Writeback
3996
954
  }
3997
3998
2.37k
  switch (MCInst_getOpcode(Inst)) {
3999
507
  case ARM_VTBL2:
4000
630
  case ARM_VTBX2:
4001
630
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rn, Address,
4002
630
              Decoder)))
4003
2
      return MCDisassembler_Fail;
4004
628
    break;
4005
1.74k
  default:
4006
1.74k
    if (!Check(&S,
4007
1.74k
         DecodeDPRRegisterClass(Inst, Rn, Address, Decoder)))
4008
0
      return MCDisassembler_Fail;
4009
2.37k
  }
4010
4011
2.37k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
4012
0
    return MCDisassembler_Fail;
4013
4014
2.37k
  return S;
4015
2.37k
}
4016
4017
static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn,
4018
               uint64_t Address,
4019
               const void *Decoder)
4020
70.9k
{
4021
70.9k
  DecodeStatus S = MCDisassembler_Success;
4022
4023
70.9k
  unsigned dst = fieldFromInstruction_2(Insn, 8, 3);
4024
70.9k
  unsigned imm = fieldFromInstruction_2(Insn, 0, 8);
4025
4026
70.9k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
4027
0
    return MCDisassembler_Fail;
4028
4029
70.9k
  switch (MCInst_getOpcode(Inst)) {
4030
0
  default:
4031
0
    return MCDisassembler_Fail;
4032
35.8k
  case ARM_tADR:
4033
35.8k
    break; // tADR does not explicitly represent the PC as an operand.
4034
35.1k
  case ARM_tADDrSPi:
4035
35.1k
    MCOperand_CreateReg0(Inst, (ARM_SP));
4036
35.1k
    break;
4037
70.9k
  }
4038
4039
70.9k
  MCOperand_CreateImm0(Inst, (imm));
4040
70.9k
  return S;
4041
70.9k
}
4042
4043
static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val,
4044
           uint64_t Address, const void *Decoder)
4045
17.5k
{
4046
17.5k
  if (!tryAddingSymbolicOperand(
4047
17.5k
        Address, Address + SignExtend32((Val << 1), 12) + 4, true,
4048
17.5k
        2, Inst, Decoder))
4049
17.5k
    MCOperand_CreateImm0(Inst, (SignExtend32((Val << 1), 12)));
4050
17.5k
  return MCDisassembler_Success;
4051
17.5k
}
4052
4053
static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val,
4054
              uint64_t Address, const void *Decoder)
4055
1.77k
{
4056
1.77k
  if (!tryAddingSymbolicOperand(Address,
4057
1.77k
              Address + SignExtend32((Val), 21) + 4,
4058
1.77k
              true, 4, Inst, Decoder))
4059
1.77k
    MCOperand_CreateImm0(Inst, (SignExtend32((Val), 21)));
4060
1.77k
  return MCDisassembler_Success;
4061
1.77k
}
4062
4063
static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val,
4064
              uint64_t Address,
4065
              const void *Decoder)
4066
6.72k
{
4067
6.72k
  if (!tryAddingSymbolicOperand(Address, Address + (Val << 1) + 4, true,
4068
6.72k
              2, Inst, Decoder))
4069
6.72k
    MCOperand_CreateImm0(Inst, (Val << 1));
4070
6.72k
  return MCDisassembler_Success;
4071
6.72k
}
4072
4073
static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val,
4074
            uint64_t Address, const void *Decoder)
4075
51.7k
{
4076
51.7k
  DecodeStatus S = MCDisassembler_Success;
4077
4078
51.7k
  unsigned Rn = fieldFromInstruction_4(Val, 0, 3);
4079
51.7k
  unsigned Rm = fieldFromInstruction_4(Val, 3, 3);
4080
4081
51.7k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
4082
0
    return MCDisassembler_Fail;
4083
51.7k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
4084
0
    return MCDisassembler_Fail;
4085
4086
51.7k
  return S;
4087
51.7k
}
4088
4089
static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val,
4090
            uint64_t Address, const void *Decoder)
4091
293k
{
4092
293k
  DecodeStatus S = MCDisassembler_Success;
4093
4094
293k
  unsigned Rn = fieldFromInstruction_4(Val, 0, 3);
4095
293k
  unsigned imm = fieldFromInstruction_4(Val, 3, 5);
4096
4097
293k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
4098
0
    return MCDisassembler_Fail;
4099
293k
  MCOperand_CreateImm0(Inst, (imm));
4100
4101
293k
  return S;
4102
293k
}
4103
4104
static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val,
4105
            uint64_t Address, const void *Decoder)
4106
33.9k
{
4107
33.9k
  unsigned imm = Val << 2;
4108
4109
33.9k
  MCOperand_CreateImm0(Inst, (imm));
4110
33.9k
  tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4,
4111
33.9k
          Decoder);
4112
4113
33.9k
  return MCDisassembler_Success;
4114
33.9k
}
4115
4116
static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val,
4117
            uint64_t Address, const void *Decoder)
4118
43.8k
{
4119
43.8k
  MCOperand_CreateReg0(Inst, (ARM_SP));
4120
43.8k
  MCOperand_CreateImm0(Inst, (Val));
4121
4122
43.8k
  return MCDisassembler_Success;
4123
43.8k
}
4124
4125
static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val,
4126
            uint64_t Address, const void *Decoder)
4127
881
{
4128
881
  DecodeStatus S = MCDisassembler_Success;
4129
4130
881
  unsigned Rn = fieldFromInstruction_4(Val, 6, 4);
4131
881
  unsigned Rm = fieldFromInstruction_4(Val, 2, 4);
4132
881
  unsigned imm = fieldFromInstruction_4(Val, 0, 2);
4133
4134
  // Thumb stores cannot use PC as dest register.
4135
881
  switch (MCInst_getOpcode(Inst)) {
4136
118
  case ARM_t2STRHs:
4137
206
  case ARM_t2STRBs:
4138
425
  case ARM_t2STRs:
4139
425
    if (Rn == 15)
4140
3
      return MCDisassembler_Fail;
4141
422
    break;
4142
456
  default:
4143
456
    break;
4144
881
  }
4145
4146
878
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4147
0
    return MCDisassembler_Fail;
4148
878
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
4149
0
    return MCDisassembler_Fail;
4150
878
  MCOperand_CreateImm0(Inst, (imm));
4151
4152
878
  return S;
4153
878
}
4154
4155
static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Insn,
4156
              uint64_t Address, const void *Decoder)
4157
1.02k
{
4158
1.02k
  DecodeStatus S = MCDisassembler_Success;
4159
4160
1.02k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4161
1.02k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4162
4163
1.02k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
4164
1.02k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4165
4166
1.02k
  if (Rn == 15) {
4167
571
    switch (MCInst_getOpcode(Inst)) {
4168
90
    case ARM_t2LDRBs:
4169
90
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4170
90
      break;
4171
35
    case ARM_t2LDRHs:
4172
35
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4173
35
      break;
4174
54
    case ARM_t2LDRSHs:
4175
54
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4176
54
      break;
4177
257
    case ARM_t2LDRSBs:
4178
257
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4179
257
      break;
4180
42
    case ARM_t2LDRs:
4181
42
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4182
42
      break;
4183
82
    case ARM_t2PLDs:
4184
82
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4185
82
      break;
4186
10
    case ARM_t2PLIs:
4187
10
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4188
10
      break;
4189
1
    default:
4190
1
      return MCDisassembler_Fail;
4191
571
    }
4192
4193
570
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4194
571
  }
4195
4196
457
  if (Rt == 15) {
4197
330
    switch (MCInst_getOpcode(Inst)) {
4198
1
    case ARM_t2LDRSHs:
4199
1
      return MCDisassembler_Fail;
4200
0
    case ARM_t2LDRHs:
4201
0
      MCInst_setOpcode(Inst, (ARM_t2PLDWs));
4202
0
      break;
4203
0
    case ARM_t2LDRSBs:
4204
0
      MCInst_setOpcode(Inst, (ARM_t2PLIs));
4205
0
      break;
4206
329
    default:
4207
329
      break;
4208
330
    }
4209
330
  }
4210
4211
456
  switch (MCInst_getOpcode(Inst)) {
4212
215
  case ARM_t2PLDs:
4213
215
    break;
4214
41
  case ARM_t2PLIs:
4215
41
    if (!hasV7Ops)
4216
0
      return MCDisassembler_Fail;
4217
41
    break;
4218
41
  case ARM_t2PLDWs:
4219
36
    if (!hasV7Ops || !hasMP)
4220
0
      return MCDisassembler_Fail;
4221
36
    break;
4222
164
  default:
4223
164
    if (!Check(&S,
4224
164
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4225
0
      return MCDisassembler_Fail;
4226
456
  }
4227
4228
456
  unsigned addrmode = fieldFromInstruction_4(Insn, 4, 2);
4229
456
  addrmode |= fieldFromInstruction_4(Insn, 0, 4) << 2;
4230
456
  addrmode |= fieldFromInstruction_4(Insn, 16, 4) << 6;
4231
456
  if (!Check(&S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
4232
0
    return MCDisassembler_Fail;
4233
4234
456
  return S;
4235
456
}
4236
4237
static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn,
4238
             uint64_t Address, const void *Decoder)
4239
2.91k
{
4240
2.91k
  DecodeStatus S = MCDisassembler_Success;
4241
4242
2.91k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4243
2.91k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4244
2.91k
  unsigned U = fieldFromInstruction_4(Insn, 9, 1);
4245
2.91k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
4246
2.91k
  imm |= (U << 8);
4247
2.91k
  imm |= (Rn << 9);
4248
2.91k
  unsigned add = fieldFromInstruction_4(Insn, 9, 1);
4249
4250
2.91k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
4251
2.91k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4252
4253
2.91k
  if (Rn == 15) {
4254
1.79k
    switch (MCInst_getOpcode(Inst)) {
4255
85
    case ARM_t2LDRi8:
4256
85
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4257
85
      break;
4258
367
    case ARM_t2LDRBi8:
4259
367
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4260
367
      break;
4261
170
    case ARM_t2LDRSBi8:
4262
170
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4263
170
      break;
4264
182
    case ARM_t2LDRHi8:
4265
182
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4266
182
      break;
4267
117
    case ARM_t2LDRSHi8:
4268
117
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4269
117
      break;
4270
626
    case ARM_t2PLDi8:
4271
626
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4272
626
      break;
4273
242
    case ARM_t2PLIi8:
4274
242
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4275
242
      break;
4276
2
    default:
4277
2
      return MCDisassembler_Fail;
4278
1.79k
    }
4279
1.78k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4280
1.79k
  }
4281
4282
1.11k
  if (Rt == 15) {
4283
614
    switch (MCInst_getOpcode(Inst)) {
4284
2
    case ARM_t2LDRSHi8:
4285
2
      return MCDisassembler_Fail;
4286
0
    case ARM_t2LDRHi8:
4287
0
      if (!add)
4288
0
        MCInst_setOpcode(Inst, (ARM_t2PLDWi8));
4289
0
      break;
4290
0
    case ARM_t2LDRSBi8:
4291
0
      MCInst_setOpcode(Inst, (ARM_t2PLIi8));
4292
0
      break;
4293
612
    default:
4294
612
      break;
4295
614
    }
4296
614
  }
4297
4298
1.11k
  switch (MCInst_getOpcode(Inst)) {
4299
256
  case ARM_t2PLDi8:
4300
256
    break;
4301
196
  case ARM_t2PLIi8:
4302
196
    if (!hasV7Ops)
4303
0
      return MCDisassembler_Fail;
4304
196
    break;
4305
196
  case ARM_t2PLDWi8:
4306
159
    if (!hasV7Ops || !hasMP)
4307
0
      return MCDisassembler_Fail;
4308
159
    break;
4309
506
  default:
4310
506
    if (!Check(&S,
4311
506
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4312
0
      return MCDisassembler_Fail;
4313
1.11k
  }
4314
4315
1.11k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
4316
0
    return MCDisassembler_Fail;
4317
1.11k
  return S;
4318
1.11k
}
4319
4320
static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn,
4321
              uint64_t Address, const void *Decoder)
4322
4.11k
{
4323
4.11k
  DecodeStatus S = MCDisassembler_Success;
4324
4325
4.11k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4326
4.11k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4327
4.11k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
4328
4.11k
  imm |= (Rn << 13);
4329
4330
4.11k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
4331
4.11k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4332
4333
4.11k
  if (Rn == 15) {
4334
2.24k
    switch (MCInst_getOpcode(Inst)) {
4335
256
    case ARM_t2LDRi12:
4336
256
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4337
256
      break;
4338
168
    case ARM_t2LDRHi12:
4339
168
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4340
168
      break;
4341
450
    case ARM_t2LDRSHi12:
4342
450
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4343
450
      break;
4344
317
    case ARM_t2LDRBi12:
4345
317
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4346
317
      break;
4347
597
    case ARM_t2LDRSBi12:
4348
597
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4349
597
      break;
4350
82
    case ARM_t2PLDi12:
4351
82
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4352
82
      break;
4353
376
    case ARM_t2PLIi12:
4354
376
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4355
376
      break;
4356
2
    default:
4357
2
      return MCDisassembler_Fail;
4358
2.24k
    }
4359
2.24k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4360
2.24k
  }
4361
4362
1.86k
  if (Rt == 15) {
4363
648
    switch (MCInst_getOpcode(Inst)) {
4364
2
    case ARM_t2LDRSHi12:
4365
2
      return MCDisassembler_Fail;
4366
0
    case ARM_t2LDRHi12:
4367
0
      MCInst_setOpcode(Inst, (ARM_t2PLDWi12));
4368
0
      break;
4369
0
    case ARM_t2LDRSBi12:
4370
0
      MCInst_setOpcode(Inst, (ARM_t2PLIi12));
4371
0
      break;
4372
646
    default:
4373
646
      break;
4374
648
    }
4375
648
  }
4376
4377
1.86k
  switch (MCInst_getOpcode(Inst)) {
4378
374
  case ARM_t2PLDi12:
4379
374
    break;
4380
118
  case ARM_t2PLIi12:
4381
118
    if (!hasV7Ops)
4382
0
      return MCDisassembler_Fail;
4383
118
    break;
4384
137
  case ARM_t2PLDWi12:
4385
137
    if (!hasV7Ops || !hasMP)
4386
0
      return MCDisassembler_Fail;
4387
137
    break;
4388
1.23k
  default:
4389
1.23k
    if (!Check(&S,
4390
1.23k
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4391
0
      return MCDisassembler_Fail;
4392
1.86k
  }
4393
4394
1.86k
  if (!Check(&S, DecodeT2AddrModeImm12(Inst, imm, Address, Decoder)))
4395
0
    return MCDisassembler_Fail;
4396
1.86k
  return S;
4397
1.86k
}
4398
4399
static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn, uint64_t Address,
4400
          const void *Decoder)
4401
3.38k
{
4402
3.38k
  DecodeStatus S = MCDisassembler_Success;
4403
4404
3.38k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4405
3.38k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4406
3.38k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
4407
3.38k
  imm |= (Rn << 9);
4408
4409
3.38k
  if (Rn == 15) {
4410
1.50k
    switch (MCInst_getOpcode(Inst)) {
4411
294
    case ARM_t2LDRT:
4412
294
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4413
294
      break;
4414
398
    case ARM_t2LDRBT:
4415
398
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4416
398
      break;
4417
244
    case ARM_t2LDRHT:
4418
244
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4419
244
      break;
4420
377
    case ARM_t2LDRSBT:
4421
377
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4422
377
      break;
4423
192
    case ARM_t2LDRSHT:
4424
192
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4425
192
      break;
4426
0
    default:
4427
0
      return MCDisassembler_Fail;
4428
1.50k
    }
4429
1.50k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4430
1.50k
  }
4431
4432
1.87k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
4433
0
    return MCDisassembler_Fail;
4434
1.87k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
4435
0
    return MCDisassembler_Fail;
4436
1.87k
  return S;
4437
1.87k
}
4438
4439
static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn,
4440
              uint64_t Address, const void *Decoder)
4441
11.2k
{
4442
11.2k
  DecodeStatus S = MCDisassembler_Success;
4443
4444
11.2k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4445
11.2k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
4446
11.2k
  int imm = fieldFromInstruction_4(Insn, 0, 12);
4447
4448
11.2k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4449
4450
11.2k
  if (Rt == 15) {
4451
3.50k
    switch (MCInst_getOpcode(Inst)) {
4452
420
    case ARM_t2LDRBpci:
4453
779
    case ARM_t2LDRHpci:
4454
779
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4455
779
      break;
4456
361
    case ARM_t2LDRSBpci:
4457
361
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4458
361
      break;
4459
10
    case ARM_t2LDRSHpci:
4460
10
      return MCDisassembler_Fail;
4461
2.35k
    default:
4462
2.35k
      break;
4463
3.50k
    }
4464
3.50k
  }
4465
4466
11.2k
  switch (MCInst_getOpcode(Inst)) {
4467
1.80k
  case ARM_t2PLDpci:
4468
1.80k
    break;
4469
1.62k
  case ARM_t2PLIpci:
4470
1.62k
    if (!hasV7Ops)
4471
0
      return MCDisassembler_Fail;
4472
1.62k
    break;
4473
7.82k
  default:
4474
7.82k
    if (!Check(&S,
4475
7.82k
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4476
0
      return MCDisassembler_Fail;
4477
11.2k
  }
4478
4479
11.2k
  if (!U) {
4480
    // Special case for #-0.
4481
8.99k
    if (imm == 0)
4482
342
      imm = INT32_MIN;
4483
8.65k
    else
4484
8.65k
      imm = -imm;
4485
8.99k
  }
4486
11.2k
  MCOperand_CreateImm0(Inst, (imm));
4487
4488
11.2k
  return S;
4489
11.2k
}
4490
4491
static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val, uint64_t Address,
4492
           const void *Decoder)
4493
19.2k
{
4494
19.2k
  if (Val == 0)
4495
1.68k
    MCOperand_CreateImm0(Inst, (INT32_MIN));
4496
17.5k
  else {
4497
17.5k
    int imm = Val & 0xFF;
4498
4499
17.5k
    if (!(Val & 0x100))
4500
3.91k
      imm *= -1;
4501
17.5k
    MCOperand_CreateImm0(Inst, (imm * 4));
4502
17.5k
  }
4503
4504
19.2k
  return MCDisassembler_Success;
4505
19.2k
}
4506
4507
static DecodeStatus DecodeT2Imm7S4(MCInst *Inst, unsigned Val, uint64_t Address,
4508
           const void *Decoder)
4509
1.74k
{
4510
1.74k
  if (Val == 0)
4511
83
    MCOperand_CreateImm0(Inst, (INT32_MIN));
4512
1.66k
  else {
4513
1.66k
    int imm = Val & 0x7F;
4514
4515
1.66k
    if (!(Val & 0x80))
4516
745
      imm *= -1;
4517
1.66k
    MCOperand_CreateImm0(Inst, (imm * 4));
4518
1.66k
  }
4519
4520
1.74k
  return MCDisassembler_Success;
4521
1.74k
}
4522
4523
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val,
4524
             uint64_t Address,
4525
             const void *Decoder)
4526
15.3k
{
4527
15.3k
  DecodeStatus S = MCDisassembler_Success;
4528
4529
15.3k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
4530
15.3k
  unsigned imm = fieldFromInstruction_4(Val, 0, 9);
4531
4532
15.3k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4533
0
    return MCDisassembler_Fail;
4534
15.3k
  if (!Check(&S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
4535
0
    return MCDisassembler_Fail;
4536
4537
15.3k
  return S;
4538
15.3k
}
4539
4540
static DecodeStatus DecodeT2AddrModeImm7s4(MCInst *Inst, unsigned Val,
4541
             uint64_t Address,
4542
             const void *Decoder)
4543
1.74k
{
4544
1.74k
  DecodeStatus S = MCDisassembler_Success;
4545
4546
1.74k
  unsigned Rn = fieldFromInstruction_4(Val, 8, 4);
4547
1.74k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
4548
4549
1.74k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4550
0
    return MCDisassembler_Fail;
4551
1.74k
  if (!Check(&S, DecodeT2Imm7S4(Inst, imm, Address, Decoder)))
4552
0
    return MCDisassembler_Fail;
4553
4554
1.74k
  return S;
4555
1.74k
}
4556
4557
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst, unsigned Val,
4558
            uint64_t Address,
4559
            const void *Decoder)
4560
2.85k
{
4561
2.85k
  DecodeStatus S = MCDisassembler_Success;
4562
4563
2.85k
  unsigned Rn = fieldFromInstruction_4(Val, 8, 4);
4564
2.85k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
4565
4566
2.85k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4567
0
    return MCDisassembler_Fail;
4568
4569
2.85k
  MCOperand_CreateImm0(Inst, (imm));
4570
4571
2.85k
  return S;
4572
2.85k
}
4573
4574
static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val, uint64_t Address,
4575
         const void *Decoder)
4576
9.14k
{
4577
9.14k
  int imm = Val & 0xFF;
4578
9.14k
  if (Val == 0)
4579
370
    imm = INT32_MIN;
4580
8.77k
  else if (!(Val & 0x100))
4581
4.15k
    imm *= -1;
4582
9.14k
  MCOperand_CreateImm0(Inst, (imm));
4583
4584
9.14k
  return MCDisassembler_Success;
4585
9.14k
}
4586
4587
#define DEFINE_DecodeT2Imm7(shift) \
4588
  static DecodeStatus CONCAT(DecodeT2Imm7, shift)(MCInst * Inst, \
4589
              unsigned Val, \
4590
              uint64_t Address, \
4591
              const void *Decoder) \
4592
9.36k
  { \
4593
9.36k
    int imm = Val & 0x7F; \
4594
9.36k
    if (Val == 0) \
4595
9.36k
      imm = INT32_MIN; \
4596
9.36k
    else if (!(Val & 0x80)) \
4597
4.87k
      imm *= -1; \
4598
9.36k
    if (imm != INT32_MIN) \
4599
9.36k
      imm *= (1U << shift); \
4600
9.36k
    MCOperand_CreateImm0(Inst, (imm)); \
4601
9.36k
\
4602
9.36k
    return MCDisassembler_Success; \
4603
9.36k
  }
ARMDisassembler.c:DecodeT2Imm7_0
Line
Count
Source
4592
3.91k
  { \
4593
3.91k
    int imm = Val & 0x7F; \
4594
3.91k
    if (Val == 0) \
4595
3.91k
      imm = INT32_MIN; \
4596
3.91k
    else if (!(Val & 0x80)) \
4597
2.20k
      imm *= -1; \
4598
3.91k
    if (imm != INT32_MIN) \
4599
3.91k
      imm *= (1U << shift); \
4600
3.91k
    MCOperand_CreateImm0(Inst, (imm)); \
4601
3.91k
\
4602
3.91k
    return MCDisassembler_Success; \
4603
3.91k
  }
ARMDisassembler.c:DecodeT2Imm7_1
Line
Count
Source
4592
3.23k
  { \
4593
3.23k
    int imm = Val & 0x7F; \
4594
3.23k
    if (Val == 0) \
4595
3.23k
      imm = INT32_MIN; \
4596
3.23k
    else if (!(Val & 0x80)) \
4597
1.79k
      imm *= -1; \
4598
3.23k
    if (imm != INT32_MIN) \
4599
3.23k
      imm *= (1U << shift); \
4600
3.23k
    MCOperand_CreateImm0(Inst, (imm)); \
4601
3.23k
\
4602
3.23k
    return MCDisassembler_Success; \
4603
3.23k
  }
ARMDisassembler.c:DecodeT2Imm7_2
Line
Count
Source
4592
2.21k
  { \
4593
2.21k
    int imm = Val & 0x7F; \
4594
2.21k
    if (Val == 0) \
4595
2.21k
      imm = INT32_MIN; \
4596
2.21k
    else if (!(Val & 0x80)) \
4597
883
      imm *= -1; \
4598
2.21k
    if (imm != INT32_MIN) \
4599
2.21k
      imm *= (1U << shift); \
4600
2.21k
    MCOperand_CreateImm0(Inst, (imm)); \
4601
2.21k
\
4602
2.21k
    return MCDisassembler_Success; \
4603
2.21k
  }
4604
DEFINE_DecodeT2Imm7(0) DEFINE_DecodeT2Imm7(1) DEFINE_DecodeT2Imm7(2)
4605
4606
  static DecodeStatus
4607
  DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val, uint64_t Address,
4608
           const void *Decoder)
4609
9.14k
{
4610
9.14k
  DecodeStatus S = MCDisassembler_Success;
4611
4612
9.14k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
4613
9.14k
  unsigned imm = fieldFromInstruction_4(Val, 0, 9);
4614
4615
  // Thumb stores cannot use PC as dest register.
4616
9.14k
  switch (MCInst_getOpcode(Inst)) {
4617
247
  case ARM_t2STRT:
4618
476
  case ARM_t2STRBT:
4619
720
  case ARM_t2STRHT:
4620
2.00k
  case ARM_t2STRi8:
4621
2.31k
  case ARM_t2STRHi8:
4622
2.65k
  case ARM_t2STRBi8:
4623
2.65k
    if (Rn == 15)
4624
8
      return MCDisassembler_Fail;
4625
2.64k
    break;
4626
6.49k
  default:
4627
6.49k
    break;
4628
9.14k
  }
4629
4630
  // Some instructions always use an additive offset.
4631
9.14k
  switch (MCInst_getOpcode(Inst)) {
4632
136
  case ARM_t2LDRT:
4633
401
  case ARM_t2LDRBT:
4634
609
  case ARM_t2LDRHT:
4635
1.48k
  case ARM_t2LDRSBT:
4636
1.87k
  case ARM_t2LDRSHT:
4637
2.12k
  case ARM_t2STRT:
4638
2.35k
  case ARM_t2STRBT:
4639
2.59k
  case ARM_t2STRHT:
4640
2.59k
    imm |= 0x100;
4641
2.59k
    break;
4642
6.54k
  default:
4643
6.54k
    break;
4644
9.14k
  }
4645
4646
9.14k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4647
0
    return MCDisassembler_Fail;
4648
9.14k
  if (!Check(&S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
4649
0
    return MCDisassembler_Fail;
4650
4651
9.14k
  return S;
4652
9.14k
}
4653
4654
#define DEFINE_DecodeTAddrModeImm7(shift) \
4655
  static DecodeStatus CONCAT(DecodeTAddrModeImm7, shift)( \
4656
    MCInst * Inst, unsigned Val, uint64_t Address, \
4657
    const void *Decoder) \
4658
1.89k
  { \
4659
1.89k
    DecodeStatus S = MCDisassembler_Success; \
4660
1.89k
\
4661
1.89k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 3); \
4662
1.89k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4663
1.89k
\
4664
1.89k
    if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, \
4665
1.89k
                   Decoder))) \
4666
1.89k
      return MCDisassembler_Fail; \
4667
1.89k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4668
1.89k
                 Decoder))) \
4669
1.89k
      return MCDisassembler_Fail; \
4670
1.89k
\
4671
1.89k
    return S; \
4672
1.89k
  }
ARMDisassembler.c:DecodeTAddrModeImm7_0
Line
Count
Source
4658
738
  { \
4659
738
    DecodeStatus S = MCDisassembler_Success; \
4660
738
\
4661
738
    unsigned Rn = fieldFromInstruction_4(Val, 8, 3); \
4662
738
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4663
738
\
4664
738
    if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, \
4665
738
                   Decoder))) \
4666
738
      return MCDisassembler_Fail; \
4667
738
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4668
738
                 Decoder))) \
4669
738
      return MCDisassembler_Fail; \
4670
738
\
4671
738
    return S; \
4672
738
  }
ARMDisassembler.c:DecodeTAddrModeImm7_1
Line
Count
Source
4658
1.15k
  { \
4659
1.15k
    DecodeStatus S = MCDisassembler_Success; \
4660
1.15k
\
4661
1.15k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 3); \
4662
1.15k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4663
1.15k
\
4664
1.15k
    if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, \
4665
1.15k
                   Decoder))) \
4666
1.15k
      return MCDisassembler_Fail; \
4667
1.15k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4668
1.15k
                 Decoder))) \
4669
1.15k
      return MCDisassembler_Fail; \
4670
1.15k
\
4671
1.15k
    return S; \
4672
1.15k
  }
4673
DEFINE_DecodeTAddrModeImm7(0) DEFINE_DecodeTAddrModeImm7(1)
4674
4675
#define DEFINE_DecodeT2AddrModeImm7(shift, WriteBack) \
4676
  static DecodeStatus CONCAT(DecodeT2AddrModeImm7, \
4677
           CONCAT(shift, WriteBack))( \
4678
    MCInst * Inst, unsigned Val, uint64_t Address, \
4679
    const void *Decoder) \
4680
5.73k
  { \
4681
5.73k
    DecodeStatus S = MCDisassembler_Success; \
4682
5.73k
\
4683
5.73k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
5.73k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
5.73k
    if (WriteBack) { \
4686
3.16k
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
3.16k
                 Inst, Rn, Address, Decoder))) \
4688
3.16k
        return MCDisassembler_Fail; \
4689
3.16k
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
2.57k
                Inst, Rn, Address, Decoder))) \
4691
2.57k
      return MCDisassembler_Fail; \
4692
5.73k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
5.73k
                 Decoder))) \
4694
5.73k
      return MCDisassembler_Fail; \
4695
5.73k
\
4696
5.73k
    return S; \
4697
5.73k
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_0_0
Line
Count
Source
4680
1.20k
  { \
4681
1.20k
    DecodeStatus S = MCDisassembler_Success; \
4682
1.20k
\
4683
1.20k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
1.20k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
1.20k
    if (WriteBack) { \
4686
0
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
0
                 Inst, Rn, Address, Decoder))) \
4688
0
        return MCDisassembler_Fail; \
4689
1.20k
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
1.20k
                Inst, Rn, Address, Decoder))) \
4691
1.20k
      return MCDisassembler_Fail; \
4692
1.20k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
1.20k
                 Decoder))) \
4694
1.20k
      return MCDisassembler_Fail; \
4695
1.20k
\
4696
1.20k
    return S; \
4697
1.20k
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_1_0
Line
Count
Source
4680
504
  { \
4681
504
    DecodeStatus S = MCDisassembler_Success; \
4682
504
\
4683
504
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
504
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
504
    if (WriteBack) { \
4686
0
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
0
                 Inst, Rn, Address, Decoder))) \
4688
0
        return MCDisassembler_Fail; \
4689
504
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
504
                Inst, Rn, Address, Decoder))) \
4691
504
      return MCDisassembler_Fail; \
4692
504
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
504
                 Decoder))) \
4694
504
      return MCDisassembler_Fail; \
4695
504
\
4696
504
    return S; \
4697
504
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_0_1
Line
Count
Source
4680
785
  { \
4681
785
    DecodeStatus S = MCDisassembler_Success; \
4682
785
\
4683
785
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
785
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
785
    if (WriteBack) { \
4686
785
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
785
                 Inst, Rn, Address, Decoder))) \
4688
785
        return MCDisassembler_Fail; \
4689
785
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
0
                Inst, Rn, Address, Decoder))) \
4691
0
      return MCDisassembler_Fail; \
4692
785
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
785
                 Decoder))) \
4694
785
      return MCDisassembler_Fail; \
4695
785
\
4696
785
    return S; \
4697
785
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_1_1
Line
Count
Source
4680
1.28k
  { \
4681
1.28k
    DecodeStatus S = MCDisassembler_Success; \
4682
1.28k
\
4683
1.28k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
1.28k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
1.28k
    if (WriteBack) { \
4686
1.28k
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
1.28k
                 Inst, Rn, Address, Decoder))) \
4688
1.28k
        return MCDisassembler_Fail; \
4689
1.28k
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
0
                Inst, Rn, Address, Decoder))) \
4691
0
      return MCDisassembler_Fail; \
4692
1.28k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
1.28k
                 Decoder))) \
4694
1.28k
      return MCDisassembler_Fail; \
4695
1.28k
\
4696
1.28k
    return S; \
4697
1.28k
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_2_0
Line
Count
Source
4680
862
  { \
4681
862
    DecodeStatus S = MCDisassembler_Success; \
4682
862
\
4683
862
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
862
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
862
    if (WriteBack) { \
4686
0
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
0
                 Inst, Rn, Address, Decoder))) \
4688
0
        return MCDisassembler_Fail; \
4689
862
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
862
                Inst, Rn, Address, Decoder))) \
4691
862
      return MCDisassembler_Fail; \
4692
862
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
862
                 Decoder))) \
4694
862
      return MCDisassembler_Fail; \
4695
862
\
4696
862
    return S; \
4697
862
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_2_1
Line
Count
Source
4680
1.08k
  { \
4681
1.08k
    DecodeStatus S = MCDisassembler_Success; \
4682
1.08k
\
4683
1.08k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4684
1.08k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4685
1.08k
    if (WriteBack) { \
4686
1.08k
      if (!Check(&S, DecoderGPRRegisterClass( \
4687
1.08k
                 Inst, Rn, Address, Decoder))) \
4688
1.08k
        return MCDisassembler_Fail; \
4689
1.08k
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4690
0
                Inst, Rn, Address, Decoder))) \
4691
0
      return MCDisassembler_Fail; \
4692
1.08k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4693
1.08k
                 Decoder))) \
4694
1.08k
      return MCDisassembler_Fail; \
4695
1.08k
\
4696
1.08k
    return S; \
4697
1.08k
  }
4698
  DEFINE_DecodeT2AddrModeImm7(0, 0) DEFINE_DecodeT2AddrModeImm7(1, 0)
4699
    DEFINE_DecodeT2AddrModeImm7(2, 0)
4700
      DEFINE_DecodeT2AddrModeImm7(0, 1)
4701
        DEFINE_DecodeT2AddrModeImm7(1, 1)
4702
          DEFINE_DecodeT2AddrModeImm7(2, 1)
4703
4704
            static DecodeStatus
4705
  DecodeT2LdStPre(MCInst *Inst, unsigned Insn, uint64_t Address,
4706
      const void *Decoder)
4707
6.50k
{
4708
6.50k
  DecodeStatus S = MCDisassembler_Success;
4709
4710
6.50k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4711
6.50k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4712
6.50k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
4713
6.50k
  addr |= fieldFromInstruction_4(Insn, 9, 1) << 8;
4714
6.50k
  addr |= Rn << 9;
4715
6.50k
  unsigned load = fieldFromInstruction_4(Insn, 20, 1);
4716
4717
6.50k
  if (Rn == 15) {
4718
2.99k
    switch (MCInst_getOpcode(Inst)) {
4719
356
    case ARM_t2LDR_PRE:
4720
472
    case ARM_t2LDR_POST:
4721
472
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4722
472
      break;
4723
237
    case ARM_t2LDRB_PRE:
4724
504
    case ARM_t2LDRB_POST:
4725
504
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4726
504
      break;
4727
315
    case ARM_t2LDRH_PRE:
4728
642
    case ARM_t2LDRH_POST:
4729
642
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4730
642
      break;
4731
446
    case ARM_t2LDRSB_PRE:
4732
809
    case ARM_t2LDRSB_POST:
4733
809
      if (Rt == 15)
4734
586
        MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4735
223
      else
4736
223
        MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4737
809
      break;
4738
333
    case ARM_t2LDRSH_PRE:
4739
560
    case ARM_t2LDRSH_POST:
4740
560
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4741
560
      break;
4742
8
    default:
4743
8
      return MCDisassembler_Fail;
4744
2.99k
    }
4745
2.98k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4746
2.99k
  }
4747
4748
3.50k
  if (!load) {
4749
1.37k
    if (!Check(&S,
4750
1.37k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4751
0
      return MCDisassembler_Fail;
4752
1.37k
  }
4753
4754
3.50k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4755
0
    return MCDisassembler_Fail;
4756
4757
3.50k
  if (load) {
4758
2.12k
    if (!Check(&S,
4759
2.12k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4760
0
      return MCDisassembler_Fail;
4761
2.12k
  }
4762
4763
3.50k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder)))
4764
0
    return MCDisassembler_Fail;
4765
4766
3.50k
  return S;
4767
3.50k
}
4768
4769
static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val,
4770
            uint64_t Address, const void *Decoder)
4771
1.88k
{
4772
1.88k
  DecodeStatus S = MCDisassembler_Success;
4773
4774
1.88k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
4775
1.88k
  unsigned imm = fieldFromInstruction_4(Val, 0, 12);
4776
4777
  // Thumb stores cannot use PC as dest register.
4778
1.88k
  switch (MCInst_getOpcode(Inst)) {
4779
238
  case ARM_t2STRi12:
4780
654
  case ARM_t2STRBi12:
4781
1.26k
  case ARM_t2STRHi12:
4782
1.26k
    if (Rn == 15)
4783
5
      return MCDisassembler_Fail;
4784
1.26k
    break;
4785
1.26k
  default:
4786
617
    break;
4787
1.88k
  }
4788
4789
1.87k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4790
0
    return MCDisassembler_Fail;
4791
1.87k
  MCOperand_CreateImm0(Inst, (imm));
4792
4793
1.87k
  return S;
4794
1.87k
}
4795
4796
static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Insn,
4797
          uint64_t Address, const void *Decoder)
4798
5.16k
{
4799
5.16k
  unsigned imm = fieldFromInstruction_2(Insn, 0, 7);
4800
4801
5.16k
  MCOperand_CreateReg0(Inst, (ARM_SP));
4802
5.16k
  MCOperand_CreateReg0(Inst, (ARM_SP));
4803
5.16k
  MCOperand_CreateImm0(Inst, (imm));
4804
4805
5.16k
  return MCDisassembler_Success;
4806
5.16k
}
4807
4808
static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn,
4809
          uint64_t Address, const void *Decoder)
4810
2.20k
{
4811
2.20k
  DecodeStatus S = MCDisassembler_Success;
4812
4813
2.20k
  if (MCInst_getOpcode(Inst) == ARM_tADDrSP) {
4814
795
    unsigned Rdm = fieldFromInstruction_2(Insn, 0, 3);
4815
795
    Rdm |= fieldFromInstruction_2(Insn, 7, 1) << 3;
4816
4817
795
    if (!Check(&S,
4818
795
         DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
4819
0
      return MCDisassembler_Fail;
4820
795
    MCOperand_CreateReg0(Inst, (ARM_SP));
4821
795
    if (!Check(&S,
4822
795
         DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
4823
0
      return MCDisassembler_Fail;
4824
1.41k
  } else if (MCInst_getOpcode(Inst) == ARM_tADDspr) {
4825
1.41k
    unsigned Rm = fieldFromInstruction_2(Insn, 3, 4);
4826
4827
1.41k
    MCOperand_CreateReg0(Inst, (ARM_SP));
4828
1.41k
    MCOperand_CreateReg0(Inst, (ARM_SP));
4829
1.41k
    if (!Check(&S,
4830
1.41k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4831
0
      return MCDisassembler_Fail;
4832
1.41k
  }
4833
4834
2.20k
  return S;
4835
2.20k
}
4836
4837
static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn,
4838
           uint64_t Address, const void *Decoder)
4839
648
{
4840
648
  unsigned imod = fieldFromInstruction_2(Insn, 4, 1) | 0x2;
4841
648
  unsigned flags = fieldFromInstruction_2(Insn, 0, 3);
4842
4843
648
  MCOperand_CreateImm0(Inst, (imod));
4844
648
  MCOperand_CreateImm0(Inst, (flags));
4845
4846
648
  return MCDisassembler_Success;
4847
648
}
4848
4849
static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn,
4850
             uint64_t Address, const void *Decoder)
4851
4.17k
{
4852
4.17k
  DecodeStatus S = MCDisassembler_Success;
4853
4.17k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4854
4.17k
  unsigned add = fieldFromInstruction_4(Insn, 4, 1);
4855
4856
4.17k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
4857
0
    return MCDisassembler_Fail;
4858
4.17k
  MCOperand_CreateImm0(Inst, (add));
4859
4860
4.17k
  return S;
4861
4.17k
}
4862
4863
static DecodeStatus DecodeMveAddrModeRQ(MCInst *Inst, unsigned Insn,
4864
          uint64_t Address, const void *Decoder)
4865
667
{
4866
667
  DecodeStatus S = MCDisassembler_Success;
4867
667
  unsigned Rn = fieldFromInstruction_4(Insn, 3, 4);
4868
667
  unsigned Qm = fieldFromInstruction_4(Insn, 0, 3);
4869
4870
667
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4871
0
    return MCDisassembler_Fail;
4872
667
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
4873
0
    return MCDisassembler_Fail;
4874
4875
667
  return S;
4876
667
}
4877
4878
#define DEFINE_DecodeMveAddrModeQ(shift) \
4879
  static DecodeStatus CONCAT(DecodeMveAddrModeQ, shift)( \
4880
    MCInst * Inst, unsigned Insn, uint64_t Address, \
4881
    const void *Decoder) \
4882
1.05k
  { \
4883
1.05k
    DecodeStatus S = MCDisassembler_Success; \
4884
1.05k
    unsigned Qm = fieldFromInstruction_4(Insn, 8, 3); \
4885
1.05k
    int imm = fieldFromInstruction_4(Insn, 0, 7); \
4886
1.05k
\
4887
1.05k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, \
4888
1.05k
                   Decoder))) \
4889
1.05k
      return MCDisassembler_Fail; \
4890
1.05k
\
4891
1.05k
    if (!fieldFromInstruction_4(Insn, 7, 1)) { \
4892
820
      if (imm == 0) \
4893
820
        imm = INT32_MIN; \
4894
820
      else \
4895
820
        imm *= -1; \
4896
820
    } \
4897
1.05k
    if (imm != INT32_MIN) \
4898
1.05k
      imm *= (1U << shift); \
4899
1.05k
    MCOperand_CreateImm0(Inst, (imm)); \
4900
1.05k
\
4901
1.05k
    return S; \
4902
1.05k
  }
ARMDisassembler.c:DecodeMveAddrModeQ_2
Line
Count
Source
4882
587
  { \
4883
587
    DecodeStatus S = MCDisassembler_Success; \
4884
587
    unsigned Qm = fieldFromInstruction_4(Insn, 8, 3); \
4885
587
    int imm = fieldFromInstruction_4(Insn, 0, 7); \
4886
587
\
4887
587
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, \
4888
587
                   Decoder))) \
4889
587
      return MCDisassembler_Fail; \
4890
587
\
4891
587
    if (!fieldFromInstruction_4(Insn, 7, 1)) { \
4892
465
      if (imm == 0) \
4893
465
        imm = INT32_MIN; \
4894
465
      else \
4895
465
        imm *= -1; \
4896
465
    } \
4897
587
    if (imm != INT32_MIN) \
4898
587
      imm *= (1U << shift); \
4899
587
    MCOperand_CreateImm0(Inst, (imm)); \
4900
587
\
4901
587
    return S; \
4902
587
  }
ARMDisassembler.c:DecodeMveAddrModeQ_3
Line
Count
Source
4882
463
  { \
4883
463
    DecodeStatus S = MCDisassembler_Success; \
4884
463
    unsigned Qm = fieldFromInstruction_4(Insn, 8, 3); \
4885
463
    int imm = fieldFromInstruction_4(Insn, 0, 7); \
4886
463
\
4887
463
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, \
4888
463
                   Decoder))) \
4889
463
      return MCDisassembler_Fail; \
4890
463
\
4891
463
    if (!fieldFromInstruction_4(Insn, 7, 1)) { \
4892
355
      if (imm == 0) \
4893
355
        imm = INT32_MIN; \
4894
355
      else \
4895
355
        imm *= -1; \
4896
355
    } \
4897
463
    if (imm != INT32_MIN) \
4898
463
      imm *= (1U << shift); \
4899
463
    MCOperand_CreateImm0(Inst, (imm)); \
4900
463
\
4901
463
    return S; \
4902
463
  }
4903
DEFINE_DecodeMveAddrModeQ(2) DEFINE_DecodeMveAddrModeQ(3)
4904
4905
  static DecodeStatus
4906
  DecodeThumbBLXOffset(MCInst *Inst, unsigned Val, uint64_t Address,
4907
           const void *Decoder)
4908
576
{
4909
  // Val is passed in as S:J1:J2:imm10H:imm10L:'0'
4910
  // Note only one trailing zero not two.  Also the J1 and J2 values are from
4911
  // the encoded instruction.  So here change to I1 and I2 values via:
4912
  // I1 = NOT(J1 EOR S);
4913
  // I2 = NOT(J2 EOR S);
4914
  // and build the imm32 with two trailing zeros as documented:
4915
  // imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32);
4916
576
  unsigned S = (Val >> 23) & 1;
4917
576
  unsigned J1 = (Val >> 22) & 1;
4918
576
  unsigned J2 = (Val >> 21) & 1;
4919
576
  unsigned I1 = !(J1 ^ S);
4920
576
  unsigned I2 = !(J2 ^ S);
4921
576
  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4922
576
  int imm32 = SignExtend32((tmp << 1), 25);
4923
4924
576
  if (!tryAddingSymbolicOperand(Address, (Address & ~2u) + imm32 + 4,
4925
576
              true, 4, Inst, Decoder))
4926
576
    MCOperand_CreateImm0(Inst, (imm32));
4927
576
  return MCDisassembler_Success;
4928
576
}
4929
4930
static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Val,
4931
              uint64_t Address, const void *Decoder)
4932
36.1k
{
4933
36.1k
  if (Val == 0xA || Val == 0xB)
4934
199
    return MCDisassembler_Fail;
4935
4936
35.9k
  if (!isValidCoprocessorNumber(Inst, Val))
4937
23
    return MCDisassembler_Fail;
4938
4939
35.9k
  MCOperand_CreateImm0(Inst, (Val));
4940
35.9k
  return MCDisassembler_Success;
4941
35.9k
}
4942
4943
static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Insn,
4944
             uint64_t Address,
4945
             const void *Decoder)
4946
827
{
4947
827
  DecodeStatus S = MCDisassembler_Success;
4948
4949
827
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4950
827
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4951
4952
827
  if (Rn == 13 && !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops))
4953
279
    S = MCDisassembler_SoftFail;
4954
827
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4955
0
    return MCDisassembler_Fail;
4956
827
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
4957
0
    return MCDisassembler_Fail;
4958
827
  return S;
4959
827
}
4960
4961
static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Insn,
4962
                 uint64_t Address,
4963
                 const void *Decoder)
4964
5.72k
{
4965
5.72k
  DecodeStatus S = MCDisassembler_Success;
4966
4967
5.72k
  unsigned pred = fieldFromInstruction_4(Insn, 22, 4);
4968
5.72k
  if (pred == 0xE || pred == 0xF) {
4969
1.53k
    unsigned opc = fieldFromInstruction_4(Insn, 4, 28);
4970
1.53k
    switch (opc) {
4971
1.53k
    default:
4972
1.53k
      return MCDisassembler_Fail;
4973
0
    case 0xf3bf8f4:
4974
0
      MCInst_setOpcode(Inst, (ARM_t2DSB));
4975
0
      break;
4976
0
    case 0xf3bf8f5:
4977
0
      MCInst_setOpcode(Inst, (ARM_t2DMB));
4978
0
      break;
4979
0
    case 0xf3bf8f6:
4980
0
      MCInst_setOpcode(Inst, (ARM_t2ISB));
4981
0
      break;
4982
1.53k
    }
4983
4984
0
    unsigned imm = fieldFromInstruction_4(Insn, 0, 4);
4985
0
    return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
4986
1.53k
  }
4987
4988
4.19k
  unsigned brtarget = fieldFromInstruction_4(Insn, 0, 11) << 1;
4989
4.19k
  brtarget |= fieldFromInstruction_4(Insn, 11, 1) << 19;
4990
4.19k
  brtarget |= fieldFromInstruction_4(Insn, 13, 1) << 18;
4991
4.19k
  brtarget |= fieldFromInstruction_4(Insn, 16, 6) << 12;
4992
4.19k
  brtarget |= fieldFromInstruction_4(Insn, 26, 1) << 20;
4993
4994
4.19k
  if (!Check(&S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
4995
0
    return MCDisassembler_Fail;
4996
4.19k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4997
0
    return MCDisassembler_Fail;
4998
4999
4.19k
  return S;
5000
4.19k
}
5001
5002
// Decode a shifted immediate operand.  These basically consist
5003
// of an 8-bit value, and a 4-bit directive that specifies either
5004
// a splat operation or a rotation.
5005
static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val, uint64_t Address,
5006
          const void *Decoder)
5007
10.1k
{
5008
10.1k
  unsigned ctrl = fieldFromInstruction_4(Val, 10, 2);
5009
10.1k
  if (ctrl == 0) {
5010
6.18k
    unsigned byte = fieldFromInstruction_4(Val, 8, 2);
5011
6.18k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8);
5012
6.18k
    switch (byte) {
5013
2.57k
    case 0:
5014
2.57k
      MCOperand_CreateImm0(Inst, (imm));
5015
2.57k
      break;
5016
921
    case 1:
5017
921
      MCOperand_CreateImm0(Inst, ((imm << 16) | imm));
5018
921
      break;
5019
1.49k
    case 2:
5020
1.49k
      MCOperand_CreateImm0(Inst, ((imm << 24) | (imm << 8)));
5021
1.49k
      break;
5022
1.19k
    case 3:
5023
1.19k
      MCOperand_CreateImm0(Inst, ((imm << 24) | (imm << 16) |
5024
1.19k
                (imm << 8) | imm));
5025
1.19k
      break;
5026
6.18k
    }
5027
6.18k
  } else {
5028
3.99k
    unsigned unrot = fieldFromInstruction_4(Val, 0, 7) | 0x80;
5029
3.99k
    unsigned rot = fieldFromInstruction_4(Val, 7, 5);
5030
3.99k
    unsigned imm = (unrot >> rot) | (unrot << ((32 - rot) & 31));
5031
3.99k
    MCOperand_CreateImm0(Inst, (imm));
5032
3.99k
  }
5033
5034
10.1k
  return MCDisassembler_Success;
5035
10.1k
}
5036
5037
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst, unsigned Val,
5038
            uint64_t Address,
5039
            const void *Decoder)
5040
20.4k
{
5041
20.4k
  if (!tryAddingSymbolicOperand(Address,
5042
20.4k
              Address + SignExtend32((Val << 1), 9) + 4,
5043
20.4k
              true, 2, Inst, Decoder))
5044
20.4k
    MCOperand_CreateImm0(Inst, (SignExtend32((Val << 1), 9)));
5045
20.4k
  return MCDisassembler_Success;
5046
20.4k
}
5047
5048
static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val,
5049
                 uint64_t Address,
5050
                 const void *Decoder)
5051
3.09k
{
5052
  // Val is passed in as S:J1:J2:imm10:imm11
5053
  // Note no trailing zero after imm11.  Also the J1 and J2 values are from
5054
  // the encoded instruction.  So here change to I1 and I2 values via:
5055
  // I1 = NOT(J1 EOR S);
5056
  // I2 = NOT(J2 EOR S);
5057
  // and build the imm32 with one trailing zero as documented:
5058
  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
5059
3.09k
  unsigned S = (Val >> 23) & 1;
5060
3.09k
  unsigned J1 = (Val >> 22) & 1;
5061
3.09k
  unsigned J2 = (Val >> 21) & 1;
5062
3.09k
  unsigned I1 = !(J1 ^ S);
5063
3.09k
  unsigned I2 = !(J2 ^ S);
5064
3.09k
  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
5065
3.09k
  int imm32 = SignExtend32((tmp << 1), 25);
5066
5067
3.09k
  if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4, true, 4,
5068
3.09k
              Inst, Decoder))
5069
3.09k
    MCOperand_CreateImm0(Inst, (imm32));
5070
3.09k
  return MCDisassembler_Success;
5071
3.09k
}
5072
5073
static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Val,
5074
             uint64_t Address,
5075
             const void *Decoder)
5076
3.82k
{
5077
3.82k
  if (Val & ~0xf)
5078
0
    return MCDisassembler_Fail;
5079
5080
3.82k
  MCOperand_CreateImm0(Inst, (Val));
5081
3.82k
  return MCDisassembler_Success;
5082
3.82k
}
5083
5084
static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Val,
5085
            uint64_t Address,
5086
            const void *Decoder)
5087
232
{
5088
232
  if (Val & ~0xf)
5089
0
    return MCDisassembler_Fail;
5090
5091
232
  MCOperand_CreateImm0(Inst, (Val));
5092
232
  return MCDisassembler_Success;
5093
232
}
5094
5095
static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Val, uint64_t Address,
5096
          const void *Decoder)
5097
7.63k
{
5098
7.63k
  DecodeStatus S = MCDisassembler_Success;
5099
5100
7.63k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMClass)) {
5101
6.57k
    unsigned ValLow = Val & 0xff;
5102
5103
    // Validate the SYSm value first.
5104
6.57k
    switch (ValLow) {
5105
327
    case 0:  // apsr
5106
358
    case 1:  // iapsr
5107
607
    case 2:  // eapsr
5108
1.21k
    case 3:  // xpsr
5109
1.22k
    case 5:  // ipsr
5110
1.30k
    case 6:  // epsr
5111
1.32k
    case 7:  // iepsr
5112
1.39k
    case 8:  // msp
5113
1.62k
    case 9:  // psp
5114
1.76k
    case 16: // primask
5115
1.83k
    case 20: // control
5116
1.83k
      break;
5117
142
    case 17: // basepri
5118
241
    case 18: // basepri_max
5119
328
    case 19: // faultmask
5120
328
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5121
328
             ARM_HasV7Ops)))
5122
        // Values basepri, basepri_max and faultmask are only valid for
5123
        // v7m.
5124
0
        return MCDisassembler_Fail;
5125
328
      break;
5126
328
    case 0x8a: // msplim_ns
5127
89
    case 0x8b: // psplim_ns
5128
109
    case 0x91: // basepri_ns
5129
164
    case 0x93: // faultmask_ns
5130
164
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5131
164
             ARM_HasV8MMainlineOps)))
5132
0
        return MCDisassembler_Fail;
5133
      // fall through
5134
555
    case 10:   // msplim
5135
623
    case 11:   // psplim
5136
651
    case 0x88: // msp_ns
5137
690
    case 0x89: // psp_ns
5138
765
    case 0x90: // primask_ns
5139
785
    case 0x94: // control_ns
5140
861
    case 0x98: // sp_ns
5141
861
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5142
861
             ARM_Feature8MSecExt)))
5143
0
        return MCDisassembler_Fail;
5144
861
      break;
5145
861
    case 0x20: // pac_key_p_0
5146
152
    case 0x21: // pac_key_p_1
5147
232
    case 0x22: // pac_key_p_2
5148
343
    case 0x23: // pac_key_p_3
5149
377
    case 0x24: // pac_key_u_0
5150
1.50k
    case 0x25: // pac_key_u_1
5151
1.55k
    case 0x26: // pac_key_u_2
5152
1.56k
    case 0x27: // pac_key_u_3
5153
2.00k
    case 0xa0: // pac_key_p_0_ns
5154
2.19k
    case 0xa1: // pac_key_p_1_ns
5155
2.21k
    case 0xa2: // pac_key_p_2_ns
5156
2.35k
    case 0xa3: // pac_key_p_3_ns
5157
2.43k
    case 0xa4: // pac_key_u_0_ns
5158
2.45k
    case 0xa5: // pac_key_u_1_ns
5159
2.62k
    case 0xa6: // pac_key_u_2_ns
5160
2.76k
    case 0xa7: // pac_key_u_3_ns
5161
2.76k
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5162
2.76k
             ARM_FeaturePACBTI)))
5163
0
        return MCDisassembler_Fail;
5164
2.76k
      break;
5165
2.76k
    default:
5166
      // Architecturally defined as unpredictable
5167
789
      S = MCDisassembler_SoftFail;
5168
789
      break;
5169
6.57k
    }
5170
5171
6.57k
    if (MCInst_getOpcode(Inst) == ARM_t2MSR_M) {
5172
5.73k
      unsigned Mask = fieldFromInstruction_4(Val, 10, 2);
5173
5.73k
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5174
5.73k
             ARM_HasV7Ops))) {
5175
        // The ARMv6-M MSR bits {11-10} can be only 0b10, other values
5176
        // are unpredictable.
5177
0
        if (Mask != 2)
5178
0
          S = MCDisassembler_SoftFail;
5179
5.73k
      } else {
5180
        // The ARMv7-M architecture stores an additional 2-bit mask
5181
        // value in MSR bits {11-10}. The mask is used only with apsr,
5182
        // iapsr, eapsr and xpsr, it has to be 0b10 in other cases. Bit
5183
        // mask{1} indicates if the NZCVQ bits should be moved by the
5184
        // instruction. Bit mask{0} indicates the move for the GE{3:0}
5185
        // bits, the mask{0} bit can be set only if the processor
5186
        // includes the DSP extension.
5187
5.73k
        if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
5188
5.73k
            (!(ARM_getFeatureBits(Inst->csh->mode,
5189
1.66k
                ARM_FeatureDSP)) &&
5190
1.66k
             (Mask & 1)))
5191
4.06k
          S = MCDisassembler_SoftFail;
5192
5.73k
      }
5193
5.73k
    }
5194
6.57k
  } else {
5195
    // A/R class
5196
1.05k
    if (Val == 0)
5197
37
      return MCDisassembler_Fail;
5198
1.05k
  }
5199
7.59k
  MCOperand_CreateImm0(Inst, (Val));
5200
7.59k
  return S;
5201
7.63k
}
5202
5203
static DecodeStatus DecodeBankedReg(MCInst *Inst, unsigned Val,
5204
            uint64_t Address, const void *Decoder)
5205
1.35k
{
5206
1.35k
  unsigned R = fieldFromInstruction_4(Val, 5, 1);
5207
1.35k
  unsigned SysM = fieldFromInstruction_4(Val, 0, 5);
5208
5209
  // The table of encodings for these banked registers comes from B9.2.3 of
5210
  // the ARM ARM. There are patterns, but nothing regular enough to make this
5211
  // logic neater. So by fiat, these values are UNPREDICTABLE:
5212
1.35k
  if (!ARMBankedReg_lookupBankedRegByEncoding((R << 5) | SysM))
5213
165
    return MCDisassembler_Fail;
5214
5215
1.18k
  MCOperand_CreateImm0(Inst, (Val));
5216
1.18k
  return MCDisassembler_Success;
5217
1.35k
}
5218
5219
static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn,
5220
          uint64_t Address, const void *Decoder)
5221
591
{
5222
591
  DecodeStatus S = MCDisassembler_Success;
5223
5224
591
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5225
591
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5226
591
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5227
5228
591
  if (Rn == 0xF)
5229
464
    S = MCDisassembler_SoftFail;
5230
5231
591
  if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
5232
2
    return MCDisassembler_Fail;
5233
589
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5234
0
    return MCDisassembler_Fail;
5235
589
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5236
2
    return MCDisassembler_Fail;
5237
5238
587
  return S;
5239
589
}
5240
5241
static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn,
5242
           uint64_t Address, const void *Decoder)
5243
584
{
5244
584
  DecodeStatus S = MCDisassembler_Success;
5245
5246
584
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5247
584
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
5248
584
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5249
584
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5250
5251
584
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
5252
0
    return MCDisassembler_Fail;
5253
5254
584
  if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt + 1)
5255
439
    S = MCDisassembler_SoftFail;
5256
5257
584
  if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
5258
3
    return MCDisassembler_Fail;
5259
581
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5260
0
    return MCDisassembler_Fail;
5261
581
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5262
3
    return MCDisassembler_Fail;
5263
5264
578
  return S;
5265
581
}
5266
5267
static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn,
5268
            uint64_t Address, const void *Decoder)
5269
4.38k
{
5270
4.38k
  DecodeStatus S = MCDisassembler_Success;
5271
5272
4.38k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5273
4.38k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5274
4.38k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5275
4.38k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5276
4.38k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5277
4.38k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5278
5279
4.38k
  if (Rn == 0xF || Rn == Rt)
5280
1.10k
    S = MCDisassembler_SoftFail;
5281
5282
4.38k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5283
0
    return MCDisassembler_Fail;
5284
4.38k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5285
0
    return MCDisassembler_Fail;
5286
4.38k
  if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
5287
0
    return MCDisassembler_Fail;
5288
4.38k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5289
16
    return MCDisassembler_Fail;
5290
5291
4.37k
  return S;
5292
4.38k
}
5293
5294
static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn,
5295
            uint64_t Address, const void *Decoder)
5296
1.70k
{
5297
1.70k
  DecodeStatus S = MCDisassembler_Success;
5298
5299
1.70k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5300
1.70k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5301
1.70k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5302
1.70k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5303
1.70k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5304
1.70k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5305
1.70k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5306
5307
1.70k
  if (Rn == 0xF || Rn == Rt)
5308
531
    S = MCDisassembler_SoftFail;
5309
1.70k
  if (Rm == 0xF)
5310
367
    S = MCDisassembler_SoftFail;
5311
5312
1.70k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5313
0
    return MCDisassembler_Fail;
5314
1.70k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5315
0
    return MCDisassembler_Fail;
5316
1.70k
  if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
5317
0
    return MCDisassembler_Fail;
5318
1.70k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5319
5
    return MCDisassembler_Fail;
5320
5321
1.70k
  return S;
5322
1.70k
}
5323
5324
static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn,
5325
            uint64_t Address, const void *Decoder)
5326
4.86k
{
5327
4.86k
  DecodeStatus S = MCDisassembler_Success;
5328
5329
4.86k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5330
4.86k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5331
4.86k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5332
4.86k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5333
4.86k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5334
4.86k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5335
5336
4.86k
  if (Rn == 0xF || Rn == Rt)
5337
1.07k
    S = MCDisassembler_SoftFail;
5338
5339
4.86k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5340
0
    return MCDisassembler_Fail;
5341
4.86k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5342
0
    return MCDisassembler_Fail;
5343
4.86k
  if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
5344
0
    return MCDisassembler_Fail;
5345
4.86k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5346
5
    return MCDisassembler_Fail;
5347
5348
4.86k
  return S;
5349
4.86k
}
5350
5351
static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn,
5352
            uint64_t Address, const void *Decoder)
5353
3.24k
{
5354
3.24k
  DecodeStatus S = MCDisassembler_Success;
5355
5356
3.24k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5357
3.24k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5358
3.24k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5359
3.24k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5360
3.24k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5361
3.24k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5362
5363
3.24k
  if (Rn == 0xF || Rn == Rt)
5364
559
    S = MCDisassembler_SoftFail;
5365
5366
3.24k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5367
0
    return MCDisassembler_Fail;
5368
3.24k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5369
0
    return MCDisassembler_Fail;
5370
3.24k
  if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
5371
0
    return MCDisassembler_Fail;
5372
3.24k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5373
4
    return MCDisassembler_Fail;
5374
5375
3.24k
  return S;
5376
3.24k
}
5377
5378
static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5379
         const void *Decoder)
5380
2.85k
{
5381
2.85k
  DecodeStatus S = MCDisassembler_Success;
5382
5383
2.85k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5384
2.85k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5385
2.85k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5386
2.85k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5387
2.85k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5388
5389
2.85k
  unsigned align = 0;
5390
2.85k
  unsigned index = 0;
5391
2.85k
  switch (size) {
5392
0
  default:
5393
0
    return MCDisassembler_Fail;
5394
1.07k
  case 0:
5395
1.07k
    if (fieldFromInstruction_4(Insn, 4, 1))
5396
0
      return MCDisassembler_Fail; // UNDEFINED
5397
1.07k
    index = fieldFromInstruction_4(Insn, 5, 3);
5398
1.07k
    break;
5399
1.12k
  case 1:
5400
1.12k
    if (fieldFromInstruction_4(Insn, 5, 1))
5401
2
      return MCDisassembler_Fail; // UNDEFINED
5402
1.12k
    index = fieldFromInstruction_4(Insn, 6, 2);
5403
1.12k
    if (fieldFromInstruction_4(Insn, 4, 1))
5404
315
      align = 2;
5405
1.12k
    break;
5406
655
  case 2:
5407
655
    if (fieldFromInstruction_4(Insn, 6, 1))
5408
0
      return MCDisassembler_Fail; // UNDEFINED
5409
655
    index = fieldFromInstruction_4(Insn, 7, 1);
5410
5411
655
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5412
497
    case 0:
5413
497
      align = 0;
5414
497
      break;
5415
151
    case 3:
5416
151
      align = 4;
5417
151
      break;
5418
7
    default:
5419
7
      return MCDisassembler_Fail;
5420
655
    }
5421
648
    break;
5422
2.85k
  }
5423
5424
2.84k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5425
0
    return MCDisassembler_Fail;
5426
2.84k
  if (Rm != 0xF) { // Writeback
5427
2.02k
    if (!Check(&S,
5428
2.02k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5429
0
      return MCDisassembler_Fail;
5430
2.02k
  }
5431
2.84k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5432
0
    return MCDisassembler_Fail;
5433
2.84k
  MCOperand_CreateImm0(Inst, (align));
5434
2.84k
  if (Rm != 0xF) {
5435
2.02k
    if (Rm != 0xD) {
5436
1.11k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5437
1.11k
                    Decoder)))
5438
0
        return MCDisassembler_Fail;
5439
1.11k
    } else
5440
908
      MCOperand_CreateReg0(Inst, (0));
5441
2.02k
  }
5442
5443
2.84k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5444
0
    return MCDisassembler_Fail;
5445
2.84k
  MCOperand_CreateImm0(Inst, (index));
5446
5447
2.84k
  return S;
5448
2.84k
}
5449
5450
static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5451
         const void *Decoder)
5452
2.24k
{
5453
2.24k
  DecodeStatus S = MCDisassembler_Success;
5454
5455
2.24k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5456
2.24k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5457
2.24k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5458
2.24k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5459
2.24k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5460
5461
2.24k
  unsigned align = 0;
5462
2.24k
  unsigned index = 0;
5463
2.24k
  switch (size) {
5464
0
  default:
5465
0
    return MCDisassembler_Fail;
5466
938
  case 0:
5467
938
    if (fieldFromInstruction_4(Insn, 4, 1))
5468
0
      return MCDisassembler_Fail; // UNDEFINED
5469
938
    index = fieldFromInstruction_4(Insn, 5, 3);
5470
938
    break;
5471
683
  case 1:
5472
683
    if (fieldFromInstruction_4(Insn, 5, 1))
5473
0
      return MCDisassembler_Fail; // UNDEFINED
5474
683
    index = fieldFromInstruction_4(Insn, 6, 2);
5475
683
    if (fieldFromInstruction_4(Insn, 4, 1))
5476
165
      align = 2;
5477
683
    break;
5478
624
  case 2:
5479
624
    if (fieldFromInstruction_4(Insn, 6, 1))
5480
0
      return MCDisassembler_Fail; // UNDEFINED
5481
624
    index = fieldFromInstruction_4(Insn, 7, 1);
5482
5483
624
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5484
466
    case 0:
5485
466
      align = 0;
5486
466
      break;
5487
154
    case 3:
5488
154
      align = 4;
5489
154
      break;
5490
4
    default:
5491
4
      return MCDisassembler_Fail;
5492
624
    }
5493
620
    break;
5494
2.24k
  }
5495
5496
2.24k
  if (Rm != 0xF) { // Writeback
5497
1.35k
    if (!Check(&S,
5498
1.35k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5499
0
      return MCDisassembler_Fail;
5500
1.35k
  }
5501
2.24k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5502
0
    return MCDisassembler_Fail;
5503
2.24k
  MCOperand_CreateImm0(Inst, (align));
5504
2.24k
  if (Rm != 0xF) {
5505
1.35k
    if (Rm != 0xD) {
5506
912
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5507
912
                    Decoder)))
5508
0
        return MCDisassembler_Fail;
5509
912
    } else
5510
441
      MCOperand_CreateReg0(Inst, (0));
5511
1.35k
  }
5512
5513
2.24k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5514
0
    return MCDisassembler_Fail;
5515
2.24k
  MCOperand_CreateImm0(Inst, (index));
5516
5517
2.24k
  return S;
5518
2.24k
}
5519
5520
static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5521
         const void *Decoder)
5522
3.47k
{
5523
3.47k
  DecodeStatus S = MCDisassembler_Success;
5524
5525
3.47k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5526
3.47k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5527
3.47k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5528
3.47k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5529
3.47k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5530
5531
3.47k
  unsigned align = 0;
5532
3.47k
  unsigned index = 0;
5533
3.47k
  unsigned inc = 1;
5534
3.47k
  switch (size) {
5535
0
  default:
5536
0
    return MCDisassembler_Fail;
5537
931
  case 0:
5538
931
    index = fieldFromInstruction_4(Insn, 5, 3);
5539
931
    if (fieldFromInstruction_4(Insn, 4, 1))
5540
584
      align = 2;
5541
931
    break;
5542
1.40k
  case 1:
5543
1.40k
    index = fieldFromInstruction_4(Insn, 6, 2);
5544
1.40k
    if (fieldFromInstruction_4(Insn, 4, 1))
5545
760
      align = 4;
5546
1.40k
    if (fieldFromInstruction_4(Insn, 5, 1))
5547
860
      inc = 2;
5548
1.40k
    break;
5549
1.14k
  case 2:
5550
1.14k
    if (fieldFromInstruction_4(Insn, 5, 1))
5551
0
      return MCDisassembler_Fail; // UNDEFINED
5552
1.14k
    index = fieldFromInstruction_4(Insn, 7, 1);
5553
1.14k
    if (fieldFromInstruction_4(Insn, 4, 1) != 0)
5554
787
      align = 8;
5555
1.14k
    if (fieldFromInstruction_4(Insn, 6, 1))
5556
272
      inc = 2;
5557
1.14k
    break;
5558
3.47k
  }
5559
5560
3.47k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5561
0
    return MCDisassembler_Fail;
5562
3.47k
  if (!Check(&S,
5563
3.47k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5564
4
    return MCDisassembler_Fail;
5565
3.47k
  if (Rm != 0xF) { // Writeback
5566
2.58k
    if (!Check(&S,
5567
2.58k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5568
0
      return MCDisassembler_Fail;
5569
2.58k
  }
5570
3.47k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5571
0
    return MCDisassembler_Fail;
5572
3.47k
  MCOperand_CreateImm0(Inst, (align));
5573
3.47k
  if (Rm != 0xF) {
5574
2.58k
    if (Rm != 0xD) {
5575
1.64k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5576
1.64k
                    Decoder)))
5577
0
        return MCDisassembler_Fail;
5578
1.64k
    } else
5579
943
      MCOperand_CreateReg0(Inst, (0));
5580
2.58k
  }
5581
5582
3.47k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5583
0
    return MCDisassembler_Fail;
5584
3.47k
  if (!Check(&S,
5585
3.47k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5586
0
    return MCDisassembler_Fail;
5587
3.47k
  MCOperand_CreateImm0(Inst, (index));
5588
5589
3.47k
  return S;
5590
3.47k
}
5591
5592
static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5593
         const void *Decoder)
5594
3.79k
{
5595
3.79k
  DecodeStatus S = MCDisassembler_Success;
5596
5597
3.79k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5598
3.79k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5599
3.79k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5600
3.79k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5601
3.79k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5602
5603
3.79k
  unsigned align = 0;
5604
3.79k
  unsigned index = 0;
5605
3.79k
  unsigned inc = 1;
5606
3.79k
  switch (size) {
5607
0
  default:
5608
0
    return MCDisassembler_Fail;
5609
1.79k
  case 0:
5610
1.79k
    index = fieldFromInstruction_4(Insn, 5, 3);
5611
1.79k
    if (fieldFromInstruction_4(Insn, 4, 1))
5612
777
      align = 2;
5613
1.79k
    break;
5614
1.13k
  case 1:
5615
1.13k
    index = fieldFromInstruction_4(Insn, 6, 2);
5616
1.13k
    if (fieldFromInstruction_4(Insn, 4, 1))
5617
688
      align = 4;
5618
1.13k
    if (fieldFromInstruction_4(Insn, 5, 1))
5619
451
      inc = 2;
5620
1.13k
    break;
5621
869
  case 2:
5622
869
    if (fieldFromInstruction_4(Insn, 5, 1))
5623
0
      return MCDisassembler_Fail; // UNDEFINED
5624
869
    index = fieldFromInstruction_4(Insn, 7, 1);
5625
869
    if (fieldFromInstruction_4(Insn, 4, 1) != 0)
5626
483
      align = 8;
5627
869
    if (fieldFromInstruction_4(Insn, 6, 1))
5628
341
      inc = 2;
5629
869
    break;
5630
3.79k
  }
5631
5632
3.79k
  if (Rm != 0xF) { // Writeback
5633
2.47k
    if (!Check(&S,
5634
2.47k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5635
0
      return MCDisassembler_Fail;
5636
2.47k
  }
5637
3.79k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5638
0
    return MCDisassembler_Fail;
5639
3.79k
  MCOperand_CreateImm0(Inst, (align));
5640
3.79k
  if (Rm != 0xF) {
5641
2.47k
    if (Rm != 0xD) {
5642
1.64k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5643
1.64k
                    Decoder)))
5644
0
        return MCDisassembler_Fail;
5645
1.64k
    } else
5646
828
      MCOperand_CreateReg0(Inst, (0));
5647
2.47k
  }
5648
5649
3.79k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5650
0
    return MCDisassembler_Fail;
5651
3.79k
  if (!Check(&S,
5652
3.79k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5653
5
    return MCDisassembler_Fail;
5654
3.78k
  MCOperand_CreateImm0(Inst, (index));
5655
5656
3.78k
  return S;
5657
3.79k
}
5658
5659
static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5660
         const void *Decoder)
5661
2.49k
{
5662
2.49k
  DecodeStatus S = MCDisassembler_Success;
5663
5664
2.49k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5665
2.49k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5666
2.49k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5667
2.49k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5668
2.49k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5669
5670
2.49k
  unsigned align = 0;
5671
2.49k
  unsigned index = 0;
5672
2.49k
  unsigned inc = 1;
5673
2.49k
  switch (size) {
5674
0
  default:
5675
0
    return MCDisassembler_Fail;
5676
706
  case 0:
5677
706
    if (fieldFromInstruction_4(Insn, 4, 1))
5678
0
      return MCDisassembler_Fail; // UNDEFINED
5679
706
    index = fieldFromInstruction_4(Insn, 5, 3);
5680
706
    break;
5681
678
  case 1:
5682
678
    if (fieldFromInstruction_4(Insn, 4, 1))
5683
0
      return MCDisassembler_Fail; // UNDEFINED
5684
678
    index = fieldFromInstruction_4(Insn, 6, 2);
5685
678
    if (fieldFromInstruction_4(Insn, 5, 1))
5686
380
      inc = 2;
5687
678
    break;
5688
1.11k
  case 2:
5689
1.11k
    if (fieldFromInstruction_4(Insn, 4, 2))
5690
0
      return MCDisassembler_Fail; // UNDEFINED
5691
1.11k
    index = fieldFromInstruction_4(Insn, 7, 1);
5692
1.11k
    if (fieldFromInstruction_4(Insn, 6, 1))
5693
291
      inc = 2;
5694
1.11k
    break;
5695
2.49k
  }
5696
5697
2.49k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5698
0
    return MCDisassembler_Fail;
5699
2.49k
  if (!Check(&S,
5700
2.49k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5701
2
    return MCDisassembler_Fail;
5702
2.49k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5703
2.49k
                Decoder)))
5704
2
    return MCDisassembler_Fail;
5705
5706
2.49k
  if (Rm != 0xF) { // Writeback
5707
1.33k
    if (!Check(&S,
5708
1.33k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5709
0
      return MCDisassembler_Fail;
5710
1.33k
  }
5711
2.49k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5712
0
    return MCDisassembler_Fail;
5713
2.49k
  MCOperand_CreateImm0(Inst, (align));
5714
2.49k
  if (Rm != 0xF) {
5715
1.33k
    if (Rm != 0xD) {
5716
731
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5717
731
                    Decoder)))
5718
0
        return MCDisassembler_Fail;
5719
731
    } else
5720
604
      MCOperand_CreateReg0(Inst, (0));
5721
1.33k
  }
5722
5723
2.49k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5724
0
    return MCDisassembler_Fail;
5725
2.49k
  if (!Check(&S,
5726
2.49k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5727
0
    return MCDisassembler_Fail;
5728
2.49k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5729
2.49k
                Decoder)))
5730
0
    return MCDisassembler_Fail;
5731
2.49k
  MCOperand_CreateImm0(Inst, (index));
5732
5733
2.49k
  return S;
5734
2.49k
}
5735
5736
static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5737
         const void *Decoder)
5738
2.43k
{
5739
2.43k
  DecodeStatus S = MCDisassembler_Success;
5740
5741
2.43k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5742
2.43k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5743
2.43k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5744
2.43k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5745
2.43k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5746
5747
2.43k
  unsigned align = 0;
5748
2.43k
  unsigned index = 0;
5749
2.43k
  unsigned inc = 1;
5750
2.43k
  switch (size) {
5751
0
  default:
5752
0
    return MCDisassembler_Fail;
5753
243
  case 0:
5754
243
    if (fieldFromInstruction_4(Insn, 4, 1))
5755
0
      return MCDisassembler_Fail; // UNDEFINED
5756
243
    index = fieldFromInstruction_4(Insn, 5, 3);
5757
243
    break;
5758
1.38k
  case 1:
5759
1.38k
    if (fieldFromInstruction_4(Insn, 4, 1))
5760
0
      return MCDisassembler_Fail; // UNDEFINED
5761
1.38k
    index = fieldFromInstruction_4(Insn, 6, 2);
5762
1.38k
    if (fieldFromInstruction_4(Insn, 5, 1))
5763
334
      inc = 2;
5764
1.38k
    break;
5765
807
  case 2:
5766
807
    if (fieldFromInstruction_4(Insn, 4, 2))
5767
0
      return MCDisassembler_Fail; // UNDEFINED
5768
807
    index = fieldFromInstruction_4(Insn, 7, 1);
5769
807
    if (fieldFromInstruction_4(Insn, 6, 1))
5770
126
      inc = 2;
5771
807
    break;
5772
2.43k
  }
5773
5774
2.43k
  if (Rm != 0xF) { // Writeback
5775
1.27k
    if (!Check(&S,
5776
1.27k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5777
0
      return MCDisassembler_Fail;
5778
1.27k
  }
5779
2.43k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5780
0
    return MCDisassembler_Fail;
5781
2.43k
  MCOperand_CreateImm0(Inst, (align));
5782
2.43k
  if (Rm != 0xF) {
5783
1.27k
    if (Rm != 0xD) {
5784
934
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5785
934
                    Decoder)))
5786
0
        return MCDisassembler_Fail;
5787
934
    } else
5788
342
      MCOperand_CreateReg0(Inst, (0));
5789
1.27k
  }
5790
5791
2.43k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5792
0
    return MCDisassembler_Fail;
5793
2.43k
  if (!Check(&S,
5794
2.43k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5795
2
    return MCDisassembler_Fail;
5796
2.43k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5797
2.43k
                Decoder)))
5798
3
    return MCDisassembler_Fail;
5799
2.43k
  MCOperand_CreateImm0(Inst, (index));
5800
5801
2.43k
  return S;
5802
2.43k
}
5803
5804
static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5805
         const void *Decoder)
5806
5.18k
{
5807
5.18k
  DecodeStatus S = MCDisassembler_Success;
5808
5809
5.18k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5810
5.18k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5811
5.18k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5812
5.18k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5813
5.18k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5814
5815
5.18k
  unsigned align = 0;
5816
5.18k
  unsigned index = 0;
5817
5.18k
  unsigned inc = 1;
5818
5.18k
  switch (size) {
5819
0
  default:
5820
0
    return MCDisassembler_Fail;
5821
2.57k
  case 0:
5822
2.57k
    if (fieldFromInstruction_4(Insn, 4, 1))
5823
440
      align = 4;
5824
2.57k
    index = fieldFromInstruction_4(Insn, 5, 3);
5825
2.57k
    break;
5826
1.16k
  case 1:
5827
1.16k
    if (fieldFromInstruction_4(Insn, 4, 1))
5828
573
      align = 8;
5829
1.16k
    index = fieldFromInstruction_4(Insn, 6, 2);
5830
1.16k
    if (fieldFromInstruction_4(Insn, 5, 1))
5831
394
      inc = 2;
5832
1.16k
    break;
5833
1.44k
  case 2:
5834
1.44k
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5835
601
    case 0:
5836
601
      align = 0;
5837
601
      break;
5838
3
    case 3:
5839
3
      return MCDisassembler_Fail;
5840
845
    default:
5841
845
      align = 4 << fieldFromInstruction_4(Insn, 4, 2);
5842
845
      break;
5843
1.44k
    }
5844
5845
1.44k
    index = fieldFromInstruction_4(Insn, 7, 1);
5846
1.44k
    if (fieldFromInstruction_4(Insn, 6, 1))
5847
952
      inc = 2;
5848
1.44k
    break;
5849
5.18k
  }
5850
5851
5.18k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5852
0
    return MCDisassembler_Fail;
5853
5.18k
  if (!Check(&S,
5854
5.18k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5855
3
    return MCDisassembler_Fail;
5856
5.18k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5857
5.18k
                Decoder)))
5858
3
    return MCDisassembler_Fail;
5859
5.17k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3 * inc, Address,
5860
5.17k
                Decoder)))
5861
3
    return MCDisassembler_Fail;
5862
5863
5.17k
  if (Rm != 0xF) { // Writeback
5864
3.86k
    if (!Check(&S,
5865
3.86k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5866
0
      return MCDisassembler_Fail;
5867
3.86k
  }
5868
5.17k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5869
0
    return MCDisassembler_Fail;
5870
5.17k
  MCOperand_CreateImm0(Inst, (align));
5871
5.17k
  if (Rm != 0xF) {
5872
3.86k
    if (Rm != 0xD) {
5873
2.13k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5874
2.13k
                    Decoder)))
5875
0
        return MCDisassembler_Fail;
5876
2.13k
    } else
5877
1.72k
      MCOperand_CreateReg0(Inst, (0));
5878
3.86k
  }
5879
5880
5.17k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5881
0
    return MCDisassembler_Fail;
5882
5.17k
  if (!Check(&S,
5883
5.17k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5884
0
    return MCDisassembler_Fail;
5885
5.17k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5886
5.17k
                Decoder)))
5887
0
    return MCDisassembler_Fail;
5888
5.17k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3 * inc, Address,
5889
5.17k
                Decoder)))
5890
0
    return MCDisassembler_Fail;
5891
5.17k
  MCOperand_CreateImm0(Inst, (index));
5892
5893
5.17k
  return S;
5894
5.17k
}
5895
5896
static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5897
         const void *Decoder)
5898
2.31k
{
5899
2.31k
  DecodeStatus S = MCDisassembler_Success;
5900
5901
2.31k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5902
2.31k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5903
2.31k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5904
2.31k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5905
2.31k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5906
5907
2.31k
  unsigned align = 0;
5908
2.31k
  unsigned index = 0;
5909
2.31k
  unsigned inc = 1;
5910
2.31k
  switch (size) {
5911
0
  default:
5912
0
    return MCDisassembler_Fail;
5913
915
  case 0:
5914
915
    if (fieldFromInstruction_4(Insn, 4, 1))
5915
279
      align = 4;
5916
915
    index = fieldFromInstruction_4(Insn, 5, 3);
5917
915
    break;
5918
584
  case 1:
5919
584
    if (fieldFromInstruction_4(Insn, 4, 1))
5920
260
      align = 8;
5921
584
    index = fieldFromInstruction_4(Insn, 6, 2);
5922
584
    if (fieldFromInstruction_4(Insn, 5, 1))
5923
193
      inc = 2;
5924
584
    break;
5925
815
  case 2:
5926
815
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5927
412
    case 0:
5928
412
      align = 0;
5929
412
      break;
5930
4
    case 3:
5931
4
      return MCDisassembler_Fail;
5932
399
    default:
5933
399
      align = 4 << fieldFromInstruction_4(Insn, 4, 2);
5934
399
      break;
5935
815
    }
5936
5937
811
    index = fieldFromInstruction_4(Insn, 7, 1);
5938
811
    if (fieldFromInstruction_4(Insn, 6, 1))
5939
343
      inc = 2;
5940
811
    break;
5941
2.31k
  }
5942
5943
2.31k
  if (Rm != 0xF) { // Writeback
5944
1.61k
    if (!Check(&S,
5945
1.61k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5946
0
      return MCDisassembler_Fail;
5947
1.61k
  }
5948
2.31k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5949
0
    return MCDisassembler_Fail;
5950
2.31k
  MCOperand_CreateImm0(Inst, (align));
5951
2.31k
  if (Rm != 0xF) {
5952
1.61k
    if (Rm != 0xD) {
5953
1.16k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5954
1.16k
                    Decoder)))
5955
0
        return MCDisassembler_Fail;
5956
1.16k
    } else
5957
448
      MCOperand_CreateReg0(Inst, (0));
5958
1.61k
  }
5959
5960
2.31k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5961
0
    return MCDisassembler_Fail;
5962
2.31k
  if (!Check(&S,
5963
2.31k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5964
4
    return MCDisassembler_Fail;
5965
2.30k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5966
2.30k
                Decoder)))
5967
2
    return MCDisassembler_Fail;
5968
2.30k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3 * inc, Address,
5969
2.30k
                Decoder)))
5970
2
    return MCDisassembler_Fail;
5971
2.30k
  MCOperand_CreateImm0(Inst, (index));
5972
5973
2.30k
  return S;
5974
2.30k
}
5975
5976
static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn, uint64_t Address,
5977
          const void *Decoder)
5978
251
{
5979
251
  DecodeStatus S = MCDisassembler_Success;
5980
251
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5981
251
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
5982
251
  unsigned Rm = fieldFromInstruction_4(Insn, 5, 1);
5983
251
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5984
251
  Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1;
5985
5986
251
  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5987
189
    S = MCDisassembler_SoftFail;
5988
5989
251
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm, Address, Decoder)))
5990
0
    return MCDisassembler_Fail;
5991
251
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm + 1, Address, Decoder)))
5992
2
    return MCDisassembler_Fail;
5993
249
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5994
0
    return MCDisassembler_Fail;
5995
249
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5996
0
    return MCDisassembler_Fail;
5997
249
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5998
2
    return MCDisassembler_Fail;
5999
6000
247
  return S;
6001
249
}
6002
6003
static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn, uint64_t Address,
6004
          const void *Decoder)
6005
1.56k
{
6006
1.56k
  DecodeStatus S = MCDisassembler_Success;
6007
1.56k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6008
1.56k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
6009
1.56k
  unsigned Rm = fieldFromInstruction_4(Insn, 5, 1);
6010
1.56k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
6011
1.56k
  Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1;
6012
6013
1.56k
  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
6014
1.33k
    S = MCDisassembler_SoftFail;
6015
6016
1.56k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
6017
0
    return MCDisassembler_Fail;
6018
1.56k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
6019
0
    return MCDisassembler_Fail;
6020
1.56k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm, Address, Decoder)))
6021
0
    return MCDisassembler_Fail;
6022
1.56k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm + 1, Address, Decoder)))
6023
4
    return MCDisassembler_Fail;
6024
1.56k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
6025
2
    return MCDisassembler_Fail;
6026
6027
1.55k
  return S;
6028
1.56k
}
6029
6030
static DecodeStatus DecodeIT(MCInst *Inst, unsigned Insn, uint64_t Address,
6031
           const void *Decoder)
6032
12.4k
{
6033
12.4k
  DecodeStatus S = MCDisassembler_Success;
6034
12.4k
  unsigned pred = fieldFromInstruction_4(Insn, 4, 4);
6035
12.4k
  unsigned mask = fieldFromInstruction_4(Insn, 0, 4);
6036
6037
12.4k
  if (pred == 0xF) {
6038
1.50k
    pred = 0xE;
6039
1.50k
    S = MCDisassembler_SoftFail;
6040
1.50k
  }
6041
6042
12.4k
  if (mask == 0x0)
6043
0
    return MCDisassembler_Fail;
6044
6045
  // IT masks are encoded as a sequence of replacement low-order bits
6046
  // for the condition code. So if the low bit of the starting
6047
  // condition code is 1, then we have to flip all the bits above the
6048
  // terminating bit (which is the lowest 1 bit).
6049
12.4k
  if (pred & 1) {
6050
7.81k
    unsigned LowBit = mask & -mask;
6051
7.81k
    unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
6052
7.81k
    mask ^= BitsAboveLowBit;
6053
7.81k
  }
6054
6055
12.4k
  MCOperand_CreateImm0(Inst, (pred));
6056
12.4k
  MCOperand_CreateImm0(Inst, (mask));
6057
12.4k
  return S;
6058
12.4k
}
6059
6060
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst, unsigned Insn,
6061
                 uint64_t Address,
6062
                 const void *Decoder)
6063
6.03k
{
6064
6.03k
  DecodeStatus S = MCDisassembler_Success;
6065
6066
6.03k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6067
6.03k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4);
6068
6.03k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6069
6.03k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
6070
6.03k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
6071
6.03k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
6072
6.03k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
6073
6.03k
  bool writeback = (W == 1) | (P == 0);
6074
6075
6.03k
  addr |= (U << 8) | (Rn << 9);
6076
6077
6.03k
  if (writeback && (Rn == Rt || Rn == Rt2))
6078
3.33k
    Check(&S, MCDisassembler_SoftFail);
6079
6.03k
  if (Rt == Rt2)
6080
1.03k
    Check(&S, MCDisassembler_SoftFail);
6081
6082
  // Rt
6083
6.03k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
6084
0
    return MCDisassembler_Fail;
6085
  // Rt2
6086
6.03k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
6087
0
    return MCDisassembler_Fail;
6088
  // Writeback operand
6089
6.03k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
6090
0
    return MCDisassembler_Fail;
6091
  // addr
6092
6.03k
  if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
6093
0
    return MCDisassembler_Fail;
6094
6095
6.03k
  return S;
6096
6.03k
}
6097
6098
static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst, unsigned Insn,
6099
                 uint64_t Address,
6100
                 const void *Decoder)
6101
7.14k
{
6102
7.14k
  DecodeStatus S = MCDisassembler_Success;
6103
6104
7.14k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6105
7.14k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4);
6106
7.14k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6107
7.14k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
6108
7.14k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
6109
7.14k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
6110
7.14k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
6111
7.14k
  bool writeback = (W == 1) | (P == 0);
6112
6113
7.14k
  addr |= (U << 8) | (Rn << 9);
6114
6115
7.14k
  if (writeback && (Rn == Rt || Rn == Rt2))
6116
3.11k
    Check(&S, MCDisassembler_SoftFail);
6117
6118
  // Writeback operand
6119
7.14k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
6120
0
    return MCDisassembler_Fail;
6121
  // Rt
6122
7.14k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
6123
0
    return MCDisassembler_Fail;
6124
  // Rt2
6125
7.14k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
6126
0
    return MCDisassembler_Fail;
6127
  // addr
6128
7.14k
  if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
6129
0
    return MCDisassembler_Fail;
6130
6131
7.14k
  return S;
6132
7.14k
}
6133
6134
static DecodeStatus DecodeT2Adr(MCInst *Inst, uint32_t Insn, uint64_t Address,
6135
        const void *Decoder)
6136
629
{
6137
629
  unsigned sign1 = fieldFromInstruction_4(Insn, 21, 1);
6138
629
  unsigned sign2 = fieldFromInstruction_4(Insn, 23, 1);
6139
629
  if (sign1 != sign2)
6140
3
    return MCDisassembler_Fail;
6141
626
  const unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
6142
6143
626
  DecodeStatus S = DecoderGPRRegisterClass(Inst, Rd, Address, Decoder);
6144
6145
626
  unsigned Val = fieldFromInstruction_4(Insn, 0, 8);
6146
626
  Val |= fieldFromInstruction_4(Insn, 12, 3) << 8;
6147
626
  Val |= fieldFromInstruction_4(Insn, 26, 1) << 11;
6148
  // If sign, then it is decreasing the address.
6149
626
  if (sign1) {
6150
    // Following ARMv7 Architecture Manual, when the offset
6151
    // is zero, it is decoded as a subw, not as a adr.w
6152
483
    if (!Val) {
6153
163
      MCInst_setOpcode(Inst, (ARM_t2SUBri12));
6154
163
      MCOperand_CreateReg0(Inst, (ARM_PC));
6155
163
    } else
6156
320
      Val = -Val;
6157
483
  }
6158
626
  MCOperand_CreateImm0(Inst, (Val));
6159
626
  return S;
6160
629
}
6161
6162
static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, uint32_t Val,
6163
                uint64_t Address,
6164
                const void *Decoder)
6165
1.21k
{
6166
1.21k
  DecodeStatus S = MCDisassembler_Success;
6167
6168
  // Shift of "asr #32" is not allowed in Thumb2 mode.
6169
1.21k
  if (Val == 0x20)
6170
1
    S = MCDisassembler_Fail;
6171
1.21k
  MCOperand_CreateImm0(Inst, (Val));
6172
1.21k
  return S;
6173
1.21k
}
6174
6175
static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn, uint64_t Address,
6176
             const void *Decoder)
6177
2.92k
{
6178
2.92k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6179
2.92k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 0, 4);
6180
2.92k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6181
2.92k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
6182
6183
2.92k
  if (pred == 0xF)
6184
341
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
6185
6186
2.58k
  DecodeStatus S = MCDisassembler_Success;
6187
6188
2.58k
  if (Rt == Rn || Rn == Rt2)
6189
659
    S = MCDisassembler_SoftFail;
6190
6191
2.58k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
6192
0
    return MCDisassembler_Fail;
6193
2.58k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
6194
0
    return MCDisassembler_Fail;
6195
2.58k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
6196
0
    return MCDisassembler_Fail;
6197
2.58k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
6198
0
    return MCDisassembler_Fail;
6199
6200
2.58k
  return S;
6201
2.58k
}
6202
6203
static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn, uint64_t Address,
6204
        const void *Decoder)
6205
2.89k
{
6206
2.89k
  bool hasFullFP16 =
6207
2.89k
    ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureFullFP16);
6208
6209
2.89k
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
6210
2.89k
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
6211
2.89k
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
6212
2.89k
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
6213
2.89k
  unsigned imm = fieldFromInstruction_4(Insn, 16, 6);
6214
2.89k
  unsigned cmode = fieldFromInstruction_4(Insn, 8, 4);
6215
2.89k
  unsigned op = fieldFromInstruction_4(Insn, 5, 1);
6216
6217
2.89k
  DecodeStatus S = MCDisassembler_Success;
6218
6219
  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
6220
2.89k
  if (!(imm & 0x38)) {
6221
1.13k
    if (cmode == 0xF) {
6222
171
      if (op == 1)
6223
3
        return MCDisassembler_Fail;
6224
168
      MCInst_setOpcode(Inst, (ARM_VMOVv2f32));
6225
168
    }
6226
1.12k
    if (hasFullFP16) {
6227
1.12k
      if (cmode == 0xE) {
6228
0
        if (op == 1) {
6229
0
          MCInst_setOpcode(Inst, (ARM_VMOVv1i64));
6230
0
        } else {
6231
0
          MCInst_setOpcode(Inst, (ARM_VMOVv8i8));
6232
0
        }
6233
0
      }
6234
1.12k
      if (cmode == 0xD) {
6235
776
        if (op == 1) {
6236
666
          MCInst_setOpcode(Inst, (ARM_VMVNv2i32));
6237
666
        } else {
6238
110
          MCInst_setOpcode(Inst, (ARM_VMOVv2i32));
6239
110
        }
6240
776
      }
6241
1.12k
      if (cmode == 0xC) {
6242
185
        if (op == 1) {
6243
102
          MCInst_setOpcode(Inst, (ARM_VMVNv2i32));
6244
102
        } else {
6245
83
          MCInst_setOpcode(Inst, (ARM_VMOVv2i32));
6246
83
        }
6247
185
      }
6248
1.12k
    }
6249
1.12k
    return DecodeVMOVModImmInstruction(Inst, Insn, Address,
6250
1.12k
               Decoder);
6251
1.13k
  }
6252
6253
1.76k
  if (!(imm & 0x20))
6254
10
    return MCDisassembler_Fail;
6255
6256
1.75k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
6257
0
    return MCDisassembler_Fail;
6258
1.75k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
6259
0
    return MCDisassembler_Fail;
6260
1.75k
  MCOperand_CreateImm0(Inst, (64 - imm));
6261
6262
1.75k
  return S;
6263
1.75k
}
6264
6265
static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn, uint64_t Address,
6266
        const void *Decoder)
6267
820
{
6268
820
  bool hasFullFP16 =
6269
820
    ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureFullFP16);
6270
6271
820
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
6272
820
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
6273
820
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
6274
820
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
6275
820
  unsigned imm = fieldFromInstruction_4(Insn, 16, 6);
6276
820
  unsigned cmode = fieldFromInstruction_4(Insn, 8, 4);
6277
820
  unsigned op = fieldFromInstruction_4(Insn, 5, 1);
6278
6279
820
  DecodeStatus S = MCDisassembler_Success;
6280
6281
  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
6282
820
  if (!(imm & 0x38)) {
6283
420
    if (cmode == 0xF) {
6284
193
      if (op == 1)
6285
1
        return MCDisassembler_Fail;
6286
192
      MCInst_setOpcode(Inst, (ARM_VMOVv4f32));
6287
192
    }
6288
419
    if (hasFullFP16) {
6289
419
      if (cmode == 0xE) {
6290
0
        if (op == 1) {
6291
0
          MCInst_setOpcode(Inst, (ARM_VMOVv2i64));
6292
0
        } else {
6293
0
          MCInst_setOpcode(Inst, (ARM_VMOVv16i8));
6294
0
        }
6295
0
      }
6296
419
      if (cmode == 0xD) {
6297
141
        if (op == 1) {
6298
82
          MCInst_setOpcode(Inst, (ARM_VMVNv4i32));
6299
82
        } else {
6300
59
          MCInst_setOpcode(Inst, (ARM_VMOVv4i32));
6301
59
        }
6302
141
      }
6303
419
      if (cmode == 0xC) {
6304
86
        if (op == 1) {
6305
66
          MCInst_setOpcode(Inst, (ARM_VMVNv4i32));
6306
66
        } else {
6307
20
          MCInst_setOpcode(Inst, (ARM_VMOVv4i32));
6308
20
        }
6309
86
      }
6310
419
    }
6311
419
    return DecodeVMOVModImmInstruction(Inst, Insn, Address,
6312
419
               Decoder);
6313
420
  }
6314
6315
400
  if (!(imm & 0x20))
6316
6
    return MCDisassembler_Fail;
6317
6318
394
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
6319
7
    return MCDisassembler_Fail;
6320
387
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder)))
6321
4
    return MCDisassembler_Fail;
6322
383
  MCOperand_CreateImm0(Inst, (64 - imm));
6323
6324
383
  return S;
6325
387
}
6326
6327
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst *Inst,
6328
                   unsigned Insn,
6329
                   uint64_t Address,
6330
                   const void *Decoder)
6331
47
{
6332
47
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
6333
47
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
6334
47
  unsigned Vn = (fieldFromInstruction_4(Insn, 16, 4) << 0);
6335
47
  Vn |= (fieldFromInstruction_4(Insn, 7, 1) << 4);
6336
47
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
6337
47
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
6338
47
  unsigned q = (fieldFromInstruction_4(Insn, 6, 1) << 0);
6339
47
  unsigned rotate = (fieldFromInstruction_4(Insn, 20, 2) << 0);
6340
6341
47
  DecodeStatus S = MCDisassembler_Success;
6342
6343
47
  typedef DecodeStatus (*DecoderFunction)(MCInst *Inst, unsigned RegNo,
6344
47
            uint64_t Address,
6345
47
            const void *Decoder);
6346
6347
47
  DecoderFunction DestRegDecoder = q ? DecodeQPRRegisterClass :
6348
47
               DecodeDPRRegisterClass;
6349
6350
47
  if (!Check(&S, DestRegDecoder(Inst, Vd, Address, Decoder)))
6351
1
    return MCDisassembler_Fail;
6352
46
  if (!Check(&S, DestRegDecoder(Inst, Vd, Address, Decoder)))
6353
0
    return MCDisassembler_Fail;
6354
46
  if (!Check(&S, DestRegDecoder(Inst, Vn, Address, Decoder)))
6355
2
    return MCDisassembler_Fail;
6356
44
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
6357
0
    return MCDisassembler_Fail;
6358
  // The lane index does not have any bits in the encoding, because it can
6359
  // only be 0.
6360
44
  MCOperand_CreateImm0(Inst, (0));
6361
44
  MCOperand_CreateImm0(Inst, (rotate));
6362
6363
44
  return S;
6364
44
}
6365
6366
static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val, uint64_t Address,
6367
            const void *Decoder)
6368
3.89k
{
6369
3.89k
  DecodeStatus S = MCDisassembler_Success;
6370
6371
3.89k
  unsigned Rn = fieldFromInstruction_4(Val, 16, 4);
6372
3.89k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
6373
3.89k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
6374
3.89k
  Rm |= (fieldFromInstruction_4(Val, 23, 1) << 4);
6375
3.89k
  unsigned Cond = fieldFromInstruction_4(Val, 28, 4);
6376
6377
3.89k
  if (fieldFromInstruction_4(Val, 8, 4) != 0 || Rn == Rt)
6378
1.72k
    S = MCDisassembler_SoftFail;
6379
6380
3.89k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
6381
0
    return MCDisassembler_Fail;
6382
3.89k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
6383
0
    return MCDisassembler_Fail;
6384
3.89k
  if (!Check(&S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder)))
6385
0
    return MCDisassembler_Fail;
6386
3.89k
  if (!Check(&S, DecodePostIdxReg(Inst, Rm, Address, Decoder)))
6387
0
    return MCDisassembler_Fail;
6388
3.89k
  if (!Check(&S, DecodePredicateOperand(Inst, Cond, Address, Decoder)))
6389
2
    return MCDisassembler_Fail;
6390
6391
3.89k
  return S;
6392
3.89k
}
6393
6394
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst *Inst, unsigned Val,
6395
              uint64_t Address,
6396
              const void *Decoder)
6397
2.56k
{
6398
2.56k
  DecodeStatus S = MCDisassembler_Success;
6399
6400
2.56k
  unsigned CRm = fieldFromInstruction_4(Val, 0, 4);
6401
2.56k
  unsigned opc1 = fieldFromInstruction_4(Val, 4, 4);
6402
2.56k
  unsigned cop = fieldFromInstruction_4(Val, 8, 4);
6403
2.56k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
6404
2.56k
  unsigned Rt2 = fieldFromInstruction_4(Val, 16, 4);
6405
6406
2.56k
  if ((cop & ~0x1) == 0xa)
6407
8
    return MCDisassembler_Fail;
6408
6409
2.56k
  if (Rt == Rt2)
6410
467
    S = MCDisassembler_SoftFail;
6411
6412
  // We have to check if the instruction is MRRC2
6413
  // or MCRR2 when constructing the operands for
6414
  // Inst. Reason is because MRRC2 stores to two
6415
  // registers so it's tablegen desc has has two
6416
  // outputs whereas MCRR doesn't store to any
6417
  // registers so all of it's operands are listed
6418
  // as inputs, therefore the operand order for
6419
  // MRRC2 needs to be [Rt, Rt2, cop, opc1, CRm]
6420
  // and MCRR2 operand order is [cop, opc1, Rt, Rt2, CRm]
6421
6422
2.56k
  if (MCInst_getOpcode(Inst) == ARM_MRRC2) {
6423
813
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address,
6424
813
                Decoder)))
6425
0
      return MCDisassembler_Fail;
6426
813
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address,
6427
813
                Decoder)))
6428
0
      return MCDisassembler_Fail;
6429
813
  }
6430
2.56k
  MCOperand_CreateImm0(Inst, (cop));
6431
2.56k
  MCOperand_CreateImm0(Inst, (opc1));
6432
2.56k
  if (MCInst_getOpcode(Inst) == ARM_MCRR2) {
6433
1.74k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address,
6434
1.74k
                Decoder)))
6435
0
      return MCDisassembler_Fail;
6436
1.74k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address,
6437
1.74k
                Decoder)))
6438
0
      return MCDisassembler_Fail;
6439
1.74k
  }
6440
2.56k
  MCOperand_CreateImm0(Inst, (CRm));
6441
6442
2.56k
  return S;
6443
2.56k
}
6444
6445
static DecodeStatus DecodeForVMRSandVMSR(MCInst *Inst, unsigned Val,
6446
           uint64_t Address, const void *Decoder)
6447
1.11k
{
6448
1.11k
  DecodeStatus S = MCDisassembler_Success;
6449
6450
  // Add explicit operand for the destination sysreg, for cases where
6451
  // we have to model it for code generation purposes.
6452
1.11k
  switch (MCInst_getOpcode(Inst)) {
6453
10
  case ARM_VMSR_FPSCR_NZCVQC:
6454
10
    MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
6455
10
    break;
6456
0
  case ARM_VMSR_P0:
6457
0
    MCOperand_CreateReg0(Inst, (ARM_VPR));
6458
0
    break;
6459
1.11k
  }
6460
6461
1.11k
  if (MCInst_getOpcode(Inst) != ARM_FMSTAT) {
6462
1.08k
    unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
6463
6464
1.08k
    if (ARM_getFeatureBits(Inst->csh->mode, ARM_ModeThumb) &&
6465
1.08k
        !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops)) {
6466
600
      if (Rt == 13 || Rt == 15)
6467
168
        S = MCDisassembler_SoftFail;
6468
600
      Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address,
6469
600
               Decoder));
6470
600
    } else
6471
481
      Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address,
6472
481
                   Decoder));
6473
1.08k
  }
6474
6475
  // Add explicit operand for the source sysreg, similarly to above.
6476
1.11k
  switch (MCInst_getOpcode(Inst)) {
6477
73
  case ARM_VMRS_FPSCR_NZCVQC:
6478
73
    MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
6479
73
    break;
6480
0
  case ARM_VMRS_P0:
6481
0
    MCOperand_CreateReg0(Inst, (ARM_VPR));
6482
0
    break;
6483
1.11k
  }
6484
6485
1.11k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_ModeThumb)) {
6486
873
    MCOperand_CreateImm0(Inst, (ARMCC_AL));
6487
873
    MCOperand_CreateReg0(Inst, (0));
6488
873
  } else {
6489
242
    unsigned pred = fieldFromInstruction_4(Val, 28, 4);
6490
242
    if (!Check(&S, DecodePredicateOperand(Inst, pred, Address,
6491
242
                  Decoder)))
6492
1
      return MCDisassembler_Fail;
6493
242
  }
6494
6495
1.11k
  return S;
6496
1.11k
}
6497
6498
#define DEFINE_DecodeBFLabelOperand(isSigned, isNeg, zeroPermitted, size) \
6499
  static DecodeStatus CONCAT( \
6500
    DecodeBFLabelOperand, \
6501
    CONCAT(isSigned, CONCAT(isNeg, CONCAT(zeroPermitted, size))))( \
6502
    MCInst * Inst, unsigned Val, uint64_t Address, \
6503
    const void *Decoder) \
6504
1.43k
  { \
6505
1.43k
    DecodeStatus S = MCDisassembler_Success; \
6506
1.43k
    if (Val == 0 && !zeroPermitted) \
6507
1.43k
      S = MCDisassembler_Fail; \
6508
1.43k
\
6509
1.43k
    uint64_t DecVal; \
6510
1.43k
    if (isSigned) \
6511
1.43k
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
1.43k
    else \
6513
1.43k
      DecVal = (Val << 1); \
6514
1.43k
\
6515
1.43k
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
1.43k
                true, 4, Inst, Decoder)) \
6517
1.43k
      MCOperand_CreateImm0(Inst, \
6518
1.43k
               (isNeg ? -DecVal : DecVal)); \
6519
1.43k
    return S; \
6520
1.43k
  }
ARMDisassembler.c:DecodeBFLabelOperand_0_1_1_11
Line
Count
Source
6504
175
  { \
6505
175
    DecodeStatus S = MCDisassembler_Success; \
6506
175
    if (Val == 0 && !zeroPermitted) \
6507
175
      S = MCDisassembler_Fail; \
6508
175
\
6509
175
    uint64_t DecVal; \
6510
175
    if (isSigned) \
6511
175
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
175
    else \
6513
175
      DecVal = (Val << 1); \
6514
175
\
6515
175
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
175
                true, 4, Inst, Decoder)) \
6517
175
      MCOperand_CreateImm0(Inst, \
6518
175
               (isNeg ? -DecVal : DecVal)); \
6519
175
    return S; \
6520
175
  }
ARMDisassembler.c:DecodeBFLabelOperand_0_0_1_11
Line
Count
Source
6504
584
  { \
6505
584
    DecodeStatus S = MCDisassembler_Success; \
6506
584
    if (Val == 0 && !zeroPermitted) \
6507
584
      S = MCDisassembler_Fail; \
6508
584
\
6509
584
    uint64_t DecVal; \
6510
584
    if (isSigned) \
6511
584
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
584
    else \
6513
584
      DecVal = (Val << 1); \
6514
584
\
6515
584
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
584
                true, 4, Inst, Decoder)) \
6517
584
      MCOperand_CreateImm0(Inst, \
6518
584
               (isNeg ? -DecVal : DecVal)); \
6519
584
    return S; \
6520
584
  }
ARMDisassembler.c:DecodeBFLabelOperand_0_0_0_4
Line
Count
Source
6504
344
  { \
6505
344
    DecodeStatus S = MCDisassembler_Success; \
6506
344
    if (Val == 0 && !zeroPermitted) \
6507
344
      S = MCDisassembler_Fail; \
6508
344
\
6509
344
    uint64_t DecVal; \
6510
344
    if (isSigned) \
6511
344
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
344
    else \
6513
344
      DecVal = (Val << 1); \
6514
344
\
6515
344
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
344
                true, 4, Inst, Decoder)) \
6517
344
      MCOperand_CreateImm0(Inst, \
6518
344
               (isNeg ? -DecVal : DecVal)); \
6519
344
    return S; \
6520
344
  }
ARMDisassembler.c:DecodeBFLabelOperand_1_0_1_18
Line
Count
Source
6504
241
  { \
6505
241
    DecodeStatus S = MCDisassembler_Success; \
6506
241
    if (Val == 0 && !zeroPermitted) \
6507
241
      S = MCDisassembler_Fail; \
6508
241
\
6509
241
    uint64_t DecVal; \
6510
241
    if (isSigned) \
6511
241
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
241
    else \
6513
241
      DecVal = (Val << 1); \
6514
241
\
6515
241
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
241
                true, 4, Inst, Decoder)) \
6517
241
      MCOperand_CreateImm0(Inst, \
6518
241
               (isNeg ? -DecVal : DecVal)); \
6519
241
    return S; \
6520
241
  }
ARMDisassembler.c:DecodeBFLabelOperand_1_0_1_12
Line
Count
Source
6504
17
  { \
6505
17
    DecodeStatus S = MCDisassembler_Success; \
6506
17
    if (Val == 0 && !zeroPermitted) \
6507
17
      S = MCDisassembler_Fail; \
6508
17
\
6509
17
    uint64_t DecVal; \
6510
17
    if (isSigned) \
6511
17
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
17
    else \
6513
17
      DecVal = (Val << 1); \
6514
17
\
6515
17
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
17
                true, 4, Inst, Decoder)) \
6517
17
      MCOperand_CreateImm0(Inst, \
6518
17
               (isNeg ? -DecVal : DecVal)); \
6519
17
    return S; \
6520
17
  }
ARMDisassembler.c:DecodeBFLabelOperand_1_0_1_16
Line
Count
Source
6504
70
  { \
6505
70
    DecodeStatus S = MCDisassembler_Success; \
6506
70
    if (Val == 0 && !zeroPermitted) \
6507
70
      S = MCDisassembler_Fail; \
6508
70
\
6509
70
    uint64_t DecVal; \
6510
70
    if (isSigned) \
6511
70
      DecVal = SignExtend32((Val << 1), size + 1); \
6512
70
    else \
6513
70
      DecVal = (Val << 1); \
6514
70
\
6515
70
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6516
70
                true, 4, Inst, Decoder)) \
6517
70
      MCOperand_CreateImm0(Inst, \
6518
70
               (isNeg ? -DecVal : DecVal)); \
6519
70
    return S; \
6520
70
  }
6521
DEFINE_DecodeBFLabelOperand(false, false, false, 4)
6522
  DEFINE_DecodeBFLabelOperand(true, false, true,
6523
            18) DEFINE_DecodeBFLabelOperand(true, false,
6524
                    true, 12)
6525
    DEFINE_DecodeBFLabelOperand(true, false, true, 16)
6526
      DEFINE_DecodeBFLabelOperand(false, true, true, 11)
6527
        DEFINE_DecodeBFLabelOperand(false, false, true,
6528
                  11)
6529
6530
          static DecodeStatus
6531
  DecodeBFAfterTargetOperand(MCInst *Inst, unsigned Val, uint64_t Address,
6532
           const void *Decoder)
6533
17
{
6534
17
  uint64_t LocImm = MCOperand_getImm(MCInst_getOperand(Inst, (0)));
6535
17
  Val = LocImm + (2 << Val);
6536
17
  if (!tryAddingSymbolicOperand(Address, Address + Val + 4, true, 4, Inst,
6537
17
              Decoder))
6538
17
    MCOperand_CreateImm0(Inst, (Val));
6539
17
  return MCDisassembler_Success;
6540
17
}
6541
6542
static DecodeStatus DecodePredNoALOperand(MCInst *Inst, unsigned Val,
6543
            uint64_t Address, const void *Decoder)
6544
1.62k
{
6545
1.62k
  if (Val >= ARMCC_AL) // also exclude the non-condition NV
6546
2
    return MCDisassembler_Fail;
6547
1.62k
  MCOperand_CreateImm0(Inst, (Val));
6548
1.62k
  return MCDisassembler_Success;
6549
1.62k
}
6550
6551
static DecodeStatus DecodeLOLoop(MCInst *Inst, unsigned Insn, uint64_t Address,
6552
         const void *Decoder)
6553
2.65k
{
6554
2.65k
  DecodeStatus S = MCDisassembler_Success;
6555
6556
2.65k
  if (MCInst_getOpcode(Inst) == ARM_MVE_LCTP)
6557
0
    return S;
6558
6559
2.65k
  unsigned Imm = fieldFromInstruction_4(Insn, 11, 1) |
6560
2.65k
           fieldFromInstruction_4(Insn, 1, 10) << 1;
6561
2.65k
  switch (MCInst_getOpcode(Inst)) {
6562
90
  case ARM_t2LEUpdate:
6563
157
  case ARM_MVE_LETP:
6564
157
    MCOperand_CreateReg0(Inst, (ARM_LR));
6565
157
    MCOperand_CreateReg0(Inst, (ARM_LR));
6566
    // fall through
6567
175
  case ARM_t2LE:
6568
175
    if (!Check(&S, CONCAT(DecodeBFLabelOperand,
6569
175
              CONCAT(false,
6570
175
               CONCAT(true, CONCAT(true, 11))))(
6571
175
               Inst, Imm, Address, Decoder)))
6572
0
      return MCDisassembler_Fail;
6573
175
    break;
6574
175
  case ARM_t2WLS:
6575
259
  case ARM_MVE_WLSTP_8:
6576
287
  case ARM_MVE_WLSTP_16:
6577
368
  case ARM_MVE_WLSTP_32:
6578
584
  case ARM_MVE_WLSTP_64:
6579
584
    MCOperand_CreateReg0(Inst, (ARM_LR));
6580
584
    if (!Check(&S,
6581
584
         DecoderGPRRegisterClass(
6582
584
           Inst, fieldFromInstruction_4(Insn, 16, 4),
6583
584
           Address, Decoder)) ||
6584
584
        !Check(&S, CONCAT(DecodeBFLabelOperand,
6585
584
              CONCAT(false,
6586
584
               CONCAT(false, CONCAT(true, 11))))(
6587
584
               Inst, Imm, Address, Decoder)))
6588
0
      return MCDisassembler_Fail;
6589
584
    break;
6590
584
  case ARM_t2DLS:
6591
891
  case ARM_MVE_DLSTP_8:
6592
971
  case ARM_MVE_DLSTP_16:
6593
1.03k
  case ARM_MVE_DLSTP_32:
6594
1.89k
  case ARM_MVE_DLSTP_64: {
6595
1.89k
    unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6596
1.89k
    if (Rn == 0xF) {
6597
      // Enforce all the rest of the instruction bits in LCTP, which
6598
      // won't have been reliably checked based on LCTP's own tablegen
6599
      // record, because we came to this decode by a roundabout route.
6600
348
      uint32_t CanonicalLCTP = 0xF00FE001,
6601
348
         SBZMask = 0x00300FFE;
6602
348
      if ((Insn & ~SBZMask) != CanonicalLCTP)
6603
1
        return MCDisassembler_Fail; // a mandatory bit is wrong: hard
6604
          // fail
6605
347
      if (Insn != CanonicalLCTP)
6606
11
        Check(&S,
6607
11
              MCDisassembler_SoftFail); // an SBZ bit is wrong: soft fail
6608
6609
347
      MCInst_setOpcode(Inst, (ARM_MVE_LCTP));
6610
1.55k
    } else {
6611
1.55k
      MCOperand_CreateReg0(Inst, (ARM_LR));
6612
1.55k
      if (!Check(&S,
6613
1.55k
           DecoderGPRRegisterClass(
6614
1.55k
             Inst,
6615
1.55k
             fieldFromInstruction_4(Insn, 16, 4),
6616
1.55k
             Address, Decoder)))
6617
0
        return MCDisassembler_Fail;
6618
1.55k
    }
6619
1.89k
    break;
6620
1.89k
  }
6621
2.65k
  }
6622
2.65k
  return S;
6623
2.65k
}
6624
6625
static DecodeStatus DecodeLongShiftOperand(MCInst *Inst, unsigned Val,
6626
             uint64_t Address,
6627
             const void *Decoder)
6628
158
{
6629
158
  DecodeStatus S = MCDisassembler_Success;
6630
6631
158
  if (Val == 0)
6632
75
    Val = 32;
6633
6634
158
  MCOperand_CreateImm0(Inst, (Val));
6635
6636
158
  return S;
6637
158
}
6638
6639
static DecodeStatus DecodetGPROddRegisterClass(MCInst *Inst, unsigned RegNo,
6640
                 uint64_t Address,
6641
                 const void *Decoder)
6642
5.90k
{
6643
5.90k
  if ((RegNo) + 1 > 11)
6644
593
    return MCDisassembler_Fail;
6645
6646
5.31k
  unsigned Register = GPRDecoderTable[(RegNo) + 1];
6647
5.31k
  MCOperand_CreateReg0(Inst, (Register));
6648
5.31k
  return MCDisassembler_Success;
6649
5.90k
}
6650
6651
static DecodeStatus DecodetGPREvenRegisterClass(MCInst *Inst, unsigned RegNo,
6652
            uint64_t Address,
6653
            const void *Decoder)
6654
7.35k
{
6655
7.35k
  if ((RegNo) > 14)
6656
0
    return MCDisassembler_Fail;
6657
6658
7.35k
  unsigned Register = GPRDecoderTable[(RegNo)];
6659
7.35k
  MCOperand_CreateReg0(Inst, (Register));
6660
7.35k
  return MCDisassembler_Success;
6661
7.35k
}
6662
6663
static DecodeStatus DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst *Inst,
6664
                  unsigned RegNo,
6665
                  uint64_t Address,
6666
                  const void *Decoder)
6667
0
{
6668
0
  if (RegNo == 15) {
6669
0
    MCOperand_CreateReg0(Inst, (ARM_APSR_NZCV));
6670
0
    return MCDisassembler_Success;
6671
0
  }
6672
6673
0
  unsigned Register = GPRDecoderTable[RegNo];
6674
0
  MCOperand_CreateReg0(Inst, (Register));
6675
6676
0
  if (RegNo == 13)
6677
0
    return MCDisassembler_SoftFail;
6678
6679
0
  return MCDisassembler_Success;
6680
0
}
6681
6682
static DecodeStatus DecodeVSCCLRM(MCInst *Inst, unsigned Insn, uint64_t Address,
6683
          const void *Decoder)
6684
540
{
6685
540
  DecodeStatus S = MCDisassembler_Success;
6686
6687
540
  MCOperand_CreateImm0(Inst, (ARMCC_AL));
6688
540
  MCOperand_CreateReg0(Inst, (0));
6689
540
  if (MCInst_getOpcode(Inst) == ARM_VSCCLRMD) {
6690
342
    unsigned reglist = (fieldFromInstruction_4(Insn, 1, 7) << 1) |
6691
342
           (fieldFromInstruction_4(Insn, 12, 4) << 8) |
6692
342
           (fieldFromInstruction_4(Insn, 22, 1) << 12);
6693
342
    if (!Check(&S, DecodeDPRRegListOperand(Inst, reglist, Address,
6694
342
                   Decoder))) {
6695
0
      return MCDisassembler_Fail;
6696
0
    }
6697
342
  } else {
6698
198
    unsigned reglist = fieldFromInstruction_4(Insn, 0, 8) |
6699
198
           (fieldFromInstruction_4(Insn, 22, 1) << 8) |
6700
198
           (fieldFromInstruction_4(Insn, 12, 4) << 9);
6701
198
    if (!Check(&S, DecodeSPRRegListOperand(Inst, reglist, Address,
6702
198
                   Decoder))) {
6703
0
      return MCDisassembler_Fail;
6704
0
    }
6705
198
  }
6706
540
  MCOperand_CreateReg0(Inst, (ARM_VPR));
6707
6708
540
  return S;
6709
540
}
6710
6711
static DecodeStatus DecodeMQPRRegisterClass(MCInst *Inst, unsigned RegNo,
6712
              uint64_t Address,
6713
              const void *Decoder)
6714
87.6k
{
6715
87.6k
  if (RegNo > 7)
6716
14.0k
    return MCDisassembler_Fail;
6717
6718
73.5k
  unsigned Register = QPRDecoderTable[RegNo];
6719
73.5k
  MCOperand_CreateReg0(Inst, (Register));
6720
73.5k
  return MCDisassembler_Success;
6721
87.6k
}
6722
6723
static const uint16_t QQPRDecoderTable[] = { ARM_Q0_Q1, ARM_Q1_Q2, ARM_Q2_Q3,
6724
               ARM_Q3_Q4, ARM_Q4_Q5, ARM_Q5_Q6,
6725
               ARM_Q6_Q7 };
6726
6727
static DecodeStatus DecodeMQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
6728
               uint64_t Address,
6729
               const void *Decoder)
6730
429
{
6731
429
  if (RegNo > 6)
6732
122
    return MCDisassembler_Fail;
6733
6734
307
  unsigned Register = QQPRDecoderTable[RegNo];
6735
307
  MCOperand_CreateReg0(Inst, (Register));
6736
307
  return MCDisassembler_Success;
6737
429
}
6738
6739
static const uint16_t QQQQPRDecoderTable[] = { ARM_Q0_Q1_Q2_Q3, ARM_Q1_Q2_Q3_Q4,
6740
                 ARM_Q2_Q3_Q4_Q5, ARM_Q3_Q4_Q5_Q6,
6741
                 ARM_Q4_Q5_Q6_Q7 };
6742
6743
static DecodeStatus DecodeMQQQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
6744
                 uint64_t Address,
6745
                 const void *Decoder)
6746
2.88k
{
6747
2.88k
  if (RegNo > 4)
6748
306
    return MCDisassembler_Fail;
6749
6750
2.57k
  unsigned Register = QQQQPRDecoderTable[RegNo];
6751
2.57k
  MCOperand_CreateReg0(Inst, (Register));
6752
2.57k
  return MCDisassembler_Success;
6753
2.88k
}
6754
6755
static DecodeStatus DecodeVPTMaskOperand(MCInst *Inst, unsigned Val,
6756
           uint64_t Address, const void *Decoder)
6757
10.4k
{
6758
10.4k
  DecodeStatus S = MCDisassembler_Success;
6759
6760
  // Parse VPT mask and encode it in the MCInst as an immediate with the same
6761
  // format as the it_mask.  That is, from the second 'e|t' encode 'e' as 1
6762
  // and 't' as 0 and finish with a 1.
6763
10.4k
  unsigned Imm = 0;
6764
  // We always start with a 't'.
6765
10.4k
  unsigned CurBit = 0;
6766
38.4k
  for (int i = 3; i >= 0; --i) {
6767
    // If the bit we are looking at is not the same as last one, invert the
6768
    // CurBit, if it is the same leave it as is.
6769
38.4k
    CurBit ^= (Val >> i) & 1U;
6770
6771
    // Encode the CurBit at the right place in the immediate.
6772
38.4k
    Imm |= (CurBit << i);
6773
6774
    // If we are done, finish the encoding with a 1.
6775
38.4k
    if ((Val & ~(~0U << i)) == 0) {
6776
10.4k
      Imm |= 1U << i;
6777
10.4k
      break;
6778
10.4k
    }
6779
38.4k
  }
6780
6781
10.4k
  MCOperand_CreateImm0(Inst, (Imm));
6782
6783
10.4k
  return S;
6784
10.4k
}
6785
6786
static DecodeStatus DecodeVpredROperand(MCInst *Inst, unsigned RegNo,
6787
          uint64_t Address, const void *Decoder)
6788
4.27k
{
6789
  // The vpred_r operand type includes an MQPR register field derived
6790
  // from the encoding. But we don't actually want to add an operand
6791
  // to the MCInst at this stage, because AddThumbPredicate will do it
6792
  // later, and will infer the register number from the TIED_TO
6793
  // constraint. So this is a deliberately empty decoder method that
6794
  // will inhibit the auto-generated disassembly code from adding an
6795
  // operand at all.
6796
4.27k
  return MCDisassembler_Success;
6797
4.27k
}
6798
6799
static DecodeStatus DecodeRestrictedIPredicateOperand(MCInst *Inst,
6800
                  unsigned Val,
6801
                  uint64_t Address,
6802
                  const void *Decoder)
6803
2.66k
{
6804
2.66k
  MCOperand_CreateImm0(Inst, ((Val & 0x1) == 0 ? ARMCC_EQ : ARMCC_NE));
6805
2.66k
  return MCDisassembler_Success;
6806
2.66k
}
6807
6808
static DecodeStatus DecodeRestrictedSPredicateOperand(MCInst *Inst,
6809
                  unsigned Val,
6810
                  uint64_t Address,
6811
                  const void *Decoder)
6812
2.66k
{
6813
2.66k
  unsigned Code;
6814
2.66k
  switch (Val & 0x3) {
6815
760
  case 0:
6816
760
    Code = ARMCC_GE;
6817
760
    break;
6818
10
  case 1:
6819
10
    Code = ARMCC_LT;
6820
10
    break;
6821
1.24k
  case 2:
6822
1.24k
    Code = ARMCC_GT;
6823
1.24k
    break;
6824
652
  case 3:
6825
652
    Code = ARMCC_LE;
6826
652
    break;
6827
2.66k
  }
6828
2.66k
  MCOperand_CreateImm0(Inst, (Code));
6829
2.66k
  return MCDisassembler_Success;
6830
2.66k
}
6831
6832
static DecodeStatus DecodeRestrictedUPredicateOperand(MCInst *Inst,
6833
                  unsigned Val,
6834
                  uint64_t Address,
6835
                  const void *Decoder)
6836
3.55k
{
6837
3.55k
  MCOperand_CreateImm0(Inst, ((Val & 0x1) == 0 ? ARMCC_HS : ARMCC_HI));
6838
3.55k
  return MCDisassembler_Success;
6839
3.55k
}
6840
6841
static DecodeStatus DecodeRestrictedFPPredicateOperand(MCInst *Inst,
6842
                   unsigned Val,
6843
                   uint64_t Address,
6844
                   const void *Decoder)
6845
2.96k
{
6846
2.96k
  unsigned Code;
6847
2.96k
  switch (Val) {
6848
396
  default:
6849
396
    return MCDisassembler_Fail;
6850
543
  case 0:
6851
543
    Code = ARMCC_EQ;
6852
543
    break;
6853
375
  case 1:
6854
375
    Code = ARMCC_NE;
6855
375
    break;
6856
1.47k
  case 4:
6857
1.47k
    Code = ARMCC_GE;
6858
1.47k
    break;
6859
45
  case 5:
6860
45
    Code = ARMCC_LT;
6861
45
    break;
6862
123
  case 6:
6863
123
    Code = ARMCC_GT;
6864
123
    break;
6865
13
  case 7:
6866
13
    Code = ARMCC_LE;
6867
13
    break;
6868
2.96k
  }
6869
6870
2.57k
  MCOperand_CreateImm0(Inst, (Code));
6871
2.57k
  return MCDisassembler_Success;
6872
2.96k
}
6873
6874
static DecodeStatus DecodeVCVTImmOperand(MCInst *Inst, unsigned Val,
6875
           uint64_t Address, const void *Decoder)
6876
770
{
6877
770
  DecodeStatus S = MCDisassembler_Success;
6878
6879
770
  unsigned DecodedVal = 64 - Val;
6880
6881
770
  switch (MCInst_getOpcode(Inst)) {
6882
37
  case ARM_MVE_VCVTf16s16_fix:
6883
61
  case ARM_MVE_VCVTs16f16_fix:
6884
79
  case ARM_MVE_VCVTf16u16_fix:
6885
174
  case ARM_MVE_VCVTu16f16_fix:
6886
174
    if (DecodedVal > 16)
6887
0
      return MCDisassembler_Fail;
6888
174
    break;
6889
174
  case ARM_MVE_VCVTf32s32_fix:
6890
42
  case ARM_MVE_VCVTs32f32_fix:
6891
53
  case ARM_MVE_VCVTf32u32_fix:
6892
596
  case ARM_MVE_VCVTu32f32_fix:
6893
596
    if (DecodedVal > 32)
6894
0
      return MCDisassembler_Fail;
6895
596
    break;
6896
770
  }
6897
6898
770
  MCOperand_CreateImm0(Inst, (64 - Val));
6899
6900
770
  return S;
6901
770
}
6902
6903
static unsigned FixedRegForVSTRVLDR_SYSREG(unsigned Opcode)
6904
1.74k
{
6905
1.74k
  switch (Opcode) {
6906
0
  case ARM_VSTR_P0_off:
6907
0
  case ARM_VSTR_P0_pre:
6908
0
  case ARM_VSTR_P0_post:
6909
0
  case ARM_VLDR_P0_off:
6910
0
  case ARM_VLDR_P0_pre:
6911
0
  case ARM_VLDR_P0_post:
6912
0
    return ARM_P0;
6913
1.74k
  default:
6914
1.74k
    return 0;
6915
1.74k
  }
6916
1.74k
}
6917
6918
#define DEFINE_DecodeVSTRVLDR_SYSREG(Writeback) \
6919
  static DecodeStatus CONCAT(DecodeVSTRVLDR_SYSREG, Writeback)( \
6920
    MCInst * Inst, unsigned Val, uint64_t Address, \
6921
    const void *Decoder) \
6922
1.74k
  { \
6923
1.74k
    switch (MCInst_getOpcode(Inst)) { \
6924
284
    case ARM_VSTR_FPSCR_pre: \
6925
297
    case ARM_VSTR_FPSCR_NZCVQC_pre: \
6926
307
    case ARM_VLDR_FPSCR_pre: \
6927
383
    case ARM_VLDR_FPSCR_NZCVQC_pre: \
6928
429
    case ARM_VSTR_FPSCR_off: \
6929
515
    case ARM_VSTR_FPSCR_NZCVQC_off: \
6930
533
    case ARM_VLDR_FPSCR_off: \
6931
550
    case ARM_VLDR_FPSCR_NZCVQC_off: \
6932
642
    case ARM_VSTR_FPSCR_post: \
6933
677
    case ARM_VSTR_FPSCR_NZCVQC_post: \
6934
688
    case ARM_VLDR_FPSCR_post: \
6935
732
    case ARM_VLDR_FPSCR_NZCVQC_post: \
6936
732
\
6937
732
      if (!ARM_getFeatureBits(Inst->csh->mode, \
6938
732
            ARM_HasMVEIntegerOps) && \
6939
732
          !ARM_getFeatureBits(Inst->csh->mode, \
6940
732
            ARM_FeatureVFP2)) \
6941
732
        return MCDisassembler_Fail; \
6942
1.74k
    } \
6943
1.74k
\
6944
1.74k
    DecodeStatus S = MCDisassembler_Success; \
6945
1.74k
    unsigned Sysreg = \
6946
1.74k
      FixedRegForVSTRVLDR_SYSREG(MCInst_getOpcode(Inst)); \
6947
1.74k
    if (Sysreg) \
6948
1.74k
      MCOperand_CreateReg0(Inst, (Sysreg)); \
6949
1.74k
    unsigned Rn = fieldFromInstruction_4(Val, 16, 4); \
6950
1.74k
    unsigned addr = fieldFromInstruction_4(Val, 0, 7) | \
6951
1.74k
        (fieldFromInstruction_4(Val, 23, 1) << 7) | \
6952
1.74k
        (Rn << 8); \
6953
1.74k
\
6954
1.74k
    if (Writeback) { \
6955
1.28k
      if (!Check(&S, DecodeGPRnopcRegisterClass( \
6956
1.28k
                 Inst, Rn, Address, Decoder))) \
6957
1.28k
        return MCDisassembler_Fail; \
6958
1.28k
    } \
6959
1.74k
    if (!Check(&S, DecodeT2AddrModeImm7s4(Inst, addr, Address, \
6960
1.74k
                  Decoder))) \
6961
1.74k
      return MCDisassembler_Fail; \
6962
1.74k
\
6963
1.74k
    MCOperand_CreateImm0(Inst, (ARMCC_AL)); \
6964
1.74k
    MCOperand_CreateReg0(Inst, (0)); \
6965
1.74k
\
6966
1.74k
    return S; \
6967
1.74k
  }
ARMDisassembler.c:DecodeVSTRVLDR_SYSREG_0
Line
Count
Source
6922
456
  { \
6923
456
    switch (MCInst_getOpcode(Inst)) { \
6924
0
    case ARM_VSTR_FPSCR_pre: \
6925
0
    case ARM_VSTR_FPSCR_NZCVQC_pre: \
6926
0
    case ARM_VLDR_FPSCR_pre: \
6927
0
    case ARM_VLDR_FPSCR_NZCVQC_pre: \
6928
46
    case ARM_VSTR_FPSCR_off: \
6929
132
    case ARM_VSTR_FPSCR_NZCVQC_off: \
6930
150
    case ARM_VLDR_FPSCR_off: \
6931
167
    case ARM_VLDR_FPSCR_NZCVQC_off: \
6932
167
    case ARM_VSTR_FPSCR_post: \
6933
167
    case ARM_VSTR_FPSCR_NZCVQC_post: \
6934
167
    case ARM_VLDR_FPSCR_post: \
6935
167
    case ARM_VLDR_FPSCR_NZCVQC_post: \
6936
167
\
6937
167
      if (!ARM_getFeatureBits(Inst->csh->mode, \
6938
167
            ARM_HasMVEIntegerOps) && \
6939
167
          !ARM_getFeatureBits(Inst->csh->mode, \
6940
167
            ARM_FeatureVFP2)) \
6941
167
        return MCDisassembler_Fail; \
6942
456
    } \
6943
456
\
6944
456
    DecodeStatus S = MCDisassembler_Success; \
6945
456
    unsigned Sysreg = \
6946
456
      FixedRegForVSTRVLDR_SYSREG(MCInst_getOpcode(Inst)); \
6947
456
    if (Sysreg) \
6948
456
      MCOperand_CreateReg0(Inst, (Sysreg)); \
6949
456
    unsigned Rn = fieldFromInstruction_4(Val, 16, 4); \
6950
456
    unsigned addr = fieldFromInstruction_4(Val, 0, 7) | \
6951
456
        (fieldFromInstruction_4(Val, 23, 1) << 7) | \
6952
456
        (Rn << 8); \
6953
456
\
6954
456
    if (Writeback) { \
6955
0
      if (!Check(&S, DecodeGPRnopcRegisterClass( \
6956
0
                 Inst, Rn, Address, Decoder))) \
6957
0
        return MCDisassembler_Fail; \
6958
0
    } \
6959
456
    if (!Check(&S, DecodeT2AddrModeImm7s4(Inst, addr, Address, \
6960
456
                  Decoder))) \
6961
456
      return MCDisassembler_Fail; \
6962
456
\
6963
456
    MCOperand_CreateImm0(Inst, (ARMCC_AL)); \
6964
456
    MCOperand_CreateReg0(Inst, (0)); \
6965
456
\
6966
456
    return S; \
6967
456
  }
ARMDisassembler.c:DecodeVSTRVLDR_SYSREG_1
Line
Count
Source
6922
1.28k
  { \
6923
1.28k
    switch (MCInst_getOpcode(Inst)) { \
6924
284
    case ARM_VSTR_FPSCR_pre: \
6925
297
    case ARM_VSTR_FPSCR_NZCVQC_pre: \
6926
307
    case ARM_VLDR_FPSCR_pre: \
6927
383
    case ARM_VLDR_FPSCR_NZCVQC_pre: \
6928
383
    case ARM_VSTR_FPSCR_off: \
6929
383
    case ARM_VSTR_FPSCR_NZCVQC_off: \
6930
383
    case ARM_VLDR_FPSCR_off: \
6931
383
    case ARM_VLDR_FPSCR_NZCVQC_off: \
6932
475
    case ARM_VSTR_FPSCR_post: \
6933
510
    case ARM_VSTR_FPSCR_NZCVQC_post: \
6934
521
    case ARM_VLDR_FPSCR_post: \
6935
565
    case ARM_VLDR_FPSCR_NZCVQC_post: \
6936
565
\
6937
565
      if (!ARM_getFeatureBits(Inst->csh->mode, \
6938
565
            ARM_HasMVEIntegerOps) && \
6939
565
          !ARM_getFeatureBits(Inst->csh->mode, \
6940
565
            ARM_FeatureVFP2)) \
6941
565
        return MCDisassembler_Fail; \
6942
1.28k
    } \
6943
1.28k
\
6944
1.28k
    DecodeStatus S = MCDisassembler_Success; \
6945
1.28k
    unsigned Sysreg = \
6946
1.28k
      FixedRegForVSTRVLDR_SYSREG(MCInst_getOpcode(Inst)); \
6947
1.28k
    if (Sysreg) \
6948
1.28k
      MCOperand_CreateReg0(Inst, (Sysreg)); \
6949
1.28k
    unsigned Rn = fieldFromInstruction_4(Val, 16, 4); \
6950
1.28k
    unsigned addr = fieldFromInstruction_4(Val, 0, 7) | \
6951
1.28k
        (fieldFromInstruction_4(Val, 23, 1) << 7) | \
6952
1.28k
        (Rn << 8); \
6953
1.28k
\
6954
1.28k
    if (Writeback) { \
6955
1.28k
      if (!Check(&S, DecodeGPRnopcRegisterClass( \
6956
1.28k
                 Inst, Rn, Address, Decoder))) \
6957
1.28k
        return MCDisassembler_Fail; \
6958
1.28k
    } \
6959
1.28k
    if (!Check(&S, DecodeT2AddrModeImm7s4(Inst, addr, Address, \
6960
1.28k
                  Decoder))) \
6961
1.28k
      return MCDisassembler_Fail; \
6962
1.28k
\
6963
1.28k
    MCOperand_CreateImm0(Inst, (ARMCC_AL)); \
6964
1.28k
    MCOperand_CreateReg0(Inst, (0)); \
6965
1.28k
\
6966
1.28k
    return S; \
6967
1.28k
  }
6968
DEFINE_DecodeVSTRVLDR_SYSREG(false) DEFINE_DecodeVSTRVLDR_SYSREG(true)
6969
6970
  static inline DecodeStatus
6971
  DecodeMVE_MEM_pre(MCInst *Inst, unsigned Val, uint64_t Address,
6972
        const void *Decoder, unsigned Rn,
6973
        OperandDecoder RnDecoder, OperandDecoder AddrDecoder)
6974
4.46k
{
6975
4.46k
  DecodeStatus S = MCDisassembler_Success;
6976
6977
4.46k
  unsigned Qd = fieldFromInstruction_4(Val, 13, 3);
6978
4.46k
  unsigned addr = fieldFromInstruction_4(Val, 0, 7) |
6979
4.46k
      (fieldFromInstruction_4(Val, 23, 1) << 7) | (Rn << 8);
6980
6981
4.46k
  if (!Check(&S, RnDecoder(Inst, Rn, Address, Decoder)))
6982
0
    return MCDisassembler_Fail;
6983
4.46k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
6984
0
    return MCDisassembler_Fail;
6985
4.46k
  if (!Check(&S, AddrDecoder(Inst, addr, Address, Decoder)))
6986
0
    return MCDisassembler_Fail;
6987
6988
4.46k
  return S;
6989
4.46k
}
6990
6991
#define DEFINE_DecodeMVE_MEM_1_pre(shift) \
6992
  static DecodeStatus CONCAT(DecodeMVE_MEM_1_pre, shift)( \
6993
    MCInst * Inst, unsigned Val, uint64_t Address, \
6994
    const void *Decoder) \
6995
871
  { \
6996
871
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6997
871
           fieldFromInstruction_4(Val, 16, 3), \
6998
871
           DecodetGPRRegisterClass, \
6999
871
           CONCAT(DecodeTAddrModeImm7, shift)); \
7000
871
  }
ARMDisassembler.c:DecodeMVE_MEM_1_pre_0
Line
Count
Source
6995
375
  { \
6996
375
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6997
375
           fieldFromInstruction_4(Val, 16, 3), \
6998
375
           DecodetGPRRegisterClass, \
6999
375
           CONCAT(DecodeTAddrModeImm7, shift)); \
7000
375
  }
ARMDisassembler.c:DecodeMVE_MEM_1_pre_1
Line
Count
Source
6995
496
  { \
6996
496
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6997
496
           fieldFromInstruction_4(Val, 16, 3), \
6998
496
           DecodetGPRRegisterClass, \
6999
496
           CONCAT(DecodeTAddrModeImm7, shift)); \
7000
496
  }
7001
DEFINE_DecodeMVE_MEM_1_pre(0) DEFINE_DecodeMVE_MEM_1_pre(1)
7002
7003
#define DEFINE_DecodeMVE_MEM_2_pre(shift) \
7004
  static DecodeStatus CONCAT(DecodeMVE_MEM_2_pre, shift)( \
7005
    MCInst * Inst, unsigned Val, uint64_t Address, \
7006
    const void *Decoder) \
7007
3.16k
  { \
7008
3.16k
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7009
3.16k
           fieldFromInstruction_4(Val, 16, 4), \
7010
3.16k
           DecoderGPRRegisterClass, \
7011
3.16k
           CONCAT(DecodeT2AddrModeImm7, \
7012
3.16k
            CONCAT(shift, 1))); \
7013
3.16k
  }
ARMDisassembler.c:DecodeMVE_MEM_2_pre_0
Line
Count
Source
7007
785
  { \
7008
785
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7009
785
           fieldFromInstruction_4(Val, 16, 4), \
7010
785
           DecoderGPRRegisterClass, \
7011
785
           CONCAT(DecodeT2AddrModeImm7, \
7012
785
            CONCAT(shift, 1))); \
7013
785
  }
ARMDisassembler.c:DecodeMVE_MEM_2_pre_1
Line
Count
Source
7007
1.28k
  { \
7008
1.28k
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7009
1.28k
           fieldFromInstruction_4(Val, 16, 4), \
7010
1.28k
           DecoderGPRRegisterClass, \
7011
1.28k
           CONCAT(DecodeT2AddrModeImm7, \
7012
1.28k
            CONCAT(shift, 1))); \
7013
1.28k
  }
ARMDisassembler.c:DecodeMVE_MEM_2_pre_2
Line
Count
Source
7007
1.08k
  { \
7008
1.08k
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7009
1.08k
           fieldFromInstruction_4(Val, 16, 4), \
7010
1.08k
           DecoderGPRRegisterClass, \
7011
1.08k
           CONCAT(DecodeT2AddrModeImm7, \
7012
1.08k
            CONCAT(shift, 1))); \
7013
1.08k
  }
7014
  DEFINE_DecodeMVE_MEM_2_pre(0) DEFINE_DecodeMVE_MEM_2_pre(
7015
    1) DEFINE_DecodeMVE_MEM_2_pre(2)
7016
7017
#define DEFINE_DecodeMVE_MEM_3_pre(shift) \
7018
  static DecodeStatus CONCAT(DecodeMVE_MEM_3_pre, shift)( \
7019
    MCInst * Inst, unsigned Val, uint64_t Address, \
7020
    const void *Decoder) \
7021
434
  { \
7022
434
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7023
434
           fieldFromInstruction_4(Val, 17, 3), \
7024
434
           DecodeMQPRRegisterClass, \
7025
434
           CONCAT(DecodeMveAddrModeQ, shift)); \
7026
434
  }
ARMDisassembler.c:DecodeMVE_MEM_3_pre_2
Line
Count
Source
7021
229
  { \
7022
229
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7023
229
           fieldFromInstruction_4(Val, 17, 3), \
7024
229
           DecodeMQPRRegisterClass, \
7025
229
           CONCAT(DecodeMveAddrModeQ, shift)); \
7026
229
  }
ARMDisassembler.c:DecodeMVE_MEM_3_pre_3
Line
Count
Source
7021
205
  { \
7022
205
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
7023
205
           fieldFromInstruction_4(Val, 17, 3), \
7024
205
           DecodeMQPRRegisterClass, \
7025
205
           CONCAT(DecodeMveAddrModeQ, shift)); \
7026
205
  }
7027
    DEFINE_DecodeMVE_MEM_3_pre(2) DEFINE_DecodeMVE_MEM_3_pre(3)
7028
7029
#define DEFINE_DecodePowerTwoOperand(MinLog, MaxLog) \
7030
  static DecodeStatus CONCAT(DecodePowerTwoOperand, \
7031
           CONCAT(MinLog, MaxLog))( \
7032
    MCInst * Inst, unsigned Val, uint64_t Address, \
7033
    const void *Decoder) \
7034
510
  { \
7035
510
    DecodeStatus S = MCDisassembler_Success; \
7036
510
\
7037
510
    if (Val < MinLog || Val > MaxLog) \
7038
510
      return MCDisassembler_Fail; \
7039
510
\
7040
510
    MCOperand_CreateImm0(Inst, (1LL << Val)); \
7041
510
    return S; \
7042
510
  }
7043
      DEFINE_DecodePowerTwoOperand(0, 3)
7044
7045
#define DEFINE_DecodeMVEPairVectorIndexOperand(start) \
7046
  static DecodeStatus CONCAT(DecodeMVEPairVectorIndexOperand, start)( \
7047
    MCInst * Inst, unsigned Val, uint64_t Address, \
7048
    const void *Decoder) \
7049
0
  { \
7050
0
    DecodeStatus S = MCDisassembler_Success; \
7051
0
\
7052
0
    MCOperand_CreateImm0(Inst, (start + Val)); \
7053
0
\
7054
0
    return S; \
7055
0
  }
Unexecuted instantiation: ARMDisassembler.c:DecodeMVEPairVectorIndexOperand_2
Unexecuted instantiation: ARMDisassembler.c:DecodeMVEPairVectorIndexOperand_0
7056
        DEFINE_DecodeMVEPairVectorIndexOperand(2)
7057
          DEFINE_DecodeMVEPairVectorIndexOperand(0)
7058
7059
            static DecodeStatus
7060
  DecodeMVEVMOVQtoDReg(MCInst *Inst, unsigned Insn, uint64_t Address,
7061
           const void *Decoder)
7062
0
{
7063
0
  DecodeStatus S = MCDisassembler_Success;
7064
0
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
7065
0
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
7066
0
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
7067
0
           fieldFromInstruction_4(Insn, 13, 3));
7068
0
  unsigned index = fieldFromInstruction_4(Insn, 4, 1);
7069
7070
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
7071
0
    return MCDisassembler_Fail;
7072
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
7073
0
    return MCDisassembler_Fail;
7074
0
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7075
0
    return MCDisassembler_Fail;
7076
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7077
0
            2)(Inst, index, Address, Decoder)))
7078
0
    return MCDisassembler_Fail;
7079
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7080
0
            0)(Inst, index, Address, Decoder)))
7081
0
    return MCDisassembler_Fail;
7082
7083
0
  return S;
7084
0
}
7085
7086
static DecodeStatus DecodeMVEVMOVDRegtoQ(MCInst *Inst, unsigned Insn,
7087
           uint64_t Address, const void *Decoder)
7088
0
{
7089
0
  DecodeStatus S = MCDisassembler_Success;
7090
0
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
7091
0
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
7092
0
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
7093
0
           fieldFromInstruction_4(Insn, 13, 3));
7094
0
  unsigned index = fieldFromInstruction_4(Insn, 4, 1);
7095
7096
0
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7097
0
    return MCDisassembler_Fail;
7098
0
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7099
0
    return MCDisassembler_Fail;
7100
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
7101
0
    return MCDisassembler_Fail;
7102
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
7103
0
    return MCDisassembler_Fail;
7104
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7105
0
            2)(Inst, index, Address, Decoder)))
7106
0
    return MCDisassembler_Fail;
7107
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7108
0
            0)(Inst, index, Address, Decoder)))
7109
0
    return MCDisassembler_Fail;
7110
7111
0
  return S;
7112
0
}
7113
7114
static DecodeStatus DecodeMVEOverlappingLongShift(MCInst *Inst, unsigned Insn,
7115
              uint64_t Address,
7116
              const void *Decoder)
7117
0
{
7118
0
  DecodeStatus S = MCDisassembler_Success;
7119
7120
0
  unsigned RdaLo = fieldFromInstruction_4(Insn, 17, 3) << 1;
7121
0
  unsigned RdaHi = fieldFromInstruction_4(Insn, 9, 3) << 1;
7122
0
  unsigned Rm = fieldFromInstruction_4(Insn, 12, 4);
7123
7124
0
  if (RdaHi == 14) {
7125
    // This value of RdaHi (really indicating pc, because RdaHi has to
7126
    // be an odd-numbered register, so the low bit will be set by the
7127
    // decode function below) indicates that we must decode as SQRSHR
7128
    // or UQRSHL, which both have a single Rda register field with all
7129
    // four bits.
7130
0
    unsigned Rda = fieldFromInstruction_4(Insn, 16, 4);
7131
7132
0
    switch (MCInst_getOpcode(Inst)) {
7133
0
    case ARM_MVE_ASRLr:
7134
0
    case ARM_MVE_SQRSHRL:
7135
0
      MCInst_setOpcode(Inst, (ARM_MVE_SQRSHR));
7136
0
      break;
7137
0
    case ARM_MVE_LSLLr:
7138
0
    case ARM_MVE_UQRSHLL:
7139
0
      MCInst_setOpcode(Inst, (ARM_MVE_UQRSHL));
7140
0
      break;
7141
0
    default:
7142
      // llvm_unreachable("Unexpected starting opcode!");
7143
0
      break;
7144
0
    }
7145
7146
    // Rda as output parameter
7147
0
    if (!Check(&S, DecoderGPRRegisterClass(Inst, Rda, Address,
7148
0
                   Decoder)))
7149
0
      return MCDisassembler_Fail;
7150
7151
    // Rda again as input parameter
7152
0
    if (!Check(&S, DecoderGPRRegisterClass(Inst, Rda, Address,
7153
0
                   Decoder)))
7154
0
      return MCDisassembler_Fail;
7155
7156
    // Rm, the amount to shift by
7157
0
    if (!Check(&S,
7158
0
         DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
7159
0
      return MCDisassembler_Fail;
7160
7161
0
    if (fieldFromInstruction_4(Insn, 6, 3) != 4)
7162
0
      return MCDisassembler_SoftFail;
7163
7164
0
    if (Rda == Rm)
7165
0
      return MCDisassembler_SoftFail;
7166
7167
0
    return S;
7168
0
  }
7169
7170
  // Otherwise, we decode as whichever opcode our caller has already
7171
  // put into Inst. Those all look the same:
7172
7173
  // RdaLo,RdaHi as output parameters
7174
0
  if (!Check(&S,
7175
0
       DecodetGPREvenRegisterClass(Inst, RdaLo, Address, Decoder)))
7176
0
    return MCDisassembler_Fail;
7177
0
  if (!Check(&S,
7178
0
       DecodetGPROddRegisterClass(Inst, RdaHi, Address, Decoder)))
7179
0
    return MCDisassembler_Fail;
7180
7181
  // RdaLo,RdaHi again as input parameters
7182
0
  if (!Check(&S,
7183
0
       DecodetGPREvenRegisterClass(Inst, RdaLo, Address, Decoder)))
7184
0
    return MCDisassembler_Fail;
7185
0
  if (!Check(&S,
7186
0
       DecodetGPROddRegisterClass(Inst, RdaHi, Address, Decoder)))
7187
0
    return MCDisassembler_Fail;
7188
7189
  // Rm, the amount to shift by
7190
0
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
7191
0
    return MCDisassembler_Fail;
7192
7193
0
  if (MCInst_getOpcode(Inst) == ARM_MVE_SQRSHRL ||
7194
0
      MCInst_getOpcode(Inst) == ARM_MVE_UQRSHLL) {
7195
0
    unsigned Saturate = fieldFromInstruction_4(Insn, 7, 1);
7196
    // Saturate, the bit position for saturation
7197
0
    MCOperand_CreateImm0(Inst, (Saturate));
7198
0
  }
7199
7200
0
  return S;
7201
0
}
7202
7203
static DecodeStatus DecodeMVEVCVTt1fp(MCInst *Inst, unsigned Insn,
7204
              uint64_t Address, const void *Decoder)
7205
1.05k
{
7206
1.05k
  DecodeStatus S = MCDisassembler_Success;
7207
1.05k
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
7208
1.05k
           fieldFromInstruction_4(Insn, 13, 3));
7209
1.05k
  unsigned Qm = ((fieldFromInstruction_4(Insn, 5, 1) << 3) |
7210
1.05k
           fieldFromInstruction_4(Insn, 1, 3));
7211
1.05k
  unsigned imm6 = fieldFromInstruction_4(Insn, 16, 6);
7212
7213
1.05k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7214
137
    return MCDisassembler_Fail;
7215
917
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
7216
147
    return MCDisassembler_Fail;
7217
770
  if (!Check(&S, DecodeVCVTImmOperand(Inst, imm6, Address, Decoder)))
7218
0
    return MCDisassembler_Fail;
7219
7220
770
  return S;
7221
770
}
7222
7223
#define DEFINE_DecodeMVEVCMP(scalar, predicate_decoder) \
7224
  static DecodeStatus CONCAT(DecodeMVEVCMP, \
7225
           CONCAT(scalar, predicate_decoder))( \
7226
    MCInst * Inst, unsigned Insn, uint64_t Address, \
7227
    const void *Decoder) \
7228
3.69k
  { \
7229
3.69k
    DecodeStatus S = MCDisassembler_Success; \
7230
3.69k
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
3.69k
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
3.69k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
3.69k
                   Decoder))) \
7234
3.69k
      return MCDisassembler_Fail; \
7235
3.69k
\
7236
3.69k
    unsigned fc; \
7237
3.69k
\
7238
3.69k
    if (scalar) { \
7239
2.47k
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
2.47k
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
2.47k
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
2.47k
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
2.47k
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
2.47k
                 Inst, Rm, Address, Decoder))) \
7245
2.47k
        return MCDisassembler_Fail; \
7246
2.47k
    } else { \
7247
1.22k
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
1.22k
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
1.22k
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
1.22k
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
1.22k
                << 4 | \
7252
1.22k
              fieldFromInstruction_4(Insn, 1, 3); \
7253
1.22k
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
1.22k
                 Inst, Qm, Address, Decoder))) \
7255
1.22k
        return MCDisassembler_Fail; \
7256
1.22k
    } \
7257
3.69k
\
7258
3.69k
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
3.28k
      return MCDisassembler_Fail; \
7260
3.28k
\
7261
3.28k
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
3.12k
    MCOperand_CreateReg0(Inst, (0)); \
7263
3.12k
    MCOperand_CreateImm0(Inst, (0)); \
7264
3.12k
\
7265
3.12k
    return S; \
7266
3.28k
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedIPredicateOperand
Line
Count
Source
7228
230
  { \
7229
230
    DecodeStatus S = MCDisassembler_Success; \
7230
230
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
230
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
230
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
230
                   Decoder))) \
7234
230
      return MCDisassembler_Fail; \
7235
230
\
7236
230
    unsigned fc; \
7237
230
\
7238
230
    if (scalar) { \
7239
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
0
                 Inst, Rm, Address, Decoder))) \
7245
0
        return MCDisassembler_Fail; \
7246
230
    } else { \
7247
230
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
230
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
230
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
230
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
230
                << 4 | \
7252
230
              fieldFromInstruction_4(Insn, 1, 3); \
7253
230
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
230
                 Inst, Qm, Address, Decoder))) \
7255
230
        return MCDisassembler_Fail; \
7256
230
    } \
7257
230
\
7258
230
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
176
      return MCDisassembler_Fail; \
7260
176
\
7261
176
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
176
    MCOperand_CreateReg0(Inst, (0)); \
7263
176
    MCOperand_CreateImm0(Inst, (0)); \
7264
176
\
7265
176
    return S; \
7266
176
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedUPredicateOperand
Line
Count
Source
7228
650
  { \
7229
650
    DecodeStatus S = MCDisassembler_Success; \
7230
650
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
650
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
650
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
650
                   Decoder))) \
7234
650
      return MCDisassembler_Fail; \
7235
650
\
7236
650
    unsigned fc; \
7237
650
\
7238
650
    if (scalar) { \
7239
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
0
                 Inst, Rm, Address, Decoder))) \
7245
0
        return MCDisassembler_Fail; \
7246
650
    } else { \
7247
650
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
650
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
650
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
650
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
650
                << 4 | \
7252
650
              fieldFromInstruction_4(Insn, 1, 3); \
7253
650
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
650
                 Inst, Qm, Address, Decoder))) \
7255
650
        return MCDisassembler_Fail; \
7256
650
    } \
7257
650
\
7258
650
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
389
      return MCDisassembler_Fail; \
7260
389
\
7261
389
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
389
    MCOperand_CreateReg0(Inst, (0)); \
7263
389
    MCOperand_CreateImm0(Inst, (0)); \
7264
389
\
7265
389
    return S; \
7266
389
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedSPredicateOperand
Line
Count
Source
7228
141
  { \
7229
141
    DecodeStatus S = MCDisassembler_Success; \
7230
141
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
141
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
141
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
141
                   Decoder))) \
7234
141
      return MCDisassembler_Fail; \
7235
141
\
7236
141
    unsigned fc; \
7237
141
\
7238
141
    if (scalar) { \
7239
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
0
                 Inst, Rm, Address, Decoder))) \
7245
0
        return MCDisassembler_Fail; \
7246
141
    } else { \
7247
141
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
141
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
141
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
141
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
141
                << 4 | \
7252
141
              fieldFromInstruction_4(Insn, 1, 3); \
7253
141
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
141
                 Inst, Qm, Address, Decoder))) \
7255
141
        return MCDisassembler_Fail; \
7256
141
    } \
7257
141
\
7258
141
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
112
      return MCDisassembler_Fail; \
7260
112
\
7261
112
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
112
    MCOperand_CreateReg0(Inst, (0)); \
7263
112
    MCOperand_CreateImm0(Inst, (0)); \
7264
112
\
7265
112
    return S; \
7266
112
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedIPredicateOperand
Line
Count
Source
7228
260
  { \
7229
260
    DecodeStatus S = MCDisassembler_Success; \
7230
260
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
260
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
260
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
260
                   Decoder))) \
7234
260
      return MCDisassembler_Fail; \
7235
260
\
7236
260
    unsigned fc; \
7237
260
\
7238
260
    if (scalar) { \
7239
260
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
260
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
260
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
260
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
260
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
260
                 Inst, Rm, Address, Decoder))) \
7245
260
        return MCDisassembler_Fail; \
7246
260
    } else { \
7247
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
0
                << 4 | \
7252
0
              fieldFromInstruction_4(Insn, 1, 3); \
7253
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
0
                 Inst, Qm, Address, Decoder))) \
7255
0
        return MCDisassembler_Fail; \
7256
0
    } \
7257
260
\
7258
260
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
260
      return MCDisassembler_Fail; \
7260
260
\
7261
260
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
260
    MCOperand_CreateReg0(Inst, (0)); \
7263
260
    MCOperand_CreateImm0(Inst, (0)); \
7264
260
\
7265
260
    return S; \
7266
260
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedUPredicateOperand
Line
Count
Source
7228
878
  { \
7229
878
    DecodeStatus S = MCDisassembler_Success; \
7230
878
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
878
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
878
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
878
                   Decoder))) \
7234
878
      return MCDisassembler_Fail; \
7235
878
\
7236
878
    unsigned fc; \
7237
878
\
7238
878
    if (scalar) { \
7239
878
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
878
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
878
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
878
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
878
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
878
                 Inst, Rm, Address, Decoder))) \
7245
878
        return MCDisassembler_Fail; \
7246
878
    } else { \
7247
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
0
                << 4 | \
7252
0
              fieldFromInstruction_4(Insn, 1, 3); \
7253
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
0
                 Inst, Qm, Address, Decoder))) \
7255
0
        return MCDisassembler_Fail; \
7256
0
    } \
7257
878
\
7258
878
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
878
      return MCDisassembler_Fail; \
7260
878
\
7261
878
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
878
    MCOperand_CreateReg0(Inst, (0)); \
7263
878
    MCOperand_CreateImm0(Inst, (0)); \
7264
878
\
7265
878
    return S; \
7266
878
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedSPredicateOperand
Line
Count
Source
7228
1.17k
  { \
7229
1.17k
    DecodeStatus S = MCDisassembler_Success; \
7230
1.17k
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
1.17k
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
1.17k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
1.17k
                   Decoder))) \
7234
1.17k
      return MCDisassembler_Fail; \
7235
1.17k
\
7236
1.17k
    unsigned fc; \
7237
1.17k
\
7238
1.17k
    if (scalar) { \
7239
1.17k
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
1.17k
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
1.17k
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
1.17k
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
1.17k
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
1.17k
                 Inst, Rm, Address, Decoder))) \
7245
1.17k
        return MCDisassembler_Fail; \
7246
1.17k
    } else { \
7247
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
0
                << 4 | \
7252
0
              fieldFromInstruction_4(Insn, 1, 3); \
7253
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
0
                 Inst, Qm, Address, Decoder))) \
7255
0
        return MCDisassembler_Fail; \
7256
0
    } \
7257
1.17k
\
7258
1.17k
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
1.17k
      return MCDisassembler_Fail; \
7260
1.17k
\
7261
1.17k
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
1.17k
    MCOperand_CreateReg0(Inst, (0)); \
7263
1.17k
    MCOperand_CreateImm0(Inst, (0)); \
7264
1.17k
\
7265
1.17k
    return S; \
7266
1.17k
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedFPPredicateOperand
Line
Count
Source
7228
202
  { \
7229
202
    DecodeStatus S = MCDisassembler_Success; \
7230
202
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
202
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
202
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
202
                   Decoder))) \
7234
202
      return MCDisassembler_Fail; \
7235
202
\
7236
202
    unsigned fc; \
7237
202
\
7238
202
    if (scalar) { \
7239
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
0
                 Inst, Rm, Address, Decoder))) \
7245
0
        return MCDisassembler_Fail; \
7246
202
    } else { \
7247
202
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
202
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
202
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
202
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
202
                << 4 | \
7252
202
              fieldFromInstruction_4(Insn, 1, 3); \
7253
202
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
202
                 Inst, Qm, Address, Decoder))) \
7255
202
        return MCDisassembler_Fail; \
7256
202
    } \
7257
202
\
7258
202
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
134
      return MCDisassembler_Fail; \
7260
134
\
7261
134
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
33
    MCOperand_CreateReg0(Inst, (0)); \
7263
33
    MCOperand_CreateImm0(Inst, (0)); \
7264
33
\
7265
33
    return S; \
7266
134
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedFPPredicateOperand
Line
Count
Source
7228
163
  { \
7229
163
    DecodeStatus S = MCDisassembler_Success; \
7230
163
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7231
163
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7232
163
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7233
163
                   Decoder))) \
7234
163
      return MCDisassembler_Fail; \
7235
163
\
7236
163
    unsigned fc; \
7237
163
\
7238
163
    if (scalar) { \
7239
163
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7240
163
           fieldFromInstruction_4(Insn, 7, 1) | \
7241
163
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7242
163
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7243
163
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7244
163
                 Inst, Rm, Address, Decoder))) \
7245
163
        return MCDisassembler_Fail; \
7246
163
    } else { \
7247
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7248
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7249
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7250
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7251
0
                << 4 | \
7252
0
              fieldFromInstruction_4(Insn, 1, 3); \
7253
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7254
0
                 Inst, Qm, Address, Decoder))) \
7255
0
        return MCDisassembler_Fail; \
7256
0
    } \
7257
163
\
7258
163
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7259
163
      return MCDisassembler_Fail; \
7260
163
\
7261
163
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7262
98
    MCOperand_CreateReg0(Inst, (0)); \
7263
98
    MCOperand_CreateImm0(Inst, (0)); \
7264
98
\
7265
98
    return S; \
7266
163
  }
7267
DEFINE_DecodeMVEVCMP(false, DecodeRestrictedIPredicateOperand) DEFINE_DecodeMVEVCMP(
7268
  false, DecodeRestrictedUPredicateOperand)
7269
  DEFINE_DecodeMVEVCMP(false, DecodeRestrictedSPredicateOperand)
7270
    DEFINE_DecodeMVEVCMP(true, DecodeRestrictedIPredicateOperand)
7271
      DEFINE_DecodeMVEVCMP(true,
7272
               DecodeRestrictedUPredicateOperand)
7273
        DEFINE_DecodeMVEVCMP(
7274
          true, DecodeRestrictedSPredicateOperand)
7275
          DEFINE_DecodeMVEVCMP(
7276
            false,
7277
            DecodeRestrictedFPPredicateOperand)
7278
            DEFINE_DecodeMVEVCMP(
7279
              true,
7280
              DecodeRestrictedFPPredicateOperand)
7281
7282
              static DecodeStatus
7283
  DecodeMveVCTP(MCInst *Inst, unsigned Insn, uint64_t Address,
7284
          const void *Decoder)
7285
638
{
7286
638
  DecodeStatus S = MCDisassembler_Success;
7287
638
  MCOperand_CreateReg0(Inst, (ARM_VPR));
7288
638
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
7289
638
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
7290
0
    return MCDisassembler_Fail;
7291
638
  return S;
7292
638
}
7293
7294
static DecodeStatus DecodeMVEVPNOT(MCInst *Inst, unsigned Insn,
7295
           uint64_t Address, const void *Decoder)
7296
542
{
7297
542
  DecodeStatus S = MCDisassembler_Success;
7298
542
  MCOperand_CreateReg0(Inst, (ARM_VPR));
7299
542
  MCOperand_CreateReg0(Inst, (ARM_VPR));
7300
542
  return S;
7301
542
}
7302
7303
static DecodeStatus DecodeT2AddSubSPImm(MCInst *Inst, unsigned Insn,
7304
          uint64_t Address, const void *Decoder)
7305
612
{
7306
612
  const unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
7307
612
  const unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
7308
612
  const unsigned Imm12 = fieldFromInstruction_4(Insn, 26, 1) << 11 |
7309
612
             fieldFromInstruction_4(Insn, 12, 3) << 8 |
7310
612
             fieldFromInstruction_4(Insn, 0, 8);
7311
612
  const unsigned TypeT3 = fieldFromInstruction_4(Insn, 25, 1);
7312
612
  unsigned sign1 = fieldFromInstruction_4(Insn, 21, 1);
7313
612
  unsigned sign2 = fieldFromInstruction_4(Insn, 23, 1);
7314
612
  unsigned S = fieldFromInstruction_4(Insn, 20, 1);
7315
612
  if (sign1 != sign2)
7316
0
    return MCDisassembler_Fail;
7317
7318
  // T3 does a zext of imm12, where T2 does a ThumbExpandImm (T2SOImm)
7319
612
  DecodeStatus DS = MCDisassembler_Success;
7320
612
  if ((!Check(&DS, DecodeGPRspRegisterClass(Inst, Rd, Address,
7321
612
              Decoder))) || // dst
7322
612
      (!Check(&DS, DecodeGPRspRegisterClass(Inst, Rn, Address, Decoder))))
7323
0
    return MCDisassembler_Fail;
7324
612
  if (TypeT3) {
7325
76
    MCInst_setOpcode(Inst,
7326
76
         (sign1 ? ARM_t2SUBspImm12 : ARM_t2ADDspImm12));
7327
76
    MCOperand_CreateImm0(Inst, (Imm12)); // zext imm12
7328
536
  } else {
7329
536
    MCInst_setOpcode(Inst,
7330
536
         (sign1 ? ARM_t2SUBspImm : ARM_t2ADDspImm));
7331
536
    if (!Check(&DS, DecodeT2SOImm(Inst, Imm12, Address,
7332
536
                Decoder)))      // imm12
7333
0
      return MCDisassembler_Fail;
7334
536
    if (!Check(&DS, DecodeCCOutOperand(Inst, S, Address,
7335
536
               Decoder))) // cc_out
7336
0
      return MCDisassembler_Fail;
7337
536
  }
7338
7339
612
  return DS;
7340
612
}
7341
7342
DecodeStatus ARM_LLVM_getInstruction(csh handle, const uint8_t *code,
7343
             size_t code_len, MCInst *instr,
7344
             uint16_t *size, uint64_t address,
7345
             void *info)
7346
1.18M
{
7347
1.18M
  return getInstruction(handle, code, code_len, instr, size, address,
7348
1.18M
            info);
7349
1.18M
}