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