Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
ARMDisassembler.cpp
Go to the documentation of this file.
1//===- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "ARMBaseInstrInfo.h"
10#include "MCTargetDesc/ARMAddressingModes.h"
11#include "MCTargetDesc/ARMBaseInfo.h"
12#include "MCTargetDesc/ARMMCTargetDesc.h"
13#include "TargetInfo/ARMTargetInfo.h"
14#include "Utils/ARMBaseInfo.h"
15#include "llvm/MC/MCContext.h"
16#include "llvm/MC/MCDecoderOps.h"
17#include "llvm/MC/MCDisassembler/MCDisassembler.h"
18#include "llvm/MC/MCInst.h"
19#include "llvm/MC/MCInstrDesc.h"
20#include "llvm/MC/MCInstrInfo.h"
21#include "llvm/MC/MCSubtargetInfo.h"
22#include "llvm/MC/TargetRegistry.h"
23#include "llvm/Support/Compiler.h"
24#include "llvm/Support/ErrorHandling.h"
25#include "llvm/Support/MathExtras.h"
26#include "llvm/Support/raw_ostream.h"
27#include "llvm/TargetParser/SubtargetFeature.h"
28#include <algorithm>
29#include <cassert>
30#include <cstdint>
31#include <vector>
32
33using namespacellvm;
34
35#define DEBUG_TYPE "arm-disassembler"
36
37usingDecodeStatus =MCDisassembler::DecodeStatus;
38
39namespace{
40
41// Handles the condition code status of instructions in IT blocks
42classITStatus
43 {
44public:
45// Returns the condition code for instruction in IT block
46unsigned getITCC() {
47unsignedCC =ARMCC::AL;
48if (instrInITBlock())
49CC = ITStates.back();
50returnCC;
51 }
52
53// Advances the IT block state to the next T or E
54void advanceITState() {
55 ITStates.pop_back();
56 }
57
58// Returns true if the current instruction is in an IT block
59bool instrInITBlock() {
60return !ITStates.empty();
61 }
62
63// Returns true if current instruction is the last instruction in an IT block
64bool instrLastInITBlock() {
65return ITStates.size() == 1;
66 }
67
68// Called when decoding an IT instruction. Sets the IT state for
69// the following instructions that for the IT block. Firstcond
70// corresponds to the field in the IT instruction encoding; Mask
71// is in the MCOperand format in which 1 means 'else' and 0 'then'.
72void setITState(char Firstcond,char Mask) {
73// (3 - the number of trailing zeros) is the number of then / else.
74unsigned NumTZ = llvm::countr_zero<uint8_t>(Mask);
75unsignedchar CCBits =static_cast<unsignedchar>(Firstcond & 0xf);
76assert(NumTZ <= 3 &&"Invalid IT mask!");
77// push condition codes onto the stack the correct order for the pops
78for (unsigned Pos = NumTZ+1; Pos <= 3; ++Pos) {
79unsigned Else = (Mask >> Pos) & 1;
80 ITStates.push_back(CCBits ^ Else);
81 }
82 ITStates.push_back(CCBits);
83 }
84
85private:
86 std::vector<unsigned char> ITStates;
87 };
88
89classVPTStatus
90 {
91public:
92unsigned getVPTPred() {
93unsigned Pred =ARMVCC::None;
94if (instrInVPTBlock())
95 Pred = VPTStates.back();
96return Pred;
97 }
98
99void advanceVPTState() {
100 VPTStates.pop_back();
101 }
102
103bool instrInVPTBlock() {
104return !VPTStates.empty();
105 }
106
107bool instrLastInVPTBlock() {
108return VPTStates.size() == 1;
109 }
110
111void setVPTState(char Mask) {
112// (3 - the number of trailing zeros) is the number of then / else.
113unsigned NumTZ = llvm::countr_zero<uint8_t>(Mask);
114assert(NumTZ <= 3 &&"Invalid VPT mask!");
115// push predicates onto the stack the correct order for the pops
116for (unsigned Pos = NumTZ+1; Pos <= 3; ++Pos) {
117boolT = ((Mask >> Pos) & 1) == 0;
118if (T)
119 VPTStates.push_back(ARMVCC::Then);
120else
121 VPTStates.push_back(ARMVCC::Else);
122 }
123 VPTStates.push_back(ARMVCC::Then);
124 }
125
126private:
127SmallVector<unsigned char, 4> VPTStates;
128 };
129
130/// ARM disassembler for all ARM platforms.
131classARMDisassembler :publicMCDisassembler {
132public:
133 std::unique_ptr<const MCInstrInfo> MCII;
134
135 ARMDisassembler(constMCSubtargetInfo &STI,MCContext &Ctx,
136constMCInstrInfo *MCII)
137 :MCDisassembler(STI, Ctx), MCII(MCII) {
138 InstructionEndianness = STI.hasFeature(ARM::ModeBigEndianInstructions)
139 ?llvm::endianness::big
140 :llvm::endianness::little;
141 }
142
143 ~ARMDisassembler()override =default;
144
145DecodeStatusgetInstruction(MCInst &Instr,uint64_t &Size,
146ArrayRef<uint8_t> Bytes,uint64_tAddress,
147raw_ostream &CStream)const override;
148
149uint64_tsuggestBytesToSkip(ArrayRef<uint8_t> Bytes,
150uint64_tAddress)const override;
151
152private:
153DecodeStatus getARMInstruction(MCInst &Instr,uint64_t &Size,
154ArrayRef<uint8_t> Bytes,uint64_tAddress,
155raw_ostream &CStream)const;
156
157DecodeStatus getThumbInstruction(MCInst &Instr,uint64_t &Size,
158ArrayRef<uint8_t> Bytes,uint64_tAddress,
159raw_ostream &CStream)const;
160
161mutable ITStatus ITBlock;
162mutable VPTStatus VPTBlock;
163
164void AddThumb1SBit(MCInst &MI,bool InITBlock)const;
165boolisVectorPredicable(constMCInst &MI)const;
166DecodeStatus AddThumbPredicate(MCInst&)const;
167void UpdateThumbVFPPredicate(DecodeStatus &,MCInst&)const;
168
169llvm::endianness InstructionEndianness;
170};
171
172}// end anonymous namespace
173
174// Forward declare these because the autogenerated code will reference them.
175// Definitions are further down.
176staticDecodeStatusDecodeGPRRegisterClass(MCInst &Inst,unsigned RegNo,
177uint64_t Address,
178constMCDisassembler *Decoder);
179staticDecodeStatusDecodeCLRMGPRRegisterClass(MCInst &Inst,unsigned RegNo,
180uint64_t Address,
181constMCDisassembler *Decoder);
182staticDecodeStatusDecodetGPROddRegisterClass(MCInst &Inst,unsigned RegNo,
183uint64_t Address,
184constMCDisassembler *Decoder);
185staticDecodeStatusDecodetGPREvenRegisterClass(MCInst &Inst,unsigned RegNo,
186uint64_t Address,
187constMCDisassembler *Decoder);
188staticDecodeStatus
189DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst &Inst,unsigned RegNo,
190uint64_t Address,
191constMCDisassembler *Decoder);
192staticDecodeStatusDecodeGPRnopcRegisterClass(MCInst &Inst,unsigned RegNo,
193uint64_t Address,
194constMCDisassembler *Decoder);
195staticDecodeStatusDecodeGPRnospRegisterClass(MCInst &Inst,unsigned RegNo,
196uint64_t Address,
197constMCDisassembler *Decoder);
198staticDecodeStatus
199DecodeGPRwithAPSRRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
200constMCDisassembler *Decoder);
201staticDecodeStatusDecodeGPRwithZRRegisterClass(MCInst &Inst,unsigned RegNo,
202uint64_t Address,
203constMCDisassembler *Decoder);
204staticDecodeStatus
205DecodeGPRwithZRnospRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
206constMCDisassembler *Decoder);
207staticDecodeStatusDecodetGPRRegisterClass(MCInst &Inst,unsigned RegNo,
208uint64_t Address,
209constMCDisassembler *Decoder);
210staticDecodeStatusDecodetcGPRRegisterClass(MCInst &Inst,unsigned RegNo,
211uint64_t Address,
212constMCDisassembler *Decoder);
213staticDecodeStatusDecoderGPRRegisterClass(MCInst &Inst,unsigned RegNo,
214uint64_t Address,
215constMCDisassembler *Decoder);
216staticDecodeStatusDecodeGPRPairRegisterClass(MCInst &Inst,unsigned RegNo,
217uint64_t Address,
218constMCDisassembler *Decoder);
219staticDecodeStatus
220DecodeGPRPairnospRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
221constMCDisassembler *Decoder);
222staticDecodeStatusDecodeGPRspRegisterClass(MCInst &Inst,unsigned RegNo,
223uint64_t Address,
224constMCDisassembler *Decoder);
225staticDecodeStatusDecodeHPRRegisterClass(MCInst &Inst,unsigned RegNo,
226uint64_t Address,
227constMCDisassembler *Decoder);
228staticDecodeStatusDecodeSPRRegisterClass(MCInst &Inst,unsigned RegNo,
229uint64_t Address,
230constMCDisassembler *Decoder);
231staticDecodeStatusDecodeDPRRegisterClass(MCInst &Inst,unsigned RegNo,
232uint64_t Address,
233constMCDisassembler *Decoder);
234staticDecodeStatusDecodeDPR_8RegisterClass(MCInst &Inst,unsigned RegNo,
235uint64_t Address,
236constMCDisassembler *Decoder);
237staticDecodeStatusDecodeSPR_8RegisterClass(MCInst &Inst,unsigned RegNo,
238uint64_t Address,
239constMCDisassembler *Decoder);
240staticDecodeStatusDecodeDPR_VFP2RegisterClass(MCInst &Inst,unsigned RegNo,
241uint64_t Address,
242constMCDisassembler *Decoder);
243staticDecodeStatusDecodeQPRRegisterClass(MCInst &Inst,unsigned RegNo,
244uint64_t Address,
245constMCDisassembler *Decoder);
246staticDecodeStatusDecodeMQPRRegisterClass(MCInst &Inst,unsigned RegNo,
247uint64_t Address,
248constMCDisassembler *Decoder);
249staticDecodeStatusDecodeMQQPRRegisterClass(MCInst &Inst,unsigned RegNo,
250uint64_t Address,
251constMCDisassembler *Decoder);
252staticDecodeStatusDecodeMQQQQPRRegisterClass(MCInst &Inst,unsigned RegNo,
253uint64_t Address,
254constMCDisassembler *Decoder);
255staticDecodeStatusDecodeDPairRegisterClass(MCInst &Inst,unsigned RegNo,
256uint64_t Address,
257constMCDisassembler *Decoder);
258staticDecodeStatus
259DecodeDPairSpacedRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
260constMCDisassembler *Decoder);
261
262staticDecodeStatusDecodePredicateOperand(MCInst &Inst,unsigned Val,
263uint64_t Address,
264constMCDisassembler *Decoder);
265staticDecodeStatusDecodeCCOutOperand(MCInst &Inst,unsigned Val,
266uint64_t Address,
267constMCDisassembler *Decoder);
268staticDecodeStatusDecodeRegListOperand(MCInst &Inst,unsigned Val,
269uint64_t Address,
270constMCDisassembler *Decoder);
271staticDecodeStatusDecodeSPRRegListOperand(MCInst &Inst,unsigned Val,
272uint64_t Address,
273constMCDisassembler *Decoder);
274staticDecodeStatusDecodeDPRRegListOperand(MCInst &Inst,unsigned Val,
275uint64_t Address,
276constMCDisassembler *Decoder);
277
278staticDecodeStatusDecodeBitfieldMaskOperand(MCInst &Inst,unsignedInsn,
279uint64_t Address,
280constMCDisassembler *Decoder);
281staticDecodeStatusDecodeCopMemInstruction(MCInst &Inst,unsignedInsn,
282uint64_t Address,
283constMCDisassembler *Decoder);
284staticDecodeStatus
285DecodeAddrMode2IdxInstruction(MCInst &Inst,unsignedInsn,uint64_t Address,
286constMCDisassembler *Decoder);
287staticDecodeStatusDecodeSORegMemOperand(MCInst &Inst,unsignedInsn,
288uint64_t Address,
289constMCDisassembler *Decoder);
290staticDecodeStatusDecodeAddrMode3Instruction(MCInst &Inst,unsignedInsn,
291uint64_t Address,
292constMCDisassembler *Decoder);
293staticDecodeStatusDecodeTSBInstruction(MCInst &Inst,unsignedInsn,
294uint64_t Address,
295constMCDisassembler *Decoder);
296staticDecodeStatusDecodeSORegImmOperand(MCInst &Inst,unsignedInsn,
297uint64_t Address,
298constMCDisassembler *Decoder);
299staticDecodeStatusDecodeSORegRegOperand(MCInst &Inst,unsignedInsn,
300uint64_t Address,
301constMCDisassembler *Decoder);
302
303staticDecodeStatus
304DecodeMemMultipleWritebackInstruction(MCInst &Inst,unsignedInsn,
305uint64_t Adddress,
306constMCDisassembler *Decoder);
307staticDecodeStatusDecodeT2MOVTWInstruction(MCInst &Inst,unsignedInsn,
308uint64_t Address,
309constMCDisassembler *Decoder);
310staticDecodeStatusDecodeArmMOVTWInstruction(MCInst &Inst,unsignedInsn,
311uint64_t Address,
312constMCDisassembler *Decoder);
313staticDecodeStatusDecodeSMLAInstruction(MCInst &Inst,unsignedInsn,
314uint64_t Address,
315constMCDisassembler *Decoder);
316staticDecodeStatusDecodeHINTInstruction(MCInst &Inst,unsignedInsn,
317uint64_t Address,
318constMCDisassembler *Decoder);
319staticDecodeStatusDecodeCPSInstruction(MCInst &Inst,unsignedInsn,
320uint64_t Address,
321constMCDisassembler *Decoder);
322staticDecodeStatusDecodeTSTInstruction(MCInst &Inst,unsignedInsn,
323uint64_t Address,
324constMCDisassembler *Decoder);
325staticDecodeStatusDecodeSETPANInstruction(MCInst &Inst,unsignedInsn,
326uint64_t Address,
327constMCDisassembler *Decoder);
328staticDecodeStatusDecodeT2CPSInstruction(MCInst &Inst,unsignedInsn,
329uint64_t Address,
330constMCDisassembler *Decoder);
331staticDecodeStatusDecodeT2HintSpaceInstruction(MCInst &Inst,unsignedInsn,
332uint64_t Address,
333constMCDisassembler *Decoder);
334staticDecodeStatusDecodeAddrModeImm12Operand(MCInst &Inst,unsigned Val,
335uint64_t Address,
336constMCDisassembler *Decoder);
337staticDecodeStatusDecodeAddrMode5Operand(MCInst &Inst,unsigned Val,
338uint64_t Address,
339constMCDisassembler *Decoder);
340staticDecodeStatusDecodeAddrMode5FP16Operand(MCInst &Inst,unsigned Val,
341uint64_t Address,
342constMCDisassembler *Decoder);
343staticDecodeStatusDecodeAddrMode7Operand(MCInst &Inst,unsigned Val,
344uint64_t Address,
345constMCDisassembler *Decoder);
346staticDecodeStatusDecodeT2BInstruction(MCInst &Inst,unsignedInsn,
347uint64_t Address,
348constMCDisassembler *Decoder);
349staticDecodeStatusDecodeBranchImmInstruction(MCInst &Inst,unsignedInsn,
350uint64_t Address,
351constMCDisassembler *Decoder);
352staticDecodeStatusDecodeAddrMode6Operand(MCInst &Inst,unsigned Val,
353uint64_t Address,
354constMCDisassembler *Decoder);
355staticDecodeStatusDecodeVLDST1Instruction(MCInst &Inst,unsigned Val,
356uint64_t Address,
357constMCDisassembler *Decoder);
358staticDecodeStatusDecodeVLDST2Instruction(MCInst &Inst,unsigned Val,
359uint64_t Address,
360constMCDisassembler *Decoder);
361staticDecodeStatusDecodeVLDST3Instruction(MCInst &Inst,unsigned Val,
362uint64_t Address,
363constMCDisassembler *Decoder);
364staticDecodeStatusDecodeVLDST4Instruction(MCInst &Inst,unsigned Val,
365uint64_t Address,
366constMCDisassembler *Decoder);
367staticDecodeStatusDecodeVLDInstruction(MCInst &Inst,unsigned Val,
368uint64_t Address,
369constMCDisassembler *Decoder);
370staticDecodeStatusDecodeVSTInstruction(MCInst &Inst,unsigned Val,
371uint64_t Address,
372constMCDisassembler *Decoder);
373staticDecodeStatusDecodeVLD1DupInstruction(MCInst &Inst,unsigned Val,
374uint64_t Address,
375constMCDisassembler *Decoder);
376staticDecodeStatusDecodeVLD2DupInstruction(MCInst &Inst,unsigned Val,
377uint64_t Address,
378constMCDisassembler *Decoder);
379staticDecodeStatusDecodeVLD3DupInstruction(MCInst &Inst,unsigned Val,
380uint64_t Address,
381constMCDisassembler *Decoder);
382staticDecodeStatusDecodeVLD4DupInstruction(MCInst &Inst,unsigned Val,
383uint64_t Address,
384constMCDisassembler *Decoder);
385staticDecodeStatusDecodeVMOVModImmInstruction(MCInst &Inst,unsigned Val,
386uint64_t Address,
387constMCDisassembler *Decoder);
388staticDecodeStatusDecodeMVEModImmInstruction(MCInst &Inst,unsigned Val,
389uint64_t Address,
390constMCDisassembler *Decoder);
391staticDecodeStatusDecodeMVEVADCInstruction(MCInst &Inst,unsignedInsn,
392uint64_t Address,
393constMCDisassembler *Decoder);
394staticDecodeStatusDecodeVSHLMaxInstruction(MCInst &Inst,unsigned Val,
395uint64_t Address,
396constMCDisassembler *Decoder);
397staticDecodeStatusDecodeShiftRight8Imm(MCInst &Inst,unsigned Val,
398uint64_t Address,
399constMCDisassembler *Decoder);
400staticDecodeStatusDecodeShiftRight16Imm(MCInst &Inst,unsigned Val,
401uint64_t Address,
402constMCDisassembler *Decoder);
403staticDecodeStatusDecodeShiftRight32Imm(MCInst &Inst,unsigned Val,
404uint64_t Address,
405constMCDisassembler *Decoder);
406staticDecodeStatusDecodeShiftRight64Imm(MCInst &Inst,unsigned Val,
407uint64_t Address,
408constMCDisassembler *Decoder);
409staticDecodeStatusDecodeTBLInstruction(MCInst &Inst,unsignedInsn,
410uint64_t Address,
411constMCDisassembler *Decoder);
412staticDecodeStatusDecodePostIdxReg(MCInst &Inst,unsignedInsn,
413uint64_t Address,
414constMCDisassembler *Decoder);
415staticDecodeStatusDecodeMveAddrModeRQ(MCInst &Inst,unsignedInsn,
416uint64_t Address,
417constMCDisassembler *Decoder);
418template <int shift>
419staticDecodeStatusDecodeMveAddrModeQ(MCInst &Inst,unsignedInsn,
420uint64_t Address,
421constMCDisassembler *Decoder);
422staticDecodeStatusDecodeCoprocessor(MCInst &Inst,unsignedInsn,
423uint64_t Address,
424constMCDisassembler *Decoder);
425staticDecodeStatusDecodeMemBarrierOption(MCInst &Inst,unsignedInsn,
426uint64_t Address,
427constMCDisassembler *Decoder);
428staticDecodeStatusDecodeInstSyncBarrierOption(MCInst &Inst,unsignedInsn,
429uint64_t Address,
430constMCDisassembler *Decoder);
431staticDecodeStatusDecodeMSRMask(MCInst &Inst,unsignedInsn,uint64_t Address,
432constMCDisassembler *Decoder);
433staticDecodeStatusDecodeBankedReg(MCInst &Inst,unsignedInsn,
434uint64_t Address,
435constMCDisassembler *Decoder);
436staticDecodeStatusDecodeDoubleRegLoad(MCInst &Inst,unsignedInsn,
437uint64_t Address,
438constMCDisassembler *Decoder);
439staticDecodeStatusDecodeDoubleRegStore(MCInst &Inst,unsignedInsn,
440uint64_t Address,
441constMCDisassembler *Decoder);
442staticDecodeStatusDecodeLDRPreImm(MCInst &Inst,unsignedInsn,
443uint64_t Address,
444constMCDisassembler *Decoder);
445staticDecodeStatusDecodeLDRPreReg(MCInst &Inst,unsignedInsn,
446uint64_t Address,
447constMCDisassembler *Decoder);
448staticDecodeStatusDecodeSTRPreImm(MCInst &Inst,unsignedInsn,
449uint64_t Address,
450constMCDisassembler *Decoder);
451staticDecodeStatusDecodeSTRPreReg(MCInst &Inst,unsignedInsn,
452uint64_t Address,
453constMCDisassembler *Decoder);
454staticDecodeStatusDecodeVLD1LN(MCInst &Inst,unsignedInsn,uint64_t Address,
455constMCDisassembler *Decoder);
456staticDecodeStatusDecodeVLD2LN(MCInst &Inst,unsignedInsn,uint64_t Address,
457constMCDisassembler *Decoder);
458staticDecodeStatusDecodeVLD3LN(MCInst &Inst,unsignedInsn,uint64_t Address,
459constMCDisassembler *Decoder);
460staticDecodeStatusDecodeVLD4LN(MCInst &Inst,unsignedInsn,uint64_t Address,
461constMCDisassembler *Decoder);
462staticDecodeStatusDecodeVST1LN(MCInst &Inst,unsignedInsn,uint64_t Address,
463constMCDisassembler *Decoder);
464staticDecodeStatusDecodeVST2LN(MCInst &Inst,unsignedInsn,uint64_t Address,
465constMCDisassembler *Decoder);
466staticDecodeStatusDecodeVST3LN(MCInst &Inst,unsignedInsn,uint64_t Address,
467constMCDisassembler *Decoder);
468staticDecodeStatusDecodeVST4LN(MCInst &Inst,unsignedInsn,uint64_t Address,
469constMCDisassembler *Decoder);
470staticDecodeStatusDecodeVMOVSRR(MCInst &Inst,unsignedInsn,uint64_t Address,
471constMCDisassembler *Decoder);
472staticDecodeStatusDecodeVMOVRRS(MCInst &Inst,unsignedInsn,uint64_t Address,
473constMCDisassembler *Decoder);
474staticDecodeStatusDecodeSwap(MCInst &Inst,unsignedInsn,uint64_t Address,
475constMCDisassembler *Decoder);
476staticDecodeStatusDecodeVCVTD(MCInst &Inst,unsignedInsn,uint64_t Address,
477constMCDisassembler *Decoder);
478staticDecodeStatusDecodeVCVTQ(MCInst &Inst,unsignedInsn,uint64_t Address,
479constMCDisassembler *Decoder);
480staticDecodeStatusDecodeVCVTImmOperand(MCInst &Inst,unsignedInsn,
481uint64_t Address,
482constMCDisassembler *Decoder);
483staticDecodeStatus
484DecodeNEONComplexLane64Instruction(MCInst &Inst,unsigned Val,uint64_t Address,
485constMCDisassembler *Decoder);
486
487staticDecodeStatusDecodeThumbAddSpecialReg(MCInst &Inst,uint16_tInsn,
488uint64_t Address,
489constMCDisassembler *Decoder);
490staticDecodeStatusDecodeThumbBROperand(MCInst &Inst,unsigned Val,
491uint64_t Address,
492constMCDisassembler *Decoder);
493staticDecodeStatusDecodeT2BROperand(MCInst &Inst,unsigned Val,
494uint64_t Address,
495constMCDisassembler *Decoder);
496staticDecodeStatusDecodeThumbCmpBROperand(MCInst &Inst,unsigned Val,
497uint64_t Address,
498constMCDisassembler *Decoder);
499staticDecodeStatusDecodeThumbAddrModeRR(MCInst &Inst,unsigned Val,
500uint64_t Address,
501constMCDisassembler *Decoder);
502staticDecodeStatusDecodeThumbAddrModeIS(MCInst &Inst,unsigned Val,
503uint64_t Address,
504constMCDisassembler *Decoder);
505staticDecodeStatusDecodeThumbAddrModePC(MCInst &Inst,unsigned Val,
506uint64_t Address,
507constMCDisassembler *Decoder);
508staticDecodeStatusDecodeThumbAddrModeSP(MCInst &Inst,unsigned Val,
509uint64_t Address,
510constMCDisassembler *Decoder);
511staticDecodeStatusDecodeT2AddrModeSOReg(MCInst &Inst,unsigned Val,
512uint64_t Address,
513constMCDisassembler *Decoder);
514staticDecodeStatusDecodeT2LoadShift(MCInst &Inst,unsigned Val,
515uint64_t Address,
516constMCDisassembler *Decoder);
517staticDecodeStatusDecodeT2LoadImm8(MCInst &Inst,unsignedInsn,
518uint64_t Address,
519constMCDisassembler *Decoder);
520staticDecodeStatusDecodeT2LoadImm12(MCInst &Inst,unsignedInsn,
521uint64_t Address,
522constMCDisassembler *Decoder);
523staticDecodeStatusDecodeT2LoadT(MCInst &Inst,unsignedInsn,uint64_t Address,
524constMCDisassembler *Decoder);
525staticDecodeStatusDecodeT2LoadLabel(MCInst &Inst,unsignedInsn,
526uint64_t Address,
527constMCDisassembler *Decoder);
528staticDecodeStatusDecodeT2Imm8S4(MCInst &Inst,unsigned Val,uint64_t Address,
529constMCDisassembler *Decoder);
530staticDecodeStatusDecodeT2Imm7S4(MCInst &Inst,unsigned Val,uint64_t Address,
531constMCDisassembler *Decoder);
532staticDecodeStatusDecodeT2AddrModeImm8s4(MCInst &Inst,unsigned Val,
533uint64_t Address,
534constMCDisassembler *Decoder);
535staticDecodeStatusDecodeT2AddrModeImm7s4(MCInst &Inst,unsigned Val,
536uint64_t Address,
537constMCDisassembler *Decoder);
538staticDecodeStatusDecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
539uint64_t Address,
540constMCDisassembler *Decoder);
541staticDecodeStatusDecodeT2Imm8(MCInst &Inst,unsigned Val,uint64_t Address,
542constMCDisassembler *Decoder);
543template <int shift>
544staticDecodeStatusDecodeT2Imm7(MCInst &Inst,unsigned Val,uint64_t Address,
545constMCDisassembler *Decoder);
546staticDecodeStatusDecodeT2AddrModeImm8(MCInst &Inst,unsigned Val,
547uint64_t Address,
548constMCDisassembler *Decoder);
549template <int shift>
550staticDecodeStatusDecodeTAddrModeImm7(MCInst &Inst,unsigned Val,
551uint64_t Address,
552constMCDisassembler *Decoder);
553template <int shift,int WriteBack>
554staticDecodeStatusDecodeT2AddrModeImm7(MCInst &Inst,unsigned Val,
555uint64_t Address,
556constMCDisassembler *Decoder);
557staticDecodeStatusDecodeThumbAddSPImm(MCInst &Inst,uint16_t Val,
558uint64_t Address,
559constMCDisassembler *Decoder);
560staticDecodeStatusDecodeThumbAddSPReg(MCInst &Inst,uint16_tInsn,
561uint64_t Address,
562constMCDisassembler *Decoder);
563staticDecodeStatusDecodeThumbCPS(MCInst &Inst,uint16_tInsn,
564uint64_t Address,
565constMCDisassembler *Decoder);
566staticDecodeStatusDecodeQADDInstruction(MCInst &Inst,unsignedInsn,
567uint64_t Address,
568constMCDisassembler *Decoder);
569staticDecodeStatusDecodeThumbBLXOffset(MCInst &Inst,unsignedInsn,
570uint64_t Address,
571constMCDisassembler *Decoder);
572staticDecodeStatusDecodeT2AddrModeImm12(MCInst &Inst,unsigned Val,
573uint64_t Address,
574constMCDisassembler *Decoder);
575staticDecodeStatusDecodeThumbTableBranch(MCInst &Inst,unsigned Val,
576uint64_t Address,
577constMCDisassembler *Decoder);
578staticDecodeStatusDecodeThumb2BCCInstruction(MCInst &Inst,unsigned Val,
579uint64_t Address,
580constMCDisassembler *Decoder);
581staticDecodeStatusDecodeT2SOImm(MCInst &Inst,unsigned Val,uint64_t Address,
582constMCDisassembler *Decoder);
583staticDecodeStatusDecodeThumbBCCTargetOperand(MCInst &Inst,unsigned Val,
584uint64_t Address,
585constMCDisassembler *Decoder);
586staticDecodeStatusDecodeThumbBLTargetOperand(MCInst &Inst,unsigned Val,
587uint64_t Address,
588constMCDisassembler *Decoder);
589staticDecodeStatusDecodeIT(MCInst &Inst,unsigned Val,uint64_t Address,
590constMCDisassembler *Decoder);
591staticDecodeStatusDecodeT2LDRDPreInstruction(MCInst &Inst,unsignedInsn,
592uint64_t Address,
593constMCDisassembler *Decoder);
594staticDecodeStatusDecodeT2STRDPreInstruction(MCInst &Inst,unsignedInsn,
595uint64_t Address,
596constMCDisassembler *Decoder);
597staticDecodeStatusDecodeT2Adr(MCInst &Inst,unsigned Val,uint64_t Address,
598constMCDisassembler *Decoder);
599staticDecodeStatusDecodeT2LdStPre(MCInst &Inst,unsigned Val,
600uint64_t Address,
601constMCDisassembler *Decoder);
602staticDecodeStatusDecodeT2ShifterImmOperand(MCInst &Inst,unsigned Val,
603uint64_t Address,
604constMCDisassembler *Decoder);
605
606staticDecodeStatusDecodeLDR(MCInst &Inst,unsigned Val,uint64_t Address,
607constMCDisassembler *Decoder);
608staticDecodeStatusDecoderForMRRC2AndMCRR2(MCInst &Inst,unsigned Val,
609uint64_t Address,
610constMCDisassembler *Decoder);
611staticDecodeStatusDecodeForVMRSandVMSR(MCInst &Inst,unsigned Val,
612uint64_t Address,
613constMCDisassembler *Decoder);
614
615template <bool isSigned,bool isNeg,bool zeroPermitted,int size>
616staticDecodeStatusDecodeBFLabelOperand(MCInst &Inst,unsigned val,
617uint64_t Address,
618constMCDisassembler *Decoder);
619staticDecodeStatusDecodeBFAfterTargetOperand(MCInst &Inst,unsigned val,
620uint64_t Address,
621constMCDisassembler *Decoder);
622staticDecodeStatusDecodePredNoALOperand(MCInst &Inst,unsigned Val,
623uint64_t Address,
624constMCDisassembler *Decoder);
625staticDecodeStatusDecodeLOLoop(MCInst &Inst,unsignedInsn,uint64_t Address,
626constMCDisassembler *Decoder);
627staticDecodeStatusDecodeLongShiftOperand(MCInst &Inst,unsigned Val,
628uint64_t Address,
629constMCDisassembler *Decoder);
630staticDecodeStatusDecodeVSCCLRM(MCInst &Inst,unsignedInsn,uint64_t Address,
631constMCDisassembler *Decoder);
632staticDecodeStatusDecodeVPTMaskOperand(MCInst &Inst,unsigned Val,
633uint64_t Address,
634constMCDisassembler *Decoder);
635staticDecodeStatusDecodeVpredROperand(MCInst &Inst,unsigned Val,
636uint64_t Address,
637constMCDisassembler *Decoder);
638staticDecodeStatusDecodeVpredNOperand(MCInst &Inst,unsigned Val,
639uint64_t Address,
640constMCDisassembler *Decoder);
641staticDecodeStatus
642DecodeRestrictedIPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
643constMCDisassembler *Decoder);
644staticDecodeStatus
645DecodeRestrictedSPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
646constMCDisassembler *Decoder);
647staticDecodeStatus
648DecodeRestrictedUPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
649constMCDisassembler *Decoder);
650staticDecodeStatus
651DecodeRestrictedFPPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
652constMCDisassembler *Decoder);
653template <bool Writeback>
654staticDecodeStatusDecodeVSTRVLDR_SYSREG(MCInst &Inst,unsignedInsn,
655uint64_t Address,
656constMCDisassembler *Decoder);
657template <int shift>
658staticDecodeStatusDecodeMVE_MEM_1_pre(MCInst &Inst,unsigned Val,
659uint64_t Address,
660constMCDisassembler *Decoder);
661template <int shift>
662staticDecodeStatusDecodeMVE_MEM_2_pre(MCInst &Inst,unsigned Val,
663uint64_t Address,
664constMCDisassembler *Decoder);
665template <int shift>
666staticDecodeStatusDecodeMVE_MEM_3_pre(MCInst &Inst,unsigned Val,
667uint64_t Address,
668constMCDisassembler *Decoder);
669template <unsigned MinLog,unsigned MaxLog>
670staticDecodeStatusDecodePowerTwoOperand(MCInst &Inst,unsigned Val,
671uint64_t Address,
672constMCDisassembler *Decoder);
673template <unsigned start>
674staticDecodeStatus
675DecodeMVEPairVectorIndexOperand(MCInst &Inst,unsigned Val,uint64_t Address,
676constMCDisassembler *Decoder);
677staticDecodeStatusDecodeMVEVMOVQtoDReg(MCInst &Inst,unsignedInsn,
678uint64_t Address,
679constMCDisassembler *Decoder);
680staticDecodeStatusDecodeMVEVMOVDRegtoQ(MCInst &Inst,unsignedInsn,
681uint64_t Address,
682constMCDisassembler *Decoder);
683staticDecodeStatusDecodeMVEVCVTt1fp(MCInst &Inst,unsignedInsn,
684uint64_t Address,
685constMCDisassembler *Decoder);
686typedefDecodeStatusOperandDecoder(MCInst &Inst,unsigned Val,
687uint64_t Address,
688constMCDisassembler *Decoder);
689template <bool scalar, OperandDecoder predicate_decoder>
690staticDecodeStatusDecodeMVEVCMP(MCInst &Inst,unsignedInsn,uint64_t Address,
691constMCDisassembler *Decoder);
692staticDecodeStatusDecodeMveVCTP(MCInst &Inst,unsignedInsn,uint64_t Address,
693constMCDisassembler *Decoder);
694staticDecodeStatusDecodeMVEVPNOT(MCInst &Inst,unsignedInsn,
695uint64_t Address,
696constMCDisassembler *Decoder);
697staticDecodeStatus
698DecodeMVEOverlappingLongShift(MCInst &Inst,unsignedInsn,uint64_t Address,
699constMCDisassembler *Decoder);
700staticDecodeStatusDecodeT2AddSubSPImm(MCInst &Inst,unsignedInsn,
701uint64_t Address,
702constMCDisassembler *Decoder);
703staticDecodeStatusDecodeLazyLoadStoreMul(MCInst &Inst,unsignedInsn,
704uint64_t Address,
705constMCDisassembler *Decoder);
706
707#include "ARMGenDisassemblerTables.inc"
708
709staticMCDisassembler *createARMDisassembler(constTarget &T,
710constMCSubtargetInfo &STI,
711MCContext &Ctx) {
712returnnew ARMDisassembler(STI, Ctx,T.createMCInstrInfo());
713}
714
715// Post-decoding checks
716staticDecodeStatuscheckDecodedInstruction(MCInst &MI,uint64_t &Size,
717uint64_t Address,raw_ostream &CS,
718uint32_tInsn,
719DecodeStatus Result) {
720switch (MI.getOpcode()) {
721case ARM::HVC: {
722// HVC is undefined if condition = 0xf otherwise upredictable
723// if condition != 0xe
724uint32_tCond = (Insn >> 28) & 0xF;
725if (Cond == 0xF)
726returnMCDisassembler::Fail;
727if (Cond != 0xE)
728returnMCDisassembler::SoftFail;
729return Result;
730 }
731case ARM::t2ADDri:
732case ARM::t2ADDri12:
733case ARM::t2ADDrr:
734case ARM::t2ADDrs:
735case ARM::t2SUBri:
736case ARM::t2SUBri12:
737case ARM::t2SUBrr:
738case ARM::t2SUBrs:
739if (MI.getOperand(0).getReg() == ARM::SP &&
740MI.getOperand(1).getReg() != ARM::SP)
741returnMCDisassembler::SoftFail;
742return Result;
743default:return Result;
744 }
745}
746
747uint64_t ARMDisassembler::suggestBytesToSkip(ArrayRef<uint8_t> Bytes,
748uint64_t Address) const{
749// In Arm state, instructions are always 4 bytes wide, so there's no
750// point in skipping any smaller number of bytes if an instruction
751// can't be decoded.
752if (!STI.hasFeature(ARM::ModeThumb))
753return 4;
754
755// In a Thumb instruction stream, a halfword is a standalone 2-byte
756// instruction if and only if its value is less than 0xE800.
757// Otherwise, it's the first halfword of a 4-byte instruction.
758//
759// So, if we can see the upcoming halfword, we can judge on that
760// basis, and maybe skip a whole 4-byte instruction that we don't
761// know how to decode, without accidentally trying to interpret its
762// second half as something else.
763//
764// If we don't have the instruction data available, we just have to
765// recommend skipping the minimum sensible distance, which is 2
766// bytes.
767if (Bytes.size() < 2)
768return 2;
769
770uint16_t Insn16 = llvm::support::endian::read<uint16_t>(
771 Bytes.data(), InstructionEndianness);
772return Insn16 < 0xE800 ? 2 : 4;
773}
774
775DecodeStatus ARMDisassembler::getInstruction(MCInst &MI,uint64_t &Size,
776ArrayRef<uint8_t> Bytes,
777uint64_t Address,
778raw_ostream &CS) const{
779if (STI.hasFeature(ARM::ModeThumb))
780return getThumbInstruction(MI,Size, Bytes, Address, CS);
781return getARMInstruction(MI,Size, Bytes, Address, CS);
782}
783
784DecodeStatus ARMDisassembler::getARMInstruction(MCInst &MI,uint64_t &Size,
785ArrayRef<uint8_t> Bytes,
786uint64_t Address,
787raw_ostream &CS) const{
788 CommentStream = &CS;
789
790assert(!STI.hasFeature(ARM::ModeThumb) &&
791"Asked to disassemble an ARM instruction but Subtarget is in Thumb "
792"mode!");
793
794// We want to read exactly 4 bytes of data.
795if (Bytes.size() < 4) {
796Size = 0;
797returnMCDisassembler::Fail;
798 }
799
800// Encoded as a 32-bit word in the stream.
801uint32_tInsn = llvm::support::endian::read<uint32_t>(Bytes.data(),
802 InstructionEndianness);
803
804// Calling the auto-generated decoder function.
805DecodeStatusResult =
806 decodeInstruction(DecoderTableARM32,MI,Insn, Address,this, STI);
807if (Result !=MCDisassembler::Fail) {
808Size = 4;
809returncheckDecodedInstruction(MI,Size, Address, CS,Insn, Result);
810 }
811
812structDecodeTable {
813constuint8_t *P;
814bool DecodePred;
815 };
816
817const DecodeTable Tables[] = {
818 {DecoderTableVFP32,false}, {DecoderTableVFPV832,false},
819 {DecoderTableNEONData32,true}, {DecoderTableNEONLoadStore32,true},
820 {DecoderTableNEONDup32,true}, {DecoderTablev8NEON32,false},
821 {DecoderTablev8Crypto32,false},
822 };
823
824for (auto Table : Tables) {
825Result = decodeInstruction(Table.P,MI,Insn, Address,this, STI);
826if (Result !=MCDisassembler::Fail) {
827Size = 4;
828// Add a fake predicate operand, because we share these instruction
829// definitions with Thumb2 where these instructions are predicable.
830if (Table.DecodePred && !DecodePredicateOperand(MI, 0xE, Address,this))
831returnMCDisassembler::Fail;
832returnResult;
833 }
834 }
835
836Result =
837 decodeInstruction(DecoderTableCoProc32,MI,Insn, Address,this, STI);
838if (Result !=MCDisassembler::Fail) {
839Size = 4;
840returncheckDecodedInstruction(MI,Size, Address, CS,Insn, Result);
841 }
842
843Size = 4;
844returnMCDisassembler::Fail;
845}
846
847/// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
848/// immediate Value in the MCInst. The immediate Value has had any PC
849/// adjustment made by the caller. If the instruction is a branch instruction
850/// then isBranch is true, else false. If the getOpInfo() function was set as
851/// part of the setupForSymbolicDisassembly() call then that function is called
852/// to get any symbolic information at the Address for this instruction. If
853/// that returns non-zero then the symbolic information it returns is used to
854/// create an MCExpr and that is added as an operand to the MCInst. If
855/// getOpInfo() returns zero and isBranch is true then a symbol look up for
856/// Value is done and if a symbol is found an MCExpr is created with that, else
857/// an MCExpr with Value is created. This function returns true if it adds an
858/// operand to the MCInst and false otherwise.
859staticbooltryAddingSymbolicOperand(uint64_t Address, int32_tValue,
860boolisBranch,uint64_t InstSize,
861MCInst &MI,
862constMCDisassembler *Decoder) {
863// FIXME: Does it make sense for value to be negative?
864return Decoder->tryAddingSymbolicOperand(MI, (uint32_t)Value,Address,
865isBranch,/*Offset=*/0,/*OpSize=*/0,
866 InstSize);
867}
868
869/// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
870/// referenced by a load instruction with the base register that is the Pc.
871/// These can often be values in a literal pool near the Address of the
872/// instruction. The Address of the instruction and its immediate Value are
873/// used as a possible literal pool entry. The SymbolLookUp call back will
874/// return the name of a symbol referenced by the literal pool's entry if
875/// the referenced address is that of a symbol. Or it will return a pointer to
876/// a literal 'C' string if the referenced address of the literal pool's entry
877/// is an address into a section with 'C' string literals.
878staticvoidtryAddingPcLoadReferenceComment(uint64_t Address,intValue,
879constMCDisassembler *Decoder) {
880constMCDisassembler *Dis =static_cast<constMCDisassembler*>(Decoder);
881 Dis->tryAddingPcLoadReferenceComment(Value,Address);
882}
883
884// Thumb1 instructions don't have explicit S bits. Rather, they
885// implicitly set CPSR. Since it's not represented in the encoding, the
886// auto-generated decoder won't inject the CPSR operand. We need to fix
887// that as a post-pass.
888void ARMDisassembler::AddThumb1SBit(MCInst &MI,bool InITBlock) const{
889constMCInstrDesc &MCID = MCII->get(MI.getOpcode());
890MCInst::iteratorI =MI.begin();
891for (unsigned i = 0; i < MCID.NumOperands; ++i, ++I) {
892if (I ==MI.end())break;
893if (MCID.operands()[i].isOptionalDef() &&
894 MCID.operands()[i].RegClass == ARM::CCRRegClassID) {
895if (i > 0 && MCID.operands()[i - 1].isPredicate())
896continue;
897MI.insert(I,
898MCOperand::createReg(InITBlock ? ARM::NoRegister : ARM::CPSR));
899return;
900 }
901 }
902
903MI.insert(I,MCOperand::createReg(InITBlock ? ARM::NoRegister : ARM::CPSR));
904}
905
906bool ARMDisassembler::isVectorPredicable(constMCInst &MI) const{
907constMCInstrDesc &MCID = MCII->get(MI.getOpcode());
908for (unsigned i = 0; i < MCID.NumOperands; ++i) {
909if (ARM::isVpred(MCID.operands()[i].OperandType))
910returntrue;
911 }
912returnfalse;
913}
914
915// Most Thumb instructions don't have explicit predicates in the
916// encoding, but rather get their predicates from IT context. We need
917// to fix up the predicate operands using this context information as a
918// post-pass.
919MCDisassembler::DecodeStatus
920ARMDisassembler::AddThumbPredicate(MCInst &MI) const{
921MCDisassembler::DecodeStatus S =Success;
922
923constFeatureBitset &FeatureBits = getSubtargetInfo().getFeatureBits();
924
925// A few instructions actually have predicates encoded in them. Don't
926// try to overwrite it if we're seeing one of those.
927switch (MI.getOpcode()) {
928case ARM::tBcc:
929case ARM::t2Bcc:
930case ARM::tCBZ:
931case ARM::tCBNZ:
932case ARM::tCPS:
933case ARM::t2CPS3p:
934case ARM::t2CPS2p:
935case ARM::t2CPS1p:
936case ARM::t2CSEL:
937case ARM::t2CSINC:
938case ARM::t2CSINV:
939case ARM::t2CSNEG:
940case ARM::tMOVSr:
941case ARM::tSETEND:
942// Some instructions (mostly conditional branches) are not
943// allowed in IT blocks.
944if (ITBlock.instrInITBlock())
945 S =SoftFail;
946else
947returnSuccess;
948break;
949case ARM::t2HINT:
950if (MI.getOperand(0).getImm() == 0x10 && (FeatureBits[ARM::FeatureRAS]) != 0)
951 S =SoftFail;
952break;
953case ARM::tB:
954case ARM::t2B:
955case ARM::t2TBB:
956case ARM::t2TBH:
957// Some instructions (mostly unconditional branches) can
958// only appears at the end of, or outside of, an IT.
959if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
960 S =SoftFail;
961break;
962default:
963break;
964 }
965
966// Warn on non-VPT predicable instruction in a VPT block and a VPT
967// predicable instruction in an IT block
968if ((!isVectorPredicable(MI) && VPTBlock.instrInVPTBlock()) ||
969 (isVectorPredicable(MI) && ITBlock.instrInITBlock()))
970 S =SoftFail;
971
972// If we're in an IT/VPT block, base the predicate on that. Otherwise,
973// assume a predicate of AL.
974unsignedCC =ARMCC::AL;
975unsigned VCC =ARMVCC::None;
976if (ITBlock.instrInITBlock()) {
977CC = ITBlock.getITCC();
978 ITBlock.advanceITState();
979 }elseif (VPTBlock.instrInVPTBlock()) {
980 VCC = VPTBlock.getVPTPred();
981 VPTBlock.advanceVPTState();
982 }
983
984constMCInstrDesc &MCID = MCII->get(MI.getOpcode());
985
986MCInst::iterator CCI =MI.begin();
987for (unsigned i = 0; i < MCID.NumOperands; ++i, ++CCI) {
988if (MCID.operands()[i].isPredicate() || CCI ==MI.end())
989break;
990 }
991
992if (MCID.isPredicable()) {
993 CCI =MI.insert(CCI,MCOperand::createImm(CC));
994 ++CCI;
995if (CC ==ARMCC::AL)
996MI.insert(CCI,MCOperand::createReg(ARM::NoRegister));
997else
998MI.insert(CCI,MCOperand::createReg(ARM::CPSR));
999 }elseif (CC !=ARMCC::AL) {
1000Check(S,SoftFail);
1001 }
1002
1003MCInst::iterator VCCI =MI.begin();
1004unsigned VCCPos;
1005for (VCCPos = 0; VCCPos < MCID.NumOperands; ++VCCPos, ++VCCI) {
1006if (ARM::isVpred(MCID.operands()[VCCPos].OperandType) || VCCI ==MI.end())
1007break;
1008 }
1009
1010if (isVectorPredicable(MI)) {
1011 VCCI =MI.insert(VCCI,MCOperand::createImm(VCC));
1012 ++VCCI;
1013if (VCC ==ARMVCC::None)
1014 VCCI =MI.insert(VCCI,MCOperand::createReg(0));
1015else
1016 VCCI =MI.insert(VCCI,MCOperand::createReg(ARM::P0));
1017 ++VCCI;
1018 VCCI =MI.insert(VCCI,MCOperand::createReg(0));
1019 ++VCCI;
1020if (MCID.operands()[VCCPos].OperandType ==ARM::OPERAND_VPRED_R) {
1021int TiedOp = MCID.getOperandConstraint(VCCPos + 3,MCOI::TIED_TO);
1022assert(TiedOp >= 0 &&
1023"Inactive register in vpred_r is not tied to an output!");
1024// Copy the operand to ensure it's not invalidated when MI grows.
1025MI.insert(VCCI,MCOperand(MI.getOperand(TiedOp)));
1026 }
1027 }elseif (VCC !=ARMVCC::None) {
1028Check(S,SoftFail);
1029 }
1030
1031return S;
1032}
1033
1034// Thumb VFP instructions are a special case. Because we share their
1035// encodings between ARM and Thumb modes, and they are predicable in ARM
1036// mode, the auto-generated decoder will give them an (incorrect)
1037// predicate operand. We need to rewrite these operands based on the IT
1038// context as a post-pass.
1039void ARMDisassembler::UpdateThumbVFPPredicate(
1040DecodeStatus &S,MCInst &MI) const{
1041unsignedCC;
1042CC = ITBlock.getITCC();
1043if (CC == 0xF)
1044CC =ARMCC::AL;
1045if (ITBlock.instrInITBlock())
1046 ITBlock.advanceITState();
1047elseif (VPTBlock.instrInVPTBlock()) {
1048CC = VPTBlock.getVPTPred();
1049 VPTBlock.advanceVPTState();
1050 }
1051
1052constMCInstrDesc &MCID = MCII->get(MI.getOpcode());
1053ArrayRef<MCOperandInfo> OpInfo = MCID.operands();
1054MCInst::iteratorI =MI.begin();
1055unsignedshort NumOps = MCID.NumOperands;
1056for (unsigned i = 0; i < NumOps; ++i, ++I) {
1057if (OpInfo[i].isPredicate() ) {
1058if (CC !=ARMCC::AL && !MCID.isPredicable())
1059Check(S,SoftFail);
1060I->setImm(CC);
1061 ++I;
1062if (CC ==ARMCC::AL)
1063I->setReg(ARM::NoRegister);
1064else
1065I->setReg(ARM::CPSR);
1066return;
1067 }
1068 }
1069}
1070
1071DecodeStatus ARMDisassembler::getThumbInstruction(MCInst &MI,uint64_t &Size,
1072ArrayRef<uint8_t> Bytes,
1073uint64_t Address,
1074raw_ostream &CS) const{
1075 CommentStream = &CS;
1076
1077assert(STI.hasFeature(ARM::ModeThumb) &&
1078"Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
1079
1080// We want to read exactly 2 bytes of data.
1081if (Bytes.size() < 2) {
1082Size = 0;
1083returnMCDisassembler::Fail;
1084 }
1085
1086uint16_t Insn16 = llvm::support::endian::read<uint16_t>(
1087 Bytes.data(), InstructionEndianness);
1088DecodeStatusResult =
1089 decodeInstruction(DecoderTableThumb16,MI, Insn16, Address,this, STI);
1090if (Result !=MCDisassembler::Fail) {
1091Size = 2;
1092Check(Result, AddThumbPredicate(MI));
1093returnResult;
1094 }
1095
1096Result = decodeInstruction(DecoderTableThumbSBit16,MI, Insn16, Address,this,
1097 STI);
1098if (Result) {
1099Size = 2;
1100bool InITBlock = ITBlock.instrInITBlock();
1101Check(Result, AddThumbPredicate(MI));
1102 AddThumb1SBit(MI, InITBlock);
1103returnResult;
1104 }
1105
1106Result =
1107 decodeInstruction(DecoderTableThumb216,MI, Insn16, Address,this, STI);
1108if (Result !=MCDisassembler::Fail) {
1109Size = 2;
1110
1111// Nested IT blocks are UNPREDICTABLE. Must be checked before we add
1112// the Thumb predicate.
1113if (MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
1114Result =MCDisassembler::SoftFail;
1115
1116Check(Result, AddThumbPredicate(MI));
1117
1118// If we find an IT instruction, we need to parse its condition
1119// code and mask operands so that we can apply them correctly
1120// to the subsequent instructions.
1121if (MI.getOpcode() == ARM::t2IT) {
1122unsigned Firstcond =MI.getOperand(0).getImm();
1123unsignedMask =MI.getOperand(1).getImm();
1124 ITBlock.setITState(Firstcond, Mask);
1125
1126// An IT instruction that would give a 'NV' predicate is unpredictable.
1127if (Firstcond ==ARMCC::AL && !isPowerOf2_32(Mask))
1128 CS <<"unpredictable IT predicate sequence";
1129 }
1130
1131returnResult;
1132 }
1133
1134// We want to read exactly 4 bytes of data.
1135if (Bytes.size() < 4) {
1136Size = 0;
1137returnMCDisassembler::Fail;
1138 }
1139
1140uint32_t Insn32 =
1141 (uint32_t(Insn16) << 16) | llvm::support::endian::read<uint16_t>(
1142 Bytes.data() + 2, InstructionEndianness);
1143
1144Result =
1145 decodeInstruction(DecoderTableMVE32,MI, Insn32, Address,this, STI);
1146if (Result !=MCDisassembler::Fail) {
1147Size = 4;
1148
1149// Nested VPT blocks are UNPREDICTABLE. Must be checked before we add
1150// the VPT predicate.
1151if (isVPTOpcode(MI.getOpcode()) && VPTBlock.instrInVPTBlock())
1152Result =MCDisassembler::SoftFail;
1153
1154Check(Result, AddThumbPredicate(MI));
1155
1156if (isVPTOpcode(MI.getOpcode())) {
1157unsignedMask =MI.getOperand(0).getImm();
1158 VPTBlock.setVPTState(Mask);
1159 }
1160
1161returnResult;
1162 }
1163
1164Result =
1165 decodeInstruction(DecoderTableThumb32,MI, Insn32, Address,this, STI);
1166if (Result !=MCDisassembler::Fail) {
1167Size = 4;
1168bool InITBlock = ITBlock.instrInITBlock();
1169Check(Result, AddThumbPredicate(MI));
1170 AddThumb1SBit(MI, InITBlock);
1171returnResult;
1172 }
1173
1174Result =
1175 decodeInstruction(DecoderTableThumb232,MI, Insn32, Address,this, STI);
1176if (Result !=MCDisassembler::Fail) {
1177Size = 4;
1178Check(Result, AddThumbPredicate(MI));
1179returncheckDecodedInstruction(MI,Size, Address, CS, Insn32, Result);
1180 }
1181
1182if (fieldFromInstruction(Insn32, 28, 4) == 0xE) {
1183Result =
1184 decodeInstruction(DecoderTableVFP32,MI, Insn32, Address,this, STI);
1185if (Result !=MCDisassembler::Fail) {
1186Size = 4;
1187 UpdateThumbVFPPredicate(Result,MI);
1188returnResult;
1189 }
1190 }
1191
1192Result =
1193 decodeInstruction(DecoderTableVFPV832,MI, Insn32, Address,this, STI);
1194if (Result !=MCDisassembler::Fail) {
1195Size = 4;
1196returnResult;
1197 }
1198
1199if (fieldFromInstruction(Insn32, 28, 4) == 0xE) {
1200Result = decodeInstruction(DecoderTableNEONDup32,MI, Insn32, Address,this,
1201 STI);
1202if (Result !=MCDisassembler::Fail) {
1203Size = 4;
1204Check(Result, AddThumbPredicate(MI));
1205returnResult;
1206 }
1207 }
1208
1209if (fieldFromInstruction(Insn32, 24, 8) == 0xF9) {
1210uint32_t NEONLdStInsn = Insn32;
1211 NEONLdStInsn &= 0xF0FFFFFF;
1212 NEONLdStInsn |= 0x04000000;
1213Result = decodeInstruction(DecoderTableNEONLoadStore32,MI, NEONLdStInsn,
1214 Address,this, STI);
1215if (Result !=MCDisassembler::Fail) {
1216Size = 4;
1217Check(Result, AddThumbPredicate(MI));
1218returnResult;
1219 }
1220 }
1221
1222if (fieldFromInstruction(Insn32, 24, 4) == 0xF) {
1223uint32_t NEONDataInsn = Insn32;
1224 NEONDataInsn &= 0xF0FFFFFF;// Clear bits 27-24
1225 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4;// Move bit 28 to bit 24
1226 NEONDataInsn |= 0x12000000;// Set bits 28 and 25
1227Result = decodeInstruction(DecoderTableNEONData32,MI, NEONDataInsn,
1228 Address,this, STI);
1229if (Result !=MCDisassembler::Fail) {
1230Size = 4;
1231Check(Result, AddThumbPredicate(MI));
1232returnResult;
1233 }
1234
1235uint32_t NEONCryptoInsn = Insn32;
1236 NEONCryptoInsn &= 0xF0FFFFFF;// Clear bits 27-24
1237 NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4;// Move bit 28 to bit 24
1238 NEONCryptoInsn |= 0x12000000;// Set bits 28 and 25
1239Result = decodeInstruction(DecoderTablev8Crypto32,MI, NEONCryptoInsn,
1240 Address,this, STI);
1241if (Result !=MCDisassembler::Fail) {
1242Size = 4;
1243returnResult;
1244 }
1245
1246uint32_t NEONv8Insn = Insn32;
1247 NEONv8Insn &= 0xF3FFFFFF;// Clear bits 27-26
1248Result = decodeInstruction(DecoderTablev8NEON32,MI, NEONv8Insn, Address,
1249this, STI);
1250if (Result !=MCDisassembler::Fail) {
1251Size = 4;
1252returnResult;
1253 }
1254 }
1255
1256uint32_t Coproc = fieldFromInstruction(Insn32, 8, 4);
1257constuint8_t *DecoderTable =ARM::isCDECoproc(Coproc, STI)
1258 ? DecoderTableThumb2CDE32
1259 : DecoderTableThumb2CoProc32;
1260Result =
1261 decodeInstruction(DecoderTable,MI, Insn32, Address,this, STI);
1262if (Result !=MCDisassembler::Fail) {
1263Size = 4;
1264Check(Result, AddThumbPredicate(MI));
1265returnResult;
1266 }
1267
1268Size = 0;
1269returnMCDisassembler::Fail;
1270}
1271
1272extern"C"LLVM_EXTERNAL_VISIBILITYvoidLLVMInitializeARMDisassembler() {
1273TargetRegistry::RegisterMCDisassembler(getTheARMLETarget(),
1274createARMDisassembler);
1275TargetRegistry::RegisterMCDisassembler(getTheARMBETarget(),
1276createARMDisassembler);
1277TargetRegistry::RegisterMCDisassembler(getTheThumbLETarget(),
1278createARMDisassembler);
1279TargetRegistry::RegisterMCDisassembler(getTheThumbBETarget(),
1280createARMDisassembler);
1281}
1282
1283staticconstuint16_tGPRDecoderTable[] = {
1284 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
1285 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
1286 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
1287 ARM::R12, ARM::SP, ARM::LR, ARM::PC
1288};
1289
1290staticconstuint16_tCLRMGPRDecoderTable[] = {
1291 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
1292 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
1293 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
1294 ARM::R12, 0, ARM::LR, ARM::APSR
1295};
1296
1297staticDecodeStatusDecodeGPRRegisterClass(MCInst &Inst,unsigned RegNo,
1298uint64_t Address,
1299constMCDisassembler *Decoder) {
1300if (RegNo > 15)
1301returnMCDisassembler::Fail;
1302
1303unsignedRegister =GPRDecoderTable[RegNo];
1304 Inst.addOperand(MCOperand::createReg(Register));
1305returnMCDisassembler::Success;
1306}
1307
1308staticDecodeStatusDecodeCLRMGPRRegisterClass(MCInst &Inst,unsigned RegNo,
1309uint64_t Address,
1310constMCDisassembler *Decoder) {
1311if (RegNo > 15)
1312returnMCDisassembler::Fail;
1313
1314unsignedRegister =CLRMGPRDecoderTable[RegNo];
1315if (Register == 0)
1316returnMCDisassembler::Fail;
1317
1318 Inst.addOperand(MCOperand::createReg(Register));
1319returnMCDisassembler::Success;
1320}
1321
1322staticDecodeStatusDecodeGPRnopcRegisterClass(MCInst &Inst,unsigned RegNo,
1323uint64_t Address,
1324constMCDisassembler *Decoder) {
1325DecodeStatus S =MCDisassembler::Success;
1326
1327if (RegNo == 15)
1328 S =MCDisassembler::SoftFail;
1329
1330Check(S,DecodeGPRRegisterClass(Inst, RegNo,Address, Decoder));
1331
1332return S;
1333}
1334
1335staticDecodeStatusDecodeGPRnospRegisterClass(MCInst &Inst,unsigned RegNo,
1336uint64_t Address,
1337constMCDisassembler *Decoder) {
1338DecodeStatus S =MCDisassembler::Success;
1339
1340if (RegNo == 13)
1341 S =MCDisassembler::SoftFail;
1342
1343Check(S,DecodeGPRRegisterClass(Inst, RegNo,Address, Decoder));
1344
1345return S;
1346}
1347
1348staticDecodeStatus
1349DecodeGPRwithAPSRRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
1350constMCDisassembler *Decoder) {
1351DecodeStatus S =MCDisassembler::Success;
1352
1353if (RegNo == 15)
1354 {
1355 Inst.addOperand(MCOperand::createReg(ARM::APSR_NZCV));
1356returnMCDisassembler::Success;
1357 }
1358
1359Check(S,DecodeGPRRegisterClass(Inst, RegNo,Address, Decoder));
1360return S;
1361}
1362
1363staticDecodeStatus
1364DecodeGPRwithZRRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
1365constMCDisassembler *Decoder) {
1366DecodeStatus S =MCDisassembler::Success;
1367
1368if (RegNo == 15)
1369 {
1370 Inst.addOperand(MCOperand::createReg(ARM::ZR));
1371returnMCDisassembler::Success;
1372 }
1373
1374if (RegNo == 13)
1375Check(S,MCDisassembler::SoftFail);
1376
1377Check(S,DecodeGPRRegisterClass(Inst, RegNo,Address, Decoder));
1378return S;
1379}
1380
1381staticDecodeStatus
1382DecodeGPRwithZRnospRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
1383constMCDisassembler *Decoder) {
1384DecodeStatus S =MCDisassembler::Success;
1385if (RegNo == 13)
1386returnMCDisassembler::Fail;
1387Check(S,DecodeGPRwithZRRegisterClass(Inst, RegNo,Address, Decoder));
1388return S;
1389}
1390
1391staticDecodeStatusDecodetGPRRegisterClass(MCInst &Inst,unsigned RegNo,
1392uint64_t Address,
1393constMCDisassembler *Decoder) {
1394if (RegNo > 7)
1395returnMCDisassembler::Fail;
1396returnDecodeGPRRegisterClass(Inst, RegNo,Address, Decoder);
1397}
1398
1399staticconstuint16_tGPRPairDecoderTable[] = {
1400 ARM::R0_R1, ARM::R2_R3, ARM::R4_R5, ARM::R6_R7,
1401 ARM::R8_R9, ARM::R10_R11, ARM::R12_SP
1402};
1403
1404staticDecodeStatusDecodeGPRPairRegisterClass(MCInst &Inst,unsigned RegNo,
1405uint64_t Address,
1406constMCDisassembler *Decoder) {
1407DecodeStatus S =MCDisassembler::Success;
1408
1409// According to the Arm ARM RegNo = 14 is undefined, but we return fail
1410// rather than SoftFail as there is no GPRPair table entry for index 7.
1411if (RegNo > 13)
1412returnMCDisassembler::Fail;
1413
1414if (RegNo & 1)
1415 S =MCDisassembler::SoftFail;
1416
1417unsigned RegisterPair =GPRPairDecoderTable[RegNo/2];
1418 Inst.addOperand(MCOperand::createReg(RegisterPair));
1419return S;
1420}
1421
1422staticDecodeStatus
1423DecodeGPRPairnospRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
1424constMCDisassembler *Decoder) {
1425if (RegNo > 13)
1426returnMCDisassembler::Fail;
1427
1428unsigned RegisterPair =GPRPairDecoderTable[RegNo/2];
1429 Inst.addOperand(MCOperand::createReg(RegisterPair));
1430
1431if ((RegNo & 1) || RegNo > 10)
1432returnMCDisassembler::SoftFail;
1433returnMCDisassembler::Success;
1434}
1435
1436staticDecodeStatusDecodeGPRspRegisterClass(MCInst &Inst,unsigned RegNo,
1437uint64_t Address,
1438constMCDisassembler *Decoder) {
1439if (RegNo != 13)
1440returnMCDisassembler::Fail;
1441
1442unsignedRegister =GPRDecoderTable[RegNo];
1443 Inst.addOperand(MCOperand::createReg(Register));
1444returnMCDisassembler::Success;
1445}
1446
1447staticDecodeStatusDecodetcGPRRegisterClass(MCInst &Inst,unsigned RegNo,
1448uint64_t Address,
1449constMCDisassembler *Decoder) {
1450unsignedRegister = 0;
1451switch (RegNo) {
1452case 0:
1453Register = ARM::R0;
1454break;
1455case 1:
1456Register = ARM::R1;
1457break;
1458case 2:
1459Register = ARM::R2;
1460break;
1461case 3:
1462Register = ARM::R3;
1463break;
1464case 9:
1465Register = ARM::R9;
1466break;
1467case 12:
1468Register = ARM::R12;
1469break;
1470default:
1471returnMCDisassembler::Fail;
1472 }
1473
1474 Inst.addOperand(MCOperand::createReg(Register));
1475returnMCDisassembler::Success;
1476}
1477
1478staticDecodeStatusDecoderGPRRegisterClass(MCInst &Inst,unsigned RegNo,
1479uint64_t Address,
1480constMCDisassembler *Decoder) {
1481DecodeStatus S =MCDisassembler::Success;
1482
1483constFeatureBitset &featureBits =
1484 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
1485
1486if ((RegNo == 13 && !featureBits[ARM::HasV8Ops]) || RegNo == 15)
1487 S =MCDisassembler::SoftFail;
1488
1489Check(S,DecodeGPRRegisterClass(Inst, RegNo,Address, Decoder));
1490return S;
1491}
1492
1493staticconstuint16_tSPRDecoderTable[] = {
1494 ARM::S0, ARM::S1, ARM::S2, ARM::S3,
1495 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
1496 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
1497 ARM::S12, ARM::S13, ARM::S14, ARM::S15,
1498 ARM::S16, ARM::S17, ARM::S18, ARM::S19,
1499 ARM::S20, ARM::S21, ARM::S22, ARM::S23,
1500 ARM::S24, ARM::S25, ARM::S26, ARM::S27,
1501 ARM::S28, ARM::S29, ARM::S30, ARM::S31
1502};
1503
1504staticDecodeStatusDecodeSPRRegisterClass(MCInst &Inst,unsigned RegNo,
1505uint64_t Address,
1506constMCDisassembler *Decoder) {
1507if (RegNo > 31)
1508returnMCDisassembler::Fail;
1509
1510unsignedRegister =SPRDecoderTable[RegNo];
1511 Inst.addOperand(MCOperand::createReg(Register));
1512returnMCDisassembler::Success;
1513}
1514
1515staticDecodeStatusDecodeHPRRegisterClass(MCInst &Inst,unsigned RegNo,
1516uint64_t Address,
1517constMCDisassembler *Decoder) {
1518returnDecodeSPRRegisterClass(Inst, RegNo,Address, Decoder);
1519}
1520
1521staticconstuint16_tDPRDecoderTable[] = {
1522 ARM::D0, ARM::D1, ARM::D2, ARM::D3,
1523 ARM::D4, ARM::D5, ARM::D6, ARM::D7,
1524 ARM::D8, ARM::D9, ARM::D10, ARM::D11,
1525 ARM::D12, ARM::D13, ARM::D14, ARM::D15,
1526ARM::D16, ARM::D17, ARM::D18, ARM::D19,
1527 ARM::D20, ARM::D21, ARM::D22, ARM::D23,
1528 ARM::D24, ARM::D25, ARM::D26, ARM::D27,
1529 ARM::D28, ARM::D29, ARM::D30, ARM::D31
1530};
1531
1532// Does this instruction/subtarget permit use of registers d16-d31?
1533staticboolPermitsD32(constMCInst &Inst,constMCDisassembler *Decoder) {
1534if (Inst.getOpcode() == ARM::VSCCLRMD || Inst.getOpcode() == ARM::VSCCLRMS)
1535returntrue;
1536constFeatureBitset &featureBits =
1537 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
1538return featureBits[ARM::FeatureD32];
1539}
1540
1541staticDecodeStatusDecodeDPRRegisterClass(MCInst &Inst,unsigned RegNo,
1542uint64_t Address,
1543constMCDisassembler *Decoder) {
1544if (RegNo > (PermitsD32(Inst, Decoder) ? 31u : 15u))
1545returnMCDisassembler::Fail;
1546
1547unsignedRegister =DPRDecoderTable[RegNo];
1548 Inst.addOperand(MCOperand::createReg(Register));
1549returnMCDisassembler::Success;
1550}
1551
1552staticDecodeStatusDecodeDPR_8RegisterClass(MCInst &Inst,unsigned RegNo,
1553uint64_t Address,
1554constMCDisassembler *Decoder) {
1555if (RegNo > 7)
1556returnMCDisassembler::Fail;
1557returnDecodeDPRRegisterClass(Inst, RegNo,Address, Decoder);
1558}
1559
1560staticDecodeStatusDecodeSPR_8RegisterClass(MCInst &Inst,unsigned RegNo,
1561uint64_t Address,
1562constMCDisassembler *Decoder) {
1563if (RegNo > 15)
1564returnMCDisassembler::Fail;
1565returnDecodeSPRRegisterClass(Inst, RegNo,Address, Decoder);
1566}
1567
1568staticDecodeStatusDecodeDPR_VFP2RegisterClass(MCInst &Inst,unsigned RegNo,
1569uint64_t Address,
1570constMCDisassembler *Decoder) {
1571if (RegNo > 15)
1572returnMCDisassembler::Fail;
1573returnDecodeDPRRegisterClass(Inst, RegNo,Address, Decoder);
1574}
1575
1576staticconstuint16_tQPRDecoderTable[] = {
1577 ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
1578 ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7,
1579 ARM::Q8, ARM::Q9, ARM::Q10, ARM::Q11,
1580 ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
1581};
1582
1583staticDecodeStatusDecodeQPRRegisterClass(MCInst &Inst,unsigned RegNo,
1584uint64_t Address,
1585constMCDisassembler *Decoder) {
1586if (RegNo > 31 || (RegNo & 1) != 0)
1587returnMCDisassembler::Fail;
1588 RegNo >>= 1;
1589
1590unsignedRegister =QPRDecoderTable[RegNo];
1591 Inst.addOperand(MCOperand::createReg(Register));
1592returnMCDisassembler::Success;
1593}
1594
1595staticconstuint16_tDPairDecoderTable[] = {
1596 ARM::Q0, ARM::D1_D2, ARM::Q1, ARM::D3_D4, ARM::Q2, ARM::D5_D6,
1597 ARM::Q3, ARM::D7_D8, ARM::Q4, ARM::D9_D10, ARM::Q5, ARM::D11_D12,
1598 ARM::Q6, ARM::D13_D14, ARM::Q7, ARM::D15_D16, ARM::Q8, ARM::D17_D18,
1599 ARM::Q9, ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
1600 ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
1601 ARM::Q15
1602};
1603
1604staticDecodeStatusDecodeDPairRegisterClass(MCInst &Inst,unsigned RegNo,
1605uint64_t Address,
1606constMCDisassembler *Decoder) {
1607if (RegNo > 30)
1608returnMCDisassembler::Fail;
1609
1610unsignedRegister =DPairDecoderTable[RegNo];
1611 Inst.addOperand(MCOperand::createReg(Register));
1612returnMCDisassembler::Success;
1613}
1614
1615staticconstuint16_tDPairSpacedDecoderTable[] = {
1616 ARM::D0_D2, ARM::D1_D3, ARM::D2_D4, ARM::D3_D5,
1617 ARM::D4_D6, ARM::D5_D7, ARM::D6_D8, ARM::D7_D9,
1618 ARM::D8_D10, ARM::D9_D11, ARM::D10_D12, ARM::D11_D13,
1619 ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
1620 ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
1621 ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
1622 ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
1623 ARM::D28_D30, ARM::D29_D31
1624};
1625
1626staticDecodeStatus
1627DecodeDPairSpacedRegisterClass(MCInst &Inst,unsigned RegNo,uint64_t Address,
1628constMCDisassembler *Decoder) {
1629if (RegNo > 29)
1630returnMCDisassembler::Fail;
1631
1632unsignedRegister =DPairSpacedDecoderTable[RegNo];
1633 Inst.addOperand(MCOperand::createReg(Register));
1634returnMCDisassembler::Success;
1635}
1636
1637staticDecodeStatusDecodePredicateOperand(MCInst &Inst,unsigned Val,
1638uint64_t Address,
1639constMCDisassembler *Decoder) {
1640DecodeStatus S =MCDisassembler::Success;
1641if (Val == 0xF)returnMCDisassembler::Fail;
1642// AL predicate is not allowed on Thumb1 branches.
1643if (Inst.getOpcode() == ARM::tBcc && Val == 0xE)
1644returnMCDisassembler::Fail;
1645constMCInstrInfo *MCII =
1646static_cast<constARMDisassembler *>(Decoder)->MCII.get();
1647if (Val !=ARMCC::AL && !MCII->get(Inst.getOpcode()).isPredicable())
1648Check(S,MCDisassembler::SoftFail);
1649 Inst.addOperand(MCOperand::createImm(Val));
1650if (Val ==ARMCC::AL) {
1651 Inst.addOperand(MCOperand::createReg(ARM::NoRegister));
1652 }else
1653 Inst.addOperand(MCOperand::createReg(ARM::CPSR));
1654return S;
1655}
1656
1657staticDecodeStatusDecodeCCOutOperand(MCInst &Inst,unsigned Val,
1658uint64_t Address,
1659constMCDisassembler *Decoder) {
1660if (Val)
1661 Inst.addOperand(MCOperand::createReg(ARM::CPSR));
1662else
1663 Inst.addOperand(MCOperand::createReg(ARM::NoRegister));
1664returnMCDisassembler::Success;
1665}
1666
1667staticDecodeStatusDecodeSORegImmOperand(MCInst &Inst,unsigned Val,
1668uint64_t Address,
1669constMCDisassembler *Decoder) {
1670DecodeStatus S =MCDisassembler::Success;
1671
1672unsigned Rm = fieldFromInstruction(Val, 0, 4);
1673unsigned type = fieldFromInstruction(Val, 5, 2);
1674unsigned imm = fieldFromInstruction(Val, 7, 5);
1675
1676// Register-immediate
1677if (!Check(S,DecoderGPRRegisterClass(Inst, Rm,Address, Decoder)))
1678returnMCDisassembler::Fail;
1679
1680ARM_AM::ShiftOpc Shift =ARM_AM::lsl;
1681switch (type) {
1682case 0:
1683 Shift =ARM_AM::lsl;
1684break;
1685case 1:
1686 Shift =ARM_AM::lsr;
1687break;
1688case 2:
1689 Shift =ARM_AM::asr;
1690break;
1691case 3:
1692 Shift =ARM_AM::ror;
1693break;
1694 }
1695
1696if (Shift ==ARM_AM::ror && imm == 0)
1697 Shift =ARM_AM::rrx;
1698
1699unsignedOp = Shift | (imm << 3);
1700 Inst.addOperand(MCOperand::createImm(Op));
1701
1702return S;
1703}
1704
1705staticDecodeStatusDecodeSORegRegOperand(MCInst &Inst,unsigned Val,
1706uint64_t Address,
1707constMCDisassembler *Decoder) {
1708DecodeStatus S =MCDisassembler::Success;
1709
1710unsigned Rm = fieldFromInstruction(Val, 0, 4);
1711unsigned type = fieldFromInstruction(Val, 5, 2);
1712unsigned Rs = fieldFromInstruction(Val, 8, 4);
1713
1714// Register-register
1715if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rm,Address, Decoder)))
1716returnMCDisassembler::Fail;
1717if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rs,Address, Decoder)))
1718returnMCDisassembler::Fail;
1719
1720ARM_AM::ShiftOpc Shift =ARM_AM::lsl;
1721switch (type) {
1722case 0:
1723 Shift =ARM_AM::lsl;
1724break;
1725case 1:
1726 Shift =ARM_AM::lsr;
1727break;
1728case 2:
1729 Shift =ARM_AM::asr;
1730break;
1731case 3:
1732 Shift =ARM_AM::ror;
1733break;
1734 }
1735
1736 Inst.addOperand(MCOperand::createImm(Shift));
1737
1738return S;
1739}
1740
1741staticDecodeStatusDecodeRegListOperand(MCInst &Inst,unsigned Val,
1742uint64_t Address,
1743constMCDisassembler *Decoder) {
1744DecodeStatus S =MCDisassembler::Success;
1745
1746bool NeedDisjointWriteback =false;
1747MCRegister WritebackReg;
1748bool CLRM =false;
1749switch (Inst.getOpcode()) {
1750default:
1751break;
1752case ARM::LDMIA_UPD:
1753case ARM::LDMDB_UPD:
1754case ARM::LDMIB_UPD:
1755case ARM::LDMDA_UPD:
1756case ARM::t2LDMIA_UPD:
1757case ARM::t2LDMDB_UPD:
1758case ARM::t2STMIA_UPD:
1759case ARM::t2STMDB_UPD:
1760 NeedDisjointWriteback =true;
1761 WritebackReg = Inst.getOperand(0).getReg();
1762break;
1763case ARM::t2CLRM:
1764 CLRM =true;
1765break;
1766 }
1767
1768// Empty register lists are not allowed.
1769if (Val == 0)returnMCDisassembler::Fail;
1770for (unsigned i = 0; i < 16; ++i) {
1771if (Val & (1 << i)) {
1772if (CLRM) {
1773if (!Check(S,DecodeCLRMGPRRegisterClass(Inst, i,Address, Decoder))) {
1774returnMCDisassembler::Fail;
1775 }
1776 }else {
1777if (!Check(S,DecodeGPRRegisterClass(Inst, i,Address, Decoder)))
1778returnMCDisassembler::Fail;
1779// Writeback not allowed if Rn is in the target list.
1780if (NeedDisjointWriteback && WritebackReg == Inst.end()[-1].getReg())
1781Check(S,MCDisassembler::SoftFail);
1782 }
1783 }
1784 }
1785
1786return S;
1787}
1788
1789staticDecodeStatusDecodeSPRRegListOperand(MCInst &Inst,unsigned Val,
1790uint64_t Address,
1791constMCDisassembler *Decoder) {
1792DecodeStatus S =MCDisassembler::Success;
1793
1794unsigned Vd = fieldFromInstruction(Val, 8, 5);
1795unsigned regs = fieldFromInstruction(Val, 0, 8);
1796
1797// In case of unpredictable encoding, tweak the operands.
1798if (regs == 0 || (Vd + regs) > 32) {
1799 regs = Vd + regs > 32 ? 32 - Vd : regs;
1800 regs = std::max( 1u, regs);
1801 S =MCDisassembler::SoftFail;
1802 }
1803
1804if (!Check(S,DecodeSPRRegisterClass(Inst, Vd,Address, Decoder)))
1805returnMCDisassembler::Fail;
1806for (unsigned i = 0; i < (regs - 1); ++i) {
1807if (!Check(S,DecodeSPRRegisterClass(Inst, ++Vd,Address, Decoder)))
1808returnMCDisassembler::Fail;
1809 }
1810
1811return S;
1812}
1813
1814staticDecodeStatusDecodeDPRRegListOperand(MCInst &Inst,unsigned Val,
1815uint64_t Address,
1816constMCDisassembler *Decoder) {
1817DecodeStatus S =MCDisassembler::Success;
1818
1819unsigned Vd = fieldFromInstruction(Val, 8, 5);
1820unsigned regs = fieldFromInstruction(Val, 1, 7);
1821
1822// In case of unpredictable encoding, tweak the operands.
1823unsigned MaxReg =PermitsD32(Inst, Decoder) ? 32 : 16;
1824if (regs == 0 || (Vd + regs) > MaxReg) {
1825 regs = Vd + regs > MaxReg ? MaxReg - Vd : regs;
1826 regs = std::max( 1u, regs);
1827 regs = std::min(MaxReg, regs);
1828 S =MCDisassembler::SoftFail;
1829 }
1830
1831if (!Check(S,DecodeDPRRegisterClass(Inst, Vd,Address, Decoder)))
1832returnMCDisassembler::Fail;
1833for (unsigned i = 0; i < (regs - 1); ++i) {
1834if (!Check(S,DecodeDPRRegisterClass(Inst, ++Vd,Address, Decoder)))
1835returnMCDisassembler::Fail;
1836 }
1837
1838return S;
1839}
1840
1841staticDecodeStatusDecodeBitfieldMaskOperand(MCInst &Inst,unsigned Val,
1842uint64_t Address,
1843constMCDisassembler *Decoder) {
1844// This operand encodes a mask of contiguous zeros between a specified MSB
1845// and LSB. To decode it, we create the mask of all bits MSB-and-lower,
1846// the mask of all bits LSB-and-lower, and then xor them to create
1847// the mask of that's all ones on [msb, lsb]. Finally we not it to
1848// create the final mask.
1849unsigned msb = fieldFromInstruction(Val, 5, 5);
1850unsigned lsb = fieldFromInstruction(Val, 0, 5);
1851
1852DecodeStatus S =MCDisassembler::Success;
1853if (lsb > msb) {
1854Check(S,MCDisassembler::SoftFail);
1855// The check above will cause the warning for the "potentially undefined
1856// instruction encoding" but we can't build a bad MCOperand value here
1857// with a lsb > msb or else printing the MCInst will cause a crash.
1858 lsb = msb;
1859 }
1860
1861uint32_t msb_mask = 0xFFFFFFFF;
1862if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
1863uint32_t lsb_mask = (1U << lsb) - 1;
1864
1865 Inst.addOperand(MCOperand::createImm(~(msb_mask ^ lsb_mask)));
1866return S;
1867}
1868
1869staticDecodeStatusDecodeCopMemInstruction(MCInst &Inst,unsignedInsn,
1870uint64_t Address,
1871constMCDisassembler *Decoder) {
1872DecodeStatus S =MCDisassembler::Success;
1873
1874unsignedpred = fieldFromInstruction(Insn, 28, 4);
1875unsigned CRd = fieldFromInstruction(Insn, 12, 4);
1876unsigned coproc = fieldFromInstruction(Insn, 8, 4);
1877unsigned imm = fieldFromInstruction(Insn, 0, 8);
1878unsigned Rn = fieldFromInstruction(Insn, 16, 4);
1879unsigned U = fieldFromInstruction(Insn, 23, 1);
1880constFeatureBitset &featureBits =
1881 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
1882
1883switch (Inst.getOpcode()) {
1884case ARM::LDC_OFFSET:
1885case ARM::LDC_PRE:
1886case ARM::LDC_POST:
1887case ARM::LDC_OPTION:
1888case ARM::LDCL_OFFSET:
1889case ARM::LDCL_PRE:
1890case ARM::LDCL_POST:
1891case ARM::LDCL_OPTION:
1892case ARM::STC_OFFSET:
1893case ARM::STC_PRE:
1894case ARM::STC_POST:
1895case ARM::STC_OPTION:
1896case ARM::STCL_OFFSET:
1897case ARM::STCL_PRE:
1898case ARM::STCL_POST:
1899case ARM::STCL_OPTION:
1900case ARM::t2LDC_OFFSET:
1901case ARM::t2LDC_PRE:
1902case ARM::t2LDC_POST:
1903case ARM::t2LDC_OPTION:
1904case ARM::t2LDCL_OFFSET:
1905case ARM::t2LDCL_PRE:
1906case ARM::t2LDCL_POST:
1907case ARM::t2LDCL_OPTION:
1908case ARM::t2STC_OFFSET:
1909case ARM::t2STC_PRE:
1910case ARM::t2STC_POST:
1911case ARM::t2STC_OPTION:
1912case ARM::t2STCL_OFFSET:
1913case ARM::t2STCL_PRE:
1914case ARM::t2STCL_POST:
1915case ARM::t2STCL_OPTION:
1916case ARM::t2LDC2_OFFSET:
1917case ARM::t2LDC2L_OFFSET:
1918case ARM::t2LDC2_PRE:
1919case ARM::t2LDC2L_PRE:
1920case ARM::t2STC2_OFFSET:
1921case ARM::t2STC2L_OFFSET:
1922case ARM::t2STC2_PRE:
1923case ARM::t2STC2L_PRE:
1924case ARM::LDC2_OFFSET:
1925case ARM::LDC2L_OFFSET:
1926case ARM::LDC2_PRE:
1927case ARM::LDC2L_PRE:
1928case ARM::STC2_OFFSET:
1929case ARM::STC2L_OFFSET:
1930case ARM::STC2_PRE:
1931case ARM::STC2L_PRE:
1932case ARM::t2LDC2_OPTION:
1933case ARM::t2STC2_OPTION:
1934case ARM::t2LDC2_POST:
1935case ARM::t2LDC2L_POST:
1936case ARM::t2STC2_POST:
1937case ARM::t2STC2L_POST:
1938case ARM::LDC2_POST:
1939case ARM::LDC2L_POST:
1940case ARM::STC2_POST:
1941case ARM::STC2L_POST:
1942if (coproc == 0xA || coproc == 0xB ||
1943 (featureBits[ARM::HasV8_1MMainlineOps] &&
1944 (coproc == 0x8 || coproc == 0x9 || coproc == 0xA || coproc == 0xB ||
1945 coproc == 0xE || coproc == 0xF)))
1946returnMCDisassembler::Fail;
1947break;
1948default:
1949break;
1950 }
1951
1952if (featureBits[ARM::HasV8Ops] && (coproc != 14))
1953returnMCDisassembler::Fail;
1954
1955 Inst.addOperand(MCOperand::createImm(coproc));
1956 Inst.addOperand(MCOperand::createImm(CRd));
1957if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
1958returnMCDisassembler::Fail;
1959
1960switch (Inst.getOpcode()) {
1961case ARM::t2LDC2_OFFSET:
1962case ARM::t2LDC2L_OFFSET:
1963case ARM::t2LDC2_PRE:
1964case ARM::t2LDC2L_PRE:
1965case ARM::t2STC2_OFFSET:
1966case ARM::t2STC2L_OFFSET:
1967case ARM::t2STC2_PRE:
1968case ARM::t2STC2L_PRE:
1969case ARM::LDC2_OFFSET:
1970case ARM::LDC2L_OFFSET:
1971case ARM::LDC2_PRE:
1972case ARM::LDC2L_PRE:
1973case ARM::STC2_OFFSET:
1974case ARM::STC2L_OFFSET:
1975case ARM::STC2_PRE:
1976case ARM::STC2L_PRE:
1977case ARM::t2LDC_OFFSET:
1978case ARM::t2LDCL_OFFSET:
1979case ARM::t2LDC_PRE:
1980case ARM::t2LDCL_PRE:
1981case ARM::t2STC_OFFSET:
1982case ARM::t2STCL_OFFSET:
1983case ARM::t2STC_PRE:
1984case ARM::t2STCL_PRE:
1985case ARM::LDC_OFFSET:
1986case ARM::LDCL_OFFSET:
1987case ARM::LDC_PRE:
1988case ARM::LDCL_PRE:
1989case ARM::STC_OFFSET:
1990case ARM::STCL_OFFSET:
1991case ARM::STC_PRE:
1992case ARM::STCL_PRE:
1993 imm =ARM_AM::getAM5Opc(U ?ARM_AM::add :ARM_AM::sub, imm);
1994 Inst.addOperand(MCOperand::createImm(imm));
1995break;
1996case ARM::t2LDC2_POST:
1997case ARM::t2LDC2L_POST:
1998case ARM::t2STC2_POST:
1999case ARM::t2STC2L_POST:
2000case ARM::LDC2_POST:
2001case ARM::LDC2L_POST:
2002case ARM::STC2_POST:
2003case ARM::STC2L_POST:
2004case ARM::t2LDC_POST:
2005case ARM::t2LDCL_POST:
2006case ARM::t2STC_POST:
2007case ARM::t2STCL_POST:
2008case ARM::LDC_POST:
2009case ARM::LDCL_POST:
2010case ARM::STC_POST:
2011case ARM::STCL_POST:
2012 imm |= U << 8;
2013 [[fallthrough]];
2014default:
2015// The 'option' variant doesn't encode 'U' in the immediate since
2016// the immediate is unsigned [0,255].
2017 Inst.addOperand(MCOperand::createImm(imm));
2018break;
2019 }
2020
2021switch (Inst.getOpcode()) {
2022case ARM::LDC_OFFSET:
2023case ARM::LDC_PRE:
2024case ARM::LDC_POST:
2025case ARM::LDC_OPTION:
2026case ARM::LDCL_OFFSET:
2027case ARM::LDCL_PRE:
2028case ARM::LDCL_POST:
2029case ARM::LDCL_OPTION:
2030case ARM::STC_OFFSET:
2031case ARM::STC_PRE:
2032case ARM::STC_POST:
2033case ARM::STC_OPTION:
2034case ARM::STCL_OFFSET:
2035case ARM::STCL_PRE:
2036case ARM::STCL_POST:
2037case ARM::STCL_OPTION:
2038if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2039returnMCDisassembler::Fail;
2040break;
2041default:
2042break;
2043 }
2044
2045return S;
2046}
2047
2048staticDecodeStatus
2049DecodeAddrMode2IdxInstruction(MCInst &Inst,unsignedInsn,uint64_t Address,
2050constMCDisassembler *Decoder) {
2051DecodeStatus S =MCDisassembler::Success;
2052
2053unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2054unsigned Rt = fieldFromInstruction(Insn, 12, 4);
2055unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2056unsigned imm = fieldFromInstruction(Insn, 0, 12);
2057unsignedpred = fieldFromInstruction(Insn, 28, 4);
2058unsigned reg = fieldFromInstruction(Insn, 25, 1);
2059unsignedP = fieldFromInstruction(Insn, 24, 1);
2060unsigned W = fieldFromInstruction(Insn, 21, 1);
2061
2062// On stores, the writeback operand precedes Rt.
2063switch (Inst.getOpcode()) {
2064case ARM::STR_POST_IMM:
2065case ARM::STR_POST_REG:
2066case ARM::STRB_POST_IMM:
2067case ARM::STRB_POST_REG:
2068case ARM::STRT_POST_REG:
2069case ARM::STRT_POST_IMM:
2070case ARM::STRBT_POST_REG:
2071case ARM::STRBT_POST_IMM:
2072if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2073returnMCDisassembler::Fail;
2074break;
2075default:
2076break;
2077 }
2078
2079if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
2080returnMCDisassembler::Fail;
2081
2082// On loads, the writeback operand comes after Rt.
2083switch (Inst.getOpcode()) {
2084case ARM::LDR_POST_IMM:
2085case ARM::LDR_POST_REG:
2086case ARM::LDRB_POST_IMM:
2087case ARM::LDRB_POST_REG:
2088case ARM::LDRBT_POST_REG:
2089case ARM::LDRBT_POST_IMM:
2090case ARM::LDRT_POST_REG:
2091case ARM::LDRT_POST_IMM:
2092if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2093returnMCDisassembler::Fail;
2094break;
2095default:
2096break;
2097 }
2098
2099if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2100returnMCDisassembler::Fail;
2101
2102ARM_AM::AddrOpcOp =ARM_AM::add;
2103if (!fieldFromInstruction(Insn, 23, 1))
2104Op =ARM_AM::sub;
2105
2106bool writeback = (P == 0) || (W == 1);
2107unsigned idx_mode = 0;
2108if (P && writeback)
2109 idx_mode =ARMII::IndexModePre;
2110elseif (!P && writeback)
2111 idx_mode =ARMII::IndexModePost;
2112
2113if (writeback && (Rn == 15 || Rn == Rt))
2114 S =MCDisassembler::SoftFail;// UNPREDICTABLE
2115
2116if (reg) {
2117if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rm,Address, Decoder)))
2118returnMCDisassembler::Fail;
2119ARM_AM::ShiftOpc Opc =ARM_AM::lsl;
2120switch( fieldFromInstruction(Insn, 5, 2)) {
2121case 0:
2122 Opc =ARM_AM::lsl;
2123break;
2124case 1:
2125 Opc =ARM_AM::lsr;
2126break;
2127case 2:
2128 Opc =ARM_AM::asr;
2129break;
2130case 3:
2131 Opc =ARM_AM::ror;
2132break;
2133default:
2134returnMCDisassembler::Fail;
2135 }
2136unsigned amt = fieldFromInstruction(Insn, 7, 5);
2137if (Opc ==ARM_AM::ror && amt == 0)
2138 Opc =ARM_AM::rrx;
2139unsigned imm =ARM_AM::getAM2Opc(Op, amt, Opc, idx_mode);
2140
2141 Inst.addOperand(MCOperand::createImm(imm));
2142 }else {
2143 Inst.addOperand(MCOperand::createReg(0));
2144unsigned tmp =ARM_AM::getAM2Opc(Op, imm,ARM_AM::lsl, idx_mode);
2145 Inst.addOperand(MCOperand::createImm(tmp));
2146 }
2147
2148if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2149returnMCDisassembler::Fail;
2150
2151return S;
2152}
2153
2154staticDecodeStatusDecodeSORegMemOperand(MCInst &Inst,unsigned Val,
2155uint64_t Address,
2156constMCDisassembler *Decoder) {
2157DecodeStatus S =MCDisassembler::Success;
2158
2159unsigned Rn = fieldFromInstruction(Val, 13, 4);
2160unsigned Rm = fieldFromInstruction(Val, 0, 4);
2161unsigned type = fieldFromInstruction(Val, 5, 2);
2162unsigned imm = fieldFromInstruction(Val, 7, 5);
2163unsigned U = fieldFromInstruction(Val, 12, 1);
2164
2165ARM_AM::ShiftOpc ShOp =ARM_AM::lsl;
2166switch (type) {
2167case 0:
2168 ShOp =ARM_AM::lsl;
2169break;
2170case 1:
2171 ShOp =ARM_AM::lsr;
2172break;
2173case 2:
2174 ShOp =ARM_AM::asr;
2175break;
2176case 3:
2177 ShOp =ARM_AM::ror;
2178break;
2179 }
2180
2181if (ShOp ==ARM_AM::ror && imm == 0)
2182 ShOp =ARM_AM::rrx;
2183
2184if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2185returnMCDisassembler::Fail;
2186if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
2187returnMCDisassembler::Fail;
2188unsigned shift;
2189if (U)
2190 shift =ARM_AM::getAM2Opc(ARM_AM::add, imm, ShOp);
2191else
2192 shift =ARM_AM::getAM2Opc(ARM_AM::sub, imm, ShOp);
2193 Inst.addOperand(MCOperand::createImm(shift));
2194
2195return S;
2196}
2197
2198staticDecodeStatusDecodeTSBInstruction(MCInst &Inst,unsignedInsn,
2199uint64_t Address,
2200constMCDisassembler *Decoder) {
2201if (Inst.getOpcode() != ARM::TSB && Inst.getOpcode() != ARM::t2TSB)
2202returnMCDisassembler::Fail;
2203
2204// The "csync" operand is not encoded into the "tsb" instruction (as this is
2205// the only available operand), but LLVM expects the instruction to have one
2206// operand, so we need to add the csync when decoding.
2207 Inst.addOperand(MCOperand::createImm(ARM_TSB::CSYNC));
2208returnMCDisassembler::Success;
2209}
2210
2211staticDecodeStatusDecodeAddrMode3Instruction(MCInst &Inst,unsignedInsn,
2212uint64_t Address,
2213constMCDisassembler *Decoder) {
2214DecodeStatus S =MCDisassembler::Success;
2215
2216unsigned Rt = fieldFromInstruction(Insn, 12, 4);
2217unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2218unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2219unsigned type = fieldFromInstruction(Insn, 22, 1);
2220unsigned imm = fieldFromInstruction(Insn, 8, 4);
2221unsigned U = ((~fieldFromInstruction(Insn, 23, 1)) & 1) << 8;
2222unsignedpred = fieldFromInstruction(Insn, 28, 4);
2223unsigned W = fieldFromInstruction(Insn, 21, 1);
2224unsignedP = fieldFromInstruction(Insn, 24, 1);
2225unsigned Rt2 = Rt + 1;
2226
2227bool writeback = (W == 1) | (P == 0);
2228
2229// For {LD,ST}RD, Rt must be even, else undefined.
2230switch (Inst.getOpcode()) {
2231case ARM::STRD:
2232case ARM::STRD_PRE:
2233case ARM::STRD_POST:
2234case ARM::LDRD:
2235case ARM::LDRD_PRE:
2236case ARM::LDRD_POST:
2237if (Rt & 0x1) S =MCDisassembler::SoftFail;
2238break;
2239default:
2240break;
2241 }
2242switch (Inst.getOpcode()) {
2243case ARM::STRD:
2244case ARM::STRD_PRE:
2245case ARM::STRD_POST:
2246if (P == 0 && W == 1)
2247 S =MCDisassembler::SoftFail;
2248
2249if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
2250 S =MCDisassembler::SoftFail;
2251if (type && Rm == 15)
2252 S =MCDisassembler::SoftFail;
2253if (Rt2 == 15)
2254 S =MCDisassembler::SoftFail;
2255if (!type && fieldFromInstruction(Insn, 8, 4))
2256 S =MCDisassembler::SoftFail;
2257break;
2258case ARM::STRH:
2259case ARM::STRH_PRE:
2260case ARM::STRH_POST:
2261if (Rt == 15)
2262 S =MCDisassembler::SoftFail;
2263if (writeback && (Rn == 15 || Rn == Rt))
2264 S =MCDisassembler::SoftFail;
2265if (!type && Rm == 15)
2266 S =MCDisassembler::SoftFail;
2267break;
2268case ARM::LDRD:
2269case ARM::LDRD_PRE:
2270case ARM::LDRD_POST:
2271if (type && Rn == 15) {
2272if (Rt2 == 15)
2273 S =MCDisassembler::SoftFail;
2274break;
2275 }
2276if (P == 0 && W == 1)
2277 S =MCDisassembler::SoftFail;
2278if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
2279 S =MCDisassembler::SoftFail;
2280if (!type && writeback && Rn == 15)
2281 S =MCDisassembler::SoftFail;
2282if (writeback && (Rn == Rt || Rn == Rt2))
2283 S =MCDisassembler::SoftFail;
2284break;
2285case ARM::LDRH:
2286case ARM::LDRH_PRE:
2287case ARM::LDRH_POST:
2288if (type && Rn == 15) {
2289if (Rt == 15)
2290 S =MCDisassembler::SoftFail;
2291break;
2292 }
2293if (Rt == 15)
2294 S =MCDisassembler::SoftFail;
2295if (!type && Rm == 15)
2296 S =MCDisassembler::SoftFail;
2297if (!type && writeback && (Rn == 15 || Rn == Rt))
2298 S =MCDisassembler::SoftFail;
2299break;
2300case ARM::LDRSH:
2301case ARM::LDRSH_PRE:
2302case ARM::LDRSH_POST:
2303case ARM::LDRSB:
2304case ARM::LDRSB_PRE:
2305case ARM::LDRSB_POST:
2306if (type && Rn == 15) {
2307if (Rt == 15)
2308 S =MCDisassembler::SoftFail;
2309break;
2310 }
2311if (type && (Rt == 15 || (writeback && Rn == Rt)))
2312 S =MCDisassembler::SoftFail;
2313if (!type && (Rt == 15 || Rm == 15))
2314 S =MCDisassembler::SoftFail;
2315if (!type && writeback && (Rn == 15 || Rn == Rt))
2316 S =MCDisassembler::SoftFail;
2317break;
2318default:
2319break;
2320 }
2321
2322if (writeback) {// Writeback
2323if (P)
2324 U |=ARMII::IndexModePre << 9;
2325else
2326 U |=ARMII::IndexModePost << 9;
2327
2328// On stores, the writeback operand precedes Rt.
2329switch (Inst.getOpcode()) {
2330case ARM::STRD:
2331case ARM::STRD_PRE:
2332case ARM::STRD_POST:
2333case ARM::STRH:
2334case ARM::STRH_PRE:
2335case ARM::STRH_POST:
2336if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2337returnMCDisassembler::Fail;
2338break;
2339default:
2340break;
2341 }
2342 }
2343
2344if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
2345returnMCDisassembler::Fail;
2346switch (Inst.getOpcode()) {
2347case ARM::STRD:
2348case ARM::STRD_PRE:
2349case ARM::STRD_POST:
2350case ARM::LDRD:
2351case ARM::LDRD_PRE:
2352case ARM::LDRD_POST:
2353if (!Check(S,DecodeGPRRegisterClass(Inst, Rt+1,Address, Decoder)))
2354returnMCDisassembler::Fail;
2355break;
2356default:
2357break;
2358 }
2359
2360if (writeback) {
2361// On loads, the writeback operand comes after Rt.
2362switch (Inst.getOpcode()) {
2363case ARM::LDRD:
2364case ARM::LDRD_PRE:
2365case ARM::LDRD_POST:
2366case ARM::LDRH:
2367case ARM::LDRH_PRE:
2368case ARM::LDRH_POST:
2369case ARM::LDRSH:
2370case ARM::LDRSH_PRE:
2371case ARM::LDRSH_POST:
2372case ARM::LDRSB:
2373case ARM::LDRSB_PRE:
2374case ARM::LDRSB_POST:
2375case ARM::LDRHTr:
2376case ARM::LDRSBTr:
2377if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2378returnMCDisassembler::Fail;
2379break;
2380default:
2381break;
2382 }
2383 }
2384
2385if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2386returnMCDisassembler::Fail;
2387
2388if (type) {
2389 Inst.addOperand(MCOperand::createReg(0));
2390 Inst.addOperand(MCOperand::createImm(U | (imm << 4) | Rm));
2391 }else {
2392if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
2393returnMCDisassembler::Fail;
2394 Inst.addOperand(MCOperand::createImm(U));
2395 }
2396
2397if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2398returnMCDisassembler::Fail;
2399
2400return S;
2401}
2402
2403staticDecodeStatusDecodeRFEInstruction(MCInst &Inst,unsignedInsn,
2404uint64_t Address,
2405constMCDisassembler *Decoder) {
2406DecodeStatus S =MCDisassembler::Success;
2407
2408unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2409unsignedmode = fieldFromInstruction(Insn, 23, 2);
2410
2411switch (mode) {
2412case 0:
2413mode =ARM_AM::da;
2414break;
2415case 1:
2416mode =ARM_AM::ia;
2417break;
2418case 2:
2419mode =ARM_AM::db;
2420break;
2421case 3:
2422mode =ARM_AM::ib;
2423break;
2424 }
2425
2426 Inst.addOperand(MCOperand::createImm(mode));
2427if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2428returnMCDisassembler::Fail;
2429
2430return S;
2431}
2432
2433staticDecodeStatusDecodeQADDInstruction(MCInst &Inst,unsignedInsn,
2434uint64_t Address,
2435constMCDisassembler *Decoder) {
2436DecodeStatus S =MCDisassembler::Success;
2437
2438unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2439unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2440unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2441unsignedpred = fieldFromInstruction(Insn, 28, 4);
2442
2443if (pred == 0xF)
2444returnDecodeCPSInstruction(Inst,Insn,Address, Decoder);
2445
2446if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rd,Address, Decoder)))
2447returnMCDisassembler::Fail;
2448if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rm,Address, Decoder)))
2449returnMCDisassembler::Fail;
2450if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
2451returnMCDisassembler::Fail;
2452if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2453returnMCDisassembler::Fail;
2454return S;
2455}
2456
2457staticDecodeStatus
2458DecodeMemMultipleWritebackInstruction(MCInst &Inst,unsignedInsn,
2459uint64_t Address,
2460constMCDisassembler *Decoder) {
2461DecodeStatus S =MCDisassembler::Success;
2462
2463unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2464unsignedpred = fieldFromInstruction(Insn, 28, 4);
2465unsigned reglist = fieldFromInstruction(Insn, 0, 16);
2466
2467if (pred == 0xF) {
2468// Ambiguous with RFE and SRS
2469switch (Inst.getOpcode()) {
2470case ARM::LDMDA:
2471 Inst.setOpcode(ARM::RFEDA);
2472break;
2473case ARM::LDMDA_UPD:
2474 Inst.setOpcode(ARM::RFEDA_UPD);
2475break;
2476case ARM::LDMDB:
2477 Inst.setOpcode(ARM::RFEDB);
2478break;
2479case ARM::LDMDB_UPD:
2480 Inst.setOpcode(ARM::RFEDB_UPD);
2481break;
2482case ARM::LDMIA:
2483 Inst.setOpcode(ARM::RFEIA);
2484break;
2485case ARM::LDMIA_UPD:
2486 Inst.setOpcode(ARM::RFEIA_UPD);
2487break;
2488case ARM::LDMIB:
2489 Inst.setOpcode(ARM::RFEIB);
2490break;
2491case ARM::LDMIB_UPD:
2492 Inst.setOpcode(ARM::RFEIB_UPD);
2493break;
2494case ARM::STMDA:
2495 Inst.setOpcode(ARM::SRSDA);
2496break;
2497case ARM::STMDA_UPD:
2498 Inst.setOpcode(ARM::SRSDA_UPD);
2499break;
2500case ARM::STMDB:
2501 Inst.setOpcode(ARM::SRSDB);
2502break;
2503case ARM::STMDB_UPD:
2504 Inst.setOpcode(ARM::SRSDB_UPD);
2505break;
2506case ARM::STMIA:
2507 Inst.setOpcode(ARM::SRSIA);
2508break;
2509case ARM::STMIA_UPD:
2510 Inst.setOpcode(ARM::SRSIA_UPD);
2511break;
2512case ARM::STMIB:
2513 Inst.setOpcode(ARM::SRSIB);
2514break;
2515case ARM::STMIB_UPD:
2516 Inst.setOpcode(ARM::SRSIB_UPD);
2517break;
2518default:
2519returnMCDisassembler::Fail;
2520 }
2521
2522// For stores (which become SRS's, the only operand is the mode.
2523if (fieldFromInstruction(Insn, 20, 1) == 0) {
2524// Check SRS encoding constraints
2525if (!(fieldFromInstruction(Insn, 22, 1) == 1 &&
2526 fieldFromInstruction(Insn, 20, 1) == 0))
2527returnMCDisassembler::Fail;
2528
2529 Inst.addOperand(
2530MCOperand::createImm(fieldFromInstruction(Insn, 0, 4)));
2531return S;
2532 }
2533
2534returnDecodeRFEInstruction(Inst,Insn,Address, Decoder);
2535 }
2536
2537if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2538returnMCDisassembler::Fail;
2539if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2540returnMCDisassembler::Fail;// Tied
2541if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2542returnMCDisassembler::Fail;
2543if (!Check(S,DecodeRegListOperand(Inst, reglist,Address, Decoder)))
2544returnMCDisassembler::Fail;
2545
2546return S;
2547}
2548
2549// Check for UNPREDICTABLE predicated ESB instruction
2550staticDecodeStatusDecodeHINTInstruction(MCInst &Inst,unsignedInsn,
2551uint64_t Address,
2552constMCDisassembler *Decoder) {
2553unsignedpred = fieldFromInstruction(Insn, 28, 4);
2554unsigned imm8 = fieldFromInstruction(Insn, 0, 8);
2555constMCDisassembler *Dis =static_cast<constMCDisassembler*>(Decoder);
2556constFeatureBitset &FeatureBits = Dis->getSubtargetInfo().getFeatureBits();
2557
2558DecodeStatus S =MCDisassembler::Success;
2559
2560 Inst.addOperand(MCOperand::createImm(imm8));
2561
2562if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2563returnMCDisassembler::Fail;
2564
2565// ESB is unpredictable if pred != AL. Without the RAS extension, it is a NOP,
2566// so all predicates should be allowed.
2567if (imm8 == 0x10 &&pred != 0xe && ((FeatureBits[ARM::FeatureRAS]) != 0))
2568 S =MCDisassembler::SoftFail;
2569
2570return S;
2571}
2572
2573staticDecodeStatusDecodeCPSInstruction(MCInst &Inst,unsignedInsn,
2574uint64_t Address,
2575constMCDisassembler *Decoder) {
2576unsigned imod = fieldFromInstruction(Insn, 18, 2);
2577unsigned M = fieldFromInstruction(Insn, 17, 1);
2578unsigned iflags = fieldFromInstruction(Insn, 6, 3);
2579unsignedmode = fieldFromInstruction(Insn, 0, 5);
2580
2581DecodeStatus S =MCDisassembler::Success;
2582
2583// This decoder is called from multiple location that do not check
2584// the full encoding is valid before they do.
2585if (fieldFromInstruction(Insn, 5, 1) != 0 ||
2586 fieldFromInstruction(Insn, 16, 1) != 0 ||
2587 fieldFromInstruction(Insn, 20, 8) != 0x10)
2588returnMCDisassembler::Fail;
2589
2590// imod == '01' --> UNPREDICTABLE
2591// NOTE: Even though this is technically UNPREDICTABLE, we choose to
2592// return failure here. The '01' imod value is unprintable, so there's
2593// nothing useful we could do even if we returned UNPREDICTABLE.
2594
2595if (imod == 1)returnMCDisassembler::Fail;
2596
2597if (imod && M) {
2598 Inst.setOpcode(ARM::CPS3p);
2599 Inst.addOperand(MCOperand::createImm(imod));
2600 Inst.addOperand(MCOperand::createImm(iflags));
2601 Inst.addOperand(MCOperand::createImm(mode));
2602 }elseif (imod && !M) {
2603 Inst.setOpcode(ARM::CPS2p);
2604 Inst.addOperand(MCOperand::createImm(imod));
2605 Inst.addOperand(MCOperand::createImm(iflags));
2606if (mode) S =MCDisassembler::SoftFail;
2607 }elseif (!imod && M) {
2608 Inst.setOpcode(ARM::CPS1p);
2609 Inst.addOperand(MCOperand::createImm(mode));
2610if (iflags) S =MCDisassembler::SoftFail;
2611 }else {
2612// imod == '00' && M == '0' --> UNPREDICTABLE
2613 Inst.setOpcode(ARM::CPS1p);
2614 Inst.addOperand(MCOperand::createImm(mode));
2615 S =MCDisassembler::SoftFail;
2616 }
2617
2618return S;
2619}
2620
2621staticDecodeStatusDecodeT2CPSInstruction(MCInst &Inst,unsignedInsn,
2622uint64_t Address,
2623constMCDisassembler *Decoder) {
2624unsigned imod = fieldFromInstruction(Insn, 9, 2);
2625unsigned M = fieldFromInstruction(Insn, 8, 1);
2626unsigned iflags = fieldFromInstruction(Insn, 5, 3);
2627unsignedmode = fieldFromInstruction(Insn, 0, 5);
2628
2629DecodeStatus S =MCDisassembler::Success;
2630
2631// imod == '01' --> UNPREDICTABLE
2632// NOTE: Even though this is technically UNPREDICTABLE, we choose to
2633// return failure here. The '01' imod value is unprintable, so there's
2634// nothing useful we could do even if we returned UNPREDICTABLE.
2635
2636if (imod == 1)returnMCDisassembler::Fail;
2637
2638if (imod && M) {
2639 Inst.setOpcode(ARM::t2CPS3p);
2640 Inst.addOperand(MCOperand::createImm(imod));
2641 Inst.addOperand(MCOperand::createImm(iflags));
2642 Inst.addOperand(MCOperand::createImm(mode));
2643 }elseif (imod && !M) {
2644 Inst.setOpcode(ARM::t2CPS2p);
2645 Inst.addOperand(MCOperand::createImm(imod));
2646 Inst.addOperand(MCOperand::createImm(iflags));
2647if (mode) S =MCDisassembler::SoftFail;
2648 }elseif (!imod && M) {
2649 Inst.setOpcode(ARM::t2CPS1p);
2650 Inst.addOperand(MCOperand::createImm(mode));
2651if (iflags) S =MCDisassembler::SoftFail;
2652 }else {
2653// imod == '00' && M == '0' --> this is a HINT instruction
2654int imm = fieldFromInstruction(Insn, 0, 8);
2655// HINT are defined only for immediate in [0..4]
2656if(imm > 4)returnMCDisassembler::Fail;
2657 Inst.setOpcode(ARM::t2HINT);
2658 Inst.addOperand(MCOperand::createImm(imm));
2659 }
2660
2661return S;
2662}
2663
2664staticDecodeStatus
2665DecodeT2HintSpaceInstruction(MCInst &Inst,unsignedInsn,uint64_t Address,
2666constMCDisassembler *Decoder) {
2667unsigned imm = fieldFromInstruction(Insn, 0, 8);
2668
2669unsigned Opcode = ARM::t2HINT;
2670
2671if (imm == 0x0D) {
2672 Opcode = ARM::t2PACBTI;
2673 }elseif (imm == 0x1D) {
2674 Opcode = ARM::t2PAC;
2675 }elseif (imm == 0x2D) {
2676 Opcode = ARM::t2AUT;
2677 }elseif (imm == 0x0F) {
2678 Opcode = ARM::t2BTI;
2679 }
2680
2681 Inst.setOpcode(Opcode);
2682if (Opcode == ARM::t2HINT) {
2683 Inst.addOperand(MCOperand::createImm(imm));
2684 }
2685
2686returnMCDisassembler::Success;
2687}
2688
2689staticDecodeStatusDecodeT2MOVTWInstruction(MCInst &Inst,unsignedInsn,
2690uint64_t Address,
2691constMCDisassembler *Decoder) {
2692DecodeStatus S =MCDisassembler::Success;
2693
2694unsigned Rd = fieldFromInstruction(Insn, 8, 4);
2695unsigned imm = 0;
2696
2697 imm |= (fieldFromInstruction(Insn, 0, 8) << 0);
2698 imm |= (fieldFromInstruction(Insn, 12, 3) << 8);
2699 imm |= (fieldFromInstruction(Insn, 16, 4) << 12);
2700 imm |= (fieldFromInstruction(Insn, 26, 1) << 11);
2701
2702if (Inst.getOpcode() == ARM::t2MOVTi16)
2703if (!Check(S,DecoderGPRRegisterClass(Inst, Rd,Address, Decoder)))
2704returnMCDisassembler::Fail;
2705if (!Check(S,DecoderGPRRegisterClass(Inst, Rd,Address, Decoder)))
2706returnMCDisassembler::Fail;
2707
2708if (!tryAddingSymbolicOperand(Address, imm,false, 4, Inst, Decoder))
2709 Inst.addOperand(MCOperand::createImm(imm));
2710
2711return S;
2712}
2713
2714staticDecodeStatusDecodeArmMOVTWInstruction(MCInst &Inst,unsignedInsn,
2715uint64_t Address,
2716constMCDisassembler *Decoder) {
2717DecodeStatus S =MCDisassembler::Success;
2718
2719unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2720unsignedpred = fieldFromInstruction(Insn, 28, 4);
2721unsigned imm = 0;
2722
2723 imm |= (fieldFromInstruction(Insn, 0, 12) << 0);
2724 imm |= (fieldFromInstruction(Insn, 16, 4) << 12);
2725
2726if (Inst.getOpcode() == ARM::MOVTi16)
2727if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rd,Address, Decoder)))
2728returnMCDisassembler::Fail;
2729
2730if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rd,Address, Decoder)))
2731returnMCDisassembler::Fail;
2732
2733if (!tryAddingSymbolicOperand(Address, imm,false, 4, Inst, Decoder))
2734 Inst.addOperand(MCOperand::createImm(imm));
2735
2736if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2737returnMCDisassembler::Fail;
2738
2739return S;
2740}
2741
2742staticDecodeStatusDecodeSMLAInstruction(MCInst &Inst,unsignedInsn,
2743uint64_t Address,
2744constMCDisassembler *Decoder) {
2745DecodeStatus S =MCDisassembler::Success;
2746
2747unsigned Rd = fieldFromInstruction(Insn, 16, 4);
2748unsigned Rn = fieldFromInstruction(Insn, 0, 4);
2749unsigned Rm = fieldFromInstruction(Insn, 8, 4);
2750unsigned Ra = fieldFromInstruction(Insn, 12, 4);
2751unsignedpred = fieldFromInstruction(Insn, 28, 4);
2752
2753if (pred == 0xF)
2754returnDecodeCPSInstruction(Inst,Insn,Address, Decoder);
2755
2756if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rd,Address, Decoder)))
2757returnMCDisassembler::Fail;
2758if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
2759returnMCDisassembler::Fail;
2760if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rm,Address, Decoder)))
2761returnMCDisassembler::Fail;
2762if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Ra,Address, Decoder)))
2763returnMCDisassembler::Fail;
2764
2765if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2766returnMCDisassembler::Fail;
2767
2768return S;
2769}
2770
2771staticDecodeStatusDecodeTSTInstruction(MCInst &Inst,unsignedInsn,
2772uint64_t Address,
2773constMCDisassembler *Decoder) {
2774DecodeStatus S =MCDisassembler::Success;
2775
2776unsigned Pred = fieldFromInstruction(Insn, 28, 4);
2777unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2778unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2779
2780if (Pred == 0xF)
2781returnDecodeSETPANInstruction(Inst,Insn,Address, Decoder);
2782
2783if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2784returnMCDisassembler::Fail;
2785if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
2786returnMCDisassembler::Fail;
2787if (!Check(S,DecodePredicateOperand(Inst, Pred,Address, Decoder)))
2788returnMCDisassembler::Fail;
2789
2790return S;
2791}
2792
2793staticDecodeStatusDecodeSETPANInstruction(MCInst &Inst,unsignedInsn,
2794uint64_t Address,
2795constMCDisassembler *Decoder) {
2796DecodeStatus S =MCDisassembler::Success;
2797
2798unsigned Imm = fieldFromInstruction(Insn, 9, 1);
2799
2800constMCDisassembler *Dis =static_cast<constMCDisassembler*>(Decoder);
2801constFeatureBitset &FeatureBits = Dis->getSubtargetInfo().getFeatureBits();
2802
2803if (!FeatureBits[ARM::HasV8_1aOps] ||
2804 !FeatureBits[ARM::HasV8Ops])
2805returnMCDisassembler::Fail;
2806
2807// Decoder can be called from DecodeTST, which does not check the full
2808// encoding is valid.
2809if (fieldFromInstruction(Insn, 20,12) != 0xf11 ||
2810 fieldFromInstruction(Insn, 4,4) != 0)
2811returnMCDisassembler::Fail;
2812if (fieldFromInstruction(Insn, 10,10) != 0 ||
2813 fieldFromInstruction(Insn, 0,4) != 0)
2814 S =MCDisassembler::SoftFail;
2815
2816 Inst.setOpcode(ARM::SETPAN);
2817 Inst.addOperand(MCOperand::createImm(Imm));
2818
2819return S;
2820}
2821
2822staticDecodeStatusDecodeAddrModeImm12Operand(MCInst &Inst,unsigned Val,
2823uint64_t Address,
2824constMCDisassembler *Decoder) {
2825DecodeStatus S =MCDisassembler::Success;
2826
2827unsigned add = fieldFromInstruction(Val, 12, 1);
2828unsigned imm = fieldFromInstruction(Val, 0, 12);
2829unsigned Rn = fieldFromInstruction(Val, 13, 4);
2830
2831if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2832returnMCDisassembler::Fail;
2833
2834if (!add) imm *= -1;
2835if (imm == 0 && !add) imm = INT32_MIN;
2836 Inst.addOperand(MCOperand::createImm(imm));
2837if (Rn == 15)
2838tryAddingPcLoadReferenceComment(Address,Address + imm + 8, Decoder);
2839
2840return S;
2841}
2842
2843staticDecodeStatusDecodeAddrMode5Operand(MCInst &Inst,unsigned Val,
2844uint64_t Address,
2845constMCDisassembler *Decoder) {
2846DecodeStatus S =MCDisassembler::Success;
2847
2848unsigned Rn = fieldFromInstruction(Val, 9, 4);
2849// U == 1 to add imm, 0 to subtract it.
2850unsigned U = fieldFromInstruction(Val, 8, 1);
2851unsigned imm = fieldFromInstruction(Val, 0, 8);
2852
2853if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2854returnMCDisassembler::Fail;
2855
2856if (U)
2857 Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5Opc(ARM_AM::add, imm)));
2858else
2859 Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5Opc(ARM_AM::sub, imm)));
2860
2861return S;
2862}
2863
2864staticDecodeStatusDecodeAddrMode5FP16Operand(MCInst &Inst,unsigned Val,
2865uint64_t Address,
2866constMCDisassembler *Decoder) {
2867DecodeStatus S =MCDisassembler::Success;
2868
2869unsigned Rn = fieldFromInstruction(Val, 9, 4);
2870// U == 1 to add imm, 0 to subtract it.
2871unsigned U = fieldFromInstruction(Val, 8, 1);
2872unsigned imm = fieldFromInstruction(Val, 0, 8);
2873
2874if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
2875returnMCDisassembler::Fail;
2876
2877if (U)
2878 Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5FP16Opc(ARM_AM::add, imm)));
2879else
2880 Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5FP16Opc(ARM_AM::sub, imm)));
2881
2882return S;
2883}
2884
2885staticDecodeStatusDecodeAddrMode7Operand(MCInst &Inst,unsigned Val,
2886uint64_t Address,
2887constMCDisassembler *Decoder) {
2888returnDecodeGPRRegisterClass(Inst, Val,Address, Decoder);
2889}
2890
2891staticDecodeStatusDecodeT2BInstruction(MCInst &Inst,unsignedInsn,
2892uint64_t Address,
2893constMCDisassembler *Decoder) {
2894DecodeStatusStatus =MCDisassembler::Success;
2895
2896// Note the J1 and J2 values are from the encoded instruction. So here
2897// change them to I1 and I2 values via as documented:
2898// I1 = NOT(J1 EOR S);
2899// I2 = NOT(J2 EOR S);
2900// and build the imm32 with one trailing zero as documented:
2901// imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
2902unsigned S = fieldFromInstruction(Insn, 26, 1);
2903unsigned J1 = fieldFromInstruction(Insn, 13, 1);
2904unsigned J2 = fieldFromInstruction(Insn, 11, 1);
2905unsigned I1 = !(J1 ^ S);
2906unsigned I2 = !(J2 ^ S);
2907unsigned imm10 = fieldFromInstruction(Insn, 16, 10);
2908unsigned imm11 = fieldFromInstruction(Insn, 0, 11);
2909unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
2910int imm32 = SignExtend32<25>(tmp << 1);
2911if (!tryAddingSymbolicOperand(Address,Address + imm32 + 4,
2912true, 4, Inst, Decoder))
2913 Inst.addOperand(MCOperand::createImm(imm32));
2914
2915returnStatus;
2916}
2917
2918staticDecodeStatusDecodeBranchImmInstruction(MCInst &Inst,unsignedInsn,
2919uint64_t Address,
2920constMCDisassembler *Decoder) {
2921DecodeStatus S =MCDisassembler::Success;
2922
2923unsignedpred = fieldFromInstruction(Insn, 28, 4);
2924unsigned imm = fieldFromInstruction(Insn, 0, 24) << 2;
2925
2926if (pred == 0xF) {
2927 Inst.setOpcode(ARM::BLXi);
2928 imm |= fieldFromInstruction(Insn, 24, 1) << 1;
2929if (!tryAddingSymbolicOperand(Address,Address + SignExtend32<26>(imm) + 8,
2930true, 4, Inst, Decoder))
2931 Inst.addOperand(MCOperand::createImm(SignExtend32<26>(imm)));
2932return S;
2933 }
2934
2935if (!tryAddingSymbolicOperand(Address,Address + SignExtend32<26>(imm) + 8,
2936true, 4, Inst, Decoder))
2937 Inst.addOperand(MCOperand::createImm(SignExtend32<26>(imm)));
2938
2939// We already have BL_pred for BL w/ predicate, no need to add addition
2940// predicate opreands for BL
2941if (Inst.getOpcode() != ARM::BL)
2942if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
2943returnMCDisassembler::Fail;
2944
2945return S;
2946}
2947
2948staticDecodeStatusDecodeAddrMode6Operand(MCInst &Inst,unsigned Val,
2949uint64_t Address,
2950constMCDisassembler *Decoder) {
2951DecodeStatus S =MCDisassembler::Success;
2952
2953unsigned Rm = fieldFromInstruction(Val, 0, 4);
2954unsigned align = fieldFromInstruction(Val, 4, 2);
2955
2956if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
2957returnMCDisassembler::Fail;
2958if (!align)
2959 Inst.addOperand(MCOperand::createImm(0));
2960else
2961 Inst.addOperand(MCOperand::createImm(4 << align));
2962
2963return S;
2964}
2965
2966staticDecodeStatusDecodeVLDInstruction(MCInst &Inst,unsignedInsn,
2967uint64_t Address,
2968constMCDisassembler *Decoder) {
2969DecodeStatus S =MCDisassembler::Success;
2970
2971unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2972 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
2973unsigned wb = fieldFromInstruction(Insn, 16, 4);
2974unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2975 Rn |= fieldFromInstruction(Insn, 4, 2) << 4;
2976unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2977
2978// First output register
2979switch (Inst.getOpcode()) {
2980case ARM::VLD1q16:case ARM::VLD1q32:case ARM::VLD1q64:case ARM::VLD1q8:
2981case ARM::VLD1q16wb_fixed:case ARM::VLD1q16wb_register:
2982case ARM::VLD1q32wb_fixed:case ARM::VLD1q32wb_register:
2983case ARM::VLD1q64wb_fixed:case ARM::VLD1q64wb_register:
2984case ARM::VLD1q8wb_fixed:case ARM::VLD1q8wb_register:
2985case ARM::VLD2d16:case ARM::VLD2d32:case ARM::VLD2d8:
2986case ARM::VLD2d16wb_fixed:case ARM::VLD2d16wb_register:
2987case ARM::VLD2d32wb_fixed:case ARM::VLD2d32wb_register:
2988case ARM::VLD2d8wb_fixed:case ARM::VLD2d8wb_register:
2989if (!Check(S,DecodeDPairRegisterClass(Inst, Rd,Address, Decoder)))
2990returnMCDisassembler::Fail;
2991break;
2992case ARM::VLD2b16:
2993case ARM::VLD2b32:
2994case ARM::VLD2b8:
2995case ARM::VLD2b16wb_fixed:
2996case ARM::VLD2b16wb_register:
2997case ARM::VLD2b32wb_fixed:
2998case ARM::VLD2b32wb_register:
2999case ARM::VLD2b8wb_fixed:
3000case ARM::VLD2b8wb_register:
3001if (!Check(S,DecodeDPairSpacedRegisterClass(Inst, Rd,Address, Decoder)))
3002returnMCDisassembler::Fail;
3003break;
3004default:
3005if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3006returnMCDisassembler::Fail;
3007 }
3008
3009// Second output register
3010switch (Inst.getOpcode()) {
3011case ARM::VLD3d8:
3012case ARM::VLD3d16:
3013case ARM::VLD3d32:
3014case ARM::VLD3d8_UPD:
3015case ARM::VLD3d16_UPD:
3016case ARM::VLD3d32_UPD:
3017case ARM::VLD4d8:
3018case ARM::VLD4d16:
3019case ARM::VLD4d32:
3020case ARM::VLD4d8_UPD:
3021case ARM::VLD4d16_UPD:
3022case ARM::VLD4d32_UPD:
3023if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+1)%32,Address, Decoder)))
3024returnMCDisassembler::Fail;
3025break;
3026case ARM::VLD3q8:
3027case ARM::VLD3q16:
3028case ARM::VLD3q32:
3029case ARM::VLD3q8_UPD:
3030case ARM::VLD3q16_UPD:
3031case ARM::VLD3q32_UPD:
3032case ARM::VLD4q8:
3033case ARM::VLD4q16:
3034case ARM::VLD4q32:
3035case ARM::VLD4q8_UPD:
3036case ARM::VLD4q16_UPD:
3037case ARM::VLD4q32_UPD:
3038if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+2)%32,Address, Decoder)))
3039returnMCDisassembler::Fail;
3040break;
3041default:
3042break;
3043 }
3044
3045// Third output register
3046switch(Inst.getOpcode()) {
3047case ARM::VLD3d8:
3048case ARM::VLD3d16:
3049case ARM::VLD3d32:
3050case ARM::VLD3d8_UPD:
3051case ARM::VLD3d16_UPD:
3052case ARM::VLD3d32_UPD:
3053case ARM::VLD4d8:
3054case ARM::VLD4d16:
3055case ARM::VLD4d32:
3056case ARM::VLD4d8_UPD:
3057case ARM::VLD4d16_UPD:
3058case ARM::VLD4d32_UPD:
3059if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+2)%32,Address, Decoder)))
3060returnMCDisassembler::Fail;
3061break;
3062case ARM::VLD3q8:
3063case ARM::VLD3q16:
3064case ARM::VLD3q32:
3065case ARM::VLD3q8_UPD:
3066case ARM::VLD3q16_UPD:
3067case ARM::VLD3q32_UPD:
3068case ARM::VLD4q8:
3069case ARM::VLD4q16:
3070case ARM::VLD4q32:
3071case ARM::VLD4q8_UPD:
3072case ARM::VLD4q16_UPD:
3073case ARM::VLD4q32_UPD:
3074if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+4)%32,Address, Decoder)))
3075returnMCDisassembler::Fail;
3076break;
3077default:
3078break;
3079 }
3080
3081// Fourth output register
3082switch (Inst.getOpcode()) {
3083case ARM::VLD4d8:
3084case ARM::VLD4d16:
3085case ARM::VLD4d32:
3086case ARM::VLD4d8_UPD:
3087case ARM::VLD4d16_UPD:
3088case ARM::VLD4d32_UPD:
3089if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+3)%32,Address, Decoder)))
3090returnMCDisassembler::Fail;
3091break;
3092case ARM::VLD4q8:
3093case ARM::VLD4q16:
3094case ARM::VLD4q32:
3095case ARM::VLD4q8_UPD:
3096case ARM::VLD4q16_UPD:
3097case ARM::VLD4q32_UPD:
3098if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+6)%32,Address, Decoder)))
3099returnMCDisassembler::Fail;
3100break;
3101default:
3102break;
3103 }
3104
3105// Writeback operand
3106switch (Inst.getOpcode()) {
3107case ARM::VLD1d8wb_fixed:
3108case ARM::VLD1d16wb_fixed:
3109case ARM::VLD1d32wb_fixed:
3110case ARM::VLD1d64wb_fixed:
3111case ARM::VLD1d8wb_register:
3112case ARM::VLD1d16wb_register:
3113case ARM::VLD1d32wb_register:
3114case ARM::VLD1d64wb_register:
3115case ARM::VLD1q8wb_fixed:
3116case ARM::VLD1q16wb_fixed:
3117case ARM::VLD1q32wb_fixed:
3118case ARM::VLD1q64wb_fixed:
3119case ARM::VLD1q8wb_register:
3120case ARM::VLD1q16wb_register:
3121case ARM::VLD1q32wb_register:
3122case ARM::VLD1q64wb_register:
3123case ARM::VLD1d8Twb_fixed:
3124case ARM::VLD1d8Twb_register:
3125case ARM::VLD1d16Twb_fixed:
3126case ARM::VLD1d16Twb_register:
3127case ARM::VLD1d32Twb_fixed:
3128case ARM::VLD1d32Twb_register:
3129case ARM::VLD1d64Twb_fixed:
3130case ARM::VLD1d64Twb_register:
3131case ARM::VLD1d8Qwb_fixed:
3132case ARM::VLD1d8Qwb_register:
3133case ARM::VLD1d16Qwb_fixed:
3134case ARM::VLD1d16Qwb_register:
3135case ARM::VLD1d32Qwb_fixed:
3136case ARM::VLD1d32Qwb_register:
3137case ARM::VLD1d64Qwb_fixed:
3138case ARM::VLD1d64Qwb_register:
3139case ARM::VLD2d8wb_fixed:
3140case ARM::VLD2d16wb_fixed:
3141case ARM::VLD2d32wb_fixed:
3142case ARM::VLD2q8wb_fixed:
3143case ARM::VLD2q16wb_fixed:
3144case ARM::VLD2q32wb_fixed:
3145case ARM::VLD2d8wb_register:
3146case ARM::VLD2d16wb_register:
3147case ARM::VLD2d32wb_register:
3148case ARM::VLD2q8wb_register:
3149case ARM::VLD2q16wb_register:
3150case ARM::VLD2q32wb_register:
3151case ARM::VLD2b8wb_fixed:
3152case ARM::VLD2b16wb_fixed:
3153case ARM::VLD2b32wb_fixed:
3154case ARM::VLD2b8wb_register:
3155case ARM::VLD2b16wb_register:
3156case ARM::VLD2b32wb_register:
3157 Inst.addOperand(MCOperand::createImm(0));
3158break;
3159case ARM::VLD3d8_UPD:
3160case ARM::VLD3d16_UPD:
3161case ARM::VLD3d32_UPD:
3162case ARM::VLD3q8_UPD:
3163case ARM::VLD3q16_UPD:
3164case ARM::VLD3q32_UPD:
3165case ARM::VLD4d8_UPD:
3166case ARM::VLD4d16_UPD:
3167case ARM::VLD4d32_UPD:
3168case ARM::VLD4q8_UPD:
3169case ARM::VLD4q16_UPD:
3170case ARM::VLD4q32_UPD:
3171if (!Check(S,DecodeGPRRegisterClass(Inst, wb,Address, Decoder)))
3172returnMCDisassembler::Fail;
3173break;
3174default:
3175break;
3176 }
3177
3178// AddrMode6 Base (register+alignment)
3179if (!Check(S,DecodeAddrMode6Operand(Inst, Rn,Address, Decoder)))
3180returnMCDisassembler::Fail;
3181
3182// AddrMode6 Offset (register)
3183switch (Inst.getOpcode()) {
3184default:
3185// The below have been updated to have explicit am6offset split
3186// between fixed and register offset. For those instructions not
3187// yet updated, we need to add an additional reg0 operand for the
3188// fixed variant.
3189//
3190// The fixed offset encodes as Rm == 0xd, so we check for that.
3191if (Rm == 0xd) {
3192 Inst.addOperand(MCOperand::createReg(0));
3193break;
3194 }
3195// Fall through to handle the register offset variant.
3196 [[fallthrough]];
3197case ARM::VLD1d8wb_fixed:
3198case ARM::VLD1d16wb_fixed:
3199case ARM::VLD1d32wb_fixed:
3200case ARM::VLD1d64wb_fixed:
3201case ARM::VLD1d8Twb_fixed:
3202case ARM::VLD1d16Twb_fixed:
3203case ARM::VLD1d32Twb_fixed:
3204case ARM::VLD1d64Twb_fixed:
3205case ARM::VLD1d8Qwb_fixed:
3206case ARM::VLD1d16Qwb_fixed:
3207case ARM::VLD1d32Qwb_fixed:
3208case ARM::VLD1d64Qwb_fixed:
3209case ARM::VLD1d8wb_register:
3210case ARM::VLD1d16wb_register:
3211case ARM::VLD1d32wb_register:
3212case ARM::VLD1d64wb_register:
3213case ARM::VLD1q8wb_fixed:
3214case ARM::VLD1q16wb_fixed:
3215case ARM::VLD1q32wb_fixed:
3216case ARM::VLD1q64wb_fixed:
3217case ARM::VLD1q8wb_register:
3218case ARM::VLD1q16wb_register:
3219case ARM::VLD1q32wb_register:
3220case ARM::VLD1q64wb_register:
3221// The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3222// variant encodes Rm == 0xf. Anything else is a register offset post-
3223// increment and we need to add the register operand to the instruction.
3224if (Rm != 0xD && Rm != 0xF &&
3225 !Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
3226returnMCDisassembler::Fail;
3227break;
3228case ARM::VLD2d8wb_fixed:
3229case ARM::VLD2d16wb_fixed:
3230case ARM::VLD2d32wb_fixed:
3231case ARM::VLD2b8wb_fixed:
3232case ARM::VLD2b16wb_fixed:
3233case ARM::VLD2b32wb_fixed:
3234case ARM::VLD2q8wb_fixed:
3235case ARM::VLD2q16wb_fixed:
3236case ARM::VLD2q32wb_fixed:
3237break;
3238 }
3239
3240return S;
3241}
3242
3243staticDecodeStatusDecodeVLDST1Instruction(MCInst &Inst,unsignedInsn,
3244uint64_t Address,
3245constMCDisassembler *Decoder) {
3246unsigned type = fieldFromInstruction(Insn, 8, 4);
3247unsigned align = fieldFromInstruction(Insn, 4, 2);
3248if (type == 6 && (align & 2))returnMCDisassembler::Fail;
3249if (type == 7 && (align & 2))returnMCDisassembler::Fail;
3250if (type == 10 && align == 3)returnMCDisassembler::Fail;
3251
3252unsignedload = fieldFromInstruction(Insn, 21, 1);
3253returnload ?DecodeVLDInstruction(Inst,Insn,Address, Decoder)
3254 :DecodeVSTInstruction(Inst,Insn,Address, Decoder);
3255}
3256
3257staticDecodeStatusDecodeVLDST2Instruction(MCInst &Inst,unsignedInsn,
3258uint64_t Address,
3259constMCDisassembler *Decoder) {
3260unsignedsize = fieldFromInstruction(Insn, 6, 2);
3261if (size == 3)returnMCDisassembler::Fail;
3262
3263unsigned type = fieldFromInstruction(Insn, 8, 4);
3264unsigned align = fieldFromInstruction(Insn, 4, 2);
3265if (type == 8 && align == 3)returnMCDisassembler::Fail;
3266if (type == 9 && align == 3)returnMCDisassembler::Fail;
3267
3268unsignedload = fieldFromInstruction(Insn, 21, 1);
3269returnload ?DecodeVLDInstruction(Inst,Insn,Address, Decoder)
3270 :DecodeVSTInstruction(Inst,Insn,Address, Decoder);
3271}
3272
3273staticDecodeStatusDecodeVLDST3Instruction(MCInst &Inst,unsignedInsn,
3274uint64_t Address,
3275constMCDisassembler *Decoder) {
3276unsignedsize = fieldFromInstruction(Insn, 6, 2);
3277if (size == 3)returnMCDisassembler::Fail;
3278
3279unsigned align = fieldFromInstruction(Insn, 4, 2);
3280if (align & 2)returnMCDisassembler::Fail;
3281
3282unsignedload = fieldFromInstruction(Insn, 21, 1);
3283returnload ?DecodeVLDInstruction(Inst,Insn,Address, Decoder)
3284 :DecodeVSTInstruction(Inst,Insn,Address, Decoder);
3285}
3286
3287staticDecodeStatusDecodeVLDST4Instruction(MCInst &Inst,unsignedInsn,
3288uint64_t Address,
3289constMCDisassembler *Decoder) {
3290unsignedsize = fieldFromInstruction(Insn, 6, 2);
3291if (size == 3)returnMCDisassembler::Fail;
3292
3293unsignedload = fieldFromInstruction(Insn, 21, 1);
3294returnload ?DecodeVLDInstruction(Inst,Insn,Address, Decoder)
3295 :DecodeVSTInstruction(Inst,Insn,Address, Decoder);
3296}
3297
3298staticDecodeStatusDecodeVSTInstruction(MCInst &Inst,unsignedInsn,
3299uint64_t Address,
3300constMCDisassembler *Decoder) {
3301DecodeStatus S =MCDisassembler::Success;
3302
3303unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3304 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3305unsigned wb = fieldFromInstruction(Insn, 16, 4);
3306unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3307 Rn |= fieldFromInstruction(Insn, 4, 2) << 4;
3308unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3309
3310// Writeback Operand
3311switch (Inst.getOpcode()) {
3312case ARM::VST1d8wb_fixed:
3313case ARM::VST1d16wb_fixed:
3314case ARM::VST1d32wb_fixed:
3315case ARM::VST1d64wb_fixed:
3316case ARM::VST1d8wb_register:
3317case ARM::VST1d16wb_register:
3318case ARM::VST1d32wb_register:
3319case ARM::VST1d64wb_register:
3320case ARM::VST1q8wb_fixed:
3321case ARM::VST1q16wb_fixed:
3322case ARM::VST1q32wb_fixed:
3323case ARM::VST1q64wb_fixed:
3324case ARM::VST1q8wb_register:
3325case ARM::VST1q16wb_register:
3326case ARM::VST1q32wb_register:
3327case ARM::VST1q64wb_register:
3328case ARM::VST1d8Twb_fixed:
3329case ARM::VST1d16Twb_fixed:
3330case ARM::VST1d32Twb_fixed:
3331case ARM::VST1d64Twb_fixed:
3332case ARM::VST1d8Twb_register:
3333case ARM::VST1d16Twb_register:
3334case ARM::VST1d32Twb_register:
3335case ARM::VST1d64Twb_register:
3336case ARM::VST1d8Qwb_fixed:
3337case ARM::VST1d16Qwb_fixed:
3338case ARM::VST1d32Qwb_fixed:
3339case ARM::VST1d64Qwb_fixed:
3340case ARM::VST1d8Qwb_register:
3341case ARM::VST1d16Qwb_register:
3342case ARM::VST1d32Qwb_register:
3343case ARM::VST1d64Qwb_register:
3344case ARM::VST2d8wb_fixed:
3345case ARM::VST2d16wb_fixed:
3346case ARM::VST2d32wb_fixed:
3347case ARM::VST2d8wb_register:
3348case ARM::VST2d16wb_register:
3349case ARM::VST2d32wb_register:
3350case ARM::VST2q8wb_fixed:
3351case ARM::VST2q16wb_fixed:
3352case ARM::VST2q32wb_fixed:
3353case ARM::VST2q8wb_register:
3354case ARM::VST2q16wb_register:
3355case ARM::VST2q32wb_register:
3356case ARM::VST2b8wb_fixed:
3357case ARM::VST2b16wb_fixed:
3358case ARM::VST2b32wb_fixed:
3359case ARM::VST2b8wb_register:
3360case ARM::VST2b16wb_register:
3361case ARM::VST2b32wb_register:
3362if (Rm == 0xF)
3363returnMCDisassembler::Fail;
3364 Inst.addOperand(MCOperand::createImm(0));
3365break;
3366case ARM::VST3d8_UPD:
3367case ARM::VST3d16_UPD:
3368case ARM::VST3d32_UPD:
3369case ARM::VST3q8_UPD:
3370case ARM::VST3q16_UPD:
3371case ARM::VST3q32_UPD:
3372case ARM::VST4d8_UPD:
3373case ARM::VST4d16_UPD:
3374case ARM::VST4d32_UPD:
3375case ARM::VST4q8_UPD:
3376case ARM::VST4q16_UPD:
3377case ARM::VST4q32_UPD:
3378if (!Check(S,DecodeGPRRegisterClass(Inst, wb,Address, Decoder)))
3379returnMCDisassembler::Fail;
3380break;
3381default:
3382break;
3383 }
3384
3385// AddrMode6 Base (register+alignment)
3386if (!Check(S,DecodeAddrMode6Operand(Inst, Rn,Address, Decoder)))
3387returnMCDisassembler::Fail;
3388
3389// AddrMode6 Offset (register)
3390switch (Inst.getOpcode()) {
3391default:
3392if (Rm == 0xD)
3393 Inst.addOperand(MCOperand::createReg(0));
3394elseif (Rm != 0xF) {
3395if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
3396returnMCDisassembler::Fail;
3397 }
3398break;
3399case ARM::VST1d8wb_fixed:
3400case ARM::VST1d16wb_fixed:
3401case ARM::VST1d32wb_fixed:
3402case ARM::VST1d64wb_fixed:
3403case ARM::VST1q8wb_fixed:
3404case ARM::VST1q16wb_fixed:
3405case ARM::VST1q32wb_fixed:
3406case ARM::VST1q64wb_fixed:
3407case ARM::VST1d8Twb_fixed:
3408case ARM::VST1d16Twb_fixed:
3409case ARM::VST1d32Twb_fixed:
3410case ARM::VST1d64Twb_fixed:
3411case ARM::VST1d8Qwb_fixed:
3412case ARM::VST1d16Qwb_fixed:
3413case ARM::VST1d32Qwb_fixed:
3414case ARM::VST1d64Qwb_fixed:
3415case ARM::VST2d8wb_fixed:
3416case ARM::VST2d16wb_fixed:
3417case ARM::VST2d32wb_fixed:
3418case ARM::VST2q8wb_fixed:
3419case ARM::VST2q16wb_fixed:
3420case ARM::VST2q32wb_fixed:
3421case ARM::VST2b8wb_fixed:
3422case ARM::VST2b16wb_fixed:
3423case ARM::VST2b32wb_fixed:
3424break;
3425 }
3426
3427// First input register
3428switch (Inst.getOpcode()) {
3429case ARM::VST1q16:
3430case ARM::VST1q32:
3431case ARM::VST1q64:
3432case ARM::VST1q8:
3433case ARM::VST1q16wb_fixed:
3434case ARM::VST1q16wb_register:
3435case ARM::VST1q32wb_fixed:
3436case ARM::VST1q32wb_register:
3437case ARM::VST1q64wb_fixed:
3438case ARM::VST1q64wb_register:
3439case ARM::VST1q8wb_fixed:
3440case ARM::VST1q8wb_register:
3441case ARM::VST2d16:
3442case ARM::VST2d32:
3443case ARM::VST2d8:
3444case ARM::VST2d16wb_fixed:
3445case ARM::VST2d16wb_register:
3446case ARM::VST2d32wb_fixed:
3447case ARM::VST2d32wb_register:
3448case ARM::VST2d8wb_fixed:
3449case ARM::VST2d8wb_register:
3450if (!Check(S,DecodeDPairRegisterClass(Inst, Rd,Address, Decoder)))
3451returnMCDisassembler::Fail;
3452break;
3453case ARM::VST2b16:
3454case ARM::VST2b32:
3455case ARM::VST2b8:
3456case ARM::VST2b16wb_fixed:
3457case ARM::VST2b16wb_register:
3458case ARM::VST2b32wb_fixed:
3459case ARM::VST2b32wb_register:
3460case ARM::VST2b8wb_fixed:
3461case ARM::VST2b8wb_register:
3462if (!Check(S,DecodeDPairSpacedRegisterClass(Inst, Rd,Address, Decoder)))
3463returnMCDisassembler::Fail;
3464break;
3465default:
3466if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3467returnMCDisassembler::Fail;
3468 }
3469
3470// Second input register
3471switch (Inst.getOpcode()) {
3472case ARM::VST3d8:
3473case ARM::VST3d16:
3474case ARM::VST3d32:
3475case ARM::VST3d8_UPD:
3476case ARM::VST3d16_UPD:
3477case ARM::VST3d32_UPD:
3478case ARM::VST4d8:
3479case ARM::VST4d16:
3480case ARM::VST4d32:
3481case ARM::VST4d8_UPD:
3482case ARM::VST4d16_UPD:
3483case ARM::VST4d32_UPD:
3484if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+1)%32,Address, Decoder)))
3485returnMCDisassembler::Fail;
3486break;
3487case ARM::VST3q8:
3488case ARM::VST3q16:
3489case ARM::VST3q32:
3490case ARM::VST3q8_UPD:
3491case ARM::VST3q16_UPD:
3492case ARM::VST3q32_UPD:
3493case ARM::VST4q8:
3494case ARM::VST4q16:
3495case ARM::VST4q32:
3496case ARM::VST4q8_UPD:
3497case ARM::VST4q16_UPD:
3498case ARM::VST4q32_UPD:
3499if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+2)%32,Address, Decoder)))
3500returnMCDisassembler::Fail;
3501break;
3502default:
3503break;
3504 }
3505
3506// Third input register
3507switch (Inst.getOpcode()) {
3508case ARM::VST3d8:
3509case ARM::VST3d16:
3510case ARM::VST3d32:
3511case ARM::VST3d8_UPD:
3512case ARM::VST3d16_UPD:
3513case ARM::VST3d32_UPD:
3514case ARM::VST4d8:
3515case ARM::VST4d16:
3516case ARM::VST4d32:
3517case ARM::VST4d8_UPD:
3518case ARM::VST4d16_UPD:
3519case ARM::VST4d32_UPD:
3520if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+2)%32,Address, Decoder)))
3521returnMCDisassembler::Fail;
3522break;
3523case ARM::VST3q8:
3524case ARM::VST3q16:
3525case ARM::VST3q32:
3526case ARM::VST3q8_UPD:
3527case ARM::VST3q16_UPD:
3528case ARM::VST3q32_UPD:
3529case ARM::VST4q8:
3530case ARM::VST4q16:
3531case ARM::VST4q32:
3532case ARM::VST4q8_UPD:
3533case ARM::VST4q16_UPD:
3534case ARM::VST4q32_UPD:
3535if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+4)%32,Address, Decoder)))
3536returnMCDisassembler::Fail;
3537break;
3538default:
3539break;
3540 }
3541
3542// Fourth input register
3543switch (Inst.getOpcode()) {
3544case ARM::VST4d8:
3545case ARM::VST4d16:
3546case ARM::VST4d32:
3547case ARM::VST4d8_UPD:
3548case ARM::VST4d16_UPD:
3549case ARM::VST4d32_UPD:
3550if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+3)%32,Address, Decoder)))
3551returnMCDisassembler::Fail;
3552break;
3553case ARM::VST4q8:
3554case ARM::VST4q16:
3555case ARM::VST4q32:
3556case ARM::VST4q8_UPD:
3557case ARM::VST4q16_UPD:
3558case ARM::VST4q32_UPD:
3559if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+6)%32,Address, Decoder)))
3560returnMCDisassembler::Fail;
3561break;
3562default:
3563break;
3564 }
3565
3566return S;
3567}
3568
3569staticDecodeStatusDecodeVLD1DupInstruction(MCInst &Inst,unsignedInsn,
3570uint64_t Address,
3571constMCDisassembler *Decoder) {
3572DecodeStatus S =MCDisassembler::Success;
3573
3574unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3575 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3576unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3577unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3578unsigned align = fieldFromInstruction(Insn, 4, 1);
3579unsignedsize = fieldFromInstruction(Insn, 6, 2);
3580
3581if (size == 0 && align == 1)
3582returnMCDisassembler::Fail;
3583 align *= (1 <<size);
3584
3585switch (Inst.getOpcode()) {
3586case ARM::VLD1DUPq16:case ARM::VLD1DUPq32:case ARM::VLD1DUPq8:
3587case ARM::VLD1DUPq16wb_fixed:case ARM::VLD1DUPq16wb_register:
3588case ARM::VLD1DUPq32wb_fixed:case ARM::VLD1DUPq32wb_register:
3589case ARM::VLD1DUPq8wb_fixed:case ARM::VLD1DUPq8wb_register:
3590if (!Check(S,DecodeDPairRegisterClass(Inst, Rd,Address, Decoder)))
3591returnMCDisassembler::Fail;
3592break;
3593default:
3594if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3595returnMCDisassembler::Fail;
3596break;
3597 }
3598if (Rm != 0xF) {
3599if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3600returnMCDisassembler::Fail;
3601 }
3602
3603if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3604returnMCDisassembler::Fail;
3605 Inst.addOperand(MCOperand::createImm(align));
3606
3607// The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3608// variant encodes Rm == 0xf. Anything else is a register offset post-
3609// increment and we need to add the register operand to the instruction.
3610if (Rm != 0xD && Rm != 0xF &&
3611 !Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
3612returnMCDisassembler::Fail;
3613
3614return S;
3615}
3616
3617staticDecodeStatusDecodeVLD2DupInstruction(MCInst &Inst,unsignedInsn,
3618uint64_t Address,
3619constMCDisassembler *Decoder) {
3620DecodeStatus S =MCDisassembler::Success;
3621
3622unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3623 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3624unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3625unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3626unsigned align = fieldFromInstruction(Insn, 4, 1);
3627unsignedsize = 1 << fieldFromInstruction(Insn, 6, 2);
3628 align *= 2*size;
3629
3630switch (Inst.getOpcode()) {
3631case ARM::VLD2DUPd16:case ARM::VLD2DUPd32:case ARM::VLD2DUPd8:
3632case ARM::VLD2DUPd16wb_fixed:case ARM::VLD2DUPd16wb_register:
3633case ARM::VLD2DUPd32wb_fixed:case ARM::VLD2DUPd32wb_register:
3634case ARM::VLD2DUPd8wb_fixed:case ARM::VLD2DUPd8wb_register:
3635if (!Check(S,DecodeDPairRegisterClass(Inst, Rd,Address, Decoder)))
3636returnMCDisassembler::Fail;
3637break;
3638case ARM::VLD2DUPd16x2:case ARM::VLD2DUPd32x2:case ARM::VLD2DUPd8x2:
3639case ARM::VLD2DUPd16x2wb_fixed:case ARM::VLD2DUPd16x2wb_register:
3640case ARM::VLD2DUPd32x2wb_fixed:case ARM::VLD2DUPd32x2wb_register:
3641case ARM::VLD2DUPd8x2wb_fixed:case ARM::VLD2DUPd8x2wb_register:
3642if (!Check(S,DecodeDPairSpacedRegisterClass(Inst, Rd,Address, Decoder)))
3643returnMCDisassembler::Fail;
3644break;
3645default:
3646if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3647returnMCDisassembler::Fail;
3648break;
3649 }
3650
3651if (Rm != 0xF)
3652 Inst.addOperand(MCOperand::createImm(0));
3653
3654if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3655returnMCDisassembler::Fail;
3656 Inst.addOperand(MCOperand::createImm(align));
3657
3658if (Rm != 0xD && Rm != 0xF) {
3659if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
3660returnMCDisassembler::Fail;
3661 }
3662
3663return S;
3664}
3665
3666staticDecodeStatusDecodeVLD3DupInstruction(MCInst &Inst,unsignedInsn,
3667uint64_t Address,
3668constMCDisassembler *Decoder) {
3669DecodeStatus S =MCDisassembler::Success;
3670
3671unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3672 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3673unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3674unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3675unsigned inc = fieldFromInstruction(Insn, 5, 1) + 1;
3676
3677if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3678returnMCDisassembler::Fail;
3679if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+inc)%32,Address, Decoder)))
3680returnMCDisassembler::Fail;
3681if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32,Address, Decoder)))
3682returnMCDisassembler::Fail;
3683if (Rm != 0xF) {
3684if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3685returnMCDisassembler::Fail;
3686 }
3687
3688if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3689returnMCDisassembler::Fail;
3690 Inst.addOperand(MCOperand::createImm(0));
3691
3692if (Rm == 0xD)
3693 Inst.addOperand(MCOperand::createReg(0));
3694elseif (Rm != 0xF) {
3695if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
3696returnMCDisassembler::Fail;
3697 }
3698
3699return S;
3700}
3701
3702staticDecodeStatusDecodeVLD4DupInstruction(MCInst &Inst,unsignedInsn,
3703uint64_t Address,
3704constMCDisassembler *Decoder) {
3705DecodeStatus S =MCDisassembler::Success;
3706
3707unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3708 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3709unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3710unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3711unsignedsize = fieldFromInstruction(Insn, 6, 2);
3712unsigned inc = fieldFromInstruction(Insn, 5, 1) + 1;
3713unsigned align = fieldFromInstruction(Insn, 4, 1);
3714
3715if (size == 0x3) {
3716if (align == 0)
3717returnMCDisassembler::Fail;
3718 align = 16;
3719 }else {
3720if (size == 2) {
3721 align *= 8;
3722 }else {
3723size = 1 <<size;
3724 align *= 4*size;
3725 }
3726 }
3727
3728if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3729returnMCDisassembler::Fail;
3730if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+inc)%32,Address, Decoder)))
3731returnMCDisassembler::Fail;
3732if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32,Address, Decoder)))
3733returnMCDisassembler::Fail;
3734if (!Check(S,DecodeDPRRegisterClass(Inst, (Rd+3*inc)%32,Address, Decoder)))
3735returnMCDisassembler::Fail;
3736if (Rm != 0xF) {
3737if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3738returnMCDisassembler::Fail;
3739 }
3740
3741if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
3742returnMCDisassembler::Fail;
3743 Inst.addOperand(MCOperand::createImm(align));
3744
3745if (Rm == 0xD)
3746 Inst.addOperand(MCOperand::createReg(0));
3747elseif (Rm != 0xF) {
3748if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
3749returnMCDisassembler::Fail;
3750 }
3751
3752return S;
3753}
3754
3755staticDecodeStatusDecodeVMOVModImmInstruction(MCInst &Inst,unsignedInsn,
3756uint64_t Address,
3757constMCDisassembler *Decoder) {
3758DecodeStatus S =MCDisassembler::Success;
3759
3760unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3761 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3762unsigned imm = fieldFromInstruction(Insn, 0, 4);
3763 imm |= fieldFromInstruction(Insn, 16, 3) << 4;
3764 imm |= fieldFromInstruction(Insn, 24, 1) << 7;
3765 imm |= fieldFromInstruction(Insn, 8, 4) << 8;
3766 imm |= fieldFromInstruction(Insn, 5, 1) << 12;
3767unsigned Q = fieldFromInstruction(Insn, 6, 1);
3768
3769if (Q) {
3770if (!Check(S,DecodeQPRRegisterClass(Inst, Rd,Address, Decoder)))
3771returnMCDisassembler::Fail;
3772 }else {
3773if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3774returnMCDisassembler::Fail;
3775 }
3776
3777 Inst.addOperand(MCOperand::createImm(imm));
3778
3779switch (Inst.getOpcode()) {
3780case ARM::VORRiv4i16:
3781case ARM::VORRiv2i32:
3782case ARM::VBICiv4i16:
3783case ARM::VBICiv2i32:
3784if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3785returnMCDisassembler::Fail;
3786break;
3787case ARM::VORRiv8i16:
3788case ARM::VORRiv4i32:
3789case ARM::VBICiv8i16:
3790case ARM::VBICiv4i32:
3791if (!Check(S,DecodeQPRRegisterClass(Inst, Rd,Address, Decoder)))
3792returnMCDisassembler::Fail;
3793break;
3794default:
3795break;
3796 }
3797
3798return S;
3799}
3800
3801staticDecodeStatusDecodeMVEModImmInstruction(MCInst &Inst,unsignedInsn,
3802uint64_t Address,
3803constMCDisassembler *Decoder) {
3804DecodeStatus S =MCDisassembler::Success;
3805
3806unsigned Qd = ((fieldFromInstruction(Insn, 22, 1) << 3) |
3807 fieldFromInstruction(Insn, 13, 3));
3808unsigned cmode = fieldFromInstruction(Insn, 8, 4);
3809unsigned imm = fieldFromInstruction(Insn, 0, 4);
3810 imm |= fieldFromInstruction(Insn, 16, 3) << 4;
3811 imm |= fieldFromInstruction(Insn, 28, 1) << 7;
3812 imm |= cmode << 8;
3813 imm |= fieldFromInstruction(Insn, 5, 1) << 12;
3814
3815if (cmode == 0xF && Inst.getOpcode() == ARM::MVE_VMVNimmi32)
3816returnMCDisassembler::Fail;
3817
3818if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
3819returnMCDisassembler::Fail;
3820
3821 Inst.addOperand(MCOperand::createImm(imm));
3822
3823 Inst.addOperand(MCOperand::createImm(ARMVCC::None));
3824 Inst.addOperand(MCOperand::createReg(0));
3825 Inst.addOperand(MCOperand::createImm(0));
3826
3827return S;
3828}
3829
3830staticDecodeStatusDecodeMVEVADCInstruction(MCInst &Inst,unsignedInsn,
3831uint64_t Address,
3832constMCDisassembler *Decoder) {
3833DecodeStatus S =MCDisassembler::Success;
3834
3835unsigned Qd = fieldFromInstruction(Insn, 13, 3);
3836 Qd |= fieldFromInstruction(Insn, 22, 1) << 3;
3837if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
3838returnMCDisassembler::Fail;
3839 Inst.addOperand(MCOperand::createReg(ARM::FPSCR_NZCV));
3840
3841unsigned Qn = fieldFromInstruction(Insn, 17, 3);
3842 Qn |= fieldFromInstruction(Insn, 7, 1) << 3;
3843if (!Check(S,DecodeMQPRRegisterClass(Inst, Qn,Address, Decoder)))
3844returnMCDisassembler::Fail;
3845unsigned Qm = fieldFromInstruction(Insn, 1, 3);
3846 Qm |= fieldFromInstruction(Insn, 5, 1) << 3;
3847if (!Check(S,DecodeMQPRRegisterClass(Inst, Qm,Address, Decoder)))
3848returnMCDisassembler::Fail;
3849if (!fieldFromInstruction(Insn, 12, 1))// I bit clear => need input FPSCR
3850 Inst.addOperand(MCOperand::createReg(ARM::FPSCR_NZCV));
3851 Inst.addOperand(MCOperand::createImm(Qd));
3852
3853return S;
3854}
3855
3856staticDecodeStatusDecodeVSHLMaxInstruction(MCInst &Inst,unsignedInsn,
3857uint64_t Address,
3858constMCDisassembler *Decoder) {
3859DecodeStatus S =MCDisassembler::Success;
3860
3861unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3862 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3863unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3864 Rm |= fieldFromInstruction(Insn, 5, 1) << 4;
3865unsignedsize = fieldFromInstruction(Insn, 18, 2);
3866
3867if (!Check(S,DecodeQPRRegisterClass(Inst, Rd,Address, Decoder)))
3868returnMCDisassembler::Fail;
3869if (!Check(S,DecodeDPRRegisterClass(Inst, Rm,Address, Decoder)))
3870returnMCDisassembler::Fail;
3871 Inst.addOperand(MCOperand::createImm(8 <<size));
3872
3873return S;
3874}
3875
3876staticDecodeStatusDecodeShiftRight8Imm(MCInst &Inst,unsigned Val,
3877uint64_t Address,
3878constMCDisassembler *Decoder) {
3879 Inst.addOperand(MCOperand::createImm(8 - Val));
3880returnMCDisassembler::Success;
3881}
3882
3883staticDecodeStatusDecodeShiftRight16Imm(MCInst &Inst,unsigned Val,
3884uint64_t Address,
3885constMCDisassembler *Decoder) {
3886 Inst.addOperand(MCOperand::createImm(16 - Val));
3887returnMCDisassembler::Success;
3888}
3889
3890staticDecodeStatusDecodeShiftRight32Imm(MCInst &Inst,unsigned Val,
3891uint64_t Address,
3892constMCDisassembler *Decoder) {
3893 Inst.addOperand(MCOperand::createImm(32 - Val));
3894returnMCDisassembler::Success;
3895}
3896
3897staticDecodeStatusDecodeShiftRight64Imm(MCInst &Inst,unsigned Val,
3898uint64_t Address,
3899constMCDisassembler *Decoder) {
3900 Inst.addOperand(MCOperand::createImm(64 - Val));
3901returnMCDisassembler::Success;
3902}
3903
3904staticDecodeStatusDecodeTBLInstruction(MCInst &Inst,unsignedInsn,
3905uint64_t Address,
3906constMCDisassembler *Decoder) {
3907DecodeStatus S =MCDisassembler::Success;
3908
3909unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3910 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3911unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3912 Rn |= fieldFromInstruction(Insn, 7, 1) << 4;
3913unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3914 Rm |= fieldFromInstruction(Insn, 5, 1) << 4;
3915unsignedop = fieldFromInstruction(Insn, 6, 1);
3916
3917if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3918returnMCDisassembler::Fail;
3919if (op) {
3920if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
3921returnMCDisassembler::Fail;// Writeback
3922 }
3923
3924switch (Inst.getOpcode()) {
3925case ARM::VTBL2:
3926case ARM::VTBX2:
3927if (!Check(S,DecodeDPairRegisterClass(Inst, Rn,Address, Decoder)))
3928returnMCDisassembler::Fail;
3929break;
3930default:
3931if (!Check(S,DecodeDPRRegisterClass(Inst, Rn,Address, Decoder)))
3932returnMCDisassembler::Fail;
3933 }
3934
3935if (!Check(S,DecodeDPRRegisterClass(Inst, Rm,Address, Decoder)))
3936returnMCDisassembler::Fail;
3937
3938return S;
3939}
3940
3941staticDecodeStatusDecodeThumbAddSpecialReg(MCInst &Inst,uint16_tInsn,
3942uint64_t Address,
3943constMCDisassembler *Decoder) {
3944DecodeStatus S =MCDisassembler::Success;
3945
3946unsigned dst = fieldFromInstruction(Insn, 8, 3);
3947unsigned imm = fieldFromInstruction(Insn, 0, 8);
3948
3949if (!Check(S,DecodetGPRRegisterClass(Inst, dst,Address, Decoder)))
3950returnMCDisassembler::Fail;
3951
3952switch(Inst.getOpcode()) {
3953default:
3954returnMCDisassembler::Fail;
3955case ARM::tADR:
3956break;// tADR does not explicitly represent the PC as an operand.
3957case ARM::tADDrSPi:
3958 Inst.addOperand(MCOperand::createReg(ARM::SP));
3959break;
3960 }
3961
3962 Inst.addOperand(MCOperand::createImm(imm));
3963return S;
3964}
3965
3966staticDecodeStatusDecodeThumbBROperand(MCInst &Inst,unsigned Val,
3967uint64_t Address,
3968constMCDisassembler *Decoder) {
3969if (!tryAddingSymbolicOperand(Address,Address + SignExtend32<12>(Val<<1) + 4,
3970true, 2, Inst, Decoder))
3971 Inst.addOperand(MCOperand::createImm(SignExtend32<12>(Val << 1)));
3972returnMCDisassembler::Success;
3973}
3974
3975staticDecodeStatusDecodeT2BROperand(MCInst &Inst,unsigned Val,
3976uint64_t Address,
3977constMCDisassembler *Decoder) {
3978if (!tryAddingSymbolicOperand(Address,Address + SignExtend32<21>(Val) + 4,
3979true, 4, Inst, Decoder))
3980 Inst.addOperand(MCOperand::createImm(SignExtend32<21>(Val)));
3981returnMCDisassembler::Success;
3982}
3983
3984staticDecodeStatusDecodeThumbCmpBROperand(MCInst &Inst,unsigned Val,
3985uint64_t Address,
3986constMCDisassembler *Decoder) {
3987if (!tryAddingSymbolicOperand(Address,Address + (Val<<1) + 4,
3988true, 2, Inst, Decoder))
3989 Inst.addOperand(MCOperand::createImm(Val << 1));
3990returnMCDisassembler::Success;
3991}
3992
3993staticDecodeStatusDecodeThumbAddrModeRR(MCInst &Inst,unsigned Val,
3994uint64_t Address,
3995constMCDisassembler *Decoder) {
3996DecodeStatus S =MCDisassembler::Success;
3997
3998unsigned Rn = fieldFromInstruction(Val, 0, 3);
3999unsigned Rm = fieldFromInstruction(Val, 3, 3);
4000
4001if (!Check(S,DecodetGPRRegisterClass(Inst, Rn,Address, Decoder)))
4002returnMCDisassembler::Fail;
4003if (!Check(S,DecodetGPRRegisterClass(Inst, Rm,Address, Decoder)))
4004returnMCDisassembler::Fail;
4005
4006return S;
4007}
4008
4009staticDecodeStatusDecodeThumbAddrModeIS(MCInst &Inst,unsigned Val,
4010uint64_t Address,
4011constMCDisassembler *Decoder) {
4012DecodeStatus S =MCDisassembler::Success;
4013
4014unsigned Rn = fieldFromInstruction(Val, 0, 3);
4015unsigned imm = fieldFromInstruction(Val, 3, 5);
4016
4017if (!Check(S,DecodetGPRRegisterClass(Inst, Rn,Address, Decoder)))
4018returnMCDisassembler::Fail;
4019 Inst.addOperand(MCOperand::createImm(imm));
4020
4021return S;
4022}
4023
4024staticDecodeStatusDecodeThumbAddrModePC(MCInst &Inst,unsigned Val,
4025uint64_t Address,
4026constMCDisassembler *Decoder) {
4027unsigned imm = Val << 2;
4028
4029 Inst.addOperand(MCOperand::createImm(imm));
4030tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4, Decoder);
4031
4032returnMCDisassembler::Success;
4033}
4034
4035staticDecodeStatusDecodeThumbAddrModeSP(MCInst &Inst,unsigned Val,
4036uint64_t Address,
4037constMCDisassembler *Decoder) {
4038 Inst.addOperand(MCOperand::createReg(ARM::SP));
4039 Inst.addOperand(MCOperand::createImm(Val));
4040
4041returnMCDisassembler::Success;
4042}
4043
4044staticDecodeStatusDecodeT2AddrModeSOReg(MCInst &Inst,unsigned Val,
4045uint64_t Address,
4046constMCDisassembler *Decoder) {
4047DecodeStatus S =MCDisassembler::Success;
4048
4049unsigned Rn = fieldFromInstruction(Val, 6, 4);
4050unsigned Rm = fieldFromInstruction(Val, 2, 4);
4051unsigned imm = fieldFromInstruction(Val, 0, 2);
4052
4053// Thumb stores cannot use PC as dest register.
4054switch (Inst.getOpcode()) {
4055case ARM::t2STRHs:
4056case ARM::t2STRBs:
4057case ARM::t2STRs:
4058if (Rn == 15)
4059returnMCDisassembler::Fail;
4060break;
4061default:
4062break;
4063 }
4064
4065if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4066returnMCDisassembler::Fail;
4067if (!Check(S,DecoderGPRRegisterClass(Inst, Rm,Address, Decoder)))
4068returnMCDisassembler::Fail;
4069 Inst.addOperand(MCOperand::createImm(imm));
4070
4071return S;
4072}
4073
4074staticDecodeStatusDecodeT2LoadShift(MCInst &Inst,unsignedInsn,
4075uint64_t Address,
4076constMCDisassembler *Decoder) {
4077DecodeStatus S =MCDisassembler::Success;
4078
4079unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4080unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4081
4082constFeatureBitset &featureBits =
4083 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4084
4085bool hasMP = featureBits[ARM::FeatureMP];
4086bool hasV7Ops = featureBits[ARM::HasV7Ops];
4087
4088if (Rn == 15) {
4089switch (Inst.getOpcode()) {
4090case ARM::t2LDRBs:
4091 Inst.setOpcode(ARM::t2LDRBpci);
4092break;
4093case ARM::t2LDRHs:
4094 Inst.setOpcode(ARM::t2LDRHpci);
4095break;
4096case ARM::t2LDRSHs:
4097 Inst.setOpcode(ARM::t2LDRSHpci);
4098break;
4099case ARM::t2LDRSBs:
4100 Inst.setOpcode(ARM::t2LDRSBpci);
4101break;
4102case ARM::t2LDRs:
4103 Inst.setOpcode(ARM::t2LDRpci);
4104break;
4105case ARM::t2PLDs:
4106 Inst.setOpcode(ARM::t2PLDpci);
4107break;
4108case ARM::t2PLIs:
4109 Inst.setOpcode(ARM::t2PLIpci);
4110break;
4111default:
4112returnMCDisassembler::Fail;
4113 }
4114
4115returnDecodeT2LoadLabel(Inst,Insn,Address, Decoder);
4116 }
4117
4118if (Rt == 15) {
4119switch (Inst.getOpcode()) {
4120case ARM::t2LDRSHs:
4121returnMCDisassembler::Fail;
4122case ARM::t2LDRHs:
4123 Inst.setOpcode(ARM::t2PLDWs);
4124break;
4125case ARM::t2LDRSBs:
4126 Inst.setOpcode(ARM::t2PLIs);
4127break;
4128default:
4129break;
4130 }
4131 }
4132
4133switch (Inst.getOpcode()) {
4134case ARM::t2PLDs:
4135break;
4136case ARM::t2PLIs:
4137if (!hasV7Ops)
4138returnMCDisassembler::Fail;
4139break;
4140case ARM::t2PLDWs:
4141if (!hasV7Ops || !hasMP)
4142returnMCDisassembler::Fail;
4143break;
4144default:
4145if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
4146returnMCDisassembler::Fail;
4147 }
4148
4149unsigned addrmode = fieldFromInstruction(Insn, 4, 2);
4150 addrmode |= fieldFromInstruction(Insn, 0, 4) << 2;
4151 addrmode |= fieldFromInstruction(Insn, 16, 4) << 6;
4152if (!Check(S,DecodeT2AddrModeSOReg(Inst, addrmode,Address, Decoder)))
4153returnMCDisassembler::Fail;
4154
4155return S;
4156}
4157
4158staticDecodeStatusDecodeT2LoadImm8(MCInst &Inst,unsignedInsn,
4159uint64_t Address,
4160constMCDisassembler *Decoder) {
4161DecodeStatus S =MCDisassembler::Success;
4162
4163unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4164unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4165unsigned U = fieldFromInstruction(Insn, 9, 1);
4166unsigned imm = fieldFromInstruction(Insn, 0, 8);
4167 imm |= (U << 8);
4168 imm |= (Rn << 9);
4169unsigned add = fieldFromInstruction(Insn, 9, 1);
4170
4171constFeatureBitset &featureBits =
4172 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4173
4174bool hasMP = featureBits[ARM::FeatureMP];
4175bool hasV7Ops = featureBits[ARM::HasV7Ops];
4176
4177if (Rn == 15) {
4178switch (Inst.getOpcode()) {
4179case ARM::t2LDRi8:
4180 Inst.setOpcode(ARM::t2LDRpci);
4181break;
4182case ARM::t2LDRBi8:
4183 Inst.setOpcode(ARM::t2LDRBpci);
4184break;
4185case ARM::t2LDRSBi8:
4186 Inst.setOpcode(ARM::t2LDRSBpci);
4187break;
4188case ARM::t2LDRHi8:
4189 Inst.setOpcode(ARM::t2LDRHpci);
4190break;
4191case ARM::t2LDRSHi8:
4192 Inst.setOpcode(ARM::t2LDRSHpci);
4193break;
4194case ARM::t2PLDi8:
4195 Inst.setOpcode(ARM::t2PLDpci);
4196break;
4197case ARM::t2PLIi8:
4198 Inst.setOpcode(ARM::t2PLIpci);
4199break;
4200default:
4201returnMCDisassembler::Fail;
4202 }
4203returnDecodeT2LoadLabel(Inst,Insn,Address, Decoder);
4204 }
4205
4206if (Rt == 15) {
4207switch (Inst.getOpcode()) {
4208case ARM::t2LDRSHi8:
4209returnMCDisassembler::Fail;
4210case ARM::t2LDRHi8:
4211if (!add)
4212 Inst.setOpcode(ARM::t2PLDWi8);
4213break;
4214case ARM::t2LDRSBi8:
4215 Inst.setOpcode(ARM::t2PLIi8);
4216break;
4217default:
4218break;
4219 }
4220 }
4221
4222switch (Inst.getOpcode()) {
4223case ARM::t2PLDi8:
4224break;
4225case ARM::t2PLIi8:
4226if (!hasV7Ops)
4227returnMCDisassembler::Fail;
4228break;
4229case ARM::t2PLDWi8:
4230if (!hasV7Ops || !hasMP)
4231returnMCDisassembler::Fail;
4232break;
4233default:
4234if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
4235returnMCDisassembler::Fail;
4236 }
4237
4238if (!Check(S,DecodeT2AddrModeImm8(Inst, imm,Address, Decoder)))
4239returnMCDisassembler::Fail;
4240return S;
4241}
4242
4243staticDecodeStatusDecodeT2LoadImm12(MCInst &Inst,unsignedInsn,
4244uint64_t Address,
4245constMCDisassembler *Decoder) {
4246DecodeStatus S =MCDisassembler::Success;
4247
4248unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4249unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4250unsigned imm = fieldFromInstruction(Insn, 0, 12);
4251 imm |= (Rn << 13);
4252
4253constFeatureBitset &featureBits =
4254 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4255
4256bool hasMP = featureBits[ARM::FeatureMP];
4257bool hasV7Ops = featureBits[ARM::HasV7Ops];
4258
4259if (Rn == 15) {
4260switch (Inst.getOpcode()) {
4261case ARM::t2LDRi12:
4262 Inst.setOpcode(ARM::t2LDRpci);
4263break;
4264case ARM::t2LDRHi12:
4265 Inst.setOpcode(ARM::t2LDRHpci);
4266break;
4267case ARM::t2LDRSHi12:
4268 Inst.setOpcode(ARM::t2LDRSHpci);
4269break;
4270case ARM::t2LDRBi12:
4271 Inst.setOpcode(ARM::t2LDRBpci);
4272break;
4273case ARM::t2LDRSBi12:
4274 Inst.setOpcode(ARM::t2LDRSBpci);
4275break;
4276case ARM::t2PLDi12:
4277 Inst.setOpcode(ARM::t2PLDpci);
4278break;
4279case ARM::t2PLIi12:
4280 Inst.setOpcode(ARM::t2PLIpci);
4281break;
4282default:
4283returnMCDisassembler::Fail;
4284 }
4285returnDecodeT2LoadLabel(Inst,Insn,Address, Decoder);
4286 }
4287
4288if (Rt == 15) {
4289switch (Inst.getOpcode()) {
4290case ARM::t2LDRSHi12:
4291returnMCDisassembler::Fail;
4292case ARM::t2LDRHi12:
4293 Inst.setOpcode(ARM::t2PLDWi12);
4294break;
4295case ARM::t2LDRSBi12:
4296 Inst.setOpcode(ARM::t2PLIi12);
4297break;
4298default:
4299break;
4300 }
4301 }
4302
4303switch (Inst.getOpcode()) {
4304case ARM::t2PLDi12:
4305break;
4306case ARM::t2PLIi12:
4307if (!hasV7Ops)
4308returnMCDisassembler::Fail;
4309break;
4310case ARM::t2PLDWi12:
4311if (!hasV7Ops || !hasMP)
4312returnMCDisassembler::Fail;
4313break;
4314default:
4315if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
4316returnMCDisassembler::Fail;
4317 }
4318
4319if (!Check(S,DecodeT2AddrModeImm12(Inst, imm,Address, Decoder)))
4320returnMCDisassembler::Fail;
4321return S;
4322}
4323
4324staticDecodeStatusDecodeT2LoadT(MCInst &Inst,unsignedInsn,uint64_t Address,
4325constMCDisassembler *Decoder) {
4326DecodeStatus S =MCDisassembler::Success;
4327
4328unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4329unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4330unsigned imm = fieldFromInstruction(Insn, 0, 8);
4331 imm |= (Rn << 9);
4332
4333if (Rn == 15) {
4334switch (Inst.getOpcode()) {
4335case ARM::t2LDRT:
4336 Inst.setOpcode(ARM::t2LDRpci);
4337break;
4338case ARM::t2LDRBT:
4339 Inst.setOpcode(ARM::t2LDRBpci);
4340break;
4341case ARM::t2LDRHT:
4342 Inst.setOpcode(ARM::t2LDRHpci);
4343break;
4344case ARM::t2LDRSBT:
4345 Inst.setOpcode(ARM::t2LDRSBpci);
4346break;
4347case ARM::t2LDRSHT:
4348 Inst.setOpcode(ARM::t2LDRSHpci);
4349break;
4350default:
4351returnMCDisassembler::Fail;
4352 }
4353returnDecodeT2LoadLabel(Inst,Insn,Address, Decoder);
4354 }
4355
4356if (!Check(S,DecoderGPRRegisterClass(Inst, Rt,Address, Decoder)))
4357returnMCDisassembler::Fail;
4358if (!Check(S,DecodeT2AddrModeImm8(Inst, imm,Address, Decoder)))
4359returnMCDisassembler::Fail;
4360return S;
4361}
4362
4363staticDecodeStatusDecodeT2LoadLabel(MCInst &Inst,unsignedInsn,
4364uint64_t Address,
4365constMCDisassembler *Decoder) {
4366DecodeStatus S =MCDisassembler::Success;
4367
4368unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4369unsigned U = fieldFromInstruction(Insn, 23, 1);
4370int imm = fieldFromInstruction(Insn, 0, 12);
4371
4372constFeatureBitset &featureBits =
4373 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4374
4375bool hasV7Ops = featureBits[ARM::HasV7Ops];
4376
4377if (Rt == 15) {
4378switch (Inst.getOpcode()) {
4379case ARM::t2LDRBpci:
4380case ARM::t2LDRHpci:
4381 Inst.setOpcode(ARM::t2PLDpci);
4382break;
4383case ARM::t2LDRSBpci:
4384 Inst.setOpcode(ARM::t2PLIpci);
4385break;
4386case ARM::t2LDRSHpci:
4387returnMCDisassembler::Fail;
4388default:
4389break;
4390 }
4391 }
4392
4393switch(Inst.getOpcode()) {
4394case ARM::t2PLDpci:
4395break;
4396case ARM::t2PLIpci:
4397if (!hasV7Ops)
4398returnMCDisassembler::Fail;
4399break;
4400default:
4401if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
4402returnMCDisassembler::Fail;
4403 }
4404
4405if (!U) {
4406// Special case for #-0.
4407if (imm == 0)
4408 imm = INT32_MIN;
4409else
4410 imm = -imm;
4411 }
4412 Inst.addOperand(MCOperand::createImm(imm));
4413
4414return S;
4415}
4416
4417staticDecodeStatusDecodeT2Imm8S4(MCInst &Inst,unsigned Val,uint64_t Address,
4418constMCDisassembler *Decoder) {
4419if (Val == 0)
4420 Inst.addOperand(MCOperand::createImm(INT32_MIN));
4421else {
4422int imm = Val & 0xFF;
4423
4424if (!(Val & 0x100)) imm *= -1;
4425 Inst.addOperand(MCOperand::createImm(imm * 4));
4426 }
4427
4428returnMCDisassembler::Success;
4429}
4430
4431staticDecodeStatusDecodeT2Imm7S4(MCInst &Inst,unsigned Val,uint64_t Address,
4432constMCDisassembler *Decoder) {
4433if (Val == 0)
4434 Inst.addOperand(MCOperand::createImm(INT32_MIN));
4435else {
4436int imm = Val & 0x7F;
4437
4438if (!(Val & 0x80))
4439 imm *= -1;
4440 Inst.addOperand(MCOperand::createImm(imm * 4));
4441 }
4442
4443returnMCDisassembler::Success;
4444}
4445
4446staticDecodeStatusDecodeT2AddrModeImm8s4(MCInst &Inst,unsigned Val,
4447uint64_t Address,
4448constMCDisassembler *Decoder) {
4449DecodeStatus S =MCDisassembler::Success;
4450
4451unsigned Rn = fieldFromInstruction(Val, 9, 4);
4452unsigned imm = fieldFromInstruction(Val, 0, 9);
4453
4454if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4455returnMCDisassembler::Fail;
4456if (!Check(S,DecodeT2Imm8S4(Inst, imm,Address, Decoder)))
4457returnMCDisassembler::Fail;
4458
4459return S;
4460}
4461
4462staticDecodeStatusDecodeT2AddrModeImm7s4(MCInst &Inst,unsigned Val,
4463uint64_t Address,
4464constMCDisassembler *Decoder) {
4465DecodeStatus S =MCDisassembler::Success;
4466
4467unsigned Rn = fieldFromInstruction(Val, 8, 4);
4468unsigned imm = fieldFromInstruction(Val, 0, 8);
4469
4470if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
4471returnMCDisassembler::Fail;
4472if (!Check(S,DecodeT2Imm7S4(Inst, imm,Address, Decoder)))
4473returnMCDisassembler::Fail;
4474
4475return S;
4476}
4477
4478staticDecodeStatusDecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
4479uint64_t Address,
4480constMCDisassembler *Decoder) {
4481DecodeStatus S =MCDisassembler::Success;
4482
4483unsigned Rn = fieldFromInstruction(Val, 8, 4);
4484unsigned imm = fieldFromInstruction(Val, 0, 8);
4485
4486if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
4487returnMCDisassembler::Fail;
4488
4489 Inst.addOperand(MCOperand::createImm(imm));
4490
4491return S;
4492}
4493
4494staticDecodeStatusDecodeT2Imm8(MCInst &Inst,unsigned Val,uint64_t Address,
4495constMCDisassembler *Decoder) {
4496int imm = Val & 0xFF;
4497if (Val == 0)
4498 imm = INT32_MIN;
4499elseif (!(Val & 0x100))
4500 imm *= -1;
4501 Inst.addOperand(MCOperand::createImm(imm));
4502
4503returnMCDisassembler::Success;
4504}
4505
4506template <int shift>
4507staticDecodeStatusDecodeT2Imm7(MCInst &Inst,unsigned Val,uint64_t Address,
4508constMCDisassembler *Decoder) {
4509int imm = Val & 0x7F;
4510if (Val == 0)
4511 imm = INT32_MIN;
4512elseif (!(Val & 0x80))
4513 imm *= -1;
4514if (imm != INT32_MIN)
4515 imm *= (1U << shift);
4516 Inst.addOperand(MCOperand::createImm(imm));
4517
4518returnMCDisassembler::Success;
4519}
4520
4521staticDecodeStatusDecodeT2AddrModeImm8(MCInst &Inst,unsigned Val,
4522uint64_t Address,
4523constMCDisassembler *Decoder) {
4524DecodeStatus S =MCDisassembler::Success;
4525
4526unsigned Rn = fieldFromInstruction(Val, 9, 4);
4527unsigned imm = fieldFromInstruction(Val, 0, 9);
4528
4529// Thumb stores cannot use PC as dest register.
4530switch (Inst.getOpcode()) {
4531case ARM::t2STRT:
4532case ARM::t2STRBT:
4533case ARM::t2STRHT:
4534case ARM::t2STRi8:
4535case ARM::t2STRHi8:
4536case ARM::t2STRBi8:
4537if (Rn == 15)
4538returnMCDisassembler::Fail;
4539break;
4540default:
4541break;
4542 }
4543
4544// Some instructions always use an additive offset.
4545switch (Inst.getOpcode()) {
4546case ARM::t2LDRT:
4547case ARM::t2LDRBT:
4548case ARM::t2LDRHT:
4549case ARM::t2LDRSBT:
4550case ARM::t2LDRSHT:
4551case ARM::t2STRT:
4552case ARM::t2STRBT:
4553case ARM::t2STRHT:
4554 imm |= 0x100;
4555break;
4556default:
4557break;
4558 }
4559
4560if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4561returnMCDisassembler::Fail;
4562if (!Check(S,DecodeT2Imm8(Inst, imm,Address, Decoder)))
4563returnMCDisassembler::Fail;
4564
4565return S;
4566}
4567
4568template <int shift>
4569staticDecodeStatusDecodeTAddrModeImm7(MCInst &Inst,unsigned Val,
4570uint64_t Address,
4571constMCDisassembler *Decoder) {
4572DecodeStatus S =MCDisassembler::Success;
4573
4574unsigned Rn = fieldFromInstruction(Val, 8, 3);
4575unsigned imm = fieldFromInstruction(Val, 0, 8);
4576
4577if (!Check(S,DecodetGPRRegisterClass(Inst, Rn,Address, Decoder)))
4578returnMCDisassembler::Fail;
4579if (!Check(S, DecodeT2Imm7<shift>(Inst, imm,Address, Decoder)))
4580returnMCDisassembler::Fail;
4581
4582return S;
4583}
4584
4585template <int shift,int WriteBack>
4586staticDecodeStatusDecodeT2AddrModeImm7(MCInst &Inst,unsigned Val,
4587uint64_t Address,
4588constMCDisassembler *Decoder) {
4589DecodeStatus S =MCDisassembler::Success;
4590
4591unsigned Rn = fieldFromInstruction(Val, 8, 4);
4592unsigned imm = fieldFromInstruction(Val, 0, 8);
4593if (WriteBack) {
4594if (!Check(S,DecoderGPRRegisterClass(Inst, Rn,Address, Decoder)))
4595returnMCDisassembler::Fail;
4596 }elseif (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
4597returnMCDisassembler::Fail;
4598if (!Check(S, DecodeT2Imm7<shift>(Inst, imm,Address, Decoder)))
4599returnMCDisassembler::Fail;
4600
4601return S;
4602}
4603
4604staticDecodeStatusDecodeT2LdStPre(MCInst &Inst,unsignedInsn,
4605uint64_t Address,
4606constMCDisassembler *Decoder) {
4607DecodeStatus S =MCDisassembler::Success;
4608
4609unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4610unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4611unsigned addr = fieldFromInstruction(Insn, 0, 8);
4612 addr |= fieldFromInstruction(Insn, 9, 1) << 8;
4613 addr |= Rn << 9;
4614unsignedload = fieldFromInstruction(Insn, 20, 1);
4615
4616if (Rn == 15) {
4617switch (Inst.getOpcode()) {
4618case ARM::t2LDR_PRE:
4619case ARM::t2LDR_POST:
4620 Inst.setOpcode(ARM::t2LDRpci);
4621break;
4622case ARM::t2LDRB_PRE:
4623case ARM::t2LDRB_POST:
4624 Inst.setOpcode(ARM::t2LDRBpci);
4625break;
4626case ARM::t2LDRH_PRE:
4627case ARM::t2LDRH_POST:
4628 Inst.setOpcode(ARM::t2LDRHpci);
4629break;
4630case ARM::t2LDRSB_PRE:
4631case ARM::t2LDRSB_POST:
4632if (Rt == 15)
4633 Inst.setOpcode(ARM::t2PLIpci);
4634else
4635 Inst.setOpcode(ARM::t2LDRSBpci);
4636break;
4637case ARM::t2LDRSH_PRE:
4638case ARM::t2LDRSH_POST:
4639 Inst.setOpcode(ARM::t2LDRSHpci);
4640break;
4641default:
4642returnMCDisassembler::Fail;
4643 }
4644returnDecodeT2LoadLabel(Inst,Insn,Address, Decoder);
4645 }
4646
4647if (!load) {
4648if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4649returnMCDisassembler::Fail;
4650 }
4651
4652if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
4653returnMCDisassembler::Fail;
4654
4655if (load) {
4656if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4657returnMCDisassembler::Fail;
4658 }
4659
4660if (!Check(S,DecodeT2AddrModeImm8(Inst, addr,Address, Decoder)))
4661returnMCDisassembler::Fail;
4662
4663return S;
4664}
4665
4666staticDecodeStatusDecodeT2AddrModeImm12(MCInst &Inst,unsigned Val,
4667uint64_t Address,
4668constMCDisassembler *Decoder) {
4669DecodeStatus S =MCDisassembler::Success;
4670
4671unsigned Rn = fieldFromInstruction(Val, 13, 4);
4672unsigned imm = fieldFromInstruction(Val, 0, 12);
4673
4674// Thumb stores cannot use PC as dest register.
4675switch (Inst.getOpcode()) {
4676case ARM::t2STRi12:
4677case ARM::t2STRBi12:
4678case ARM::t2STRHi12:
4679if (Rn == 15)
4680returnMCDisassembler::Fail;
4681break;
4682default:
4683break;
4684 }
4685
4686if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4687returnMCDisassembler::Fail;
4688 Inst.addOperand(MCOperand::createImm(imm));
4689
4690return S;
4691}
4692
4693staticDecodeStatusDecodeThumbAddSPImm(MCInst &Inst,uint16_tInsn,
4694uint64_t Address,
4695constMCDisassembler *Decoder) {
4696unsigned imm = fieldFromInstruction(Insn, 0, 7);
4697
4698 Inst.addOperand(MCOperand::createReg(ARM::SP));
4699 Inst.addOperand(MCOperand::createReg(ARM::SP));
4700 Inst.addOperand(MCOperand::createImm(imm));
4701
4702returnMCDisassembler::Success;
4703}
4704
4705staticDecodeStatusDecodeThumbAddSPReg(MCInst &Inst,uint16_tInsn,
4706uint64_t Address,
4707constMCDisassembler *Decoder) {
4708DecodeStatus S =MCDisassembler::Success;
4709
4710if (Inst.getOpcode() == ARM::tADDrSP) {
4711unsigned Rdm = fieldFromInstruction(Insn, 0, 3);
4712 Rdm |= fieldFromInstruction(Insn, 7, 1) << 3;
4713
4714if (!Check(S,DecodeGPRRegisterClass(Inst, Rdm,Address, Decoder)))
4715returnMCDisassembler::Fail;
4716 Inst.addOperand(MCOperand::createReg(ARM::SP));
4717if (!Check(S,DecodeGPRRegisterClass(Inst, Rdm,Address, Decoder)))
4718returnMCDisassembler::Fail;
4719 }elseif (Inst.getOpcode() == ARM::tADDspr) {
4720unsigned Rm = fieldFromInstruction(Insn, 3, 4);
4721
4722 Inst.addOperand(MCOperand::createReg(ARM::SP));
4723 Inst.addOperand(MCOperand::createReg(ARM::SP));
4724if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
4725returnMCDisassembler::Fail;
4726 }
4727
4728return S;
4729}
4730
4731staticDecodeStatusDecodeThumbCPS(MCInst &Inst,uint16_tInsn,
4732uint64_t Address,
4733constMCDisassembler *Decoder) {
4734unsigned imod = fieldFromInstruction(Insn, 4, 1) | 0x2;
4735unsigned flags = fieldFromInstruction(Insn, 0, 3);
4736
4737 Inst.addOperand(MCOperand::createImm(imod));
4738 Inst.addOperand(MCOperand::createImm(flags));
4739
4740returnMCDisassembler::Success;
4741}
4742
4743staticDecodeStatusDecodePostIdxReg(MCInst &Inst,unsignedInsn,
4744uint64_t Address,
4745constMCDisassembler *Decoder) {
4746DecodeStatus S =MCDisassembler::Success;
4747unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4748unsigned add = fieldFromInstruction(Insn, 4, 1);
4749
4750if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rm,Address, Decoder)))
4751returnMCDisassembler::Fail;
4752 Inst.addOperand(MCOperand::createImm(add));
4753
4754return S;
4755}
4756
4757staticDecodeStatusDecodeMveAddrModeRQ(MCInst &Inst,unsignedInsn,
4758uint64_t Address,
4759constMCDisassembler *Decoder) {
4760DecodeStatus S =MCDisassembler::Success;
4761unsigned Rn = fieldFromInstruction(Insn, 3, 4);
4762unsigned Qm = fieldFromInstruction(Insn, 0, 3);
4763
4764if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
4765returnMCDisassembler::Fail;
4766if (!Check(S,DecodeMQPRRegisterClass(Inst, Qm,Address, Decoder)))
4767returnMCDisassembler::Fail;
4768
4769return S;
4770}
4771
4772template <int shift>
4773staticDecodeStatusDecodeMveAddrModeQ(MCInst &Inst,unsignedInsn,
4774uint64_t Address,
4775constMCDisassembler *Decoder) {
4776DecodeStatus S =MCDisassembler::Success;
4777unsigned Qm = fieldFromInstruction(Insn, 8, 3);
4778int imm = fieldFromInstruction(Insn, 0, 7);
4779
4780if (!Check(S,DecodeMQPRRegisterClass(Inst, Qm,Address, Decoder)))
4781returnMCDisassembler::Fail;
4782
4783if(!fieldFromInstruction(Insn, 7, 1)) {
4784if (imm == 0)
4785 imm = INT32_MIN;// indicate -0
4786else
4787 imm *= -1;
4788 }
4789if (imm != INT32_MIN)
4790 imm *= (1U << shift);
4791 Inst.addOperand(MCOperand::createImm(imm));
4792
4793return S;
4794}
4795
4796staticDecodeStatusDecodeThumbBLXOffset(MCInst &Inst,unsigned Val,
4797uint64_t Address,
4798constMCDisassembler *Decoder) {
4799// Val is passed in as S:J1:J2:imm10H:imm10L:'0'
4800// Note only one trailing zero not two. Also the J1 and J2 values are from
4801// the encoded instruction. So here change to I1 and I2 values via:
4802// I1 = NOT(J1 EOR S);
4803// I2 = NOT(J2 EOR S);
4804// and build the imm32 with two trailing zeros as documented:
4805// imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32);
4806unsigned S = (Val >> 23) & 1;
4807unsigned J1 = (Val >> 22) & 1;
4808unsigned J2 = (Val >> 21) & 1;
4809unsigned I1 = !(J1 ^ S);
4810unsigned I2 = !(J2 ^ S);
4811unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4812int imm32 = SignExtend32<25>(tmp << 1);
4813
4814if (!tryAddingSymbolicOperand(Address,
4815 (Address & ~2u) + imm32 + 4,
4816true, 4, Inst, Decoder))
4817 Inst.addOperand(MCOperand::createImm(imm32));
4818returnMCDisassembler::Success;
4819}
4820
4821staticDecodeStatusDecodeCoprocessor(MCInst &Inst,unsigned Val,
4822uint64_t Address,
4823constMCDisassembler *Decoder) {
4824if (Val == 0xA || Val == 0xB)
4825returnMCDisassembler::Fail;
4826
4827constFeatureBitset &featureBits =
4828 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4829
4830if (!isValidCoprocessorNumber(Val, featureBits))
4831returnMCDisassembler::Fail;
4832
4833 Inst.addOperand(MCOperand::createImm(Val));
4834returnMCDisassembler::Success;
4835}
4836
4837staticDecodeStatusDecodeThumbTableBranch(MCInst &Inst,unsignedInsn,
4838uint64_t Address,
4839constMCDisassembler *Decoder) {
4840constFeatureBitset &FeatureBits =
4841 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4842DecodeStatus S =MCDisassembler::Success;
4843
4844unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4845unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4846
4847if (Rn == 13 && !FeatureBits[ARM::HasV8Ops]) S =MCDisassembler::SoftFail;
4848if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
4849returnMCDisassembler::Fail;
4850if (!Check(S,DecoderGPRRegisterClass(Inst, Rm,Address, Decoder)))
4851returnMCDisassembler::Fail;
4852return S;
4853}
4854
4855staticDecodeStatusDecodeThumb2BCCInstruction(MCInst &Inst,unsignedInsn,
4856uint64_t Address,
4857constMCDisassembler *Decoder) {
4858DecodeStatus S =MCDisassembler::Success;
4859
4860unsignedpred = fieldFromInstruction(Insn, 22, 4);
4861if (pred == 0xE ||pred == 0xF) {
4862unsigned opc = fieldFromInstruction(Insn, 4, 28);
4863switch (opc) {
4864default:
4865returnMCDisassembler::Fail;
4866case 0xf3bf8f4:
4867 Inst.setOpcode(ARM::t2DSB);
4868break;
4869case 0xf3bf8f5:
4870 Inst.setOpcode(ARM::t2DMB);
4871break;
4872case 0xf3bf8f6:
4873 Inst.setOpcode(ARM::t2ISB);
4874break;
4875 }
4876
4877unsigned imm = fieldFromInstruction(Insn, 0, 4);
4878returnDecodeMemBarrierOption(Inst, imm,Address, Decoder);
4879 }
4880
4881unsigned brtarget = fieldFromInstruction(Insn, 0, 11) << 1;
4882 brtarget |= fieldFromInstruction(Insn, 11, 1) << 19;
4883 brtarget |= fieldFromInstruction(Insn, 13, 1) << 18;
4884 brtarget |= fieldFromInstruction(Insn, 16, 6) << 12;
4885 brtarget |= fieldFromInstruction(Insn, 26, 1) << 20;
4886
4887if (!Check(S,DecodeT2BROperand(Inst, brtarget,Address, Decoder)))
4888returnMCDisassembler::Fail;
4889if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
4890returnMCDisassembler::Fail;
4891
4892return S;
4893}
4894
4895// Decode a shifted immediate operand. These basically consist
4896// of an 8-bit value, and a 4-bit directive that specifies either
4897// a splat operation or a rotation.
4898staticDecodeStatusDecodeT2SOImm(MCInst &Inst,unsigned Val,uint64_t Address,
4899constMCDisassembler *Decoder) {
4900unsigned ctrl = fieldFromInstruction(Val, 10, 2);
4901if (ctrl == 0) {
4902unsignedbyte = fieldFromInstruction(Val, 8, 2);
4903unsigned imm = fieldFromInstruction(Val, 0, 8);
4904switch (byte) {
4905case 0:
4906 Inst.addOperand(MCOperand::createImm(imm));
4907break;
4908case 1:
4909 Inst.addOperand(MCOperand::createImm((imm << 16) | imm));
4910break;
4911case 2:
4912 Inst.addOperand(MCOperand::createImm((imm << 24) | (imm << 8)));
4913break;
4914case 3:
4915 Inst.addOperand(MCOperand::createImm((imm << 24) | (imm << 16) |
4916 (imm << 8) | imm));
4917break;
4918 }
4919 }else {
4920unsigned unrot = fieldFromInstruction(Val, 0, 7) | 0x80;
4921unsigned rot = fieldFromInstruction(Val, 7, 5);
4922unsigned imm = llvm::rotr<uint32_t>(unrot, rot);
4923 Inst.addOperand(MCOperand::createImm(imm));
4924 }
4925
4926returnMCDisassembler::Success;
4927}
4928
4929staticDecodeStatusDecodeThumbBCCTargetOperand(MCInst &Inst,unsigned Val,
4930uint64_t Address,
4931constMCDisassembler *Decoder) {
4932if (!tryAddingSymbolicOperand(Address,Address + SignExtend32<9>(Val<<1) + 4,
4933true, 2, Inst, Decoder))
4934 Inst.addOperand(MCOperand::createImm(SignExtend32<9>(Val << 1)));
4935returnMCDisassembler::Success;
4936}
4937
4938staticDecodeStatusDecodeThumbBLTargetOperand(MCInst &Inst,unsigned Val,
4939uint64_t Address,
4940constMCDisassembler *Decoder) {
4941// Val is passed in as S:J1:J2:imm10:imm11
4942// Note no trailing zero after imm11. Also the J1 and J2 values are from
4943// the encoded instruction. So here change to I1 and I2 values via:
4944// I1 = NOT(J1 EOR S);
4945// I2 = NOT(J2 EOR S);
4946// and build the imm32 with one trailing zero as documented:
4947// imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
4948unsigned S = (Val >> 23) & 1;
4949unsigned J1 = (Val >> 22) & 1;
4950unsigned J2 = (Val >> 21) & 1;
4951unsigned I1 = !(J1 ^ S);
4952unsigned I2 = !(J2 ^ S);
4953unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4954int imm32 = SignExtend32<25>(tmp << 1);
4955
4956if (!tryAddingSymbolicOperand(Address,Address + imm32 + 4,
4957true, 4, Inst, Decoder))
4958 Inst.addOperand(MCOperand::createImm(imm32));
4959returnMCDisassembler::Success;
4960}
4961
4962staticDecodeStatusDecodeMemBarrierOption(MCInst &Inst,unsigned Val,
4963uint64_t Address,
4964constMCDisassembler *Decoder) {
4965if (Val & ~0xf)
4966returnMCDisassembler::Fail;
4967
4968 Inst.addOperand(MCOperand::createImm(Val));
4969returnMCDisassembler::Success;
4970}
4971
4972staticDecodeStatusDecodeInstSyncBarrierOption(MCInst &Inst,unsigned Val,
4973uint64_t Address,
4974constMCDisassembler *Decoder) {
4975if (Val & ~0xf)
4976returnMCDisassembler::Fail;
4977
4978 Inst.addOperand(MCOperand::createImm(Val));
4979returnMCDisassembler::Success;
4980}
4981
4982staticDecodeStatusDecodeMSRMask(MCInst &Inst,unsigned Val,uint64_t Address,
4983constMCDisassembler *Decoder) {
4984DecodeStatus S =MCDisassembler::Success;
4985constFeatureBitset &FeatureBits =
4986 ((constMCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
4987
4988if (FeatureBits[ARM::FeatureMClass]) {
4989unsigned ValLow = Val & 0xff;
4990
4991// Validate the SYSm value first.
4992switch (ValLow) {
4993case 0:// apsr
4994case 1:// iapsr
4995case 2:// eapsr
4996case 3:// xpsr
4997case 5:// ipsr
4998case 6:// epsr
4999case 7:// iepsr
5000case 8:// msp
5001case 9:// psp
5002case 16:// primask
5003case 20:// control
5004break;
5005case 17:// basepri
5006case 18:// basepri_max
5007case 19:// faultmask
5008if (!(FeatureBits[ARM::HasV7Ops]))
5009// Values basepri, basepri_max and faultmask are only valid for v7m.
5010returnMCDisassembler::Fail;
5011break;
5012case 0x8a:// msplim_ns
5013case 0x8b:// psplim_ns
5014case 0x91:// basepri_ns
5015case 0x93:// faultmask_ns
5016if (!(FeatureBits[ARM::HasV8MMainlineOps]))
5017returnMCDisassembler::Fail;
5018 [[fallthrough]];
5019case 10:// msplim
5020case 11:// psplim
5021case 0x88:// msp_ns
5022case 0x89:// psp_ns
5023case 0x90:// primask_ns
5024case 0x94:// control_ns
5025case 0x98:// sp_ns
5026if (!(FeatureBits[ARM::Feature8MSecExt]))
5027returnMCDisassembler::Fail;
5028break;
5029case 0x20:// pac_key_p_0
5030case 0x21:// pac_key_p_1
5031case 0x22:// pac_key_p_2
5032case 0x23:// pac_key_p_3
5033case 0x24:// pac_key_u_0
5034case 0x25:// pac_key_u_1
5035case 0x26:// pac_key_u_2
5036case 0x27:// pac_key_u_3
5037case 0xa0:// pac_key_p_0_ns
5038case 0xa1:// pac_key_p_1_ns
5039case 0xa2:// pac_key_p_2_ns
5040case 0xa3:// pac_key_p_3_ns
5041case 0xa4:// pac_key_u_0_ns
5042case 0xa5:// pac_key_u_1_ns
5043case 0xa6:// pac_key_u_2_ns
5044case 0xa7:// pac_key_u_3_ns
5045if (!(FeatureBits[ARM::FeaturePACBTI]))
5046returnMCDisassembler::Fail;
5047break;
5048default:
5049// Architecturally defined as unpredictable
5050 S =MCDisassembler::SoftFail;
5051break;
5052 }
5053
5054if (Inst.getOpcode() == ARM::t2MSR_M) {
5055unsigned Mask = fieldFromInstruction(Val, 10, 2);
5056if (!(FeatureBits[ARM::HasV7Ops])) {
5057// The ARMv6-M MSR bits {11-10} can be only 0b10, other values are
5058// unpredictable.
5059if (Mask != 2)
5060 S =MCDisassembler::SoftFail;
5061 }
5062else {
5063// The ARMv7-M architecture stores an additional 2-bit mask value in
5064// MSR bits {11-10}. The mask is used only with apsr, iapsr, eapsr and
5065// xpsr, it has to be 0b10 in other cases. Bit mask{1} indicates if
5066// the NZCVQ bits should be moved by the instruction. Bit mask{0}
5067// indicates the move for the GE{3:0} bits, the mask{0} bit can be set
5068// only if the processor includes the DSP extension.
5069if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
5070 (!(FeatureBits[ARM::FeatureDSP]) && (Mask & 1)))
5071 S =MCDisassembler::SoftFail;
5072 }
5073 }
5074 }else {
5075// A/R class
5076if (Val == 0)
5077returnMCDisassembler::Fail;
5078 }
5079 Inst.addOperand(MCOperand::createImm(Val));
5080return S;
5081}
5082
5083staticDecodeStatusDecodeBankedReg(MCInst &Inst,unsigned Val,
5084uint64_t Address,
5085constMCDisassembler *Decoder) {
5086unsigned R = fieldFromInstruction(Val, 5, 1);
5087unsigned SysM = fieldFromInstruction(Val, 0, 5);
5088
5089// The table of encodings for these banked registers comes from B9.2.3 of the
5090// ARM ARM. There are patterns, but nothing regular enough to make this logic
5091// neater. So by fiat, these values are UNPREDICTABLE:
5092if (!ARMBankedReg::lookupBankedRegByEncoding((R << 5) | SysM))
5093returnMCDisassembler::Fail;
5094
5095 Inst.addOperand(MCOperand::createImm(Val));
5096returnMCDisassembler::Success;
5097}
5098
5099staticDecodeStatusDecodeDoubleRegLoad(MCInst &Inst,unsignedInsn,
5100uint64_t Address,
5101constMCDisassembler *Decoder) {
5102DecodeStatus S =MCDisassembler::Success;
5103
5104unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5105unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5106unsignedpred = fieldFromInstruction(Insn, 28, 4);
5107
5108if (Rn == 0xF)
5109 S =MCDisassembler::SoftFail;
5110
5111if (!Check(S,DecodeGPRPairRegisterClass(Inst, Rt,Address, Decoder)))
5112returnMCDisassembler::Fail;
5113if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5114returnMCDisassembler::Fail;
5115if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5116returnMCDisassembler::Fail;
5117
5118return S;
5119}
5120
5121staticDecodeStatusDecodeDoubleRegStore(MCInst &Inst,unsignedInsn,
5122uint64_t Address,
5123constMCDisassembler *Decoder) {
5124DecodeStatus S =MCDisassembler::Success;
5125
5126unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5127unsigned Rt = fieldFromInstruction(Insn, 0, 4);
5128unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5129unsignedpred = fieldFromInstruction(Insn, 28, 4);
5130
5131if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rd,Address, Decoder)))
5132returnMCDisassembler::Fail;
5133
5134if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1)
5135 S =MCDisassembler::SoftFail;
5136
5137if (!Check(S,DecodeGPRPairRegisterClass(Inst, Rt,Address, Decoder)))
5138returnMCDisassembler::Fail;
5139if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5140returnMCDisassembler::Fail;
5141if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5142returnMCDisassembler::Fail;
5143
5144return S;
5145}
5146
5147staticDecodeStatusDecodeLDRPreImm(MCInst &Inst,unsignedInsn,
5148uint64_t Address,
5149constMCDisassembler *Decoder) {
5150DecodeStatus S =MCDisassembler::Success;
5151
5152unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5153unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5154unsigned imm = fieldFromInstruction(Insn, 0, 12);
5155 imm |= fieldFromInstruction(Insn, 16, 4) << 13;
5156 imm |= fieldFromInstruction(Insn, 23, 1) << 12;
5157unsignedpred = fieldFromInstruction(Insn, 28, 4);
5158
5159if (Rn == 0xF || Rn == Rt) S =MCDisassembler::SoftFail;
5160
5161if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
5162returnMCDisassembler::Fail;
5163if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5164returnMCDisassembler::Fail;
5165if (!Check(S,DecodeAddrModeImm12Operand(Inst, imm,Address, Decoder)))
5166returnMCDisassembler::Fail;
5167if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5168returnMCDisassembler::Fail;
5169
5170return S;
5171}
5172
5173staticDecodeStatusDecodeLDRPreReg(MCInst &Inst,unsignedInsn,
5174uint64_t Address,
5175constMCDisassembler *Decoder) {
5176DecodeStatus S =MCDisassembler::Success;
5177
5178unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5179unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5180unsigned imm = fieldFromInstruction(Insn, 0, 12);
5181 imm |= fieldFromInstruction(Insn, 16, 4) << 13;
5182 imm |= fieldFromInstruction(Insn, 23, 1) << 12;
5183unsignedpred = fieldFromInstruction(Insn, 28, 4);
5184unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5185
5186if (Rn == 0xF || Rn == Rt) S =MCDisassembler::SoftFail;
5187if (Rm == 0xF) S =MCDisassembler::SoftFail;
5188
5189if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
5190returnMCDisassembler::Fail;
5191if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5192returnMCDisassembler::Fail;
5193if (!Check(S,DecodeSORegMemOperand(Inst, imm,Address, Decoder)))
5194returnMCDisassembler::Fail;
5195if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5196returnMCDisassembler::Fail;
5197
5198return S;
5199}
5200
5201staticDecodeStatusDecodeSTRPreImm(MCInst &Inst,unsignedInsn,
5202uint64_t Address,
5203constMCDisassembler *Decoder) {
5204DecodeStatus S =MCDisassembler::Success;
5205
5206unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5207unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5208unsigned imm = fieldFromInstruction(Insn, 0, 12);
5209 imm |= fieldFromInstruction(Insn, 16, 4) << 13;
5210 imm |= fieldFromInstruction(Insn, 23, 1) << 12;
5211unsignedpred = fieldFromInstruction(Insn, 28, 4);
5212
5213if (Rn == 0xF || Rn == Rt) S =MCDisassembler::SoftFail;
5214
5215if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5216returnMCDisassembler::Fail;
5217if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
5218returnMCDisassembler::Fail;
5219if (!Check(S,DecodeAddrModeImm12Operand(Inst, imm,Address, Decoder)))
5220returnMCDisassembler::Fail;
5221if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5222returnMCDisassembler::Fail;
5223
5224return S;
5225}
5226
5227staticDecodeStatusDecodeSTRPreReg(MCInst &Inst,unsignedInsn,
5228uint64_t Address,
5229constMCDisassembler *Decoder) {
5230DecodeStatus S =MCDisassembler::Success;
5231
5232unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5233unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5234unsigned imm = fieldFromInstruction(Insn, 0, 12);
5235 imm |= fieldFromInstruction(Insn, 16, 4) << 13;
5236 imm |= fieldFromInstruction(Insn, 23, 1) << 12;
5237unsignedpred = fieldFromInstruction(Insn, 28, 4);
5238
5239if (Rn == 0xF || Rn == Rt) S =MCDisassembler::SoftFail;
5240
5241if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5242returnMCDisassembler::Fail;
5243if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
5244returnMCDisassembler::Fail;
5245if (!Check(S,DecodeSORegMemOperand(Inst, imm,Address, Decoder)))
5246returnMCDisassembler::Fail;
5247if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5248returnMCDisassembler::Fail;
5249
5250return S;
5251}
5252
5253staticDecodeStatusDecodeVLD1LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5254constMCDisassembler *Decoder) {
5255DecodeStatus S =MCDisassembler::Success;
5256
5257unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5258unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5259unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5260 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5261unsignedsize = fieldFromInstruction(Insn, 10, 2);
5262
5263unsigned align = 0;
5264unsigned index = 0;
5265switch (size) {
5266default:
5267returnMCDisassembler::Fail;
5268case 0:
5269if (fieldFromInstruction(Insn, 4, 1))
5270returnMCDisassembler::Fail;// UNDEFINED
5271 index = fieldFromInstruction(Insn, 5, 3);
5272break;
5273case 1:
5274if (fieldFromInstruction(Insn, 5, 1))
5275returnMCDisassembler::Fail;// UNDEFINED
5276 index = fieldFromInstruction(Insn, 6, 2);
5277if (fieldFromInstruction(Insn, 4, 1))
5278 align = 2;
5279break;
5280case 2:
5281if (fieldFromInstruction(Insn, 6, 1))
5282returnMCDisassembler::Fail;// UNDEFINED
5283 index = fieldFromInstruction(Insn, 7, 1);
5284
5285switch (fieldFromInstruction(Insn, 4, 2)) {
5286case 0 :
5287 align = 0;break;
5288case 3:
5289 align = 4;break;
5290default:
5291returnMCDisassembler::Fail;
5292 }
5293break;
5294 }
5295
5296if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5297returnMCDisassembler::Fail;
5298if (Rm != 0xF) {// Writeback
5299if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5300returnMCDisassembler::Fail;
5301 }
5302if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5303returnMCDisassembler::Fail;
5304 Inst.addOperand(MCOperand::createImm(align));
5305if (Rm != 0xF) {
5306if (Rm != 0xD) {
5307if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5308returnMCDisassembler::Fail;
5309 }else
5310 Inst.addOperand(MCOperand::createReg(0));
5311 }
5312
5313if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5314returnMCDisassembler::Fail;
5315 Inst.addOperand(MCOperand::createImm(index));
5316
5317return S;
5318}
5319
5320staticDecodeStatusDecodeVST1LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5321constMCDisassembler *Decoder) {
5322DecodeStatus S =MCDisassembler::Success;
5323
5324unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5325unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5326unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5327 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5328unsignedsize = fieldFromInstruction(Insn, 10, 2);
5329
5330unsigned align = 0;
5331unsigned index = 0;
5332switch (size) {
5333default:
5334returnMCDisassembler::Fail;
5335case 0:
5336if (fieldFromInstruction(Insn, 4, 1))
5337returnMCDisassembler::Fail;// UNDEFINED
5338 index = fieldFromInstruction(Insn, 5, 3);
5339break;
5340case 1:
5341if (fieldFromInstruction(Insn, 5, 1))
5342returnMCDisassembler::Fail;// UNDEFINED
5343 index = fieldFromInstruction(Insn, 6, 2);
5344if (fieldFromInstruction(Insn, 4, 1))
5345 align = 2;
5346break;
5347case 2:
5348if (fieldFromInstruction(Insn, 6, 1))
5349returnMCDisassembler::Fail;// UNDEFINED
5350 index = fieldFromInstruction(Insn, 7, 1);
5351
5352switch (fieldFromInstruction(Insn, 4, 2)) {
5353case 0:
5354 align = 0;break;
5355case 3:
5356 align = 4;break;
5357default:
5358returnMCDisassembler::Fail;
5359 }
5360break;
5361 }
5362
5363if (Rm != 0xF) {// Writeback
5364if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5365returnMCDisassembler::Fail;
5366 }
5367if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5368returnMCDisassembler::Fail;
5369 Inst.addOperand(MCOperand::createImm(align));
5370if (Rm != 0xF) {
5371if (Rm != 0xD) {
5372if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5373returnMCDisassembler::Fail;
5374 }else
5375 Inst.addOperand(MCOperand::createReg(0));
5376 }
5377
5378if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5379returnMCDisassembler::Fail;
5380 Inst.addOperand(MCOperand::createImm(index));
5381
5382return S;
5383}
5384
5385staticDecodeStatusDecodeVLD2LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5386constMCDisassembler *Decoder) {
5387DecodeStatus S =MCDisassembler::Success;
5388
5389unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5390unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5391unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5392 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5393unsignedsize = fieldFromInstruction(Insn, 10, 2);
5394
5395unsigned align = 0;
5396unsigned index = 0;
5397unsigned inc = 1;
5398switch (size) {
5399default:
5400returnMCDisassembler::Fail;
5401case 0:
5402 index = fieldFromInstruction(Insn, 5, 3);
5403if (fieldFromInstruction(Insn, 4, 1))
5404 align = 2;
5405break;
5406case 1:
5407 index = fieldFromInstruction(Insn, 6, 2);
5408if (fieldFromInstruction(Insn, 4, 1))
5409 align = 4;
5410if (fieldFromInstruction(Insn, 5, 1))
5411 inc = 2;
5412break;
5413case 2:
5414if (fieldFromInstruction(Insn, 5, 1))
5415returnMCDisassembler::Fail;// UNDEFINED
5416 index = fieldFromInstruction(Insn, 7, 1);
5417if (fieldFromInstruction(Insn, 4, 1) != 0)
5418 align = 8;
5419if (fieldFromInstruction(Insn, 6, 1))
5420 inc = 2;
5421break;
5422 }
5423
5424if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5425returnMCDisassembler::Fail;
5426if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5427returnMCDisassembler::Fail;
5428if (Rm != 0xF) {// Writeback
5429if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5430returnMCDisassembler::Fail;
5431 }
5432if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5433returnMCDisassembler::Fail;
5434 Inst.addOperand(MCOperand::createImm(align));
5435if (Rm != 0xF) {
5436if (Rm != 0xD) {
5437if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5438returnMCDisassembler::Fail;
5439 }else
5440 Inst.addOperand(MCOperand::createReg(0));
5441 }
5442
5443if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5444returnMCDisassembler::Fail;
5445if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5446returnMCDisassembler::Fail;
5447 Inst.addOperand(MCOperand::createImm(index));
5448
5449return S;
5450}
5451
5452staticDecodeStatusDecodeVST2LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5453constMCDisassembler *Decoder) {
5454DecodeStatus S =MCDisassembler::Success;
5455
5456unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5457unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5458unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5459 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5460unsignedsize = fieldFromInstruction(Insn, 10, 2);
5461
5462unsigned align = 0;
5463unsigned index = 0;
5464unsigned inc = 1;
5465switch (size) {
5466default:
5467returnMCDisassembler::Fail;
5468case 0:
5469 index = fieldFromInstruction(Insn, 5, 3);
5470if (fieldFromInstruction(Insn, 4, 1))
5471 align = 2;
5472break;
5473case 1:
5474 index = fieldFromInstruction(Insn, 6, 2);
5475if (fieldFromInstruction(Insn, 4, 1))
5476 align = 4;
5477if (fieldFromInstruction(Insn, 5, 1))
5478 inc = 2;
5479break;
5480case 2:
5481if (fieldFromInstruction(Insn, 5, 1))
5482returnMCDisassembler::Fail;// UNDEFINED
5483 index = fieldFromInstruction(Insn, 7, 1);
5484if (fieldFromInstruction(Insn, 4, 1) != 0)
5485 align = 8;
5486if (fieldFromInstruction(Insn, 6, 1))
5487 inc = 2;
5488break;
5489 }
5490
5491if (Rm != 0xF) {// Writeback
5492if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5493returnMCDisassembler::Fail;
5494 }
5495if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5496returnMCDisassembler::Fail;
5497 Inst.addOperand(MCOperand::createImm(align));
5498if (Rm != 0xF) {
5499if (Rm != 0xD) {
5500if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5501returnMCDisassembler::Fail;
5502 }else
5503 Inst.addOperand(MCOperand::createReg(0));
5504 }
5505
5506if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5507returnMCDisassembler::Fail;
5508if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5509returnMCDisassembler::Fail;
5510 Inst.addOperand(MCOperand::createImm(index));
5511
5512return S;
5513}
5514
5515staticDecodeStatusDecodeVLD3LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5516constMCDisassembler *Decoder) {
5517DecodeStatus S =MCDisassembler::Success;
5518
5519unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5520unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5521unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5522 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5523unsignedsize = fieldFromInstruction(Insn, 10, 2);
5524
5525unsigned align = 0;
5526unsigned index = 0;
5527unsigned inc = 1;
5528switch (size) {
5529default:
5530returnMCDisassembler::Fail;
5531case 0:
5532if (fieldFromInstruction(Insn, 4, 1))
5533returnMCDisassembler::Fail;// UNDEFINED
5534 index = fieldFromInstruction(Insn, 5, 3);
5535break;
5536case 1:
5537if (fieldFromInstruction(Insn, 4, 1))
5538returnMCDisassembler::Fail;// UNDEFINED
5539 index = fieldFromInstruction(Insn, 6, 2);
5540if (fieldFromInstruction(Insn, 5, 1))
5541 inc = 2;
5542break;
5543case 2:
5544if (fieldFromInstruction(Insn, 4, 2))
5545returnMCDisassembler::Fail;// UNDEFINED
5546 index = fieldFromInstruction(Insn, 7, 1);
5547if (fieldFromInstruction(Insn, 6, 1))
5548 inc = 2;
5549break;
5550 }
5551
5552if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5553returnMCDisassembler::Fail;
5554if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5555returnMCDisassembler::Fail;
5556if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+2*inc,Address, Decoder)))
5557returnMCDisassembler::Fail;
5558
5559if (Rm != 0xF) {// Writeback
5560if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5561returnMCDisassembler::Fail;
5562 }
5563if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5564returnMCDisassembler::Fail;
5565 Inst.addOperand(MCOperand::createImm(align));
5566if (Rm != 0xF) {
5567if (Rm != 0xD) {
5568if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5569returnMCDisassembler::Fail;
5570 }else
5571 Inst.addOperand(MCOperand::createReg(0));
5572 }
5573
5574if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5575returnMCDisassembler::Fail;
5576if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5577returnMCDisassembler::Fail;
5578if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+2*inc,Address, Decoder)))
5579returnMCDisassembler::Fail;
5580 Inst.addOperand(MCOperand::createImm(index));
5581
5582return S;
5583}
5584
5585staticDecodeStatusDecodeVST3LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5586constMCDisassembler *Decoder) {
5587DecodeStatus S =MCDisassembler::Success;
5588
5589unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5590unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5591unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5592 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5593unsignedsize = fieldFromInstruction(Insn, 10, 2);
5594
5595unsigned align = 0;
5596unsigned index = 0;
5597unsigned inc = 1;
5598switch (size) {
5599default:
5600returnMCDisassembler::Fail;
5601case 0:
5602if (fieldFromInstruction(Insn, 4, 1))
5603returnMCDisassembler::Fail;// UNDEFINED
5604 index = fieldFromInstruction(Insn, 5, 3);
5605break;
5606case 1:
5607if (fieldFromInstruction(Insn, 4, 1))
5608returnMCDisassembler::Fail;// UNDEFINED
5609 index = fieldFromInstruction(Insn, 6, 2);
5610if (fieldFromInstruction(Insn, 5, 1))
5611 inc = 2;
5612break;
5613case 2:
5614if (fieldFromInstruction(Insn, 4, 2))
5615returnMCDisassembler::Fail;// UNDEFINED
5616 index = fieldFromInstruction(Insn, 7, 1);
5617if (fieldFromInstruction(Insn, 6, 1))
5618 inc = 2;
5619break;
5620 }
5621
5622if (Rm != 0xF) {// Writeback
5623if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5624returnMCDisassembler::Fail;
5625 }
5626if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5627returnMCDisassembler::Fail;
5628 Inst.addOperand(MCOperand::createImm(align));
5629if (Rm != 0xF) {
5630if (Rm != 0xD) {
5631if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5632returnMCDisassembler::Fail;
5633 }else
5634 Inst.addOperand(MCOperand::createReg(0));
5635 }
5636
5637if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5638returnMCDisassembler::Fail;
5639if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5640returnMCDisassembler::Fail;
5641if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+2*inc,Address, Decoder)))
5642returnMCDisassembler::Fail;
5643 Inst.addOperand(MCOperand::createImm(index));
5644
5645return S;
5646}
5647
5648staticDecodeStatusDecodeVLD4LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5649constMCDisassembler *Decoder) {
5650DecodeStatus S =MCDisassembler::Success;
5651
5652unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5653unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5654unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5655 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5656unsignedsize = fieldFromInstruction(Insn, 10, 2);
5657
5658unsigned align = 0;
5659unsigned index = 0;
5660unsigned inc = 1;
5661switch (size) {
5662default:
5663returnMCDisassembler::Fail;
5664case 0:
5665if (fieldFromInstruction(Insn, 4, 1))
5666 align = 4;
5667 index = fieldFromInstruction(Insn, 5, 3);
5668break;
5669case 1:
5670if (fieldFromInstruction(Insn, 4, 1))
5671 align = 8;
5672 index = fieldFromInstruction(Insn, 6, 2);
5673if (fieldFromInstruction(Insn, 5, 1))
5674 inc = 2;
5675break;
5676case 2:
5677switch (fieldFromInstruction(Insn, 4, 2)) {
5678case 0:
5679 align = 0;break;
5680case 3:
5681returnMCDisassembler::Fail;
5682default:
5683 align = 4 << fieldFromInstruction(Insn, 4, 2);break;
5684 }
5685
5686 index = fieldFromInstruction(Insn, 7, 1);
5687if (fieldFromInstruction(Insn, 6, 1))
5688 inc = 2;
5689break;
5690 }
5691
5692if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5693returnMCDisassembler::Fail;
5694if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5695returnMCDisassembler::Fail;
5696if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+2*inc,Address, Decoder)))
5697returnMCDisassembler::Fail;
5698if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+3*inc,Address, Decoder)))
5699returnMCDisassembler::Fail;
5700
5701if (Rm != 0xF) {// Writeback
5702if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5703returnMCDisassembler::Fail;
5704 }
5705if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5706returnMCDisassembler::Fail;
5707 Inst.addOperand(MCOperand::createImm(align));
5708if (Rm != 0xF) {
5709if (Rm != 0xD) {
5710if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5711returnMCDisassembler::Fail;
5712 }else
5713 Inst.addOperand(MCOperand::createReg(0));
5714 }
5715
5716if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5717returnMCDisassembler::Fail;
5718if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5719returnMCDisassembler::Fail;
5720if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+2*inc,Address, Decoder)))
5721returnMCDisassembler::Fail;
5722if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+3*inc,Address, Decoder)))
5723returnMCDisassembler::Fail;
5724 Inst.addOperand(MCOperand::createImm(index));
5725
5726return S;
5727}
5728
5729staticDecodeStatusDecodeVST4LN(MCInst &Inst,unsignedInsn,uint64_t Address,
5730constMCDisassembler *Decoder) {
5731DecodeStatus S =MCDisassembler::Success;
5732
5733unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5734unsigned Rm = fieldFromInstruction(Insn, 0, 4);
5735unsigned Rd = fieldFromInstruction(Insn, 12, 4);
5736 Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
5737unsignedsize = fieldFromInstruction(Insn, 10, 2);
5738
5739unsigned align = 0;
5740unsigned index = 0;
5741unsigned inc = 1;
5742switch (size) {
5743default:
5744returnMCDisassembler::Fail;
5745case 0:
5746if (fieldFromInstruction(Insn, 4, 1))
5747 align = 4;
5748 index = fieldFromInstruction(Insn, 5, 3);
5749break;
5750case 1:
5751if (fieldFromInstruction(Insn, 4, 1))
5752 align = 8;
5753 index = fieldFromInstruction(Insn, 6, 2);
5754if (fieldFromInstruction(Insn, 5, 1))
5755 inc = 2;
5756break;
5757case 2:
5758switch (fieldFromInstruction(Insn, 4, 2)) {
5759case 0:
5760 align = 0;break;
5761case 3:
5762returnMCDisassembler::Fail;
5763default:
5764 align = 4 << fieldFromInstruction(Insn, 4, 2);break;
5765 }
5766
5767 index = fieldFromInstruction(Insn, 7, 1);
5768if (fieldFromInstruction(Insn, 6, 1))
5769 inc = 2;
5770break;
5771 }
5772
5773if (Rm != 0xF) {// Writeback
5774if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5775returnMCDisassembler::Fail;
5776 }
5777if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
5778returnMCDisassembler::Fail;
5779 Inst.addOperand(MCOperand::createImm(align));
5780if (Rm != 0xF) {
5781if (Rm != 0xD) {
5782if (!Check(S,DecodeGPRRegisterClass(Inst, Rm,Address, Decoder)))
5783returnMCDisassembler::Fail;
5784 }else
5785 Inst.addOperand(MCOperand::createReg(0));
5786 }
5787
5788if (!Check(S,DecodeDPRRegisterClass(Inst, Rd,Address, Decoder)))
5789returnMCDisassembler::Fail;
5790if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+inc,Address, Decoder)))
5791returnMCDisassembler::Fail;
5792if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+2*inc,Address, Decoder)))
5793returnMCDisassembler::Fail;
5794if (!Check(S,DecodeDPRRegisterClass(Inst, Rd+3*inc,Address, Decoder)))
5795returnMCDisassembler::Fail;
5796 Inst.addOperand(MCOperand::createImm(index));
5797
5798return S;
5799}
5800
5801staticDecodeStatusDecodeVMOVSRR(MCInst &Inst,unsignedInsn,uint64_t Address,
5802constMCDisassembler *Decoder) {
5803DecodeStatus S =MCDisassembler::Success;
5804unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5805unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
5806unsigned Rm = fieldFromInstruction(Insn, 5, 1);
5807unsignedpred = fieldFromInstruction(Insn, 28, 4);
5808 Rm |= fieldFromInstruction(Insn, 0, 4) << 1;
5809
5810if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5811 S =MCDisassembler::SoftFail;
5812
5813if (!Check(S,DecodeSPRRegisterClass(Inst, Rm ,Address, Decoder)))
5814returnMCDisassembler::Fail;
5815if (!Check(S,DecodeSPRRegisterClass(Inst, Rm+1,Address, Decoder)))
5816returnMCDisassembler::Fail;
5817if (!Check(S,DecodeGPRRegisterClass(Inst, Rt ,Address, Decoder)))
5818returnMCDisassembler::Fail;
5819if (!Check(S,DecodeGPRRegisterClass(Inst, Rt2 ,Address, Decoder)))
5820returnMCDisassembler::Fail;
5821if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5822returnMCDisassembler::Fail;
5823
5824return S;
5825}
5826
5827staticDecodeStatusDecodeVMOVRRS(MCInst &Inst,unsignedInsn,uint64_t Address,
5828constMCDisassembler *Decoder) {
5829DecodeStatus S =MCDisassembler::Success;
5830unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5831unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
5832unsigned Rm = fieldFromInstruction(Insn, 5, 1);
5833unsignedpred = fieldFromInstruction(Insn, 28, 4);
5834 Rm |= fieldFromInstruction(Insn, 0, 4) << 1;
5835
5836if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5837 S =MCDisassembler::SoftFail;
5838
5839if (!Check(S,DecodeGPRRegisterClass(Inst, Rt ,Address, Decoder)))
5840returnMCDisassembler::Fail;
5841if (!Check(S,DecodeGPRRegisterClass(Inst, Rt2 ,Address, Decoder)))
5842returnMCDisassembler::Fail;
5843if (!Check(S,DecodeSPRRegisterClass(Inst, Rm ,Address, Decoder)))
5844returnMCDisassembler::Fail;
5845if (!Check(S,DecodeSPRRegisterClass(Inst, Rm+1,Address, Decoder)))
5846returnMCDisassembler::Fail;
5847if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
5848returnMCDisassembler::Fail;
5849
5850return S;
5851}
5852
5853staticDecodeStatusDecodeIT(MCInst &Inst,unsignedInsn,uint64_t Address,
5854constMCDisassembler *Decoder) {
5855DecodeStatus S =MCDisassembler::Success;
5856unsignedpred = fieldFromInstruction(Insn, 4, 4);
5857unsigned mask = fieldFromInstruction(Insn, 0, 4);
5858
5859if (pred == 0xF) {
5860pred = 0xE;
5861 S =MCDisassembler::SoftFail;
5862 }
5863
5864if (mask == 0x0)
5865returnMCDisassembler::Fail;
5866
5867// IT masks are encoded as a sequence of replacement low-order bits
5868// for the condition code. So if the low bit of the starting
5869// condition code is 1, then we have to flip all the bits above the
5870// terminating bit (which is the lowest 1 bit).
5871if (pred & 1) {
5872unsigned LowBit = mask & -mask;
5873unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
5874 mask ^= BitsAboveLowBit;
5875 }
5876
5877 Inst.addOperand(MCOperand::createImm(pred));
5878 Inst.addOperand(MCOperand::createImm(mask));
5879return S;
5880}
5881
5882staticDecodeStatusDecodeT2LDRDPreInstruction(MCInst &Inst,unsignedInsn,
5883uint64_t Address,
5884constMCDisassembler *Decoder) {
5885DecodeStatus S =MCDisassembler::Success;
5886
5887unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5888unsigned Rt2 = fieldFromInstruction(Insn, 8, 4);
5889unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5890unsigned addr = fieldFromInstruction(Insn, 0, 8);
5891unsigned W = fieldFromInstruction(Insn, 21, 1);
5892unsigned U = fieldFromInstruction(Insn, 23, 1);
5893unsignedP = fieldFromInstruction(Insn, 24, 1);
5894bool writeback = (W == 1) | (P == 0);
5895
5896 addr |= (U << 8) | (Rn << 9);
5897
5898if (writeback && (Rn == Rt || Rn == Rt2))
5899Check(S,MCDisassembler::SoftFail);
5900if (Rt == Rt2)
5901Check(S,MCDisassembler::SoftFail);
5902
5903// Rt
5904if (!Check(S,DecoderGPRRegisterClass(Inst, Rt,Address, Decoder)))
5905returnMCDisassembler::Fail;
5906// Rt2
5907if (!Check(S,DecoderGPRRegisterClass(Inst, Rt2,Address, Decoder)))
5908returnMCDisassembler::Fail;
5909// Writeback operand
5910if (!Check(S,DecoderGPRRegisterClass(Inst, Rn,Address, Decoder)))
5911returnMCDisassembler::Fail;
5912// addr
5913if (!Check(S,DecodeT2AddrModeImm8s4(Inst, addr,Address, Decoder)))
5914returnMCDisassembler::Fail;
5915
5916return S;
5917}
5918
5919staticDecodeStatusDecodeT2STRDPreInstruction(MCInst &Inst,unsignedInsn,
5920uint64_t Address,
5921constMCDisassembler *Decoder) {
5922DecodeStatus S =MCDisassembler::Success;
5923
5924unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5925unsigned Rt2 = fieldFromInstruction(Insn, 8, 4);
5926unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5927unsigned addr = fieldFromInstruction(Insn, 0, 8);
5928unsigned W = fieldFromInstruction(Insn, 21, 1);
5929unsigned U = fieldFromInstruction(Insn, 23, 1);
5930unsignedP = fieldFromInstruction(Insn, 24, 1);
5931bool writeback = (W == 1) | (P == 0);
5932
5933 addr |= (U << 8) | (Rn << 9);
5934
5935if (writeback && (Rn == Rt || Rn == Rt2))
5936Check(S,MCDisassembler::SoftFail);
5937
5938// Writeback operand
5939if (!Check(S,DecoderGPRRegisterClass(Inst, Rn,Address, Decoder)))
5940returnMCDisassembler::Fail;
5941// Rt
5942if (!Check(S,DecoderGPRRegisterClass(Inst, Rt,Address, Decoder)))
5943returnMCDisassembler::Fail;
5944// Rt2
5945if (!Check(S,DecoderGPRRegisterClass(Inst, Rt2,Address, Decoder)))
5946returnMCDisassembler::Fail;
5947// addr
5948if (!Check(S,DecodeT2AddrModeImm8s4(Inst, addr,Address, Decoder)))
5949returnMCDisassembler::Fail;
5950
5951return S;
5952}
5953
5954staticDecodeStatusDecodeT2Adr(MCInst &Inst,uint32_tInsn,uint64_t Address,
5955constMCDisassembler *Decoder) {
5956unsigned sign1 = fieldFromInstruction(Insn, 21, 1);
5957unsigned sign2 = fieldFromInstruction(Insn, 23, 1);
5958if (sign1 != sign2)returnMCDisassembler::Fail;
5959constunsigned Rd = fieldFromInstruction(Insn, 8, 4);
5960assert(Inst.getNumOperands() == 0 &&"We should receive an empty Inst");
5961DecodeStatus S =DecoderGPRRegisterClass(Inst, Rd,Address, Decoder);
5962
5963unsigned Val = fieldFromInstruction(Insn, 0, 8);
5964 Val |= fieldFromInstruction(Insn, 12, 3) << 8;
5965 Val |= fieldFromInstruction(Insn, 26, 1) << 11;
5966// If sign, then it is decreasing the address.
5967if (sign1) {
5968// Following ARMv7 Architecture Manual, when the offset
5969// is zero, it is decoded as a subw, not as a adr.w
5970if (!Val) {
5971 Inst.setOpcode(ARM::t2SUBri12);
5972 Inst.addOperand(MCOperand::createReg(ARM::PC));
5973 }else
5974 Val = -Val;
5975 }
5976 Inst.addOperand(MCOperand::createImm(Val));
5977return S;
5978}
5979
5980staticDecodeStatusDecodeT2ShifterImmOperand(MCInst &Inst,uint32_t Val,
5981uint64_t Address,
5982constMCDisassembler *Decoder) {
5983DecodeStatus S =MCDisassembler::Success;
5984
5985// Shift of "asr #32" is not allowed in Thumb2 mode.
5986if (Val == 0x20) S =MCDisassembler::Fail;
5987 Inst.addOperand(MCOperand::createImm(Val));
5988return S;
5989}
5990
5991staticDecodeStatusDecodeSwap(MCInst &Inst,unsignedInsn,uint64_t Address,
5992constMCDisassembler *Decoder) {
5993unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5994unsigned Rt2 = fieldFromInstruction(Insn, 0, 4);
5995unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5996unsignedpred = fieldFromInstruction(Insn, 28, 4);
5997
5998if (pred == 0xF)
5999returnDecodeCPSInstruction(Inst,Insn,Address, Decoder);
6000
6001DecodeStatus S =MCDisassembler::Success;
6002
6003if (Rt == Rn || Rn == Rt2)
6004 S =MCDisassembler::SoftFail;
6005
6006if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt,Address, Decoder)))
6007returnMCDisassembler::Fail;
6008if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt2,Address, Decoder)))
6009returnMCDisassembler::Fail;
6010if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
6011returnMCDisassembler::Fail;
6012if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
6013returnMCDisassembler::Fail;
6014
6015return S;
6016}
6017
6018staticDecodeStatusDecodeVCVTD(MCInst &Inst,unsignedInsn,uint64_t Address,
6019constMCDisassembler *Decoder) {
6020constFeatureBitset &featureBits =
6021 ((constMCDisassembler *)Decoder)->getSubtargetInfo().getFeatureBits();
6022bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
6023
6024unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
6025 Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
6026unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
6027 Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
6028unsigned imm = fieldFromInstruction(Insn, 16, 6);
6029unsigned cmode = fieldFromInstruction(Insn, 8, 4);
6030unsignedop = fieldFromInstruction(Insn, 5, 1);
6031
6032DecodeStatus S =MCDisassembler::Success;
6033
6034// If the top 3 bits of imm are clear, this is a VMOV (immediate)
6035if (!(imm & 0x38)) {
6036if (cmode == 0xF) {
6037if (op == 1)returnMCDisassembler::Fail;
6038 Inst.setOpcode(ARM::VMOVv2f32);
6039 }
6040if (hasFullFP16) {
6041if (cmode == 0xE) {
6042if (op == 1) {
6043 Inst.setOpcode(ARM::VMOVv1i64);
6044 }else {
6045 Inst.setOpcode(ARM::VMOVv8i8);
6046 }
6047 }
6048if (cmode == 0xD) {
6049if (op == 1) {
6050 Inst.setOpcode(ARM::VMVNv2i32);
6051 }else {
6052 Inst.setOpcode(ARM::VMOVv2i32);
6053 }
6054 }
6055if (cmode == 0xC) {
6056if (op == 1) {
6057 Inst.setOpcode(ARM::VMVNv2i32);
6058 }else {
6059 Inst.setOpcode(ARM::VMOVv2i32);
6060 }
6061 }
6062 }
6063returnDecodeVMOVModImmInstruction(Inst,Insn,Address, Decoder);
6064 }
6065
6066if (!(imm & 0x20))returnMCDisassembler::Fail;
6067
6068if (!Check(S,DecodeDPRRegisterClass(Inst, Vd,Address, Decoder)))
6069returnMCDisassembler::Fail;
6070if (!Check(S,DecodeDPRRegisterClass(Inst, Vm,Address, Decoder)))
6071returnMCDisassembler::Fail;
6072 Inst.addOperand(MCOperand::createImm(64 - imm));
6073
6074return S;
6075}
6076
6077staticDecodeStatusDecodeVCVTQ(MCInst &Inst,unsignedInsn,uint64_t Address,
6078constMCDisassembler *Decoder) {
6079constFeatureBitset &featureBits =
6080 ((constMCDisassembler *)Decoder)->getSubtargetInfo().getFeatureBits();
6081bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
6082
6083unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
6084 Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
6085unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
6086 Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
6087unsigned imm = fieldFromInstruction(Insn, 16, 6);
6088unsigned cmode = fieldFromInstruction(Insn, 8, 4);
6089unsignedop = fieldFromInstruction(Insn, 5, 1);
6090
6091DecodeStatus S =MCDisassembler::Success;
6092
6093// If the top 3 bits of imm are clear, this is a VMOV (immediate)
6094if (!(imm & 0x38)) {
6095if (cmode == 0xF) {
6096if (op == 1)returnMCDisassembler::Fail;
6097 Inst.setOpcode(ARM::VMOVv4f32);
6098 }
6099if (hasFullFP16) {
6100if (cmode == 0xE) {
6101if (op == 1) {
6102 Inst.setOpcode(ARM::VMOVv2i64);
6103 }else {
6104 Inst.setOpcode(ARM::VMOVv16i8);
6105 }
6106 }
6107if (cmode == 0xD) {
6108if (op == 1) {
6109 Inst.setOpcode(ARM::VMVNv4i32);
6110 }else {
6111 Inst.setOpcode(ARM::VMOVv4i32);
6112 }
6113 }
6114if (cmode == 0xC) {
6115if (op == 1) {
6116 Inst.setOpcode(ARM::VMVNv4i32);
6117 }else {
6118 Inst.setOpcode(ARM::VMOVv4i32);
6119 }
6120 }
6121 }
6122returnDecodeVMOVModImmInstruction(Inst,Insn,Address, Decoder);
6123 }
6124
6125if (!(imm & 0x20))returnMCDisassembler::Fail;
6126
6127if (!Check(S,DecodeQPRRegisterClass(Inst, Vd,Address, Decoder)))
6128returnMCDisassembler::Fail;
6129if (!Check(S,DecodeQPRRegisterClass(Inst, Vm,Address, Decoder)))
6130returnMCDisassembler::Fail;
6131 Inst.addOperand(MCOperand::createImm(64 - imm));
6132
6133return S;
6134}
6135
6136staticDecodeStatus
6137DecodeNEONComplexLane64Instruction(MCInst &Inst,unsignedInsn,
6138uint64_t Address,
6139constMCDisassembler *Decoder) {
6140unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
6141 Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
6142unsigned Vn = (fieldFromInstruction(Insn, 16, 4) << 0);
6143 Vn |= (fieldFromInstruction(Insn, 7, 1) << 4);
6144unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
6145 Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
6146unsigned q = (fieldFromInstruction(Insn, 6, 1) << 0);
6147unsigned rotate = (fieldFromInstruction(Insn, 20, 2) << 0);
6148
6149DecodeStatus S =MCDisassembler::Success;
6150
6151auto DestRegDecoder = q ?DecodeQPRRegisterClass :DecodeDPRRegisterClass;
6152
6153if (!Check(S, DestRegDecoder(Inst, Vd,Address, Decoder)))
6154returnMCDisassembler::Fail;
6155if (!Check(S, DestRegDecoder(Inst, Vd,Address, Decoder)))
6156returnMCDisassembler::Fail;
6157if (!Check(S, DestRegDecoder(Inst, Vn,Address, Decoder)))
6158returnMCDisassembler::Fail;
6159if (!Check(S,DecodeDPRRegisterClass(Inst, Vm,Address, Decoder)))
6160returnMCDisassembler::Fail;
6161// The lane index does not have any bits in the encoding, because it can only
6162// be 0.
6163 Inst.addOperand(MCOperand::createImm(0));
6164 Inst.addOperand(MCOperand::createImm(rotate));
6165
6166return S;
6167}
6168
6169staticDecodeStatusDecodeLDR(MCInst &Inst,unsigned Val,uint64_t Address,
6170constMCDisassembler *Decoder) {
6171DecodeStatus S =MCDisassembler::Success;
6172
6173unsigned Rn = fieldFromInstruction(Val, 16, 4);
6174unsigned Rt = fieldFromInstruction(Val, 12, 4);
6175unsigned Rm = fieldFromInstruction(Val, 0, 4);
6176 Rm |= (fieldFromInstruction(Val, 23, 1) << 4);
6177unsignedCond = fieldFromInstruction(Val, 28, 4);
6178
6179if (fieldFromInstruction(Val, 8, 4) != 0 || Rn == Rt)
6180 S =MCDisassembler::SoftFail;
6181
6182if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt,Address, Decoder)))
6183returnMCDisassembler::Fail;
6184if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
6185returnMCDisassembler::Fail;
6186if (!Check(S,DecodeAddrMode7Operand(Inst, Rn,Address, Decoder)))
6187returnMCDisassembler::Fail;
6188if (!Check(S,DecodePostIdxReg(Inst, Rm,Address, Decoder)))
6189returnMCDisassembler::Fail;
6190if (!Check(S,DecodePredicateOperand(Inst,Cond,Address, Decoder)))
6191returnMCDisassembler::Fail;
6192
6193return S;
6194}
6195
6196staticDecodeStatusDecoderForMRRC2AndMCRR2(MCInst &Inst,unsigned Val,
6197uint64_t Address,
6198constMCDisassembler *Decoder) {
6199DecodeStatus S =MCDisassembler::Success;
6200
6201unsigned CRm = fieldFromInstruction(Val, 0, 4);
6202unsigned opc1 = fieldFromInstruction(Val, 4, 4);
6203unsigned cop = fieldFromInstruction(Val, 8, 4);
6204unsigned Rt = fieldFromInstruction(Val, 12, 4);
6205unsigned Rt2 = fieldFromInstruction(Val, 16, 4);
6206
6207if ((cop & ~0x1) == 0xa)
6208returnMCDisassembler::Fail;
6209
6210if (Rt == Rt2)
6211 S =MCDisassembler::SoftFail;
6212
6213// We have to check if the instruction is MRRC2
6214// or MCRR2 when constructing the operands for
6215// Inst. Reason is because MRRC2 stores to two
6216// registers so it's tablegen desc has two
6217// outputs whereas MCRR doesn't store to any
6218// registers so all of it's operands are listed
6219// as inputs, therefore the operand order for
6220// MRRC2 needs to be [Rt, Rt2, cop, opc1, CRm]
6221// and MCRR2 operand order is [cop, opc1, Rt, Rt2, CRm]
6222
6223if (Inst.getOpcode() == ARM::MRRC2) {
6224if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt,Address, Decoder)))
6225returnMCDisassembler::Fail;
6226if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt2,Address, Decoder)))
6227returnMCDisassembler::Fail;
6228 }
6229 Inst.addOperand(MCOperand::createImm(cop));
6230 Inst.addOperand(MCOperand::createImm(opc1));
6231if (Inst.getOpcode() == ARM::MCRR2) {
6232if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt,Address, Decoder)))
6233returnMCDisassembler::Fail;
6234if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rt2,Address, Decoder)))
6235returnMCDisassembler::Fail;
6236 }
6237 Inst.addOperand(MCOperand::createImm(CRm));
6238
6239return S;
6240}
6241
6242staticDecodeStatusDecodeForVMRSandVMSR(MCInst &Inst,unsigned Val,
6243uint64_t Address,
6244constMCDisassembler *Decoder) {
6245constFeatureBitset &featureBits =
6246 ((constMCDisassembler *)Decoder)->getSubtargetInfo().getFeatureBits();
6247DecodeStatus S =MCDisassembler::Success;
6248
6249// Add explicit operand for the destination sysreg, for cases where
6250// we have to model it for code generation purposes.
6251switch (Inst.getOpcode()) {
6252case ARM::VMSR_FPSCR_NZCVQC:
6253 Inst.addOperand(MCOperand::createReg(ARM::FPSCR_NZCV));
6254break;
6255case ARM::VMSR_P0:
6256 Inst.addOperand(MCOperand::createReg(ARM::VPR));
6257break;
6258 }
6259
6260if (Inst.getOpcode() != ARM::FMSTAT) {
6261unsigned Rt = fieldFromInstruction(Val, 12, 4);
6262
6263if (featureBits[ARM::ModeThumb] && !featureBits[ARM::HasV8Ops]) {
6264if (Rt == 13 || Rt == 15)
6265 S =MCDisassembler::SoftFail;
6266Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder));
6267 }else
6268Check(S,DecodeGPRnopcRegisterClass(Inst, Rt,Address, Decoder));
6269 }
6270
6271// Add explicit operand for the source sysreg, similarly to above.
6272switch (Inst.getOpcode()) {
6273case ARM::VMRS_FPSCR_NZCVQC:
6274 Inst.addOperand(MCOperand::createReg(ARM::FPSCR_NZCV));
6275break;
6276case ARM::VMRS_P0:
6277 Inst.addOperand(MCOperand::createReg(ARM::VPR));
6278break;
6279 }
6280
6281if (featureBits[ARM::ModeThumb]) {
6282 Inst.addOperand(MCOperand::createImm(ARMCC::AL));
6283 Inst.addOperand(MCOperand::createReg(0));
6284 }else {
6285unsignedpred = fieldFromInstruction(Val, 28, 4);
6286if (!Check(S,DecodePredicateOperand(Inst,pred,Address, Decoder)))
6287returnMCDisassembler::Fail;
6288 }
6289
6290return S;
6291}
6292
6293template <bool isSigned,bool isNeg,bool zeroPermitted,int size>
6294staticDecodeStatusDecodeBFLabelOperand(MCInst &Inst,unsigned Val,
6295uint64_t Address,
6296constMCDisassembler *Decoder) {
6297DecodeStatus S =MCDisassembler::Success;
6298if (Val == 0 && !zeroPermitted)
6299 S =MCDisassembler::Fail;
6300
6301uint64_t DecVal;
6302if (isSigned)
6303 DecVal = SignExtend32<size + 1>(Val << 1);
6304else
6305 DecVal = (Val << 1);
6306
6307if (!tryAddingSymbolicOperand(Address,Address + DecVal + 4,true, 4, Inst,
6308 Decoder))
6309 Inst.addOperand(MCOperand::createImm(isNeg ? -DecVal : DecVal));
6310return S;
6311}
6312
6313staticDecodeStatusDecodeBFAfterTargetOperand(MCInst &Inst,unsigned Val,
6314uint64_t Address,
6315constMCDisassembler *Decoder) {
6316
6317uint64_t LocImm = Inst.getOperand(0).getImm();
6318 Val = LocImm + (2 << Val);
6319if (!tryAddingSymbolicOperand(Address,Address + Val + 4,true, 4, Inst,
6320 Decoder))
6321 Inst.addOperand(MCOperand::createImm(Val));
6322returnMCDisassembler::Success;
6323}
6324
6325staticDecodeStatusDecodePredNoALOperand(MCInst &Inst,unsigned Val,
6326uint64_t Address,
6327constMCDisassembler *Decoder) {
6328if (Val >=ARMCC::AL)// also exclude the non-condition NV
6329returnMCDisassembler::Fail;
6330 Inst.addOperand(MCOperand::createImm(Val));
6331returnMCDisassembler::Success;
6332}
6333
6334staticDecodeStatusDecodeLOLoop(MCInst &Inst,unsignedInsn,uint64_t Address,
6335constMCDisassembler *Decoder) {
6336DecodeStatus S =MCDisassembler::Success;
6337
6338if (Inst.getOpcode() == ARM::MVE_LCTP)
6339return S;
6340
6341unsigned Imm = fieldFromInstruction(Insn, 11, 1) |
6342 fieldFromInstruction(Insn, 1, 10) << 1;
6343switch (Inst.getOpcode()) {
6344case ARM::t2LEUpdate:
6345case ARM::MVE_LETP:
6346 Inst.addOperand(MCOperand::createReg(ARM::LR));
6347 Inst.addOperand(MCOperand::createReg(ARM::LR));
6348 [[fallthrough]];
6349case ARM::t2LE:
6350if (!Check(S, DecodeBFLabelOperand<false, true, true, 11>(
6351 Inst, Imm,Address, Decoder)))
6352returnMCDisassembler::Fail;
6353break;
6354case ARM::t2WLS:
6355case ARM::MVE_WLSTP_8:
6356case ARM::MVE_WLSTP_16:
6357case ARM::MVE_WLSTP_32:
6358case ARM::MVE_WLSTP_64:
6359 Inst.addOperand(MCOperand::createReg(ARM::LR));
6360if (!Check(S,
6361DecoderGPRRegisterClass(Inst, fieldFromInstruction(Insn, 16, 4),
6362Address, Decoder)) ||
6363 !Check(S, DecodeBFLabelOperand<false, false, true, 11>(
6364 Inst, Imm,Address, Decoder)))
6365returnMCDisassembler::Fail;
6366break;
6367case ARM::t2DLS:
6368case ARM::MVE_DLSTP_8:
6369case ARM::MVE_DLSTP_16:
6370case ARM::MVE_DLSTP_32:
6371case ARM::MVE_DLSTP_64:
6372unsigned Rn = fieldFromInstruction(Insn, 16, 4);
6373if (Rn == 0xF) {
6374// Enforce all the rest of the instruction bits in LCTP, which
6375// won't have been reliably checked based on LCTP's own tablegen
6376// record, because we came to this decode by a roundabout route.
6377uint32_t CanonicalLCTP = 0xF00FE001, SBZMask = 0x00300FFE;
6378if ((Insn & ~SBZMask) != CanonicalLCTP)
6379returnMCDisassembler::Fail;// a mandatory bit is wrong: hard fail
6380if (Insn != CanonicalLCTP)
6381Check(S,MCDisassembler::SoftFail);// an SBZ bit is wrong: soft fail
6382
6383 Inst.setOpcode(ARM::MVE_LCTP);
6384 }else {
6385 Inst.addOperand(MCOperand::createReg(ARM::LR));
6386if (!Check(S,DecoderGPRRegisterClass(Inst,
6387 fieldFromInstruction(Insn, 16, 4),
6388Address, Decoder)))
6389returnMCDisassembler::Fail;
6390 }
6391break;
6392 }
6393return S;
6394}
6395
6396staticDecodeStatusDecodeLongShiftOperand(MCInst &Inst,unsigned Val,
6397uint64_t Address,
6398constMCDisassembler *Decoder) {
6399DecodeStatus S =MCDisassembler::Success;
6400
6401if (Val == 0)
6402 Val = 32;
6403
6404 Inst.addOperand(MCOperand::createImm(Val));
6405
6406return S;
6407}
6408
6409staticDecodeStatusDecodetGPROddRegisterClass(MCInst &Inst,unsigned RegNo,
6410uint64_t Address,
6411constMCDisassembler *Decoder) {
6412if ((RegNo) + 1 > 11)
6413returnMCDisassembler::Fail;
6414
6415unsignedRegister =GPRDecoderTable[(RegNo) + 1];
6416 Inst.addOperand(MCOperand::createReg(Register));
6417returnMCDisassembler::Success;
6418}
6419
6420staticDecodeStatusDecodetGPREvenRegisterClass(MCInst &Inst,unsigned RegNo,
6421uint64_t Address,
6422constMCDisassembler *Decoder) {
6423if ((RegNo) > 14)
6424returnMCDisassembler::Fail;
6425
6426unsignedRegister =GPRDecoderTable[(RegNo)];
6427 Inst.addOperand(MCOperand::createReg(Register));
6428returnMCDisassembler::Success;
6429}
6430
6431staticDecodeStatus
6432DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst &Inst,unsigned RegNo,
6433uint64_t Address,
6434constMCDisassembler *Decoder) {
6435if (RegNo == 15) {
6436 Inst.addOperand(MCOperand::createReg(ARM::APSR_NZCV));
6437returnMCDisassembler::Success;
6438 }
6439
6440unsignedRegister =GPRDecoderTable[RegNo];
6441 Inst.addOperand(MCOperand::createReg(Register));
6442
6443if (RegNo == 13)
6444returnMCDisassembler::SoftFail;
6445
6446returnMCDisassembler::Success;
6447}
6448
6449staticDecodeStatusDecodeVSCCLRM(MCInst &Inst,unsignedInsn,uint64_t Address,
6450constMCDisassembler *Decoder) {
6451DecodeStatus S =MCDisassembler::Success;
6452
6453 Inst.addOperand(MCOperand::createImm(ARMCC::AL));
6454 Inst.addOperand(MCOperand::createReg(0));
6455unsigned regs = fieldFromInstruction(Insn, 0, 8);
6456if (regs == 0) {
6457// Register list contains only VPR
6458 }elseif (Inst.getOpcode() == ARM::VSCCLRMD) {
6459unsigned reglist = regs | (fieldFromInstruction(Insn, 12, 4) << 8) |
6460 (fieldFromInstruction(Insn, 22, 1) << 12);
6461if (!Check(S,DecodeDPRRegListOperand(Inst, reglist,Address, Decoder))) {
6462returnMCDisassembler::Fail;
6463 }
6464 }else {
6465unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 1) |
6466 fieldFromInstruction(Insn, 22, 1);
6467// Registers past s31 are permitted and treated as being half of a d
6468// register, though both halves of each d register must be present.
6469unsigned max_reg = Vd + regs;
6470if (max_reg > 64 || (max_reg > 32 && (max_reg & 1)))
6471 S =MCDisassembler::SoftFail;
6472unsigned max_sreg = std::min(32u, max_reg);
6473unsigned max_dreg = std::min(32u, max_reg / 2);
6474for (unsigned i = Vd; i < max_sreg; ++i)
6475if (!Check(S,DecodeSPRRegisterClass(Inst, i,Address, Decoder)))
6476returnMCDisassembler::Fail;
6477for (unsigned i = 16; i < max_dreg; ++i)
6478if (!Check(S,DecodeDPRRegisterClass(Inst, i,Address, Decoder)))
6479returnMCDisassembler::Fail;
6480 }
6481 Inst.addOperand(MCOperand::createReg(ARM::VPR));
6482
6483return S;
6484}
6485
6486staticDecodeStatusDecodeMQPRRegisterClass(MCInst &Inst,unsigned RegNo,
6487uint64_t Address,
6488constMCDisassembler *Decoder) {
6489if (RegNo > 7)
6490returnMCDisassembler::Fail;
6491
6492unsignedRegister =QPRDecoderTable[RegNo];
6493 Inst.addOperand(MCOperand::createReg(Register));
6494returnMCDisassembler::Success;
6495}
6496
6497staticconstuint16_tQQPRDecoderTable[] = {
6498 ARM::Q0_Q1, ARM::Q1_Q2, ARM::Q2_Q3, ARM::Q3_Q4,
6499 ARM::Q4_Q5, ARM::Q5_Q6, ARM::Q6_Q7
6500};
6501
6502staticDecodeStatusDecodeMQQPRRegisterClass(MCInst &Inst,unsigned RegNo,
6503uint64_t Address,
6504constMCDisassembler *Decoder) {
6505if (RegNo > 6)
6506returnMCDisassembler::Fail;
6507
6508unsignedRegister =QQPRDecoderTable[RegNo];
6509 Inst.addOperand(MCOperand::createReg(Register));
6510returnMCDisassembler::Success;
6511}
6512
6513staticconstuint16_tQQQQPRDecoderTable[] = {
6514 ARM::Q0_Q1_Q2_Q3, ARM::Q1_Q2_Q3_Q4, ARM::Q2_Q3_Q4_Q5,
6515 ARM::Q3_Q4_Q5_Q6, ARM::Q4_Q5_Q6_Q7
6516};
6517
6518staticDecodeStatusDecodeMQQQQPRRegisterClass(MCInst &Inst,unsigned RegNo,
6519uint64_t Address,
6520constMCDisassembler *Decoder) {
6521if (RegNo > 4)
6522returnMCDisassembler::Fail;
6523
6524unsignedRegister =QQQQPRDecoderTable[RegNo];
6525 Inst.addOperand(MCOperand::createReg(Register));
6526returnMCDisassembler::Success;
6527}
6528
6529staticDecodeStatusDecodeVPTMaskOperand(MCInst &Inst,unsigned Val,
6530uint64_t Address,
6531constMCDisassembler *Decoder) {
6532DecodeStatus S =MCDisassembler::Success;
6533
6534// Parse VPT mask and encode it in the MCInst as an immediate with the same
6535// format as the it_mask. That is, from the second 'e|t' encode 'e' as 1 and
6536// 't' as 0 and finish with a 1.
6537unsigned Imm = 0;
6538// We always start with a 't'.
6539unsigned CurBit = 0;
6540for (int i = 3; i >= 0; --i) {
6541// If the bit we are looking at is not the same as last one, invert the
6542// CurBit, if it is the same leave it as is.
6543 CurBit ^= (Val >> i) & 1U;
6544
6545// Encode the CurBit at the right place in the immediate.
6546 Imm |= (CurBit << i);
6547
6548// If we are done, finish the encoding with a 1.
6549if ((Val & ~(~0U << i)) == 0) {
6550 Imm |= 1U << i;
6551break;
6552 }
6553 }
6554
6555 Inst.addOperand(MCOperand::createImm(Imm));
6556
6557return S;
6558}
6559
6560staticDecodeStatusDecodeVpredROperand(MCInst &Inst,unsigned RegNo,
6561uint64_t Address,
6562constMCDisassembler *Decoder) {
6563// The vpred_r operand type includes an MQPR register field derived
6564// from the encoding. But we don't actually want to add an operand
6565// to the MCInst at this stage, because AddThumbPredicate will do it
6566// later, and will infer the register number from the TIED_TO
6567// constraint. So this is a deliberately empty decoder method that
6568// will inhibit the auto-generated disassembly code from adding an
6569// operand at all.
6570returnMCDisassembler::Success;
6571}
6572
6573[[maybe_unused]]staticDecodeStatus
6574DecodeVpredNOperand(MCInst &Inst,unsigned RegNo,uint64_t Address,
6575constMCDisassembler *Decoder) {
6576// Similar to above, we want to ensure that no operands are added for the
6577// vpred operands. (This is marked "maybe_unused" for the moment; because
6578// DecoderEmitter currently (wrongly) omits operands with no instruction bits,
6579// the decoder doesn't actually call it yet. That will be addressed in a
6580// future change.)
6581returnMCDisassembler::Success;
6582}
6583
6584staticDecodeStatus
6585DecodeRestrictedIPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
6586constMCDisassembler *Decoder) {
6587 Inst.addOperand(MCOperand::createImm((Val & 0x1) == 0 ?ARMCC::EQ :ARMCC::NE));
6588returnMCDisassembler::Success;
6589}
6590
6591staticDecodeStatus
6592DecodeRestrictedSPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
6593constMCDisassembler *Decoder) {
6594unsigned Code;
6595switch (Val & 0x3) {
6596case 0:
6597 Code =ARMCC::GE;
6598break;
6599case 1:
6600 Code =ARMCC::LT;
6601break;
6602case 2:
6603 Code =ARMCC::GT;
6604break;
6605case 3:
6606 Code =ARMCC::LE;
6607break;
6608 }
6609 Inst.addOperand(MCOperand::createImm(Code));
6610returnMCDisassembler::Success;
6611}
6612
6613staticDecodeStatus
6614DecodeRestrictedUPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
6615constMCDisassembler *Decoder) {
6616 Inst.addOperand(MCOperand::createImm((Val & 0x1) == 0 ?ARMCC::HS :ARMCC::HI));
6617returnMCDisassembler::Success;
6618}
6619
6620staticDecodeStatus
6621DecodeRestrictedFPPredicateOperand(MCInst &Inst,unsigned Val,uint64_t Address,
6622constMCDisassembler *Decoder) {
6623unsigned Code;
6624switch (Val) {
6625default:
6626returnMCDisassembler::Fail;
6627case 0:
6628 Code =ARMCC::EQ;
6629break;
6630case 1:
6631 Code =ARMCC::NE;
6632break;
6633case 4:
6634 Code =ARMCC::GE;
6635break;
6636case 5:
6637 Code =ARMCC::LT;
6638break;
6639case 6:
6640 Code =ARMCC::GT;
6641break;
6642case 7:
6643 Code =ARMCC::LE;
6644break;
6645 }
6646
6647 Inst.addOperand(MCOperand::createImm(Code));
6648returnMCDisassembler::Success;
6649}
6650
6651staticDecodeStatusDecodeVCVTImmOperand(MCInst &Inst,unsigned Val,
6652uint64_t Address,
6653constMCDisassembler *Decoder) {
6654DecodeStatus S =MCDisassembler::Success;
6655
6656unsigned DecodedVal = 64 - Val;
6657
6658switch (Inst.getOpcode()) {
6659case ARM::MVE_VCVTf16s16_fix:
6660case ARM::MVE_VCVTs16f16_fix:
6661case ARM::MVE_VCVTf16u16_fix:
6662case ARM::MVE_VCVTu16f16_fix:
6663if (DecodedVal > 16)
6664returnMCDisassembler::Fail;
6665break;
6666case ARM::MVE_VCVTf32s32_fix:
6667case ARM::MVE_VCVTs32f32_fix:
6668case ARM::MVE_VCVTf32u32_fix:
6669case ARM::MVE_VCVTu32f32_fix:
6670if (DecodedVal > 32)
6671returnMCDisassembler::Fail;
6672break;
6673 }
6674
6675 Inst.addOperand(MCOperand::createImm(64 - Val));
6676
6677return S;
6678}
6679
6680staticunsignedFixedRegForVSTRVLDR_SYSREG(unsigned Opcode) {
6681switch (Opcode) {
6682case ARM::VSTR_P0_off:
6683case ARM::VSTR_P0_pre:
6684case ARM::VSTR_P0_post:
6685case ARM::VLDR_P0_off:
6686case ARM::VLDR_P0_pre:
6687case ARM::VLDR_P0_post:
6688return ARM::P0;
6689case ARM::VSTR_FPSCR_NZCVQC_off:
6690case ARM::VSTR_FPSCR_NZCVQC_pre:
6691case ARM::VSTR_FPSCR_NZCVQC_post:
6692case ARM::VLDR_FPSCR_NZCVQC_off:
6693case ARM::VLDR_FPSCR_NZCVQC_pre:
6694case ARM::VLDR_FPSCR_NZCVQC_post:
6695return ARM::FPSCR;
6696default:
6697return 0;
6698 }
6699}
6700
6701template <bool Writeback>
6702staticDecodeStatusDecodeVSTRVLDR_SYSREG(MCInst &Inst,unsigned Val,
6703uint64_t Address,
6704constMCDisassembler *Decoder) {
6705switch (Inst.getOpcode()) {
6706case ARM::VSTR_FPSCR_pre:
6707case ARM::VSTR_FPSCR_NZCVQC_pre:
6708case ARM::VLDR_FPSCR_pre:
6709case ARM::VLDR_FPSCR_NZCVQC_pre:
6710case ARM::VSTR_FPSCR_off:
6711case ARM::VSTR_FPSCR_NZCVQC_off:
6712case ARM::VLDR_FPSCR_off:
6713case ARM::VLDR_FPSCR_NZCVQC_off:
6714case ARM::VSTR_FPSCR_post:
6715case ARM::VSTR_FPSCR_NZCVQC_post:
6716case ARM::VLDR_FPSCR_post:
6717case ARM::VLDR_FPSCR_NZCVQC_post:
6718constFeatureBitset &featureBits =
6719 ((constMCDisassembler *)Decoder)->getSubtargetInfo().getFeatureBits();
6720
6721if (!featureBits[ARM::HasMVEIntegerOps] && !featureBits[ARM::FeatureVFP2])
6722returnMCDisassembler::Fail;
6723 }
6724
6725DecodeStatus S =MCDisassembler::Success;
6726if (unsigned Sysreg =FixedRegForVSTRVLDR_SYSREG(Inst.getOpcode()))
6727 Inst.addOperand(MCOperand::createReg(Sysreg));
6728unsigned Rn = fieldFromInstruction(Val, 16, 4);
6729unsigned addr = fieldFromInstruction(Val, 0, 7) |
6730 (fieldFromInstruction(Val, 23, 1) << 7) | (Rn << 8);
6731
6732if (Writeback) {
6733if (!Check(S,DecodeGPRnopcRegisterClass(Inst, Rn,Address, Decoder)))
6734returnMCDisassembler::Fail;
6735 }
6736if (!Check(S,DecodeT2AddrModeImm7s4(Inst, addr,Address, Decoder)))
6737returnMCDisassembler::Fail;
6738
6739 Inst.addOperand(MCOperand::createImm(ARMCC::AL));
6740 Inst.addOperand(MCOperand::createReg(0));
6741
6742return S;
6743}
6744
6745staticinlineDecodeStatus
6746DecodeMVE_MEM_pre(MCInst &Inst,unsigned Val,uint64_t Address,
6747constMCDisassembler *Decoder,unsigned Rn,
6748OperandDecoder RnDecoder,OperandDecoder AddrDecoder) {
6749DecodeStatus S =MCDisassembler::Success;
6750
6751unsigned Qd = fieldFromInstruction(Val, 13, 3);
6752unsigned addr = fieldFromInstruction(Val, 0, 7) |
6753 (fieldFromInstruction(Val, 23, 1) << 7) | (Rn << 8);
6754
6755if (!Check(S, RnDecoder(Inst, Rn,Address, Decoder)))
6756returnMCDisassembler::Fail;
6757if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
6758returnMCDisassembler::Fail;
6759if (!Check(S, AddrDecoder(Inst, addr,Address, Decoder)))
6760returnMCDisassembler::Fail;
6761
6762return S;
6763}
6764
6765template <int shift>
6766staticDecodeStatusDecodeMVE_MEM_1_pre(MCInst &Inst,unsigned Val,
6767uint64_t Address,
6768constMCDisassembler *Decoder) {
6769returnDecodeMVE_MEM_pre(Inst, Val,Address, Decoder,
6770 fieldFromInstruction(Val, 16, 3),
6771DecodetGPRRegisterClass,
6772 DecodeTAddrModeImm7<shift>);
6773}
6774
6775template <int shift>
6776staticDecodeStatusDecodeMVE_MEM_2_pre(MCInst &Inst,unsigned Val,
6777uint64_t Address,
6778constMCDisassembler *Decoder) {
6779returnDecodeMVE_MEM_pre(Inst, Val,Address, Decoder,
6780 fieldFromInstruction(Val, 16, 4),
6781DecoderGPRRegisterClass,
6782 DecodeT2AddrModeImm7<shift,1>);
6783}
6784
6785template <int shift>
6786staticDecodeStatusDecodeMVE_MEM_3_pre(MCInst &Inst,unsigned Val,
6787uint64_t Address,
6788constMCDisassembler *Decoder) {
6789returnDecodeMVE_MEM_pre(Inst, Val,Address, Decoder,
6790 fieldFromInstruction(Val, 17, 3),
6791DecodeMQPRRegisterClass,
6792 DecodeMveAddrModeQ<shift>);
6793}
6794
6795template <unsigned MinLog,unsigned MaxLog>
6796staticDecodeStatusDecodePowerTwoOperand(MCInst &Inst,unsigned Val,
6797uint64_t Address,
6798constMCDisassembler *Decoder) {
6799DecodeStatus S =MCDisassembler::Success;
6800
6801if (Val < MinLog || Val > MaxLog)
6802returnMCDisassembler::Fail;
6803
6804 Inst.addOperand(MCOperand::createImm(1LL << Val));
6805return S;
6806}
6807
6808template <unsigned start>
6809staticDecodeStatus
6810DecodeMVEPairVectorIndexOperand(MCInst &Inst,unsigned Val,uint64_t Address,
6811constMCDisassembler *Decoder) {
6812DecodeStatus S =MCDisassembler::Success;
6813
6814 Inst.addOperand(MCOperand::createImm(start + Val));
6815
6816return S;
6817}
6818
6819staticDecodeStatusDecodeMVEVMOVQtoDReg(MCInst &Inst,unsignedInsn,
6820uint64_t Address,
6821constMCDisassembler *Decoder) {
6822DecodeStatus S =MCDisassembler::Success;
6823unsigned Rt = fieldFromInstruction(Insn, 0, 4);
6824unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
6825unsigned Qd = ((fieldFromInstruction(Insn, 22, 1) << 3) |
6826 fieldFromInstruction(Insn, 13, 3));
6827unsigned index = fieldFromInstruction(Insn, 4, 1);
6828
6829if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
6830returnMCDisassembler::Fail;
6831if (!Check(S,DecodeGPRRegisterClass(Inst, Rt2,Address, Decoder)))
6832returnMCDisassembler::Fail;
6833if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
6834returnMCDisassembler::Fail;
6835if (!Check(S, DecodeMVEPairVectorIndexOperand<2>(Inst, index,Address, Decoder)))
6836returnMCDisassembler::Fail;
6837if (!Check(S, DecodeMVEPairVectorIndexOperand<0>(Inst, index,Address, Decoder)))
6838returnMCDisassembler::Fail;
6839
6840return S;
6841}
6842
6843staticDecodeStatusDecodeMVEVMOVDRegtoQ(MCInst &Inst,unsignedInsn,
6844uint64_t Address,
6845constMCDisassembler *Decoder) {
6846DecodeStatus S =MCDisassembler::Success;
6847unsigned Rt = fieldFromInstruction(Insn, 0, 4);
6848unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
6849unsigned Qd = ((fieldFromInstruction(Insn, 22, 1) << 3) |
6850 fieldFromInstruction(Insn, 13, 3));
6851unsigned index = fieldFromInstruction(Insn, 4, 1);
6852
6853if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
6854returnMCDisassembler::Fail;
6855if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
6856returnMCDisassembler::Fail;
6857if (!Check(S,DecodeGPRRegisterClass(Inst, Rt,Address, Decoder)))
6858returnMCDisassembler::Fail;
6859if (!Check(S,DecodeGPRRegisterClass(Inst, Rt2,Address, Decoder)))
6860returnMCDisassembler::Fail;
6861if (!Check(S, DecodeMVEPairVectorIndexOperand<2>(Inst, index,Address, Decoder)))
6862returnMCDisassembler::Fail;
6863if (!Check(S, DecodeMVEPairVectorIndexOperand<0>(Inst, index,Address, Decoder)))
6864returnMCDisassembler::Fail;
6865
6866return S;
6867}
6868
6869staticDecodeStatus
6870DecodeMVEOverlappingLongShift(MCInst &Inst,unsignedInsn,uint64_t Address,
6871constMCDisassembler *Decoder) {
6872DecodeStatus S =MCDisassembler::Success;
6873
6874unsigned RdaLo = fieldFromInstruction(Insn, 17, 3) << 1;
6875unsigned RdaHi = fieldFromInstruction(Insn, 9, 3) << 1;
6876unsigned Rm = fieldFromInstruction(Insn, 12, 4);
6877
6878if (RdaHi == 14) {
6879// This value of RdaHi (really indicating pc, because RdaHi has to
6880// be an odd-numbered register, so the low bit will be set by the
6881// decode function below) indicates that we must decode as SQRSHR
6882// or UQRSHL, which both have a single Rda register field with all
6883// four bits.
6884unsigned Rda = fieldFromInstruction(Insn, 16, 4);
6885
6886switch (Inst.getOpcode()) {
6887case ARM::MVE_ASRLr:
6888case ARM::MVE_SQRSHRL:
6889 Inst.setOpcode(ARM::MVE_SQRSHR);
6890break;
6891case ARM::MVE_LSLLr:
6892case ARM::MVE_UQRSHLL:
6893 Inst.setOpcode(ARM::MVE_UQRSHL);
6894break;
6895default:
6896llvm_unreachable("Unexpected starting opcode!");
6897 }
6898
6899// Rda as output parameter
6900if (!Check(S,DecoderGPRRegisterClass(Inst, Rda,Address, Decoder)))
6901returnMCDisassembler::Fail;
6902
6903// Rda again as input parameter
6904if (!Check(S,DecoderGPRRegisterClass(Inst, Rda,Address, Decoder)))
6905returnMCDisassembler::Fail;
6906
6907// Rm, the amount to shift by
6908if (!Check(S,DecoderGPRRegisterClass(Inst, Rm,Address, Decoder)))
6909returnMCDisassembler::Fail;
6910
6911if (fieldFromInstruction (Insn, 6, 3) != 4)
6912returnMCDisassembler::SoftFail;
6913
6914if (Rda == Rm)
6915returnMCDisassembler::SoftFail;
6916
6917return S;
6918 }
6919
6920// Otherwise, we decode as whichever opcode our caller has already
6921// put into Inst. Those all look the same:
6922
6923// RdaLo,RdaHi as output parameters
6924if (!Check(S,DecodetGPREvenRegisterClass(Inst, RdaLo,Address, Decoder)))
6925returnMCDisassembler::Fail;
6926if (!Check(S,DecodetGPROddRegisterClass(Inst, RdaHi,Address, Decoder)))
6927returnMCDisassembler::Fail;
6928
6929// RdaLo,RdaHi again as input parameters
6930if (!Check(S,DecodetGPREvenRegisterClass(Inst, RdaLo,Address, Decoder)))
6931returnMCDisassembler::Fail;
6932if (!Check(S,DecodetGPROddRegisterClass(Inst, RdaHi,Address, Decoder)))
6933returnMCDisassembler::Fail;
6934
6935// Rm, the amount to shift by
6936if (!Check(S,DecoderGPRRegisterClass(Inst, Rm,Address, Decoder)))
6937returnMCDisassembler::Fail;
6938
6939if (Inst.getOpcode() == ARM::MVE_SQRSHRL ||
6940 Inst.getOpcode() == ARM::MVE_UQRSHLL) {
6941unsigned Saturate = fieldFromInstruction(Insn, 7, 1);
6942// Saturate, the bit position for saturation
6943 Inst.addOperand(MCOperand::createImm(Saturate));
6944 }
6945
6946return S;
6947}
6948
6949staticDecodeStatusDecodeMVEVCVTt1fp(MCInst &Inst,unsignedInsn,
6950uint64_t Address,
6951constMCDisassembler *Decoder) {
6952DecodeStatus S =MCDisassembler::Success;
6953unsigned Qd = ((fieldFromInstruction(Insn, 22, 1) << 3) |
6954 fieldFromInstruction(Insn, 13, 3));
6955unsigned Qm = ((fieldFromInstruction(Insn, 5, 1) << 3) |
6956 fieldFromInstruction(Insn, 1, 3));
6957unsigned imm6 = fieldFromInstruction(Insn, 16, 6);
6958
6959if (!Check(S,DecodeMQPRRegisterClass(Inst, Qd,Address, Decoder)))
6960returnMCDisassembler::Fail;
6961if (!Check(S,DecodeMQPRRegisterClass(Inst, Qm,Address, Decoder)))
6962returnMCDisassembler::Fail;
6963if (!Check(S,DecodeVCVTImmOperand(Inst, imm6,Address, Decoder)))
6964returnMCDisassembler::Fail;
6965
6966return S;
6967}
6968
6969template <bool scalar, OperandDecoder predicate_decoder>
6970staticDecodeStatusDecodeMVEVCMP(MCInst &Inst,unsignedInsn,uint64_t Address,
6971constMCDisassembler *Decoder) {
6972DecodeStatus S =MCDisassembler::Success;
6973 Inst.addOperand(MCOperand::createReg(ARM::VPR));
6974unsigned Qn = fieldFromInstruction(Insn, 17, 3);
6975if (!Check(S,DecodeMQPRRegisterClass(Inst, Qn,Address, Decoder)))
6976returnMCDisassembler::Fail;
6977
6978unsigned fc;
6979
6980if (scalar) {
6981 fc = fieldFromInstruction(Insn, 12, 1) << 2 |
6982 fieldFromInstruction(Insn, 7, 1) |
6983 fieldFromInstruction(Insn, 5, 1) << 1;
6984unsigned Rm = fieldFromInstruction(Insn, 0, 4);
6985if (!Check(S,DecodeGPRwithZRRegisterClass(Inst, Rm,Address, Decoder)))
6986returnMCDisassembler::Fail;
6987 }else {
6988 fc = fieldFromInstruction(Insn, 12, 1) << 2 |
6989 fieldFromInstruction(Insn, 7, 1) |
6990 fieldFromInstruction(Insn, 0, 1) << 1;
6991unsigned Qm = fieldFromInstruction(Insn, 5, 1) << 4 |
6992 fieldFromInstruction(Insn, 1, 3);
6993if (!Check(S,DecodeMQPRRegisterClass(Inst, Qm,Address, Decoder)))
6994returnMCDisassembler::Fail;
6995 }
6996
6997if (!Check(S, predicate_decoder(Inst, fc,Address, Decoder)))
6998returnMCDisassembler::Fail;
6999
7000 Inst.addOperand(MCOperand::createImm(ARMVCC::None));
7001 Inst.addOperand(MCOperand::createReg(0));
7002 Inst.addOperand(MCOperand::createImm(0));
7003
7004return S;
7005}
7006
7007staticDecodeStatusDecodeMveVCTP(MCInst &Inst,unsignedInsn,uint64_t Address,
7008constMCDisassembler *Decoder) {
7009DecodeStatus S =MCDisassembler::Success;
7010 Inst.addOperand(MCOperand::createReg(ARM::VPR));
7011unsigned Rn = fieldFromInstruction(Insn, 16, 4);
7012if (!Check(S,DecoderGPRRegisterClass(Inst, Rn,Address, Decoder)))
7013returnMCDisassembler::Fail;
7014return S;
7015}
7016
7017staticDecodeStatusDecodeMVEVPNOT(MCInst &Inst,unsignedInsn,
7018uint64_t Address,
7019constMCDisassembler *Decoder) {
7020DecodeStatus S =MCDisassembler::Success;
7021 Inst.addOperand(MCOperand::createReg(ARM::VPR));
7022 Inst.addOperand(MCOperand::createReg(ARM::VPR));
7023return S;
7024}
7025
7026staticDecodeStatusDecodeT2AddSubSPImm(MCInst &Inst,unsignedInsn,
7027uint64_t Address,
7028constMCDisassembler *Decoder) {
7029constunsigned Rd = fieldFromInstruction(Insn, 8, 4);
7030constunsigned Rn = fieldFromInstruction(Insn, 16, 4);
7031constunsigned Imm12 = fieldFromInstruction(Insn, 26, 1) << 11 |
7032 fieldFromInstruction(Insn, 12, 3) << 8 |
7033 fieldFromInstruction(Insn, 0, 8);
7034constunsigned TypeT3 = fieldFromInstruction(Insn, 25, 1);
7035unsigned sign1 = fieldFromInstruction(Insn, 21, 1);
7036unsigned sign2 = fieldFromInstruction(Insn, 23, 1);
7037unsigned S = fieldFromInstruction(Insn, 20, 1);
7038if (sign1 != sign2)
7039returnMCDisassembler::Fail;
7040
7041// T3 does a zext of imm12, where T2 does a ThumbExpandImm (T2SOImm)
7042DecodeStatus DS =MCDisassembler::Success;
7043if ((!Check(DS,
7044DecodeGPRspRegisterClass(Inst, Rd,Address, Decoder))) ||// dst
7045 (!Check(DS,DecodeGPRspRegisterClass(Inst, Rn,Address, Decoder))))
7046returnMCDisassembler::Fail;
7047if (TypeT3) {
7048 Inst.setOpcode(sign1 ? ARM::t2SUBspImm12 : ARM::t2ADDspImm12);
7049 Inst.addOperand(MCOperand::createImm(Imm12));// zext imm12
7050 }else {
7051 Inst.setOpcode(sign1 ? ARM::t2SUBspImm : ARM::t2ADDspImm);
7052if (!Check(DS,DecodeT2SOImm(Inst, Imm12,Address, Decoder)))// imm12
7053returnMCDisassembler::Fail;
7054if (!Check(DS,DecodeCCOutOperand(Inst, S,Address, Decoder)))// cc_out
7055returnMCDisassembler::Fail;
7056 }
7057
7058return DS;
7059}
7060
7061staticDecodeStatusDecodeLazyLoadStoreMul(MCInst &Inst,unsignedInsn,
7062uint64_t Address,
7063constMCDisassembler *Decoder) {
7064DecodeStatus S =MCDisassembler::Success;
7065
7066constunsigned Rn = fieldFromInstruction(Insn, 16, 4);
7067// Adding Rn, holding memory location to save/load to/from, the only argument
7068// that is being encoded.
7069// '$Rn' in the assembly.
7070if (!Check(S,DecodeGPRRegisterClass(Inst, Rn,Address, Decoder)))
7071returnMCDisassembler::Fail;
7072// An optional predicate, '$p' in the assembly.
7073DecodePredicateOperand(Inst,ARMCC::AL,Address, Decoder);
7074// An immediate that represents a floating point registers list. '$regs' in
7075// the assembly.
7076 Inst.addOperand(MCOperand::createImm(0));// Arbitrary value, has no effect.
7077
7078return S;
7079}
SoftFail
#define SoftFail
Definition:AArch64Disassembler.cpp:222
Success
#define Success
Definition:AArch64Disassembler.cpp:220
Insn
SmallVector< AArch64_IMM::ImmInsnModel, 4 > Insn
Definition:AArch64MIPeepholeOpt.cpp:167
load
AMDGPU Mark last scratch load
Definition:AMDGPUMarkLastScratchLoad.cpp:142
ARMAddressingModes.h
isVectorPredicable
static bool isVectorPredicable(const MCInstrDesc &MCID)
Definition:ARMAsmParser.cpp:7644
ARMBaseInstrInfo.h
DecodeDPairSpacedRegisterClass
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1627
DecodeCCOutOperand
static DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1657
DecodeAddrMode2IdxInstruction
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2049
DecodeT2AddrModeImm0_1020s4
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4478
DecodeT2AddrModeImm12
static DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4666
GPRPairDecoderTable
static const uint16_t GPRPairDecoderTable[]
Definition:ARMDisassembler.cpp:1399
DecodeNEONComplexLane64Instruction
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6137
DecodeLDRPreReg
static DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5173
DecodeGPRPairnospRegisterClass
static DecodeStatus DecodeGPRPairnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1423
DecodeDoubleRegStore
static DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5121
DecodeT2SOImm
static DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4898
DecodeT2LoadT
static DecodeStatus DecodeT2LoadT(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4324
DecodeAddrMode6Operand
static DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2948
DecodeVSHLMaxInstruction
static DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3856
DecodeMVEVPNOT
static DecodeStatus DecodeMVEVPNOT(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:7017
DecodeGPRRegisterClass
static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1297
DecodeMVEVCMP
static DecodeStatus DecodeMVEVCMP(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6970
DecodeMVEVMOVDRegtoQ
static DecodeStatus DecodeMVEVMOVDRegtoQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6843
DecodeShiftRight16Imm
static DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3883
DecodeAddrMode5FP16Operand
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2864
DecodeSORegImmOperand
static DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1667
DecodeT2LoadLabel
static DecodeStatus DecodeT2LoadLabel(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4363
DecodeQPRRegisterClass
static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1583
DecodeSORegMemOperand
static DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2154
DPairSpacedDecoderTable
static const uint16_t DPairSpacedDecoderTable[]
Definition:ARMDisassembler.cpp:1615
DecodeShiftRight64Imm
static DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3897
DecodeThumbTableBranch
static DecodeStatus DecodeThumbTableBranch(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4837
DecodeVLD4LN
static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5648
DecodeDPRRegListOperand
static DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1814
DecoderForMRRC2AndMCRR2
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6196
DecodeBitfieldMaskOperand
static DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1841
DecodeThumbAddrModePC
static DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4024
DecodeMVEPairVectorIndexOperand
static DecodeStatus DecodeMVEPairVectorIndexOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6810
DecodeThumb2BCCInstruction
static DecodeStatus DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4855
DecodeGPRnopcRegisterClass
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1322
DecodeArmMOVTWInstruction
static DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2714
DecodeT2AddrModeImm8
static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4521
DecoderGPRRegisterClass
static DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1478
DecodeTAddrModeImm7
static DecodeStatus DecodeTAddrModeImm7(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4569
DecodeBranchImmInstruction
static DecodeStatus DecodeBranchImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2918
DecodeT2AddrModeImm7s4
static DecodeStatus DecodeT2AddrModeImm7s4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4462
tryAddingPcLoadReferenceComment
static void tryAddingPcLoadReferenceComment(uint64_t Address, int Value, const MCDisassembler *Decoder)
tryAddingPcLoadReferenceComment - trys to add a comment as to what is being referenced by a load inst...
Definition:ARMDisassembler.cpp:878
DecodeGPRwithAPSRRegisterClass
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1349
DecodeShiftRight32Imm
static DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3890
DecodeT2MOVTWInstruction
static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2689
DecodeTSBInstruction
static DecodeStatus DecodeTSBInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2198
DecodeMVE_MEM_1_pre
static DecodeStatus DecodeMVE_MEM_1_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6766
DecodeDoubleRegLoad
static DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5099
DecodeVMOVModImmInstruction
static DecodeStatus DecodeVMOVModImmInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3755
DecodeThumbAddrModeIS
static DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4009
DecodePowerTwoOperand
static DecodeStatus DecodePowerTwoOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6796
DecodeT2Imm7S4
static DecodeStatus DecodeT2Imm7S4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4431
DecodeQADDInstruction
static DecodeStatus DecodeQADDInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2433
DecodeThumbBROperand
static DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3966
DecodeRestrictedIPredicateOperand
static DecodeStatus DecodeRestrictedIPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6585
DecodeSTRPreReg
static DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5227
DecodeVLD1DupInstruction
static DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3569
DecodeSPRRegisterClass
static DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1504
DecodeSETPANInstruction
static DecodeStatus DecodeSETPANInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2793
DecodeThumbAddSPReg
static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4705
DecodeMQQQQPRRegisterClass
static DecodeStatus DecodeMQQQQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6518
DecodeVLD4DupInstruction
static DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3702
DecodeT2ShifterImmOperand
static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
DecodeVLD2LN
static DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5385
DecodeT2AddSubSPImm
static DecodeStatus DecodeT2AddSubSPImm(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:7026
createARMDisassembler
static MCDisassembler * createARMDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
Definition:ARMDisassembler.cpp:709
DecodeT2LoadImm12
static DecodeStatus DecodeT2LoadImm12(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4243
FixedRegForVSTRVLDR_SYSREG
static unsigned FixedRegForVSTRVLDR_SYSREG(unsigned Opcode)
Definition:ARMDisassembler.cpp:6680
DecodeVST1LN
static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5320
DecodeLDR
static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6169
DecodeVST3LN
static DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5585
DecodeRestrictedUPredicateOperand
static DecodeStatus DecodeRestrictedUPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6614
DecodetGPRRegisterClass
static DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1391
DecodeCLRMGPRRegisterClass
static DecodeStatus DecodeCLRMGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1308
DecodeAddrMode5Operand
static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2843
DecodeMQQPRRegisterClass
static DecodeStatus DecodeMQQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6502
DecodeVMOVRRS
static DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5827
DecodeGPRwithAPSR_NZCVnospRegisterClass
static DecodeStatus DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6432
DPairDecoderTable
static const uint16_t DPairDecoderTable[]
Definition:ARMDisassembler.cpp:1595
DecodeVLDST3Instruction
static DecodeStatus DecodeVLDST3Instruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3273
OperandDecoder
DecodeStatus OperandDecoder(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:686
QQQQPRDecoderTable
static const uint16_t QQQQPRDecoderTable[]
Definition:ARMDisassembler.cpp:6513
DecodeThumbBLTargetOperand
static DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4938
DecodeVLDST2Instruction
static DecodeStatus DecodeVLDST2Instruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3257
DecodeAddrMode3Instruction
static DecodeStatus DecodeAddrMode3Instruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2211
DecodeSMLAInstruction
static DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2742
DecodeSwap
static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5991
DecodeGPRwithZRRegisterClass
static DecodeStatus DecodeGPRwithZRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1364
DecodeVCVTD
static DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6018
DecodeCopMemInstruction
static DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1869
DecodeVLD3DupInstruction
static DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3666
DecodeMemBarrierOption
static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4962
DecodeVpredNOperand
static DecodeStatus DecodeVpredNOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6574
DecodeDPR_VFP2RegisterClass
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1568
DecodeT2CPSInstruction
static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2621
DecodeThumbBCCTargetOperand
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4929
DecodeMVE_MEM_3_pre
static DecodeStatus DecodeMVE_MEM_3_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6786
DecodeIT
static DecodeStatus DecodeIT(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5853
DecodeVSTInstruction
static DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3298
DecodeAddrMode7Operand
static DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2885
DecodeThumbAddrModeSP
static DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4035
DecodeT2STRDPreInstruction
static DecodeStatus DecodeT2STRDPreInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5919
DecodeVLD1LN
static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5253
PermitsD32
static bool PermitsD32(const MCInst &Inst, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1533
DecodeVSTRVLDR_SYSREG
static DecodeStatus DecodeVSTRVLDR_SYSREG(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6702
DecodeT2Imm8
static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4494
DecodeThumbAddSPImm
static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4693
CLRMGPRDecoderTable
static const uint16_t CLRMGPRDecoderTable[]
Definition:ARMDisassembler.cpp:1290
DecodePostIdxReg
static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4743
DecodeCoprocessor
static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4821
DecodeVLD3LN
static DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5515
DecodeT2LDRDPreInstruction
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5882
DecodeT2Imm8S4
static DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4417
DecodeThumbCPS
static DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4731
DecodeCPSInstruction
static DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2573
DecodeThumbAddSpecialReg
static DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3941
DecodeRestrictedSPredicateOperand
static DecodeStatus DecodeRestrictedSPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6592
DecodeVCVTQ
static DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6077
DecodeSPRRegListOperand
static DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1789
DecodeVLDST4Instruction
static DecodeStatus DecodeVLDST4Instruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3287
DecodeT2LdStPre
static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4604
DecodeGPRPairRegisterClass
static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1404
LLVMInitializeARMDisassembler
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARMDisassembler()
Definition:ARMDisassembler.cpp:1272
DecodeMQPRRegisterClass
static DecodeStatus DecodeMQPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6486
DecodeVLDInstruction
static DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2966
tryAddingSymbolicOperand
static bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value, bool isBranch, uint64_t InstSize, MCInst &MI, const MCDisassembler *Decoder)
tryAddingSymbolicOperand - trys to add a symbolic operand in place of the immediate Value in the MCIn...
Definition:ARMDisassembler.cpp:859
DecodeT2LoadImm8
static DecodeStatus DecodeT2LoadImm8(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4158
DecodeMVEModImmInstruction
static DecodeStatus DecodeMVEModImmInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3801
DecodeGPRwithZRnospRegisterClass
static DecodeStatus DecodeGPRwithZRnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1382
GPRDecoderTable
static const uint16_t GPRDecoderTable[]
Definition:ARMDisassembler.cpp:1283
DecodeVCVTImmOperand
static DecodeStatus DecodeVCVTImmOperand(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6651
DecodeMveAddrModeQ
static DecodeStatus DecodeMveAddrModeQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4773
DecodeT2LoadShift
static DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4074
DecodeT2Imm7
static DecodeStatus DecodeT2Imm7(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4507
DecodeDPRRegisterClass
static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1541
DecodeThumbCmpBROperand
static DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3984
DecodeMVE_MEM_2_pre
static DecodeStatus DecodeMVE_MEM_2_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6776
DecodeMVEVCVTt1fp
static DecodeStatus DecodeMVEVCVTt1fp(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6949
DecodeMSRMask
static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4982
DecodeMVEVMOVQtoDReg
static DecodeStatus DecodeMVEVMOVQtoDReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6819
QQPRDecoderTable
static const uint16_t QQPRDecoderTable[]
Definition:ARMDisassembler.cpp:6497
DecodeLongShiftOperand
static DecodeStatus DecodeLongShiftOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6396
DecodeMveAddrModeRQ
static DecodeStatus DecodeMveAddrModeRQ(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4757
DecodeBFAfterTargetOperand
static DecodeStatus DecodeBFAfterTargetOperand(MCInst &Inst, unsigned val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6313
DecodeGPRspRegisterClass
static DecodeStatus DecodeGPRspRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1436
DecodeMVE_MEM_pre
static DecodeStatus DecodeMVE_MEM_pre(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder, unsigned Rn, OperandDecoder RnDecoder, OperandDecoder AddrDecoder)
Definition:ARMDisassembler.cpp:6746
DecodeT2AddrModeImm8s4
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4446
DecodeVpredROperand
static DecodeStatus DecodeVpredROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6560
DecodeMveVCTP
static DecodeStatus DecodeMveVCTP(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:7007
checkDecodedInstruction
static DecodeStatus checkDecodedInstruction(MCInst &MI, uint64_t &Size, uint64_t Address, raw_ostream &CS, uint32_t Insn, DecodeStatus Result)
Definition:ARMDisassembler.cpp:716
DecodeVST4LN
static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5729
QPRDecoderTable
static const uint16_t QPRDecoderTable[]
Definition:ARMDisassembler.cpp:1576
DecodeSTRPreImm
static DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5201
DecodetcGPRRegisterClass
static DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1447
DecodePredNoALOperand
static DecodeStatus DecodePredNoALOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6325
DecodeVST2LN
static DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5452
DecodeVLDST1Instruction
static DecodeStatus DecodeVLDST1Instruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3243
DecodeVPTMaskOperand
static DecodeStatus DecodeVPTMaskOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6529
DecodeRegListOperand
static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1741
DecodeMVEOverlappingLongShift
static DecodeStatus DecodeMVEOverlappingLongShift(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6870
DecodeInstSyncBarrierOption
static DecodeStatus DecodeInstSyncBarrierOption(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4972
DecodePredicateOperand
static DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1637
DecodeT2AddrModeSOReg
static DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4044
DecodeShiftRight8Imm
static DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3876
DecodeT2AddrModeImm7
static DecodeStatus DecodeT2AddrModeImm7(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4586
DecodeVLD2DupInstruction
static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3617
DecodeTSTInstruction
static DecodeStatus DecodeTSTInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2771
DecodeAddrModeImm12Operand
static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2822
DecodeTBLInstruction
static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3904
DecodeLDRPreImm
static DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5147
DecodeT2HintSpaceInstruction
static DecodeStatus DecodeT2HintSpaceInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2665
DecodeBFLabelOperand
static DecodeStatus DecodeBFLabelOperand(MCInst &Inst, unsigned val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6294
SPRDecoderTable
static const uint16_t SPRDecoderTable[]
Definition:ARMDisassembler.cpp:1493
DecodeHPRRegisterClass
static DecodeStatus DecodeHPRRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1515
DecodeDPairRegisterClass
static DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1604
DecodeRestrictedFPPredicateOperand
static DecodeStatus DecodeRestrictedFPPredicateOperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6621
DecodeHINTInstruction
static DecodeStatus DecodeHINTInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2550
DecodeVSCCLRM
static DecodeStatus DecodeVSCCLRM(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6449
DecodeT2BROperand
static DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3975
DecodeBankedReg
static DecodeStatus DecodeBankedReg(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5083
DecodeMVEVADCInstruction
static DecodeStatus DecodeMVEVADCInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3830
DecodeRFEInstruction
static DecodeStatus DecodeRFEInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2403
DecodeMemMultipleWritebackInstruction
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst &Inst, unsigned Insn, uint64_t Adddress, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2458
DecodeT2BInstruction
static DecodeStatus DecodeT2BInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:2891
DecodeThumbBLXOffset
static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:4796
DecodeDPR_8RegisterClass
static DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1552
DecodetGPREvenRegisterClass
static DecodeStatus DecodetGPREvenRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6420
DecodeThumbAddrModeRR
static DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:3993
DecodetGPROddRegisterClass
static DecodeStatus DecodetGPROddRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6409
DPRDecoderTable
static const uint16_t DPRDecoderTable[]
Definition:ARMDisassembler.cpp:1521
DecodeT2Adr
static DecodeStatus DecodeT2Adr(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
DecodeGPRnospRegisterClass
static DecodeStatus DecodeGPRnospRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1335
DecodeSORegRegOperand
static DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1705
DecodeSPR_8RegisterClass
static DecodeStatus DecodeSPR_8RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:1560
DecodeVMOVSRR
static DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:5801
DecodeLazyLoadStoreMul
static DecodeStatus DecodeLazyLoadStoreMul(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:7061
DecodeForVMRSandVMSR
static DecodeStatus DecodeForVMRSandVMSR(MCInst &Inst, unsigned Val, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6242
DecodeLOLoop
static DecodeStatus DecodeLOLoop(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
Definition:ARMDisassembler.cpp:6334
ARMMCTargetDesc.h
ARMTargetInfo.h
Compiler.h
LLVM_EXTERNAL_VISIBILITY
#define LLVM_EXTERNAL_VISIBILITY
Definition:Compiler.h:128
isNeg
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
Definition:ComplexDeinterleavingPass.cpp:535
Size
uint64_t Size
Definition:ELFObjHandler.cpp:81
isSigned
static bool isSigned(unsigned int Opcode)
Definition:ExpandLargeDivRem.cpp:52
Check
#define Check(C,...)
Definition:GenericConvergenceVerifierImpl.h:34
op
#define op(i)
pred
hexagon gen pred
Definition:HexagonGenPredicate.cpp:134
mode
amode Optimize addressing mode
Definition:HexagonOptAddrMode.cpp:139
MI
IRTranslator LLVM IR MI
Definition:IRTranslator.cpp:112
MCContext.h
MCDecoderOps.h
MCDisassembler.h
MCInst.h
MCInstrDesc.h
MCInstrInfo.h
MCSubtargetInfo.h
ARMBaseInfo.h
I
#define I(x, y, z)
Definition:MD5.cpp:58
MathExtras.h
P
#define P(N)
isBranch
static bool isBranch(unsigned Opcode)
Definition:R600InstrInfo.cpp:633
Cond
const SmallVectorImpl< MachineOperand > & Cond
Definition:RISCVRedundantCopyElimination.cpp:75
CC
auto CC
Definition:RISCVRedundantCopyElimination.cpp:79
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Address
@ Address
Definition:SPIRVEmitNonSemanticDI.cpp:68
SubtargetFeature.h
TargetRegistry.h
ARMBaseInfo.h
T
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition:ArrayRef.h:41
llvm::ArrayRef::size
size_t size() const
size - Get the array size.
Definition:ArrayRef.h:168
llvm::ArrayRef::data
const T * data() const
Definition:ArrayRef.h:165
llvm::DWARFExpression::Operation
This class represents an Operation in the Expression.
Definition:DWARFExpression.h:32
llvm::FeatureBitset
Container class for subtarget features.
Definition:SubtargetFeature.h:41
llvm::MCContext
Context object for machine code objects.
Definition:MCContext.h:83
llvm::MCDisassembler
Superclass for all disassemblers.
Definition:MCDisassembler.h:84
llvm::MCDisassembler::tryAddingSymbolicOperand
bool tryAddingSymbolicOperand(MCInst &Inst, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) const
Definition:MCDisassembler.cpp:28
llvm::MCDisassembler::getSubtargetInfo
const MCSubtargetInfo & getSubtargetInfo() const
Definition:MCDisassembler.h:217
llvm::MCDisassembler::tryAddingPcLoadReferenceComment
void tryAddingPcLoadReferenceComment(int64_t Value, uint64_t Address) const
Definition:MCDisassembler.cpp:39
llvm::MCDisassembler::suggestBytesToSkip
virtual uint64_t suggestBytesToSkip(ArrayRef< uint8_t > Bytes, uint64_t Address) const
Suggest a distance to skip in a buffer of data to find the next place to look for the start of an ins...
Definition:MCDisassembler.cpp:23
llvm::MCDisassembler::DecodeStatus
DecodeStatus
Ternary decode status.
Definition:MCDisassembler.h:108
llvm::MCDisassembler::Fail
@ Fail
Definition:MCDisassembler.h:109
llvm::MCDisassembler::SoftFail
@ SoftFail
Definition:MCDisassembler.h:110
llvm::MCDisassembler::Success
@ Success
Definition:MCDisassembler.h:111
llvm::MCDisassembler::getInstruction
virtual DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CStream) const =0
Returns the disassembly of a single instruction.
llvm::MCInst
Instances of this class represent a single low-level machine instruction.
Definition:MCInst.h:185
llvm::MCInst::getNumOperands
unsigned getNumOperands() const
Definition:MCInst.h:209
llvm::MCInst::iterator
SmallVectorImpl< MCOperand >::iterator iterator
Definition:MCInst.h:213
llvm::MCInst::getOpcode
unsigned getOpcode() const
Definition:MCInst.h:199
llvm::MCInst::addOperand
void addOperand(const MCOperand Op)
Definition:MCInst.h:211
llvm::MCInst::end
iterator end()
Definition:MCInst.h:222
llvm::MCInst::setOpcode
void setOpcode(unsigned Op)
Definition:MCInst.h:198
llvm::MCInst::getOperand
const MCOperand & getOperand(unsigned i) const
Definition:MCInst.h:207
llvm::MCInstrDesc
Describe properties that are true of each instruction in the target description file.
Definition:MCInstrDesc.h:198
llvm::MCInstrDesc::operands
ArrayRef< MCOperandInfo > operands() const
Definition:MCInstrDesc.h:239
llvm::MCInstrDesc::NumOperands
unsigned short NumOperands
Definition:MCInstrDesc.h:206
llvm::MCInstrDesc::getOperandConstraint
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specified operand constraint if it is present.
Definition:MCInstrDesc.h:219
llvm::MCInstrDesc::isPredicable
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution.
Definition:MCInstrDesc.h:338
llvm::MCInstrInfo
Interface to description of machine instruction set.
Definition:MCInstrInfo.h:26
llvm::MCInstrInfo::get
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
Definition:MCInstrInfo.h:63
llvm::MCOperand
Instances of this class represent operands of the MCInst class.
Definition:MCInst.h:37
llvm::MCOperand::getImm
int64_t getImm() const
Definition:MCInst.h:81
llvm::MCOperand::createReg
static MCOperand createReg(MCRegister Reg)
Definition:MCInst.h:135
llvm::MCOperand::createImm
static MCOperand createImm(int64_t Val)
Definition:MCInst.h:142
llvm::MCOperand::getReg
MCRegister getReg() const
Returns the register number.
Definition:MCInst.h:70
llvm::MCRegister
Wrapper class representing physical registers. Should be passed by value.
Definition:MCRegister.h:33
llvm::MCSubtargetInfo
Generic base class for all target subtargets.
Definition:MCSubtargetInfo.h:76
llvm::MCSubtargetInfo::hasFeature
bool hasFeature(unsigned Feature) const
Definition:MCSubtargetInfo.h:121
llvm::MCSubtargetInfo::getFeatureBits
const FeatureBitset & getFeatureBits() const
Definition:MCSubtargetInfo.h:114
llvm::Register
Wrapper class representing virtual and physical registers.
Definition:Register.h:19
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition:SmallVector.h:1196
llvm::Target
Target - Wrapper for Target specific information.
Definition:TargetRegistry.h:144
llvm::Value
LLVM Value Representation.
Definition:Value.h:74
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition:raw_ostream.h:52
uint16_t
uint32_t
uint64_t
uint8_t
ErrorHandling.h
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition:ErrorHandling.h:143
llvm::ARMCC::HS
@ HS
Definition:ARMBaseInfo.h:33
llvm::ARMCC::EQ
@ EQ
Definition:ARMBaseInfo.h:31
llvm::ARMCC::LE
@ LE
Definition:ARMBaseInfo.h:44
llvm::ARMCC::LT
@ LT
Definition:ARMBaseInfo.h:42
llvm::ARMCC::HI
@ HI
Definition:ARMBaseInfo.h:39
llvm::ARMCC::GE
@ GE
Definition:ARMBaseInfo.h:41
llvm::ARMCC::AL
@ AL
Definition:ARMBaseInfo.h:45
llvm::ARMCC::GT
@ GT
Definition:ARMBaseInfo.h:43
llvm::ARMCC::NE
@ NE
Definition:ARMBaseInfo.h:32
llvm::ARMII::IndexModePost
@ IndexModePost
Definition:ARMBaseInfo.h:180
llvm::ARMII::IndexModePre
@ IndexModePre
Definition:ARMBaseInfo.h:179
llvm::ARMVCC::Else
@ Else
Definition:ARMBaseInfo.h:92
llvm::ARMVCC::Then
@ Then
Definition:ARMBaseInfo.h:91
llvm::ARMVCC::None
@ None
Definition:ARMBaseInfo.h:90
llvm::ARM_AM::da
@ da
Definition:ARMAddressingModes.h:70
llvm::ARM_AM::ib
@ ib
Definition:ARMAddressingModes.h:69
llvm::ARM_AM::db
@ db
Definition:ARMAddressingModes.h:71
llvm::ARM_AM::ia
@ ia
Definition:ARMAddressingModes.h:68
llvm::ARM_AM::getAM2Opc
unsigned getAM2Opc(AddrOpc Opc, unsigned Imm12, ShiftOpc SO, unsigned IdxMode=0)
Definition:ARMAddressingModes.h:400
llvm::ARM_AM::getAM5Opc
unsigned getAM5Opc(AddrOpc Opc, unsigned char Offset)
getAM5Opc - This function encodes the addrmode5 opc field.
Definition:ARMAddressingModes.h:476
llvm::ARM_AM::AddrOpc
AddrOpc
Definition:ARMAddressingModes.h:37
llvm::ARM_AM::sub
@ sub
Definition:ARMAddressingModes.h:38
llvm::ARM_AM::add
@ add
Definition:ARMAddressingModes.h:39
llvm::ARM_AM::getAM5FP16Opc
unsigned getAM5FP16Opc(AddrOpc Opc, unsigned char Offset)
getAM5FP16Opc - This function encodes the addrmode5fp16 opc field.
Definition:ARMAddressingModes.h:497
llvm::ARM_AM::ShiftOpc
ShiftOpc
Definition:ARMAddressingModes.h:27
llvm::ARM_AM::lsr
@ lsr
Definition:ARMAddressingModes.h:31
llvm::ARM_AM::asr
@ asr
Definition:ARMAddressingModes.h:29
llvm::ARM_AM::lsl
@ lsl
Definition:ARMAddressingModes.h:30
llvm::ARM_AM::rrx
@ rrx
Definition:ARMAddressingModes.h:33
llvm::ARM_AM::ror
@ ror
Definition:ARMAddressingModes.h:32
llvm::ARM_TSB::CSYNC
@ CSYNC
Definition:ARMBaseInfo.h:102
llvm::ARM::OPERAND_VPRED_R
@ OPERAND_VPRED_R
Definition:ARMMCTargetDesc.h:114
llvm::ARM::isVpred
bool isVpred(OperandType op)
Definition:ARMMCTargetDesc.h:117
llvm::ARM::isCDECoproc
bool isCDECoproc(size_t Coproc, const MCSubtargetInfo &STI)
Definition:ARMMCTargetDesc.cpp:628
llvm::ARM::FPURestriction::D16
@ D16
Only 16 D registers.
llvm::BitmaskEnumDetail::Mask
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
Definition:BitmaskEnum.h:125
llvm::MCOI::TIED_TO
@ TIED_TO
Definition:MCInstrDesc.h:36
llvm::ms_demangle::QualifierMangleMode::Result
@ Result
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::size
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition:STLExtras.h:1697
llvm::getTheThumbBETarget
Target & getTheThumbBETarget()
Definition:ARMTargetInfo.cpp:25
llvm::isVPTOpcode
static bool isVPTOpcode(int Opc)
Definition:ARMBaseInstrInfo.h:582
llvm::isPowerOf2_32
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition:MathExtras.h:292
llvm::isValidCoprocessorNumber
static bool isValidCoprocessorNumber(unsigned Num, const FeatureBitset &featureBits)
isValidCoprocessorNumber - decide whether an explicit coprocessor number is legal in generic instruct...
Definition:ARMBaseInstrInfo.h:752
llvm::endianness
endianness
Definition:bit.h:70
llvm::endianness::little
@ little
llvm::endianness::big
@ big
llvm::getTheARMLETarget
Target & getTheARMLETarget()
Definition:ARMTargetInfo.cpp:13
llvm::getTheARMBETarget
Target & getTheARMBETarget()
Definition:ARMTargetInfo.cpp:17
llvm::getTheThumbLETarget
Target & getTheThumbLETarget()
Definition:ARMTargetInfo.cpp:21
raw_ostream.h
Status
Definition:SIModeRegister.cpp:29
llvm::TargetRegistry::RegisterMCDisassembler
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.
Definition:TargetRegistry.h:878

Generated on Sun Jul 20 2025 11:40:19 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp