xref: /llvm-project/llvm/lib/Target/VE/Disassembler/VEDisassembler.cpp (revision c644488a8b8a2e831c5665a6167a9debabbb2d72)
182aac878SKazushi (Jam) Marukawa //===- VEDisassembler.cpp - Disassembler for VE -----------------*- C++ -*-===//
282aac878SKazushi (Jam) Marukawa //
382aac878SKazushi (Jam) Marukawa // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
482aac878SKazushi (Jam) Marukawa // See https://llvm.org/LICENSE.txt for license information.
582aac878SKazushi (Jam) Marukawa // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
682aac878SKazushi (Jam) Marukawa //
782aac878SKazushi (Jam) Marukawa //===----------------------------------------------------------------------===//
882aac878SKazushi (Jam) Marukawa //
982aac878SKazushi (Jam) Marukawa // This file is part of the VE Disassembler.
1082aac878SKazushi (Jam) Marukawa //
1182aac878SKazushi (Jam) Marukawa //===----------------------------------------------------------------------===//
1282aac878SKazushi (Jam) Marukawa 
1382aac878SKazushi (Jam) Marukawa #include "MCTargetDesc/VEMCTargetDesc.h"
1482aac878SKazushi (Jam) Marukawa #include "TargetInfo/VETargetInfo.h"
1582aac878SKazushi (Jam) Marukawa #include "VE.h"
1682aac878SKazushi (Jam) Marukawa #include "llvm/MC/MCAsmInfo.h"
1782aac878SKazushi (Jam) Marukawa #include "llvm/MC/MCContext.h"
18*c644488aSSheng #include "llvm/MC/MCDecoderOps.h"
1982aac878SKazushi (Jam) Marukawa #include "llvm/MC/MCDisassembler/MCDisassembler.h"
2082aac878SKazushi (Jam) Marukawa #include "llvm/MC/MCInst.h"
2189b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
2282aac878SKazushi (Jam) Marukawa 
2382aac878SKazushi (Jam) Marukawa using namespace llvm;
2482aac878SKazushi (Jam) Marukawa 
2582aac878SKazushi (Jam) Marukawa #define DEBUG_TYPE "ve-disassembler"
2682aac878SKazushi (Jam) Marukawa 
2782aac878SKazushi (Jam) Marukawa typedef MCDisassembler::DecodeStatus DecodeStatus;
2882aac878SKazushi (Jam) Marukawa 
2982aac878SKazushi (Jam) Marukawa namespace {
3082aac878SKazushi (Jam) Marukawa 
3182aac878SKazushi (Jam) Marukawa /// A disassembler class for VE.
3282aac878SKazushi (Jam) Marukawa class VEDisassembler : public MCDisassembler {
3382aac878SKazushi (Jam) Marukawa public:
VEDisassembler(const MCSubtargetInfo & STI,MCContext & Ctx)3482aac878SKazushi (Jam) Marukawa   VEDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
3582aac878SKazushi (Jam) Marukawa       : MCDisassembler(STI, Ctx) {}
363a3cb929SKazu Hirata   virtual ~VEDisassembler() = default;
3782aac878SKazushi (Jam) Marukawa 
3882aac878SKazushi (Jam) Marukawa   DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
3982aac878SKazushi (Jam) Marukawa                               ArrayRef<uint8_t> Bytes, uint64_t Address,
4082aac878SKazushi (Jam) Marukawa                               raw_ostream &CStream) const override;
4182aac878SKazushi (Jam) Marukawa };
4282aac878SKazushi (Jam) Marukawa } // namespace
4382aac878SKazushi (Jam) Marukawa 
createVEDisassembler(const Target & T,const MCSubtargetInfo & STI,MCContext & Ctx)4482aac878SKazushi (Jam) Marukawa static MCDisassembler *createVEDisassembler(const Target &T,
4582aac878SKazushi (Jam) Marukawa                                             const MCSubtargetInfo &STI,
4682aac878SKazushi (Jam) Marukawa                                             MCContext &Ctx) {
4782aac878SKazushi (Jam) Marukawa   return new VEDisassembler(STI, Ctx);
4882aac878SKazushi (Jam) Marukawa }
4982aac878SKazushi (Jam) Marukawa 
LLVMInitializeVEDisassembler()501eb812e0SSergei Trofimovich extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeVEDisassembler() {
5182aac878SKazushi (Jam) Marukawa   // Register the disassembler.
5282aac878SKazushi (Jam) Marukawa   TargetRegistry::RegisterMCDisassembler(getTheVETarget(),
5382aac878SKazushi (Jam) Marukawa                                          createVEDisassembler);
5482aac878SKazushi (Jam) Marukawa }
5582aac878SKazushi (Jam) Marukawa 
5682aac878SKazushi (Jam) Marukawa static const unsigned I32RegDecoderTable[] = {
5782aac878SKazushi (Jam) Marukawa     VE::SW0,  VE::SW1,  VE::SW2,  VE::SW3,  VE::SW4,  VE::SW5,  VE::SW6,
5882aac878SKazushi (Jam) Marukawa     VE::SW7,  VE::SW8,  VE::SW9,  VE::SW10, VE::SW11, VE::SW12, VE::SW13,
5982aac878SKazushi (Jam) Marukawa     VE::SW14, VE::SW15, VE::SW16, VE::SW17, VE::SW18, VE::SW19, VE::SW20,
6082aac878SKazushi (Jam) Marukawa     VE::SW21, VE::SW22, VE::SW23, VE::SW24, VE::SW25, VE::SW26, VE::SW27,
6182aac878SKazushi (Jam) Marukawa     VE::SW28, VE::SW29, VE::SW30, VE::SW31, VE::SW32, VE::SW33, VE::SW34,
6282aac878SKazushi (Jam) Marukawa     VE::SW35, VE::SW36, VE::SW37, VE::SW38, VE::SW39, VE::SW40, VE::SW41,
6382aac878SKazushi (Jam) Marukawa     VE::SW42, VE::SW43, VE::SW44, VE::SW45, VE::SW46, VE::SW47, VE::SW48,
6482aac878SKazushi (Jam) Marukawa     VE::SW49, VE::SW50, VE::SW51, VE::SW52, VE::SW53, VE::SW54, VE::SW55,
6582aac878SKazushi (Jam) Marukawa     VE::SW56, VE::SW57, VE::SW58, VE::SW59, VE::SW60, VE::SW61, VE::SW62,
6682aac878SKazushi (Jam) Marukawa     VE::SW63};
6782aac878SKazushi (Jam) Marukawa 
6882aac878SKazushi (Jam) Marukawa static const unsigned I64RegDecoderTable[] = {
6982aac878SKazushi (Jam) Marukawa     VE::SX0,  VE::SX1,  VE::SX2,  VE::SX3,  VE::SX4,  VE::SX5,  VE::SX6,
7082aac878SKazushi (Jam) Marukawa     VE::SX7,  VE::SX8,  VE::SX9,  VE::SX10, VE::SX11, VE::SX12, VE::SX13,
7182aac878SKazushi (Jam) Marukawa     VE::SX14, VE::SX15, VE::SX16, VE::SX17, VE::SX18, VE::SX19, VE::SX20,
7282aac878SKazushi (Jam) Marukawa     VE::SX21, VE::SX22, VE::SX23, VE::SX24, VE::SX25, VE::SX26, VE::SX27,
7382aac878SKazushi (Jam) Marukawa     VE::SX28, VE::SX29, VE::SX30, VE::SX31, VE::SX32, VE::SX33, VE::SX34,
7482aac878SKazushi (Jam) Marukawa     VE::SX35, VE::SX36, VE::SX37, VE::SX38, VE::SX39, VE::SX40, VE::SX41,
7582aac878SKazushi (Jam) Marukawa     VE::SX42, VE::SX43, VE::SX44, VE::SX45, VE::SX46, VE::SX47, VE::SX48,
7682aac878SKazushi (Jam) Marukawa     VE::SX49, VE::SX50, VE::SX51, VE::SX52, VE::SX53, VE::SX54, VE::SX55,
7782aac878SKazushi (Jam) Marukawa     VE::SX56, VE::SX57, VE::SX58, VE::SX59, VE::SX60, VE::SX61, VE::SX62,
7882aac878SKazushi (Jam) Marukawa     VE::SX63};
7982aac878SKazushi (Jam) Marukawa 
8082aac878SKazushi (Jam) Marukawa static const unsigned F32RegDecoderTable[] = {
8182aac878SKazushi (Jam) Marukawa     VE::SF0,  VE::SF1,  VE::SF2,  VE::SF3,  VE::SF4,  VE::SF5,  VE::SF6,
8282aac878SKazushi (Jam) Marukawa     VE::SF7,  VE::SF8,  VE::SF9,  VE::SF10, VE::SF11, VE::SF12, VE::SF13,
8382aac878SKazushi (Jam) Marukawa     VE::SF14, VE::SF15, VE::SF16, VE::SF17, VE::SF18, VE::SF19, VE::SF20,
8482aac878SKazushi (Jam) Marukawa     VE::SF21, VE::SF22, VE::SF23, VE::SF24, VE::SF25, VE::SF26, VE::SF27,
8582aac878SKazushi (Jam) Marukawa     VE::SF28, VE::SF29, VE::SF30, VE::SF31, VE::SF32, VE::SF33, VE::SF34,
8682aac878SKazushi (Jam) Marukawa     VE::SF35, VE::SF36, VE::SF37, VE::SF38, VE::SF39, VE::SF40, VE::SF41,
8782aac878SKazushi (Jam) Marukawa     VE::SF42, VE::SF43, VE::SF44, VE::SF45, VE::SF46, VE::SF47, VE::SF48,
8882aac878SKazushi (Jam) Marukawa     VE::SF49, VE::SF50, VE::SF51, VE::SF52, VE::SF53, VE::SF54, VE::SF55,
8982aac878SKazushi (Jam) Marukawa     VE::SF56, VE::SF57, VE::SF58, VE::SF59, VE::SF60, VE::SF61, VE::SF62,
9082aac878SKazushi (Jam) Marukawa     VE::SF63};
9182aac878SKazushi (Jam) Marukawa 
92b60404a6SKazushi (Jam) Marukawa static const unsigned F128RegDecoderTable[] = {
93b60404a6SKazushi (Jam) Marukawa     VE::Q0,  VE::Q1,  VE::Q2,  VE::Q3,  VE::Q4,  VE::Q5,  VE::Q6,  VE::Q7,
94b60404a6SKazushi (Jam) Marukawa     VE::Q8,  VE::Q9,  VE::Q10, VE::Q11, VE::Q12, VE::Q13, VE::Q14, VE::Q15,
95b60404a6SKazushi (Jam) Marukawa     VE::Q16, VE::Q17, VE::Q18, VE::Q19, VE::Q20, VE::Q21, VE::Q22, VE::Q23,
96b60404a6SKazushi (Jam) Marukawa     VE::Q24, VE::Q25, VE::Q26, VE::Q27, VE::Q28, VE::Q29, VE::Q30, VE::Q31};
97b60404a6SKazushi (Jam) Marukawa 
9894c18d91SKazushi (Jam) Marukawa static const unsigned V64RegDecoderTable[] = {
9994c18d91SKazushi (Jam) Marukawa     VE::V0,  VE::V1,  VE::V2,  VE::V3,  VE::V4,  VE::V5,  VE::V6,  VE::V7,
10094c18d91SKazushi (Jam) Marukawa     VE::V8,  VE::V9,  VE::V10, VE::V11, VE::V12, VE::V13, VE::V14, VE::V15,
10194c18d91SKazushi (Jam) Marukawa     VE::V16, VE::V17, VE::V18, VE::V19, VE::V20, VE::V21, VE::V22, VE::V23,
10294c18d91SKazushi (Jam) Marukawa     VE::V24, VE::V25, VE::V26, VE::V27, VE::V28, VE::V29, VE::V30, VE::V31,
10394c18d91SKazushi (Jam) Marukawa     VE::V32, VE::V33, VE::V34, VE::V35, VE::V36, VE::V37, VE::V38, VE::V39,
10494c18d91SKazushi (Jam) Marukawa     VE::V40, VE::V41, VE::V42, VE::V43, VE::V44, VE::V45, VE::V46, VE::V47,
10594c18d91SKazushi (Jam) Marukawa     VE::V48, VE::V49, VE::V50, VE::V51, VE::V52, VE::V53, VE::V54, VE::V55,
10694c18d91SKazushi (Jam) Marukawa     VE::V56, VE::V57, VE::V58, VE::V59, VE::V60, VE::V61, VE::V62, VE::V63};
10794c18d91SKazushi (Jam) Marukawa 
10894c18d91SKazushi (Jam) Marukawa static const unsigned VMRegDecoderTable[] = {
10994c18d91SKazushi (Jam) Marukawa     VE::VM0,  VE::VM1,  VE::VM2,  VE::VM3, VE::VM4,  VE::VM5,
11094c18d91SKazushi (Jam) Marukawa     VE::VM6,  VE::VM7,  VE::VM8,  VE::VM9, VE::VM10, VE::VM11,
11194c18d91SKazushi (Jam) Marukawa     VE::VM12, VE::VM13, VE::VM14, VE::VM15};
11294c18d91SKazushi (Jam) Marukawa 
11394c18d91SKazushi (Jam) Marukawa static const unsigned VM512RegDecoderTable[] = {VE::VMP0, VE::VMP1, VE::VMP2,
11494c18d91SKazushi (Jam) Marukawa                                                 VE::VMP3, VE::VMP4, VE::VMP5,
11594c18d91SKazushi (Jam) Marukawa                                                 VE::VMP6, VE::VMP7};
11694c18d91SKazushi (Jam) Marukawa 
117c95ba11aSKazushi (Jam) Marukawa static const unsigned MiscRegDecoderTable[] = {
118c95ba11aSKazushi (Jam) Marukawa     VE::USRCC,      VE::PSW,        VE::SAR,        VE::NoRegister,
119c95ba11aSKazushi (Jam) Marukawa     VE::NoRegister, VE::NoRegister, VE::NoRegister, VE::PMMR,
120c95ba11aSKazushi (Jam) Marukawa     VE::PMCR0,      VE::PMCR1,      VE::PMCR2,      VE::PMCR3,
121c95ba11aSKazushi (Jam) Marukawa     VE::NoRegister, VE::NoRegister, VE::NoRegister, VE::NoRegister,
122c95ba11aSKazushi (Jam) Marukawa     VE::PMC0,       VE::PMC1,       VE::PMC2,       VE::PMC3,
123c95ba11aSKazushi (Jam) Marukawa     VE::PMC4,       VE::PMC5,       VE::PMC6,       VE::PMC7,
124c95ba11aSKazushi (Jam) Marukawa     VE::PMC8,       VE::PMC9,       VE::PMC10,      VE::PMC11,
125c95ba11aSKazushi (Jam) Marukawa     VE::PMC12,      VE::PMC13,      VE::PMC14};
126c95ba11aSKazushi (Jam) Marukawa 
DecodeI32RegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)12782aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeI32RegisterClass(MCInst &Inst, unsigned RegNo,
12882aac878SKazushi (Jam) Marukawa                                            uint64_t Address,
1294ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
13082aac878SKazushi (Jam) Marukawa   if (RegNo > 63)
13182aac878SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
13282aac878SKazushi (Jam) Marukawa   unsigned Reg = I32RegDecoderTable[RegNo];
13382aac878SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
13482aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
13582aac878SKazushi (Jam) Marukawa }
13682aac878SKazushi (Jam) Marukawa 
DecodeI64RegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)13782aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeI64RegisterClass(MCInst &Inst, unsigned RegNo,
13882aac878SKazushi (Jam) Marukawa                                            uint64_t Address,
1394ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
14082aac878SKazushi (Jam) Marukawa   if (RegNo > 63)
14182aac878SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
14282aac878SKazushi (Jam) Marukawa   unsigned Reg = I64RegDecoderTable[RegNo];
14382aac878SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
14482aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
14582aac878SKazushi (Jam) Marukawa }
14682aac878SKazushi (Jam) Marukawa 
DecodeF32RegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)14782aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeF32RegisterClass(MCInst &Inst, unsigned RegNo,
14882aac878SKazushi (Jam) Marukawa                                            uint64_t Address,
1494ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
15082aac878SKazushi (Jam) Marukawa   if (RegNo > 63)
15182aac878SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
15282aac878SKazushi (Jam) Marukawa   unsigned Reg = F32RegDecoderTable[RegNo];
15382aac878SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
15482aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
15582aac878SKazushi (Jam) Marukawa }
15682aac878SKazushi (Jam) Marukawa 
DecodeF128RegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)157b60404a6SKazushi (Jam) Marukawa static DecodeStatus DecodeF128RegisterClass(MCInst &Inst, unsigned RegNo,
158b60404a6SKazushi (Jam) Marukawa                                             uint64_t Address,
1594ae9745aSMaksim Panchenko                                             const MCDisassembler *Decoder) {
160b60404a6SKazushi (Jam) Marukawa   if (RegNo % 2 || RegNo > 63)
161b60404a6SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
162b60404a6SKazushi (Jam) Marukawa   unsigned Reg = F128RegDecoderTable[RegNo / 2];
163b60404a6SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
164b60404a6SKazushi (Jam) Marukawa   return MCDisassembler::Success;
165b60404a6SKazushi (Jam) Marukawa }
166b60404a6SKazushi (Jam) Marukawa 
DecodeV64RegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)16794c18d91SKazushi (Jam) Marukawa static DecodeStatus DecodeV64RegisterClass(MCInst &Inst, unsigned RegNo,
16894c18d91SKazushi (Jam) Marukawa                                            uint64_t Address,
1694ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
17094c18d91SKazushi (Jam) Marukawa   unsigned Reg = VE::NoRegister;
17194c18d91SKazushi (Jam) Marukawa   if (RegNo == 255)
17294c18d91SKazushi (Jam) Marukawa     Reg = VE::VIX;
17394c18d91SKazushi (Jam) Marukawa   else if (RegNo > 63)
17494c18d91SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
17594c18d91SKazushi (Jam) Marukawa   else
17694c18d91SKazushi (Jam) Marukawa     Reg = V64RegDecoderTable[RegNo];
17794c18d91SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
17894c18d91SKazushi (Jam) Marukawa   return MCDisassembler::Success;
17994c18d91SKazushi (Jam) Marukawa }
18094c18d91SKazushi (Jam) Marukawa 
DecodeVMRegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)18194c18d91SKazushi (Jam) Marukawa static DecodeStatus DecodeVMRegisterClass(MCInst &Inst, unsigned RegNo,
18294c18d91SKazushi (Jam) Marukawa                                           uint64_t Address,
1834ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder) {
18494c18d91SKazushi (Jam) Marukawa   if (RegNo > 15)
18594c18d91SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
18694c18d91SKazushi (Jam) Marukawa   unsigned Reg = VMRegDecoderTable[RegNo];
18794c18d91SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
18894c18d91SKazushi (Jam) Marukawa   return MCDisassembler::Success;
18994c18d91SKazushi (Jam) Marukawa }
19094c18d91SKazushi (Jam) Marukawa 
DecodeVM512RegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)19194c18d91SKazushi (Jam) Marukawa static DecodeStatus DecodeVM512RegisterClass(MCInst &Inst, unsigned RegNo,
19294c18d91SKazushi (Jam) Marukawa                                              uint64_t Address,
1934ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder) {
19494c18d91SKazushi (Jam) Marukawa   if (RegNo % 2 || RegNo > 15)
19594c18d91SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
19694c18d91SKazushi (Jam) Marukawa   unsigned Reg = VM512RegDecoderTable[RegNo / 2];
19794c18d91SKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
19894c18d91SKazushi (Jam) Marukawa   return MCDisassembler::Success;
19994c18d91SKazushi (Jam) Marukawa }
20094c18d91SKazushi (Jam) Marukawa 
DecodeMISCRegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)201c95ba11aSKazushi (Jam) Marukawa static DecodeStatus DecodeMISCRegisterClass(MCInst &Inst, unsigned RegNo,
202c95ba11aSKazushi (Jam) Marukawa                                             uint64_t Address,
2034ae9745aSMaksim Panchenko                                             const MCDisassembler *Decoder) {
204c95ba11aSKazushi (Jam) Marukawa   if (RegNo > 30)
205c95ba11aSKazushi (Jam) Marukawa     return MCDisassembler::Fail;
206c95ba11aSKazushi (Jam) Marukawa   unsigned Reg = MiscRegDecoderTable[RegNo];
207c95ba11aSKazushi (Jam) Marukawa   if (Reg == VE::NoRegister)
208c95ba11aSKazushi (Jam) Marukawa     return MCDisassembler::Fail;
209c95ba11aSKazushi (Jam) Marukawa   Inst.addOperand(MCOperand::createReg(Reg));
210c95ba11aSKazushi (Jam) Marukawa   return MCDisassembler::Success;
211c95ba11aSKazushi (Jam) Marukawa }
212c95ba11aSKazushi (Jam) Marukawa 
213b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeASX(MCInst &Inst, uint64_t insn, uint64_t Address,
2144ae9745aSMaksim Panchenko                               const MCDisassembler *Decoder);
21582aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadI32(MCInst &Inst, uint64_t insn, uint64_t Address,
2164ae9745aSMaksim Panchenko                                   const MCDisassembler *Decoder);
21782aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreI32(MCInst &Inst, uint64_t insn,
2184ae9745aSMaksim Panchenko                                    uint64_t Address,
2194ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder);
22082aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadI64(MCInst &Inst, uint64_t insn, uint64_t Address,
2214ae9745aSMaksim Panchenko                                   const MCDisassembler *Decoder);
22282aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreI64(MCInst &Inst, uint64_t insn,
2234ae9745aSMaksim Panchenko                                    uint64_t Address,
2244ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder);
22582aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadF32(MCInst &Inst, uint64_t insn, uint64_t Address,
2264ae9745aSMaksim Panchenko                                   const MCDisassembler *Decoder);
22782aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreF32(MCInst &Inst, uint64_t insn,
2284ae9745aSMaksim Panchenko                                    uint64_t Address,
2294ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder);
23049e4faa0SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadASI64(MCInst &Inst, uint64_t insn,
2314ae9745aSMaksim Panchenko                                     uint64_t Address,
2324ae9745aSMaksim Panchenko                                     const MCDisassembler *Decoder);
23349e4faa0SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreASI64(MCInst &Inst, uint64_t insn,
2344ae9745aSMaksim Panchenko                                      uint64_t Address,
2354ae9745aSMaksim Panchenko                                      const MCDisassembler *Decoder);
236b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeTS1AMI64(MCInst &Inst, uint64_t insn,
2374ae9745aSMaksim Panchenko                                    uint64_t Address,
2384ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder);
239b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeTS1AMI32(MCInst &Inst, uint64_t insn,
2404ae9745aSMaksim Panchenko                                    uint64_t Address,
2414ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder);
242b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeCASI64(MCInst &Inst, uint64_t insn, uint64_t Address,
2434ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder);
244b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeCASI32(MCInst &Inst, uint64_t insn, uint64_t Address,
2454ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder);
246117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeCall(MCInst &Inst, uint64_t insn, uint64_t Address,
2474ae9745aSMaksim Panchenko                                const MCDisassembler *Decoder);
24882aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeSIMM7(MCInst &Inst, uint64_t insn, uint64_t Address,
2494ae9745aSMaksim Panchenko                                 const MCDisassembler *Decoder);
250e026f147SKazushi (Jam) Marukawa static DecodeStatus DecodeSIMM32(MCInst &Inst, uint64_t insn, uint64_t Address,
2514ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder);
252117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeCCOperand(MCInst &Inst, uint64_t insn,
2534ae9745aSMaksim Panchenko                                     uint64_t Address,
2544ae9745aSMaksim Panchenko                                     const MCDisassembler *Decoder);
25534fef0c9SKazushi (Jam) Marukawa static DecodeStatus DecodeRDOperand(MCInst &Inst, uint64_t insn,
2564ae9745aSMaksim Panchenko                                     uint64_t Address,
2574ae9745aSMaksim Panchenko                                     const MCDisassembler *Decoder);
258117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeBranchCondition(MCInst &Inst, uint64_t insn,
259117c0d7cSKazushi (Jam) Marukawa                                           uint64_t Address,
2604ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder);
261117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeBranchConditionAlways(MCInst &Inst, uint64_t insn,
262117c0d7cSKazushi (Jam) Marukawa                                                 uint64_t Address,
2634ae9745aSMaksim Panchenko                                                 const MCDisassembler *Decoder);
26482aac878SKazushi (Jam) Marukawa 
26582aac878SKazushi (Jam) Marukawa #include "VEGenDisassemblerTables.inc"
26682aac878SKazushi (Jam) Marukawa 
26782aac878SKazushi (Jam) Marukawa /// Read four bytes from the ArrayRef and return 32 bit word.
readInstruction64(ArrayRef<uint8_t> Bytes,uint64_t Address,uint64_t & Size,uint64_t & Insn,bool IsLittleEndian)26882aac878SKazushi (Jam) Marukawa static DecodeStatus readInstruction64(ArrayRef<uint8_t> Bytes, uint64_t Address,
26982aac878SKazushi (Jam) Marukawa                                       uint64_t &Size, uint64_t &Insn,
27082aac878SKazushi (Jam) Marukawa                                       bool IsLittleEndian) {
27182aac878SKazushi (Jam) Marukawa   // We want to read exactly 8 Bytes of data.
27282aac878SKazushi (Jam) Marukawa   if (Bytes.size() < 8) {
27382aac878SKazushi (Jam) Marukawa     Size = 0;
27482aac878SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
27582aac878SKazushi (Jam) Marukawa   }
27682aac878SKazushi (Jam) Marukawa 
27782aac878SKazushi (Jam) Marukawa   Insn = IsLittleEndian
27882aac878SKazushi (Jam) Marukawa              ? ((uint64_t)Bytes[0] << 0) | ((uint64_t)Bytes[1] << 8) |
27982aac878SKazushi (Jam) Marukawa                    ((uint64_t)Bytes[2] << 16) | ((uint64_t)Bytes[3] << 24) |
28082aac878SKazushi (Jam) Marukawa                    ((uint64_t)Bytes[4] << 32) | ((uint64_t)Bytes[5] << 40) |
28182aac878SKazushi (Jam) Marukawa                    ((uint64_t)Bytes[6] << 48) | ((uint64_t)Bytes[7] << 56)
28282aac878SKazushi (Jam) Marukawa              : ((uint64_t)Bytes[7] << 0) | ((uint64_t)Bytes[6] << 8) |
28382aac878SKazushi (Jam) Marukawa                    ((uint64_t)Bytes[5] << 16) | ((uint64_t)Bytes[4] << 24) |
28482aac878SKazushi (Jam) Marukawa                    ((uint64_t)Bytes[3] << 32) | ((uint64_t)Bytes[2] << 40) |
28582aac878SKazushi (Jam) Marukawa                    ((uint64_t)Bytes[1] << 48) | ((uint64_t)Bytes[0] << 56);
28682aac878SKazushi (Jam) Marukawa 
28782aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
28882aac878SKazushi (Jam) Marukawa }
28982aac878SKazushi (Jam) Marukawa 
getInstruction(MCInst & Instr,uint64_t & Size,ArrayRef<uint8_t> Bytes,uint64_t Address,raw_ostream & CStream) const29082aac878SKazushi (Jam) Marukawa DecodeStatus VEDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
29182aac878SKazushi (Jam) Marukawa                                             ArrayRef<uint8_t> Bytes,
29282aac878SKazushi (Jam) Marukawa                                             uint64_t Address,
29382aac878SKazushi (Jam) Marukawa                                             raw_ostream &CStream) const {
29482aac878SKazushi (Jam) Marukawa   uint64_t Insn;
29582aac878SKazushi (Jam) Marukawa   bool isLittleEndian = getContext().getAsmInfo()->isLittleEndian();
29682aac878SKazushi (Jam) Marukawa   DecodeStatus Result =
29782aac878SKazushi (Jam) Marukawa       readInstruction64(Bytes, Address, Size, Insn, isLittleEndian);
29882aac878SKazushi (Jam) Marukawa   if (Result == MCDisassembler::Fail)
29982aac878SKazushi (Jam) Marukawa     return MCDisassembler::Fail;
30082aac878SKazushi (Jam) Marukawa 
30182aac878SKazushi (Jam) Marukawa   // Calling the auto-generated decoder function.
30282aac878SKazushi (Jam) Marukawa 
30382aac878SKazushi (Jam) Marukawa   Result = decodeInstruction(DecoderTableVE64, Instr, Insn, Address, this, STI);
30482aac878SKazushi (Jam) Marukawa 
30582aac878SKazushi (Jam) Marukawa   if (Result != MCDisassembler::Fail) {
30682aac878SKazushi (Jam) Marukawa     Size = 8;
30782aac878SKazushi (Jam) Marukawa     return Result;
30882aac878SKazushi (Jam) Marukawa   }
30982aac878SKazushi (Jam) Marukawa 
31082aac878SKazushi (Jam) Marukawa   return MCDisassembler::Fail;
31182aac878SKazushi (Jam) Marukawa }
31282aac878SKazushi (Jam) Marukawa 
31382aac878SKazushi (Jam) Marukawa typedef DecodeStatus (*DecodeFunc)(MCInst &MI, unsigned RegNo, uint64_t Address,
3144ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder);
31582aac878SKazushi (Jam) Marukawa 
DecodeASX(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)31682aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeASX(MCInst &MI, uint64_t insn, uint64_t Address,
3174ae9745aSMaksim Panchenko                               const MCDisassembler *Decoder) {
31882aac878SKazushi (Jam) Marukawa   unsigned sy = fieldFromInstruction(insn, 40, 7);
31982aac878SKazushi (Jam) Marukawa   bool cy = fieldFromInstruction(insn, 47, 1);
32082aac878SKazushi (Jam) Marukawa   unsigned sz = fieldFromInstruction(insn, 32, 7);
32182aac878SKazushi (Jam) Marukawa   bool cz = fieldFromInstruction(insn, 39, 1);
32282aac878SKazushi (Jam) Marukawa   uint64_t simm32 = SignExtend64<32>(fieldFromInstruction(insn, 0, 32));
32382aac878SKazushi (Jam) Marukawa   DecodeStatus status;
32482aac878SKazushi (Jam) Marukawa 
32582aac878SKazushi (Jam) Marukawa   // Decode sz.
32682aac878SKazushi (Jam) Marukawa   if (cz) {
32782aac878SKazushi (Jam) Marukawa     status = DecodeI64RegisterClass(MI, sz, Address, Decoder);
32882aac878SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
32982aac878SKazushi (Jam) Marukawa       return status;
33082aac878SKazushi (Jam) Marukawa   } else {
33182aac878SKazushi (Jam) Marukawa     MI.addOperand(MCOperand::createImm(0));
33282aac878SKazushi (Jam) Marukawa   }
33382aac878SKazushi (Jam) Marukawa 
33482aac878SKazushi (Jam) Marukawa   // Decode sy.
33582aac878SKazushi (Jam) Marukawa   if (cy) {
33682aac878SKazushi (Jam) Marukawa     status = DecodeI64RegisterClass(MI, sy, Address, Decoder);
33782aac878SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
33882aac878SKazushi (Jam) Marukawa       return status;
33982aac878SKazushi (Jam) Marukawa   } else {
34082aac878SKazushi (Jam) Marukawa     MI.addOperand(MCOperand::createImm(SignExtend32<7>(sy)));
34182aac878SKazushi (Jam) Marukawa   }
34282aac878SKazushi (Jam) Marukawa 
34382aac878SKazushi (Jam) Marukawa   // Decode simm32.
34482aac878SKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(simm32));
34582aac878SKazushi (Jam) Marukawa 
34682aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
34782aac878SKazushi (Jam) Marukawa }
34882aac878SKazushi (Jam) Marukawa 
DecodeAS(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)349117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeAS(MCInst &MI, uint64_t insn, uint64_t Address,
3504ae9745aSMaksim Panchenko                              const MCDisassembler *Decoder) {
351117c0d7cSKazushi (Jam) Marukawa   unsigned sz = fieldFromInstruction(insn, 32, 7);
352117c0d7cSKazushi (Jam) Marukawa   bool cz = fieldFromInstruction(insn, 39, 1);
353117c0d7cSKazushi (Jam) Marukawa   uint64_t simm32 = SignExtend64<32>(fieldFromInstruction(insn, 0, 32));
354117c0d7cSKazushi (Jam) Marukawa   DecodeStatus status;
355117c0d7cSKazushi (Jam) Marukawa 
356117c0d7cSKazushi (Jam) Marukawa   // Decode sz.
357117c0d7cSKazushi (Jam) Marukawa   if (cz) {
358117c0d7cSKazushi (Jam) Marukawa     status = DecodeI64RegisterClass(MI, sz, Address, Decoder);
359117c0d7cSKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
360117c0d7cSKazushi (Jam) Marukawa       return status;
361117c0d7cSKazushi (Jam) Marukawa   } else {
362117c0d7cSKazushi (Jam) Marukawa     MI.addOperand(MCOperand::createImm(0));
363117c0d7cSKazushi (Jam) Marukawa   }
364117c0d7cSKazushi (Jam) Marukawa 
365117c0d7cSKazushi (Jam) Marukawa   // Decode simm32.
366117c0d7cSKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(simm32));
367117c0d7cSKazushi (Jam) Marukawa 
368117c0d7cSKazushi (Jam) Marukawa   return MCDisassembler::Success;
369117c0d7cSKazushi (Jam) Marukawa }
370117c0d7cSKazushi (Jam) Marukawa 
DecodeMem(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder,bool isLoad,DecodeFunc DecodeSX)37182aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeMem(MCInst &MI, uint64_t insn, uint64_t Address,
3724ae9745aSMaksim Panchenko                               const MCDisassembler *Decoder, bool isLoad,
37382aac878SKazushi (Jam) Marukawa                               DecodeFunc DecodeSX) {
37482aac878SKazushi (Jam) Marukawa   unsigned sx = fieldFromInstruction(insn, 48, 7);
37582aac878SKazushi (Jam) Marukawa 
37682aac878SKazushi (Jam) Marukawa   DecodeStatus status;
37782aac878SKazushi (Jam) Marukawa   if (isLoad) {
37882aac878SKazushi (Jam) Marukawa     status = DecodeSX(MI, sx, Address, Decoder);
37982aac878SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
38082aac878SKazushi (Jam) Marukawa       return status;
38182aac878SKazushi (Jam) Marukawa   }
38282aac878SKazushi (Jam) Marukawa 
38382aac878SKazushi (Jam) Marukawa   status = DecodeASX(MI, insn, Address, Decoder);
38482aac878SKazushi (Jam) Marukawa   if (status != MCDisassembler::Success)
38582aac878SKazushi (Jam) Marukawa     return status;
38682aac878SKazushi (Jam) Marukawa 
38782aac878SKazushi (Jam) Marukawa   if (!isLoad) {
38882aac878SKazushi (Jam) Marukawa     status = DecodeSX(MI, sx, Address, Decoder);
38982aac878SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
39082aac878SKazushi (Jam) Marukawa       return status;
39182aac878SKazushi (Jam) Marukawa   }
39282aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
39382aac878SKazushi (Jam) Marukawa }
39482aac878SKazushi (Jam) Marukawa 
DecodeMemAS(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder,bool isLoad,DecodeFunc DecodeSX)39549e4faa0SKazushi (Jam) Marukawa static DecodeStatus DecodeMemAS(MCInst &MI, uint64_t insn, uint64_t Address,
3964ae9745aSMaksim Panchenko                                 const MCDisassembler *Decoder, bool isLoad,
39749e4faa0SKazushi (Jam) Marukawa                                 DecodeFunc DecodeSX) {
39849e4faa0SKazushi (Jam) Marukawa   unsigned sx = fieldFromInstruction(insn, 48, 7);
39949e4faa0SKazushi (Jam) Marukawa 
40049e4faa0SKazushi (Jam) Marukawa   DecodeStatus status;
40149e4faa0SKazushi (Jam) Marukawa   if (isLoad) {
40249e4faa0SKazushi (Jam) Marukawa     status = DecodeSX(MI, sx, Address, Decoder);
40349e4faa0SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
40449e4faa0SKazushi (Jam) Marukawa       return status;
40549e4faa0SKazushi (Jam) Marukawa   }
40649e4faa0SKazushi (Jam) Marukawa 
40749e4faa0SKazushi (Jam) Marukawa   status = DecodeAS(MI, insn, Address, Decoder);
40849e4faa0SKazushi (Jam) Marukawa   if (status != MCDisassembler::Success)
40949e4faa0SKazushi (Jam) Marukawa     return status;
41049e4faa0SKazushi (Jam) Marukawa 
41149e4faa0SKazushi (Jam) Marukawa   if (!isLoad) {
41249e4faa0SKazushi (Jam) Marukawa     status = DecodeSX(MI, sx, Address, Decoder);
41349e4faa0SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
41449e4faa0SKazushi (Jam) Marukawa       return status;
41549e4faa0SKazushi (Jam) Marukawa   }
41649e4faa0SKazushi (Jam) Marukawa   return MCDisassembler::Success;
41749e4faa0SKazushi (Jam) Marukawa }
41849e4faa0SKazushi (Jam) Marukawa 
DecodeLoadI32(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)41982aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadI32(MCInst &Inst, uint64_t insn, uint64_t Address,
4204ae9745aSMaksim Panchenko                                   const MCDisassembler *Decoder) {
42182aac878SKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, true, DecodeI32RegisterClass);
42282aac878SKazushi (Jam) Marukawa }
42382aac878SKazushi (Jam) Marukawa 
DecodeStoreI32(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)42482aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreI32(MCInst &Inst, uint64_t insn,
4254ae9745aSMaksim Panchenko                                    uint64_t Address,
4264ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder) {
42782aac878SKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, false, DecodeI32RegisterClass);
42882aac878SKazushi (Jam) Marukawa }
42982aac878SKazushi (Jam) Marukawa 
DecodeLoadI64(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)43082aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadI64(MCInst &Inst, uint64_t insn, uint64_t Address,
4314ae9745aSMaksim Panchenko                                   const MCDisassembler *Decoder) {
43282aac878SKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, true, DecodeI64RegisterClass);
43382aac878SKazushi (Jam) Marukawa }
43482aac878SKazushi (Jam) Marukawa 
DecodeStoreI64(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)43582aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreI64(MCInst &Inst, uint64_t insn,
4364ae9745aSMaksim Panchenko                                    uint64_t Address,
4374ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder) {
43882aac878SKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, false, DecodeI64RegisterClass);
43982aac878SKazushi (Jam) Marukawa }
44082aac878SKazushi (Jam) Marukawa 
DecodeLoadF32(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)44182aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadF32(MCInst &Inst, uint64_t insn, uint64_t Address,
4424ae9745aSMaksim Panchenko                                   const MCDisassembler *Decoder) {
44382aac878SKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, true, DecodeF32RegisterClass);
44482aac878SKazushi (Jam) Marukawa }
44582aac878SKazushi (Jam) Marukawa 
DecodeStoreF32(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)44682aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreF32(MCInst &Inst, uint64_t insn,
4474ae9745aSMaksim Panchenko                                    uint64_t Address,
4484ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder) {
44982aac878SKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, false, DecodeF32RegisterClass);
45082aac878SKazushi (Jam) Marukawa }
45182aac878SKazushi (Jam) Marukawa 
DecodeLoadASI64(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)45249e4faa0SKazushi (Jam) Marukawa static DecodeStatus DecodeLoadASI64(MCInst &Inst, uint64_t insn,
4534ae9745aSMaksim Panchenko                                     uint64_t Address,
4544ae9745aSMaksim Panchenko                                     const MCDisassembler *Decoder) {
45549e4faa0SKazushi (Jam) Marukawa   return DecodeMemAS(Inst, insn, Address, Decoder, true,
45649e4faa0SKazushi (Jam) Marukawa                      DecodeI64RegisterClass);
45749e4faa0SKazushi (Jam) Marukawa }
45849e4faa0SKazushi (Jam) Marukawa 
DecodeStoreASI64(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)45949e4faa0SKazushi (Jam) Marukawa static DecodeStatus DecodeStoreASI64(MCInst &Inst, uint64_t insn,
4604ae9745aSMaksim Panchenko                                      uint64_t Address,
4614ae9745aSMaksim Panchenko                                      const MCDisassembler *Decoder) {
46249e4faa0SKazushi (Jam) Marukawa   return DecodeMemAS(Inst, insn, Address, Decoder, false,
46349e4faa0SKazushi (Jam) Marukawa                      DecodeI64RegisterClass);
46449e4faa0SKazushi (Jam) Marukawa }
46549e4faa0SKazushi (Jam) Marukawa 
DecodeCAS(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder,bool isImmOnly,bool isUImm,DecodeFunc DecodeSX)466b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeCAS(MCInst &MI, uint64_t insn, uint64_t Address,
4674ae9745aSMaksim Panchenko                               const MCDisassembler *Decoder, bool isImmOnly,
4684ae9745aSMaksim Panchenko                               bool isUImm, DecodeFunc DecodeSX) {
469b641c9f7SKazushi (Jam) Marukawa   unsigned sx = fieldFromInstruction(insn, 48, 7);
470b641c9f7SKazushi (Jam) Marukawa   bool cy = fieldFromInstruction(insn, 47, 1);
471b641c9f7SKazushi (Jam) Marukawa   unsigned sy = fieldFromInstruction(insn, 40, 7);
472b641c9f7SKazushi (Jam) Marukawa 
473b641c9f7SKazushi (Jam) Marukawa   // Add $sx.
474b641c9f7SKazushi (Jam) Marukawa   DecodeStatus status;
475b641c9f7SKazushi (Jam) Marukawa   status = DecodeSX(MI, sx, Address, Decoder);
476b641c9f7SKazushi (Jam) Marukawa   if (status != MCDisassembler::Success)
477b641c9f7SKazushi (Jam) Marukawa     return status;
478b641c9f7SKazushi (Jam) Marukawa 
479b641c9f7SKazushi (Jam) Marukawa   // Add $disp($sz).
480b641c9f7SKazushi (Jam) Marukawa   status = DecodeAS(MI, insn, Address, Decoder);
481b641c9f7SKazushi (Jam) Marukawa   if (status != MCDisassembler::Success)
482b641c9f7SKazushi (Jam) Marukawa     return status;
483b641c9f7SKazushi (Jam) Marukawa 
484b641c9f7SKazushi (Jam) Marukawa   // Add $sy.
485b641c9f7SKazushi (Jam) Marukawa   if (cy && !isImmOnly) {
486b641c9f7SKazushi (Jam) Marukawa     status = DecodeSX(MI, sy, Address, Decoder);
487b641c9f7SKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
488b641c9f7SKazushi (Jam) Marukawa       return status;
489b641c9f7SKazushi (Jam) Marukawa   } else {
490b641c9f7SKazushi (Jam) Marukawa     if (isUImm)
491b641c9f7SKazushi (Jam) Marukawa       MI.addOperand(MCOperand::createImm(sy));
492b641c9f7SKazushi (Jam) Marukawa     else
493b641c9f7SKazushi (Jam) Marukawa       MI.addOperand(MCOperand::createImm(SignExtend32<7>(sy)));
494b641c9f7SKazushi (Jam) Marukawa   }
495b641c9f7SKazushi (Jam) Marukawa 
496b641c9f7SKazushi (Jam) Marukawa   // Add $sd.
497b641c9f7SKazushi (Jam) Marukawa   status = DecodeSX(MI, sx, Address, Decoder);
498b641c9f7SKazushi (Jam) Marukawa   if (status != MCDisassembler::Success)
499b641c9f7SKazushi (Jam) Marukawa     return status;
500b641c9f7SKazushi (Jam) Marukawa 
501b641c9f7SKazushi (Jam) Marukawa   return MCDisassembler::Success;
502b641c9f7SKazushi (Jam) Marukawa }
503b641c9f7SKazushi (Jam) Marukawa 
DecodeTS1AMI64(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)504b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeTS1AMI64(MCInst &MI, uint64_t insn, uint64_t Address,
5054ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder) {
506b641c9f7SKazushi (Jam) Marukawa   return DecodeCAS(MI, insn, Address, Decoder, false, true,
507b641c9f7SKazushi (Jam) Marukawa                    DecodeI64RegisterClass);
508b641c9f7SKazushi (Jam) Marukawa }
509b641c9f7SKazushi (Jam) Marukawa 
DecodeTS1AMI32(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)510b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeTS1AMI32(MCInst &MI, uint64_t insn, uint64_t Address,
5114ae9745aSMaksim Panchenko                                    const MCDisassembler *Decoder) {
512b641c9f7SKazushi (Jam) Marukawa   return DecodeCAS(MI, insn, Address, Decoder, false, true,
513b641c9f7SKazushi (Jam) Marukawa                    DecodeI32RegisterClass);
514b641c9f7SKazushi (Jam) Marukawa }
515b641c9f7SKazushi (Jam) Marukawa 
DecodeCASI64(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)516b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeCASI64(MCInst &MI, uint64_t insn, uint64_t Address,
5174ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder) {
518b641c9f7SKazushi (Jam) Marukawa   return DecodeCAS(MI, insn, Address, Decoder, false, false,
519b641c9f7SKazushi (Jam) Marukawa                    DecodeI64RegisterClass);
520b641c9f7SKazushi (Jam) Marukawa }
521b641c9f7SKazushi (Jam) Marukawa 
DecodeCASI32(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)522b641c9f7SKazushi (Jam) Marukawa static DecodeStatus DecodeCASI32(MCInst &MI, uint64_t insn, uint64_t Address,
5234ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder) {
524b641c9f7SKazushi (Jam) Marukawa   return DecodeCAS(MI, insn, Address, Decoder, false, false,
525b641c9f7SKazushi (Jam) Marukawa                    DecodeI32RegisterClass);
526b641c9f7SKazushi (Jam) Marukawa }
527b641c9f7SKazushi (Jam) Marukawa 
DecodeCall(MCInst & Inst,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)528117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeCall(MCInst &Inst, uint64_t insn, uint64_t Address,
5294ae9745aSMaksim Panchenko                                const MCDisassembler *Decoder) {
530117c0d7cSKazushi (Jam) Marukawa   return DecodeMem(Inst, insn, Address, Decoder, true, DecodeI64RegisterClass);
531117c0d7cSKazushi (Jam) Marukawa }
532117c0d7cSKazushi (Jam) Marukawa 
DecodeSIMM7(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)53382aac878SKazushi (Jam) Marukawa static DecodeStatus DecodeSIMM7(MCInst &MI, uint64_t insn, uint64_t Address,
5344ae9745aSMaksim Panchenko                                 const MCDisassembler *Decoder) {
53582aac878SKazushi (Jam) Marukawa   uint64_t tgt = SignExtend64<7>(insn);
53682aac878SKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(tgt));
53782aac878SKazushi (Jam) Marukawa   return MCDisassembler::Success;
53882aac878SKazushi (Jam) Marukawa }
539117c0d7cSKazushi (Jam) Marukawa 
DecodeSIMM32(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)540e026f147SKazushi (Jam) Marukawa static DecodeStatus DecodeSIMM32(MCInst &MI, uint64_t insn, uint64_t Address,
5414ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder) {
542e026f147SKazushi (Jam) Marukawa   uint64_t tgt = SignExtend64<32>(insn);
543e026f147SKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(tgt));
544e026f147SKazushi (Jam) Marukawa   return MCDisassembler::Success;
545e026f147SKazushi (Jam) Marukawa }
546e026f147SKazushi (Jam) Marukawa 
isIntegerBCKind(MCInst & MI)547117c0d7cSKazushi (Jam) Marukawa static bool isIntegerBCKind(MCInst &MI) {
548117c0d7cSKazushi (Jam) Marukawa 
549117c0d7cSKazushi (Jam) Marukawa #define BCm_kind(NAME)                                                         \
550117c0d7cSKazushi (Jam) Marukawa   case NAME##rri:                                                              \
551117c0d7cSKazushi (Jam) Marukawa   case NAME##rzi:                                                              \
552117c0d7cSKazushi (Jam) Marukawa   case NAME##iri:                                                              \
553117c0d7cSKazushi (Jam) Marukawa   case NAME##izi:                                                              \
554117c0d7cSKazushi (Jam) Marukawa   case NAME##rri_nt:                                                           \
555117c0d7cSKazushi (Jam) Marukawa   case NAME##rzi_nt:                                                           \
556117c0d7cSKazushi (Jam) Marukawa   case NAME##iri_nt:                                                           \
557117c0d7cSKazushi (Jam) Marukawa   case NAME##izi_nt:                                                           \
558117c0d7cSKazushi (Jam) Marukawa   case NAME##rri_t:                                                            \
559117c0d7cSKazushi (Jam) Marukawa   case NAME##rzi_t:                                                            \
560117c0d7cSKazushi (Jam) Marukawa   case NAME##iri_t:                                                            \
561117c0d7cSKazushi (Jam) Marukawa   case NAME##izi_t:
562117c0d7cSKazushi (Jam) Marukawa 
563117c0d7cSKazushi (Jam) Marukawa #define BCRm_kind(NAME)                                                        \
564117c0d7cSKazushi (Jam) Marukawa   case NAME##rr:                                                               \
565117c0d7cSKazushi (Jam) Marukawa   case NAME##ir:                                                               \
566117c0d7cSKazushi (Jam) Marukawa   case NAME##rr_nt:                                                            \
567117c0d7cSKazushi (Jam) Marukawa   case NAME##ir_nt:                                                            \
568117c0d7cSKazushi (Jam) Marukawa   case NAME##rr_t:                                                             \
569117c0d7cSKazushi (Jam) Marukawa   case NAME##ir_t:
570117c0d7cSKazushi (Jam) Marukawa 
571117c0d7cSKazushi (Jam) Marukawa   {
572117c0d7cSKazushi (Jam) Marukawa     using namespace llvm::VE;
573117c0d7cSKazushi (Jam) Marukawa     switch (MI.getOpcode()) {
574117c0d7cSKazushi (Jam) Marukawa       BCm_kind(BCFL) BCm_kind(BCFW) BCRm_kind(BRCFL)
575117c0d7cSKazushi (Jam) Marukawa           BCRm_kind(BRCFW) return true;
576117c0d7cSKazushi (Jam) Marukawa     }
577117c0d7cSKazushi (Jam) Marukawa   }
578117c0d7cSKazushi (Jam) Marukawa #undef BCm_kind
579117c0d7cSKazushi (Jam) Marukawa 
580117c0d7cSKazushi (Jam) Marukawa   return false;
581117c0d7cSKazushi (Jam) Marukawa }
582117c0d7cSKazushi (Jam) Marukawa 
583117c0d7cSKazushi (Jam) Marukawa // Decode CC Operand field.
DecodeCCOperand(MCInst & MI,uint64_t cf,uint64_t Address,const MCDisassembler * Decoder)584117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeCCOperand(MCInst &MI, uint64_t cf, uint64_t Address,
5854ae9745aSMaksim Panchenko                                     const MCDisassembler *Decoder) {
586117c0d7cSKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(VEValToCondCode(cf, isIntegerBCKind(MI))));
587117c0d7cSKazushi (Jam) Marukawa   return MCDisassembler::Success;
588117c0d7cSKazushi (Jam) Marukawa }
589117c0d7cSKazushi (Jam) Marukawa 
59034fef0c9SKazushi (Jam) Marukawa // Decode RD Operand field.
DecodeRDOperand(MCInst & MI,uint64_t cf,uint64_t Address,const MCDisassembler * Decoder)59134fef0c9SKazushi (Jam) Marukawa static DecodeStatus DecodeRDOperand(MCInst &MI, uint64_t cf, uint64_t Address,
5924ae9745aSMaksim Panchenko                                     const MCDisassembler *Decoder) {
59334fef0c9SKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(VEValToRD(cf)));
59434fef0c9SKazushi (Jam) Marukawa   return MCDisassembler::Success;
59534fef0c9SKazushi (Jam) Marukawa }
59634fef0c9SKazushi (Jam) Marukawa 
597117c0d7cSKazushi (Jam) Marukawa // Decode branch condition instruction and CCOperand field in it.
DecodeBranchCondition(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)598117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeBranchCondition(MCInst &MI, uint64_t insn,
599117c0d7cSKazushi (Jam) Marukawa                                           uint64_t Address,
6004ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder) {
601117c0d7cSKazushi (Jam) Marukawa   unsigned cf = fieldFromInstruction(insn, 48, 4);
602117c0d7cSKazushi (Jam) Marukawa   bool cy = fieldFromInstruction(insn, 47, 1);
603117c0d7cSKazushi (Jam) Marukawa   unsigned sy = fieldFromInstruction(insn, 40, 7);
604117c0d7cSKazushi (Jam) Marukawa 
605117c0d7cSKazushi (Jam) Marukawa   // Decode cf.
606117c0d7cSKazushi (Jam) Marukawa   MI.addOperand(MCOperand::createImm(VEValToCondCode(cf, isIntegerBCKind(MI))));
607117c0d7cSKazushi (Jam) Marukawa 
608117c0d7cSKazushi (Jam) Marukawa   // Decode sy.
609117c0d7cSKazushi (Jam) Marukawa   DecodeStatus status;
610117c0d7cSKazushi (Jam) Marukawa   if (cy) {
611117c0d7cSKazushi (Jam) Marukawa     status = DecodeI64RegisterClass(MI, sy, Address, Decoder);
612117c0d7cSKazushi (Jam) Marukawa     if (status != MCDisassembler::Success)
613117c0d7cSKazushi (Jam) Marukawa       return status;
614117c0d7cSKazushi (Jam) Marukawa   } else {
615117c0d7cSKazushi (Jam) Marukawa     MI.addOperand(MCOperand::createImm(SignExtend32<7>(sy)));
616117c0d7cSKazushi (Jam) Marukawa   }
617117c0d7cSKazushi (Jam) Marukawa 
618117c0d7cSKazushi (Jam) Marukawa   // Decode MEMri.
619117c0d7cSKazushi (Jam) Marukawa   return DecodeAS(MI, insn, Address, Decoder);
620117c0d7cSKazushi (Jam) Marukawa }
621117c0d7cSKazushi (Jam) Marukawa 
DecodeBranchConditionAlways(MCInst & MI,uint64_t insn,uint64_t Address,const MCDisassembler * Decoder)622117c0d7cSKazushi (Jam) Marukawa static DecodeStatus DecodeBranchConditionAlways(MCInst &MI, uint64_t insn,
623117c0d7cSKazushi (Jam) Marukawa                                                 uint64_t Address,
6244ae9745aSMaksim Panchenko                                                 const MCDisassembler *Decoder) {
625117c0d7cSKazushi (Jam) Marukawa   // Decode MEMri.
626117c0d7cSKazushi (Jam) Marukawa   return DecodeAS(MI, insn, Address, Decoder);
627117c0d7cSKazushi (Jam) Marukawa }
628