Path: blob/main/contrib/llvm-project/llvm/lib/Target/VE/Disassembler/VEDisassembler.cpp
35293 views
//===- VEDisassembler.cpp - Disassembler for VE -----------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is part of the VE Disassembler.9//10//===----------------------------------------------------------------------===//1112#include "MCTargetDesc/VEMCTargetDesc.h"13#include "TargetInfo/VETargetInfo.h"14#include "VE.h"15#include "llvm/MC/MCAsmInfo.h"16#include "llvm/MC/MCContext.h"17#include "llvm/MC/MCDecoderOps.h"18#include "llvm/MC/MCDisassembler/MCDisassembler.h"19#include "llvm/MC/MCInst.h"20#include "llvm/MC/TargetRegistry.h"2122using namespace llvm;2324#define DEBUG_TYPE "ve-disassembler"2526typedef MCDisassembler::DecodeStatus DecodeStatus;2728namespace {2930/// A disassembler class for VE.31class VEDisassembler : public MCDisassembler {32public:33VEDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)34: MCDisassembler(STI, Ctx) {}35virtual ~VEDisassembler() = default;3637DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,38ArrayRef<uint8_t> Bytes, uint64_t Address,39raw_ostream &CStream) const override;40};41} // namespace4243static MCDisassembler *createVEDisassembler(const Target &T,44const MCSubtargetInfo &STI,45MCContext &Ctx) {46return new VEDisassembler(STI, Ctx);47}4849extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeVEDisassembler() {50// Register the disassembler.51TargetRegistry::RegisterMCDisassembler(getTheVETarget(),52createVEDisassembler);53}5455static const unsigned I32RegDecoderTable[] = {56VE::SW0, VE::SW1, VE::SW2, VE::SW3, VE::SW4, VE::SW5, VE::SW6,57VE::SW7, VE::SW8, VE::SW9, VE::SW10, VE::SW11, VE::SW12, VE::SW13,58VE::SW14, VE::SW15, VE::SW16, VE::SW17, VE::SW18, VE::SW19, VE::SW20,59VE::SW21, VE::SW22, VE::SW23, VE::SW24, VE::SW25, VE::SW26, VE::SW27,60VE::SW28, VE::SW29, VE::SW30, VE::SW31, VE::SW32, VE::SW33, VE::SW34,61VE::SW35, VE::SW36, VE::SW37, VE::SW38, VE::SW39, VE::SW40, VE::SW41,62VE::SW42, VE::SW43, VE::SW44, VE::SW45, VE::SW46, VE::SW47, VE::SW48,63VE::SW49, VE::SW50, VE::SW51, VE::SW52, VE::SW53, VE::SW54, VE::SW55,64VE::SW56, VE::SW57, VE::SW58, VE::SW59, VE::SW60, VE::SW61, VE::SW62,65VE::SW63};6667static const unsigned I64RegDecoderTable[] = {68VE::SX0, VE::SX1, VE::SX2, VE::SX3, VE::SX4, VE::SX5, VE::SX6,69VE::SX7, VE::SX8, VE::SX9, VE::SX10, VE::SX11, VE::SX12, VE::SX13,70VE::SX14, VE::SX15, VE::SX16, VE::SX17, VE::SX18, VE::SX19, VE::SX20,71VE::SX21, VE::SX22, VE::SX23, VE::SX24, VE::SX25, VE::SX26, VE::SX27,72VE::SX28, VE::SX29, VE::SX30, VE::SX31, VE::SX32, VE::SX33, VE::SX34,73VE::SX35, VE::SX36, VE::SX37, VE::SX38, VE::SX39, VE::SX40, VE::SX41,74VE::SX42, VE::SX43, VE::SX44, VE::SX45, VE::SX46, VE::SX47, VE::SX48,75VE::SX49, VE::SX50, VE::SX51, VE::SX52, VE::SX53, VE::SX54, VE::SX55,76VE::SX56, VE::SX57, VE::SX58, VE::SX59, VE::SX60, VE::SX61, VE::SX62,77VE::SX63};7879static const unsigned F32RegDecoderTable[] = {80VE::SF0, VE::SF1, VE::SF2, VE::SF3, VE::SF4, VE::SF5, VE::SF6,81VE::SF7, VE::SF8, VE::SF9, VE::SF10, VE::SF11, VE::SF12, VE::SF13,82VE::SF14, VE::SF15, VE::SF16, VE::SF17, VE::SF18, VE::SF19, VE::SF20,83VE::SF21, VE::SF22, VE::SF23, VE::SF24, VE::SF25, VE::SF26, VE::SF27,84VE::SF28, VE::SF29, VE::SF30, VE::SF31, VE::SF32, VE::SF33, VE::SF34,85VE::SF35, VE::SF36, VE::SF37, VE::SF38, VE::SF39, VE::SF40, VE::SF41,86VE::SF42, VE::SF43, VE::SF44, VE::SF45, VE::SF46, VE::SF47, VE::SF48,87VE::SF49, VE::SF50, VE::SF51, VE::SF52, VE::SF53, VE::SF54, VE::SF55,88VE::SF56, VE::SF57, VE::SF58, VE::SF59, VE::SF60, VE::SF61, VE::SF62,89VE::SF63};9091static const unsigned F128RegDecoderTable[] = {92VE::Q0, VE::Q1, VE::Q2, VE::Q3, VE::Q4, VE::Q5, VE::Q6, VE::Q7,93VE::Q8, VE::Q9, VE::Q10, VE::Q11, VE::Q12, VE::Q13, VE::Q14, VE::Q15,94VE::Q16, VE::Q17, VE::Q18, VE::Q19, VE::Q20, VE::Q21, VE::Q22, VE::Q23,95VE::Q24, VE::Q25, VE::Q26, VE::Q27, VE::Q28, VE::Q29, VE::Q30, VE::Q31};9697static const unsigned V64RegDecoderTable[] = {98VE::V0, VE::V1, VE::V2, VE::V3, VE::V4, VE::V5, VE::V6, VE::V7,99VE::V8, VE::V9, VE::V10, VE::V11, VE::V12, VE::V13, VE::V14, VE::V15,100VE::V16, VE::V17, VE::V18, VE::V19, VE::V20, VE::V21, VE::V22, VE::V23,101VE::V24, VE::V25, VE::V26, VE::V27, VE::V28, VE::V29, VE::V30, VE::V31,102VE::V32, VE::V33, VE::V34, VE::V35, VE::V36, VE::V37, VE::V38, VE::V39,103VE::V40, VE::V41, VE::V42, VE::V43, VE::V44, VE::V45, VE::V46, VE::V47,104VE::V48, VE::V49, VE::V50, VE::V51, VE::V52, VE::V53, VE::V54, VE::V55,105VE::V56, VE::V57, VE::V58, VE::V59, VE::V60, VE::V61, VE::V62, VE::V63};106107static const unsigned VMRegDecoderTable[] = {108VE::VM0, VE::VM1, VE::VM2, VE::VM3, VE::VM4, VE::VM5,109VE::VM6, VE::VM7, VE::VM8, VE::VM9, VE::VM10, VE::VM11,110VE::VM12, VE::VM13, VE::VM14, VE::VM15};111112static const unsigned VM512RegDecoderTable[] = {VE::VMP0, VE::VMP1, VE::VMP2,113VE::VMP3, VE::VMP4, VE::VMP5,114VE::VMP6, VE::VMP7};115116static const unsigned MiscRegDecoderTable[] = {117VE::USRCC, VE::PSW, VE::SAR, VE::NoRegister,118VE::NoRegister, VE::NoRegister, VE::NoRegister, VE::PMMR,119VE::PMCR0, VE::PMCR1, VE::PMCR2, VE::PMCR3,120VE::NoRegister, VE::NoRegister, VE::NoRegister, VE::NoRegister,121VE::PMC0, VE::PMC1, VE::PMC2, VE::PMC3,122VE::PMC4, VE::PMC5, VE::PMC6, VE::PMC7,123VE::PMC8, VE::PMC9, VE::PMC10, VE::PMC11,124VE::PMC12, VE::PMC13, VE::PMC14};125126static DecodeStatus DecodeI32RegisterClass(MCInst &Inst, unsigned RegNo,127uint64_t Address,128const MCDisassembler *Decoder) {129if (RegNo > 63)130return MCDisassembler::Fail;131unsigned Reg = I32RegDecoderTable[RegNo];132Inst.addOperand(MCOperand::createReg(Reg));133return MCDisassembler::Success;134}135136static DecodeStatus DecodeI64RegisterClass(MCInst &Inst, unsigned RegNo,137uint64_t Address,138const MCDisassembler *Decoder) {139if (RegNo > 63)140return MCDisassembler::Fail;141unsigned Reg = I64RegDecoderTable[RegNo];142Inst.addOperand(MCOperand::createReg(Reg));143return MCDisassembler::Success;144}145146static DecodeStatus DecodeF32RegisterClass(MCInst &Inst, unsigned RegNo,147uint64_t Address,148const MCDisassembler *Decoder) {149if (RegNo > 63)150return MCDisassembler::Fail;151unsigned Reg = F32RegDecoderTable[RegNo];152Inst.addOperand(MCOperand::createReg(Reg));153return MCDisassembler::Success;154}155156static DecodeStatus DecodeF128RegisterClass(MCInst &Inst, unsigned RegNo,157uint64_t Address,158const MCDisassembler *Decoder) {159if (RegNo % 2 || RegNo > 63)160return MCDisassembler::Fail;161unsigned Reg = F128RegDecoderTable[RegNo / 2];162Inst.addOperand(MCOperand::createReg(Reg));163return MCDisassembler::Success;164}165166static DecodeStatus DecodeV64RegisterClass(MCInst &Inst, unsigned RegNo,167uint64_t Address,168const MCDisassembler *Decoder) {169unsigned Reg = VE::NoRegister;170if (RegNo == 255)171Reg = VE::VIX;172else if (RegNo > 63)173return MCDisassembler::Fail;174else175Reg = V64RegDecoderTable[RegNo];176Inst.addOperand(MCOperand::createReg(Reg));177return MCDisassembler::Success;178}179180static DecodeStatus DecodeVMRegisterClass(MCInst &Inst, unsigned RegNo,181uint64_t Address,182const MCDisassembler *Decoder) {183if (RegNo > 15)184return MCDisassembler::Fail;185unsigned Reg = VMRegDecoderTable[RegNo];186Inst.addOperand(MCOperand::createReg(Reg));187return MCDisassembler::Success;188}189190static DecodeStatus DecodeVM512RegisterClass(MCInst &Inst, unsigned RegNo,191uint64_t Address,192const MCDisassembler *Decoder) {193if (RegNo % 2 || RegNo > 15)194return MCDisassembler::Fail;195unsigned Reg = VM512RegDecoderTable[RegNo / 2];196Inst.addOperand(MCOperand::createReg(Reg));197return MCDisassembler::Success;198}199200static DecodeStatus DecodeMISCRegisterClass(MCInst &Inst, unsigned RegNo,201uint64_t Address,202const MCDisassembler *Decoder) {203if (RegNo > 30)204return MCDisassembler::Fail;205unsigned Reg = MiscRegDecoderTable[RegNo];206if (Reg == VE::NoRegister)207return MCDisassembler::Fail;208Inst.addOperand(MCOperand::createReg(Reg));209return MCDisassembler::Success;210}211212static DecodeStatus DecodeASX(MCInst &Inst, uint64_t insn, uint64_t Address,213const MCDisassembler *Decoder);214static DecodeStatus DecodeLoadI32(MCInst &Inst, uint64_t insn, uint64_t Address,215const MCDisassembler *Decoder);216static DecodeStatus DecodeStoreI32(MCInst &Inst, uint64_t insn,217uint64_t Address,218const MCDisassembler *Decoder);219static DecodeStatus DecodeLoadI64(MCInst &Inst, uint64_t insn, uint64_t Address,220const MCDisassembler *Decoder);221static DecodeStatus DecodeStoreI64(MCInst &Inst, uint64_t insn,222uint64_t Address,223const MCDisassembler *Decoder);224static DecodeStatus DecodeLoadF32(MCInst &Inst, uint64_t insn, uint64_t Address,225const MCDisassembler *Decoder);226static DecodeStatus DecodeStoreF32(MCInst &Inst, uint64_t insn,227uint64_t Address,228const MCDisassembler *Decoder);229static DecodeStatus DecodeLoadASI64(MCInst &Inst, uint64_t insn,230uint64_t Address,231const MCDisassembler *Decoder);232static DecodeStatus DecodeStoreASI64(MCInst &Inst, uint64_t insn,233uint64_t Address,234const MCDisassembler *Decoder);235static DecodeStatus DecodeTS1AMI64(MCInst &Inst, uint64_t insn,236uint64_t Address,237const MCDisassembler *Decoder);238static DecodeStatus DecodeTS1AMI32(MCInst &Inst, uint64_t insn,239uint64_t Address,240const MCDisassembler *Decoder);241static DecodeStatus DecodeCASI64(MCInst &Inst, uint64_t insn, uint64_t Address,242const MCDisassembler *Decoder);243static DecodeStatus DecodeCASI32(MCInst &Inst, uint64_t insn, uint64_t Address,244const MCDisassembler *Decoder);245static DecodeStatus DecodeCall(MCInst &Inst, uint64_t insn, uint64_t Address,246const MCDisassembler *Decoder);247static DecodeStatus DecodeSIMM7(MCInst &Inst, uint64_t insn, uint64_t Address,248const MCDisassembler *Decoder);249static DecodeStatus DecodeSIMM32(MCInst &Inst, uint64_t insn, uint64_t Address,250const MCDisassembler *Decoder);251static DecodeStatus DecodeCCOperand(MCInst &Inst, uint64_t insn,252uint64_t Address,253const MCDisassembler *Decoder);254static DecodeStatus DecodeRDOperand(MCInst &Inst, uint64_t insn,255uint64_t Address,256const MCDisassembler *Decoder);257static DecodeStatus DecodeBranchCondition(MCInst &Inst, uint64_t insn,258uint64_t Address,259const MCDisassembler *Decoder);260static DecodeStatus DecodeBranchConditionAlways(MCInst &Inst, uint64_t insn,261uint64_t Address,262const MCDisassembler *Decoder);263264#include "VEGenDisassemblerTables.inc"265266/// Read four bytes from the ArrayRef and return 32 bit word.267static DecodeStatus readInstruction64(ArrayRef<uint8_t> Bytes, uint64_t Address,268uint64_t &Size, uint64_t &Insn,269bool IsLittleEndian) {270// We want to read exactly 8 Bytes of data.271if (Bytes.size() < 8) {272Size = 0;273return MCDisassembler::Fail;274}275276Insn = IsLittleEndian277? ((uint64_t)Bytes[0] << 0) | ((uint64_t)Bytes[1] << 8) |278((uint64_t)Bytes[2] << 16) | ((uint64_t)Bytes[3] << 24) |279((uint64_t)Bytes[4] << 32) | ((uint64_t)Bytes[5] << 40) |280((uint64_t)Bytes[6] << 48) | ((uint64_t)Bytes[7] << 56)281: ((uint64_t)Bytes[7] << 0) | ((uint64_t)Bytes[6] << 8) |282((uint64_t)Bytes[5] << 16) | ((uint64_t)Bytes[4] << 24) |283((uint64_t)Bytes[3] << 32) | ((uint64_t)Bytes[2] << 40) |284((uint64_t)Bytes[1] << 48) | ((uint64_t)Bytes[0] << 56);285286return MCDisassembler::Success;287}288289DecodeStatus VEDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,290ArrayRef<uint8_t> Bytes,291uint64_t Address,292raw_ostream &CStream) const {293uint64_t Insn;294bool isLittleEndian = getContext().getAsmInfo()->isLittleEndian();295DecodeStatus Result =296readInstruction64(Bytes, Address, Size, Insn, isLittleEndian);297if (Result == MCDisassembler::Fail)298return MCDisassembler::Fail;299300// Calling the auto-generated decoder function.301302Result = decodeInstruction(DecoderTableVE64, Instr, Insn, Address, this, STI);303304if (Result != MCDisassembler::Fail) {305Size = 8;306return Result;307}308309return MCDisassembler::Fail;310}311312typedef DecodeStatus (*DecodeFunc)(MCInst &MI, unsigned RegNo, uint64_t Address,313const MCDisassembler *Decoder);314315static DecodeStatus DecodeASX(MCInst &MI, uint64_t insn, uint64_t Address,316const MCDisassembler *Decoder) {317unsigned sy = fieldFromInstruction(insn, 40, 7);318bool cy = fieldFromInstruction(insn, 47, 1);319unsigned sz = fieldFromInstruction(insn, 32, 7);320bool cz = fieldFromInstruction(insn, 39, 1);321uint64_t simm32 = SignExtend64<32>(fieldFromInstruction(insn, 0, 32));322DecodeStatus status;323324// Decode sz.325if (cz) {326status = DecodeI64RegisterClass(MI, sz, Address, Decoder);327if (status != MCDisassembler::Success)328return status;329} else {330MI.addOperand(MCOperand::createImm(0));331}332333// Decode sy.334if (cy) {335status = DecodeI64RegisterClass(MI, sy, Address, Decoder);336if (status != MCDisassembler::Success)337return status;338} else {339MI.addOperand(MCOperand::createImm(SignExtend32<7>(sy)));340}341342// Decode simm32.343MI.addOperand(MCOperand::createImm(simm32));344345return MCDisassembler::Success;346}347348static DecodeStatus DecodeAS(MCInst &MI, uint64_t insn, uint64_t Address,349const MCDisassembler *Decoder) {350unsigned sz = fieldFromInstruction(insn, 32, 7);351bool cz = fieldFromInstruction(insn, 39, 1);352uint64_t simm32 = SignExtend64<32>(fieldFromInstruction(insn, 0, 32));353DecodeStatus status;354355// Decode sz.356if (cz) {357status = DecodeI64RegisterClass(MI, sz, Address, Decoder);358if (status != MCDisassembler::Success)359return status;360} else {361MI.addOperand(MCOperand::createImm(0));362}363364// Decode simm32.365MI.addOperand(MCOperand::createImm(simm32));366367return MCDisassembler::Success;368}369370static DecodeStatus DecodeMem(MCInst &MI, uint64_t insn, uint64_t Address,371const MCDisassembler *Decoder, bool isLoad,372DecodeFunc DecodeSX) {373unsigned sx = fieldFromInstruction(insn, 48, 7);374375DecodeStatus status;376if (isLoad) {377status = DecodeSX(MI, sx, Address, Decoder);378if (status != MCDisassembler::Success)379return status;380}381382status = DecodeASX(MI, insn, Address, Decoder);383if (status != MCDisassembler::Success)384return status;385386if (!isLoad) {387status = DecodeSX(MI, sx, Address, Decoder);388if (status != MCDisassembler::Success)389return status;390}391return MCDisassembler::Success;392}393394static DecodeStatus DecodeMemAS(MCInst &MI, uint64_t insn, uint64_t Address,395const MCDisassembler *Decoder, bool isLoad,396DecodeFunc DecodeSX) {397unsigned sx = fieldFromInstruction(insn, 48, 7);398399DecodeStatus status;400if (isLoad) {401status = DecodeSX(MI, sx, Address, Decoder);402if (status != MCDisassembler::Success)403return status;404}405406status = DecodeAS(MI, insn, Address, Decoder);407if (status != MCDisassembler::Success)408return status;409410if (!isLoad) {411status = DecodeSX(MI, sx, Address, Decoder);412if (status != MCDisassembler::Success)413return status;414}415return MCDisassembler::Success;416}417418static DecodeStatus DecodeLoadI32(MCInst &Inst, uint64_t insn, uint64_t Address,419const MCDisassembler *Decoder) {420return DecodeMem(Inst, insn, Address, Decoder, true, DecodeI32RegisterClass);421}422423static DecodeStatus DecodeStoreI32(MCInst &Inst, uint64_t insn,424uint64_t Address,425const MCDisassembler *Decoder) {426return DecodeMem(Inst, insn, Address, Decoder, false, DecodeI32RegisterClass);427}428429static DecodeStatus DecodeLoadI64(MCInst &Inst, uint64_t insn, uint64_t Address,430const MCDisassembler *Decoder) {431return DecodeMem(Inst, insn, Address, Decoder, true, DecodeI64RegisterClass);432}433434static DecodeStatus DecodeStoreI64(MCInst &Inst, uint64_t insn,435uint64_t Address,436const MCDisassembler *Decoder) {437return DecodeMem(Inst, insn, Address, Decoder, false, DecodeI64RegisterClass);438}439440static DecodeStatus DecodeLoadF32(MCInst &Inst, uint64_t insn, uint64_t Address,441const MCDisassembler *Decoder) {442return DecodeMem(Inst, insn, Address, Decoder, true, DecodeF32RegisterClass);443}444445static DecodeStatus DecodeStoreF32(MCInst &Inst, uint64_t insn,446uint64_t Address,447const MCDisassembler *Decoder) {448return DecodeMem(Inst, insn, Address, Decoder, false, DecodeF32RegisterClass);449}450451static DecodeStatus DecodeLoadASI64(MCInst &Inst, uint64_t insn,452uint64_t Address,453const MCDisassembler *Decoder) {454return DecodeMemAS(Inst, insn, Address, Decoder, true,455DecodeI64RegisterClass);456}457458static DecodeStatus DecodeStoreASI64(MCInst &Inst, uint64_t insn,459uint64_t Address,460const MCDisassembler *Decoder) {461return DecodeMemAS(Inst, insn, Address, Decoder, false,462DecodeI64RegisterClass);463}464465static DecodeStatus DecodeCAS(MCInst &MI, uint64_t insn, uint64_t Address,466const MCDisassembler *Decoder, bool isImmOnly,467bool isUImm, DecodeFunc DecodeSX) {468unsigned sx = fieldFromInstruction(insn, 48, 7);469bool cy = fieldFromInstruction(insn, 47, 1);470unsigned sy = fieldFromInstruction(insn, 40, 7);471472// Add $sx.473DecodeStatus status;474status = DecodeSX(MI, sx, Address, Decoder);475if (status != MCDisassembler::Success)476return status;477478// Add $disp($sz).479status = DecodeAS(MI, insn, Address, Decoder);480if (status != MCDisassembler::Success)481return status;482483// Add $sy.484if (cy && !isImmOnly) {485status = DecodeSX(MI, sy, Address, Decoder);486if (status != MCDisassembler::Success)487return status;488} else {489if (isUImm)490MI.addOperand(MCOperand::createImm(sy));491else492MI.addOperand(MCOperand::createImm(SignExtend32<7>(sy)));493}494495// Add $sd.496status = DecodeSX(MI, sx, Address, Decoder);497if (status != MCDisassembler::Success)498return status;499500return MCDisassembler::Success;501}502503static DecodeStatus DecodeTS1AMI64(MCInst &MI, uint64_t insn, uint64_t Address,504const MCDisassembler *Decoder) {505return DecodeCAS(MI, insn, Address, Decoder, false, true,506DecodeI64RegisterClass);507}508509static DecodeStatus DecodeTS1AMI32(MCInst &MI, uint64_t insn, uint64_t Address,510const MCDisassembler *Decoder) {511return DecodeCAS(MI, insn, Address, Decoder, false, true,512DecodeI32RegisterClass);513}514515static DecodeStatus DecodeCASI64(MCInst &MI, uint64_t insn, uint64_t Address,516const MCDisassembler *Decoder) {517return DecodeCAS(MI, insn, Address, Decoder, false, false,518DecodeI64RegisterClass);519}520521static DecodeStatus DecodeCASI32(MCInst &MI, uint64_t insn, uint64_t Address,522const MCDisassembler *Decoder) {523return DecodeCAS(MI, insn, Address, Decoder, false, false,524DecodeI32RegisterClass);525}526527static DecodeStatus DecodeCall(MCInst &Inst, uint64_t insn, uint64_t Address,528const MCDisassembler *Decoder) {529return DecodeMem(Inst, insn, Address, Decoder, true, DecodeI64RegisterClass);530}531532static DecodeStatus DecodeSIMM7(MCInst &MI, uint64_t insn, uint64_t Address,533const MCDisassembler *Decoder) {534uint64_t tgt = SignExtend64<7>(insn);535MI.addOperand(MCOperand::createImm(tgt));536return MCDisassembler::Success;537}538539static DecodeStatus DecodeSIMM32(MCInst &MI, uint64_t insn, uint64_t Address,540const MCDisassembler *Decoder) {541uint64_t tgt = SignExtend64<32>(insn);542MI.addOperand(MCOperand::createImm(tgt));543return MCDisassembler::Success;544}545546static bool isIntegerBCKind(MCInst &MI) {547548#define BCm_kind(NAME) \549case NAME##rri: \550case NAME##rzi: \551case NAME##iri: \552case NAME##izi: \553case NAME##rri_nt: \554case NAME##rzi_nt: \555case NAME##iri_nt: \556case NAME##izi_nt: \557case NAME##rri_t: \558case NAME##rzi_t: \559case NAME##iri_t: \560case NAME##izi_t:561562#define BCRm_kind(NAME) \563case NAME##rr: \564case NAME##ir: \565case NAME##rr_nt: \566case NAME##ir_nt: \567case NAME##rr_t: \568case NAME##ir_t:569570{571using namespace llvm::VE;572switch (MI.getOpcode()) {573BCm_kind(BCFL) BCm_kind(BCFW) BCRm_kind(BRCFL)574BCRm_kind(BRCFW) return true;575}576}577#undef BCm_kind578579return false;580}581582// Decode CC Operand field.583static DecodeStatus DecodeCCOperand(MCInst &MI, uint64_t cf, uint64_t Address,584const MCDisassembler *Decoder) {585MI.addOperand(MCOperand::createImm(VEValToCondCode(cf, isIntegerBCKind(MI))));586return MCDisassembler::Success;587}588589// Decode RD Operand field.590static DecodeStatus DecodeRDOperand(MCInst &MI, uint64_t cf, uint64_t Address,591const MCDisassembler *Decoder) {592MI.addOperand(MCOperand::createImm(VEValToRD(cf)));593return MCDisassembler::Success;594}595596// Decode branch condition instruction and CCOperand field in it.597static DecodeStatus DecodeBranchCondition(MCInst &MI, uint64_t insn,598uint64_t Address,599const MCDisassembler *Decoder) {600unsigned cf = fieldFromInstruction(insn, 48, 4);601bool cy = fieldFromInstruction(insn, 47, 1);602unsigned sy = fieldFromInstruction(insn, 40, 7);603604// Decode cf.605MI.addOperand(MCOperand::createImm(VEValToCondCode(cf, isIntegerBCKind(MI))));606607// Decode sy.608DecodeStatus status;609if (cy) {610status = DecodeI64RegisterClass(MI, sy, Address, Decoder);611if (status != MCDisassembler::Success)612return status;613} else {614MI.addOperand(MCOperand::createImm(SignExtend32<7>(sy)));615}616617// Decode MEMri.618return DecodeAS(MI, insn, Address, Decoder);619}620621static DecodeStatus DecodeBranchConditionAlways(MCInst &MI, uint64_t insn,622uint64_t Address,623const MCDisassembler *Decoder) {624// Decode MEMri.625return DecodeAS(MI, insn, Address, Decoder);626}627628629