Coverage Report

Created: 2024-08-21 06:24

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