Path: blob/main/contrib/llvm-project/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp
35293 views
//===- MipsDisassembler.cpp - Disassembler for Mips -----------------------===//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 Mips Disassembler.9//10//===----------------------------------------------------------------------===//1112#include "MCTargetDesc/MipsMCTargetDesc.h"13#include "Mips.h"14#include "TargetInfo/MipsTargetInfo.h"15#include "llvm/ADT/ArrayRef.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/MCRegisterInfo.h"21#include "llvm/MC/MCSubtargetInfo.h"22#include "llvm/MC/TargetRegistry.h"23#include "llvm/Support/Compiler.h"24#include "llvm/Support/Debug.h"25#include "llvm/Support/ErrorHandling.h"26#include "llvm/Support/MathExtras.h"27#include "llvm/Support/raw_ostream.h"28#include <cassert>29#include <cstdint>3031using namespace llvm;3233#define DEBUG_TYPE "mips-disassembler"3435using DecodeStatus = MCDisassembler::DecodeStatus;3637namespace {3839class MipsDisassembler : public MCDisassembler {40bool IsMicroMips;41bool IsBigEndian;4243public:44MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, bool IsBigEndian)45: MCDisassembler(STI, Ctx),46IsMicroMips(STI.hasFeature(Mips::FeatureMicroMips)),47IsBigEndian(IsBigEndian) {}4849bool hasMips2() const { return STI.hasFeature(Mips::FeatureMips2); }50bool hasMips3() const { return STI.hasFeature(Mips::FeatureMips3); }51bool hasMips32() const { return STI.hasFeature(Mips::FeatureMips32); }5253bool hasMips32r6() const {54return STI.hasFeature(Mips::FeatureMips32r6);55}5657bool isFP64() const { return STI.hasFeature(Mips::FeatureFP64Bit); }5859bool isGP64() const { return STI.hasFeature(Mips::FeatureGP64Bit); }6061bool isPTR64() const { return STI.hasFeature(Mips::FeaturePTR64Bit); }6263bool hasCnMips() const { return STI.hasFeature(Mips::FeatureCnMips); }6465bool hasCnMipsP() const { return STI.hasFeature(Mips::FeatureCnMipsP); }6667bool hasCOP3() const {68// Only present in MIPS-I and MIPS-II69return !hasMips32() && !hasMips3();70}7172DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,73ArrayRef<uint8_t> Bytes, uint64_t Address,74raw_ostream &CStream) const override;75};7677} // end anonymous namespace7879// Forward declare these because the autogenerated code will reference them.80// Definitions are further down.81static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst, unsigned RegNo,82uint64_t Address,83const MCDisassembler *Decoder);8485static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst, unsigned RegNo,86uint64_t Address,87const MCDisassembler *Decoder);8889static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst, unsigned RegNo,90uint64_t Address,91const MCDisassembler *Decoder);9293static DecodeStatus94DecodeGPRMM16ZeroRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,95const MCDisassembler *Decoder);9697static DecodeStatus98DecodeGPRMM16MovePRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,99const MCDisassembler *Decoder);100101static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst, unsigned RegNo,102uint64_t Address,103const MCDisassembler *Decoder);104105static DecodeStatus DecodePtrRegisterClass(MCInst &Inst, unsigned Insn,106uint64_t Address,107const MCDisassembler *Decoder);108109static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst, unsigned RegNo,110uint64_t Address,111const MCDisassembler *Decoder);112113static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst, unsigned RegNo,114uint64_t Address,115const MCDisassembler *Decoder);116117static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst, unsigned RegNo,118uint64_t Address,119const MCDisassembler *Decoder);120121static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst, unsigned RegNo,122uint64_t Address,123const MCDisassembler *Decoder);124125static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst, unsigned RegNo,126uint64_t Address,127const MCDisassembler *Decoder);128129static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,130uint64_t Address,131const MCDisassembler *Decoder);132133static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst, unsigned Insn,134uint64_t Address,135const MCDisassembler *Decoder);136137static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst, unsigned RegNo,138uint64_t Address,139const MCDisassembler *Decoder);140141static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst, unsigned RegNo,142uint64_t Address,143const MCDisassembler *Decoder);144145static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst, unsigned RegNo,146uint64_t Address,147const MCDisassembler *Decoder);148149static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst, unsigned RegNo,150uint64_t Address,151const MCDisassembler *Decoder);152153static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst, unsigned RegNo,154uint64_t Address,155const MCDisassembler *Decoder);156157static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst, unsigned RegNo,158uint64_t Address,159const MCDisassembler *Decoder);160161static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst, unsigned RegNo,162uint64_t Address,163const MCDisassembler *Decoder);164165static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst, unsigned RegNo,166uint64_t Address,167const MCDisassembler *Decoder);168169static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst, unsigned RegNo,170uint64_t Address,171const MCDisassembler *Decoder);172173static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst, unsigned RegNo,174uint64_t Address,175const MCDisassembler *Decoder);176177static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst, unsigned RegNo,178uint64_t Address,179const MCDisassembler *Decoder);180181static DecodeStatus DecodeBranchTarget(MCInst &Inst, unsigned Offset,182uint64_t Address,183const MCDisassembler *Decoder);184185static DecodeStatus DecodeBranchTarget1SImm16(MCInst &Inst, unsigned Offset,186uint64_t Address,187const MCDisassembler *Decoder);188189static DecodeStatus DecodeJumpTarget(MCInst &Inst, unsigned Insn,190uint64_t Address,191const MCDisassembler *Decoder);192193static DecodeStatus DecodeBranchTarget21(MCInst &Inst, unsigned Offset,194uint64_t Address,195const MCDisassembler *Decoder);196197static DecodeStatus DecodeBranchTarget21MM(MCInst &Inst, unsigned Offset,198uint64_t Address,199const MCDisassembler *Decoder);200201static DecodeStatus DecodeBranchTarget26(MCInst &Inst, unsigned Offset,202uint64_t Address,203const MCDisassembler *Decoder);204205// DecodeBranchTarget7MM - Decode microMIPS branch offset, which is206// shifted left by 1 bit.207static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst, unsigned Offset,208uint64_t Address,209const MCDisassembler *Decoder);210211// DecodeBranchTarget10MM - Decode microMIPS branch offset, which is212// shifted left by 1 bit.213static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst, unsigned Offset,214uint64_t Address,215const MCDisassembler *Decoder);216217// DecodeBranchTargetMM - Decode microMIPS branch offset, which is218// shifted left by 1 bit.219static DecodeStatus DecodeBranchTargetMM(MCInst &Inst, unsigned Offset,220uint64_t Address,221const MCDisassembler *Decoder);222223// DecodeBranchTarget26MM - Decode microMIPS branch offset, which is224// shifted left by 1 bit.225static DecodeStatus DecodeBranchTarget26MM(MCInst &Inst, unsigned Offset,226uint64_t Address,227const MCDisassembler *Decoder);228229// DecodeJumpTargetMM - Decode microMIPS jump target, which is230// shifted left by 1 bit.231static DecodeStatus DecodeJumpTargetMM(MCInst &Inst, unsigned Insn,232uint64_t Address,233const MCDisassembler *Decoder);234235// DecodeJumpTargetXMM - Decode microMIPS jump and link exchange target,236// which is shifted left by 2 bit.237static DecodeStatus DecodeJumpTargetXMM(MCInst &Inst, unsigned Insn,238uint64_t Address,239const MCDisassembler *Decoder);240241static DecodeStatus DecodeMem(MCInst &Inst, unsigned Insn, uint64_t Address,242const MCDisassembler *Decoder);243244static DecodeStatus DecodeMemEVA(MCInst &Inst, unsigned Insn, uint64_t Address,245const MCDisassembler *Decoder);246247static DecodeStatus DecodeLoadByte15(MCInst &Inst, unsigned Insn,248uint64_t Address,249const MCDisassembler *Decoder);250251static DecodeStatus DecodeCacheOp(MCInst &Inst, unsigned Insn, uint64_t Address,252const MCDisassembler *Decoder);253254static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst, unsigned Insn,255uint64_t Address,256const MCDisassembler *Decoder);257258static DecodeStatus DecodeCacheOpMM(MCInst &Inst, unsigned Insn,259uint64_t Address,260const MCDisassembler *Decoder);261262static DecodeStatus DecodePrefeOpMM(MCInst &Inst, unsigned Insn,263uint64_t Address,264const MCDisassembler *Decoder);265266static DecodeStatus DecodeSyncI(MCInst &Inst, unsigned Insn, uint64_t Address,267const MCDisassembler *Decoder);268269static DecodeStatus DecodeSyncI_MM(MCInst &Inst, unsigned Insn,270uint64_t Address,271const MCDisassembler *Decoder);272273static DecodeStatus DecodeSynciR6(MCInst &Inst, unsigned Insn, uint64_t Address,274const MCDisassembler *Decoder);275276static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,277uint64_t Address,278const MCDisassembler *Decoder);279280static DecodeStatus DecodeMemMMImm4(MCInst &Inst, unsigned Insn,281uint64_t Address,282const MCDisassembler *Decoder);283284static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst, unsigned Insn,285uint64_t Address,286const MCDisassembler *Decoder);287288static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst, unsigned Insn,289uint64_t Address,290const MCDisassembler *Decoder);291292static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst, unsigned Insn,293uint64_t Address,294const MCDisassembler *Decoder);295296static DecodeStatus DecodeMemMMImm9(MCInst &Inst, unsigned Insn,297uint64_t Address,298const MCDisassembler *Decoder);299300static DecodeStatus DecodeMemMMImm12(MCInst &Inst, unsigned Insn,301uint64_t Address,302const MCDisassembler *Decoder);303304static DecodeStatus DecodeMemMMImm16(MCInst &Inst, unsigned Insn,305uint64_t Address,306const MCDisassembler *Decoder);307308static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn, uint64_t Address,309const MCDisassembler *Decoder);310311static DecodeStatus DecodeFMemMMR2(MCInst &Inst, unsigned Insn,312uint64_t Address,313const MCDisassembler *Decoder);314315static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn, uint64_t Address,316const MCDisassembler *Decoder);317318static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn, uint64_t Address,319const MCDisassembler *Decoder);320321static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,322uint64_t Address,323const MCDisassembler *Decoder);324325static DecodeStatus DecodeFMemCop2MMR6(MCInst &Inst, unsigned Insn,326uint64_t Address,327const MCDisassembler *Decoder);328329static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst, unsigned Insn,330uint64_t Address,331const MCDisassembler *Decoder);332333static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst, unsigned Value,334uint64_t Address,335const MCDisassembler *Decoder);336337static DecodeStatus DecodeLi16Imm(MCInst &Inst, unsigned Value,338uint64_t Address,339const MCDisassembler *Decoder);340341static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst, unsigned Value,342uint64_t Address,343const MCDisassembler *Decoder);344345template <unsigned Bits, int Offset, int Scale>346static DecodeStatus DecodeUImmWithOffsetAndScale(MCInst &Inst, unsigned Value,347uint64_t Address,348const MCDisassembler *Decoder);349350template <unsigned Bits, int Offset>351static DecodeStatus DecodeUImmWithOffset(MCInst &Inst, unsigned Value,352uint64_t Address,353const MCDisassembler *Decoder) {354return DecodeUImmWithOffsetAndScale<Bits, Offset, 1>(Inst, Value, Address,355Decoder);356}357358template <unsigned Bits, int Offset = 0, int ScaleBy = 1>359static DecodeStatus DecodeSImmWithOffsetAndScale(MCInst &Inst, unsigned Value,360uint64_t Address,361const MCDisassembler *Decoder);362363static DecodeStatus DecodeInsSize(MCInst &Inst, unsigned Insn, uint64_t Address,364const MCDisassembler *Decoder);365366static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,367uint64_t Address,368const MCDisassembler *Decoder);369370static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,371uint64_t Address,372const MCDisassembler *Decoder);373374static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn, uint64_t Address,375const MCDisassembler *Decoder);376377static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,378uint64_t Address,379const MCDisassembler *Decoder);380381static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,382uint64_t Address,383const MCDisassembler *Decoder);384385/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't386/// handle.387template <typename InsnType>388static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,389const MCDisassembler *Decoder);390391template <typename InsnType>392static DecodeStatus DecodeDAHIDATIMMR6(MCInst &MI, InsnType insn,393uint64_t Address,394const MCDisassembler *Decoder);395396template <typename InsnType>397static DecodeStatus DecodeDAHIDATI(MCInst &MI, InsnType insn, uint64_t Address,398const MCDisassembler *Decoder);399400template <typename InsnType>401static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,402uint64_t Address,403const MCDisassembler *Decoder);404405template <typename InsnType>406static DecodeStatus DecodePOP35GroupBranchMMR6(MCInst &MI, InsnType insn,407uint64_t Address,408const MCDisassembler *Decoder);409410template <typename InsnType>411static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,412uint64_t Address,413const MCDisassembler *Decoder);414415template <typename InsnType>416static DecodeStatus DecodePOP37GroupBranchMMR6(MCInst &MI, InsnType insn,417uint64_t Address,418const MCDisassembler *Decoder);419420template <typename InsnType>421static DecodeStatus DecodePOP65GroupBranchMMR6(MCInst &MI, InsnType insn,422uint64_t Address,423const MCDisassembler *Decoder);424425template <typename InsnType>426static DecodeStatus DecodePOP75GroupBranchMMR6(MCInst &MI, InsnType insn,427uint64_t Address,428const MCDisassembler *Decoder);429430template <typename InsnType>431static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,432uint64_t Address,433const MCDisassembler *Decoder);434435template <typename InsnType>436static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,437uint64_t Address,438const MCDisassembler *Decoder);439440template <typename InsnType>441static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,442uint64_t Address,443const MCDisassembler *Decoder);444445template <typename InsnType>446static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,447uint64_t Address,448const MCDisassembler *Decoder);449450template <typename InsnType>451static DecodeStatus DecodeBgtzGroupBranchMMR6(MCInst &MI, InsnType insn,452uint64_t Address,453const MCDisassembler *Decoder);454455template <typename InsnType>456static DecodeStatus DecodeBlezGroupBranchMMR6(MCInst &MI, InsnType insn,457uint64_t Address,458const MCDisassembler *Decoder);459460template <typename InsnType>461static DecodeStatus DecodeDINS(MCInst &MI, InsnType Insn, uint64_t Address,462const MCDisassembler *Decoder);463464template <typename InsnType>465static DecodeStatus DecodeDEXT(MCInst &MI, InsnType Insn, uint64_t Address,466const MCDisassembler *Decoder);467468template <typename InsnType>469static DecodeStatus DecodeCRC(MCInst &MI, InsnType Insn, uint64_t Address,470const MCDisassembler *Decoder);471472static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,473uint64_t Address,474const MCDisassembler *Decoder);475476static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,477uint64_t Address,478const MCDisassembler *Decoder);479480static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned RegPair,481uint64_t Address,482const MCDisassembler *Decoder);483484static DecodeStatus DecodeMovePOperands(MCInst &Inst, unsigned Insn,485uint64_t Address,486const MCDisassembler *Decoder);487488static DecodeStatus DecodeFIXMEInstruction(MCInst &Inst, unsigned Insn,489uint64_t Address,490const MCDisassembler *Decoder);491492static MCDisassembler *createMipsDisassembler(493const Target &T,494const MCSubtargetInfo &STI,495MCContext &Ctx) {496return new MipsDisassembler(STI, Ctx, true);497}498499static MCDisassembler *createMipselDisassembler(500const Target &T,501const MCSubtargetInfo &STI,502MCContext &Ctx) {503return new MipsDisassembler(STI, Ctx, false);504}505506extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeMipsDisassembler() {507// Register the disassembler.508TargetRegistry::RegisterMCDisassembler(getTheMipsTarget(),509createMipsDisassembler);510TargetRegistry::RegisterMCDisassembler(getTheMipselTarget(),511createMipselDisassembler);512TargetRegistry::RegisterMCDisassembler(getTheMips64Target(),513createMipsDisassembler);514TargetRegistry::RegisterMCDisassembler(getTheMips64elTarget(),515createMipselDisassembler);516}517518#include "MipsGenDisassemblerTables.inc"519520static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo) {521const MCRegisterInfo *RegInfo = D->getContext().getRegisterInfo();522return *(RegInfo->getRegClass(RC).begin() + RegNo);523}524525template <typename InsnType>526static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,527const MCDisassembler *Decoder) {528using DecodeFN =529DecodeStatus (*)(MCInst &, unsigned, uint64_t, const MCDisassembler *);530531// The size of the n field depends on the element size532// The register class also depends on this.533InsnType tmp = fieldFromInstruction(insn, 17, 5);534unsigned NSize = 0;535DecodeFN RegDecoder = nullptr;536if ((tmp & 0x18) == 0x00) { // INSVE_B537NSize = 4;538RegDecoder = DecodeMSA128BRegisterClass;539} else if ((tmp & 0x1c) == 0x10) { // INSVE_H540NSize = 3;541RegDecoder = DecodeMSA128HRegisterClass;542} else if ((tmp & 0x1e) == 0x18) { // INSVE_W543NSize = 2;544RegDecoder = DecodeMSA128WRegisterClass;545} else if ((tmp & 0x1f) == 0x1c) { // INSVE_D546NSize = 1;547RegDecoder = DecodeMSA128DRegisterClass;548} else549llvm_unreachable("Invalid encoding");550551assert(NSize != 0 && RegDecoder != nullptr);552553// $wd554tmp = fieldFromInstruction(insn, 6, 5);555if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)556return MCDisassembler::Fail;557// $wd_in558if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)559return MCDisassembler::Fail;560// $n561tmp = fieldFromInstruction(insn, 16, NSize);562MI.addOperand(MCOperand::createImm(tmp));563// $ws564tmp = fieldFromInstruction(insn, 11, 5);565if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)566return MCDisassembler::Fail;567// $n2568MI.addOperand(MCOperand::createImm(0));569570return MCDisassembler::Success;571}572573template <typename InsnType>574static DecodeStatus DecodeDAHIDATIMMR6(MCInst &MI, InsnType insn,575uint64_t Address,576const MCDisassembler *Decoder) {577InsnType Rs = fieldFromInstruction(insn, 16, 5);578InsnType Imm = fieldFromInstruction(insn, 0, 16);579MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID,580Rs)));581MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID,582Rs)));583MI.addOperand(MCOperand::createImm(Imm));584585return MCDisassembler::Success;586}587588template <typename InsnType>589static DecodeStatus DecodeDAHIDATI(MCInst &MI, InsnType insn, uint64_t Address,590const MCDisassembler *Decoder) {591InsnType Rs = fieldFromInstruction(insn, 21, 5);592InsnType Imm = fieldFromInstruction(insn, 0, 16);593MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID,594Rs)));595MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID,596Rs)));597MI.addOperand(MCOperand::createImm(Imm));598599return MCDisassembler::Success;600}601602template <typename InsnType>603static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,604uint64_t Address,605const MCDisassembler *Decoder) {606// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled607// (otherwise we would have matched the ADDI instruction from the earlier608// ISA's instead).609//610// We have:611// 0b001000 sssss ttttt iiiiiiiiiiiiiiii612// BOVC if rs >= rt613// BEQZALC if rs == 0 && rt != 0614// BEQC if rs < rt && rs != 0615616InsnType Rs = fieldFromInstruction(insn, 21, 5);617InsnType Rt = fieldFromInstruction(insn, 16, 5);618int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;619bool HasRs = false;620621if (Rs >= Rt) {622MI.setOpcode(Mips::BOVC);623HasRs = true;624} else if (Rs != 0 && Rs < Rt) {625MI.setOpcode(Mips::BEQC);626HasRs = true;627} else628MI.setOpcode(Mips::BEQZALC);629630if (HasRs)631MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,632Rs)));633634MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,635Rt)));636MI.addOperand(MCOperand::createImm(Imm));637638return MCDisassembler::Success;639}640641template <typename InsnType>642static DecodeStatus DecodePOP35GroupBranchMMR6(MCInst &MI, InsnType insn,643uint64_t Address,644const MCDisassembler *Decoder) {645InsnType Rt = fieldFromInstruction(insn, 21, 5);646InsnType Rs = fieldFromInstruction(insn, 16, 5);647int64_t Imm = 0;648649if (Rs >= Rt) {650MI.setOpcode(Mips::BOVC_MMR6);651MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,652Rt)));653MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,654Rs)));655Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;656} else if (Rs != 0 && Rs < Rt) {657MI.setOpcode(Mips::BEQC_MMR6);658MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,659Rs)));660MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,661Rt)));662Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;663} else {664MI.setOpcode(Mips::BEQZALC_MMR6);665MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,666Rt)));667Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;668}669670MI.addOperand(MCOperand::createImm(Imm));671672return MCDisassembler::Success;673}674675template <typename InsnType>676static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,677uint64_t Address,678const MCDisassembler *Decoder) {679// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled680// (otherwise we would have matched the ADDI instruction from the earlier681// ISA's instead).682//683// We have:684// 0b011000 sssss ttttt iiiiiiiiiiiiiiii685// BNVC if rs >= rt686// BNEZALC if rs == 0 && rt != 0687// BNEC if rs < rt && rs != 0688689InsnType Rs = fieldFromInstruction(insn, 21, 5);690InsnType Rt = fieldFromInstruction(insn, 16, 5);691int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;692bool HasRs = false;693694if (Rs >= Rt) {695MI.setOpcode(Mips::BNVC);696HasRs = true;697} else if (Rs != 0 && Rs < Rt) {698MI.setOpcode(Mips::BNEC);699HasRs = true;700} else701MI.setOpcode(Mips::BNEZALC);702703if (HasRs)704MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,705Rs)));706707MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,708Rt)));709MI.addOperand(MCOperand::createImm(Imm));710711return MCDisassembler::Success;712}713714template <typename InsnType>715static DecodeStatus DecodePOP37GroupBranchMMR6(MCInst &MI, InsnType insn,716uint64_t Address,717const MCDisassembler *Decoder) {718InsnType Rt = fieldFromInstruction(insn, 21, 5);719InsnType Rs = fieldFromInstruction(insn, 16, 5);720int64_t Imm = 0;721722if (Rs >= Rt) {723MI.setOpcode(Mips::BNVC_MMR6);724MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,725Rt)));726MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,727Rs)));728Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;729} else if (Rs != 0 && Rs < Rt) {730MI.setOpcode(Mips::BNEC_MMR6);731MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,732Rs)));733MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,734Rt)));735Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;736} else {737MI.setOpcode(Mips::BNEZALC_MMR6);738MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,739Rt)));740Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;741}742743MI.addOperand(MCOperand::createImm(Imm));744745return MCDisassembler::Success;746}747748template <typename InsnType>749static DecodeStatus DecodePOP65GroupBranchMMR6(MCInst &MI, InsnType insn,750uint64_t Address,751const MCDisassembler *Decoder) {752// We have:753// 0b110101 ttttt sssss iiiiiiiiiiiiiiii754// Invalid if rt == 0755// BGTZC_MMR6 if rs == 0 && rt != 0756// BLTZC_MMR6 if rs == rt && rt != 0757// BLTC_MMR6 if rs != rt && rs != 0 && rt != 0758759InsnType Rt = fieldFromInstruction(insn, 21, 5);760InsnType Rs = fieldFromInstruction(insn, 16, 5);761int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;762bool HasRs = false;763764if (Rt == 0)765return MCDisassembler::Fail;766else if (Rs == 0)767MI.setOpcode(Mips::BGTZC_MMR6);768else if (Rs == Rt)769MI.setOpcode(Mips::BLTZC_MMR6);770else {771MI.setOpcode(Mips::BLTC_MMR6);772HasRs = true;773}774775if (HasRs)776MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,777Rs)));778779MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,780Rt)));781782MI.addOperand(MCOperand::createImm(Imm));783784return MCDisassembler::Success;785}786787template <typename InsnType>788static DecodeStatus DecodePOP75GroupBranchMMR6(MCInst &MI, InsnType insn,789uint64_t Address,790const MCDisassembler *Decoder) {791// We have:792// 0b111101 ttttt sssss iiiiiiiiiiiiiiii793// Invalid if rt == 0794// BLEZC_MMR6 if rs == 0 && rt != 0795// BGEZC_MMR6 if rs == rt && rt != 0796// BGEC_MMR6 if rs != rt && rs != 0 && rt != 0797798InsnType Rt = fieldFromInstruction(insn, 21, 5);799InsnType Rs = fieldFromInstruction(insn, 16, 5);800int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;801bool HasRs = false;802803if (Rt == 0)804return MCDisassembler::Fail;805else if (Rs == 0)806MI.setOpcode(Mips::BLEZC_MMR6);807else if (Rs == Rt)808MI.setOpcode(Mips::BGEZC_MMR6);809else {810HasRs = true;811MI.setOpcode(Mips::BGEC_MMR6);812}813814if (HasRs)815MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,816Rs)));817818MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,819Rt)));820821MI.addOperand(MCOperand::createImm(Imm));822823return MCDisassembler::Success;824}825826template <typename InsnType>827static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,828uint64_t Address,829const MCDisassembler *Decoder) {830// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled831// (otherwise we would have matched the BLEZL instruction from the earlier832// ISA's instead).833//834// We have:835// 0b010110 sssss ttttt iiiiiiiiiiiiiiii836// Invalid if rs == 0837// BLEZC if rs == 0 && rt != 0838// BGEZC if rs == rt && rt != 0839// BGEC if rs != rt && rs != 0 && rt != 0840841InsnType Rs = fieldFromInstruction(insn, 21, 5);842InsnType Rt = fieldFromInstruction(insn, 16, 5);843int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;844bool HasRs = false;845846if (Rt == 0)847return MCDisassembler::Fail;848else if (Rs == 0)849MI.setOpcode(Mips::BLEZC);850else if (Rs == Rt)851MI.setOpcode(Mips::BGEZC);852else {853HasRs = true;854MI.setOpcode(Mips::BGEC);855}856857if (HasRs)858MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,859Rs)));860861MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,862Rt)));863864MI.addOperand(MCOperand::createImm(Imm));865866return MCDisassembler::Success;867}868869template <typename InsnType>870static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,871uint64_t Address,872const MCDisassembler *Decoder) {873// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled874// (otherwise we would have matched the BGTZL instruction from the earlier875// ISA's instead).876//877// We have:878// 0b010111 sssss ttttt iiiiiiiiiiiiiiii879// Invalid if rs == 0880// BGTZC if rs == 0 && rt != 0881// BLTZC if rs == rt && rt != 0882// BLTC if rs != rt && rs != 0 && rt != 0883884bool HasRs = false;885886InsnType Rs = fieldFromInstruction(insn, 21, 5);887InsnType Rt = fieldFromInstruction(insn, 16, 5);888int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;889890if (Rt == 0)891return MCDisassembler::Fail;892else if (Rs == 0)893MI.setOpcode(Mips::BGTZC);894else if (Rs == Rt)895MI.setOpcode(Mips::BLTZC);896else {897MI.setOpcode(Mips::BLTC);898HasRs = true;899}900901if (HasRs)902MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,903Rs)));904905MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,906Rt)));907908MI.addOperand(MCOperand::createImm(Imm));909910return MCDisassembler::Success;911}912913template <typename InsnType>914static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,915uint64_t Address,916const MCDisassembler *Decoder) {917// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled918// (otherwise we would have matched the BGTZ instruction from the earlier919// ISA's instead).920//921// We have:922// 0b000111 sssss ttttt iiiiiiiiiiiiiiii923// BGTZ if rt == 0924// BGTZALC if rs == 0 && rt != 0925// BLTZALC if rs != 0 && rs == rt926// BLTUC if rs != 0 && rs != rt927928InsnType Rs = fieldFromInstruction(insn, 21, 5);929InsnType Rt = fieldFromInstruction(insn, 16, 5);930int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;931bool HasRs = false;932bool HasRt = false;933934if (Rt == 0) {935MI.setOpcode(Mips::BGTZ);936HasRs = true;937} else if (Rs == 0) {938MI.setOpcode(Mips::BGTZALC);939HasRt = true;940} else if (Rs == Rt) {941MI.setOpcode(Mips::BLTZALC);942HasRs = true;943} else {944MI.setOpcode(Mips::BLTUC);945HasRs = true;946HasRt = true;947}948949if (HasRs)950MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,951Rs)));952953if (HasRt)954MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,955Rt)));956957MI.addOperand(MCOperand::createImm(Imm));958959return MCDisassembler::Success;960}961962template <typename InsnType>963static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,964uint64_t Address,965const MCDisassembler *Decoder) {966// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled967// (otherwise we would have matched the BLEZL instruction from the earlier968// ISA's instead).969//970// We have:971// 0b000110 sssss ttttt iiiiiiiiiiiiiiii972// Invalid if rs == 0973// BLEZALC if rs == 0 && rt != 0974// BGEZALC if rs == rt && rt != 0975// BGEUC if rs != rt && rs != 0 && rt != 0976977InsnType Rs = fieldFromInstruction(insn, 21, 5);978InsnType Rt = fieldFromInstruction(insn, 16, 5);979int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;980bool HasRs = false;981982if (Rt == 0)983return MCDisassembler::Fail;984else if (Rs == 0)985MI.setOpcode(Mips::BLEZALC);986else if (Rs == Rt)987MI.setOpcode(Mips::BGEZALC);988else {989HasRs = true;990MI.setOpcode(Mips::BGEUC);991}992993if (HasRs)994MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,995Rs)));996MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,997Rt)));998999MI.addOperand(MCOperand::createImm(Imm));10001001return MCDisassembler::Success;1002}10031004// Override the generated disassembler to produce DEXT all the time. This is1005// for feature / behaviour parity with binutils.1006template <typename InsnType>1007static DecodeStatus DecodeDEXT(MCInst &MI, InsnType Insn, uint64_t Address,1008const MCDisassembler *Decoder) {1009unsigned Msbd = fieldFromInstruction(Insn, 11, 5);1010unsigned Lsb = fieldFromInstruction(Insn, 6, 5);1011unsigned Size = 0;1012unsigned Pos = 0;10131014switch (MI.getOpcode()) {1015case Mips::DEXT:1016Pos = Lsb;1017Size = Msbd + 1;1018break;1019case Mips::DEXTM:1020Pos = Lsb;1021Size = Msbd + 1 + 32;1022break;1023case Mips::DEXTU:1024Pos = Lsb + 32;1025Size = Msbd + 1;1026break;1027default:1028llvm_unreachable("Unknown DEXT instruction!");1029}10301031MI.setOpcode(Mips::DEXT);10321033InsnType Rs = fieldFromInstruction(Insn, 21, 5);1034InsnType Rt = fieldFromInstruction(Insn, 16, 5);10351036MI.addOperand(1037MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID, Rt)));1038MI.addOperand(1039MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID, Rs)));1040MI.addOperand(MCOperand::createImm(Pos));1041MI.addOperand(MCOperand::createImm(Size));10421043return MCDisassembler::Success;1044}10451046// Override the generated disassembler to produce DINS all the time. This is1047// for feature / behaviour parity with binutils.1048template <typename InsnType>1049static DecodeStatus DecodeDINS(MCInst &MI, InsnType Insn, uint64_t Address,1050const MCDisassembler *Decoder) {1051unsigned Msbd = fieldFromInstruction(Insn, 11, 5);1052unsigned Lsb = fieldFromInstruction(Insn, 6, 5);1053unsigned Size = 0;1054unsigned Pos = 0;10551056switch (MI.getOpcode()) {1057case Mips::DINS:1058Pos = Lsb;1059Size = Msbd + 1 - Pos;1060break;1061case Mips::DINSM:1062Pos = Lsb;1063Size = Msbd + 33 - Pos;1064break;1065case Mips::DINSU:1066Pos = Lsb + 32;1067// mbsd = pos + size - 331068// mbsd - pos + 33 = size1069Size = Msbd + 33 - Pos;1070break;1071default:1072llvm_unreachable("Unknown DINS instruction!");1073}10741075InsnType Rs = fieldFromInstruction(Insn, 21, 5);1076InsnType Rt = fieldFromInstruction(Insn, 16, 5);10771078MI.setOpcode(Mips::DINS);1079MI.addOperand(1080MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID, Rt)));1081MI.addOperand(1082MCOperand::createReg(getReg(Decoder, Mips::GPR64RegClassID, Rs)));1083MI.addOperand(MCOperand::createImm(Pos));1084MI.addOperand(MCOperand::createImm(Size));10851086return MCDisassembler::Success;1087}10881089// Auto-generated decoder wouldn't add the third operand for CRC32*.1090template <typename InsnType>1091static DecodeStatus DecodeCRC(MCInst &MI, InsnType Insn, uint64_t Address,1092const MCDisassembler *Decoder) {1093InsnType Rs = fieldFromInstruction(Insn, 21, 5);1094InsnType Rt = fieldFromInstruction(Insn, 16, 5);1095MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,1096Rt)));1097MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,1098Rs)));1099MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,1100Rt)));1101return MCDisassembler::Success;1102}11031104/// Read two bytes from the ArrayRef and return 16 bit halfword sorted1105/// according to the given endianness.1106static DecodeStatus readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,1107uint64_t &Size, uint32_t &Insn,1108bool IsBigEndian) {1109// We want to read exactly 2 Bytes of data.1110if (Bytes.size() < 2) {1111Size = 0;1112return MCDisassembler::Fail;1113}11141115if (IsBigEndian) {1116Insn = (Bytes[0] << 8) | Bytes[1];1117} else {1118Insn = (Bytes[1] << 8) | Bytes[0];1119}11201121return MCDisassembler::Success;1122}11231124/// Read four bytes from the ArrayRef and return 32 bit word sorted1125/// according to the given endianness.1126static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,1127uint64_t &Size, uint32_t &Insn,1128bool IsBigEndian, bool IsMicroMips) {1129// We want to read exactly 4 Bytes of data.1130if (Bytes.size() < 4) {1131Size = 0;1132return MCDisassembler::Fail;1133}11341135// High 16 bits of a 32-bit microMIPS instruction (where the opcode is)1136// always precede the low 16 bits in the instruction stream (that is, they1137// are placed at lower addresses in the instruction stream).1138//1139// microMIPS byte ordering:1140// Big-endian: 0 | 1 | 2 | 31141// Little-endian: 1 | 0 | 3 | 211421143if (IsBigEndian) {1144// Encoded as a big-endian 32-bit word in the stream.1145Insn =1146(Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | (Bytes[0] << 24);1147} else {1148if (IsMicroMips) {1149Insn = (Bytes[2] << 0) | (Bytes[3] << 8) | (Bytes[0] << 16) |1150(Bytes[1] << 24);1151} else {1152Insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |1153(Bytes[3] << 24);1154}1155}11561157return MCDisassembler::Success;1158}11591160DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,1161ArrayRef<uint8_t> Bytes,1162uint64_t Address,1163raw_ostream &CStream) const {1164uint32_t Insn;1165DecodeStatus Result;1166Size = 0;11671168if (IsMicroMips) {1169Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);1170if (Result == MCDisassembler::Fail)1171return MCDisassembler::Fail;11721173if (hasMips32r6()) {1174LLVM_DEBUG(1175dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");1176// Calling the auto-generated decoder function for microMIPS32R61177// 16-bit instructions.1178Result = decodeInstruction(DecoderTableMicroMipsR616, Instr, Insn,1179Address, this, STI);1180if (Result != MCDisassembler::Fail) {1181Size = 2;1182return Result;1183}1184}11851186LLVM_DEBUG(dbgs() << "Trying MicroMips16 table (16-bit instructions):\n");1187// Calling the auto-generated decoder function for microMIPS 16-bit1188// instructions.1189Result = decodeInstruction(DecoderTableMicroMips16, Instr, Insn, Address,1190this, STI);1191if (Result != MCDisassembler::Fail) {1192Size = 2;1193return Result;1194}11951196Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, true);1197if (Result == MCDisassembler::Fail)1198return MCDisassembler::Fail;11991200if (hasMips32r6()) {1201LLVM_DEBUG(1202dbgs() << "Trying MicroMips32r632 table (32-bit instructions):\n");1203// Calling the auto-generated decoder function.1204Result = decodeInstruction(DecoderTableMicroMipsR632, Instr, Insn,1205Address, this, STI);1206if (Result != MCDisassembler::Fail) {1207Size = 4;1208return Result;1209}1210}12111212LLVM_DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");1213// Calling the auto-generated decoder function.1214Result = decodeInstruction(DecoderTableMicroMips32, Instr, Insn, Address,1215this, STI);1216if (Result != MCDisassembler::Fail) {1217Size = 4;1218return Result;1219}12201221if (isFP64()) {1222LLVM_DEBUG(dbgs() << "Trying MicroMipsFP64 table (32-bit opcodes):\n");1223Result = decodeInstruction(DecoderTableMicroMipsFP6432, Instr, Insn,1224Address, this, STI);1225if (Result != MCDisassembler::Fail) {1226Size = 4;1227return Result;1228}1229}12301231// This is an invalid instruction. Claim that the Size is 2 bytes. Since1232// microMIPS instructions have a minimum alignment of 2, the next 2 bytes1233// could form a valid instruction. The two bytes we rejected as an1234// instruction could have actually beeen an inline constant pool that is1235// unconditionally branched over.1236Size = 2;1237return MCDisassembler::Fail;1238}12391240// Attempt to read the instruction so that we can attempt to decode it. If1241// the buffer is not 4 bytes long, let the higher level logic figure out1242// what to do with a size of zero and MCDisassembler::Fail.1243Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);1244if (Result == MCDisassembler::Fail)1245return MCDisassembler::Fail;12461247// The only instruction size for standard encoded MIPS.1248Size = 4;12491250if (hasCOP3()) {1251LLVM_DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");1252Result =1253decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI);1254if (Result != MCDisassembler::Fail)1255return Result;1256}12571258if (hasMips32r6() && isGP64()) {1259LLVM_DEBUG(1260dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");1261Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn,1262Address, this, STI);1263if (Result != MCDisassembler::Fail)1264return Result;1265}12661267if (hasMips32r6() && isPTR64()) {1268LLVM_DEBUG(1269dbgs() << "Trying Mips32r6_64r6 (PTR64) table (32-bit opcodes):\n");1270Result = decodeInstruction(DecoderTableMips32r6_64r6_PTR6432, Instr, Insn,1271Address, this, STI);1272if (Result != MCDisassembler::Fail)1273return Result;1274}12751276if (hasMips32r6()) {1277LLVM_DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");1278Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn,1279Address, this, STI);1280if (Result != MCDisassembler::Fail)1281return Result;1282}12831284if (hasMips2() && isPTR64()) {1285LLVM_DEBUG(1286dbgs() << "Trying Mips32r6_64r6 (PTR64) table (32-bit opcodes):\n");1287Result = decodeInstruction(DecoderTableMips32_64_PTR6432, Instr, Insn,1288Address, this, STI);1289if (Result != MCDisassembler::Fail)1290return Result;1291}12921293if (hasCnMips()) {1294LLVM_DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n");1295Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn,1296Address, this, STI);1297if (Result != MCDisassembler::Fail)1298return Result;1299}13001301if (hasCnMipsP()) {1302LLVM_DEBUG(dbgs() << "Trying CnMipsP table (32-bit opcodes):\n");1303Result = decodeInstruction(DecoderTableCnMipsP32, Instr, Insn,1304Address, this, STI);1305if (Result != MCDisassembler::Fail)1306return Result;1307}13081309if (isGP64()) {1310LLVM_DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");1311Result = decodeInstruction(DecoderTableMips6432, Instr, Insn,1312Address, this, STI);1313if (Result != MCDisassembler::Fail)1314return Result;1315}13161317if (isFP64()) {1318LLVM_DEBUG(1319dbgs() << "Trying MipsFP64 (64 bit FPU) table (32-bit opcodes):\n");1320Result = decodeInstruction(DecoderTableMipsFP6432, Instr, Insn,1321Address, this, STI);1322if (Result != MCDisassembler::Fail)1323return Result;1324}13251326LLVM_DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");1327// Calling the auto-generated decoder function.1328Result =1329decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI);1330if (Result != MCDisassembler::Fail)1331return Result;13321333return MCDisassembler::Fail;1334}13351336static DecodeStatus1337DecodeCPU16RegsRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,1338const MCDisassembler *Decoder) {1339return MCDisassembler::Fail;1340}13411342static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst, unsigned RegNo,1343uint64_t Address,1344const MCDisassembler *Decoder) {1345if (RegNo > 31)1346return MCDisassembler::Fail;13471348unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);1349Inst.addOperand(MCOperand::createReg(Reg));1350return MCDisassembler::Success;1351}13521353static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst, unsigned RegNo,1354uint64_t Address,1355const MCDisassembler *Decoder) {1356if (RegNo > 7)1357return MCDisassembler::Fail;1358unsigned Reg = getReg(Decoder, Mips::GPRMM16RegClassID, RegNo);1359Inst.addOperand(MCOperand::createReg(Reg));1360return MCDisassembler::Success;1361}13621363static DecodeStatus1364DecodeGPRMM16ZeroRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,1365const MCDisassembler *Decoder) {1366if (RegNo > 7)1367return MCDisassembler::Fail;1368unsigned Reg = getReg(Decoder, Mips::GPRMM16ZeroRegClassID, RegNo);1369Inst.addOperand(MCOperand::createReg(Reg));1370return MCDisassembler::Success;1371}13721373static DecodeStatus1374DecodeGPRMM16MovePRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,1375const MCDisassembler *Decoder) {1376if (RegNo > 7)1377return MCDisassembler::Fail;1378unsigned Reg = getReg(Decoder, Mips::GPRMM16MovePRegClassID, RegNo);1379Inst.addOperand(MCOperand::createReg(Reg));1380return MCDisassembler::Success;1381}13821383static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst, unsigned RegNo,1384uint64_t Address,1385const MCDisassembler *Decoder) {1386if (RegNo > 31)1387return MCDisassembler::Fail;1388unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);1389Inst.addOperand(MCOperand::createReg(Reg));1390return MCDisassembler::Success;1391}13921393static DecodeStatus DecodePtrRegisterClass(MCInst &Inst, unsigned RegNo,1394uint64_t Address,1395const MCDisassembler *Decoder) {1396if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())1397return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);13981399return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);1400}14011402static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst, unsigned RegNo,1403uint64_t Address,1404const MCDisassembler *Decoder) {1405return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);1406}14071408static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst, unsigned RegNo,1409uint64_t Address,1410const MCDisassembler *Decoder) {1411if (RegNo > 31)1412return MCDisassembler::Fail;14131414unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);1415Inst.addOperand(MCOperand::createReg(Reg));1416return MCDisassembler::Success;1417}14181419static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst, unsigned RegNo,1420uint64_t Address,1421const MCDisassembler *Decoder) {1422if (RegNo > 31)1423return MCDisassembler::Fail;14241425unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);1426Inst.addOperand(MCOperand::createReg(Reg));1427return MCDisassembler::Success;1428}14291430static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst, unsigned RegNo,1431uint64_t Address,1432const MCDisassembler *Decoder) {1433if (RegNo > 31)1434return MCDisassembler::Fail;1435unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);1436Inst.addOperand(MCOperand::createReg(Reg));1437return MCDisassembler::Success;1438}14391440static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst, unsigned RegNo,1441uint64_t Address,1442const MCDisassembler *Decoder) {1443if (RegNo > 7)1444return MCDisassembler::Fail;1445unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);1446Inst.addOperand(MCOperand::createReg(Reg));1447return MCDisassembler::Success;1448}14491450static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,1451uint64_t Address,1452const MCDisassembler *Decoder) {1453if (RegNo > 31)1454return MCDisassembler::Fail;14551456unsigned Reg = getReg(Decoder, Mips::FGRCCRegClassID, RegNo);1457Inst.addOperand(MCOperand::createReg(Reg));1458return MCDisassembler::Success;1459}14601461static DecodeStatus DecodeMem(MCInst &Inst, unsigned Insn, uint64_t Address,1462const MCDisassembler *Decoder) {1463int Offset = SignExtend32<16>(Insn & 0xffff);1464unsigned Reg = fieldFromInstruction(Insn, 16, 5);1465unsigned Base = fieldFromInstruction(Insn, 21, 5);14661467Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);1468Base = getReg(Decoder, Mips::GPR32RegClassID, Base);14691470if (Inst.getOpcode() == Mips::SC ||1471Inst.getOpcode() == Mips::SCD)1472Inst.addOperand(MCOperand::createReg(Reg));14731474Inst.addOperand(MCOperand::createReg(Reg));1475Inst.addOperand(MCOperand::createReg(Base));1476Inst.addOperand(MCOperand::createImm(Offset));14771478return MCDisassembler::Success;1479}14801481static DecodeStatus DecodeMemEVA(MCInst &Inst, unsigned Insn, uint64_t Address,1482const MCDisassembler *Decoder) {1483int Offset = SignExtend32<9>(Insn >> 7);1484unsigned Reg = fieldFromInstruction(Insn, 16, 5);1485unsigned Base = fieldFromInstruction(Insn, 21, 5);14861487Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);1488Base = getReg(Decoder, Mips::GPR32RegClassID, Base);14891490if (Inst.getOpcode() == Mips::SCE)1491Inst.addOperand(MCOperand::createReg(Reg));14921493Inst.addOperand(MCOperand::createReg(Reg));1494Inst.addOperand(MCOperand::createReg(Base));1495Inst.addOperand(MCOperand::createImm(Offset));14961497return MCDisassembler::Success;1498}14991500static DecodeStatus DecodeLoadByte15(MCInst &Inst, unsigned Insn,1501uint64_t Address,1502const MCDisassembler *Decoder) {1503int Offset = SignExtend32<16>(Insn & 0xffff);1504unsigned Base = fieldFromInstruction(Insn, 16, 5);1505unsigned Reg = fieldFromInstruction(Insn, 21, 5);15061507Base = getReg(Decoder, Mips::GPR32RegClassID, Base);1508Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);15091510Inst.addOperand(MCOperand::createReg(Reg));1511Inst.addOperand(MCOperand::createReg(Base));1512Inst.addOperand(MCOperand::createImm(Offset));15131514return MCDisassembler::Success;1515}15161517static DecodeStatus DecodeCacheOp(MCInst &Inst, unsigned Insn, uint64_t Address,1518const MCDisassembler *Decoder) {1519int Offset = SignExtend32<16>(Insn & 0xffff);1520unsigned Hint = fieldFromInstruction(Insn, 16, 5);1521unsigned Base = fieldFromInstruction(Insn, 21, 5);15221523Base = getReg(Decoder, Mips::GPR32RegClassID, Base);15241525Inst.addOperand(MCOperand::createReg(Base));1526Inst.addOperand(MCOperand::createImm(Offset));1527Inst.addOperand(MCOperand::createImm(Hint));15281529return MCDisassembler::Success;1530}15311532static DecodeStatus DecodeCacheOpMM(MCInst &Inst, unsigned Insn,1533uint64_t Address,1534const MCDisassembler *Decoder) {1535int Offset = SignExtend32<12>(Insn & 0xfff);1536unsigned Base = fieldFromInstruction(Insn, 16, 5);1537unsigned Hint = fieldFromInstruction(Insn, 21, 5);15381539Base = getReg(Decoder, Mips::GPR32RegClassID, Base);15401541Inst.addOperand(MCOperand::createReg(Base));1542Inst.addOperand(MCOperand::createImm(Offset));1543Inst.addOperand(MCOperand::createImm(Hint));15441545return MCDisassembler::Success;1546}15471548static DecodeStatus DecodePrefeOpMM(MCInst &Inst, unsigned Insn,1549uint64_t Address,1550const MCDisassembler *Decoder) {1551int Offset = SignExtend32<9>(Insn & 0x1ff);1552unsigned Base = fieldFromInstruction(Insn, 16, 5);1553unsigned Hint = fieldFromInstruction(Insn, 21, 5);15541555Base = getReg(Decoder, Mips::GPR32RegClassID, Base);15561557Inst.addOperand(MCOperand::createReg(Base));1558Inst.addOperand(MCOperand::createImm(Offset));1559Inst.addOperand(MCOperand::createImm(Hint));15601561return MCDisassembler::Success;1562}15631564static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst, unsigned Insn,1565uint64_t Address,1566const MCDisassembler *Decoder) {1567int Offset = SignExtend32<9>(Insn >> 7);1568unsigned Hint = fieldFromInstruction(Insn, 16, 5);1569unsigned Base = fieldFromInstruction(Insn, 21, 5);15701571Base = getReg(Decoder, Mips::GPR32RegClassID, Base);15721573Inst.addOperand(MCOperand::createReg(Base));1574Inst.addOperand(MCOperand::createImm(Offset));1575Inst.addOperand(MCOperand::createImm(Hint));15761577return MCDisassembler::Success;1578}15791580static DecodeStatus DecodeSyncI(MCInst &Inst, unsigned Insn, uint64_t Address,1581const MCDisassembler *Decoder) {1582int Offset = SignExtend32<16>(Insn & 0xffff);1583unsigned Base = fieldFromInstruction(Insn, 21, 5);15841585Base = getReg(Decoder, Mips::GPR32RegClassID, Base);15861587Inst.addOperand(MCOperand::createReg(Base));1588Inst.addOperand(MCOperand::createImm(Offset));15891590return MCDisassembler::Success;1591}15921593static DecodeStatus DecodeSyncI_MM(MCInst &Inst, unsigned Insn,1594uint64_t Address,1595const MCDisassembler *Decoder) {1596int Offset = SignExtend32<16>(Insn & 0xffff);1597unsigned Base = fieldFromInstruction(Insn, 16, 5);15981599Base = getReg(Decoder, Mips::GPR32RegClassID, Base);16001601Inst.addOperand(MCOperand::createReg(Base));1602Inst.addOperand(MCOperand::createImm(Offset));16031604return MCDisassembler::Success;1605}16061607static DecodeStatus DecodeSynciR6(MCInst &Inst, unsigned Insn, uint64_t Address,1608const MCDisassembler *Decoder) {1609int Immediate = SignExtend32<16>(Insn & 0xffff);1610unsigned Base = fieldFromInstruction(Insn, 16, 5);16111612Base = getReg(Decoder, Mips::GPR32RegClassID, Base);16131614Inst.addOperand(MCOperand::createReg(Base));1615Inst.addOperand(MCOperand::createImm(Immediate));16161617return MCDisassembler::Success;1618}16191620static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,1621uint64_t Address,1622const MCDisassembler *Decoder) {1623int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));1624unsigned Reg = fieldFromInstruction(Insn, 6, 5);1625unsigned Base = fieldFromInstruction(Insn, 11, 5);16261627Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);1628Base = getReg(Decoder, Mips::GPR32RegClassID, Base);16291630Inst.addOperand(MCOperand::createReg(Reg));1631Inst.addOperand(MCOperand::createReg(Base));16321633// The immediate field of an LD/ST instruction is scaled which means it must1634// be multiplied (when decoding) by the size (in bytes) of the instructions'1635// data format.1636// .b - 1 byte1637// .h - 2 bytes1638// .w - 4 bytes1639// .d - 8 bytes1640switch(Inst.getOpcode())1641{1642default:1643assert(false && "Unexpected instruction");1644return MCDisassembler::Fail;1645break;1646case Mips::LD_B:1647case Mips::ST_B:1648Inst.addOperand(MCOperand::createImm(Offset));1649break;1650case Mips::LD_H:1651case Mips::ST_H:1652Inst.addOperand(MCOperand::createImm(Offset * 2));1653break;1654case Mips::LD_W:1655case Mips::ST_W:1656Inst.addOperand(MCOperand::createImm(Offset * 4));1657break;1658case Mips::LD_D:1659case Mips::ST_D:1660Inst.addOperand(MCOperand::createImm(Offset * 8));1661break;1662}16631664return MCDisassembler::Success;1665}16661667static DecodeStatus DecodeMemMMImm4(MCInst &Inst, unsigned Insn,1668uint64_t Address,1669const MCDisassembler *Decoder) {1670unsigned Offset = Insn & 0xf;1671unsigned Reg = fieldFromInstruction(Insn, 7, 3);1672unsigned Base = fieldFromInstruction(Insn, 4, 3);16731674switch (Inst.getOpcode()) {1675case Mips::LBU16_MM:1676case Mips::LHU16_MM:1677case Mips::LW16_MM:1678if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)1679== MCDisassembler::Fail)1680return MCDisassembler::Fail;1681break;1682case Mips::SB16_MM:1683case Mips::SB16_MMR6:1684case Mips::SH16_MM:1685case Mips::SH16_MMR6:1686case Mips::SW16_MM:1687case Mips::SW16_MMR6:1688if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)1689== MCDisassembler::Fail)1690return MCDisassembler::Fail;1691break;1692}16931694if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)1695== MCDisassembler::Fail)1696return MCDisassembler::Fail;16971698switch (Inst.getOpcode()) {1699case Mips::LBU16_MM:1700if (Offset == 0xf)1701Inst.addOperand(MCOperand::createImm(-1));1702else1703Inst.addOperand(MCOperand::createImm(Offset));1704break;1705case Mips::SB16_MM:1706case Mips::SB16_MMR6:1707Inst.addOperand(MCOperand::createImm(Offset));1708break;1709case Mips::LHU16_MM:1710case Mips::SH16_MM:1711case Mips::SH16_MMR6:1712Inst.addOperand(MCOperand::createImm(Offset << 1));1713break;1714case Mips::LW16_MM:1715case Mips::SW16_MM:1716case Mips::SW16_MMR6:1717Inst.addOperand(MCOperand::createImm(Offset << 2));1718break;1719}17201721return MCDisassembler::Success;1722}17231724static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst, unsigned Insn,1725uint64_t Address,1726const MCDisassembler *Decoder) {1727unsigned Offset = Insn & 0x1F;1728unsigned Reg = fieldFromInstruction(Insn, 5, 5);17291730Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);17311732Inst.addOperand(MCOperand::createReg(Reg));1733Inst.addOperand(MCOperand::createReg(Mips::SP));1734Inst.addOperand(MCOperand::createImm(Offset << 2));17351736return MCDisassembler::Success;1737}17381739static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst, unsigned Insn,1740uint64_t Address,1741const MCDisassembler *Decoder) {1742unsigned Offset = Insn & 0x7F;1743unsigned Reg = fieldFromInstruction(Insn, 7, 3);17441745Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);17461747Inst.addOperand(MCOperand::createReg(Reg));1748Inst.addOperand(MCOperand::createReg(Mips::GP));1749Inst.addOperand(MCOperand::createImm(Offset << 2));17501751return MCDisassembler::Success;1752}17531754static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst, unsigned Insn,1755uint64_t Address,1756const MCDisassembler *Decoder) {1757int Offset;1758switch (Inst.getOpcode()) {1759case Mips::LWM16_MMR6:1760case Mips::SWM16_MMR6:1761Offset = fieldFromInstruction(Insn, 4, 4);1762break;1763default:1764Offset = SignExtend32<4>(Insn & 0xf);1765break;1766}17671768if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)1769== MCDisassembler::Fail)1770return MCDisassembler::Fail;17711772Inst.addOperand(MCOperand::createReg(Mips::SP));1773Inst.addOperand(MCOperand::createImm(Offset << 2));17741775return MCDisassembler::Success;1776}17771778static DecodeStatus DecodeMemMMImm9(MCInst &Inst, unsigned Insn,1779uint64_t Address,1780const MCDisassembler *Decoder) {1781int Offset = SignExtend32<9>(Insn & 0x1ff);1782unsigned Reg = fieldFromInstruction(Insn, 21, 5);1783unsigned Base = fieldFromInstruction(Insn, 16, 5);17841785Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);1786Base = getReg(Decoder, Mips::GPR32RegClassID, Base);17871788if (Inst.getOpcode() == Mips::SCE_MM || Inst.getOpcode() == Mips::SC_MMR6)1789Inst.addOperand(MCOperand::createReg(Reg));17901791Inst.addOperand(MCOperand::createReg(Reg));1792Inst.addOperand(MCOperand::createReg(Base));1793Inst.addOperand(MCOperand::createImm(Offset));17941795return MCDisassembler::Success;1796}17971798static DecodeStatus DecodeMemMMImm12(MCInst &Inst, unsigned Insn,1799uint64_t Address,1800const MCDisassembler *Decoder) {1801int Offset = SignExtend32<12>(Insn & 0x0fff);1802unsigned Reg = fieldFromInstruction(Insn, 21, 5);1803unsigned Base = fieldFromInstruction(Insn, 16, 5);18041805Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);1806Base = getReg(Decoder, Mips::GPR32RegClassID, Base);18071808switch (Inst.getOpcode()) {1809case Mips::SWM32_MM:1810case Mips::LWM32_MM:1811if (DecodeRegListOperand(Inst, Insn, Address, Decoder)1812== MCDisassembler::Fail)1813return MCDisassembler::Fail;1814Inst.addOperand(MCOperand::createReg(Base));1815Inst.addOperand(MCOperand::createImm(Offset));1816break;1817case Mips::SC_MM:1818Inst.addOperand(MCOperand::createReg(Reg));1819[[fallthrough]];1820default:1821Inst.addOperand(MCOperand::createReg(Reg));1822if (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM)1823Inst.addOperand(MCOperand::createReg(Reg+1));18241825Inst.addOperand(MCOperand::createReg(Base));1826Inst.addOperand(MCOperand::createImm(Offset));1827}18281829return MCDisassembler::Success;1830}18311832static DecodeStatus DecodeMemMMImm16(MCInst &Inst, unsigned Insn,1833uint64_t Address,1834const MCDisassembler *Decoder) {1835int Offset = SignExtend32<16>(Insn & 0xffff);1836unsigned Reg = fieldFromInstruction(Insn, 21, 5);1837unsigned Base = fieldFromInstruction(Insn, 16, 5);18381839Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);1840Base = getReg(Decoder, Mips::GPR32RegClassID, Base);18411842Inst.addOperand(MCOperand::createReg(Reg));1843Inst.addOperand(MCOperand::createReg(Base));1844Inst.addOperand(MCOperand::createImm(Offset));18451846return MCDisassembler::Success;1847}18481849static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn, uint64_t Address,1850const MCDisassembler *Decoder) {1851int Offset = SignExtend32<16>(Insn & 0xffff);1852unsigned Reg = fieldFromInstruction(Insn, 16, 5);1853unsigned Base = fieldFromInstruction(Insn, 21, 5);18541855Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);1856Base = getReg(Decoder, Mips::GPR32RegClassID, Base);18571858Inst.addOperand(MCOperand::createReg(Reg));1859Inst.addOperand(MCOperand::createReg(Base));1860Inst.addOperand(MCOperand::createImm(Offset));18611862return MCDisassembler::Success;1863}18641865static DecodeStatus DecodeFMemMMR2(MCInst &Inst, unsigned Insn,1866uint64_t Address,1867const MCDisassembler *Decoder) {1868// This function is the same as DecodeFMem but with the Reg and Base fields1869// swapped according to microMIPS spec.1870int Offset = SignExtend32<16>(Insn & 0xffff);1871unsigned Base = fieldFromInstruction(Insn, 16, 5);1872unsigned Reg = fieldFromInstruction(Insn, 21, 5);18731874Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);1875Base = getReg(Decoder, Mips::GPR32RegClassID, Base);18761877Inst.addOperand(MCOperand::createReg(Reg));1878Inst.addOperand(MCOperand::createReg(Base));1879Inst.addOperand(MCOperand::createImm(Offset));18801881return MCDisassembler::Success;1882}18831884static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn, uint64_t Address,1885const MCDisassembler *Decoder) {1886int Offset = SignExtend32<16>(Insn & 0xffff);1887unsigned Reg = fieldFromInstruction(Insn, 16, 5);1888unsigned Base = fieldFromInstruction(Insn, 21, 5);18891890Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);1891Base = getReg(Decoder, Mips::GPR32RegClassID, Base);18921893Inst.addOperand(MCOperand::createReg(Reg));1894Inst.addOperand(MCOperand::createReg(Base));1895Inst.addOperand(MCOperand::createImm(Offset));18961897return MCDisassembler::Success;1898}18991900static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn, uint64_t Address,1901const MCDisassembler *Decoder) {1902int Offset = SignExtend32<16>(Insn & 0xffff);1903unsigned Reg = fieldFromInstruction(Insn, 16, 5);1904unsigned Base = fieldFromInstruction(Insn, 21, 5);19051906Reg = getReg(Decoder, Mips::COP3RegClassID, Reg);1907Base = getReg(Decoder, Mips::GPR32RegClassID, Base);19081909Inst.addOperand(MCOperand::createReg(Reg));1910Inst.addOperand(MCOperand::createReg(Base));1911Inst.addOperand(MCOperand::createImm(Offset));19121913return MCDisassembler::Success;1914}19151916static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,1917uint64_t Address,1918const MCDisassembler *Decoder) {1919int Offset = SignExtend32<11>(Insn & 0x07ff);1920unsigned Reg = fieldFromInstruction(Insn, 16, 5);1921unsigned Base = fieldFromInstruction(Insn, 11, 5);19221923Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);1924Base = getReg(Decoder, Mips::GPR32RegClassID, Base);19251926Inst.addOperand(MCOperand::createReg(Reg));1927Inst.addOperand(MCOperand::createReg(Base));1928Inst.addOperand(MCOperand::createImm(Offset));19291930return MCDisassembler::Success;1931}19321933static DecodeStatus DecodeFMemCop2MMR6(MCInst &Inst, unsigned Insn,1934uint64_t Address,1935const MCDisassembler *Decoder) {1936int Offset = SignExtend32<11>(Insn & 0x07ff);1937unsigned Reg = fieldFromInstruction(Insn, 21, 5);1938unsigned Base = fieldFromInstruction(Insn, 16, 5);19391940Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);1941Base = getReg(Decoder, Mips::GPR32RegClassID, Base);19421943Inst.addOperand(MCOperand::createReg(Reg));1944Inst.addOperand(MCOperand::createReg(Base));1945Inst.addOperand(MCOperand::createImm(Offset));19461947return MCDisassembler::Success;1948}19491950static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst, unsigned Insn,1951uint64_t Address,1952const MCDisassembler *Decoder) {1953int64_t Offset = SignExtend64<9>((Insn >> 7) & 0x1ff);1954unsigned Rt = fieldFromInstruction(Insn, 16, 5);1955unsigned Base = fieldFromInstruction(Insn, 21, 5);19561957Rt = getReg(Decoder, Mips::GPR32RegClassID, Rt);1958Base = getReg(Decoder, Mips::GPR32RegClassID, Base);19591960if(Inst.getOpcode() == Mips::SC_R6 || Inst.getOpcode() == Mips::SCD_R6){1961Inst.addOperand(MCOperand::createReg(Rt));1962}19631964Inst.addOperand(MCOperand::createReg(Rt));1965Inst.addOperand(MCOperand::createReg(Base));1966Inst.addOperand(MCOperand::createImm(Offset));19671968return MCDisassembler::Success;1969}19701971static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst, unsigned RegNo,1972uint64_t Address,1973const MCDisassembler *Decoder) {1974// Currently only hardware register 29 is supported.1975if (RegNo != 29)1976return MCDisassembler::Fail;1977Inst.addOperand(MCOperand::createReg(Mips::HWR29));1978return MCDisassembler::Success;1979}19801981static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst, unsigned RegNo,1982uint64_t Address,1983const MCDisassembler *Decoder) {1984if (RegNo > 30 || RegNo %2)1985return MCDisassembler::Fail;19861987unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);1988Inst.addOperand(MCOperand::createReg(Reg));1989return MCDisassembler::Success;1990}19911992static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst, unsigned RegNo,1993uint64_t Address,1994const MCDisassembler *Decoder) {1995if (RegNo >= 4)1996return MCDisassembler::Fail;19971998unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);1999Inst.addOperand(MCOperand::createReg(Reg));2000return MCDisassembler::Success;2001}20022003static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst, unsigned RegNo,2004uint64_t Address,2005const MCDisassembler *Decoder) {2006if (RegNo >= 4)2007return MCDisassembler::Fail;20082009unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);2010Inst.addOperand(MCOperand::createReg(Reg));2011return MCDisassembler::Success;2012}20132014static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst, unsigned RegNo,2015uint64_t Address,2016const MCDisassembler *Decoder) {2017if (RegNo >= 4)2018return MCDisassembler::Fail;20192020unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);2021Inst.addOperand(MCOperand::createReg(Reg));2022return MCDisassembler::Success;2023}20242025static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst, unsigned RegNo,2026uint64_t Address,2027const MCDisassembler *Decoder) {2028if (RegNo > 31)2029return MCDisassembler::Fail;20302031unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);2032Inst.addOperand(MCOperand::createReg(Reg));2033return MCDisassembler::Success;2034}20352036static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst, unsigned RegNo,2037uint64_t Address,2038const MCDisassembler *Decoder) {2039if (RegNo > 31)2040return MCDisassembler::Fail;20412042unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);2043Inst.addOperand(MCOperand::createReg(Reg));2044return MCDisassembler::Success;2045}20462047static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst, unsigned RegNo,2048uint64_t Address,2049const MCDisassembler *Decoder) {2050if (RegNo > 31)2051return MCDisassembler::Fail;20522053unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);2054Inst.addOperand(MCOperand::createReg(Reg));2055return MCDisassembler::Success;2056}20572058static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst, unsigned RegNo,2059uint64_t Address,2060const MCDisassembler *Decoder) {2061if (RegNo > 31)2062return MCDisassembler::Fail;20632064unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);2065Inst.addOperand(MCOperand::createReg(Reg));2066return MCDisassembler::Success;2067}20682069static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst, unsigned RegNo,2070uint64_t Address,2071const MCDisassembler *Decoder) {2072if (RegNo > 7)2073return MCDisassembler::Fail;20742075unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);2076Inst.addOperand(MCOperand::createReg(Reg));2077return MCDisassembler::Success;2078}20792080static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst, unsigned RegNo,2081uint64_t Address,2082const MCDisassembler *Decoder) {2083if (RegNo > 31)2084return MCDisassembler::Fail;20852086unsigned Reg = getReg(Decoder, Mips::COP0RegClassID, RegNo);2087Inst.addOperand(MCOperand::createReg(Reg));2088return MCDisassembler::Success;2089}20902091static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst, unsigned RegNo,2092uint64_t Address,2093const MCDisassembler *Decoder) {2094if (RegNo > 31)2095return MCDisassembler::Fail;20962097unsigned Reg = getReg(Decoder, Mips::COP2RegClassID, RegNo);2098Inst.addOperand(MCOperand::createReg(Reg));2099return MCDisassembler::Success;2100}21012102static DecodeStatus DecodeBranchTarget(MCInst &Inst, unsigned Offset,2103uint64_t Address,2104const MCDisassembler *Decoder) {2105int32_t BranchOffset = (SignExtend32<16>(Offset) * 4) + 4;2106Inst.addOperand(MCOperand::createImm(BranchOffset));2107return MCDisassembler::Success;2108}21092110static DecodeStatus DecodeBranchTarget1SImm16(MCInst &Inst, unsigned Offset,2111uint64_t Address,2112const MCDisassembler *Decoder) {2113int32_t BranchOffset = (SignExtend32<16>(Offset) * 2);2114Inst.addOperand(MCOperand::createImm(BranchOffset));2115return MCDisassembler::Success;2116}21172118static DecodeStatus DecodeJumpTarget(MCInst &Inst, unsigned Insn,2119uint64_t Address,2120const MCDisassembler *Decoder) {2121unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;2122Inst.addOperand(MCOperand::createImm(JumpOffset));2123return MCDisassembler::Success;2124}21252126static DecodeStatus DecodeBranchTarget21(MCInst &Inst, unsigned Offset,2127uint64_t Address,2128const MCDisassembler *Decoder) {2129int32_t BranchOffset = SignExtend32<21>(Offset) * 4 + 4;21302131Inst.addOperand(MCOperand::createImm(BranchOffset));2132return MCDisassembler::Success;2133}21342135static DecodeStatus DecodeBranchTarget21MM(MCInst &Inst, unsigned Offset,2136uint64_t Address,2137const MCDisassembler *Decoder) {2138int32_t BranchOffset = SignExtend32<21>(Offset) * 4 + 4;21392140Inst.addOperand(MCOperand::createImm(BranchOffset));2141return MCDisassembler::Success;2142}21432144static DecodeStatus DecodeBranchTarget26(MCInst &Inst, unsigned Offset,2145uint64_t Address,2146const MCDisassembler *Decoder) {2147int32_t BranchOffset = SignExtend32<26>(Offset) * 4 + 4;21482149Inst.addOperand(MCOperand::createImm(BranchOffset));2150return MCDisassembler::Success;2151}21522153static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst, unsigned Offset,2154uint64_t Address,2155const MCDisassembler *Decoder) {2156int32_t BranchOffset = SignExtend32<8>(Offset << 1);2157Inst.addOperand(MCOperand::createImm(BranchOffset));2158return MCDisassembler::Success;2159}21602161static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst, unsigned Offset,2162uint64_t Address,2163const MCDisassembler *Decoder) {2164int32_t BranchOffset = SignExtend32<11>(Offset << 1);2165Inst.addOperand(MCOperand::createImm(BranchOffset));2166return MCDisassembler::Success;2167}21682169static DecodeStatus DecodeBranchTargetMM(MCInst &Inst, unsigned Offset,2170uint64_t Address,2171const MCDisassembler *Decoder) {2172int32_t BranchOffset = SignExtend32<16>(Offset) * 2 + 4;2173Inst.addOperand(MCOperand::createImm(BranchOffset));2174return MCDisassembler::Success;2175}21762177static DecodeStatus DecodeBranchTarget26MM(MCInst &Inst, unsigned Offset,2178uint64_t Address,2179const MCDisassembler *Decoder) {2180int32_t BranchOffset = SignExtend32<27>(Offset << 1);21812182Inst.addOperand(MCOperand::createImm(BranchOffset));2183return MCDisassembler::Success;2184}21852186static DecodeStatus DecodeJumpTargetMM(MCInst &Inst, unsigned Insn,2187uint64_t Address,2188const MCDisassembler *Decoder) {2189unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;2190Inst.addOperand(MCOperand::createImm(JumpOffset));2191return MCDisassembler::Success;2192}21932194static DecodeStatus DecodeJumpTargetXMM(MCInst &Inst, unsigned Insn,2195uint64_t Address,2196const MCDisassembler *Decoder) {2197unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;2198Inst.addOperand(MCOperand::createImm(JumpOffset));2199return MCDisassembler::Success;2200}22012202static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst, unsigned Value,2203uint64_t Address,2204const MCDisassembler *Decoder) {2205if (Value == 0)2206Inst.addOperand(MCOperand::createImm(1));2207else if (Value == 0x7)2208Inst.addOperand(MCOperand::createImm(-1));2209else2210Inst.addOperand(MCOperand::createImm(Value << 2));2211return MCDisassembler::Success;2212}22132214static DecodeStatus DecodeLi16Imm(MCInst &Inst, unsigned Value,2215uint64_t Address,2216const MCDisassembler *Decoder) {2217if (Value == 0x7F)2218Inst.addOperand(MCOperand::createImm(-1));2219else2220Inst.addOperand(MCOperand::createImm(Value));2221return MCDisassembler::Success;2222}22232224static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst, unsigned Value,2225uint64_t Address,2226const MCDisassembler *Decoder) {2227Inst.addOperand(MCOperand::createImm(Value == 0x0 ? 8 : Value));2228return MCDisassembler::Success;2229}22302231template <unsigned Bits, int Offset, int Scale>2232static DecodeStatus2233DecodeUImmWithOffsetAndScale(MCInst &Inst, unsigned Value, uint64_t Address,2234const MCDisassembler *Decoder) {2235Value &= ((1 << Bits) - 1);2236Value *= Scale;2237Inst.addOperand(MCOperand::createImm(Value + Offset));2238return MCDisassembler::Success;2239}22402241template <unsigned Bits, int Offset, int ScaleBy>2242static DecodeStatus2243DecodeSImmWithOffsetAndScale(MCInst &Inst, unsigned Value, uint64_t Address,2244const MCDisassembler *Decoder) {2245int32_t Imm = SignExtend32<Bits>(Value) * ScaleBy;2246Inst.addOperand(MCOperand::createImm(Imm + Offset));2247return MCDisassembler::Success;2248}22492250static DecodeStatus DecodeInsSize(MCInst &Inst, unsigned Insn, uint64_t Address,2251const MCDisassembler *Decoder) {2252// First we need to grab the pos(lsb) from MCInst.2253// This function only handles the 32 bit variants of ins, as dins2254// variants are handled differently.2255int Pos = Inst.getOperand(2).getImm();2256int Size = (int) Insn - Pos + 1;2257Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));2258return MCDisassembler::Success;2259}22602261static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,2262uint64_t Address,2263const MCDisassembler *Decoder) {2264Inst.addOperand(MCOperand::createImm(SignExtend32<19>(Insn) * 4));2265return MCDisassembler::Success;2266}22672268static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,2269uint64_t Address,2270const MCDisassembler *Decoder) {2271Inst.addOperand(MCOperand::createImm(SignExtend32<18>(Insn) * 8));2272return MCDisassembler::Success;2273}22742275static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn, uint64_t Address,2276const MCDisassembler *Decoder) {2277int32_t DecodedValue;2278switch (Insn) {2279case 0: DecodedValue = 256; break;2280case 1: DecodedValue = 257; break;2281case 510: DecodedValue = -258; break;2282case 511: DecodedValue = -257; break;2283default: DecodedValue = SignExtend32<9>(Insn); break;2284}2285Inst.addOperand(MCOperand::createImm(DecodedValue * 4));2286return MCDisassembler::Success;2287}22882289static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,2290uint64_t Address,2291const MCDisassembler *Decoder) {2292// Insn must be >= 0, since it is unsigned that condition is always true.2293assert(Insn < 16);2294int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,2295255, 32768, 65535};2296Inst.addOperand(MCOperand::createImm(DecodedValues[Insn]));2297return MCDisassembler::Success;2298}22992300static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,2301uint64_t Address,2302const MCDisassembler *Decoder) {2303unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3, Mips::S4, Mips::S5,2304Mips::S6, Mips::S7, Mips::FP};2305unsigned RegNum;23062307unsigned RegLst = fieldFromInstruction(Insn, 21, 5);23082309// Empty register lists are not allowed.2310if (RegLst == 0)2311return MCDisassembler::Fail;23122313RegNum = RegLst & 0xf;23142315// RegLst values 10-15, and 26-31 are reserved.2316if (RegNum > 9)2317return MCDisassembler::Fail;23182319for (unsigned i = 0; i < RegNum; i++)2320Inst.addOperand(MCOperand::createReg(Regs[i]));23212322if (RegLst & 0x10)2323Inst.addOperand(MCOperand::createReg(Mips::RA));23242325return MCDisassembler::Success;2326}23272328static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,2329uint64_t Address,2330const MCDisassembler *Decoder) {2331unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};2332unsigned RegLst;2333switch(Inst.getOpcode()) {2334default:2335RegLst = fieldFromInstruction(Insn, 4, 2);2336break;2337case Mips::LWM16_MMR6:2338case Mips::SWM16_MMR6:2339RegLst = fieldFromInstruction(Insn, 8, 2);2340break;2341}2342unsigned RegNum = RegLst & 0x3;23432344for (unsigned i = 0; i <= RegNum; i++)2345Inst.addOperand(MCOperand::createReg(Regs[i]));23462347Inst.addOperand(MCOperand::createReg(Mips::RA));23482349return MCDisassembler::Success;2350}23512352static DecodeStatus DecodeMovePOperands(MCInst &Inst, unsigned Insn,2353uint64_t Address,2354const MCDisassembler *Decoder) {2355unsigned RegPair = fieldFromInstruction(Insn, 7, 3);2356if (DecodeMovePRegPair(Inst, RegPair, Address, Decoder) ==2357MCDisassembler::Fail)2358return MCDisassembler::Fail;23592360unsigned RegRs;2361if (static_cast<const MipsDisassembler*>(Decoder)->hasMips32r6())2362RegRs = fieldFromInstruction(Insn, 0, 2) |2363(fieldFromInstruction(Insn, 3, 1) << 2);2364else2365RegRs = fieldFromInstruction(Insn, 1, 3);2366if (DecodeGPRMM16MovePRegisterClass(Inst, RegRs, Address, Decoder) ==2367MCDisassembler::Fail)2368return MCDisassembler::Fail;23692370unsigned RegRt = fieldFromInstruction(Insn, 4, 3);2371if (DecodeGPRMM16MovePRegisterClass(Inst, RegRt, Address, Decoder) ==2372MCDisassembler::Fail)2373return MCDisassembler::Fail;23742375return MCDisassembler::Success;2376}23772378static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned RegPair,2379uint64_t Address,2380const MCDisassembler *Decoder) {2381switch (RegPair) {2382default:2383return MCDisassembler::Fail;2384case 0:2385Inst.addOperand(MCOperand::createReg(Mips::A1));2386Inst.addOperand(MCOperand::createReg(Mips::A2));2387break;2388case 1:2389Inst.addOperand(MCOperand::createReg(Mips::A1));2390Inst.addOperand(MCOperand::createReg(Mips::A3));2391break;2392case 2:2393Inst.addOperand(MCOperand::createReg(Mips::A2));2394Inst.addOperand(MCOperand::createReg(Mips::A3));2395break;2396case 3:2397Inst.addOperand(MCOperand::createReg(Mips::A0));2398Inst.addOperand(MCOperand::createReg(Mips::S5));2399break;2400case 4:2401Inst.addOperand(MCOperand::createReg(Mips::A0));2402Inst.addOperand(MCOperand::createReg(Mips::S6));2403break;2404case 5:2405Inst.addOperand(MCOperand::createReg(Mips::A0));2406Inst.addOperand(MCOperand::createReg(Mips::A1));2407break;2408case 6:2409Inst.addOperand(MCOperand::createReg(Mips::A0));2410Inst.addOperand(MCOperand::createReg(Mips::A2));2411break;2412case 7:2413Inst.addOperand(MCOperand::createReg(Mips::A0));2414Inst.addOperand(MCOperand::createReg(Mips::A3));2415break;2416}24172418return MCDisassembler::Success;2419}24202421static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,2422uint64_t Address,2423const MCDisassembler *Decoder) {2424Inst.addOperand(MCOperand::createImm(SignExtend32<25>(Insn << 2)));2425return MCDisassembler::Success;2426}24272428template <typename InsnType>2429static DecodeStatus DecodeBgtzGroupBranchMMR6(MCInst &MI, InsnType insn,2430uint64_t Address,2431const MCDisassembler *Decoder) {2432// We have:2433// 0b000111 ttttt sssss iiiiiiiiiiiiiiii2434// Invalid if rt == 02435// BGTZALC_MMR6 if rs == 0 && rt != 02436// BLTZALC_MMR6 if rs != 0 && rs == rt2437// BLTUC_MMR6 if rs != 0 && rs != rt24382439InsnType Rt = fieldFromInstruction(insn, 21, 5);2440InsnType Rs = fieldFromInstruction(insn, 16, 5);2441InsnType Imm = 0;2442bool HasRs = false;2443bool HasRt = false;24442445if (Rt == 0)2446return MCDisassembler::Fail;2447else if (Rs == 0) {2448MI.setOpcode(Mips::BGTZALC_MMR6);2449HasRt = true;2450Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;2451}2452else if (Rs == Rt) {2453MI.setOpcode(Mips::BLTZALC_MMR6);2454HasRs = true;2455Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;2456}2457else {2458MI.setOpcode(Mips::BLTUC_MMR6);2459HasRs = true;2460HasRt = true;2461Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;2462}24632464if (HasRs)2465MI.addOperand(2466MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rs)));24672468if (HasRt)2469MI.addOperand(2470MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rt)));24712472MI.addOperand(MCOperand::createImm(Imm));24732474return MCDisassembler::Success;2475}24762477template <typename InsnType>2478static DecodeStatus DecodeBlezGroupBranchMMR6(MCInst &MI, InsnType insn,2479uint64_t Address,2480const MCDisassembler *Decoder) {2481// We have:2482// 0b000110 ttttt sssss iiiiiiiiiiiiiiii2483// Invalid if rt == 02484// BLEZALC_MMR6 if rs == 0 && rt != 02485// BGEZALC_MMR6 if rs == rt && rt != 02486// BGEUC_MMR6 if rs != rt && rs != 0 && rt != 024872488InsnType Rt = fieldFromInstruction(insn, 21, 5);2489InsnType Rs = fieldFromInstruction(insn, 16, 5);2490InsnType Imm = 0;2491bool HasRs = false;24922493if (Rt == 0)2494return MCDisassembler::Fail;2495else if (Rs == 0) {2496MI.setOpcode(Mips::BLEZALC_MMR6);2497Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;2498}2499else if (Rs == Rt) {2500MI.setOpcode(Mips::BGEZALC_MMR6);2501Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2 + 4;2502}2503else {2504HasRs = true;2505MI.setOpcode(Mips::BGEUC_MMR6);2506Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;2507}25082509if (HasRs)2510MI.addOperand(2511MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rs)));2512MI.addOperand(2513MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rt)));25142515MI.addOperand(MCOperand::createImm(Imm));25162517return MCDisassembler::Success;2518}25192520// This instruction does not have a working decoder, and needs to be2521// fixed. This "fixme" function was introduced to keep the backend compiling,2522// while making changes to tablegen code.2523static DecodeStatus DecodeFIXMEInstruction(MCInst &Inst, unsigned Insn,2524uint64_t Address,2525const MCDisassembler *Decoder) {2526return MCDisassembler::Fail;2527}252825292530