131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA --------------===//
2b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen//
3b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen//                     The LLVM Compiler Infrastructure
4b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen//
5b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen// This file is distributed under the University of Illinois Open Source
6b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen// License. See LICENSE.TXT for details.
7b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen//
8b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen//===----------------------------------------------------------------------===//
9b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCDisassembler/MCDisassembler.h"
118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson#include "MCTargetDesc/ARMAddressingModes.h"
128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson#include "MCTargetDesc/ARMBaseInfo.h"
13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MCTargetDesc/ARMMCExpr.h"
148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson#include "llvm/MC/MCContext.h"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCExpr.h"
16fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach#include "llvm/MC/MCFixedLenDisassembler.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCInst.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCInstrDesc.h"
1975e3b7fb8fdf069b6f9f1e1db9634ca5701cbe96Dylan Noblesmith#include "llvm/MC/MCSubtargetInfo.h"
20b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen#include "llvm/Support/Debug.h"
21b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen#include "llvm/Support/ErrorHandling.h"
22fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach#include "llvm/Support/LEB128.h"
233e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
24b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen#include "llvm/Support/raw_ostream.h"
25f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton#include <vector>
26b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
27c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloyusing namespace llvm;
28c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "arm-disassembler"
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
31a6804444e874b27aee5921d4c6049df573c5e249Owen Andersontypedef MCDisassembler::DecodeStatus DecodeStatus;
32a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson
33a1c110045a284190955f28b8f308ffb365cc2edaOwen Andersonnamespace {
34f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  // Handles the condition code status of instructions in IT blocks
35f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  class ITStatus
36f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  {
37f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    public:
38f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      // Returns the condition code for instruction in IT block
39f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      unsigned getITCC() {
40f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        unsigned CC = ARMCC::AL;
41f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        if (instrInITBlock())
42f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton          CC = ITStates.back();
43f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        return CC;
44f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      }
45f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton
46f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      // Advances the IT block state to the next T or E
47f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      void advanceITState() {
48f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        ITStates.pop_back();
49f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      }
50f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton
51f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      // Returns true if the current instruction is in an IT block
52f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      bool instrInITBlock() {
53f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        return !ITStates.empty();
54f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      }
55f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton
56f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      // Returns true if current instruction is the last instruction in an IT block
57f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      bool instrLastInITBlock() {
58f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        return ITStates.size() == 1;
59f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      }
60f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton
61f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      // Called when decoding an IT instruction. Sets the IT state for the following
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      // instructions that for the IT block. Firstcond and Mask correspond to the
63f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      // fields in the IT instruction encoding.
64f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      void setITState(char Firstcond, char Mask) {
65f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        // (3 - the number of trailing zeros) is the number of then / else.
664d2f077df1b46a126b5595d983f233ec896b757eRichard Barton        unsigned CondBit0 = Firstcond & 1;
67c6af2432c802d241c8fffbe0371c023e6c58844eMichael J. Spencer        unsigned NumTZ = countTrailingZeros<uint8_t>(Mask);
68f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        unsigned char CCBits = static_cast<unsigned char>(Firstcond & 0xf);
69f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        assert(NumTZ <= 3 && "Invalid IT mask!");
70f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        // push condition codes onto the stack the correct order for the pops
71f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        for (unsigned Pos = NumTZ+1; Pos <= 3; ++Pos) {
72f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton          bool T = ((Mask >> Pos) & 1) == CondBit0;
73f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton          if (T)
74f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton            ITStates.push_back(CCBits);
75f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton          else
76f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton            ITStates.push_back(CCBits ^ 1);
77f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        }
78f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton        ITStates.push_back(CCBits);
79f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      }
80f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton
81f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    private:
82f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      std::vector<unsigned char> ITStates;
83f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  };
84f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton}
85f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton
86f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Bartonnamespace {
8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// ARM disassembler for all ARM platforms.
88a1c110045a284190955f28b8f308ffb365cc2edaOwen Andersonclass ARMDisassembler : public MCDisassembler {
89a1c110045a284190955f28b8f308ffb365cc2edaOwen Andersonpublic:
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ARMDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) :
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDisassembler(STI, Ctx) {
92a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson  }
93a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~ARMDisassembler() override {}
95a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
9637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              ArrayRef<uint8_t> Bytes, uint64_t Address,
9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              raw_ostream &VStream,
9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              raw_ostream &CStream) const override;
100a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson};
101a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
10237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// Thumb disassembler for all Thumb platforms.
103a1c110045a284190955f28b8f308ffb365cc2edaOwen Andersonclass ThumbDisassembler : public MCDisassembler {
104a1c110045a284190955f28b8f308ffb365cc2edaOwen Andersonpublic:
105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ThumbDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) :
106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDisassembler(STI, Ctx) {
107a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson  }
108a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
1090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~ThumbDisassembler() override {}
110a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              ArrayRef<uint8_t> Bytes, uint64_t Address,
11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              raw_ostream &VStream,
11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              raw_ostream &CStream) const override;
115a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
116a1c110045a284190955f28b8f308ffb365cc2edaOwen Andersonprivate:
117f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  mutable ITStatus ITBlock;
118d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen Anderson  DecodeStatus AddThumbPredicate(MCInst&) const;
119a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson  void UpdateThumbVFPPredicate(MCInst&) const;
120a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson};
121a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson}
122a1c110045a284190955f28b8f308ffb365cc2edaOwen Anderson
123a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic bool Check(DecodeStatus &Out, DecodeStatus In) {
124c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  switch (In) {
125c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    case MCDisassembler::Success:
126c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      // Out stays the same.
127c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return true;
128c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    case MCDisassembler::SoftFail:
129c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      Out = In;
130c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return true;
131c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    case MCDisassembler::Fail:
132c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      Out = In;
133c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return false;
134c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  }
1354d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid DecodeStatus!");
136c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy}
13783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
138a5d585685493d85d5cb72b831a68ec747ae55a86James Molloy
1398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// Forward declare these because the autogenerated code will reference them.
1408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// Definitions are further down.
141c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo,
1428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
143c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst,
144c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                               unsigned RegNo, uint64_t Address,
145c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                               const void *Decoder);
146f86e436fb95670ed110818fefa403f21ae104639Mihai Popastatic DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst &Inst,
147f86e436fb95670ed110818fefa403f21ae104639Mihai Popa                                               unsigned RegNo, uint64_t Address,
148f86e436fb95670ed110818fefa403f21ae104639Mihai Popa                                               const void *Decoder);
149c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo,
1508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
151c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo,
1528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
153c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo,
1548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
1553862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuvillestatic DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo,
1563862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville                                   uint64_t Address, const void *Decoder);
157c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo,
1588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
159c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
1608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
161c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo,
1628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
163c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst &Inst,
164c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                                unsigned RegNo,
165c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                                uint64_t Address,
166c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                                const void *Decoder);
167c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
1688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder);
169c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo,
17028f08c93e75d291695ea89b9004145103292e85bJim Grosbach                                   uint64_t Address, const void *Decoder);
171c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst,
172c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach                               unsigned RegNo, uint64_t Address,
173c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach                               const void *Decoder);
1748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
175c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val,
1768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
177c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val,
1788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
179c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val,
1808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
181c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val,
1828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
183c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val,
1848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
1858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
186c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Insn,
1878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
188c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn,
1898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
190c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode2IdxInstruction(MCInst &Inst,
191c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                                  unsigned Insn,
192c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                                  uint64_t Address,
193c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                                  const void *Decoder);
194c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Insn,
1958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
196c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode3Instruction(MCInst &Inst,unsigned Insn,
1978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
198c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Insn,
1998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
200c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Insn,
2018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
2028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
203c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst & Inst,
2048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                                  unsigned Insn,
2058d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                                  uint64_t Adddress,
2068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                                  const void *Decoder);
207c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
2089e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                               uint64_t Address, const void *Decoder);
209c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn,
2109e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                               uint64_t Address, const void *Decoder);
211c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn,
2128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DecodeStatus DecodeHINTInstruction(MCInst &Inst, unsigned Insn,
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                               uint64_t Address, const void *Decoder);
215c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn,
21635008c2f8dcfe55960fe4efea3a26e526d437ad6Owen Anderson                               uint64_t Address, const void *Decoder);
2170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic DecodeStatus DecodeTSTInstruction(MCInst &Inst, unsigned Insn,
2180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               uint64_t Address, const void *Decoder);
2190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic DecodeStatus DecodeSETPANInstruction(MCInst &Inst, unsigned Insn,
2200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                               uint64_t Address, const void *Decoder);
221c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
2226153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson                               uint64_t Address, const void *Decoder);
223c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
2248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
225c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
2268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DecodeStatus DecodeAddrMode5FP16Operand(MCInst &Inst, unsigned Val,
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                               uint64_t Address, const void *Decoder);
229c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val,
2308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
2312a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderbystatic DecodeStatus DecodeT2BInstruction(MCInst &Inst, unsigned Insn,
2322a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                               uint64_t Address, const void *Decoder);
233c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeBranchImmInstruction(MCInst &Inst,unsigned Insn,
2348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
235c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val,
2368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
237aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST1Instruction(MCInst &Inst, unsigned Val,
2388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
239aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST2Instruction(MCInst &Inst, unsigned Val,
24030a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa                               uint64_t Address, const void *Decoder);
241aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST3Instruction(MCInst &Inst, unsigned Val,
24230a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa                               uint64_t Address, const void *Decoder);
243aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST4Instruction(MCInst &Inst, unsigned Val,
24430a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa                               uint64_t Address, const void *Decoder);
245aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Val,
24630a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa                               uint64_t Address, const void *Decoder);
247c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Val,
2488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
249c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Val,
2508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
251c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Val,
2528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
253c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Val,
2548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
255c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Val,
2568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
257c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeNEONModImmInstruction(MCInst &Inst,unsigned Val,
2588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
259c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Val,
2608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
261c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val,
2628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
263c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val,
2648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
265c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val,
2668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
267c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val,
2688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
269c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
2708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
271c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
2728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
273c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Insn,
2748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
275c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Insn,
276c36481c4744cdbddec91dc3eca9245acaf2982daOwen Anderson                               uint64_t Address, const void *Decoder);
2774e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuvillestatic DecodeStatus DecodeInstSyncBarrierOption(MCInst &Inst, unsigned Insn,
2784e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville                               uint64_t Address, const void *Decoder);
279c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Insn,
28026d2f0ac919f6ae868fe901fd4ad64af6f92da4dOwen Anderson                               uint64_t Address, const void *Decoder);
28137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic DecodeStatus DecodeBankedReg(MCInst &Inst, unsigned Insn,
28237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                               uint64_t Address, const void *Decoder);
283c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn,
2843f3570a38be37ca18c545bd1b4c89604ecaf7e31Owen Anderson                               uint64_t Address, const void *Decoder);
285c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn,
286cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson                               uint64_t Address, const void *Decoder);
287c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn,
2889ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson                               uint64_t Address, const void *Decoder);
289c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn,
2909ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson                               uint64_t Address, const void *Decoder);
291c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn,
2927cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson                               uint64_t Address, const void *Decoder);
293c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn,
2947cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson                               uint64_t Address, const void *Decoder);
295c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
2967a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
297c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn,
2987a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
299c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn,
3007a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
301c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
3027a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
303c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
3047a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
305c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn,
3067a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
307c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn,
3087a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
309c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
3107a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                               uint64_t Address, const void *Decoder);
311c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn,
312357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson                               uint64_t Address, const void *Decoder);
313c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn,
314357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson                               uint64_t Address, const void *Decoder);
315c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn,
316cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson                               uint64_t Address, const void *Decoder);
317c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn,
318b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson                                uint64_t Address, const void *Decoder);
319c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn,
320b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson                                uint64_t Address, const void *Decoder);
321b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
3228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
323c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn,
3248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
325c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val,
3268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
327c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val,
3288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
329c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val,
3308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
331c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val,
3328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
333c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val,
3348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
335c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val,
3368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
337c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val,
3388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
339c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val,
3408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
341c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Val,
3428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
343ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadImm8(MCInst &Inst, unsigned Insn,
344ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                               uint64_t Address, const void* Decoder);
345ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadImm12(MCInst &Inst, unsigned Insn,
346ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                               uint64_t Address, const void* Decoder);
347ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadT(MCInst &Inst, unsigned Insn,
348ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                               uint64_t Address, const void* Decoder);
349ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadLabel(MCInst &Inst, unsigned Insn,
350ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                               uint64_t Address, const void* Decoder);
351c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val,
3528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
353c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val,
3548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
355c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
356b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach                               uint64_t Address, const void *Decoder);
357c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
3588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
359c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
3608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
361c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Val,
3628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder);
363c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
3648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
365c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn,
3668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
36746e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuvillestatic DecodeStatus DecodeQADDInstruction(MCInst &Inst, unsigned Insn,
36846e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville                                uint64_t Address, const void *Decoder);
369c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Insn,
3708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
371c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val,
3728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
373c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbTableBranch(MCInst &Inst, unsigned Val,
3747f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach                                uint64_t Address, const void *Decoder);
375c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Val,
3768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
377c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val,
3788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
379c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBCCTargetOperand(MCInst &Inst,unsigned Val,
3808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
381c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val,
3828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                uint64_t Address, const void *Decoder);
383c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeIT(MCInst &Inst, unsigned Val,
384f44082091c5517a3275c57a8b58e36987c8227f0Owen Anderson                                uint64_t Address, const void *Decoder);
385c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2LDRDPreInstruction(MCInst &Inst,unsigned Insn,
386a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach                               uint64_t Address, const void *Decoder);
387c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2STRDPreInstruction(MCInst &Inst,unsigned Insn,
388a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach                               uint64_t Address, const void *Decoder);
389c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2Adr(MCInst &Inst, unsigned Val,
39008fef885eb39339a47e3be7f0842b1db33683003Owen Anderson                                uint64_t Address, const void *Decoder);
391c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Val,
392a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson                                uint64_t Address, const void *Decoder);
393c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, unsigned Val,
3940afa0094afdfe589f407feb76948f273b414b278Owen Anderson                                uint64_t Address, const void *Decoder);
3950afa0094afdfe589f407feb76948f273b414b278Owen Anderson
396c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val,
397b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga                                uint64_t Address, const void *Decoder);
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DecodeStatus DecoderForMRRC2AndMCRR2(llvm::MCInst &Inst, unsigned Val,
399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            uint64_t Address, const void *Decoder);
4008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson#include "ARMGenDisassemblerTables.inc"
4019899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan
402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic MCDisassembler *createARMDisassembler(const Target &T,
403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                             const MCSubtargetInfo &STI,
404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                             MCContext &Ctx) {
405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return new ARMDisassembler(STI, Ctx);
4068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
4078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
408dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic MCDisassembler *createThumbDisassembler(const Target &T,
409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                               const MCSubtargetInfo &STI,
410dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                               MCContext &Ctx) {
411dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return new ThumbDisassembler(STI, Ctx);
4128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
4138d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
414ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// Post-decoding checks
415ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic DecodeStatus checkDecodedInstruction(MCInst &MI, uint64_t &Size,
416ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                            uint64_t Address, raw_ostream &OS,
417ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                            raw_ostream &CS,
418ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                            uint32_t Insn,
419ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                            DecodeStatus Result)
420ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines{
421ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (MI.getOpcode()) {
422ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case ARM::HVC: {
423ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // HVC is undefined if condition = 0xf otherwise upredictable
424ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // if condition != 0xe
425ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      uint32_t Cond = (Insn >> 28) & 0xF;
426ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (Cond == 0xF)
427ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        return MCDisassembler::Fail;
428ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (Cond != 0xE)
429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        return MCDisassembler::SoftFail;
430ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return Result;
431ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
432ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    default: return Result;
433ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
434ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
435ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
436a6804444e874b27aee5921d4c6049df573c5e249Owen AndersonDecodeStatus ARMDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
43737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                             ArrayRef<uint8_t> Bytes,
43837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                             uint64_t Address, raw_ostream &OS,
43937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                             raw_ostream &CS) const {
44037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  CommentStream = &CS;
4418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(!STI.getFeatureBits()[ARM::ModeThumb] &&
44337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines         "Asked to disassemble an ARM instruction but Subtarget is in Thumb "
44437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines         "mode!");
445a5d585685493d85d5cb72b831a68ec747ae55a86James Molloy
4468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // We want to read exactly 4 bytes of data.
44737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Bytes.size() < 4) {
44886ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer    Size = 0;
449c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
45086ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer  }
4518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Encoded as a small-endian 32-bit word in the stream.
45337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t Insn =
45437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      (Bytes[3] << 24) | (Bytes[2] << 16) | (Bytes[1] << 8) | (Bytes[0] << 0);
4558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Calling the auto-generated decoder function.
45737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DecodeStatus Result =
45837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableARM32, MI, Insn, Address, this, STI);
45937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
4608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 4;
461ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return checkDecodedInstruction(MI, Size, Address, OS, CS, Insn, Result);
462b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen  }
463b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
4648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // VFP and NEON instructions, similarly, are shared between ARM
4658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // and Thumb modes.
46637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result = decodeInstruction(DecoderTableVFP32, MI, Insn, Address, this, STI);
46737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
4688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 4;
46937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
4708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
4718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
47237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result = decodeInstruction(DecoderTableVFPV832, MI, Insn, Address, this, STI);
47337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
4744ea250524f77a67102118747dad6ee69f9f3b3aaJoey Gouly    Size = 4;
47537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
4764ea250524f77a67102118747dad6ee69f9f3b3aaJoey Gouly  }
4774ea250524f77a67102118747dad6ee69f9f3b3aaJoey Gouly
47837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
47937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableNEONData32, MI, Insn, Address, this, STI);
48037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
4818533ebad6f6e407215497ca50771f323058f5576Owen Anderson    Size = 4;
4828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // Add a fake predicate operand, because we share these instruction
4838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // definitions with Thumb2 where these instructions are predicable.
484a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!DecodePredicateOperand(MI, 0xE, Address, this))
485a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
48637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
4878533ebad6f6e407215497ca50771f323058f5576Owen Anderson  }
4888533ebad6f6e407215497ca50771f323058f5576Owen Anderson
48937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result = decodeInstruction(DecoderTableNEONLoadStore32, MI, Insn, Address,
490fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach                             this, STI);
49137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
4928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 4;
4938533ebad6f6e407215497ca50771f323058f5576Owen Anderson    // Add a fake predicate operand, because we share these instruction
4948533ebad6f6e407215497ca50771f323058f5576Owen Anderson    // definitions with Thumb2 where these instructions are predicable.
495a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!DecodePredicateOperand(MI, 0xE, Address, this))
496a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
49737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
4988533ebad6f6e407215497ca50771f323058f5576Owen Anderson  }
4998533ebad6f6e407215497ca50771f323058f5576Owen Anderson
50037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
50137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableNEONDup32, MI, Insn, Address, this, STI);
50237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
5038533ebad6f6e407215497ca50771f323058f5576Owen Anderson    Size = 4;
5048533ebad6f6e407215497ca50771f323058f5576Owen Anderson    // Add a fake predicate operand, because we share these instruction
5058533ebad6f6e407215497ca50771f323058f5576Owen Anderson    // definitions with Thumb2 where these instructions are predicable.
506a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!DecodePredicateOperand(MI, 0xE, Address, this))
507a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
50837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
5098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
5108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
51137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
51237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTablev8NEON32, MI, Insn, Address, this, STI);
51337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
51419c14abf1c4ccebfa7d07bdd6ea8462a15c0b749Joey Gouly    Size = 4;
51537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
51619c14abf1c4ccebfa7d07bdd6ea8462a15c0b749Joey Gouly  }
5178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
51837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
51937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTablev8Crypto32, MI, Insn, Address, this, STI);
52037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
5215df37dab763ce377095389c4ea1cff88db369954Amara Emerson    Size = 4;
52237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
5235df37dab763ce377095389c4ea1cff88db369954Amara Emerson  }
5245df37dab763ce377095389c4ea1cff88db369954Amara Emerson
52586ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer  Size = 0;
526c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Fail;
5278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
5288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
5298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Andersonnamespace llvm {
5301a2f9886a2a60dbd41216468a240446bbfed3e76Benjamin Kramerextern const MCInstrDesc ARMInsts[];
5318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
5328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
5339e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
5349e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// immediate Value in the MCInst.  The immediate Value has had any PC
5359e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// adjustment made by the caller.  If the instruction is a branch instruction
5369e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// then isBranch is true, else false.  If the getOpInfo() function was set as
5379e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// part of the setupForSymbolicDisassembly() call then that function is called
5389e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// to get any symbolic information at the Address for this instruction.  If
5399e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// that returns non-zero then the symbolic information it returns is used to
5409e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// create an MCExpr and that is added as an operand to the MCInst.  If
5419e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// getOpInfo() returns zero and isBranch is true then a symbol look up for
5429e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// Value is done and if a symbol is found an MCExpr is created with that, else
5439e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// an MCExpr with Value is created.  This function returns true if it adds an
5449e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// operand to the MCInst and false otherwise.
5459e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderbystatic bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value,
5469e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                                     bool isBranch, uint64_t InstSize,
5479e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                                     MCInst &MI, const void *Decoder) {
5489e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
5492c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  // FIXME: Does it make sense for value to be negative?
5502c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  return Dis->tryAddingSymbolicOperand(MI, (uint32_t)Value, Address, isBranch,
5512c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                       /* Offset */ 0, InstSize);
5529e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby}
5539e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
5549e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
5559e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// referenced by a load instruction with the base register that is the Pc.
5569e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// These can often be values in a literal pool near the Address of the
5579e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// instruction.  The Address of the instruction and its immediate Value are
5589e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// used as a possible literal pool entry.  The SymbolLookUp call back will
559c8e41c591741b3da1077f7000274ad040bef8002Sylvestre Ledru/// return the name of a symbol referenced by the literal pool's entry if
5609e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// the referenced address is that of a symbol.  Or it will return a pointer to
5619e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// a literal 'C' string if the referenced address of the literal pool's entry
5629e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby/// is an address into a section with 'C' string literals.
5639e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderbystatic void tryAddingPcLoadReferenceComment(uint64_t Address, int Value,
564b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby                                            const void *Decoder) {
5659e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
5662c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  Dis->tryAddingPcLoadReferenceComment(Value, Address);
5679e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby}
5689e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
5698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// Thumb1 instructions don't have explicit S bits.  Rather, they
5708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// implicitly set CPSR.  Since it's not represented in the encoding, the
5718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// auto-generated decoder won't inject the CPSR operand.  We need to fix
5728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// that as a post-pass.
5738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Andersonstatic void AddThumb1SBit(MCInst &MI, bool InITBlock) {
5748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
5750aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson  unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
5768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  MCInst::iterator I = MI.begin();
5770aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson  for (unsigned i = 0; i < NumOps; ++i, ++I) {
5780aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson    if (I == MI.end()) break;
5798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    if (OpInfo[i].isOptionalDef() && OpInfo[i].RegClass == ARM::CCRRegClassID) {
5800aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson      if (i > 0 && OpInfo[i-1].isPredicate()) continue;
5816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      MI.insert(I, MCOperand::createReg(InITBlock ? 0 : ARM::CPSR));
5828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      return;
583b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen    }
584b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen  }
585b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
5866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MI.insert(I, MCOperand::createReg(InITBlock ? 0 : ARM::CPSR));
5878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
5888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
5898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// Most Thumb instructions don't have explicit predicates in the
5908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// encoding, but rather get their predicates from IT context.  We need
5918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// to fix up the predicate operands using this context information as a
5928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// post-pass.
593d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen AndersonMCDisassembler::DecodeStatus
594d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen AndersonThumbDisassembler::AddThumbPredicate(MCInst &MI) const {
59551f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson  MCDisassembler::DecodeStatus S = Success;
59651f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson
597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const FeatureBitset &FeatureBits = getSubtargetInfo().getFeatureBits();
598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
5998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // A few instructions actually have predicates encoded in them.  Don't
6008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // try to overwrite it if we're seeing one of those.
6018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (MI.getOpcode()) {
6028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::tBcc:
6038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::t2Bcc:
604d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen Anderson    case ARM::tCBZ:
605d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen Anderson    case ARM::tCBNZ:
6069f666b5f2e4a5e94cd667e5be0c5d513dd64ea67Owen Anderson    case ARM::tCPS:
6079f666b5f2e4a5e94cd667e5be0c5d513dd64ea67Owen Anderson    case ARM::t2CPS3p:
6089f666b5f2e4a5e94cd667e5be0c5d513dd64ea67Owen Anderson    case ARM::t2CPS2p:
6099f666b5f2e4a5e94cd667e5be0c5d513dd64ea67Owen Anderson    case ARM::t2CPS1p:
610d9346fbb06d64266c2fe46edef7a15cb9af7e7e8Owen Anderson    case ARM::tMOVSr:
611c18e940c5a1c050701594ee2b356cd40249505a3Owen Anderson    case ARM::tSETEND:
612441462f9328cc7fb86af74c9568a7f70b7bd1fbcOwen Anderson      // Some instructions (mostly conditional branches) are not
613441462f9328cc7fb86af74c9568a7f70b7bd1fbcOwen Anderson      // allowed in IT blocks.
614f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      if (ITBlock.instrInITBlock())
61551f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson        S = SoftFail;
61651f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson      else
61751f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson        return Success;
61851f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson      break;
619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ARM::t2HINT:
620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (MI.getOperand(0).getImm() == 0x10 && (FeatureBits[ARM::FeatureRAS]) != 0)
621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        S = SoftFail;
622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
62351f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson    case ARM::tB:
62451f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson    case ARM::t2B:
62504c7877894492d6e8aa45567988cd7de100589d8Owen Anderson    case ARM::t2TBB:
62604c7877894492d6e8aa45567988cd7de100589d8Owen Anderson    case ARM::t2TBH:
62751f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson      // Some instructions (mostly unconditional branches) can
62851f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson      // only appears at the end of, or outside of, an IT.
629f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
63051f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson        S = SoftFail;
631d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen Anderson      break;
632b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen    default:
6338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
634b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen  }
635b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
6368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // If we're in an IT block, base the predicate on that.  Otherwise,
6378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // assume a predicate of AL.
6388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned CC;
639f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  CC = ITBlock.getITCC();
640f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  if (CC == 0xF)
6418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    CC = ARMCC::AL;
642f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  if (ITBlock.instrInITBlock())
643f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    ITBlock.advanceITState();
6448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
6458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
6460aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson  unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
6478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  MCInst::iterator I = MI.begin();
6480aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson  for (unsigned i = 0; i < NumOps; ++i, ++I) {
6490aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson    if (I == MI.end()) break;
6508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    if (OpInfo[i].isPredicate()) {
6516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      I = MI.insert(I, MCOperand::createImm(CC));
6528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      ++I;
6538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      if (CC == ARMCC::AL)
6546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        MI.insert(I, MCOperand::createReg(0));
6558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      else
6566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        MI.insert(I, MCOperand::createReg(ARM::CPSR));
65751f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson      return S;
658b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen    }
6598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
660b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
6616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  I = MI.insert(I, MCOperand::createImm(CC));
6620aa38ab1fb53c457ce90390aed2659eb085709f0Owen Anderson  ++I;
6638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (CC == ARMCC::AL)
6646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MI.insert(I, MCOperand::createReg(0));
6658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  else
6666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MI.insert(I, MCOperand::createReg(ARM::CPSR));
667d2fc31b3f75700dc89305cb161f3bca7f1a39befOwen Anderson
66851f6a7abf27fc92c3d8904c2334feab8b498e8e9Owen Anderson  return S;
6698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
6708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
6718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// Thumb VFP instructions are a special case.  Because we share their
6728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// encodings between ARM and Thumb modes, and they are predicable in ARM
6738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// mode, the auto-generated decoder will give them an (incorrect)
6748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// predicate operand.  We need to rewrite these operands based on the IT
6758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// context as a post-pass.
6768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Andersonvoid ThumbDisassembler::UpdateThumbVFPPredicate(MCInst &MI) const {
6778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned CC;
678f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  CC = ITBlock.getITCC();
679f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton  if (ITBlock.instrInITBlock())
680f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    ITBlock.advanceITState();
6818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
6828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
6838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  MCInst::iterator I = MI.begin();
68412a1e3bbcbd4e8f740c8304379001d1e6731561cOwen Anderson  unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
68512a1e3bbcbd4e8f740c8304379001d1e6731561cOwen Anderson  for (unsigned i = 0; i < NumOps; ++i, ++I) {
6868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    if (OpInfo[i].isPredicate() ) {
6878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      I->setImm(CC);
6888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      ++I;
6898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      if (CC == ARMCC::AL)
6908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        I->setReg(0);
6918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      else
6928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        I->setReg(ARM::CPSR);
6938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      return;
694eca915fb5242442756a80bad7f285cb54d7b8ea4Johnny Chen    }
6958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
6968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
6978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
698a6804444e874b27aee5921d4c6049df573c5e249Owen AndersonDecodeStatus ThumbDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
69937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                               ArrayRef<uint8_t> Bytes,
700c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                               uint64_t Address,
70137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                               raw_ostream &OS,
70237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                               raw_ostream &CS) const {
70337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  CommentStream = &CS;
7048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
7056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(STI.getFeatureBits()[ARM::ModeThumb] &&
706a5d585685493d85d5cb72b831a68ec747ae55a86James Molloy         "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
707a5d585685493d85d5cb72b831a68ec747ae55a86James Molloy
7088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // We want to read exactly 2 bytes of data.
70937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Bytes.size() < 2) {
71086ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer    Size = 0;
711c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
71286ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer  }
713eca915fb5242442756a80bad7f285cb54d7b8ea4Johnny Chen
71437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint16_t Insn16 = (Bytes[1] << 8) | Bytes[0];
71537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DecodeStatus Result =
71637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableThumb16, MI, Insn16, Address, this, STI);
71737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
7188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 2;
71937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Check(Result, AddThumbPredicate(MI));
72037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
72116280308ac6f20d9da06eafcc19e4a6777f49750Owen Anderson  }
72216280308ac6f20d9da06eafcc19e4a6777f49750Owen Anderson
72337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result = decodeInstruction(DecoderTableThumbSBit16, MI, Insn16, Address, this,
72437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                             STI);
72537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result) {
72616280308ac6f20d9da06eafcc19e4a6777f49750Owen Anderson    Size = 2;
727f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    bool InITBlock = ITBlock.instrInITBlock();
72837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Check(Result, AddThumbPredicate(MI));
7298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    AddThumb1SBit(MI, InITBlock);
73037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
7318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
7328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
73337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
73437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableThumb216, MI, Insn16, Address, this, STI);
73537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
7368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 2;
7377011eee9b509f3a0f95a75f68787384f31ea3e01Owen Anderson
7387011eee9b509f3a0f95a75f68787384f31ea3e01Owen Anderson    // Nested IT blocks are UNPREDICTABLE.  Must be checked before we add
7397011eee9b509f3a0f95a75f68787384f31ea3e01Owen Anderson    // the Thumb predicate.
740f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    if (MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
74137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Result = MCDisassembler::SoftFail;
7427011eee9b509f3a0f95a75f68787384f31ea3e01Owen Anderson
74337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Check(Result, AddThumbPredicate(MI));
7448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
7458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // If we find an IT instruction, we need to parse its condition
7468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // code and mask operands so that we can apply them correctly
7478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // to the subsequent instructions.
7488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    if (MI.getOpcode() == ARM::t2IT) {
74934626acf7fb042c3a831e2f7dfb653ea79c7adecOwen Anderson
750f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      unsigned Firstcond = MI.getOperand(0).getImm();
751eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson      unsigned Mask = MI.getOperand(1).getImm();
752f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton      ITBlock.setITState(Firstcond, Mask);
753eca915fb5242442756a80bad7f285cb54d7b8ea4Johnny Chen    }
754b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
75537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
7568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
7578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
7588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // We want to read exactly 4 bytes of data.
75937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Bytes.size() < 4) {
76086ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer    Size = 0;
761c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
76286ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer  }
7638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
76437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t Insn32 =
76537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      (Bytes[3] << 8) | (Bytes[2] << 0) | (Bytes[1] << 24) | (Bytes[0] << 16);
76637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
76737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableThumb32, MI, Insn32, Address, this, STI);
76837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
7698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 4;
770f4478f99dd63503bf0f0e763bc6d684e738bfe3dRichard Barton    bool InITBlock = ITBlock.instrInITBlock();
77137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Check(Result, AddThumbPredicate(MI));
7728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    AddThumb1SBit(MI, InITBlock);
77337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
7748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
7758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
77637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
77737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableThumb232, MI, Insn32, Address, this, STI);
77837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
7798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Size = 4;
78037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Check(Result, AddThumbPredicate(MI));
78137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
7828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
7838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
78437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (fieldFromInstruction(Insn32, 28, 4) == 0xE) {
78537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result =
78637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        decodeInstruction(DecoderTableVFP32, MI, Insn32, Address, this, STI);
78737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Result != MCDisassembler::Fail) {
788ebc3938ae717d7352de800344c3ad5a1bceb74e5Amaury de la Vieuville      Size = 4;
789ebc3938ae717d7352de800344c3ad5a1bceb74e5Amaury de la Vieuville      UpdateThumbVFPPredicate(MI);
79037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return Result;
791ebc3938ae717d7352de800344c3ad5a1bceb74e5Amaury de la Vieuville    }
7928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
793b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
79437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Result =
79537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      decodeInstruction(DecoderTableVFPV832, MI, Insn32, Address, this, STI);
79637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Result != MCDisassembler::Fail) {
7974ea250524f77a67102118747dad6ee69f9f3b3aaJoey Gouly    Size = 4;
79837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return Result;
7994ea250524f77a67102118747dad6ee69f9f3b3aaJoey Gouly  }
8004ea250524f77a67102118747dad6ee69f9f3b3aaJoey Gouly
80137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (fieldFromInstruction(Insn32, 28, 4) == 0xE) {
80237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result = decodeInstruction(DecoderTableNEONDup32, MI, Insn32, Address, this,
80337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                               STI);
80437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Result != MCDisassembler::Fail) {
805ebc3938ae717d7352de800344c3ad5a1bceb74e5Amaury de la Vieuville      Size = 4;
80637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Check(Result, AddThumbPredicate(MI));
80737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return Result;
808ebc3938ae717d7352de800344c3ad5a1bceb74e5Amaury de la Vieuville    }
809ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson  }
810ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson
81137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (fieldFromInstruction(Insn32, 24, 8) == 0xF9) {
81237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint32_t NEONLdStInsn = Insn32;
813ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson    NEONLdStInsn &= 0xF0FFFFFF;
814ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson    NEONLdStInsn |= 0x04000000;
81537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result = decodeInstruction(DecoderTableNEONLoadStore32, MI, NEONLdStInsn,
816fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach                               Address, this, STI);
81737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Result != MCDisassembler::Fail) {
818ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson      Size = 4;
81937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Check(Result, AddThumbPredicate(MI));
82037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return Result;
821ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson    }
822ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson  }
823ef2865a8eadffd7e346b9bc70c647578010b6afdOwen Anderson
82437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (fieldFromInstruction(Insn32, 24, 4) == 0xF) {
82537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint32_t NEONDataInsn = Insn32;
8268533ebad6f6e407215497ca50771f323058f5576Owen Anderson    NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
8278533ebad6f6e407215497ca50771f323058f5576Owen Anderson    NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
8288533ebad6f6e407215497ca50771f323058f5576Owen Anderson    NEONDataInsn |= 0x12000000; // Set bits 28 and 25
82937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result = decodeInstruction(DecoderTableNEONData32, MI, NEONDataInsn,
830fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach                               Address, this, STI);
83137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Result != MCDisassembler::Fail) {
8328533ebad6f6e407215497ca50771f323058f5576Owen Anderson      Size = 4;
83337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Check(Result, AddThumbPredicate(MI));
83437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return Result;
8358533ebad6f6e407215497ca50771f323058f5576Owen Anderson    }
8368533ebad6f6e407215497ca50771f323058f5576Owen Anderson
83737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint32_t NEONCryptoInsn = Insn32;
8383f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov    NEONCryptoInsn &= 0xF0FFFFFF; // Clear bits 27-24
8393f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov    NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
8403f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov    NEONCryptoInsn |= 0x12000000; // Set bits 28 and 25
84137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result = decodeInstruction(DecoderTablev8Crypto32, MI, NEONCryptoInsn,
8423f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov                               Address, this, STI);
84337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Result != MCDisassembler::Fail) {
8443f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov      Size = 4;
84537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return Result;
8463f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov    }
8475df37dab763ce377095389c4ea1cff88db369954Amara Emerson
84837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint32_t NEONv8Insn = Insn32;
8493f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov    NEONv8Insn &= 0xF3FFFFFF; // Clear bits 27-26
85037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result = decodeInstruction(DecoderTablev8NEON32, MI, NEONv8Insn, Address,
8513f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov                               this, STI);
85237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Result != MCDisassembler::Fail) {
8533f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov      Size = 4;
85437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return Result;
8553f04b5068619ca0411521c9871f4bfc6b04f951fArtyom Skrobov    }
85619c14abf1c4ccebfa7d07bdd6ea8462a15c0b749Joey Gouly  }
85719c14abf1c4ccebfa7d07bdd6ea8462a15c0b749Joey Gouly
85886ce852a15f0c66601dcaf55644d8c4ec268906fBenjamin Kramer  Size = 0;
859c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Fail;
860b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
861b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
862b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
8638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Andersonextern "C" void LLVMInitializeARMDisassembler() {
86436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TargetRegistry::RegisterMCDisassembler(TheARMLETarget,
8658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                         createARMDisassembler);
86636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TargetRegistry::RegisterMCDisassembler(TheARMBETarget,
86736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                         createARMDisassembler);
86836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TargetRegistry::RegisterMCDisassembler(TheThumbLETarget,
86936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                         createThumbDisassembler);
87036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TargetRegistry::RegisterMCDisassembler(TheThumbBETarget,
8718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                         createThumbDisassembler);
8728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
873b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
874b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t GPRDecoderTable[] = {
8758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM::R0, ARM::R1, ARM::R2, ARM::R3,
8768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM::R4, ARM::R5, ARM::R6, ARM::R7,
8778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM::R8, ARM::R9, ARM::R10, ARM::R11,
8788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM::R12, ARM::SP, ARM::LR, ARM::PC
8798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson};
8808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
881c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo,
8828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
8838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (RegNo > 15)
884c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
885b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
8868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned Register = GPRDecoderTable[RegNo];
8876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
888c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
8898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
8908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
891a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
892c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo,
893c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                           uint64_t Address, const void *Decoder) {
8945c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga  DecodeStatus S = MCDisassembler::Success;
895f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
8965c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga  if (RegNo == 15)
8975c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga    S = MCDisassembler::SoftFail;
8985c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga
8995c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga  Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
9005c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga
9015c062ad92672f22e61a4b20a9954af3db3b72bd6Silviu Baranga  return S;
90251c9805c4bcca635bc6a854e4a246ebd4258f512Owen Anderson}
90351c9805c4bcca635bc6a854e4a246ebd4258f512Owen Anderson
904f86e436fb95670ed110818fefa403f21ae104639Mihai Popastatic DecodeStatus
905f86e436fb95670ed110818fefa403f21ae104639Mihai PopaDecodeGPRwithAPSRRegisterClass(MCInst &Inst, unsigned RegNo,
906f86e436fb95670ed110818fefa403f21ae104639Mihai Popa                               uint64_t Address, const void *Decoder) {
907f86e436fb95670ed110818fefa403f21ae104639Mihai Popa  DecodeStatus S = MCDisassembler::Success;
908f86e436fb95670ed110818fefa403f21ae104639Mihai Popa
909f86e436fb95670ed110818fefa403f21ae104639Mihai Popa  if (RegNo == 15)
910f86e436fb95670ed110818fefa403f21ae104639Mihai Popa  {
9116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(ARM::APSR_NZCV));
912f86e436fb95670ed110818fefa403f21ae104639Mihai Popa    return MCDisassembler::Success;
913f86e436fb95670ed110818fefa403f21ae104639Mihai Popa  }
914f86e436fb95670ed110818fefa403f21ae104639Mihai Popa
915f86e436fb95670ed110818fefa403f21ae104639Mihai Popa  Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
916f86e436fb95670ed110818fefa403f21ae104639Mihai Popa  return S;
917f86e436fb95670ed110818fefa403f21ae104639Mihai Popa}
918f86e436fb95670ed110818fefa403f21ae104639Mihai Popa
919c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo,
9208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
9218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (RegNo > 7)
922c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
9238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
9248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
9258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
9263862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuvillestatic const uint16_t GPRPairDecoderTable[] = {
9273862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  ARM::R0_R1, ARM::R2_R3,   ARM::R4_R5,  ARM::R6_R7,
9283862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  ARM::R8_R9, ARM::R10_R11, ARM::R12_SP
9293862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville};
9303862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville
9313862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuvillestatic DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo,
9323862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville                                   uint64_t Address, const void *Decoder) {
9333862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
9343862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville
9353862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  if (RegNo > 13)
9363862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville    return MCDisassembler::Fail;
9373862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville
9383862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  if ((RegNo & 1) || RegNo == 0xe)
9393862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville     S = MCDisassembler::SoftFail;
9403862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville
9413862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  unsigned RegisterPair = GPRPairDecoderTable[RegNo/2];
9426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(RegisterPair));
9433862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  return S;
9443862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville}
9453862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville
946c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo,
9478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
9488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned Register = 0;
9498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (RegNo) {
9508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 0:
9518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Register = ARM::R0;
9528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
9538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 1:
9548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Register = ARM::R1;
9558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
9568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 2:
9578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Register = ARM::R2;
9588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
9598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 3:
9608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Register = ARM::R3;
9618d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
9628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 9:
9638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Register = ARM::R9;
9648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
9658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 12:
9668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Register = ARM::R12;
9678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
9688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
969c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
9708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
971b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
9726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
973c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
9748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
9758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
976c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo,
9778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
97807c3e159d8fffc8b16bcd52cc395a78007c62910Amaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
979f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
980f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const FeatureBitset &featureBits =
981f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
982f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
983f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if ((RegNo == 13 && !featureBits[ARM::HasV8Ops]) || RegNo == 15)
98407c3e159d8fffc8b16bcd52cc395a78007c62910Amaury de la Vieuville    S = MCDisassembler::SoftFail;
985f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
98607c3e159d8fffc8b16bcd52cc395a78007c62910Amaury de la Vieuville  Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
98707c3e159d8fffc8b16bcd52cc395a78007c62910Amaury de la Vieuville  return S;
9888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
989bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby
990b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t SPRDecoderTable[] = {
9918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::S0,  ARM::S1,  ARM::S2,  ARM::S3,
9928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::S4,  ARM::S5,  ARM::S6,  ARM::S7,
9938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::S8,  ARM::S9, ARM::S10, ARM::S11,
9948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::S12, ARM::S13, ARM::S14, ARM::S15,
9958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::S16, ARM::S17, ARM::S18, ARM::S19,
9968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::S20, ARM::S21, ARM::S22, ARM::S23,
9978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::S24, ARM::S25, ARM::S26, ARM::S27,
9988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::S28, ARM::S29, ARM::S30, ARM::S31
9998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson};
10008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1001c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo,
10028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
10038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (RegNo > 31)
1004c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
1005b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
10068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned Register = SPRDecoderTable[RegNo];
10076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
1008c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
1009b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1010b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1011b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t DPRDecoderTable[] = {
10128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3,
10138d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7,
10148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::D8,  ARM::D9, ARM::D10, ARM::D11,
10158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::D12, ARM::D13, ARM::D14, ARM::D15,
10168d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::D16, ARM::D17, ARM::D18, ARM::D19,
10178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::D20, ARM::D21, ARM::D22, ARM::D23,
10188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::D24, ARM::D25, ARM::D26, ARM::D27,
10198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::D28, ARM::D29, ARM::D30, ARM::D31
10208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson};
10218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1022c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
10238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
10246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
10256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
10266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
10276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasD16 = featureBits[ARM::FeatureD16];
102837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
102937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (RegNo > 31 || (hasD16 && RegNo > 15))
1030c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
1031b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
10328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned Register = DPRDecoderTable[RegNo];
10336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
1034c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
10358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
10368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1037c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo,
10388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
10398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (RegNo > 7)
1040c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
10418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
10428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
1043b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1044a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
1045c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeDPR_VFP2RegisterClass(MCInst &Inst, unsigned RegNo,
1046c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                            uint64_t Address, const void *Decoder) {
10478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (RegNo > 15)
1048c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
10498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
10508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
1051b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1052b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t QPRDecoderTable[] = {
10538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::Q0,  ARM::Q1,  ARM::Q2,  ARM::Q3,
10548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::Q4,  ARM::Q5,  ARM::Q6,  ARM::Q7,
10558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson     ARM::Q8,  ARM::Q9, ARM::Q10, ARM::Q11,
10568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
10578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson};
1058af5b0e851e42d7de1247c4084ba75a76c4497ca6Johnny Chen
1059bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby
1060c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
10618d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
1062bac932e9c3c4305a3c73598f3d0dc55de53d4c68Mihai Popa  if (RegNo > 31 || (RegNo & 1) != 0)
1063c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
10648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  RegNo >>= 1;
1065b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
10668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned Register = QPRDecoderTable[RegNo];
10676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
1068c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
1069b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1070b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1071b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t DPairDecoderTable[] = {
107228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  ARM::Q0,  ARM::D1_D2,   ARM::Q1,  ARM::D3_D4,   ARM::Q2,  ARM::D5_D6,
107328f08c93e75d291695ea89b9004145103292e85bJim Grosbach  ARM::Q3,  ARM::D7_D8,   ARM::Q4,  ARM::D9_D10,  ARM::Q5,  ARM::D11_D12,
107428f08c93e75d291695ea89b9004145103292e85bJim Grosbach  ARM::Q6,  ARM::D13_D14, ARM::Q7,  ARM::D15_D16, ARM::Q8,  ARM::D17_D18,
107528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  ARM::Q9,  ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
107628f08c93e75d291695ea89b9004145103292e85bJim Grosbach  ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
107728f08c93e75d291695ea89b9004145103292e85bJim Grosbach  ARM::Q15
107828f08c93e75d291695ea89b9004145103292e85bJim Grosbach};
107928f08c93e75d291695ea89b9004145103292e85bJim Grosbach
1080c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo,
108128f08c93e75d291695ea89b9004145103292e85bJim Grosbach                                   uint64_t Address, const void *Decoder) {
108228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  if (RegNo > 30)
108328f08c93e75d291695ea89b9004145103292e85bJim Grosbach    return MCDisassembler::Fail;
108428f08c93e75d291695ea89b9004145103292e85bJim Grosbach
108528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  unsigned Register = DPairDecoderTable[RegNo];
10866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
108728f08c93e75d291695ea89b9004145103292e85bJim Grosbach  return MCDisassembler::Success;
108828f08c93e75d291695ea89b9004145103292e85bJim Grosbach}
108928f08c93e75d291695ea89b9004145103292e85bJim Grosbach
1090b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t DPairSpacedDecoderTable[] = {
1091c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D0_D2,   ARM::D1_D3,   ARM::D2_D4,   ARM::D3_D5,
1092c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D4_D6,   ARM::D5_D7,   ARM::D6_D8,   ARM::D7_D9,
1093c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D8_D10,  ARM::D9_D11,  ARM::D10_D12, ARM::D11_D13,
1094c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
1095c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
1096c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
1097c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
1098c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  ARM::D28_D30, ARM::D29_D31
1099c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach};
1100c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach
1101c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst,
1102c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach                                                   unsigned RegNo,
1103c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach                                                   uint64_t Address,
1104c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach                                                   const void *Decoder) {
1105c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  if (RegNo > 29)
1106c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach    return MCDisassembler::Fail;
1107c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach
1108c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  unsigned Register = DPairSpacedDecoderTable[RegNo];
11096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Register));
1110c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  return MCDisassembler::Success;
1111c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach}
1112c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach
1113c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val,
11148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
1115c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (Val == 0xF) return MCDisassembler::Fail;
1116bd9091c18d85d6649763165c4951d7b5ff2e31a9Owen Anderson  // AL predicate is not allowed on Thumb1 branches.
1117bd9091c18d85d6649763165c4951d7b5ff2e31a9Owen Anderson  if (Inst.getOpcode() == ARM::tBcc && Val == 0xE)
1118c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
11196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
11208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Val == ARMCC::AL) {
11216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(0));
11228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  } else
11236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(ARM::CPSR));
1124c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
1125b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1126b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1127c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val,
11288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
11298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Val)
11306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(ARM::CPSR));
11318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  else
11326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(0));
1133c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
11348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
11356bcf52f00a4fc352e90ff11681a0e69f9757eb37Johnny Chen
1136c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Val,
11378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
1138a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
11398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1140fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val, 0, 4);
1141fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned type = fieldFromInstruction(Val, 5, 2);
1142fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 7, 5);
11438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
11448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Register-immediate
1145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
1146a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
11478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
11488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
11498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (type) {
11508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 0:
11518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::lsl;
11528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 1:
11548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::lsr;
11558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 2:
11578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::asr;
11588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 3:
11608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::ror;
11618d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11626bcf52f00a4fc352e90ff11681a0e69f9757eb37Johnny Chen  }
11638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
11648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Shift == ARM_AM::ror && imm == 0)
11658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Shift = ARM_AM::rrx;
11668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
11678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned Op = Shift | (imm << 3);
11686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Op));
11698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
117083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
11718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
11728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1173c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Val,
11748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
1175a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
11768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1177fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val, 0, 4);
1178fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned type = fieldFromInstruction(Val, 5, 2);
1179fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rs = fieldFromInstruction(Val, 8, 4);
11808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
11818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Register-register
1182a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1183a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
1184a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
1185a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
11868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
11878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
11888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (type) {
11898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 0:
11908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::lsl;
11918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 1:
11938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::lsr;
11948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 2:
11968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::asr;
11978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
11988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 3:
11998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      Shift = ARM_AM::ror;
12008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
12016bcf52f00a4fc352e90ff11681a0e69f9757eb37Johnny Chen  }
12026bcf52f00a4fc352e90ff11681a0e69f9757eb37Johnny Chen
12036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Shift));
12046bcf52f00a4fc352e90ff11681a0e69f9757eb37Johnny Chen
120583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
1206b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1207b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1208c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val,
12098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
1210a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
121183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
121201b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  bool NeedDisjointWriteback = false;
121301b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  unsigned WritebackReg = 0;
1214921d01ae1ff4e1dad2daeed22f8259a7a520412fOwen Anderson  switch (Inst.getOpcode()) {
121501b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  default:
121601b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover    break;
121701b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::LDMIA_UPD:
121801b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::LDMDB_UPD:
121901b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::LDMIB_UPD:
122001b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::LDMDA_UPD:
122101b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::t2LDMIA_UPD:
122201b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::t2LDMDB_UPD:
122301b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::t2STMIA_UPD:
122401b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover  case ARM::t2STMDB_UPD:
122501b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover    NeedDisjointWriteback = true;
122601b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover    WritebackReg = Inst.getOperand(0).getReg();
122701b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover    break;
1228921d01ae1ff4e1dad2daeed22f8259a7a520412fOwen Anderson  }
1229921d01ae1ff4e1dad2daeed22f8259a7a520412fOwen Anderson
123026d2f0ac919f6ae868fe901fd4ad64af6f92da4dOwen Anderson  // Empty register lists are not allowed.
12314dc8bdf87d402ad8c91d9a72777d9576c5461e40Benjamin Kramer  if (Val == 0) return MCDisassembler::Fail;
12328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  for (unsigned i = 0; i < 16; ++i) {
1233ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson    if (Val & (1 << i)) {
1234a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, i, Address, Decoder)))
1235a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
1236921d01ae1ff4e1dad2daeed22f8259a7a520412fOwen Anderson      // Writeback not allowed if Rn is in the target list.
123701b0e94bb731310e72f66977e4b57cd3f3280ba4Tim Northover      if (NeedDisjointWriteback && WritebackReg == Inst.end()[-1].getReg())
1238921d01ae1ff4e1dad2daeed22f8259a7a520412fOwen Anderson        Check(S, MCDisassembler::SoftFail);
1239ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson    }
1240b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen  }
12418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
124283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
1243b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1244b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1245c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val,
12468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
1247a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
124883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1249fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Vd = fieldFromInstruction(Val, 8, 5);
1250fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned regs = fieldFromInstruction(Val, 0, 8);
12518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1252242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  // In case of unpredictable encoding, tweak the operands.
1253242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  if (regs == 0 || (Vd + regs) > 32) {
1254242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    regs = Vd + regs > 32 ? 32 - Vd : regs;
1255242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    regs = std::max( 1u, regs);
1256242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    S = MCDisassembler::SoftFail;
1257242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  }
1258242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover
1259a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
1260a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
1261ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  for (unsigned i = 0; i < (regs - 1); ++i) {
1262a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeSPRRegisterClass(Inst, ++Vd, Address, Decoder)))
1263a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
1264ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
12658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
126683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
1267b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1268b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1269c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val,
12708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
1271a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
127283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1273fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Vd = fieldFromInstruction(Val, 8, 5);
1274242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  unsigned regs = fieldFromInstruction(Val, 1, 7);
1275b422d0b65e15435b6aef4a92f5663db9ec6659d4Silviu Baranga
1276242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  // In case of unpredictable encoding, tweak the operands.
1277242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  if (regs == 0 || regs > 16 || (Vd + regs) > 32) {
1278242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    regs = Vd + regs > 32 ? 32 - Vd : regs;
1279242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    regs = std::max( 1u, regs);
1280242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    regs = std::min(16u, regs);
1281242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover    S = MCDisassembler::SoftFail;
1282242c9f4615feeee2fbdd1f29cd9a8e8ffd43c075Tim Northover  }
12838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1284a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
1285a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
1286ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  for (unsigned i = 0; i < (regs - 1); ++i) {
1287a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeDPRRegisterClass(Inst, ++Vd, Address, Decoder)))
1288a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
1289ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
12908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
129183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
1292b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1293b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1294c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Val,
12958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                      uint64_t Address, const void *Decoder) {
129610cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson  // This operand encodes a mask of contiguous zeros between a specified MSB
129710cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson  // and LSB.  To decode it, we create the mask of all bits MSB-and-lower,
129810cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson  // the mask of all bits LSB-and-lower, and then xor them to create
1299c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach  // the mask of that's all ones on [msb, lsb].  Finally we not it to
130010cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson  // create the final mask.
1301fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned msb = fieldFromInstruction(Val, 5, 5);
1302fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned lsb = fieldFromInstruction(Val, 0, 5);
130389db0f690c3238544e59ea3bf2b7a0d6bc8a6544Owen Anderson
1304cb775519279cd1471c490eb5bf4e3ce663fcdc7dOwen Anderson  DecodeStatus S = MCDisassembler::Success;
13051c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby  if (lsb > msb) {
13061c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby    Check(S, MCDisassembler::SoftFail);
13071c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby    // The check above will cause the warning for the "potentially undefined
13081c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby    // instruction encoding" but we can't build a bad MCOperand value here
13091c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby    // with a lsb > msb or else printing the MCInst will cause a crash.
13101c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby    lsb = msb;
13111c83093cd5f4f6d33e732c817bb5afd033531bebKevin Enderby  }
1312cb775519279cd1471c490eb5bf4e3ce663fcdc7dOwen Anderson
13138b22778431cdeb112366ed5dc6283b3a7af19018Owen Anderson  uint32_t msb_mask = 0xFFFFFFFF;
13148b22778431cdeb112366ed5dc6283b3a7af19018Owen Anderson  if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
13158b22778431cdeb112366ed5dc6283b3a7af19018Owen Anderson  uint32_t lsb_mask = (1U << lsb) - 1;
131689db0f690c3238544e59ea3bf2b7a0d6bc8a6544Owen Anderson
13176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(~(msb_mask ^ lsb_mask)));
1318cb775519279cd1471c490eb5bf4e3ce663fcdc7dOwen Anderson  return S;
1319b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
1320b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
1321c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn,
13228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
1323a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
132483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1325fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
1326fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned CRd = fieldFromInstruction(Insn, 12, 4);
1327fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned coproc = fieldFromInstruction(Insn, 8, 4);
1328fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 8);
1329fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
1330fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned U = fieldFromInstruction(Insn, 23, 1);
13318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
13328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
13338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_OFFSET:
13348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_PRE:
13358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_POST:
13368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_OPTION:
13378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_OFFSET:
13388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_PRE:
13398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_POST:
13408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_OPTION:
13418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_OFFSET:
13428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_PRE:
13438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_POST:
13448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_OPTION:
13458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_OFFSET:
13468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_PRE:
13478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_POST:
13488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_OPTION:
13498a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDC_OFFSET:
13508a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDC_PRE:
13518a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDC_POST:
13528a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDC_OPTION:
13538a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDCL_OFFSET:
13548a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDCL_PRE:
13558a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDCL_POST:
13568a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2LDCL_OPTION:
13578a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STC_OFFSET:
13588a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STC_PRE:
13598a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STC_POST:
13608a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STC_OPTION:
13618a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STCL_OFFSET:
13628a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STCL_PRE:
13638a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STCL_POST:
13648a83f71301fdf0e2cea8ecdf413f192ac48ddc5cOwen Anderson    case ARM::t2STCL_OPTION:
13658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      if (coproc == 0xA || coproc == 0xB)
1366c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail;
13678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
13688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
13698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
13708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
13718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
13726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
13736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
13746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (featureBits[ARM::HasV8Ops] && (coproc != 14))
1375fa840ba402806d978c18401c6bea1c808607d944Artyom Skrobov    return MCDisassembler::Fail;
1376fa840ba402806d978c18401c6bea1c808607d944Artyom Skrobov
13776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(coproc));
13786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(CRd));
1379a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1380a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
13818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
13828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
1383c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDC2_OFFSET:
1384c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDC2L_OFFSET:
1385c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDC2_PRE:
1386c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDC2L_PRE:
1387c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STC2_OFFSET:
1388c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STC2L_OFFSET:
1389c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STC2_PRE:
1390c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STC2L_PRE:
1391c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDC2_OFFSET:
1392c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDC2L_OFFSET:
1393c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDC2_PRE:
1394c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDC2L_PRE:
1395c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC2_OFFSET:
1396c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC2L_OFFSET:
1397c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC2_PRE:
1398c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC2L_PRE:
1399c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDC_OFFSET:
1400c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDCL_OFFSET:
1401c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDC_PRE:
1402c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2LDCL_PRE:
1403c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STC_OFFSET:
1404c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STCL_OFFSET:
1405c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STC_PRE:
1406c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::t2STCL_PRE:
1407c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDC_OFFSET:
1408c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDCL_OFFSET:
1409c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDC_PRE:
1410c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::LDCL_PRE:
1411c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC_OFFSET:
1412c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STCL_OFFSET:
1413c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC_PRE:
1414c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STCL_PRE:
141581b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach      imm = ARM_AM::getAM5Opc(U ? ARM_AM::add : ARM_AM::sub, imm);
14166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createImm(imm));
141781b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach      break;
141881b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2LDC2_POST:
141981b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2LDC2L_POST:
142081b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2STC2_POST:
142181b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2STC2L_POST:
142281b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::LDC2_POST:
142381b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::LDC2L_POST:
142481b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::STC2_POST:
142581b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::STC2L_POST:
142681b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2LDC_POST:
142781b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2LDCL_POST:
142881b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2STC_POST:
142981b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::t2STCL_POST:
143081b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::LDC_POST:
143181b2928d80047cb6c8ae0048185742abae1d9dfaJim Grosbach    case ARM::LDCL_POST:
1432c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STC_POST:
1433c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach    case ARM::STCL_POST:
14348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      imm |= U << 8;
1435c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach      // fall through.
14368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
1437c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach      // The 'option' variant doesn't encode 'U' in the immediate since
1438c66e7afcf2810a2c1ebf08514eaf45c478e5ff67Jim Grosbach      // the immediate is unsigned [0,255].
14396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createImm(imm));
14408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
14418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
14428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
14438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
14448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_OFFSET:
14458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_PRE:
14468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_POST:
14478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDC_OPTION:
14488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_OFFSET:
14498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_PRE:
14508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_POST:
14518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDCL_OPTION:
14528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_OFFSET:
14538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_PRE:
14548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_POST:
14558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STC_OPTION:
14568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_OFFSET:
14578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_PRE:
14588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_POST:
14598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STCL_OPTION:
1460a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1461a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
14628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
14638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
14648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
14658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
14668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
146783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
14689899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan}
14699899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan
1470a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
1471c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeAddrMode2IdxInstruction(MCInst &Inst, unsigned Insn,
1472c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                              uint64_t Address, const void *Decoder) {
1473a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
147483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1475fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
1476fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
1477fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
1478fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 12);
1479fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
1480fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned reg = fieldFromInstruction(Insn, 25, 1);
1481fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned P = fieldFromInstruction(Insn, 24, 1);
1482fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned W = fieldFromInstruction(Insn, 21, 1);
14838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
14848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // On stores, the writeback operand precedes Rt.
14858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
14868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STR_POST_IMM:
14878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STR_POST_REG:
1488508e1d3db536b736063385eb1f885b446a1385caOwen Anderson    case ARM::STRB_POST_IMM:
1489508e1d3db536b736063385eb1f885b446a1385caOwen Anderson    case ARM::STRB_POST_REG:
1490342ebd5f380637d965504dcc350f9d0d79bbe599Jim Grosbach    case ARM::STRT_POST_REG:
1491342ebd5f380637d965504dcc350f9d0d79bbe599Jim Grosbach    case ARM::STRT_POST_IMM:
149210348e70d567fb61f6c762d99e91e215c720ebd1Jim Grosbach    case ARM::STRBT_POST_REG:
149310348e70d567fb61f6c762d99e91e215c720ebd1Jim Grosbach    case ARM::STRBT_POST_IMM:
1494a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1495a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
14968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
14978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
14988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
14998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
15008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1501a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1502a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
15038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
15048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // On loads, the writeback operand comes after Rt.
15058d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
15068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDR_POST_IMM:
15078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDR_POST_REG:
1508508e1d3db536b736063385eb1f885b446a1385caOwen Anderson    case ARM::LDRB_POST_IMM:
1509508e1d3db536b736063385eb1f885b446a1385caOwen Anderson    case ARM::LDRB_POST_REG:
15108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRBT_POST_REG:
15118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRBT_POST_IMM:
151259999264e6cfc7f5d59c9a92c8cd9baaa53434f4Jim Grosbach    case ARM::LDRT_POST_REG:
151359999264e6cfc7f5d59c9a92c8cd9baaa53434f4Jim Grosbach    case ARM::LDRT_POST_IMM:
1514a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1515a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
15168d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
15178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
15188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
15198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
15208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1521a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1522a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
15238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
15248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  ARM_AM::AddrOpc Op = ARM_AM::add;
1525fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  if (!fieldFromInstruction(Insn, 23, 1))
15268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Op = ARM_AM::sub;
15278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
15288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  bool writeback = (P == 0) || (W == 1);
15298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned idx_mode = 0;
15308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (P && writeback)
15318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    idx_mode = ARMII::IndexModePre;
15328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  else if (!P && writeback)
15338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    idx_mode = ARMII::IndexModePost;
15348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1535a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (writeback && (Rn == 15 || Rn == Rt))
1536a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    S = MCDisassembler::SoftFail; // UNPREDICTABLE
153771156a6e00d3dc4c531a421a76b3b6ee0ae7d0abOwen Anderson
15388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (reg) {
1539a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1540a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
15418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    ARM_AM::ShiftOpc Opc = ARM_AM::lsl;
1542fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    switch( fieldFromInstruction(Insn, 5, 2)) {
15438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 0:
15448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Opc = ARM_AM::lsl;
15458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
15468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 1:
15478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Opc = ARM_AM::lsr;
15488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
15498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 2:
15508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Opc = ARM_AM::asr;
15518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
15528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 3:
15538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Opc = ARM_AM::ror;
15548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
15558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      default:
1556c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail;
15578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
1558fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned amt = fieldFromInstruction(Insn, 7, 5);
155993c7c449a1351542fa5a275587187154dbedb8e0Tim Northover    if (Opc == ARM_AM::ror && amt == 0)
156093c7c449a1351542fa5a275587187154dbedb8e0Tim Northover      Opc = ARM_AM::rrx;
15618d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    unsigned imm = ARM_AM::getAM2Opc(Op, amt, Opc, idx_mode);
15628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
15636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm));
15648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  } else {
15656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(0));
15668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    unsigned tmp = ARM_AM::getAM2Opc(Op, imm, ARM_AM::lsl, idx_mode);
15676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(tmp));
15688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
15698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1570a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1571a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
15728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
157383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
15748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
15758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1576c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Val,
15778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
1578a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
157983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1580fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 13, 4);
1581fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val,  0, 4);
1582fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned type = fieldFromInstruction(Val, 5, 2);
1583fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 7, 5);
1584fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned U = fieldFromInstruction(Val, 12, 1);
15858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
158651157d22348fdbd4b7975877d5b58e53a6d5d3a2Owen Anderson  ARM_AM::ShiftOpc ShOp = ARM_AM::lsl;
15878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (type) {
15888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 0:
15898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      ShOp = ARM_AM::lsl;
15908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
15918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 1:
15928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      ShOp = ARM_AM::lsr;
15938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
15948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 2:
15958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      ShOp = ARM_AM::asr;
15968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
15978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 3:
15988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      ShOp = ARM_AM::ror;
15998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
16008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
16018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
160293c7c449a1351542fa5a275587187154dbedb8e0Tim Northover  if (ShOp == ARM_AM::ror && imm == 0)
160393c7c449a1351542fa5a275587187154dbedb8e0Tim Northover    ShOp = ARM_AM::rrx;
160493c7c449a1351542fa5a275587187154dbedb8e0Tim Northover
1605a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1606a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
1607a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1608a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
16098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  unsigned shift;
16108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (U)
16118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    shift = ARM_AM::getAM2Opc(ARM_AM::add, imm, ShOp);
16128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  else
16138d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    shift = ARM_AM::getAM2Opc(ARM_AM::sub, imm, ShOp);
16146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(shift));
16158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
161683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
16178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
16188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1619a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
1620c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeAddrMode3Instruction(MCInst &Inst, unsigned Insn,
1621c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                           uint64_t Address, const void *Decoder) {
1622a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
162383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1624fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
1625fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
1626fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
1627fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned type = fieldFromInstruction(Insn, 22, 1);
1628fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 8, 4);
1629fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned U = ((~fieldFromInstruction(Insn, 23, 1)) & 1) << 8;
1630fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
1631fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned W = fieldFromInstruction(Insn, 21, 1);
1632fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned P = fieldFromInstruction(Insn, 24, 1);
16336fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga  unsigned Rt2 = Rt + 1;
16348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
16358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  bool writeback = (W == 1) | (P == 0);
1636c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson
1637c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson  // For {LD,ST}RD, Rt must be even, else undefined.
1638c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson  switch (Inst.getOpcode()) {
1639c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson    case ARM::STRD:
1640c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson    case ARM::STRD_PRE:
1641c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson    case ARM::STRD_POST:
1642c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson    case ARM::LDRD:
1643c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson    case ARM::LDRD_PRE:
1644c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson    case ARM::LDRD_POST:
16456fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (Rt & 0x1) S = MCDisassembler::SoftFail;
16466fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      break;
16476fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    default:
16486fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      break;
16496fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga  }
16506fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga  switch (Inst.getOpcode()) {
16516fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::STRD:
16526fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::STRD_PRE:
16536fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::STRD_POST:
16546fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (P == 0 && W == 1)
16556fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
1656f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
16576fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
16586fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16596fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (type && Rm == 15)
16606fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16616fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (Rt2 == 15)
16626fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
1663fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (!type && fieldFromInstruction(Insn, 8, 4))
16646fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16656fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      break;
16666fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::STRH:
16676fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::STRH_PRE:
16686fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::STRH_POST:
16696fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (Rt == 15)
16706fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16716fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (writeback && (Rn == 15 || Rn == Rt))
16726fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16736fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && Rm == 15)
16746fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16756fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      break;
16766fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRD:
16776fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRD_PRE:
16786fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRD_POST:
16796fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (type && Rn == 15){
16806fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        if (Rt2 == 15)
16816fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga          S = MCDisassembler::SoftFail;
16826fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        break;
16836fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      }
16846fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (P == 0 && W == 1)
16856fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16866fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
16876fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16886fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && writeback && Rn == 15)
16896fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16906fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (writeback && (Rn == Rt || Rn == Rt2))
16916fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
16926fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      break;
16936fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRH:
16946fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRH_PRE:
16956fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRH_POST:
16966fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (type && Rn == 15){
16976fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        if (Rt == 15)
16986fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga          S = MCDisassembler::SoftFail;
16996fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        break;
17006fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      }
17016fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (Rt == 15)
17026fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
17036fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && Rm == 15)
17046fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
17056fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && writeback && (Rn == 15 || Rn == Rt))
17066fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
17076fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      break;
17086fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRSH:
17096fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRSH_PRE:
17106fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRSH_POST:
17116fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRSB:
17126fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRSB_PRE:
17136fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga    case ARM::LDRSB_POST:
17146fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (type && Rn == 15){
17156fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        if (Rt == 15)
17166fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga          S = MCDisassembler::SoftFail;
17176fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        break;
17186fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      }
17196fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (type && (Rt == 15 || (writeback && Rn == Rt)))
17206fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
17216fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && (Rt == 15 || Rm == 15))
17226fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
17236fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga      if (!type && writeback && (Rn == 15 || Rn == Rt))
17246fe310e1555dedba2b36dedae9a88eb900ad1804Silviu Baranga        S = MCDisassembler::SoftFail;
1725c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson      break;
1726a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    default:
1727a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      break;
1728c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson  }
1729c537f3be0c4ff7030afcdcd9f55133ce68eef773Owen Anderson
17308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (writeback) { // Writeback
17318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    if (P)
17328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      U |= ARMII::IndexModePre << 9;
17338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    else
17348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      U |= ARMII::IndexModePost << 9;
17358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
17368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // On stores, the writeback operand precedes Rt.
17378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    switch (Inst.getOpcode()) {
17388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STRD:
17398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STRD_PRE:
17408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STRD_POST:
174179628e92e1f903d50340d4cd3d1ea8c5fff63a87Owen Anderson    case ARM::STRH:
174279628e92e1f903d50340d4cd3d1ea8c5fff63a87Owen Anderson    case ARM::STRH_PRE:
174379628e92e1f903d50340d4cd3d1ea8c5fff63a87Owen Anderson    case ARM::STRH_POST:
1744a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1745a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
17468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
17478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
17488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
17498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
17508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
17518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1752a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1753a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
17548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
17558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STRD:
17568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STRD_PRE:
17578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::STRD_POST:
17588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRD:
17598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRD_PRE:
17608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRD_POST:
1761a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
1762a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
17638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
17648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
17658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
17668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
17678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
17688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (writeback) {
17698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    // On loads, the writeback operand comes after Rt.
17708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    switch (Inst.getOpcode()) {
17718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRD:
17728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRD_PRE:
17738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRD_POST:
17740d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRH:
17750d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRH_PRE:
17760d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRH_POST:
17770d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRSH:
17780d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRSH_PRE:
17790d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRSH_POST:
17800d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRSB:
17810d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRSB_PRE:
17820d09499cf3e2d927cdc53ec79895303ac12808acOwen Anderson    case ARM::LDRSB_POST:
17838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRHTr:
17848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::LDRSBTr:
1785a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1786a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
17878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
17888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
17898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
17908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
17918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
17928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1793a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1794a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
17958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
17968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (type) {
17976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(0));
17986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(U | (imm << 4) | Rm));
17998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  } else {
1800a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1801a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
18026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(U));
18038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
18048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1805a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1806a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
18078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
180883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
18098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
18108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1811c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeRFEInstruction(MCInst &Inst, unsigned Insn,
18128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
1813a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
181483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1815fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
1816fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned mode = fieldFromInstruction(Insn, 23, 2);
18178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
18188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (mode) {
18198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 0:
18208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      mode = ARM_AM::da;
18218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
18228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 1:
18238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      mode = ARM_AM::ia;
18248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
18258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 2:
18268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      mode = ARM_AM::db;
18278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
18288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case 3:
18298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      mode = ARM_AM::ib;
18308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
18318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
18328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
18336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(mode));
1834a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1835a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
18368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
183783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
18388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
18398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
184046e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuvillestatic DecodeStatus DecodeQADDInstruction(MCInst &Inst, unsigned Insn,
184146e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville                               uint64_t Address, const void *Decoder) {
184246e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
184346e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville
184446e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
184546e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
184646e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
184746e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  unsigned pred = fieldFromInstruction(Insn, 28, 4);
184846e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville
184946e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  if (pred == 0xF)
185046e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
185146e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville
185246e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
185346e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville    return MCDisassembler::Fail;
185446e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
185546e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville    return MCDisassembler::Fail;
185646e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
185746e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville    return MCDisassembler::Fail;
185846e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
185946e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville    return MCDisassembler::Fail;
186046e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  return S;
186146e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville}
186246e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville
1863c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst &Inst,
18648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  unsigned Insn,
18658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
1866a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
186783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
1868fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
1869fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
1870fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned reglist = fieldFromInstruction(Insn, 0, 16);
18718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
18728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (pred == 0xF) {
1873ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville    // Ambiguous with RFE and SRS
18748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    switch (Inst.getOpcode()) {
1875846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMDA:
18768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEDA);
18778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1878846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMDA_UPD:
18798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEDA_UPD);
18808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1881846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMDB:
18828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEDB);
18838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1884846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMDB_UPD:
18858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEDB_UPD);
18868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1887846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMIA:
18888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEIA);
18898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1890846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMIA_UPD:
18918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEIA_UPD);
18928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1893846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMIB:
18948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEIB);
18958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1896846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::LDMIB_UPD:
18978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::RFEIB_UPD);
18988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
1899846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMDA:
1900846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSDA);
1901846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1902846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMDA_UPD:
1903846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSDA_UPD);
1904846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1905846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMDB:
1906846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSDB);
1907846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1908846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMDB_UPD:
1909846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSDB_UPD);
1910846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1911846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMIA:
1912846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSIA);
1913846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1914846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMIA_UPD:
1915846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSIA_UPD);
1916846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1917846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMIB:
1918846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSIB);
1919846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1920846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      case ARM::STMIB_UPD:
1921846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        Inst.setOpcode(ARM::SRSIB_UPD);
1922846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson        break;
1923846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      default:
1924ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville        return MCDisassembler::Fail;
19258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
1926846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson
1927846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson    // For stores (which become SRS's, the only operand is the mode.
1928fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    if (fieldFromInstruction(Insn, 20, 1) == 0) {
1929ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville      // Check SRS encoding constraints
1930ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville      if (!(fieldFromInstruction(Insn, 22, 1) == 1 &&
1931ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville            fieldFromInstruction(Insn, 20, 1) == 0))
1932ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville        return MCDisassembler::Fail;
1933ae50ddb2aeaec7dd91ef8db3918688c104a6baedAmaury de la Vieuville
1934846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      Inst.addOperand(
19356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar          MCOperand::createImm(fieldFromInstruction(Insn, 0, 4)));
1936846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson      return S;
1937846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson    }
1938846dd95f87f62e2faa6092f99b521ecd9790121aOwen Anderson
19398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
19408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
19418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1942a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1943a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
1944a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1945a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail; // Tied
1946a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1947a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
1948a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
1949a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
19508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
195183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
19528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
19538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1954de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Check for UNPREDICTABLE predicated ESB instruction
1955de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DecodeStatus DecodeHINTInstruction(MCInst &Inst, unsigned Insn,
1956de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                 uint64_t Address, const void *Decoder) {
1957de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned pred = fieldFromInstruction(Insn, 28, 4);
1958de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned imm8 = fieldFromInstruction(Insn, 0, 8);
1959de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
1960de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const FeatureBitset &FeatureBits = Dis->getSubtargetInfo().getFeatureBits();
1961de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1962de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DecodeStatus S = MCDisassembler::Success;
1963de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1964de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm8));
1965de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1966de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1967de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MCDisassembler::Fail;
1968de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1969de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // ESB is unpredictable if pred != AL. Without the RAS extension, it is a NOP,
1970de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // so all predicates should be allowed.
1971de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (imm8 == 0x10 && pred != 0xe && ((FeatureBits[ARM::FeatureRAS]) != 0))
1972de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    S = MCDisassembler::SoftFail;
1973de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1974de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return S;
1975de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1976de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1977c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn,
19788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
1979fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imod = fieldFromInstruction(Insn, 18, 2);
1980fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned M = fieldFromInstruction(Insn, 17, 1);
1981fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned iflags = fieldFromInstruction(Insn, 6, 3);
1982fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned mode = fieldFromInstruction(Insn, 0, 5);
19838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
1984a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
198514090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson
198646e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  // This decoder is called from multiple location that do not check
198746e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  // the full encoding is valid before they do.
198846e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville  if (fieldFromInstruction(Insn, 5, 1) != 0 ||
198946e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville      fieldFromInstruction(Insn, 16, 1) != 0 ||
199046e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville      fieldFromInstruction(Insn, 20, 8) != 0x10)
199146e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville    return MCDisassembler::Fail;
199246e136c952e0242308db2682ba2ec4020cdcd006Amaury de la Vieuville
199335008c2f8dcfe55960fe4efea3a26e526d437ad6Owen Anderson  // imod == '01' --> UNPREDICTABLE
199414090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
199514090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  // return failure here.  The '01' imod value is unprintable, so there's
199614090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  // nothing useful we could do even if we returned UNPREDICTABLE.
199735008c2f8dcfe55960fe4efea3a26e526d437ad6Owen Anderson
1998c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (imod == 1) return MCDisassembler::Fail;
199914090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson
200014090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  if (imod && M) {
20018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Inst.setOpcode(ARM::CPS3p);
20026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imod));
20036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(iflags));
20046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(mode));
200514090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  } else if (imod && !M) {
20068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Inst.setOpcode(ARM::CPS2p);
20076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imod));
20086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(iflags));
2009c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (mode) S = MCDisassembler::SoftFail;
201014090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  } else if (!imod && M) {
20118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Inst.setOpcode(ARM::CPS1p);
20126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(mode));
2013c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (iflags) S = MCDisassembler::SoftFail;
20141dd56f05e1bc3e7f66f2b0de4b5ea3692136a77fOwen Anderson  } else {
201514090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson    // imod == '00' && M == '0' --> UNPREDICTABLE
20161dd56f05e1bc3e7f66f2b0de4b5ea3692136a77fOwen Anderson    Inst.setOpcode(ARM::CPS1p);
20176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(mode));
2018c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    S = MCDisassembler::SoftFail;
20191dd56f05e1bc3e7f66f2b0de4b5ea3692136a77fOwen Anderson  }
20208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
202114090bf2636edf5e46a2c12a312b1889f5335d7dOwen Anderson  return S;
20228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
20238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2024c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
20256153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson                                 uint64_t Address, const void *Decoder) {
2026fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imod = fieldFromInstruction(Insn, 9, 2);
2027fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned M = fieldFromInstruction(Insn, 8, 1);
2028fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned iflags = fieldFromInstruction(Insn, 5, 3);
2029fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned mode = fieldFromInstruction(Insn, 0, 5);
20306153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
2031a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
20326153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
20336153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  // imod == '01' --> UNPREDICTABLE
20346153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
20356153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  // return failure here.  The '01' imod value is unprintable, so there's
20366153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  // nothing useful we could do even if we returned UNPREDICTABLE.
20376153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
2038c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (imod == 1) return MCDisassembler::Fail;
20396153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
20406153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  if (imod && M) {
20416153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson    Inst.setOpcode(ARM::t2CPS3p);
20426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imod));
20436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(iflags));
20446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(mode));
20456153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  } else if (imod && !M) {
20466153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson    Inst.setOpcode(ARM::t2CPS2p);
20476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imod));
20486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(iflags));
2049c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (mode) S = MCDisassembler::SoftFail;
20506153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  } else if (!imod && M) {
20516153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson    Inst.setOpcode(ARM::t2CPS1p);
20526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(mode));
2053c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (iflags) S = MCDisassembler::SoftFail;
20546153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  } else {
20551ad3a410beff11913db0573942fb51b651d01a13Quentin Colombet    // imod == '00' && M == '0' --> this is a HINT instruction
20561ad3a410beff11913db0573942fb51b651d01a13Quentin Colombet    int imm = fieldFromInstruction(Insn, 0, 8);
20571ad3a410beff11913db0573942fb51b651d01a13Quentin Colombet    // HINT are defined only for immediate in [0..4]
20581ad3a410beff11913db0573942fb51b651d01a13Quentin Colombet    if(imm > 4) return MCDisassembler::Fail;
20591ad3a410beff11913db0573942fb51b651d01a13Quentin Colombet    Inst.setOpcode(ARM::t2HINT);
20606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm));
20616153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  }
20626153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
20636153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson  return S;
20646153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson}
20656153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
2066c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
20679e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                                 uint64_t Address, const void *Decoder) {
20689e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  DecodeStatus S = MCDisassembler::Success;
20699e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
2070fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 8, 4);
20719e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  unsigned imm = 0;
20729e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
2073fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= (fieldFromInstruction(Insn, 0, 8) << 0);
2074fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= (fieldFromInstruction(Insn, 12, 3) << 8);
2075fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= (fieldFromInstruction(Insn, 16, 4) << 12);
2076fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= (fieldFromInstruction(Insn, 26, 1) << 11);
20779e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
20789e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (Inst.getOpcode() == ARM::t2MOVTi16)
20799e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby    if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
20809e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby      return MCDisassembler::Fail;
20819e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
20829e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby    return MCDisassembler::Fail;
20839e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
20849e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
20856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm));
20869e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
20879e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  return S;
20889e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby}
20899e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
2090c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn,
20919e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                                 uint64_t Address, const void *Decoder) {
20929e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  DecodeStatus S = MCDisassembler::Success;
20939e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
2094fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2095fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
20969e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  unsigned imm = 0;
20979e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
2098fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= (fieldFromInstruction(Insn, 0, 12) << 0);
2099fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= (fieldFromInstruction(Insn, 16, 4) << 12);
21009e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
21019e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (Inst.getOpcode() == ARM::MOVTi16)
21024521019c6fd23680c583abe086067fc1c569bad1Tim Northover    if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
21039e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby      return MCDisassembler::Fail;
21044521019c6fd23680c583abe086067fc1c569bad1Tim Northover
21054521019c6fd23680c583abe086067fc1c569bad1Tim Northover  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
21069e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby    return MCDisassembler::Fail;
21079e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
21089e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
21096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm));
21109e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
21119e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
21129e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby    return MCDisassembler::Fail;
21139e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
21149e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  return S;
21159e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby}
21166153a036f544beb03dfc4d58edc28cf42712743dOwen Anderson
2117c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn,
21188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
2119a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
212083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2121fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 16, 4);
2122fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 0, 4);
2123fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 8, 4);
2124fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Ra = fieldFromInstruction(Insn, 12, 4);
2125fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
21268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
21278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (pred == 0xF)
21288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
21298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2130a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2131a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
2132a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2133a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
2134a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2135a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
2136a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
2137a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
21388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2139a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2140a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
21411fb6673bc2f0a404f4f914bf381c627402ac7c6bOwen Anderson
214283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
21438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
21448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
21450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic DecodeStatus DecodeTSTInstruction(MCInst &Inst, unsigned Insn,
21460c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                  uint64_t Address, const void *Decoder) {
21470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  DecodeStatus S = MCDisassembler::Success;
21480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Pred = fieldFromInstruction(Insn, 28, 4);
21500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
21510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
21520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Pred == 0xF)
21540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return DecodeSETPANInstruction(Inst, Insn, Address, Decoder);
21550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
21570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MCDisassembler::Fail;
21580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
21590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MCDisassembler::Fail;
21600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (!Check(S, DecodePredicateOperand(Inst, Pred, Address, Decoder)))
21610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MCDisassembler::Fail;
21620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return S;
21640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
21650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic DecodeStatus DecodeSETPANInstruction(MCInst &Inst, unsigned Insn,
21670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                  uint64_t Address, const void *Decoder) {
21680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  DecodeStatus S = MCDisassembler::Success;
21690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Imm = fieldFromInstruction(Insn, 9, 1);
21710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
21736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &FeatureBits = Dis->getSubtargetInfo().getFeatureBits();
21746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
21756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!FeatureBits[ARM::HasV8_1aOps] ||
21766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      !FeatureBits[ARM::HasV8Ops])
21770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MCDisassembler::Fail;
21780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // Decoder can be called from DecodeTST, which does not check the full
21800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // encoding is valid.
21810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (fieldFromInstruction(Insn, 20,12) != 0xf11 ||
21820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      fieldFromInstruction(Insn, 4,4) != 0)
21830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return MCDisassembler::Fail;
21840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (fieldFromInstruction(Insn, 10,10) != 0 ||
21850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      fieldFromInstruction(Insn, 0,4) != 0)
21860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    S = MCDisassembler::SoftFail;
21870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Inst.setOpcode(ARM::SETPAN);
21896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Imm));
21900c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
21910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  return S;
21920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
21930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2194c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
21958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                           uint64_t Address, const void *Decoder) {
2196a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
219783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2198fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned add = fieldFromInstruction(Val, 12, 1);
2199fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 12);
2200fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 13, 4);
22018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2202a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2203a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
22048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
22058d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (!add) imm *= -1;
22068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (imm == 0 && !add) imm = INT32_MIN;
22076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
22089e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  if (Rn == 15)
22099e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby    tryAddingPcLoadReferenceComment(Address, Address + imm + 8, Decoder);
22108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
221183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
22128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
22138d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2214c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
22158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
2216a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
221783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2218fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 9, 4);
2219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // U == 1 to add imm, 0 to subtract it.
2220fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned U = fieldFromInstruction(Val, 8, 1);
2221fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 8);
22228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2223a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2224a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
22258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
22268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (U)
22276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5Opc(ARM_AM::add, imm)));
22288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  else
22296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5Opc(ARM_AM::sub, imm)));
22308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
223183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
22328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
22338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DecodeStatus DecodeAddrMode5FP16Operand(MCInst &Inst, unsigned Val,
2235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                   uint64_t Address, const void *Decoder) {
2236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DecodeStatus S = MCDisassembler::Success;
2237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Rn = fieldFromInstruction(Val, 9, 4);
2239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // U == 1 to add imm, 0 to subtract it.
2240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned U = fieldFromInstruction(Val, 8, 1);
2241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned imm = fieldFromInstruction(Val, 0, 8);
2242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MCDisassembler::Fail;
2245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (U)
2247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5FP16Opc(ARM_AM::add, imm)));
2248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
2249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(ARM_AM::getAM5FP16Opc(ARM_AM::sub, imm)));
2250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return S;
2252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2254c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val,
22558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
22568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
22578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
22588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2259a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
22602a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin EnderbyDecodeT2BInstruction(MCInst &Inst, unsigned Insn,
22612a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                     uint64_t Address, const void *Decoder) {
2262445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  DecodeStatus Status = MCDisassembler::Success;
2263445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby
2264445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  // Note the J1 and J2 values are from the encoded instruction.  So here
2265445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  // change them to I1 and I2 values via as documented:
2266445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  // I1 = NOT(J1 EOR S);
2267445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  // I2 = NOT(J2 EOR S);
2268445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  // and build the imm32 with one trailing zero as documented:
2269445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
2270445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned S = fieldFromInstruction(Insn, 26, 1);
2271445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned J1 = fieldFromInstruction(Insn, 13, 1);
2272445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned J2 = fieldFromInstruction(Insn, 11, 1);
2273445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned I1 = !(J1 ^ S);
2274445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned I2 = !(J2 ^ S);
2275445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned imm10 = fieldFromInstruction(Insn, 16, 10);
2276445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned imm11 = fieldFromInstruction(Insn, 0, 11);
2277445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
22788117ac555d06b23f61ddd06aa54d3dfa3e5b8e56Amaury de la Vieuville  int imm32 = SignExtend32<25>(tmp << 1);
2279445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4,
22802a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                                true, 4, Inst, Decoder))
22816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm32));
2282445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby
2283445ba85b8d7bc8fb4689ca22131cadc80a034705Kevin Enderby  return Status;
22842a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby}
22852a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby
22862a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderbystatic DecodeStatus
2287c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeBranchImmInstruction(MCInst &Inst, unsigned Insn,
2288c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                           uint64_t Address, const void *Decoder) {
2289a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
229083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2291fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
2292fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 24) << 2;
22938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
22948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (pred == 0xF) {
22958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    Inst.setOpcode(ARM::BLXi);
2296fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    imm |= fieldFromInstruction(Insn, 24, 1) << 1;
2297b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby    if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<26>(imm) + 8,
2298b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby                                  true, 4, Inst, Decoder))
22996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(SignExtend32<26>(imm)));
230083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson    return S;
23018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
23028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2303b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby  if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<26>(imm) + 8,
2304b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby                                true, 4, Inst, Decoder))
23056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(SignExtend32<26>(imm)));
2306a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2307a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
23088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
230983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
23108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
23118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
23128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2313c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val,
23148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
2315a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
231683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2317fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val, 0, 4);
2318fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned align = fieldFromInstruction(Val, 4, 2);
23198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2320a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2321a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
23228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (!align)
23236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(0));
23248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  else
23256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(4 << align));
23268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
232783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
23288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
23298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2330c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Insn,
23318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
2332a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
233383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2334fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2335fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
2336fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned wb = fieldFromInstruction(Insn, 16, 4);
2337fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2338fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rn |= fieldFromInstruction(Insn, 4, 2) << 4;
2339fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
23408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
23418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // First output register
234228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  switch (Inst.getOpcode()) {
2343c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1q16: case ARM::VLD1q32: case ARM::VLD1q64: case ARM::VLD1q8:
2344c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1q16wb_fixed: case ARM::VLD1q16wb_register:
2345c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1q32wb_fixed: case ARM::VLD1q32wb_register:
2346c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1q64wb_fixed: case ARM::VLD1q64wb_register:
2347c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1q8wb_fixed: case ARM::VLD1q8wb_register:
2348c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2d16: case ARM::VLD2d32: case ARM::VLD2d8:
2349c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2d16wb_fixed: case ARM::VLD2d16wb_register:
2350c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2d32wb_fixed: case ARM::VLD2d32wb_register:
2351c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2d8wb_fixed: case ARM::VLD2d8wb_register:
235228f08c93e75d291695ea89b9004145103292e85bJim Grosbach    if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
235328f08c93e75d291695ea89b9004145103292e85bJim Grosbach      return MCDisassembler::Fail;
235428f08c93e75d291695ea89b9004145103292e85bJim Grosbach    break;
2355c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b16:
2356c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b32:
2357c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b8:
2358c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b16wb_fixed:
2359c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b16wb_register:
2360c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b32wb_fixed:
2361c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b32wb_register:
2362c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b8wb_fixed:
2363c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VLD2b8wb_register:
2364c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach    if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
2365c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach      return MCDisassembler::Fail;
2366c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach    break;
236728f08c93e75d291695ea89b9004145103292e85bJim Grosbach  default:
236828f08c93e75d291695ea89b9004145103292e85bJim Grosbach    if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
236928f08c93e75d291695ea89b9004145103292e85bJim Grosbach      return MCDisassembler::Fail;
237028f08c93e75d291695ea89b9004145103292e85bJim Grosbach  }
23718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
23728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Second output register
23738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
23748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d8:
23758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d16:
23768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d32:
23778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d8_UPD:
23788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d16_UPD:
23798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d32_UPD:
23808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8:
23818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16:
23828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32:
23838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8_UPD:
23848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16_UPD:
23858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32_UPD:
2386a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
2387a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
23888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
23898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q8:
23908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q16:
23918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q32:
23928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q8_UPD:
23938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q16_UPD:
23948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q32_UPD:
23958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8:
23968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16:
23978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32:
23988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8_UPD:
23998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16_UPD:
24008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32_UPD:
2401a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2402a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
24038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
24048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24058d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
24068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
24078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Third output register
24088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch(Inst.getOpcode()) {
24098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d8:
24108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d16:
24118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d32:
24128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d8_UPD:
24138d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d16_UPD:
24148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d32_UPD:
24158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8:
24168d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16:
24178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32:
24188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8_UPD:
24198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16_UPD:
24208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32_UPD:
2421a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2422a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
24238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q8:
24258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q16:
24268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q32:
24278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q8_UPD:
24288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q16_UPD:
24298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q32_UPD:
24308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8:
24318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16:
24328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32:
24338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8_UPD:
24348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16_UPD:
24358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32_UPD:
2436a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
2437a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
24388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
24408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
24428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
24438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Fourth output register
24448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
24458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8:
24468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16:
24478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32:
24488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8_UPD:
24498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16_UPD:
24508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32_UPD:
2451a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
2452a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
24538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8:
24558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16:
24568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32:
24578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8_UPD:
24588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16_UPD:
24598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32_UPD:
2460a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
2461a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
24628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
24648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
24658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
24668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
24678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Writeback operand
24688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
246910b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d8wb_fixed:
247010b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d16wb_fixed:
247110b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d32wb_fixed:
247210b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d64wb_fixed:
247310b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d8wb_register:
247410b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d16wb_register:
247510b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d32wb_register:
247610b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1d64wb_register:
247710b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q8wb_fixed:
247810b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q16wb_fixed:
247910b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q32wb_fixed:
248010b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q64wb_fixed:
248110b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q8wb_register:
248210b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q16wb_register:
248310b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q32wb_register:
248410b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    case ARM::VLD1q64wb_register:
24855921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d8Twb_fixed:
24865921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d8Twb_register:
24875921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d16Twb_fixed:
24885921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d16Twb_register:
24895921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d32Twb_fixed:
24905921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d32Twb_register:
24915921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d64Twb_fixed:
24925921675ff5ea632ab1e6d7aa5d1f263b858bbafaJim Grosbach    case ARM::VLD1d64Twb_register:
2493399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d8Qwb_fixed:
2494399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d8Qwb_register:
2495399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d16Qwb_fixed:
2496399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d16Qwb_register:
2497399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d32Qwb_fixed:
2498399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d32Qwb_register:
2499399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d64Qwb_fixed:
2500399cdca4d201f7232126c3a0643669971ede780aJim Grosbach    case ARM::VLD1d64Qwb_register:
2501a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2d8wb_fixed:
2502a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2d16wb_fixed:
2503a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2d32wb_fixed:
2504a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2q8wb_fixed:
2505a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2q16wb_fixed:
2506a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2q32wb_fixed:
2507a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2d8wb_register:
2508a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2d16wb_register:
2509a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2d32wb_register:
2510a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2q8wb_register:
2511a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2q16wb_register:
2512a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2q32wb_register:
2513a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2b8wb_fixed:
2514a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2b16wb_fixed:
2515a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2b32wb_fixed:
2516a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2b8wb_register:
2517a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2b16wb_register:
2518a4e3c7fc4ba2d55695b0484480685698132eba20Jim Grosbach    case ARM::VLD2b32wb_register:
25196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createImm(0));
2520a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby      break;
25218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d8_UPD:
25228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d16_UPD:
25238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3d32_UPD:
25248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q8_UPD:
25258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q16_UPD:
25268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD3q32_UPD:
25278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d8_UPD:
25288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d16_UPD:
25298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4d32_UPD:
25308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q8_UPD:
25318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q16_UPD:
25328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VLD4q32_UPD:
2533a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
2534a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
25358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
25368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
25378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
25388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
25398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
25408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // AddrMode6 Base (register+alignment)
2541a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
2542a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
25438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
25448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // AddrMode6 Offset (register)
254510b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  switch (Inst.getOpcode()) {
254610b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  default:
254710b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // The below have been updated to have explicit am6offset split
254810b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // between fixed and register offset. For those instructions not
254910b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // yet updated, we need to add an additional reg0 operand for the
255010b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // fixed variant.
255110b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    //
255210b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // The fixed offset encodes as Rm == 0xd, so we check for that.
255310b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    if (Rm == 0xd) {
25546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
255510b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach      break;
255610b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    }
255710b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // Fall through to handle the register offset variant.
255810b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d8wb_fixed:
255910b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d16wb_fixed:
256010b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d32wb_fixed:
256110b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d64wb_fixed:
256204b12a4cfb74ac65ea86d57bde5999ef6ab09ad4Owen Anderson  case ARM::VLD1d8Twb_fixed:
256304b12a4cfb74ac65ea86d57bde5999ef6ab09ad4Owen Anderson  case ARM::VLD1d16Twb_fixed:
256404b12a4cfb74ac65ea86d57bde5999ef6ab09ad4Owen Anderson  case ARM::VLD1d32Twb_fixed:
256504b12a4cfb74ac65ea86d57bde5999ef6ab09ad4Owen Anderson  case ARM::VLD1d64Twb_fixed:
2566fb6ab2b30e822d292c557bda32f7eb0acd1004e2Owen Anderson  case ARM::VLD1d8Qwb_fixed:
2567fb6ab2b30e822d292c557bda32f7eb0acd1004e2Owen Anderson  case ARM::VLD1d16Qwb_fixed:
2568fb6ab2b30e822d292c557bda32f7eb0acd1004e2Owen Anderson  case ARM::VLD1d32Qwb_fixed:
2569fb6ab2b30e822d292c557bda32f7eb0acd1004e2Owen Anderson  case ARM::VLD1d64Qwb_fixed:
257010b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d8wb_register:
257110b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d16wb_register:
257210b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d32wb_register:
257310b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1d64wb_register:
257410b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q8wb_fixed:
257510b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q16wb_fixed:
257610b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q32wb_fixed:
257710b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q64wb_fixed:
257810b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q8wb_register:
257910b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q16wb_register:
258010b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q32wb_register:
258110b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach  case ARM::VLD1q64wb_register:
258210b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
258310b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // variant encodes Rm == 0xf. Anything else is a register offset post-
258410b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    // increment and we need to add the register operand to the instruction.
258510b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    if (Rm != 0xD && Rm != 0xF &&
258610b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach        !Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2587a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
258810b90a9bbf7dcae1568c03a03f9606f5395f2144Jim Grosbach    break;
2589a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2d8wb_fixed:
2590a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2d16wb_fixed:
2591a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2d32wb_fixed:
2592a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2b8wb_fixed:
2593a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2b16wb_fixed:
2594a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2b32wb_fixed:
2595a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2q8wb_fixed:
2596a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2q16wb_fixed:
2597a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby  case ARM::VLD2q32wb_fixed:
2598a69da35c127dd7e35ae6216d965670643dc55bb6Kevin Enderby    break;
2599ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
26008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
260183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
26028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
26038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2604aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST1Instruction(MCInst &Inst, unsigned Insn,
2605aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville                                   uint64_t Address, const void *Decoder) {
260630a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned type = fieldFromInstruction(Insn, 8, 4);
260730a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned align = fieldFromInstruction(Insn, 4, 2);
2608aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (type == 6 && (align & 2)) return MCDisassembler::Fail;
2609aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (type == 7 && (align & 2)) return MCDisassembler::Fail;
2610aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (type == 10 && align == 3) return MCDisassembler::Fail;
2611aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville
2612aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  unsigned load = fieldFromInstruction(Insn, 21, 1);
2613aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2614aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville              : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
261530a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa}
261630a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
2617aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST2Instruction(MCInst &Inst, unsigned Insn,
2618aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville                                   uint64_t Address, const void *Decoder) {
261930a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned size = fieldFromInstruction(Insn, 6, 2);
2620aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (size == 3) return MCDisassembler::Fail;
262130a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
262230a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned type = fieldFromInstruction(Insn, 8, 4);
262330a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned align = fieldFromInstruction(Insn, 4, 2);
2624aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (type == 8 && align == 3) return MCDisassembler::Fail;
2625aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (type == 9 && align == 3) return MCDisassembler::Fail;
2626aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville
2627aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  unsigned load = fieldFromInstruction(Insn, 21, 1);
2628aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2629aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville              : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
263030a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa}
263130a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
2632aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST3Instruction(MCInst &Inst, unsigned Insn,
2633aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville                                   uint64_t Address, const void *Decoder) {
263430a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned size = fieldFromInstruction(Insn, 6, 2);
2635aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (size == 3) return MCDisassembler::Fail;
263630a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
263730a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned align = fieldFromInstruction(Insn, 4, 2);
2638aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (align & 2) return MCDisassembler::Fail;
263930a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
2640aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  unsigned load = fieldFromInstruction(Insn, 21, 1);
2641aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2642aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville              : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
264330a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa}
264430a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
2645aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuvillestatic DecodeStatus DecodeVLDST4Instruction(MCInst &Inst, unsigned Insn,
2646aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville                                   uint64_t Address, const void *Decoder) {
264730a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa  unsigned size = fieldFromInstruction(Insn, 6, 2);
2648aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  if (size == 3) return MCDisassembler::Fail;
264930a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
2650aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  unsigned load = fieldFromInstruction(Insn, 21, 1);
2651aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder)
2652aa8003712e8b28bc4f263aeb79d8851146273a05Amaury de la Vieuville              : DecodeVSTInstruction(Inst, Insn, Address, Decoder);
265330a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa}
265430a7a7c1fdbd2607345dd1554e3436749fd75c6eMihai Popa
2655c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Insn,
26568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
2657a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
265883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2659fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2660fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
2661fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned wb = fieldFromInstruction(Insn, 16, 4);
2662fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2663fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rn |= fieldFromInstruction(Insn, 4, 2) << 4;
2664fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
26658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
26668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Writeback Operand
26678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
26684334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d8wb_fixed:
26694334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d16wb_fixed:
26704334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d32wb_fixed:
26714334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d64wb_fixed:
26724334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d8wb_register:
26734334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d16wb_register:
26744334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d32wb_register:
26754334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1d64wb_register:
26764334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q8wb_fixed:
26774334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q16wb_fixed:
26784334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q32wb_fixed:
26794334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q64wb_fixed:
26804334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q8wb_register:
26814334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q16wb_register:
26824334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q32wb_register:
26834334e032525d6c9038605f3871b945e8cbe6fab7Jim Grosbach    case ARM::VST1q64wb_register:
2684d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d8Twb_fixed:
2685d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d16Twb_fixed:
2686d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d32Twb_fixed:
2687d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d64Twb_fixed:
2688d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d8Twb_register:
2689d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d16Twb_register:
2690d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d32Twb_register:
2691d5ca201891d238ca2185831524a1e3f2670224dfJim Grosbach    case ARM::VST1d64Twb_register:
26924c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d8Qwb_fixed:
26934c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d16Qwb_fixed:
26944c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d32Qwb_fixed:
26954c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d64Qwb_fixed:
26964c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d8Qwb_register:
26974c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d16Qwb_register:
26984c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d32Qwb_register:
26994c7edb3ad8bd513c59190f6ebee9bee34af7d247Jim Grosbach    case ARM::VST1d64Qwb_register:
2700bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2d8wb_fixed:
2701bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2d16wb_fixed:
2702bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2d32wb_fixed:
2703bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2d8wb_register:
2704bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2d16wb_register:
2705bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2d32wb_register:
2706bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2q8wb_fixed:
2707bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2q16wb_fixed:
2708bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2q32wb_fixed:
2709bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2q8wb_register:
2710bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2q16wb_register:
2711bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2q32wb_register:
2712bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2b8wb_fixed:
2713bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2b16wb_fixed:
2714bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2b32wb_fixed:
2715bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2b8wb_register:
2716bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2b16wb_register:
2717bb3a2e4d0defc6854d37384d80858037dbbc5f20Jim Grosbach    case ARM::VST2b32wb_register:
2718b318cc16c9e959adb96294b3aa4940e74f68dde3Kevin Enderby      if (Rm == 0xF)
2719b318cc16c9e959adb96294b3aa4940e74f68dde3Kevin Enderby        return MCDisassembler::Fail;
27206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createImm(0));
2721f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby      break;
27228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d8_UPD:
27238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d16_UPD:
27248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d32_UPD:
27258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q8_UPD:
27268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q16_UPD:
27278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q32_UPD:
27288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8_UPD:
27298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16_UPD:
27308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32_UPD:
27318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8_UPD:
27328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16_UPD:
27338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32_UPD:
2734a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
2735a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
27368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
27378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
27388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
27398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
27408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
27418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // AddrMode6 Base (register+alignment)
2742a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
2743a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
27448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
27458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // AddrMode6 Offset (register)
274660cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson  switch (Inst.getOpcode()) {
274760cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    default:
274860cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson      if (Rm == 0xD)
27496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Inst.addOperand(MCOperand::createReg(0));
275060cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson      else if (Rm != 0xF) {
275160cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson        if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
275260cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson          return MCDisassembler::Fail;
275360cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson      }
275460cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson      break;
275560cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1d8wb_fixed:
275660cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1d16wb_fixed:
275760cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1d32wb_fixed:
275860cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1d64wb_fixed:
275960cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1q8wb_fixed:
276060cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1q16wb_fixed:
276160cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1q32wb_fixed:
276260cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson    case ARM::VST1q64wb_fixed:
2763f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d8Twb_fixed:
2764f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d16Twb_fixed:
2765f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d32Twb_fixed:
2766f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d64Twb_fixed:
2767f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d8Qwb_fixed:
2768f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d16Qwb_fixed:
2769f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d32Qwb_fixed:
2770f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST1d64Qwb_fixed:
2771f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2d8wb_fixed:
2772f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2d16wb_fixed:
2773f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2d32wb_fixed:
2774f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2q8wb_fixed:
2775f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2q16wb_fixed:
2776f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2q32wb_fixed:
2777f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2b8wb_fixed:
2778f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2b16wb_fixed:
2779f0586f08dfd5bf1889c15849e9c603b3985fce4aKevin Enderby    case ARM::VST2b32wb_fixed:
278060cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson      break;
2781ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
27828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
278360cb643f7561e5be7a3b5fe705535e96de72cbf5Owen Anderson
27848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // First input register
278528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  switch (Inst.getOpcode()) {
278628f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q16:
278728f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q32:
278828f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q64:
278928f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q8:
279028f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q16wb_fixed:
279128f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q16wb_register:
279228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q32wb_fixed:
279328f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q32wb_register:
279428f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q64wb_fixed:
279528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q64wb_register:
279628f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q8wb_fixed:
279728f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST1q8wb_register:
279828f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d16:
279928f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d32:
280028f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d8:
280128f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d16wb_fixed:
280228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d16wb_register:
280328f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d32wb_fixed:
280428f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d32wb_register:
280528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d8wb_fixed:
280628f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VST2d8wb_register:
280728f08c93e75d291695ea89b9004145103292e85bJim Grosbach    if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
280828f08c93e75d291695ea89b9004145103292e85bJim Grosbach      return MCDisassembler::Fail;
280928f08c93e75d291695ea89b9004145103292e85bJim Grosbach    break;
2810c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b16:
2811c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b32:
2812c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b8:
2813c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b16wb_fixed:
2814c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b16wb_register:
2815c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b32wb_fixed:
2816c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b32wb_register:
2817c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b8wb_fixed:
2818c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach  case ARM::VST2b8wb_register:
2819c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach    if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
2820c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach      return MCDisassembler::Fail;
2821c3384c93c0e4c50da4ad093f08997507f9281c75Jim Grosbach    break;
282228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  default:
282328f08c93e75d291695ea89b9004145103292e85bJim Grosbach    if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
282428f08c93e75d291695ea89b9004145103292e85bJim Grosbach      return MCDisassembler::Fail;
282528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  }
28268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
28278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Second input register
28288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
28298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d8:
28308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d16:
28318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d32:
28328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d8_UPD:
28338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d16_UPD:
28348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d32_UPD:
28358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8:
28368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16:
28378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32:
28388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8_UPD:
28398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16_UPD:
28408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32_UPD:
2841a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
2842a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
28438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
28448d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q8:
28458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q16:
28468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q32:
28478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q8_UPD:
28488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q16_UPD:
28498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q32_UPD:
28508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8:
28518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16:
28528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32:
28538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8_UPD:
28548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16_UPD:
28558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32_UPD:
2856a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2857a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
28588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
28598d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
28608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
28618d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
28628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
28638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Third input register
28648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
28658d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d8:
28668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d16:
28678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d32:
28688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d8_UPD:
28698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d16_UPD:
28708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3d32_UPD:
28718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8:
28728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16:
28738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32:
28748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8_UPD:
28758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16_UPD:
28768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32_UPD:
2877a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2878a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
28798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
28808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q8:
28818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q16:
28828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q32:
28838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q8_UPD:
28848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q16_UPD:
28858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST3q32_UPD:
28868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8:
28878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16:
28888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32:
28898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8_UPD:
28908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16_UPD:
28918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32_UPD:
2892a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
2893a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
28948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
28958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
28968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
28978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
28988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
28998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Fourth input register
29008d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
29018d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8:
29028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16:
29038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32:
29048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d8_UPD:
29058d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d16_UPD:
29068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4d32_UPD:
2907a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
2908a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
29098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
29108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8:
29118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16:
29128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32:
29138d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q8_UPD:
29148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q16_UPD:
29158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VST4q32_UPD:
2916a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
2917a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
29188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
29198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
29208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
29218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
29228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
292383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
29248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
29258d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2926c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Insn,
29278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                    uint64_t Address, const void *Decoder) {
2928a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
292983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2930fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2931fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
2932fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2933fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2934fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned align = fieldFromInstruction(Insn, 4, 1);
2935fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 6, 2);
29368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
293724b9f258f194c5e472bf133f9bbf5ca26ad500d3Tim Northover  if (size == 0 && align == 1)
293824b9f258f194c5e472bf133f9bbf5ca26ad500d3Tim Northover    return MCDisassembler::Fail;
29398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  align *= (1 << size);
29408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2941c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  switch (Inst.getOpcode()) {
2942c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1DUPq16: case ARM::VLD1DUPq32: case ARM::VLD1DUPq8:
2943c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1DUPq16wb_fixed: case ARM::VLD1DUPq16wb_register:
2944c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1DUPq32wb_fixed: case ARM::VLD1DUPq32wb_register:
2945c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD1DUPq8wb_fixed: case ARM::VLD1DUPq8wb_register:
2946c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2947c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach      return MCDisassembler::Fail;
2948c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    break;
2949c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  default:
2950c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2951c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach      return MCDisassembler::Fail;
2952c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    break;
2953c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  }
2954f1c8e3e70e222365b84f4cb7e87396ee85820711Owen Anderson  if (Rm != 0xF) {
2955a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2956a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
2957ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
29588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2959a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2960a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
29616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
29628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2963096334e25ea68ac970942ecb680a82fbb8ad206cJim Grosbach  // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
2964096334e25ea68ac970942ecb680a82fbb8ad206cJim Grosbach  // variant encodes Rm == 0xf. Anything else is a register offset post-
2965096334e25ea68ac970942ecb680a82fbb8ad206cJim Grosbach  // increment and we need to add the register operand to the instruction.
2966096334e25ea68ac970942ecb680a82fbb8ad206cJim Grosbach  if (Rm != 0xD && Rm != 0xF &&
2967096334e25ea68ac970942ecb680a82fbb8ad206cJim Grosbach      !Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2968096334e25ea68ac970942ecb680a82fbb8ad206cJim Grosbach    return MCDisassembler::Fail;
29698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
297083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
29718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
29728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2973c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Insn,
29748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                    uint64_t Address, const void *Decoder) {
2975a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
297683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
2977fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
2978fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
2979fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
2980fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
2981fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned align = fieldFromInstruction(Insn, 4, 1);
2982fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = 1 << fieldFromInstruction(Insn, 6, 2);
29838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  align *= 2*size;
29848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
2985c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  switch (Inst.getOpcode()) {
2986c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2DUPd16: case ARM::VLD2DUPd32: case ARM::VLD2DUPd8:
2987c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2DUPd16wb_fixed: case ARM::VLD2DUPd16wb_register:
2988c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2DUPd32wb_fixed: case ARM::VLD2DUPd32wb_register:
2989c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  case ARM::VLD2DUPd8wb_fixed: case ARM::VLD2DUPd8wb_register:
2990c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2991c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach      return MCDisassembler::Fail;
2992c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    break;
29934d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach  case ARM::VLD2DUPd16x2: case ARM::VLD2DUPd32x2: case ARM::VLD2DUPd8x2:
29944d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach  case ARM::VLD2DUPd16x2wb_fixed: case ARM::VLD2DUPd16x2wb_register:
29954d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach  case ARM::VLD2DUPd32x2wb_fixed: case ARM::VLD2DUPd32x2wb_register:
29964d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach  case ARM::VLD2DUPd8x2wb_fixed: case ARM::VLD2DUPd8x2wb_register:
29974d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach    if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
29984d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach      return MCDisassembler::Fail;
29994d0983a4d734280d481bb56472fe44ad0ddc447dJim Grosbach    break;
3000c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  default:
3001c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3002c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach      return MCDisassembler::Fail;
3003c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach    break;
3004c0fc450f0754508871bc70f21e528bf2f1520da1Jim Grosbach  }
3005158c8a49c23d01297e7913c03c1fdb0760aee3a8Kevin Enderby
3006158c8a49c23d01297e7913c03c1fdb0760aee3a8Kevin Enderby  if (Rm != 0xF)
30076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(0));
30088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3009a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3010a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
30116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
30128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3013c5a2a33938182ccc5a1a94f7e1e2b3fdaff6a8b1Kevin Enderby  if (Rm != 0xD && Rm != 0xF) {
3014a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3015a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
3016ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
30178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
301883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
30198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
30208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3021c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Insn,
30228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                    uint64_t Address, const void *Decoder) {
3023a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
302483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3025fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3026fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3027fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3028fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3029fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned inc = fieldFromInstruction(Insn, 5, 1) + 1;
30308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3031a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3032a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3033a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
3034a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3035a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
3036a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3037f1c8e3e70e222365b84f4cb7e87396ee85820711Owen Anderson  if (Rm != 0xF) {
3038a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3039a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
3040ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
30418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3042a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3043a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
30446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(0));
30458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
30468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Rm == 0xD)
30476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(0));
3048ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  else if (Rm != 0xF) {
3049a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3050a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
3051ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
30528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
305383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
30548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
30558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3056c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Insn,
30578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                    uint64_t Address, const void *Decoder) {
3058a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
305983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3060fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3061fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3062fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3063fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3064fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 6, 2);
3065fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned inc = fieldFromInstruction(Insn, 5, 1) + 1;
3066fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned align = fieldFromInstruction(Insn, 4, 1);
30678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
30688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (size == 0x3) {
306924b9f258f194c5e472bf133f9bbf5ca26ad500d3Tim Northover    if (align == 0)
307024b9f258f194c5e472bf133f9bbf5ca26ad500d3Tim Northover      return MCDisassembler::Fail;
30718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    align = 16;
30728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  } else {
30738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    if (size == 2) {
30748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      align *= 8;
30758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    } else {
30768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      size = 1 << size;
30778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      align *= 4*size;
30788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
30798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
30808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3081a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3082a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3083a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
3084a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3085a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
3086a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3087a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3*inc)%32, Address, Decoder)))
3088a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3089f1c8e3e70e222365b84f4cb7e87396ee85820711Owen Anderson  if (Rm != 0xF) {
3090a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3091a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
3092ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
30938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3094a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3095a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
30966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
30978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
30988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Rm == 0xD)
30996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(0));
3100ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  else if (Rm != 0xF) {
3101a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3102a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
3103ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
31048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
310583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
31068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3108a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
3109c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeNEONModImmInstruction(MCInst &Inst, unsigned Insn,
3110c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                            uint64_t Address, const void *Decoder) {
3111a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
311283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3113fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3114fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3115fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 4);
3116fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 16, 3) << 4;
3117fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 24, 1) << 7;
3118fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 8, 4) << 8;
3119fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 5, 1) << 12;
3120fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Q = fieldFromInstruction(Insn, 6, 1);
31218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3122ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  if (Q) {
3123a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3124a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3125ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  } else {
3126a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3127a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3128ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
31298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
31306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
31318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
31328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
31338d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VORRiv4i16:
31348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VORRiv2i32:
31358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VBICiv4i16:
31368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VBICiv2i32:
3137a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3138a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
31398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
31408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VORRiv8i16:
31418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VORRiv4i32:
31428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VBICiv8i16:
31438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::VBICiv4i32:
3144a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3145a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
31468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
31478d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
31488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
31498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
31508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
315183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
31528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31538d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3154c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Insn,
31558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                        uint64_t Address, const void *Decoder) {
3156a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
315783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3158fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3159fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3160fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3161fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rm |= fieldFromInstruction(Insn, 5, 1) << 4;
3162fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 18, 2);
31638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3164a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3165a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3166a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3167a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
31686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(8 << size));
31698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
317083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
31718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3173c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val,
31748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
31756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(8 - Val));
3176c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
31778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3179c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val,
31808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
31816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(16 - Val));
3182c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
31838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3185c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val,
31868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
31876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(32 - Val));
3188c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
31898d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31908d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3191c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val,
31928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
31936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(64 - Val));
3194c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
31958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
31968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3197c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
31988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                               uint64_t Address, const void *Decoder) {
3199a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
320083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3201fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
3202fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
3203fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3204fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rn |= fieldFromInstruction(Insn, 7, 1) << 4;
3205fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3206fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rm |= fieldFromInstruction(Insn, 5, 1) << 4;
3207fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned op = fieldFromInstruction(Insn, 6, 1);
32088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3209a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3210a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3211ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  if (op) {
3212a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3213a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail; // Writeback
3214ae0bc5deaa30f1e20a6189e42ca412ba27ec7153Owen Anderson  }
32158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
321628f08c93e75d291695ea89b9004145103292e85bJim Grosbach  switch (Inst.getOpcode()) {
321728f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VTBL2:
321828f08c93e75d291695ea89b9004145103292e85bJim Grosbach  case ARM::VTBX2:
321928f08c93e75d291695ea89b9004145103292e85bJim Grosbach    if (!Check(S, DecodeDPairRegisterClass(Inst, Rn, Address, Decoder)))
322028f08c93e75d291695ea89b9004145103292e85bJim Grosbach      return MCDisassembler::Fail;
322128f08c93e75d291695ea89b9004145103292e85bJim Grosbach    break;
322228f08c93e75d291695ea89b9004145103292e85bJim Grosbach  default:
322328f08c93e75d291695ea89b9004145103292e85bJim Grosbach    if (!Check(S, DecodeDPRRegisterClass(Inst, Rn, Address, Decoder)))
322428f08c93e75d291695ea89b9004145103292e85bJim Grosbach      return MCDisassembler::Fail;
322528f08c93e75d291695ea89b9004145103292e85bJim Grosbach  }
32268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3227a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3228a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
32298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
323083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
32318d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
32328d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3233c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn,
32348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                     uint64_t Address, const void *Decoder) {
3235a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
323683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3237fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned dst = fieldFromInstruction(Insn, 8, 3);
3238fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 8);
32398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3240a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
3241a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
32428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
324396425c846494c1c20a4c931f4783571295ab170cOwen Anderson  switch(Inst.getOpcode()) {
32441af7f7291d0689e2d58f900c9b5ecaddec56caa1Owen Anderson    default:
3245c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
324696425c846494c1c20a4c931f4783571295ab170cOwen Anderson    case ARM::tADR:
32479f7e8319947c65d9aef2a0f0984557c3b3a20656Owen Anderson      break; // tADR does not explicitly represent the PC as an operand.
324896425c846494c1c20a4c931f4783571295ab170cOwen Anderson    case ARM::tADDrSPi:
32496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(ARM::SP));
325096425c846494c1c20a4c931f4783571295ab170cOwen Anderson      break;
325196425c846494c1c20a4c931f4783571295ab170cOwen Anderson  }
32528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
32536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
325483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
32558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
32568d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3257c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val,
32588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
32592a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby  if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<12>(Val<<1) + 4,
32602a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                                true, 2, Inst, Decoder))
32616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(SignExtend32<12>(Val << 1)));
3262c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
32638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
32648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3265c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val,
32668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
32673610a15c3581dee713820f72d8ffe2e2a632b057Kevin Enderby  if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<21>(Val) + 4,
32682a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                                true, 4, Inst, Decoder))
32696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(SignExtend32<21>(Val)));
3270c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
32718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
32728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3273c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val,
32748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
3275ce888351106a72825e2a107cb08d7130f3dce0eeGordon Keiser  if (!tryAddingSymbolicOperand(Address, Address + (Val<<1) + 4,
32762a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                                true, 2, Inst, Decoder))
32776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(Val << 1));
3278c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
32798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
32808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3281c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val,
32828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                 uint64_t Address, const void *Decoder) {
3283a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
328483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3285fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 0, 3);
3286fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val, 3, 3);
32878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3288a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
3289a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3290a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
3291a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
32928d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
329383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
32948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
32958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3296c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val,
32978d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
3298a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
329983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3300fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 0, 3);
3301fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 3, 5);
33028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3303a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
3304a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
33056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
33068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
330783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
33088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
33098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3310c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val,
33118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
33129e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  unsigned imm = Val << 2;
33139e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby
33146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
33159e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby  tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4, Decoder);
33168d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3317c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
33188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
33198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3320c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val,
33218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
33226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(ARM::SP));
33236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
33248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3325c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
33268d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
33278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3328c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val,
33298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                  uint64_t Address, const void *Decoder) {
3330a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
333183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3332fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 6, 4);
3333fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val, 2, 4);
3334fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 2);
33358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3336cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  // Thumb stores cannot use PC as dest register.
3337cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  switch (Inst.getOpcode()) {
3338cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRHs:
3339cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRBs:
3340cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRs:
3341cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    if (Rn == 15)
3342cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville      return MCDisassembler::Fail;
3343cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  default:
3344cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    break;
3345cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  }
3346cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville
3347a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3348a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3349a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
3350a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
33516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
33528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
335383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
33548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
33558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3356c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Insn,
33578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                              uint64_t Address, const void *Decoder) {
3358a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
335983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3360ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
3361fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3362ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
33636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
33646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
33656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
33666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasMP = featureBits[ARM::FeatureMP];
33676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasV7Ops = featureBits[ARM::HasV7Ops];
336837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
33690c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  if (Rn == 15) {
33708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    switch (Inst.getOpcode()) {
33710c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRBs:
33720c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRBpci);
33730c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33740c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRHs:
33750c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRHpci);
33760c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33770c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRSHs:
33780c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSHpci);
33790c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33800c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRSBs:
33810c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSBpci);
33820c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33830c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRs:
33840c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRpci);
33850c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33860c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2PLDs:
33870c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLDpci);
33880c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33890c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2PLIs:
33900c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLIpci);
33910c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
33920c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    default:
33930c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      return MCDisassembler::Fail;
33948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
33958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3396ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3397ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
33988d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
33990c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  if (Rt == 15) {
34000c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    switch (Inst.getOpcode()) {
34010c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRSHs:
34020c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      return MCDisassembler::Fail;
34030c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRHs:
34040c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLDWs);
34050c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
340637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case ARM::t2LDRSBs:
340737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Inst.setOpcode(ARM::t2PLIs);
34080c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    default:
34090c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
34100c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    }
34110c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  }
34120c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville
3413ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  switch (Inst.getOpcode()) {
3414ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2PLDs:
341537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
3416ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2PLIs:
341737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!hasV7Ops)
341837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MCDisassembler::Fail;
341937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
342037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case ARM::t2PLDWs:
342137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!hasV7Ops || !hasMP)
342237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MCDisassembler::Fail;
3423ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3424ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    default:
3425ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3426ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville        return MCDisassembler::Fail;
34278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
34288d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3429fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned addrmode = fieldFromInstruction(Insn, 4, 2);
3430fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  addrmode |= fieldFromInstruction(Insn, 0, 4) << 2;
3431fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  addrmode |= fieldFromInstruction(Insn, 16, 4) << 6;
3432a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
3433a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
34348d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
343583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
34368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
34378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3438ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadImm8(MCInst &Inst, unsigned Insn,
3439ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                                uint64_t Address, const void* Decoder) {
3440ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
3441ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3442ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3443ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
3444ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned U = fieldFromInstruction(Insn, 9, 1);
3445ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned imm = fieldFromInstruction(Insn, 0, 8);
3446ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  imm |= (U << 8);
3447ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  imm |= (Rn << 9);
344837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned add = fieldFromInstruction(Insn, 9, 1);
344937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
34506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
34516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
34526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
34536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasMP = featureBits[ARM::FeatureMP];
34546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasV7Ops = featureBits[ARM::HasV7Ops];
3455ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3456ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (Rn == 15) {
3457ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    switch (Inst.getOpcode()) {
3458ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRi8:
3459ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRpci);
3460ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3461ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRBi8:
3462ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRBpci);
3463ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3464ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSBi8:
3465ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSBpci);
3466ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3467ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRHi8:
3468ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRHpci);
3469ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3470ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSHi8:
3471ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSHpci);
3472ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
34730c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2PLDi8:
34740c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLDpci);
34750c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
34760c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2PLIi8:
34770c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLIpci);
34780c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
3479ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    default:
3480ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      return MCDisassembler::Fail;
3481ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    }
3482ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3483ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
3484ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
34850c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  if (Rt == 15) {
34860c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    switch (Inst.getOpcode()) {
34870c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRSHi8:
34880c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      return MCDisassembler::Fail;
348937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case ARM::t2LDRHi8:
349037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!add)
349137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        Inst.setOpcode(ARM::t2PLDWi8);
349237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
349337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case ARM::t2LDRSBi8:
349437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Inst.setOpcode(ARM::t2PLIi8);
349537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
34960c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    default:
34970c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
34980c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    }
34990c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  }
35000c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville
35010c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  switch (Inst.getOpcode()) {
35020c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  case ARM::t2PLDi8:
350337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    break;
35040c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  case ARM::t2PLIi8:
350537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!hasV7Ops)
350637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::Fail;
35070c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    break;
350837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  case ARM::t2PLDWi8:
350937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!hasV7Ops || !hasMP)
351037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MCDisassembler::Fail;
351137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
35120c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  default:
35130c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
35140c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      return MCDisassembler::Fail;
35150c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  }
35160c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville
3517ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (!Check(S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
3518ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return MCDisassembler::Fail;
3519ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  return S;
3520ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville}
3521ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3522ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadImm12(MCInst &Inst, unsigned Insn,
3523ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                                uint64_t Address, const void* Decoder) {
3524ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
3525ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3526ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3527ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
3528ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned imm = fieldFromInstruction(Insn, 0, 12);
3529ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  imm |= (Rn << 13);
3530ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
35316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
35326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
35336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
35346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasMP = featureBits[ARM::FeatureMP];
35356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasV7Ops = featureBits[ARM::HasV7Ops];
353637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3537ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (Rn == 15) {
3538ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    switch (Inst.getOpcode()) {
3539ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRi12:
3540ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRpci);
3541ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3542ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRHi12:
3543ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRHpci);
3544ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3545ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSHi12:
3546ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSHpci);
3547ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3548ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRBi12:
3549ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRBpci);
3550ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3551ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSBi12:
3552ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSBpci);
3553ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
35540c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2PLDi12:
35550c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLDpci);
35560c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
35570c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2PLIi12:
35580c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      Inst.setOpcode(ARM::t2PLIpci);
35590c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
3560ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    default:
3561ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      return MCDisassembler::Fail;
3562ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    }
3563ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3564ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
3565ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
35660c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  if (Rt == 15) {
35670c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    switch (Inst.getOpcode()) {
35680c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRSHi12:
35690c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      return MCDisassembler::Fail;
35700c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    case ARM::t2LDRHi12:
357137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Inst.setOpcode(ARM::t2PLDWi12);
357237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
357337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case ARM::t2LDRSBi12:
357437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Inst.setOpcode(ARM::t2PLIi12);
35750c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
35760c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    default:
35770c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      break;
35780c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    }
35790c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  }
35800c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville
35810c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  switch (Inst.getOpcode()) {
35820c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  case ARM::t2PLDi12:
358337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    break;
35840c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  case ARM::t2PLIi12:
358537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!hasV7Ops)
358637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::Fail;
35870c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    break;
358837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  case ARM::t2PLDWi12:
358937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!hasV7Ops || !hasMP)
359037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MCDisassembler::Fail;
359137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
35920c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  default:
35930c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
35940c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      return MCDisassembler::Fail;
35950c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  }
35960c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville
3597ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (!Check(S, DecodeT2AddrModeImm12(Inst, imm, Address, Decoder)))
3598ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return MCDisassembler::Fail;
3599ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  return S;
3600ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville}
3601ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3602ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadT(MCInst &Inst, unsigned Insn,
3603ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                                uint64_t Address, const void* Decoder) {
3604ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
3605ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3606ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3607ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
3608ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned imm = fieldFromInstruction(Insn, 0, 8);
3609ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  imm |= (Rn << 9);
3610ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3611ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (Rn == 15) {
3612ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    switch (Inst.getOpcode()) {
3613ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRT:
3614ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRpci);
3615ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3616ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRBT:
3617ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRBpci);
3618ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3619ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRHT:
3620ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRHpci);
3621ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3622ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSBT:
3623ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSBpci);
3624ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3625ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSHT:
3626ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSHpci);
3627ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3628ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    default:
3629ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      return MCDisassembler::Fail;
3630ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    }
3631ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3632ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
3633ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3634ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
3635ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return MCDisassembler::Fail;
3636ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (!Check(S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
3637ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return MCDisassembler::Fail;
3638ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  return S;
3639ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville}
3640ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3641ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuvillestatic DecodeStatus DecodeT2LoadLabel(MCInst &Inst, unsigned Insn,
3642ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville                                uint64_t Address, const void* Decoder) {
3643ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  DecodeStatus S = MCDisassembler::Success;
3644ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3645ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
3646ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  unsigned U = fieldFromInstruction(Insn, 23, 1);
3647ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  int imm = fieldFromInstruction(Insn, 0, 12);
3648ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
36496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
36506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
36516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
36526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasV7Ops = featureBits[ARM::HasV7Ops];
365337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
36540c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  if (Rt == 15) {
36550c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    switch (Inst.getOpcode()) {
36560c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      case ARM::t2LDRBpci:
36570c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      case ARM::t2LDRHpci:
36580c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        Inst.setOpcode(ARM::t2PLDpci);
36590c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        break;
36600c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      case ARM::t2LDRSBpci:
36610c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        Inst.setOpcode(ARM::t2PLIpci);
36620c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        break;
36630c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      case ARM::t2LDRSHpci:
36640c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        return MCDisassembler::Fail;
36650c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      default:
36660c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        break;
36670c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    }
36680c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  }
36690c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville
36700c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  switch(Inst.getOpcode()) {
36710c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  case ARM::t2PLDpci:
367237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    break;
36730c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  case ARM::t2PLIpci:
367437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!hasV7Ops)
367537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::Fail;
36760c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville    break;
36770c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville  default:
3678ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3679ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      return MCDisassembler::Fail;
3680ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
3681ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3682ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (!U) {
3683ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    // Special case for #-0.
3684ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    if (imm == 0)
3685ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      imm = INT32_MIN;
3686ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    else
3687ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      imm = -imm;
3688ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
36896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
3690ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3691ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  return S;
3692ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville}
3693ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3694c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val,
369510cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                           uint64_t Address, const void *Decoder) {
3696fd652df8b36a9d3e6b09ae2b9f7bcb07e88fdfaaJiangning Liu  if (Val == 0)
36976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(INT32_MIN));
3698fd652df8b36a9d3e6b09ae2b9f7bcb07e88fdfaaJiangning Liu  else {
3699fd652df8b36a9d3e6b09ae2b9f7bcb07e88fdfaaJiangning Liu    int imm = Val & 0xFF;
3700fd652df8b36a9d3e6b09ae2b9f7bcb07e88fdfaaJiangning Liu
3701fd652df8b36a9d3e6b09ae2b9f7bcb07e88fdfaaJiangning Liu    if (!(Val & 0x100)) imm *= -1;
37026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm * 4));
3703fd652df8b36a9d3e6b09ae2b9f7bcb07e88fdfaaJiangning Liu  }
37048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3705c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
37068d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
37078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3708c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val,
37098d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                   uint64_t Address, const void *Decoder) {
3710a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
371183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3712fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 9, 4);
3713fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 9);
37148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3715a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3716a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3717a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
3718a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
37198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
372083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
37218d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
37228d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3723c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
3724b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach                                   uint64_t Address, const void *Decoder) {
3725b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach  DecodeStatus S = MCDisassembler::Success;
3726b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach
3727fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 8, 4);
3728fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 8);
3729b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach
3730b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
3731b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach    return MCDisassembler::Fail;
3732b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach
37336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
3734b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach
3735b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach  return S;
3736b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach}
3737b6aed508e310e31dcb080e761ca856127cec0773Jim Grosbach
3738c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
373910cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                         uint64_t Address, const void *Decoder) {
37408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  int imm = Val & 0xFF;
3741705b48ff860e7484f0adee88362dbe1936ae936bOwen Anderson  if (Val == 0)
3742705b48ff860e7484f0adee88362dbe1936ae936bOwen Anderson    imm = INT32_MIN;
3743705b48ff860e7484f0adee88362dbe1936ae936bOwen Anderson  else if (!(Val & 0x100))
3744705b48ff860e7484f0adee88362dbe1936ae936bOwen Anderson    imm *= -1;
37456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
37468d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3747c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
37488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
37498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
37508d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3751c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
375210cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                                 uint64_t Address, const void *Decoder) {
3753a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
375483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3755fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 9, 4);
3756fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 9);
37578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3758cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  // Thumb stores cannot use PC as dest register.
3759cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  switch (Inst.getOpcode()) {
3760cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRT:
3761cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRBT:
3762cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRHT:
3763cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRi8:
3764cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRHi8:
3765cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRBi8:
3766cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    if (Rn == 15)
3767cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville      return MCDisassembler::Fail;
3768cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    break;
3769cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  default:
3770cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    break;
3771cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  }
3772cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville
37738d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  // Some instructions always use an additive offset.
37748d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  switch (Inst.getOpcode()) {
37758d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::t2LDRT:
37768d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::t2LDRBT:
37778d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::t2LDRHT:
37788d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::t2LDRSBT:
37798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    case ARM::t2LDRSHT:
3780ecd1c557904815e568258fc5420de479589b0a93Owen Anderson    case ARM::t2STRT:
3781ecd1c557904815e568258fc5420de479589b0a93Owen Anderson    case ARM::t2STRBT:
3782ecd1c557904815e568258fc5420de479589b0a93Owen Anderson    case ARM::t2STRHT:
37838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      imm |= 0x100;
37848d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
37858d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    default:
37868d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      break;
37878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
37888d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3789a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3790a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
3791a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
3792a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
37938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
379483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
37958d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
37968d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3797c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Insn,
3798a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson                                    uint64_t Address, const void *Decoder) {
3799a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  DecodeStatus S = MCDisassembler::Success;
3800a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson
3801fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
3802fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3803fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned addr = fieldFromInstruction(Insn, 0, 8);
3804fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  addr |= fieldFromInstruction(Insn, 9, 1) << 8;
3805a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  addr |= Rn << 9;
3806fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned load = fieldFromInstruction(Insn, 20, 1);
3807a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson
3808ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  if (Rn == 15) {
3809ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    switch (Inst.getOpcode()) {
3810ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDR_PRE:
3811ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDR_POST:
3812ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRpci);
3813ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3814ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRB_PRE:
3815ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRB_POST:
3816ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRBpci);
3817ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3818ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRH_PRE:
3819ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRH_POST:
3820ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRHpci);
3821ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3822ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSB_PRE:
3823ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSB_POST:
38240c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      if (Rt == 15)
38250c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        Inst.setOpcode(ARM::t2PLIpci);
38260c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville      else
38270c9f0c047dfba91bc7c0fb66f7e868e917d37c4cAmaury de la Vieuville        Inst.setOpcode(ARM::t2LDRSBpci);
3828ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3829ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSH_PRE:
3830ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    case ARM::t2LDRSH_POST:
3831ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      Inst.setOpcode(ARM::t2LDRSHpci);
3832ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      break;
3833ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    default:
3834ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville      return MCDisassembler::Fail;
3835ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    }
3836ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
3837ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville  }
3838ce046b98ed6c351779fc43599a80d588752bc1caAmaury de la Vieuville
3839a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  if (!load) {
3840a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3841a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson      return MCDisassembler::Fail;
3842a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  }
3843a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson
3844b78821d380b6f9514bd3b56b1c27ba367660228bJoe Abbey  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3845a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson    return MCDisassembler::Fail;
3846a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson
3847a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  if (load) {
3848a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3849a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson      return MCDisassembler::Fail;
3850a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  }
3851a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson
3852a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  if (!Check(S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder)))
3853a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson    return MCDisassembler::Fail;
3854a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson
3855a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson  return S;
3856a3157b402695ef9d5f6a03e8e3afc5bddf3a3df7Owen Anderson}
38578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3858c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val,
385910cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                                  uint64_t Address, const void *Decoder) {
3860a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
386183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
3862fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 13, 4);
3863fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Val, 0, 12);
38648d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3865cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  // Thumb stores cannot use PC as dest register.
3866cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  switch (Inst.getOpcode()) {
3867cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRi12:
3868cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRBi12:
3869cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  case ARM::t2STRHi12:
3870cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    if (Rn == 15)
3871cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville      return MCDisassembler::Fail;
3872cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  default:
3873cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville    break;
3874cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville  }
3875cea0032f73a56a62b692b25ca4084850cd51763bAmaury de la Vieuville
3876a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3877a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
38786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
38798d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
388083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
38818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
38828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
38838d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3884c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Insn,
388510cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                                uint64_t Address, const void *Decoder) {
3886fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 7);
38878d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
38886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(ARM::SP));
38896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(ARM::SP));
38906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imm));
38918d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3892c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
38938d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
38948d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3895c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
389610cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                                uint64_t Address, const void *Decoder) {
3897a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
389883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
38998d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Inst.getOpcode() == ARM::tADDrSP) {
3900fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned Rdm = fieldFromInstruction(Insn, 0, 3);
3901fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    Rdm |= fieldFromInstruction(Insn, 7, 1) << 3;
39028d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3903a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
3904a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
39056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(ARM::SP));
3906a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
3907a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
39088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  } else if (Inst.getOpcode() == ARM::tADDspr) {
3909fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned Rm = fieldFromInstruction(Insn, 3, 4);
39108d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
39116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(ARM::SP));
39126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createReg(ARM::SP));
3913a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3914a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
39158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
39168d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
391783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
39188d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
39198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3920c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn,
392110cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                           uint64_t Address, const void *Decoder) {
3922fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imod = fieldFromInstruction(Insn, 4, 1) | 0x2;
3923fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned flags = fieldFromInstruction(Insn, 0, 3);
39248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
39256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(imod));
39266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(flags));
39278d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3928c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
39298d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
39308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3931c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
393210cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                             uint64_t Address, const void *Decoder) {
3933a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
3934fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
3935fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned add = fieldFromInstruction(Insn, 4, 1);
39368d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3937b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
3938a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
39396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(add));
39408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
394183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
39428d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
39438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3944c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Val,
394510cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                                 uint64_t Address, const void *Decoder) {
3946dd051a0414d0c807388bdc9584b71729b3158571NAKAMURA Takumi  // Val is passed in as S:J1:J2:imm10H:imm10L:'0'
39472d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // Note only one trailing zero not two.  Also the J1 and J2 values are from
39482d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // the encoded instruction.  So here change to I1 and I2 values via:
39492d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // I1 = NOT(J1 EOR S);
39502d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // I2 = NOT(J2 EOR S);
39512d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // and build the imm32 with two trailing zeros as documented:
3952dd051a0414d0c807388bdc9584b71729b3158571NAKAMURA Takumi  // imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32);
39532d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned S = (Val >> 23) & 1;
39542d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned J1 = (Val >> 22) & 1;
39552d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned J2 = (Val >> 21) & 1;
39562d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned I1 = !(J1 ^ S);
39572d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned I2 = !(J2 ^ S);
39582d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
39592d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  int imm32 = SignExtend32<25>(tmp << 1);
39602d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby
396101817c39a9d7ff864d0b5de4941eec93d2f9e3a8Jim Grosbach  if (!tryAddingSymbolicOperand(Address,
39622d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby                                (Address & ~2u) + imm32 + 4,
39639e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby                                true, 4, Inst, Decoder))
39646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm32));
3965c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
39668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
39678d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3968c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Val,
39698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                              uint64_t Address, const void *Decoder) {
39708d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (Val == 0xA || Val == 0xB)
3971c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
39728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
39736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &featureBits =
39746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
39756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
39766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (featureBits[ARM::HasV8Ops] && !(Val == 14 || Val == 15))
3977fa840ba402806d978c18401c6bea1c808607d944Artyom Skrobov    return MCDisassembler::Fail;
3978fa840ba402806d978c18401c6bea1c808607d944Artyom Skrobov
39796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
3980c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
39818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
39828d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
3983a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
3984c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeThumbTableBranch(MCInst &Inst, unsigned Insn,
39857f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach                       uint64_t Address, const void *Decoder) {
39867f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach  DecodeStatus S = MCDisassembler::Success;
39877f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach
3988fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
3989fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
39907f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach
39917f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach  if (Rn == ARM::SP) S = MCDisassembler::SoftFail;
39927f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
39937f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach    return MCDisassembler::Fail;
39947f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
39957f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach    return MCDisassembler::Fail;
39967f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach  return S;
39977f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach}
39987f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbach
39997f739bee261debdf56bd89ac922b57eca53e91dcJim Grosbachstatic DecodeStatus
4000c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeThumb2BCCInstruction(MCInst &Inst, unsigned Insn,
4001c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                           uint64_t Address, const void *Decoder) {
4002a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
400383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4004fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 22, 4);
40058d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (pred == 0xE || pred == 0xF) {
4006fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned opc = fieldFromInstruction(Insn, 4, 28);
40078d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    switch (opc) {
40088d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      default:
4009c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail;
4010b45b11bce1fd79b0973d2df8db295583b5477c62Owen Anderson      case 0xf3bf8f4:
40118d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::t2DSB);
40128d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
4013b45b11bce1fd79b0973d2df8db295583b5477c62Owen Anderson      case 0xf3bf8f5:
40148d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::t2DMB);
40158d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
4016b45b11bce1fd79b0973d2df8db295583b5477c62Owen Anderson      case 0xf3bf8f6:
40178d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        Inst.setOpcode(ARM::t2ISB);
40186de3c6f1a926f49cca2fd207ab4eeb6c35e0e068Owen Anderson        break;
40198d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
40208d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4021fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned imm = fieldFromInstruction(Insn, 0, 4);
4022c36481c4744cdbddec91dc3eca9245acaf2982daOwen Anderson    return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
40238d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
40248d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4025fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned brtarget = fieldFromInstruction(Insn, 0, 11) << 1;
4026fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  brtarget |= fieldFromInstruction(Insn, 11, 1) << 19;
4027fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  brtarget |= fieldFromInstruction(Insn, 13, 1) << 18;
4028fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  brtarget |= fieldFromInstruction(Insn, 16, 6) << 12;
4029fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  brtarget |= fieldFromInstruction(Insn, 26, 1) << 20;
40308d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4031a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
4032a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4033a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4034a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
40358d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
403683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
40378d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
40388d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
40398d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// Decode a shifted immediate operand.  These basically consist
40408d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// of an 8-bit value, and a 4-bit directive that specifies either
40418d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson// a splat operation or a rotation.
4042c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val,
40438d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                          uint64_t Address, const void *Decoder) {
4044fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned ctrl = fieldFromInstruction(Val, 10, 2);
40458d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  if (ctrl == 0) {
4046fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned byte = fieldFromInstruction(Val, 8, 2);
4047fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned imm = fieldFromInstruction(Val, 0, 8);
40488d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    switch (byte) {
40498d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 0:
40506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Inst.addOperand(MCOperand::createImm(imm));
40518d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
40528d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 1:
40536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Inst.addOperand(MCOperand::createImm((imm << 16) | imm));
40548d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
40558d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 2:
40566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Inst.addOperand(MCOperand::createImm((imm << 24) | (imm << 8)));
40578d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
40588d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson      case 3:
40596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Inst.addOperand(MCOperand::createImm((imm << 24) | (imm << 16) |
40608d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson                                             (imm << 8)  |  imm));
40618d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson        break;
40628d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    }
40638d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  } else {
4064fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned unrot = fieldFromInstruction(Val, 0, 7) | 0x80;
4065fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach    unsigned rot = fieldFromInstruction(Val, 7, 5);
40668d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson    unsigned imm = (unrot >> rot) | (unrot << ((32-rot)&31));
40676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm));
40688d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson  }
40698d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4070c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
40718d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
40728d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4073a6804444e874b27aee5921d4c6049df573c5e249Owen Andersonstatic DecodeStatus
4074c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeThumbBCCTargetOperand(MCInst &Inst, unsigned Val,
4075c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                            uint64_t Address, const void *Decoder){
4076c8f2fcc9a381f1e024656568f2face2f600e0328Richard Barton  if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<9>(Val<<1) + 4,
40772a7d3a93735f97c2a4cabcc08a88d702c28cb0d4Kevin Enderby                                true, 2, Inst, Decoder))
40786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(SignExtend32<9>(Val << 1)));
4079c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
40808d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
40818d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4082c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val,
408310cbaab7b774e187c99790292dc1ed64dee2b0f3Owen Anderson                                       uint64_t Address, const void *Decoder){
40842d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // Val is passed in as S:J1:J2:imm10:imm11
40852d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // Note no trailing zero after imm11.  Also the J1 and J2 values are from
40862d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // the encoded instruction.  So here change to I1 and I2 values via:
40872d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // I1 = NOT(J1 EOR S);
40882d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // I2 = NOT(J2 EOR S);
40892d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  // and build the imm32 with one trailing zero as documented:
4090dd051a0414d0c807388bdc9584b71729b3158571NAKAMURA Takumi  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
40912d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned S = (Val >> 23) & 1;
40922d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned J1 = (Val >> 22) & 1;
40932d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned J2 = (Val >> 21) & 1;
40942d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned I1 = !(J1 ^ S);
40952d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned I2 = !(J2 ^ S);
40962d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
40972d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  int imm32 = SignExtend32<25>(tmp << 1);
40982d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby
40992d524b0765145f1c7888166c985a25452f16b2bcKevin Enderby  if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4,
4100b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby                                true, 4, Inst, Decoder))
41016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(imm32));
4102c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
41038d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson}
41048d7d2e1238fac58c01ccfb719d0cc5680a079561Owen Anderson
4105c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Val,
4106c36481c4744cdbddec91dc3eca9245acaf2982daOwen Anderson                                   uint64_t Address, const void *Decoder) {
4107c1b7ca5ba28ded2d83ae534c8e072c2538d43295Jiangning Liu  if (Val & ~0xf)
4108c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    return MCDisassembler::Fail;
4109c36481c4744cdbddec91dc3eca9245acaf2982daOwen Anderson
41106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
4111c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
4112c36481c4744cdbddec91dc3eca9245acaf2982daOwen Anderson}
4113c36481c4744cdbddec91dc3eca9245acaf2982daOwen Anderson
41144e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuvillestatic DecodeStatus DecodeInstSyncBarrierOption(MCInst &Inst, unsigned Val,
41154e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville                                        uint64_t Address, const void *Decoder) {
41164e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville  if (Val & ~0xf)
41174e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville    return MCDisassembler::Fail;
41184e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville
41196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
41204e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville  return MCDisassembler::Success;
41214e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville}
41224e9a96d810eb0cc126ebe6f18e536b474c84940cAmaury de la Vieuville
4123c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Val,
412426d2f0ac919f6ae868fe901fd4ad64af6f92da4dOwen Anderson                          uint64_t Address, const void *Decoder) {
412537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DecodeStatus S = MCDisassembler::Success;
41266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const FeatureBitset &FeatureBits =
41276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ((const MCDisassembler*)Decoder)->getSubtargetInfo().getFeatureBits();
41286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
41296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (FeatureBits[ARM::FeatureMClass]) {
413037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned ValLow = Val & 0xff;
413137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
413237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // Validate the SYSm value first.
413337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    switch (ValLow) {
413437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  0: // apsr
413537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  1: // iapsr
413637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  2: // eapsr
413737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  3: // xpsr
413837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  5: // ipsr
413937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  6: // epsr
414037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  7: // iepsr
414137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  8: // msp
414237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case  9: // psp
414337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case 16: // primask
414437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case 20: // control
414537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
414637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case 17: // basepri
414737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case 18: // basepri_max
414837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case 19: // faultmask
41496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (!(FeatureBits[ARM::HasV7Ops]))
415037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // Values basepri, basepri_max and faultmask are only valid for v7m.
415137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        return MCDisassembler::Fail;
415237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      break;
4153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x8a: // msplim_ns
4154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x8b: // psplim_ns
4155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x91: // basepri_ns
4156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x92: // basepri_max_ns
4157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x93: // faultmask_ns
4158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (!(FeatureBits[ARM::HasV8MMainlineOps]))
4159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return MCDisassembler::Fail;
4160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // fall through
4161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 10:   // msplim
4162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 11:   // psplim
4163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x88: // msp_ns
4164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x89: // psp_ns
4165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x90: // primask_ns
4166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x94: // control_ns
4167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case 0x98: // sp_ns
4168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (!(FeatureBits[ARM::Feature8MSecExt]))
4169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return MCDisassembler::Fail;
4170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
417137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    default:
417237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::Fail;
417337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
417437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
417537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Inst.getOpcode() == ARM::t2MSR_M) {
417637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      unsigned Mask = fieldFromInstruction(Val, 10, 2);
41776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (!(FeatureBits[ARM::HasV7Ops])) {
417837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // The ARMv6-M MSR bits {11-10} can be only 0b10, other values are
417937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // unpredictable.
418037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        if (Mask != 2)
418137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          S = MCDisassembler::SoftFail;
418237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      }
418337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      else {
418437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // The ARMv7-M architecture stores an additional 2-bit mask value in
418537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // MSR bits {11-10}. The mask is used only with apsr, iapsr, eapsr and
418637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // xpsr, it has to be 0b10 in other cases. Bit mask{1} indicates if
418737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // the NZCVQ bits should be moved by the instruction. Bit mask{0}
418837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // indicates the move for the GE{3:0} bits, the mask{0} bit can be set
418937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        // only if the processor includes the DSP extension.
419037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
4191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            (!(FeatureBits[ARM::FeatureDSP]) && (Mask & 1)))
419237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          S = MCDisassembler::SoftFail;
419337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      }
419437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
419537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } else {
419637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // A/R class
419737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Val == 0)
419837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::Fail;
419937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
42006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
420137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return S;
420237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
420337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
420437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic DecodeStatus DecodeBankedReg(MCInst &Inst, unsigned Val,
420537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                    uint64_t Address, const void *Decoder) {
420637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
420737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned R = fieldFromInstruction(Val, 5, 1);
420837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned SysM = fieldFromInstruction(Val, 0, 5);
420937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
421037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // The table of encodings for these banked registers comes from B9.2.3 of the
421137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // ARM ARM. There are patterns, but nothing regular enough to make this logic
421237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // neater. So by fiat, these values are UNPREDICTABLE:
421337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!R) {
421437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (SysM == 0x7 || SysM == 0xf || SysM == 0x18 || SysM == 0x19 ||
421537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        SysM == 0x1a || SysM == 0x1b)
421637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::SoftFail;
421737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } else {
421837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (SysM != 0xe && SysM != 0x10 && SysM != 0x12 && SysM != 0x14 &&
421937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        SysM != 0x16 && SysM != 0x1c && SysM != 0x1e)
422037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return MCDisassembler::SoftFail;
422137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
422237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
42236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
4224c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  return MCDisassembler::Success;
422526d2f0ac919f6ae868fe901fd4ad64af6f92da4dOwen Anderson}
4226cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
4227c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn,
4228c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                        uint64_t Address, const void *Decoder) {
4229a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
423083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4231fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4232fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4233fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
42343f3570a38be37ca18c545bd1b4c89604ecaf7e31Owen Anderson
42353862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  if (Rn == 0xF)
42363862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville    S = MCDisassembler::SoftFail;
42373f3570a38be37ca18c545bd1b4c89604ecaf7e31Owen Anderson
42383862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  if (!Check(S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
4239a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4240a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4241a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4242a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4243a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
42443f3570a38be37ca18c545bd1b4c89604ecaf7e31Owen Anderson
424583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
42463f3570a38be37ca18c545bd1b4c89604ecaf7e31Owen Anderson}
42473f3570a38be37ca18c545bd1b4c89604ecaf7e31Owen Anderson
4248c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn,
4249c40578250d391069d2d81ecaab58a83f2667e96eJim Grosbach                                         uint64_t Address, const void *Decoder){
4250a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
425183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4252fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4253fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 0, 4);
4254fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4255fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
4256cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
4257d3af696c08923d4d376641b52c3b2cb5baa00487Tim Northover  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
4258a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4259cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
42603862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1)
42613862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville    S = MCDisassembler::SoftFail;
4262cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
42633862709058ecfe809c9d4b32e3bff0efe8ebe646Amaury de la Vieuville  if (!Check(S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
4264a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4265a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4266a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4267a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4268a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4269cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
427083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
4271cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson}
4272cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
4273c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn,
42749ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson                            uint64_t Address, const void *Decoder) {
4275a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
42769ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4277fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4278fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4279fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 12);
4280fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 16, 4) << 13;
4281fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 23, 1) << 12;
4282fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
42839ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4284c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
42859ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4286a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4287a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4288a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4289a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4290a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
4291a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4292a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4293a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
42949ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
42959ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson  return S;
42969ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson}
42979ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4298c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn,
42999ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson                            uint64_t Address, const void *Decoder) {
4300a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
43019ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4302fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4303fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4304fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 12);
4305fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 16, 4) << 13;
4306fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 23, 1) << 12;
4307fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
4308fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
43099ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4310c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
4311c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (Rm == 0xF) S = MCDisassembler::SoftFail;
43129ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4313a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4314a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4315a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4316a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4317a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
4318a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4319a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4320a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
43219ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
43229ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson  return S;
43239ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson}
43249ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
43259ab0f25fc194b4315db1b87d38d4024054120bf6Owen Anderson
4326c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn,
43277cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson                            uint64_t Address, const void *Decoder) {
4328a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
432983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4330fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4331fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4332fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 12);
4333fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 16, 4) << 13;
4334fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 23, 1) << 12;
4335fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
4336cbfc044acd722d14d0687c9cf099f3dca45e26d5Owen Anderson
4337c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
43387cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson
4339a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4340a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4341a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4342a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4343a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
4344a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4345a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4346a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
43477cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson
434883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
43497cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson}
43507cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson
4351c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn,
43527cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson                            uint64_t Address, const void *Decoder) {
4353a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
435483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4355fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4356fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
4357fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 0, 12);
4358fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 16, 4) << 13;
4359fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  imm |= fieldFromInstruction(Insn, 23, 1) << 12;
4360fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
43617cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson
4362c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy  if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
43637cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson
4364a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4365a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4366a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4367a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4368a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
4369a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4370a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4371a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
43727cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson
437383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
43747cdbf086e4676494fc6a5b26c169285ae0bb740bOwen Anderson}
43757a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4376c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
43777a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4378a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
437983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4380fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4381fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4382fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4383fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4384fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
43857a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
43867a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
43877a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
43887a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
43897a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4390c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
43917a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4392fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
4393c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4394fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
43957a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
43967a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4397fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
4398c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4399fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4400fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
44017a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 2;
44027a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
44037a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4404fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
4405c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4406fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4407eae1d34029c159306ce4a0472294de6cf9baedacTim Northover
4408eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      switch (fieldFromInstruction(Insn, 4, 2)) {
4409eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 0 :
4410eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 0; break;
4411eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 3:
4412eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 4; break;
4413eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        default:
4414eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          return MCDisassembler::Fail;
4415eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      }
4416eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      break;
44177a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
44187a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4419a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4420a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
44217a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4422a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4423a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
44247a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4425a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4426a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
44276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
44282cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4429c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4430a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4431a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
4432c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
44336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
44347a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
44357a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4436a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4437a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
44386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
44397a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
444083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
44417a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
44427a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4443c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
44447a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4445a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
444683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4447fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4448fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4449fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4450fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4451fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
44527a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
44537a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
44547a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
44557a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
44567a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4457c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
44587a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4459fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
4460c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4461fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
44627a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
44637a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4464fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
4465c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4466fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4467fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
44687a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 2;
44697a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
44707a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4471fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
4472c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4473fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4474eae1d34029c159306ce4a0472294de6cf9baedacTim Northover
4475eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      switch (fieldFromInstruction(Insn, 4, 2)) {
4476eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 0:
4477eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 0; break;
4478eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 3:
4479eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 4; break;
4480eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        default:
4481eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          return MCDisassembler::Fail;
4482eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      }
4483eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      break;
44847a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
44857a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
44867a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4487a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4488a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
44897a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4490a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4491a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
44926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
44932cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4494c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4495a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4496a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4497c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
44986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
44997a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
45007a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4501a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4502a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
45036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
45047a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
450583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
45067a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
45077a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
45087a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4509c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn,
45107a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4511a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
451283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4513fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4514fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4515fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4516fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4517fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
45187a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
45197a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
45207a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
45217a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned inc = 1;
45227a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
45237a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4524c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
45257a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4526fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
4527fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
45287a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 2;
45297a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
45307a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4531fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4532fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
45337a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 4;
4534fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
45357a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
45367a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
45377a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4538fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
4539c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4540fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4541fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1) != 0)
45427a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 8;
4543fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
45447a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
45457a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
45467a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
45477a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4548a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4549a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4550a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4551a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
45527a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4553a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4554a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
45557a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4556a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4557a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
45586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
45592cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4560c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4561a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4562a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
4563c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
45646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
45657a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
45667a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4567a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4568a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4569a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4570a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
45716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
45727a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
457383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
45747a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
45757a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4576c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn,
45777a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4578a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
457983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4580fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4581fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4582fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4583fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4584fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
45857a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
45867a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
45877a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
45887a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned inc = 1;
45897a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
45907a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4591c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
45927a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4593fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
4594fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
45957a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 2;
45967a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
45977a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4598fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4599fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
46007a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 4;
4601fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
46027a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
46037a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
46047a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4605fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
4606c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4607fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4608fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1) != 0)
46097a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 8;
4610fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
46117a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
46127a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
46137a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
46147a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
46157a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4616a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4617a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
46187a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4619a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4620a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
46216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
46222cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4623c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4624a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4625a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
4626c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
46276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
46287a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
46297a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4630a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4631a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4632a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4633a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
46346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
46357a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
463683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
46377a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
46387a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
46397a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4640c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn,
46417a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4642a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
464383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4644fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4645fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4646fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4647fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4648fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
46497a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
46507a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
46517a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
46527a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned inc = 1;
46537a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
46547a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4655c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
46567a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4657fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
4658c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4659fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
46607a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
46617a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4662fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
4663c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4664fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4665fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
46667a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
46677a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
46687a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4669fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 2))
4670c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4671fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4672fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
46737a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
46747a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
46757a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
46767a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4677a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4678a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4679a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4680a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4681a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4682a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
46837a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
46847a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4685a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4686a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
46877a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4688a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4689a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
46906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
4691eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson  if (Rm != 0xF) {
4692c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4693a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4694a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4695c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
46966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
46977a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
46987a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4699a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4700a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4701a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4702a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4703a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4704a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
47056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
47067a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
470783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
47087a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
47097a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4710c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn,
47117a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4712a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
471383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4714fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4715fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4716fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4717fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4718fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
47197a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
47207a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
47217a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
47227a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned inc = 1;
47237a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
47247a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4725c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
47267a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4727fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
4728c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4729fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
47307a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
47317a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4732fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
4733c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4734fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4735fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
47367a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
47377a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
47387a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4739fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 2))
4740c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy        return MCDisassembler::Fail; // UNDEFINED
4741fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4742fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
47437a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
47447a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
47457a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
47467a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
47477a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4748a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4749a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
47507a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4751a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4752a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
47536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
47542cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4755c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4756a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4757a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4758c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
47596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
47607a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
47617a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4762a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4763a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4764a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4765a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4766a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4767a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
47686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
47697a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
477083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
47717a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
47727a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
47737a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4774c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
47757a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4776a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
477783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4778fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4779fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4780fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4781fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4782fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
47837a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
47847a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
47857a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
47867a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned inc = 1;
47877a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
47887a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4789c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
47907a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4791fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
47927a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 4;
4793fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
47947a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
47957a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4796fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
47977a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 8;
4798fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4799fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
48007a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
48017a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
48027a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4803eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      switch (fieldFromInstruction(Insn, 4, 2)) {
4804eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 0:
4805eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 0; break;
4806eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 3:
4807eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          return MCDisassembler::Fail;
4808eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        default:
4809eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 4 << fieldFromInstruction(Insn, 4, 2); break;
4810eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      }
4811eae1d34029c159306ce4a0472294de6cf9baedacTim Northover
4812fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4813fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
48147a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
48157a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
48167a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
48177a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4818a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4819a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4820a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4821a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4822a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4823a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4824a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
4825a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
48267a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
48277a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4828a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4829a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      return MCDisassembler::Fail;
48307a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4831a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4832a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
48336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
48342cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4835c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4836a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4837a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson        return MCDisassembler::Fail;
4838c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
48396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
48407a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
48417a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4842a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4843a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4844a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4845a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4846a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4847a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4848a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
4849a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
48506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
48517a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
485283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
48537a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
48547a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4855c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
48567a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson                         uint64_t Address, const void *Decoder) {
4857a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
485883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson
4859fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
4860fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Insn, 0, 4);
4861fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rd = fieldFromInstruction(Insn, 12, 4);
4862fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
4863fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned size = fieldFromInstruction(Insn, 10, 2);
48647a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
48657a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned align = 0;
48667a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned index = 0;
48677a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  unsigned inc = 1;
48687a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  switch (size) {
48697a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    default:
4870c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy      return MCDisassembler::Fail;
48717a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 0:
4872fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
48737a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 4;
4874fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 5, 3);
48757a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
48767a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 1:
4877fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 4, 1))
48787a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        align = 8;
4879fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 6, 2);
4880fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 5, 1))
48817a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
48827a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
48837a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson    case 2:
4884eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      switch (fieldFromInstruction(Insn, 4, 2)) {
4885eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 0:
4886eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 0; break;
4887eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        case 3:
4888eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          return MCDisassembler::Fail;
4889eae1d34029c159306ce4a0472294de6cf9baedacTim Northover        default:
4890eae1d34029c159306ce4a0472294de6cf9baedacTim Northover          align = 4 << fieldFromInstruction(Insn, 4, 2); break;
4891eae1d34029c159306ce4a0472294de6cf9baedacTim Northover      }
4892eae1d34029c159306ce4a0472294de6cf9baedacTim Northover
4893fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      index = fieldFromInstruction(Insn, 7, 1);
4894fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach      if (fieldFromInstruction(Insn, 6, 1))
48957a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson        inc = 2;
48967a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson      break;
48977a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
48987a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
48997a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  if (Rm != 0xF) { // Writeback
4900a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4901a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
49027a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
4903a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4904a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
49056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(align));
49062cbf2104507c855850b610ed910536058aa0c6eeOwen Anderson  if (Rm != 0xF) {
4907c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    if (Rm != 0xD) {
4908a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson      if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4909a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4910c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    } else
49116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Inst.addOperand(MCOperand::createReg(0));
49127a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson  }
49137a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4914a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4915a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4916a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4917a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4918a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4919a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4920a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
4921a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
49226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(index));
49237a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
492483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson  return S;
49257a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson}
49267a2e1770ead7c2e3b7292ae466a41b560f3d272cOwen Anderson
4927c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn,
4928357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson                                  uint64_t Address, const void *Decoder) {
4929a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
4930fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt  = fieldFromInstruction(Insn, 12, 4);
4931fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
4932fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm  = fieldFromInstruction(Insn,  5, 1);
4933fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
4934fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rm |= fieldFromInstruction(Insn, 0, 4) << 1;
4935357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4936357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4937c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    S = MCDisassembler::SoftFail;
4938357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4939a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
4940a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4941a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
4942a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4943a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
4944a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4945a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
4946a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4947a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4948a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4949357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4950357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson  return S;
4951357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson}
4952357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4953c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn,
4954357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson                                  uint64_t Address, const void *Decoder) {
4955a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
4956fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt  = fieldFromInstruction(Insn, 12, 4);
4957fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
4958fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm  = fieldFromInstruction(Insn,  5, 1);
4959fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
4960fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rm |= fieldFromInstruction(Insn, 0, 4) << 1;
4961357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4962357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4963c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    S = MCDisassembler::SoftFail;
4964357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4965a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
4966a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4967a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
4968a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4969a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
4970a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4971a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
4972a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4973a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4974a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson    return MCDisassembler::Fail;
4975357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson
4976357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson  return S;
4977357ec6850be0dff0038ea3a14f16066705284c0bOwen Anderson}
49788e1e60b5f8fd9c6233bdb8814ee40887555a0594Owen Anderson
4979c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeIT(MCInst &Inst, unsigned Insn,
4980eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson                             uint64_t Address, const void *Decoder) {
4981a6804444e874b27aee5921d4c6049df573c5e249Owen Anderson  DecodeStatus S = MCDisassembler::Success;
4982fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 4, 4);
4983fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned mask = fieldFromInstruction(Insn, 0, 4);
4984eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson
4985eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson  if (pred == 0xF) {
4986eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson    pred = 0xE;
4987c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    S = MCDisassembler::SoftFail;
4988e234d02204e0e546c3555e7e894b8521d22a2121Owen Anderson  }
4989e234d02204e0e546c3555e7e894b8521d22a2121Owen Anderson
4990ff08da15cf3d0412ee9cc325fc5a720bcad178f2Amaury de la Vieuville  if (mask == 0x0)
4991ff08da15cf3d0412ee9cc325fc5a720bcad178f2Amaury de la Vieuville    return MCDisassembler::Fail;
4992eaca928a3798e1fa7072457b94eccdd5b53b5d5fOwen Anderson
49936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(pred));
49946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(mask));
4995f44082091c5517a3275c57a8b58e36987c8227f0Owen Anderson  return S;
4996f44082091c5517a3275c57a8b58e36987c8227f0Owen Anderson}
4997a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
4998a77295db19527503d6b290e4f34f273d0a789365Jim Grosbachstatic DecodeStatus
4999c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeT2LDRDPreInstruction(MCInst &Inst, unsigned Insn,
5000a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach                           uint64_t Address, const void *Decoder) {
5001a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  DecodeStatus S = MCDisassembler::Success;
5002a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5003fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5004fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt2 = fieldFromInstruction(Insn, 8, 4);
5005fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5006fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned addr = fieldFromInstruction(Insn, 0, 8);
5007fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned W = fieldFromInstruction(Insn, 21, 1);
5008fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned U = fieldFromInstruction(Insn, 23, 1);
5009fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned P = fieldFromInstruction(Insn, 24, 1);
5010a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  bool writeback = (W == 1) | (P == 0);
5011a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5012a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  addr |= (U << 8) | (Rn << 9);
5013a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5014a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (writeback && (Rn == Rt || Rn == Rt2))
5015a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    Check(S, MCDisassembler::SoftFail);
5016a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (Rt == Rt2)
5017a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    Check(S, MCDisassembler::SoftFail);
5018a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5019a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // Rt
5020a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
5021a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5022a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // Rt2
5023a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5024a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5025a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // Writeback operand
5026a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
5027a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5028a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // addr
5029a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
5030a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5031a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5032a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  return S;
5033a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach}
5034a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5035a77295db19527503d6b290e4f34f273d0a789365Jim Grosbachstatic DecodeStatus
5036c89c744b69cecac576317a98322fd295e36e9886Craig TopperDecodeT2STRDPreInstruction(MCInst &Inst, unsigned Insn,
5037a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach                           uint64_t Address, const void *Decoder) {
5038a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  DecodeStatus S = MCDisassembler::Success;
5039a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5040fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Insn, 12, 4);
5041fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt2 = fieldFromInstruction(Insn, 8, 4);
5042fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Insn, 16, 4);
5043fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned addr = fieldFromInstruction(Insn, 0, 8);
5044fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned W = fieldFromInstruction(Insn, 21, 1);
5045fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned U = fieldFromInstruction(Insn, 23, 1);
5046fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned P = fieldFromInstruction(Insn, 24, 1);
5047a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  bool writeback = (W == 1) | (P == 0);
5048a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5049a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  addr |= (U << 8) | (Rn << 9);
5050a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5051a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (writeback && (Rn == Rt || Rn == Rt2))
5052a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    Check(S, MCDisassembler::SoftFail);
5053a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5054a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // Writeback operand
5055a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
5056a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5057a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // Rt
5058a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
5059a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5060a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // Rt2
5061a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5062a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5063a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  // addr
5064a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  if (!Check(S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
5065a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach    return MCDisassembler::Fail;
5066a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach
5067a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach  return S;
5068a77295db19527503d6b290e4f34f273d0a789365Jim Grosbach}
506908fef885eb39339a47e3be7f0842b1db33683003Owen Anderson
5070c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2Adr(MCInst &Inst, uint32_t Insn,
507108fef885eb39339a47e3be7f0842b1db33683003Owen Anderson                                uint64_t Address, const void *Decoder) {
5072fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned sign1 = fieldFromInstruction(Insn, 21, 1);
5073fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned sign2 = fieldFromInstruction(Insn, 23, 1);
507408fef885eb39339a47e3be7f0842b1db33683003Owen Anderson  if (sign1 != sign2) return MCDisassembler::Fail;
507508fef885eb39339a47e3be7f0842b1db33683003Owen Anderson
5076fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Val = fieldFromInstruction(Insn, 0, 8);
5077fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Val |= fieldFromInstruction(Insn, 12, 3) << 8;
5078fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Val |= fieldFromInstruction(Insn, 26, 1) << 11;
507908fef885eb39339a47e3be7f0842b1db33683003Owen Anderson  Val |= sign1 << 12;
50806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(SignExtend32<13>(Val)));
508108fef885eb39339a47e3be7f0842b1db33683003Owen Anderson
508208fef885eb39339a47e3be7f0842b1db33683003Owen Anderson  return MCDisassembler::Success;
508308fef885eb39339a47e3be7f0842b1db33683003Owen Anderson}
508408fef885eb39339a47e3be7f0842b1db33683003Owen Anderson
5085c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, uint32_t Val,
50860afa0094afdfe589f407feb76948f273b414b278Owen Anderson                                              uint64_t Address,
50870afa0094afdfe589f407feb76948f273b414b278Owen Anderson                                              const void *Decoder) {
50880afa0094afdfe589f407feb76948f273b414b278Owen Anderson  DecodeStatus S = MCDisassembler::Success;
50890afa0094afdfe589f407feb76948f273b414b278Owen Anderson
50900afa0094afdfe589f407feb76948f273b414b278Owen Anderson  // Shift of "asr #32" is not allowed in Thumb2 mode.
5091ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Val == 0x20) S = MCDisassembler::Fail;
50926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Val));
50930afa0094afdfe589f407feb76948f273b414b278Owen Anderson  return S;
50940afa0094afdfe589f407feb76948f273b414b278Owen Anderson}
50950afa0094afdfe589f407feb76948f273b414b278Owen Anderson
5096c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn,
5097cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson                               uint64_t Address, const void *Decoder) {
5098fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt   = fieldFromInstruction(Insn, 12, 4);
5099fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt2  = fieldFromInstruction(Insn, 0,  4);
5100fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn   = fieldFromInstruction(Insn, 16, 4);
5101fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned pred = fieldFromInstruction(Insn, 28, 4);
5102cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson
5103cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  if (pred == 0xF)
5104cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
5105cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson
5106cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  DecodeStatus S = MCDisassembler::Success;
510735ee7d28a69173ca0c11fb6b3271518bf4c5bff6Silviu Baranga
510835ee7d28a69173ca0c11fb6b3271518bf4c5bff6Silviu Baranga  if (Rt == Rn || Rn == Rt2)
510935ee7d28a69173ca0c11fb6b3271518bf4c5bff6Silviu Baranga    S = MCDisassembler::SoftFail;
511035ee7d28a69173ca0c11fb6b3271518bf4c5bff6Silviu Baranga
5111cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5112cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson    return MCDisassembler::Fail;
5113cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
5114cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson    return MCDisassembler::Fail;
5115cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
5116cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson    return MCDisassembler::Fail;
5117cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5118cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson    return MCDisassembler::Fail;
5119cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson
5120cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson  return S;
5121cb9fed665550376b7c65c7e1157a58911193e2e2Owen Anderson}
5122b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5123c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn,
5124b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson                                uint64_t Address, const void *Decoder) {
5125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const FeatureBitset &featureBits =
5126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      ((const MCDisassembler *)Decoder)->getSubtargetInfo().getFeatureBits();
5127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
5129fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
5130fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
5131fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
5132fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
5133fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 16, 6);
5134fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned cmode = fieldFromInstruction(Insn, 8, 4);
51359eefea009fb559cf441254f7022a2824386852c6Amaury de la Vieuville  unsigned op = fieldFromInstruction(Insn, 5, 1);
5136b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5137b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  DecodeStatus S = MCDisassembler::Success;
5138b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
5140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!(imm & 0x38)) {
5141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (cmode == 0xF) {
5142f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (op == 1) return MCDisassembler::Fail;
5143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Inst.setOpcode(ARM::VMOVv2f32);
5144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
5145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (hasFullFP16) {
5146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (cmode == 0xE) {
5147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if (op == 1) {
5148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv1i64);
5149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        } else {
5150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv8i8);
5151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        }
5152f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
5153f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (cmode == 0xD) {
5154f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if (op == 1) {
5155f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMVNv2i32);
5156f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        } else {
5157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv2i32);
5158f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        }
5159f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
5160f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (cmode == 0xC) {
5161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if (op == 1) {
5162f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMVNv2i32);
5163f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        } else {
5164f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv2i32);
5165f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        }
5166f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
5167f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
5168b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson    return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
5169b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  }
5170b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5171c64835b0c57913b11abd648b76913390e62af8d6Amaury de la Vieuville  if (!(imm & 0x20)) return MCDisassembler::Fail;
5172b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5173b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
5174b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson    return MCDisassembler::Fail;
5175b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  if (!Check(S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
5176b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson    return MCDisassembler::Fail;
51776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(64 - imm));
5178b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5179b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  return S;
5180b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson}
5181b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5182c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn,
5183b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson                                uint64_t Address, const void *Decoder) {
5184f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const FeatureBitset &featureBits =
5185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      ((const MCDisassembler *)Decoder)->getSubtargetInfo().getFeatureBits();
5186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool hasFullFP16 = featureBits[ARM::FeatureFullFP16];
5187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
5188fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
5189fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
5190fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
5191fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
5192fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned imm = fieldFromInstruction(Insn, 16, 6);
5193fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned cmode = fieldFromInstruction(Insn, 8, 4);
51949eefea009fb559cf441254f7022a2824386852c6Amaury de la Vieuville  unsigned op = fieldFromInstruction(Insn, 5, 1);
5195b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5196b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  DecodeStatus S = MCDisassembler::Success;
5197b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5198f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
5199f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!(imm & 0x38)) {
5200f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (cmode == 0xF) {
5201f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (op == 1) return MCDisassembler::Fail;
5202f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Inst.setOpcode(ARM::VMOVv4f32);
5203f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
5204f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (hasFullFP16) {
5205f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (cmode == 0xE) {
5206f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if (op == 1) {
5207f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv2i64);
5208f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        } else {
5209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv16i8);
5210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        }
5211f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
5212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (cmode == 0xD) {
5213f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if (op == 1) {
5214f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMVNv4i32);
5215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        } else {
5216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv4i32);
5217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        }
5218f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
5219f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (cmode == 0xC) {
5220f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if (op == 1) {
5221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMVNv4i32);
5222f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        } else {
5223f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          Inst.setOpcode(ARM::VMOVv4i32);
5224f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        }
5225f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
5226f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
5227b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson    return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
5228b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  }
5229b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5230c64835b0c57913b11abd648b76913390e62af8d6Amaury de la Vieuville  if (!(imm & 0x20)) return MCDisassembler::Fail;
5231b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5232b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  if (!Check(S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
5233b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson    return MCDisassembler::Fail;
5234b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  if (!Check(S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder)))
5235b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson    return MCDisassembler::Fail;
52366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(64 - imm));
5237b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson
5238b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson  return S;
5239b589be9334ee5352dd263c406b99a90d413c0b2fOwen Anderson}
5240b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga
5241c89c744b69cecac576317a98322fd295e36e9886Craig Topperstatic DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val,
5242b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga                                uint64_t Address, const void *Decoder) {
5243b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  DecodeStatus S = MCDisassembler::Success;
5244b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga
5245fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rn = fieldFromInstruction(Val, 16, 4);
5246fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Val, 12, 4);
5247fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rm = fieldFromInstruction(Val, 0, 4);
5248fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  Rm |= (fieldFromInstruction(Val, 23, 1) << 4);
5249fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Cond = fieldFromInstruction(Val, 28, 4);
5250f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
5251fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  if (fieldFromInstruction(Val, 8, 4) != 0 || Rn == Rt)
5252b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga    S = MCDisassembler::SoftFail;
5253b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga
5254b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5255b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga    return MCDisassembler::Fail;
5256b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
5257b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga    return MCDisassembler::Fail;
5258b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  if (!Check(S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder)))
5259b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga    return MCDisassembler::Fail;
5260b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  if (!Check(S, DecodePostIdxReg(Inst, Rm, Address, Decoder)))
5261b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga    return MCDisassembler::Fail;
5262b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  if (!Check(S, DecodePredicateOperand(Inst, Cond, Address, Decoder)))
5263b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga    return MCDisassembler::Fail;
5264b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga
5265b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga  return S;
5266b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga}
5267b7c2ed66642b141a768b3074c465eba9d98665d8Silviu Baranga
5268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DecodeStatus DecoderForMRRC2AndMCRR2(llvm::MCInst &Inst, unsigned Val,
5269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            uint64_t Address, const void *Decoder) {
5270fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5271fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga  DecodeStatus S = MCDisassembler::Success;
5272fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5273fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned CRm = fieldFromInstruction(Val, 0, 4);
5274fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned opc1 = fieldFromInstruction(Val, 4, 4);
5275fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned cop = fieldFromInstruction(Val, 8, 4);
5276fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt = fieldFromInstruction(Val, 12, 4);
5277fc1a161d76f5cc0204bed3bce3e27cf36ac76d22Jim Grosbach  unsigned Rt2 = fieldFromInstruction(Val, 16, 4);
5278fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5279fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga  if ((cop & ~0x1) == 0xa)
5280fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga    return MCDisassembler::Fail;
5281fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5282fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga  if (Rt == Rt2)
5283fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga    S = MCDisassembler::SoftFail;
5284fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // We have to check if the instruction is MRRC2
5286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // or MCRR2 when constructing the operands for
5287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Inst. Reason is because MRRC2 stores to two
5288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // registers so it's tablegen desc has has two
5289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // outputs whereas MCRR doesn't store to any
5290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // registers so all of it's operands are listed
5291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // as inputs, therefore the operand order for
5292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // MRRC2 needs to be [Rt, Rt2, cop, opc1, CRm]
5293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // and MCRR2 operand order is [cop, opc1, Rt, Rt2, CRm]
5294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
5295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Inst.getOpcode() == ARM::MRRC2) {
5296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return MCDisassembler::Fail;
5298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
5299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return MCDisassembler::Fail;
5300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
53016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(cop));
53026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(opc1));
5303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Inst.getOpcode() == ARM::MCRR2) {
5304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
5305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return MCDisassembler::Fail;
5306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
5307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return MCDisassembler::Fail;
5308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
53096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(CRm));
5310fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5311fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga  return S;
5312fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga}
5313fa1ebc6abe95b79b7f82030eea53586a8704eb7eSilviu Baranga
5314