This commit is contained in:
2026-03-23 12:11:07 +01:00
commit e64eb40b38
4573 changed files with 3117439 additions and 0 deletions
+342
View File
@@ -0,0 +1,342 @@
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2023 */
/* Automatically translated source file from LLVM. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Only small edits allowed. */
/* For multiple similar edits, please create a Patch for the translator. */
/* Capstone's C++ file translator: */
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
//===- SparcDisassembler.cpp - Disassembler for Sparc -----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file is part of the Sparc Disassembler.
//
//===----------------------------------------------------------------------===//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <capstone/platform.h>
#include "../../MCDisassembler.h"
#include "../../MCFixedLenDisassembler.h"
#include "SparcDisassemblerExtension.h"
#include "SparcLinkage.h"
#include "SparcMapping.h"
#include "SparcMCTargetDesc.h"
#define CONCAT(a, b) CONCAT_(a, b)
#define CONCAT_(a, b) a##_##b
#define DEBUG_TYPE "sparc-disassembler"
static const unsigned IntRegDecoderTable[] = {
Sparc_G0, Sparc_G1, Sparc_G2, Sparc_G3, Sparc_G4, Sparc_G5, Sparc_G6, Sparc_G7,
Sparc_O0, Sparc_O1, Sparc_O2, Sparc_O3, Sparc_O4, Sparc_O5, Sparc_O6, Sparc_O7,
Sparc_L0, Sparc_L1, Sparc_L2, Sparc_L3, Sparc_L4, Sparc_L5, Sparc_L6, Sparc_L7,
Sparc_I0, Sparc_I1, Sparc_I2, Sparc_I3, Sparc_I4, Sparc_I5, Sparc_I6, Sparc_I7
};
static const unsigned FPRegDecoderTable[] = {
Sparc_F0, Sparc_F1, Sparc_F2, Sparc_F3, Sparc_F4, Sparc_F5, Sparc_F6, Sparc_F7,
Sparc_F8, Sparc_F9, Sparc_F10, Sparc_F11, Sparc_F12, Sparc_F13, Sparc_F14, Sparc_F15,
Sparc_F16, Sparc_F17, Sparc_F18, Sparc_F19, Sparc_F20, Sparc_F21, Sparc_F22, Sparc_F23,
Sparc_F24, Sparc_F25, Sparc_F26, Sparc_F27, Sparc_F28, Sparc_F29, Sparc_F30, Sparc_F31
};
static const unsigned DFPRegDecoderTable[] = {
Sparc_D0, Sparc_D16, Sparc_D1, Sparc_D17, Sparc_D2, Sparc_D18, Sparc_D3, Sparc_D19,
Sparc_D4, Sparc_D20, Sparc_D5, Sparc_D21, Sparc_D6, Sparc_D22, Sparc_D7, Sparc_D23,
Sparc_D8, Sparc_D24, Sparc_D9, Sparc_D25, Sparc_D10, Sparc_D26, Sparc_D11, Sparc_D27,
Sparc_D12, Sparc_D28, Sparc_D13, Sparc_D29, Sparc_D14, Sparc_D30, Sparc_D15, Sparc_D31
};
static const unsigned QFPRegDecoderTable[] = {
Sparc_Q0, Sparc_Q8, ~0U, ~0U, Sparc_Q1, Sparc_Q9, ~0U, ~0U,
Sparc_Q2, Sparc_Q10, ~0U, ~0U, Sparc_Q3, Sparc_Q11, ~0U, ~0U,
Sparc_Q4, Sparc_Q12, ~0U, ~0U, Sparc_Q5, Sparc_Q13, ~0U, ~0U,
Sparc_Q6, Sparc_Q14, ~0U, ~0U, Sparc_Q7, Sparc_Q15, ~0U, ~0U
};
static const unsigned FCCRegDecoderTable[] = { Sparc_FCC0, Sparc_FCC1, Sparc_FCC2,
Sparc_FCC3 };
static const unsigned ASRRegDecoderTable[] = {
Sparc_Y, Sparc_ASR1, Sparc_ASR2, Sparc_ASR3, Sparc_ASR4, Sparc_ASR5, Sparc_ASR6,
Sparc_ASR7, Sparc_ASR8, Sparc_ASR9, Sparc_ASR10, Sparc_ASR11, Sparc_ASR12, Sparc_ASR13,
Sparc_ASR14, Sparc_ASR15, Sparc_ASR16, Sparc_ASR17, Sparc_ASR18, Sparc_ASR19, Sparc_ASR20,
Sparc_ASR21, Sparc_ASR22, Sparc_ASR23, Sparc_ASR24, Sparc_ASR25, Sparc_ASR26, Sparc_ASR27,
Sparc_ASR28, Sparc_ASR29, Sparc_ASR30, Sparc_ASR31
};
static const unsigned PRRegDecoderTable[] = {
Sparc_TPC, Sparc_TNPC, Sparc_TSTATE, Sparc_TT, Sparc_TICK,
Sparc_TBA, Sparc_PSTATE, Sparc_TL, Sparc_PIL, Sparc_CWP,
Sparc_CANSAVE, Sparc_CANRESTORE, Sparc_CLEANWIN, Sparc_OTHERWIN, Sparc_WSTATE
};
static const uint16_t IntPairDecoderTable[] = {
Sparc_G0_G1, Sparc_G2_G3, Sparc_G4_G5, Sparc_G6_G7, Sparc_O0_O1, Sparc_O2_O3,
Sparc_O4_O5, Sparc_O6_O7, Sparc_L0_L1, Sparc_L2_L3, Sparc_L4_L5, Sparc_L6_L7,
Sparc_I0_I1, Sparc_I2_I3, Sparc_I4_I5, Sparc_I6_I7,
};
static const unsigned CPRegDecoderTable[] = {
Sparc_C0, Sparc_C1, Sparc_C2, Sparc_C3, Sparc_C4, Sparc_C5, Sparc_C6, Sparc_C7,
Sparc_C8, Sparc_C9, Sparc_C10, Sparc_C11, Sparc_C12, Sparc_C13, Sparc_C14, Sparc_C15,
Sparc_C16, Sparc_C17, Sparc_C18, Sparc_C19, Sparc_C20, Sparc_C21, Sparc_C22, Sparc_C23,
Sparc_C24, Sparc_C25, Sparc_C26, Sparc_C27, Sparc_C28, Sparc_C29, Sparc_C30, Sparc_C31
};
static const uint16_t CPPairDecoderTable[] = {
Sparc_C0_C1, Sparc_C2_C3, Sparc_C4_C5, Sparc_C6_C7, Sparc_C8_C9, Sparc_C10_C11,
Sparc_C12_C13, Sparc_C14_C15, Sparc_C16_C17, Sparc_C18_C19, Sparc_C20_C21, Sparc_C22_C23,
Sparc_C24_C25, Sparc_C26_C27, Sparc_C28_C29, Sparc_C30_C31
};
static DecodeStatus DecodeDisp19(MCInst *Inst, uint32_t ImmVal,
uint64_t Address,
const void *Decoder)
{
int64_t BranchTarget = Address + (SignExtend64(ImmVal, 19) * 4);
MCOperand_CreateImm0(Inst, BranchTarget);
return MCDisassembler_Success;
}
static DecodeStatus DecodeDisp16(MCInst *Inst, uint32_t ImmVal,
uint64_t Address,
const void *Decoder)
{
int64_t BranchTarget = Address + (SignExtend64(ImmVal, 16) * 4);
MCOperand_CreateImm0(Inst, BranchTarget);
return MCDisassembler_Success;
}
static DecodeStatus DecodeDisp22(MCInst *Inst, uint32_t ImmVal,
uint64_t Address,
const void *Decoder)
{
int64_t BranchTarget = Address + (SignExtend64(ImmVal, 22) * 4);
MCOperand_CreateImm0(Inst, BranchTarget);
return MCDisassembler_Success;
}
static DecodeStatus DecodeIntRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
unsigned Reg = IntRegDecoderTable[RegNo];
MCOperand_CreateReg0(Inst, (Reg));
return MCDisassembler_Success;
}
static DecodeStatus DecodeI64RegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
return DecodeIntRegsRegisterClass(Inst, RegNo, Address, Decoder);
}
// This is used for the type "ptr_rc", which is either IntRegs or I64Regs
// depending on SparcRegisterInfo::getPointerRegClass.
static DecodeStatus DecodePointerLikeRegClass0(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
return DecodeIntRegsRegisterClass(Inst, RegNo, Address, Decoder);
}
static DecodeStatus DecodeFPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
unsigned Reg = FPRegDecoderTable[RegNo];
MCOperand_CreateReg0(Inst, (Reg));
return MCDisassembler_Success;
}
static DecodeStatus DecodeDFPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
unsigned Reg = DFPRegDecoderTable[RegNo];
MCOperand_CreateReg0(Inst, (Reg));
return MCDisassembler_Success;
}
static DecodeStatus DecodeQFPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
unsigned Reg = QFPRegDecoderTable[RegNo];
if (Reg == ~0U)
return MCDisassembler_Fail;
MCOperand_CreateReg0(Inst, (Reg));
return MCDisassembler_Success;
}
static DecodeStatus DecodeCoprocRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
unsigned Reg = CPRegDecoderTable[RegNo];
MCOperand_CreateReg0(Inst, (Reg));
return MCDisassembler_Success;
}
static DecodeStatus DecodeFCCRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 3)
return MCDisassembler_Fail;
MCOperand_CreateReg0(Inst, (FCCRegDecoderTable[RegNo]));
return MCDisassembler_Success;
}
static DecodeStatus DecodeASRRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
MCOperand_CreateReg0(Inst, (ASRRegDecoderTable[RegNo]));
return MCDisassembler_Success;
}
static DecodeStatus DecodePRRegsRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo >= ARR_SIZE(PRRegDecoderTable))
return MCDisassembler_Fail;
MCOperand_CreateReg0(Inst, (PRRegDecoderTable[RegNo]));
return MCDisassembler_Success;
}
static DecodeStatus DecodeIntPairRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
DecodeStatus S = MCDisassembler_Success;
if (RegNo > 31)
return MCDisassembler_Fail;
if ((RegNo & 1))
S = MCDisassembler_SoftFail;
unsigned RegisterPair = IntPairDecoderTable[RegNo / 2];
MCOperand_CreateReg0(Inst, (RegisterPair));
return S;
}
static DecodeStatus DecodeCoprocPairRegisterClass(MCInst *Inst, unsigned RegNo,
uint64_t Address,
const void *Decoder)
{
if (RegNo > 31)
return MCDisassembler_Fail;
unsigned RegisterPair = CPPairDecoderTable[RegNo / 2];
MCOperand_CreateReg0(Inst, (RegisterPair));
return MCDisassembler_Success;
}
static DecodeStatus DecodeCall(MCInst *Inst, unsigned insn, uint64_t Address,
const void *Decoder);
static DecodeStatus DecodeSIMM13(MCInst *Inst, unsigned insn, uint64_t Address,
const void *Decoder);
#include "SparcGenDisassemblerTables.inc"
static DecodeStatus getInstruction(MCInst *Instr, uint64_t *Size, const uint8_t *Bytes,
size_t BytesLen, uint64_t Address, SStream *CStream)
{
if (BytesLen < 4) {
return MCDisassembler_Fail;
}
uint32_t Insn = readBytes32(Instr, Bytes);
DecodeStatus Result = MCDisassembler_Fail;
// Calling the auto-generated decoder function.
if (Sparc_getFeatureBits(Instr->csh->mode, Sparc_FeatureV9)) {
Result = decodeInstruction_4(DecoderTableSparcV932, Instr, Insn,
Address, NULL);
} else {
Result = decodeInstruction_4(DecoderTableSparcV832, Instr, Insn,
Address, NULL);
}
if (Result != MCDisassembler_Fail) {
*Size = 4;
return Result;
}
Result = decodeInstruction_4(DecoderTableSparc32, Instr, Insn, Address,
NULL);
if (Result != MCDisassembler_Fail) {
*Size = 4;
return Result;
}
return MCDisassembler_Fail;
}
static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
uint64_t Address, uint64_t Offset,
uint64_t Width, MCInst *MI,
const void *Decoder)
{
// Capstone doesn't support symbols.
return false;
}
static DecodeStatus DecodeCall(MCInst *MI, unsigned insn, uint64_t Address,
const void *Decoder)
{
unsigned Offset = fieldFromInstruction_4(insn, 0, 30);
int64_t CallTarget = Address + (SignExtend64(Offset, 30) * 4);
if (!tryAddingSymbolicOperand(CallTarget, false, Address, 0, 30, MI,
Decoder))
MCOperand_CreateImm0(MI, CallTarget);
return MCDisassembler_Success;
}
static DecodeStatus DecodeSIMM13(MCInst *MI, unsigned insn, uint64_t Address,
const void *Decoder)
{
CS_ASSERT(isUIntN(13, insn));
MCOperand_CreateImm0(MI, (SignExtend64((insn), 13)));
return MCDisassembler_Success;
}
DecodeStatus Sparc_LLVM_getInstruction(csh handle, const uint8_t *Bytes,
size_t ByteLen, MCInst *MI, uint16_t *Size,
uint64_t Address, void *Info) {
uint64_t s = 0;
DecodeStatus status = getInstruction(MI, &s, Bytes, ByteLen, Address, NULL);
*Size = (uint16_t) s;
return status;
}
@@ -0,0 +1,13 @@
/* Capstone Disassembly Engine */
/* By Rot127 <unisono@quyllur.org>, 2025 */
#include "SparcDisassemblerExtension.h"
#include "SparcMCTargetDesc.h"
bool Sparc_getFeatureBits(unsigned int mode, unsigned int feature)
{
if (feature == Sparc_FeatureV9) {
return mode & CS_MODE_V9;
}
return true;
}
@@ -0,0 +1,11 @@
/* Capstone Disassembly Engine */
/* By Rot127 <unisono@quyllur.org>, 2025 */
#ifndef CS_SPARC_DISASSEMBLER_EXTENSION_H
#define CS_SPARC_DISASSEMBLER_EXTENSION_H
#include <capstone/capstone.h>
bool Sparc_getFeatureBits(unsigned int mode, unsigned int feature);
#endif // CS_SPARC_DISASSEMBLER_EXTENSION_H
File diff suppressed because it is too large Load Diff
+394
View File
@@ -0,0 +1,394 @@
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2024 */
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Do not edit. */
/* Capstone's LLVM TableGen Backends: */
/* https://github.com/capstone-engine/llvm-capstone */
{ SPARC_INS_ALIAS_MOVA, "mova" },
{ SPARC_INS_ALIAS_FMOVSA, "fmovsa" },
{ SPARC_INS_ALIAS_FMOVDA, "fmovda" },
{ SPARC_INS_ALIAS_MOVRZ, "movrz" },
{ SPARC_INS_ALIAS_FMOVRSZ, "fmovrsz" },
{ SPARC_INS_ALIAS_FMOVRDZ, "fmovrdz" },
{ SPARC_INS_ALIAS_FMOVRQZ, "fmovrqz" },
{ SPARC_INS_ALIAS_BA, "ba" },
{ SPARC_INS_ALIAS_BA_A, "ba_a" },
{ SPARC_INS_ALIAS_BA_PT, "ba_pt" },
{ SPARC_INS_ALIAS_BA_A_PT, "ba_a_pt" },
{ SPARC_INS_ALIAS_BA_PN, "ba_pn" },
{ SPARC_INS_ALIAS_BA_A_PN, "ba_a_pn" },
{ SPARC_INS_ALIAS_FMOVQA, "fmovqa" },
{ SPARC_INS_ALIAS_TA, "ta" },
{ SPARC_INS_ALIAS_FBA, "fba" },
{ SPARC_INS_ALIAS_FBA_PT, "fba_pt" },
{ SPARC_INS_ALIAS_FBA_A, "fba_a" },
{ SPARC_INS_ALIAS_FBA_A_PT, "fba_a_pt" },
{ SPARC_INS_ALIAS_FBA_PN, "fba_pn" },
{ SPARC_INS_ALIAS_FBA_A_PN, "fba_a_pn" },
{ SPARC_INS_ALIAS_BRZ, "brz" },
{ SPARC_INS_ALIAS_BRZ_PT, "brz_pt" },
{ SPARC_INS_ALIAS_BRZ_PN, "brz_pn" },
{ SPARC_INS_ALIAS_BRZ_A, "brz_a" },
{ SPARC_INS_ALIAS_BRZ_A_PT, "brz_a_pt" },
{ SPARC_INS_ALIAS_BRZ_A_PN, "brz_a_pn" },
{ SPARC_INS_ALIAS_BN, "bn" },
{ SPARC_INS_ALIAS_BN_A, "bn_a" },
{ SPARC_INS_ALIAS_BN_PT, "bn_pt" },
{ SPARC_INS_ALIAS_BN_A_PT, "bn_a_pt" },
{ SPARC_INS_ALIAS_BN_PN, "bn_pn" },
{ SPARC_INS_ALIAS_BN_A_PN, "bn_a_pn" },
{ SPARC_INS_ALIAS_MOVN, "movn" },
{ SPARC_INS_ALIAS_FMOVSN, "fmovsn" },
{ SPARC_INS_ALIAS_FMOVDN, "fmovdn" },
{ SPARC_INS_ALIAS_FMOVQN, "fmovqn" },
{ SPARC_INS_ALIAS_TN, "tn" },
{ SPARC_INS_ALIAS_BNE, "bne" },
{ SPARC_INS_ALIAS_BNE_A, "bne_a" },
{ SPARC_INS_ALIAS_BNE_PT, "bne_pt" },
{ SPARC_INS_ALIAS_BNE_A_PT, "bne_a_pt" },
{ SPARC_INS_ALIAS_BNE_PN, "bne_pn" },
{ SPARC_INS_ALIAS_BNE_A_PN, "bne_a_pn" },
{ SPARC_INS_ALIAS_MOVNE, "movne" },
{ SPARC_INS_ALIAS_FMOVSNE, "fmovsne" },
{ SPARC_INS_ALIAS_FMOVDNE, "fmovdne" },
{ SPARC_INS_ALIAS_FMOVQNE, "fmovqne" },
{ SPARC_INS_ALIAS_TNE, "tne" },
{ SPARC_INS_ALIAS_BE, "be" },
{ SPARC_INS_ALIAS_BE_A, "be_a" },
{ SPARC_INS_ALIAS_BE_PT, "be_pt" },
{ SPARC_INS_ALIAS_BE_A_PT, "be_a_pt" },
{ SPARC_INS_ALIAS_BE_PN, "be_pn" },
{ SPARC_INS_ALIAS_BE_A_PN, "be_a_pn" },
{ SPARC_INS_ALIAS_MOVE, "move" },
{ SPARC_INS_ALIAS_FMOVSE, "fmovse" },
{ SPARC_INS_ALIAS_FMOVDE, "fmovde" },
{ SPARC_INS_ALIAS_FMOVQE, "fmovqe" },
{ SPARC_INS_ALIAS_TE, "te" },
{ SPARC_INS_ALIAS_BG, "bg" },
{ SPARC_INS_ALIAS_BG_A, "bg_a" },
{ SPARC_INS_ALIAS_BG_PT, "bg_pt" },
{ SPARC_INS_ALIAS_BG_A_PT, "bg_a_pt" },
{ SPARC_INS_ALIAS_BG_PN, "bg_pn" },
{ SPARC_INS_ALIAS_BG_A_PN, "bg_a_pn" },
{ SPARC_INS_ALIAS_MOVG, "movg" },
{ SPARC_INS_ALIAS_FMOVSG, "fmovsg" },
{ SPARC_INS_ALIAS_FMOVDG, "fmovdg" },
{ SPARC_INS_ALIAS_FMOVQG, "fmovqg" },
{ SPARC_INS_ALIAS_TG, "tg" },
{ SPARC_INS_ALIAS_BLE, "ble" },
{ SPARC_INS_ALIAS_BLE_A, "ble_a" },
{ SPARC_INS_ALIAS_BLE_PT, "ble_pt" },
{ SPARC_INS_ALIAS_BLE_A_PT, "ble_a_pt" },
{ SPARC_INS_ALIAS_BLE_PN, "ble_pn" },
{ SPARC_INS_ALIAS_BLE_A_PN, "ble_a_pn" },
{ SPARC_INS_ALIAS_MOVLE, "movle" },
{ SPARC_INS_ALIAS_FMOVSLE, "fmovsle" },
{ SPARC_INS_ALIAS_FMOVDLE, "fmovdle" },
{ SPARC_INS_ALIAS_FMOVQLE, "fmovqle" },
{ SPARC_INS_ALIAS_TLE, "tle" },
{ SPARC_INS_ALIAS_BGE, "bge" },
{ SPARC_INS_ALIAS_BGE_A, "bge_a" },
{ SPARC_INS_ALIAS_BGE_PT, "bge_pt" },
{ SPARC_INS_ALIAS_BGE_A_PT, "bge_a_pt" },
{ SPARC_INS_ALIAS_BGE_PN, "bge_pn" },
{ SPARC_INS_ALIAS_BGE_A_PN, "bge_a_pn" },
{ SPARC_INS_ALIAS_MOVGE, "movge" },
{ SPARC_INS_ALIAS_FMOVSGE, "fmovsge" },
{ SPARC_INS_ALIAS_FMOVDGE, "fmovdge" },
{ SPARC_INS_ALIAS_FMOVQGE, "fmovqge" },
{ SPARC_INS_ALIAS_TGE, "tge" },
{ SPARC_INS_ALIAS_BL, "bl" },
{ SPARC_INS_ALIAS_BL_A, "bl_a" },
{ SPARC_INS_ALIAS_BL_PT, "bl_pt" },
{ SPARC_INS_ALIAS_BL_A_PT, "bl_a_pt" },
{ SPARC_INS_ALIAS_BL_PN, "bl_pn" },
{ SPARC_INS_ALIAS_BL_A_PN, "bl_a_pn" },
{ SPARC_INS_ALIAS_MOVL, "movl" },
{ SPARC_INS_ALIAS_FMOVSL, "fmovsl" },
{ SPARC_INS_ALIAS_FMOVDL, "fmovdl" },
{ SPARC_INS_ALIAS_FMOVQL, "fmovql" },
{ SPARC_INS_ALIAS_TL, "tl" },
{ SPARC_INS_ALIAS_BGU, "bgu" },
{ SPARC_INS_ALIAS_BGU_A, "bgu_a" },
{ SPARC_INS_ALIAS_BGU_PT, "bgu_pt" },
{ SPARC_INS_ALIAS_BGU_A_PT, "bgu_a_pt" },
{ SPARC_INS_ALIAS_BGU_PN, "bgu_pn" },
{ SPARC_INS_ALIAS_BGU_A_PN, "bgu_a_pn" },
{ SPARC_INS_ALIAS_MOVGU, "movgu" },
{ SPARC_INS_ALIAS_FMOVSGU, "fmovsgu" },
{ SPARC_INS_ALIAS_FMOVDGU, "fmovdgu" },
{ SPARC_INS_ALIAS_FMOVQGU, "fmovqgu" },
{ SPARC_INS_ALIAS_TGU, "tgu" },
{ SPARC_INS_ALIAS_BLEU, "bleu" },
{ SPARC_INS_ALIAS_BLEU_A, "bleu_a" },
{ SPARC_INS_ALIAS_BLEU_PT, "bleu_pt" },
{ SPARC_INS_ALIAS_BLEU_A_PT, "bleu_a_pt" },
{ SPARC_INS_ALIAS_BLEU_PN, "bleu_pn" },
{ SPARC_INS_ALIAS_BLEU_A_PN, "bleu_a_pn" },
{ SPARC_INS_ALIAS_MOVLEU, "movleu" },
{ SPARC_INS_ALIAS_FMOVSLEU, "fmovsleu" },
{ SPARC_INS_ALIAS_FMOVDLEU, "fmovdleu" },
{ SPARC_INS_ALIAS_FMOVQLEU, "fmovqleu" },
{ SPARC_INS_ALIAS_TLEU, "tleu" },
{ SPARC_INS_ALIAS_BCC, "bcc" },
{ SPARC_INS_ALIAS_BCC_A, "bcc_a" },
{ SPARC_INS_ALIAS_BCC_PT, "bcc_pt" },
{ SPARC_INS_ALIAS_BCC_A_PT, "bcc_a_pt" },
{ SPARC_INS_ALIAS_BCC_PN, "bcc_pn" },
{ SPARC_INS_ALIAS_BCC_A_PN, "bcc_a_pn" },
{ SPARC_INS_ALIAS_MOVCC, "movcc" },
{ SPARC_INS_ALIAS_FMOVSCC, "fmovscc" },
{ SPARC_INS_ALIAS_FMOVDCC, "fmovdcc" },
{ SPARC_INS_ALIAS_FMOVQCC, "fmovqcc" },
{ SPARC_INS_ALIAS_TCC, "tcc" },
{ SPARC_INS_ALIAS_BCS, "bcs" },
{ SPARC_INS_ALIAS_BCS_A, "bcs_a" },
{ SPARC_INS_ALIAS_BCS_PT, "bcs_pt" },
{ SPARC_INS_ALIAS_BCS_A_PT, "bcs_a_pt" },
{ SPARC_INS_ALIAS_BCS_PN, "bcs_pn" },
{ SPARC_INS_ALIAS_BCS_A_PN, "bcs_a_pn" },
{ SPARC_INS_ALIAS_MOVCS, "movcs" },
{ SPARC_INS_ALIAS_FMOVSCS, "fmovscs" },
{ SPARC_INS_ALIAS_FMOVDCS, "fmovdcs" },
{ SPARC_INS_ALIAS_FMOVQCS, "fmovqcs" },
{ SPARC_INS_ALIAS_TCS, "tcs" },
{ SPARC_INS_ALIAS_BPOS, "bpos" },
{ SPARC_INS_ALIAS_BPOS_A, "bpos_a" },
{ SPARC_INS_ALIAS_BPOS_PT, "bpos_pt" },
{ SPARC_INS_ALIAS_BPOS_A_PT, "bpos_a_pt" },
{ SPARC_INS_ALIAS_BPOS_PN, "bpos_pn" },
{ SPARC_INS_ALIAS_BPOS_A_PN, "bpos_a_pn" },
{ SPARC_INS_ALIAS_MOVPOS, "movpos" },
{ SPARC_INS_ALIAS_FMOVSPOS, "fmovspos" },
{ SPARC_INS_ALIAS_FMOVDPOS, "fmovdpos" },
{ SPARC_INS_ALIAS_FMOVQPOS, "fmovqpos" },
{ SPARC_INS_ALIAS_TPOS, "tpos" },
{ SPARC_INS_ALIAS_BNEG, "bneg" },
{ SPARC_INS_ALIAS_BNEG_A, "bneg_a" },
{ SPARC_INS_ALIAS_BNEG_PT, "bneg_pt" },
{ SPARC_INS_ALIAS_BNEG_A_PT, "bneg_a_pt" },
{ SPARC_INS_ALIAS_BNEG_PN, "bneg_pn" },
{ SPARC_INS_ALIAS_BNEG_A_PN, "bneg_a_pn" },
{ SPARC_INS_ALIAS_MOVNEG, "movneg" },
{ SPARC_INS_ALIAS_FMOVSNEG, "fmovsneg" },
{ SPARC_INS_ALIAS_FMOVDNEG, "fmovdneg" },
{ SPARC_INS_ALIAS_FMOVQNEG, "fmovqneg" },
{ SPARC_INS_ALIAS_TNEG, "tneg" },
{ SPARC_INS_ALIAS_BVC, "bvc" },
{ SPARC_INS_ALIAS_BVC_A, "bvc_a" },
{ SPARC_INS_ALIAS_BVC_PT, "bvc_pt" },
{ SPARC_INS_ALIAS_BVC_A_PT, "bvc_a_pt" },
{ SPARC_INS_ALIAS_BVC_PN, "bvc_pn" },
{ SPARC_INS_ALIAS_BVC_A_PN, "bvc_a_pn" },
{ SPARC_INS_ALIAS_MOVVC, "movvc" },
{ SPARC_INS_ALIAS_FMOVSVC, "fmovsvc" },
{ SPARC_INS_ALIAS_FMOVDVC, "fmovdvc" },
{ SPARC_INS_ALIAS_FMOVQVC, "fmovqvc" },
{ SPARC_INS_ALIAS_TVC, "tvc" },
{ SPARC_INS_ALIAS_BVS, "bvs" },
{ SPARC_INS_ALIAS_BVS_A, "bvs_a" },
{ SPARC_INS_ALIAS_BVS_PT, "bvs_pt" },
{ SPARC_INS_ALIAS_BVS_A_PT, "bvs_a_pt" },
{ SPARC_INS_ALIAS_BVS_PN, "bvs_pn" },
{ SPARC_INS_ALIAS_BVS_A_PN, "bvs_a_pn" },
{ SPARC_INS_ALIAS_MOVVS, "movvs" },
{ SPARC_INS_ALIAS_FMOVSVS, "fmovsvs" },
{ SPARC_INS_ALIAS_FMOVDVS, "fmovdvs" },
{ SPARC_INS_ALIAS_FMOVQVS, "fmovqvs" },
{ SPARC_INS_ALIAS_TVS, "tvs" },
{ SPARC_INS_ALIAS_FBN, "fbn" },
{ SPARC_INS_ALIAS_FBN_PT, "fbn_pt" },
{ SPARC_INS_ALIAS_FBN_A, "fbn_a" },
{ SPARC_INS_ALIAS_FBN_A_PT, "fbn_a_pt" },
{ SPARC_INS_ALIAS_FBN_PN, "fbn_pn" },
{ SPARC_INS_ALIAS_FBN_A_PN, "fbn_a_pn" },
{ SPARC_INS_ALIAS_FBU, "fbu" },
{ SPARC_INS_ALIAS_FBU_PT, "fbu_pt" },
{ SPARC_INS_ALIAS_FBU_A, "fbu_a" },
{ SPARC_INS_ALIAS_FBU_A_PT, "fbu_a_pt" },
{ SPARC_INS_ALIAS_FBU_PN, "fbu_pn" },
{ SPARC_INS_ALIAS_FBU_A_PN, "fbu_a_pn" },
{ SPARC_INS_ALIAS_MOVU, "movu" },
{ SPARC_INS_ALIAS_FMOVSU, "fmovsu" },
{ SPARC_INS_ALIAS_FMOVDU, "fmovdu" },
{ SPARC_INS_ALIAS_FMOVQU, "fmovqu" },
{ SPARC_INS_ALIAS_FBG, "fbg" },
{ SPARC_INS_ALIAS_FBG_PT, "fbg_pt" },
{ SPARC_INS_ALIAS_FBG_A, "fbg_a" },
{ SPARC_INS_ALIAS_FBG_A_PT, "fbg_a_pt" },
{ SPARC_INS_ALIAS_FBG_PN, "fbg_pn" },
{ SPARC_INS_ALIAS_FBG_A_PN, "fbg_a_pn" },
{ SPARC_INS_ALIAS_FBUG, "fbug" },
{ SPARC_INS_ALIAS_FBUG_PT, "fbug_pt" },
{ SPARC_INS_ALIAS_FBUG_A, "fbug_a" },
{ SPARC_INS_ALIAS_FBUG_A_PT, "fbug_a_pt" },
{ SPARC_INS_ALIAS_FBUG_PN, "fbug_pn" },
{ SPARC_INS_ALIAS_FBUG_A_PN, "fbug_a_pn" },
{ SPARC_INS_ALIAS_MOVUG, "movug" },
{ SPARC_INS_ALIAS_FMOVSUG, "fmovsug" },
{ SPARC_INS_ALIAS_FMOVDUG, "fmovdug" },
{ SPARC_INS_ALIAS_FMOVQUG, "fmovqug" },
{ SPARC_INS_ALIAS_FBL, "fbl" },
{ SPARC_INS_ALIAS_FBL_PT, "fbl_pt" },
{ SPARC_INS_ALIAS_FBL_A, "fbl_a" },
{ SPARC_INS_ALIAS_FBL_A_PT, "fbl_a_pt" },
{ SPARC_INS_ALIAS_FBL_PN, "fbl_pn" },
{ SPARC_INS_ALIAS_FBL_A_PN, "fbl_a_pn" },
{ SPARC_INS_ALIAS_FBUL, "fbul" },
{ SPARC_INS_ALIAS_FBUL_PT, "fbul_pt" },
{ SPARC_INS_ALIAS_FBUL_A, "fbul_a" },
{ SPARC_INS_ALIAS_FBUL_A_PT, "fbul_a_pt" },
{ SPARC_INS_ALIAS_FBUL_PN, "fbul_pn" },
{ SPARC_INS_ALIAS_FBUL_A_PN, "fbul_a_pn" },
{ SPARC_INS_ALIAS_MOVUL, "movul" },
{ SPARC_INS_ALIAS_FMOVSUL, "fmovsul" },
{ SPARC_INS_ALIAS_FMOVDUL, "fmovdul" },
{ SPARC_INS_ALIAS_FMOVQUL, "fmovqul" },
{ SPARC_INS_ALIAS_FBLG, "fblg" },
{ SPARC_INS_ALIAS_FBLG_PT, "fblg_pt" },
{ SPARC_INS_ALIAS_FBLG_A, "fblg_a" },
{ SPARC_INS_ALIAS_FBLG_A_PT, "fblg_a_pt" },
{ SPARC_INS_ALIAS_FBLG_PN, "fblg_pn" },
{ SPARC_INS_ALIAS_FBLG_A_PN, "fblg_a_pn" },
{ SPARC_INS_ALIAS_MOVLG, "movlg" },
{ SPARC_INS_ALIAS_FMOVSLG, "fmovslg" },
{ SPARC_INS_ALIAS_FMOVDLG, "fmovdlg" },
{ SPARC_INS_ALIAS_FMOVQLG, "fmovqlg" },
{ SPARC_INS_ALIAS_FBNE, "fbne" },
{ SPARC_INS_ALIAS_FBNE_PT, "fbne_pt" },
{ SPARC_INS_ALIAS_FBNE_A, "fbne_a" },
{ SPARC_INS_ALIAS_FBNE_A_PT, "fbne_a_pt" },
{ SPARC_INS_ALIAS_FBNE_PN, "fbne_pn" },
{ SPARC_INS_ALIAS_FBNE_A_PN, "fbne_a_pn" },
{ SPARC_INS_ALIAS_FBE, "fbe" },
{ SPARC_INS_ALIAS_FBE_PT, "fbe_pt" },
{ SPARC_INS_ALIAS_FBE_A, "fbe_a" },
{ SPARC_INS_ALIAS_FBE_A_PT, "fbe_a_pt" },
{ SPARC_INS_ALIAS_FBE_PN, "fbe_pn" },
{ SPARC_INS_ALIAS_FBE_A_PN, "fbe_a_pn" },
{ SPARC_INS_ALIAS_FBUE, "fbue" },
{ SPARC_INS_ALIAS_FBUE_PT, "fbue_pt" },
{ SPARC_INS_ALIAS_FBUE_A, "fbue_a" },
{ SPARC_INS_ALIAS_FBUE_A_PT, "fbue_a_pt" },
{ SPARC_INS_ALIAS_FBUE_PN, "fbue_pn" },
{ SPARC_INS_ALIAS_FBUE_A_PN, "fbue_a_pn" },
{ SPARC_INS_ALIAS_MOVUE, "movue" },
{ SPARC_INS_ALIAS_FMOVSUE, "fmovsue" },
{ SPARC_INS_ALIAS_FMOVDUE, "fmovdue" },
{ SPARC_INS_ALIAS_FMOVQUE, "fmovque" },
{ SPARC_INS_ALIAS_FBGE, "fbge" },
{ SPARC_INS_ALIAS_FBGE_PT, "fbge_pt" },
{ SPARC_INS_ALIAS_FBGE_A, "fbge_a" },
{ SPARC_INS_ALIAS_FBGE_A_PT, "fbge_a_pt" },
{ SPARC_INS_ALIAS_FBGE_PN, "fbge_pn" },
{ SPARC_INS_ALIAS_FBGE_A_PN, "fbge_a_pn" },
{ SPARC_INS_ALIAS_FBUGE, "fbuge" },
{ SPARC_INS_ALIAS_FBUGE_PT, "fbuge_pt" },
{ SPARC_INS_ALIAS_FBUGE_A, "fbuge_a" },
{ SPARC_INS_ALIAS_FBUGE_A_PT, "fbuge_a_pt" },
{ SPARC_INS_ALIAS_FBUGE_PN, "fbuge_pn" },
{ SPARC_INS_ALIAS_FBUGE_A_PN, "fbuge_a_pn" },
{ SPARC_INS_ALIAS_MOVUGE, "movuge" },
{ SPARC_INS_ALIAS_FMOVSUGE, "fmovsuge" },
{ SPARC_INS_ALIAS_FMOVDUGE, "fmovduge" },
{ SPARC_INS_ALIAS_FMOVQUGE, "fmovquge" },
{ SPARC_INS_ALIAS_FBLE, "fble" },
{ SPARC_INS_ALIAS_FBLE_PT, "fble_pt" },
{ SPARC_INS_ALIAS_FBLE_A, "fble_a" },
{ SPARC_INS_ALIAS_FBLE_A_PT, "fble_a_pt" },
{ SPARC_INS_ALIAS_FBLE_PN, "fble_pn" },
{ SPARC_INS_ALIAS_FBLE_A_PN, "fble_a_pn" },
{ SPARC_INS_ALIAS_FBULE, "fbule" },
{ SPARC_INS_ALIAS_FBULE_PT, "fbule_pt" },
{ SPARC_INS_ALIAS_FBULE_A, "fbule_a" },
{ SPARC_INS_ALIAS_FBULE_A_PT, "fbule_a_pt" },
{ SPARC_INS_ALIAS_FBULE_PN, "fbule_pn" },
{ SPARC_INS_ALIAS_FBULE_A_PN, "fbule_a_pn" },
{ SPARC_INS_ALIAS_MOVULE, "movule" },
{ SPARC_INS_ALIAS_FMOVSULE, "fmovsule" },
{ SPARC_INS_ALIAS_FMOVDULE, "fmovdule" },
{ SPARC_INS_ALIAS_FMOVQULE, "fmovqule" },
{ SPARC_INS_ALIAS_FBO, "fbo" },
{ SPARC_INS_ALIAS_FBO_PT, "fbo_pt" },
{ SPARC_INS_ALIAS_FBO_A, "fbo_a" },
{ SPARC_INS_ALIAS_FBO_A_PT, "fbo_a_pt" },
{ SPARC_INS_ALIAS_FBO_PN, "fbo_pn" },
{ SPARC_INS_ALIAS_FBO_A_PN, "fbo_a_pn" },
{ SPARC_INS_ALIAS_MOVO, "movo" },
{ SPARC_INS_ALIAS_FMOVSO, "fmovso" },
{ SPARC_INS_ALIAS_FMOVDO, "fmovdo" },
{ SPARC_INS_ALIAS_FMOVQO, "fmovqo" },
{ SPARC_INS_ALIAS_BRLEZ, "brlez" },
{ SPARC_INS_ALIAS_BRLEZ_PT, "brlez_pt" },
{ SPARC_INS_ALIAS_BRLEZ_PN, "brlez_pn" },
{ SPARC_INS_ALIAS_BRLEZ_A, "brlez_a" },
{ SPARC_INS_ALIAS_BRLEZ_A_PT, "brlez_a_pt" },
{ SPARC_INS_ALIAS_BRLEZ_A_PN, "brlez_a_pn" },
{ SPARC_INS_ALIAS_MOVRLEZ, "movrlez" },
{ SPARC_INS_ALIAS_FMOVRSLEZ, "fmovrslez" },
{ SPARC_INS_ALIAS_FMOVRDLEZ, "fmovrdlez" },
{ SPARC_INS_ALIAS_FMOVRQLEZ, "fmovrqlez" },
{ SPARC_INS_ALIAS_BRLZ, "brlz" },
{ SPARC_INS_ALIAS_BRLZ_PT, "brlz_pt" },
{ SPARC_INS_ALIAS_BRLZ_PN, "brlz_pn" },
{ SPARC_INS_ALIAS_BRLZ_A, "brlz_a" },
{ SPARC_INS_ALIAS_BRLZ_A_PT, "brlz_a_pt" },
{ SPARC_INS_ALIAS_BRLZ_A_PN, "brlz_a_pn" },
{ SPARC_INS_ALIAS_MOVRLZ, "movrlz" },
{ SPARC_INS_ALIAS_FMOVRSLZ, "fmovrslz" },
{ SPARC_INS_ALIAS_FMOVRDLZ, "fmovrdlz" },
{ SPARC_INS_ALIAS_FMOVRQLZ, "fmovrqlz" },
{ SPARC_INS_ALIAS_BRNZ, "brnz" },
{ SPARC_INS_ALIAS_BRNZ_PT, "brnz_pt" },
{ SPARC_INS_ALIAS_BRNZ_PN, "brnz_pn" },
{ SPARC_INS_ALIAS_BRNZ_A, "brnz_a" },
{ SPARC_INS_ALIAS_BRNZ_A_PT, "brnz_a_pt" },
{ SPARC_INS_ALIAS_BRNZ_A_PN, "brnz_a_pn" },
{ SPARC_INS_ALIAS_MOVRNZ, "movrnz" },
{ SPARC_INS_ALIAS_FMOVRSNZ, "fmovrsnz" },
{ SPARC_INS_ALIAS_FMOVRDNZ, "fmovrdnz" },
{ SPARC_INS_ALIAS_FMOVRQNZ, "fmovrqnz" },
{ SPARC_INS_ALIAS_BRGZ, "brgz" },
{ SPARC_INS_ALIAS_BRGZ_PT, "brgz_pt" },
{ SPARC_INS_ALIAS_BRGZ_PN, "brgz_pn" },
{ SPARC_INS_ALIAS_BRGZ_A, "brgz_a" },
{ SPARC_INS_ALIAS_BRGZ_A_PT, "brgz_a_pt" },
{ SPARC_INS_ALIAS_BRGZ_A_PN, "brgz_a_pn" },
{ SPARC_INS_ALIAS_MOVRGZ, "movrgz" },
{ SPARC_INS_ALIAS_FMOVRSGZ, "fmovrsgz" },
{ SPARC_INS_ALIAS_FMOVRDGZ, "fmovrdgz" },
{ SPARC_INS_ALIAS_FMOVRQGZ, "fmovrqgz" },
{ SPARC_INS_ALIAS_BRGEZ, "brgez" },
{ SPARC_INS_ALIAS_BRGEZ_PT, "brgez_pt" },
{ SPARC_INS_ALIAS_BRGEZ_PN, "brgez_pn" },
{ SPARC_INS_ALIAS_BRGEZ_A, "brgez_a" },
{ SPARC_INS_ALIAS_BRGEZ_A_PT, "brgez_a_pt" },
{ SPARC_INS_ALIAS_BRGEZ_A_PN, "brgez_a_pn" },
{ SPARC_INS_ALIAS_MOVRGEZ, "movrgez" },
{ SPARC_INS_ALIAS_FMOVRSGEZ, "fmovrsgez" },
{ SPARC_INS_ALIAS_FMOVRDGEZ, "fmovrdgez" },
{ SPARC_INS_ALIAS_FMOVRQGEZ, "fmovrqgez" },
{ SPARC_INS_ALIAS_CMP, "cmp" },
{ SPARC_INS_ALIAS_TST, "tst" },
{ SPARC_INS_ALIAS_RET, "ret" },
{ SPARC_INS_ALIAS_RETL, "retl" },
{ SPARC_INS_ALIAS_RESTORE, "restore" },
{ SPARC_INS_ALIAS_SAVE, "save" },
{ SPARC_INS_ALIAS_CAS, "cas" },
{ SPARC_INS_ALIAS_CASL, "casl" },
{ SPARC_INS_ALIAS_CASX, "casx" },
{ SPARC_INS_ALIAS_CASXL, "casxl" },
{ SPARC_INS_ALIAS_MOV, "mov" },
{ SPARC_INS_ALIAS_FCMPS, "fcmps" },
{ SPARC_INS_ALIAS_FCMPD, "fcmpd" },
{ SPARC_INS_ALIAS_FCMPQ, "fcmpq" },
{ SPARC_INS_ALIAS_FCMPES, "fcmpes" },
{ SPARC_INS_ALIAS_FCMPED, "fcmped" },
{ SPARC_INS_ALIAS_FCMPEQ, "fcmpeq" },
+21
View File
@@ -0,0 +1,21 @@
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2024 */
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Do not edit. */
/* Capstone's LLVM TableGen Backends: */
/* https://github.com/capstone-engine/llvm-capstone */
{ SPARC_FEATURE_IS64BIT, "Is64Bit" },
{ SPARC_FEATURE_USESOFTMULDIV, "UseSoftMulDiv" },
{ SPARC_FEATURE_HASV9, "HasV9" },
{ SPARC_FEATURE_HASVIS, "HasVIS" },
{ SPARC_FEATURE_HASVIS2, "HasVIS2" },
{ SPARC_FEATURE_HASVIS3, "HasVIS3" },
{ SPARC_FEATURE_HASCASA, "HasCASA" },
{ SPARC_FEATURE_HASPWRPSR, "HasPWRPSR" },
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,298 @@
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2024 */
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Do not edit. */
/* Capstone's LLVM TableGen Backends: */
/* https://github.com/capstone-engine/llvm-capstone */
"invalid", // SPARC_INS_INVALID
"set", // SPARC_INS_SET
"setx", // SPARC_INS_SETX
"addcc", // SPARC_INS_ADDCC
"addx", // SPARC_INS_ADDX
"addxcc", // SPARC_INS_ADDXCC
"addxc", // SPARC_INS_ADDXC
"addxccc", // SPARC_INS_ADDXCCC
"add", // SPARC_INS_ADD
"alignaddr", // SPARC_INS_ALIGNADDR
"alignaddrl", // SPARC_INS_ALIGNADDRL
"andcc", // SPARC_INS_ANDCC
"andncc", // SPARC_INS_ANDNCC
"andn", // SPARC_INS_ANDN
"and", // SPARC_INS_AND
"array16", // SPARC_INS_ARRAY16
"array32", // SPARC_INS_ARRAY32
"array8", // SPARC_INS_ARRAY8
"b", // SPARC_INS_B
"bmask", // SPARC_INS_BMASK
"fb", // SPARC_INS_FB
"br", // SPARC_INS_BR
"bshuffle", // SPARC_INS_BSHUFFLE
"call", // SPARC_INS_CALL
"casa", // SPARC_INS_CASA
"casxa", // SPARC_INS_CASXA
"cb", // SPARC_INS_CB
"cmask16", // SPARC_INS_CMASK16
"cmask32", // SPARC_INS_CMASK32
"cmask8", // SPARC_INS_CMASK8
"done", // SPARC_INS_DONE
"edge16", // SPARC_INS_EDGE16
"edge16l", // SPARC_INS_EDGE16L
"edge16ln", // SPARC_INS_EDGE16LN
"edge16n", // SPARC_INS_EDGE16N
"edge32", // SPARC_INS_EDGE32
"edge32l", // SPARC_INS_EDGE32L
"edge32ln", // SPARC_INS_EDGE32LN
"edge32n", // SPARC_INS_EDGE32N
"edge8", // SPARC_INS_EDGE8
"edge8l", // SPARC_INS_EDGE8L
"edge8ln", // SPARC_INS_EDGE8LN
"edge8n", // SPARC_INS_EDGE8N
"fabsd", // SPARC_INS_FABSD
"fabsq", // SPARC_INS_FABSQ
"fabss", // SPARC_INS_FABSS
"faddd", // SPARC_INS_FADDD
"faddq", // SPARC_INS_FADDQ
"fadds", // SPARC_INS_FADDS
"faligndata", // SPARC_INS_FALIGNDATA
"fand", // SPARC_INS_FAND
"fandnot1", // SPARC_INS_FANDNOT1
"fandnot1s", // SPARC_INS_FANDNOT1S
"fandnot2", // SPARC_INS_FANDNOT2
"fandnot2s", // SPARC_INS_FANDNOT2S
"fands", // SPARC_INS_FANDS
"fchksm16", // SPARC_INS_FCHKSM16
"fcmpeq16", // SPARC_INS_FCMPEQ16
"fcmpeq32", // SPARC_INS_FCMPEQ32
"fcmpgt16", // SPARC_INS_FCMPGT16
"fcmpgt32", // SPARC_INS_FCMPGT32
"fcmple16", // SPARC_INS_FCMPLE16
"fcmple32", // SPARC_INS_FCMPLE32
"fcmpne16", // SPARC_INS_FCMPNE16
"fcmpne32", // SPARC_INS_FCMPNE32
"fdivd", // SPARC_INS_FDIVD
"fdivq", // SPARC_INS_FDIVQ
"fdivs", // SPARC_INS_FDIVS
"fdmulq", // SPARC_INS_FDMULQ
"fdtoi", // SPARC_INS_FDTOI
"fdtoq", // SPARC_INS_FDTOQ
"fdtos", // SPARC_INS_FDTOS
"fdtox", // SPARC_INS_FDTOX
"fexpand", // SPARC_INS_FEXPAND
"fhaddd", // SPARC_INS_FHADDD
"fhadds", // SPARC_INS_FHADDS
"fhsubd", // SPARC_INS_FHSUBD
"fhsubs", // SPARC_INS_FHSUBS
"fitod", // SPARC_INS_FITOD
"fitoq", // SPARC_INS_FITOQ
"fitos", // SPARC_INS_FITOS
"flcmpd", // SPARC_INS_FLCMPD
"flcmps", // SPARC_INS_FLCMPS
"flush", // SPARC_INS_FLUSH
"flushw", // SPARC_INS_FLUSHW
"fmean16", // SPARC_INS_FMEAN16
"fmovd", // SPARC_INS_FMOVD
"fmovq", // SPARC_INS_FMOVQ
"fmovrd", // SPARC_INS_FMOVRD
"fmovrq", // SPARC_INS_FMOVRQ
"fmovrs", // SPARC_INS_FMOVRS
"fmovs", // SPARC_INS_FMOVS
"fmul8sux16", // SPARC_INS_FMUL8SUX16
"fmul8ulx16", // SPARC_INS_FMUL8ULX16
"fmul8x16", // SPARC_INS_FMUL8X16
"fmul8x16al", // SPARC_INS_FMUL8X16AL
"fmul8x16au", // SPARC_INS_FMUL8X16AU
"fmuld", // SPARC_INS_FMULD
"fmuld8sux16", // SPARC_INS_FMULD8SUX16
"fmuld8ulx16", // SPARC_INS_FMULD8ULX16
"fmulq", // SPARC_INS_FMULQ
"fmuls", // SPARC_INS_FMULS
"fnaddd", // SPARC_INS_FNADDD
"fnadds", // SPARC_INS_FNADDS
"fnand", // SPARC_INS_FNAND
"fnands", // SPARC_INS_FNANDS
"fnegd", // SPARC_INS_FNEGD
"fnegq", // SPARC_INS_FNEGQ
"fnegs", // SPARC_INS_FNEGS
"fnhaddd", // SPARC_INS_FNHADDD
"fnhadds", // SPARC_INS_FNHADDS
"fnor", // SPARC_INS_FNOR
"fnors", // SPARC_INS_FNORS
"fnot1", // SPARC_INS_FNOT1
"fnot1s", // SPARC_INS_FNOT1S
"fnot2", // SPARC_INS_FNOT2
"fnot2s", // SPARC_INS_FNOT2S
"fone", // SPARC_INS_FONE
"fones", // SPARC_INS_FONES
"for", // SPARC_INS_FOR
"fornot1", // SPARC_INS_FORNOT1
"fornot1s", // SPARC_INS_FORNOT1S
"fornot2", // SPARC_INS_FORNOT2
"fornot2s", // SPARC_INS_FORNOT2S
"fors", // SPARC_INS_FORS
"fpack16", // SPARC_INS_FPACK16
"fpack32", // SPARC_INS_FPACK32
"fpackfix", // SPARC_INS_FPACKFIX
"fpadd16", // SPARC_INS_FPADD16
"fpadd16s", // SPARC_INS_FPADD16S
"fpadd32", // SPARC_INS_FPADD32
"fpadd32s", // SPARC_INS_FPADD32S
"fpadd64", // SPARC_INS_FPADD64
"fpmerge", // SPARC_INS_FPMERGE
"fpsub16", // SPARC_INS_FPSUB16
"fpsub16S", // SPARC_INS_FPSUB16S
"fpsub32", // SPARC_INS_FPSUB32
"fpsub32S", // SPARC_INS_FPSUB32S
"fqtod", // SPARC_INS_FQTOD
"fqtoi", // SPARC_INS_FQTOI
"fqtos", // SPARC_INS_FQTOS
"fqtox", // SPARC_INS_FQTOX
"fslas16", // SPARC_INS_FSLAS16
"fslas32", // SPARC_INS_FSLAS32
"fsll16", // SPARC_INS_FSLL16
"fsll32", // SPARC_INS_FSLL32
"fsmuld", // SPARC_INS_FSMULD
"fsqrtd", // SPARC_INS_FSQRTD
"fsqrtq", // SPARC_INS_FSQRTQ
"fsqrts", // SPARC_INS_FSQRTS
"fsra16", // SPARC_INS_FSRA16
"fsra32", // SPARC_INS_FSRA32
"fsrc1", // SPARC_INS_FSRC1
"fsrc1s", // SPARC_INS_FSRC1S
"fsrc2", // SPARC_INS_FSRC2
"fsrc2s", // SPARC_INS_FSRC2S
"fsrl16", // SPARC_INS_FSRL16
"fsrl32", // SPARC_INS_FSRL32
"fstod", // SPARC_INS_FSTOD
"fstoi", // SPARC_INS_FSTOI
"fstoq", // SPARC_INS_FSTOQ
"fstox", // SPARC_INS_FSTOX
"fsubd", // SPARC_INS_FSUBD
"fsubq", // SPARC_INS_FSUBQ
"fsubs", // SPARC_INS_FSUBS
"fxnor", // SPARC_INS_FXNOR
"fxnors", // SPARC_INS_FXNORS
"fxor", // SPARC_INS_FXOR
"fxors", // SPARC_INS_FXORS
"fxtod", // SPARC_INS_FXTOD
"fxtoq", // SPARC_INS_FXTOQ
"fxtos", // SPARC_INS_FXTOS
"fzero", // SPARC_INS_FZERO
"fzeros", // SPARC_INS_FZEROS
"ldx", // SPARC_INS_LDX
"ld", // SPARC_INS_LD
"jmpl", // SPARC_INS_JMPL
"lda", // SPARC_INS_LDA
"ldda", // SPARC_INS_LDDA
"ldd", // SPARC_INS_LDD
"ldqa", // SPARC_INS_LDQA
"ldq", // SPARC_INS_LDQ
"ldsba", // SPARC_INS_LDSBA
"ldsb", // SPARC_INS_LDSB
"ldsha", // SPARC_INS_LDSHA
"ldsh", // SPARC_INS_LDSH
"ldstuba", // SPARC_INS_LDSTUBA
"ldstub", // SPARC_INS_LDSTUB
"ldswa", // SPARC_INS_LDSWA
"ldsw", // SPARC_INS_LDSW
"lduba", // SPARC_INS_LDUBA
"ldub", // SPARC_INS_LDUB
"lduha", // SPARC_INS_LDUHA
"lduh", // SPARC_INS_LDUH
"ldxa", // SPARC_INS_LDXA
"lzcnt", // SPARC_INS_LZCNT
"membar", // SPARC_INS_MEMBAR
"movdtox", // SPARC_INS_MOVDTOX
"mov", // SPARC_INS_MOV
"movr", // SPARC_INS_MOVR
"movstosw", // SPARC_INS_MOVSTOSW
"movstouw", // SPARC_INS_MOVSTOUW
"mulscc", // SPARC_INS_MULSCC
"mulx", // SPARC_INS_MULX
"nop", // SPARC_INS_NOP
"orcc", // SPARC_INS_ORCC
"orncc", // SPARC_INS_ORNCC
"orn", // SPARC_INS_ORN
"or", // SPARC_INS_OR
"pdist", // SPARC_INS_PDIST
"pdistn", // SPARC_INS_PDISTN
"popc", // SPARC_INS_POPC
"prefetch", // SPARC_INS_PREFETCH
"pwr", // SPARC_INS_PWR
"rd", // SPARC_INS_RD
"rdpr", // SPARC_INS_RDPR
"restored", // SPARC_INS_RESTORED
"restore", // SPARC_INS_RESTORE
"retry", // SPARC_INS_RETRY
"rett", // SPARC_INS_RETT
"saved", // SPARC_INS_SAVED
"save", // SPARC_INS_SAVE
"sdivcc", // SPARC_INS_SDIVCC
"sdivx", // SPARC_INS_SDIVX
"sdiv", // SPARC_INS_SDIV
"sethi", // SPARC_INS_SETHI
"shutdown", // SPARC_INS_SHUTDOWN
"siam", // SPARC_INS_SIAM
"sir", // SPARC_INS_SIR
"sllx", // SPARC_INS_SLLX
"sll", // SPARC_INS_SLL
"smac", // SPARC_INS_SMAC
"smulcc", // SPARC_INS_SMULCC
"smul", // SPARC_INS_SMUL
"srax", // SPARC_INS_SRAX
"sra", // SPARC_INS_SRA
"srlx", // SPARC_INS_SRLX
"srl", // SPARC_INS_SRL
"sta", // SPARC_INS_STA
"stbar", // SPARC_INS_STBAR
"stba", // SPARC_INS_STBA
"stb", // SPARC_INS_STB
"st", // SPARC_INS_ST
"stda", // SPARC_INS_STDA
"std", // SPARC_INS_STD
"stha", // SPARC_INS_STHA
"sth", // SPARC_INS_STH
"stqa", // SPARC_INS_STQA
"stq", // SPARC_INS_STQ
"stxa", // SPARC_INS_STXA
"stx", // SPARC_INS_STX
"subcc", // SPARC_INS_SUBCC
"subx", // SPARC_INS_SUBX
"subxcc", // SPARC_INS_SUBXCC
"sub", // SPARC_INS_SUB
"swapa", // SPARC_INS_SWAPA
"swap", // SPARC_INS_SWAP
"ta", // SPARC_INS_TA
"taddcctv", // SPARC_INS_TADDCCTV
"taddcc", // SPARC_INS_TADDCC
"t", // SPARC_INS_T
"tsubcctv", // SPARC_INS_TSUBCCTV
"tsubcc", // SPARC_INS_TSUBCC
"udivcc", // SPARC_INS_UDIVCC
"udivx", // SPARC_INS_UDIVX
"udiv", // SPARC_INS_UDIV
"umac", // SPARC_INS_UMAC
"umulcc", // SPARC_INS_UMULCC
"umulxhi", // SPARC_INS_UMULXHI
"umul", // SPARC_INS_UMUL
"unimp", // SPARC_INS_UNIMP
"fcmpd", // SPARC_INS_FCMPD
"fcmped", // SPARC_INS_FCMPED
"fcmpeq", // SPARC_INS_FCMPEQ
"fcmpes", // SPARC_INS_FCMPES
"fcmpq", // SPARC_INS_FCMPQ
"fcmps", // SPARC_INS_FCMPS
"wr", // SPARC_INS_WR
"wrpr", // SPARC_INS_WRPR
"xmulx", // SPARC_INS_XMULX
"xmulxhi", // SPARC_INS_XMULXHI
"xnorcc", // SPARC_INS_XNORCC
"xnor", // SPARC_INS_XNOR
"xorcc", // SPARC_INS_XORCC
"xor", // SPARC_INS_XOR
File diff suppressed because it is too large Load Diff
+19
View File
@@ -0,0 +1,19 @@
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2024 */
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Do not edit. */
/* Capstone's LLVM TableGen Backends: */
/* https://github.com/capstone-engine/llvm-capstone */
Sparc_OP_GROUP_Operand = 0,
Sparc_OP_GROUP_GetPCX = 1,
Sparc_OP_GROUP_CCOperand = 2,
Sparc_OP_GROUP_MemOperand = 3,
Sparc_OP_GROUP_ASITag = 4,
Sparc_OP_GROUP_MembarTag = 5,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+70
View File
@@ -0,0 +1,70 @@
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2024 */
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Do not edit. */
/* Capstone's LLVM TableGen Backends: */
/* https://github.com/capstone-engine/llvm-capstone */
#ifdef GET_SUBTARGETINFO_ENUM
#undef GET_SUBTARGETINFO_ENUM
enum {
Sparc_DetectRoundChange = 0,
Sparc_FeatureHardQuad = 1,
Sparc_FeatureLeon = 2,
Sparc_FeatureNoFMULS = 3,
Sparc_FeatureNoFSMULD = 4,
Sparc_FeaturePWRPSR = 5,
Sparc_FeatureReserveG1 = 6,
Sparc_FeatureReserveG2 = 7,
Sparc_FeatureReserveG3 = 8,
Sparc_FeatureReserveG4 = 9,
Sparc_FeatureReserveG5 = 10,
Sparc_FeatureReserveG6 = 11,
Sparc_FeatureReserveG7 = 12,
Sparc_FeatureReserveI0 = 13,
Sparc_FeatureReserveI1 = 14,
Sparc_FeatureReserveI2 = 15,
Sparc_FeatureReserveI3 = 16,
Sparc_FeatureReserveI4 = 17,
Sparc_FeatureReserveI5 = 18,
Sparc_FeatureReserveL0 = 19,
Sparc_FeatureReserveL1 = 20,
Sparc_FeatureReserveL2 = 21,
Sparc_FeatureReserveL3 = 22,
Sparc_FeatureReserveL4 = 23,
Sparc_FeatureReserveL5 = 24,
Sparc_FeatureReserveL6 = 25,
Sparc_FeatureReserveL7 = 26,
Sparc_FeatureReserveO0 = 27,
Sparc_FeatureReserveO1 = 28,
Sparc_FeatureReserveO2 = 29,
Sparc_FeatureReserveO3 = 30,
Sparc_FeatureReserveO4 = 31,
Sparc_FeatureReserveO5 = 32,
Sparc_FeatureSoftFloat = 33,
Sparc_FeatureSoftMulDiv = 34,
Sparc_FeatureV8Deprecated = 35,
Sparc_FeatureV9 = 36,
Sparc_FeatureVIS = 37,
Sparc_FeatureVIS2 = 38,
Sparc_FeatureVIS3 = 39,
Sparc_FixAllFDIVSQRT = 40,
Sparc_InsertNOPLoad = 41,
Sparc_LeonCASA = 42,
Sparc_LeonCycleCounter = 43,
Sparc_TuneSlowRDPC = 44,
Sparc_UMACSMACSupport = 45,
Sparc_UsePopc = 46,
Sparc_NumSubtargetFeatures = 47
};
#endif // GET_SUBTARGETINFO_ENUM
+119
View File
@@ -0,0 +1,119 @@
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2024 */
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Do not edit. */
/* Capstone's LLVM TableGen Backends: */
/* https://github.com/capstone-engine/llvm-capstone */
#ifdef GET_ASITAG_DECL
#endif
#ifdef GET_ASITAG_DECL
const Sparc_ASITag_ASITag *Sparc_ASITag_lookupASITagByName(const char * Name);
const Sparc_ASITag_ASITag *Sparc_ASITag_lookupASITagByAltName(const char * AltName);
const Sparc_ASITag_ASITag *Sparc_ASITag_lookupASITagByEncoding(uint8_t Encoding);
#endif
#ifdef GET_ASITAG_IMPL
static const Sparc_ASITag_ASITag ASITagsList[] = {
{ "ASI_AIUP", { .raw_val = SPARC_ASITAG_ASI_AIUP }, "ASI_AS_IF_USER_PRIMARY", { .raw_val = SPARC_ASITAG_ASI_AS_IF_USER_PRIMARY }, 0x10 }, // 0
{ "ASI_AIUP_L", { .raw_val = SPARC_ASITAG_ASI_AIUP_L }, "ASI_AS_IF_USER_PRIMARY_LITTLE", { .raw_val = SPARC_ASITAG_ASI_AS_IF_USER_PRIMARY_LITTLE }, 0x18 }, // 1
{ "ASI_AIUS", { .raw_val = SPARC_ASITAG_ASI_AIUS }, "ASI_AS_IF_USER_SECONDARY", { .raw_val = SPARC_ASITAG_ASI_AS_IF_USER_SECONDARY }, 0x11 }, // 2
{ "ASI_AIUS_L", { .raw_val = SPARC_ASITAG_ASI_AIUS_L }, "ASI_AS_IF_USER_SECONDARY_LITTLE", { .raw_val = SPARC_ASITAG_ASI_AS_IF_USER_SECONDARY_LITTLE }, 0x19 }, // 3
{ "ASI_N", { .raw_val = SPARC_ASITAG_ASI_N }, "ASI_NUCLEUS", { .raw_val = SPARC_ASITAG_ASI_NUCLEUS }, 0x4 }, // 4
{ "ASI_N_L", { .raw_val = SPARC_ASITAG_ASI_N_L }, "ASI_NUCLEUS_LITTLE", { .raw_val = SPARC_ASITAG_ASI_NUCLEUS_LITTLE }, 0xC }, // 5
{ "ASI_P", { .raw_val = SPARC_ASITAG_ASI_P }, "ASI_PRIMARY", { .raw_val = SPARC_ASITAG_ASI_PRIMARY }, 0x80 }, // 6
{ "ASI_PNF", { .raw_val = SPARC_ASITAG_ASI_PNF }, "ASI_PRIMARY_NOFAULT", { .raw_val = SPARC_ASITAG_ASI_PRIMARY_NOFAULT }, 0x82 }, // 7
{ "ASI_PNF_L", { .raw_val = SPARC_ASITAG_ASI_PNF_L }, "ASI_PRIMARY_NOFAULT_LITTLE", { .raw_val = SPARC_ASITAG_ASI_PRIMARY_NOFAULT_LITTLE }, 0x8A }, // 8
{ "ASI_P_L", { .raw_val = SPARC_ASITAG_ASI_P_L }, "ASI_PRIMARY_LITTLE", { .raw_val = SPARC_ASITAG_ASI_PRIMARY_LITTLE }, 0x88 }, // 9
{ "ASI_S", { .raw_val = SPARC_ASITAG_ASI_S }, "ASI_SECONDARY", { .raw_val = SPARC_ASITAG_ASI_SECONDARY }, 0x81 }, // 10
{ "ASI_SNF", { .raw_val = SPARC_ASITAG_ASI_SNF }, "ASI_SECONDARY_NOFAULT", { .raw_val = SPARC_ASITAG_ASI_SECONDARY_NOFAULT }, 0x83 }, // 11
{ "ASI_SNF_L", { .raw_val = SPARC_ASITAG_ASI_SNF_L }, "ASI_SECONDARY_NOFAULT_LITTLE", { .raw_val = SPARC_ASITAG_ASI_SECONDARY_NOFAULT_LITTLE }, 0x8B }, // 12
{ "ASI_S_L", { .raw_val = SPARC_ASITAG_ASI_S_L }, "ASI_SECONDARY_LITTLE", { .raw_val = SPARC_ASITAG_ASI_SECONDARY_LITTLE }, 0x89 }, // 13
};
const Sparc_ASITag_ASITag *Sparc_ASITag_lookupASITagByName(const char * Name) {
static const struct IndexTypeStr Index[] = {
{ "ASI_AIUP", 0 },
{ "ASI_AIUP_L", 1 },
{ "ASI_AIUS", 2 },
{ "ASI_AIUS_L", 3 },
{ "ASI_N", 4 },
{ "ASI_N_L", 5 },
{ "ASI_P", 6 },
{ "ASI_PNF", 7 },
{ "ASI_PNF_L", 8 },
{ "ASI_P_L", 9 },
{ "ASI_S", 10 },
{ "ASI_SNF", 11 },
{ "ASI_SNF_L", 12 },
{ "ASI_S_L", 13 },
};
unsigned i = binsearch_IndexTypeStrEncoding(Index, ARR_SIZE(Index), Name);
if (i == -1)
return NULL;
else
return &ASITagsList[Index[i].index];
}
const Sparc_ASITag_ASITag *Sparc_ASITag_lookupASITagByAltName(const char * AltName) {
static const struct IndexTypeStr Index[] = {
{ "ASI_AS_IF_USER_PRIMARY", 0 },
{ "ASI_AS_IF_USER_PRIMARY_LITTLE", 1 },
{ "ASI_AS_IF_USER_SECONDARY", 2 },
{ "ASI_AS_IF_USER_SECONDARY_LITTLE", 3 },
{ "ASI_NUCLEUS", 4 },
{ "ASI_NUCLEUS_LITTLE", 5 },
{ "ASI_PRIMARY", 6 },
{ "ASI_PRIMARY_LITTLE", 9 },
{ "ASI_PRIMARY_NOFAULT", 7 },
{ "ASI_PRIMARY_NOFAULT_LITTLE", 8 },
{ "ASI_SECONDARY", 10 },
{ "ASI_SECONDARY_LITTLE", 13 },
{ "ASI_SECONDARY_NOFAULT", 11 },
{ "ASI_SECONDARY_NOFAULT_LITTLE", 12 },
};
unsigned i = binsearch_IndexTypeStrEncoding(Index, ARR_SIZE(Index), AltName);
if (i == -1)
return NULL;
else
return &ASITagsList[Index[i].index];
}
const Sparc_ASITag_ASITag *Sparc_ASITag_lookupASITagByEncoding(uint8_t Encoding) {
static const struct IndexType Index[] = {
{ 0x4, 4 },
{ 0xC, 5 },
{ 0x10, 0 },
{ 0x11, 2 },
{ 0x18, 1 },
{ 0x19, 3 },
{ 0x80, 6 },
{ 0x81, 10 },
{ 0x82, 7 },
{ 0x83, 11 },
{ 0x88, 9 },
{ 0x89, 13 },
{ 0x8A, 8 },
{ 0x8B, 12 },
};
unsigned i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), Encoding);
if (i == -1)
return NULL;
else
return &ASITagsList[Index[i].index];
}
#endif
#undef GET_ASITAG_DECL
#undef GET_ASITAG_IMPL
+340
View File
@@ -0,0 +1,340 @@
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2023 */
/* Automatically translated source file from LLVM. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Only small edits allowed. */
/* For multiple similar edits, please create a Patch for the translator. */
/* Capstone's C++ file translator: */
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
//===-- SparcInstPrinter.cpp - Convert Sparc MCInst to assembly syntax -----==//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This class prints an Sparc MCInst to a .s file.
//
//===----------------------------------------------------------------------===//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <capstone/platform.h>
#include "../../MCInstPrinter.h"
#include "../../Mapping.h"
#include "SparcInstPrinter.h"
#include "SparcLinkage.h"
#include "SparcMCTargetDesc.h"
#include "SparcMapping.h"
#include "SparcDisassemblerExtension.h"
#define CONCAT(a, b) CONCAT_(a, b)
#define CONCAT_(a, b) a##_##b
#define DEBUG_TYPE "asm-printer"
static void printCustomAliasOperand(
MCInst *MI, uint64_t Address, unsigned OpIdx,
unsigned PrintMethodIdx,
SStream *OS);
static void printOperand(MCInst *MI, int opNum, SStream *O);
#define GET_INSTRUCTION_NAME
#define PRINT_ALIAS_INSTR
#include "SparcGenAsmWriter.inc"
static void printRegName(SStream *OS, MCRegister Reg)
{
SStream_concat1(OS, '%');
SStream_concat0(OS, getRegisterName(Reg, Sparc_NoRegAltName));
}
static void printRegNameAlt(SStream *OS, MCRegister Reg, unsigned AltIdx)
{
SStream_concat1(OS, '%');
SStream_concat0(OS, getRegisterName(Reg, AltIdx));
}
static void printInst(MCInst *MI, uint64_t Address, SStream *O)
{
bool isAlias = false;
bool useAliasDetails = map_use_alias_details(MI);
map_set_fill_detail_ops(MI, useAliasDetails);
if (!printAliasInstr(MI, Address, O) &&
!printSparcAliasInstr(MI, O)) {
MCInst_setIsAlias(MI, false);
} else {
isAlias = true;
MCInst_setIsAlias(MI, isAlias);
if (useAliasDetails) {
return;
}
}
if (!isAlias || !useAliasDetails) {
map_set_fill_detail_ops(MI, !(isAlias && useAliasDetails));
if (isAlias)
SStream_Close(O);
printInstruction(MI, Address, O);
if (isAlias)
SStream_Open(O);
}
}
bool printSparcAliasInstr(MCInst *MI, SStream *O)
{
switch (MCInst_getOpcode(MI)) {
default:
return false;
case Sparc_JMPLrr:
case Sparc_JMPLri: {
if (MCInst_getNumOperands(MI) != 3)
return false;
if (!MCOperand_isReg(MCInst_getOperand(MI, (0))))
return false;
switch (MCOperand_getReg(MCInst_getOperand(MI, (0)))) {
default:
return false;
case Sparc_G0: // jmp $addr | ret | retl
if (MCOperand_isImm(MCInst_getOperand(MI, (2))) &&
MCOperand_getImm(MCInst_getOperand(MI, (2))) == 8) {
switch (MCOperand_getReg(
MCInst_getOperand(MI, (1)))) {
default:
break;
case Sparc_I7:
SStream_concat0(O, "\tret");
return true;
case Sparc_O7:
SStream_concat0(O, "\tretl");
return true;
}
}
SStream_concat0(O, "\tjmp ");
printMemOperand(MI, 1, O);
return true;
case Sparc_O7: // call $addr
SStream_concat0(O, "\tcall ");
printMemOperand(MI, 1, O);
return true;
}
}
case Sparc_V9FCMPS:
case Sparc_V9FCMPD:
case Sparc_V9FCMPQ:
case Sparc_V9FCMPES:
case Sparc_V9FCMPED:
case Sparc_V9FCMPEQ: {
if (Sparc_getFeatureBits(MI->csh->mode, Sparc_FeatureV9) || (MCInst_getNumOperands(MI) != 3) ||
(!MCOperand_isReg(MCInst_getOperand(MI, (0)))) ||
(MCOperand_getReg(MCInst_getOperand(MI, (0))) != Sparc_FCC0))
return false;
// if V8, skip printing %fcc0.
switch (MCInst_getOpcode(MI)) {
default:
case Sparc_V9FCMPS:
SStream_concat0(O, "\tfcmps ");
break;
case Sparc_V9FCMPD:
SStream_concat0(O, "\tfcmpd ");
break;
case Sparc_V9FCMPQ:
SStream_concat0(O, "\tfcmpq ");
break;
case Sparc_V9FCMPES:
SStream_concat0(O, "\tfcmpes ");
break;
case Sparc_V9FCMPED:
SStream_concat0(O, "\tfcmped ");
break;
case Sparc_V9FCMPEQ:
SStream_concat0(O, "\tfcmpeq ");
break;
}
printOperand(MI, 1, O);
SStream_concat0(O, ", ");
printOperand(MI, 2, O);
return true;
}
}
}
static void printOperand(MCInst *MI, int opNum, SStream *O)
{
Sparc_add_cs_detail_0(MI, Sparc_OP_GROUP_Operand, opNum);
MCOperand *MO = MCInst_getOperand(MI, (opNum));
if (MCOperand_isReg(MO)) {
unsigned Reg = MCOperand_getReg(MO);
if (Sparc_getFeatureBits(MI->csh->mode, Sparc_FeatureV9))
printRegNameAlt(O, Reg, Sparc_RegNamesStateReg);
else
printRegName(O, Reg);
return;
}
if (MCOperand_isImm(MO)) {
switch (MCInst_getOpcode(MI)) {
default:
printInt32(O, (int)MCOperand_getImm(MO));
return;
case Sparc_TICCri: // Fall through
case Sparc_TICCrr: // Fall through
case Sparc_TRAPri: // Fall through
case Sparc_TRAPrr: // Fall through
case Sparc_TXCCri: // Fall through
case Sparc_TXCCrr: // Fall through
// Only seven-bit values up to 127.
printInt8(O, ((int)MCOperand_getImm(MO) & 0x7f));
return;
}
}
CS_ASSERT(MCOperand_isExpr(MO) &&
"Unknown operand kind in printOperand");
}
void printMemOperand(MCInst *MI, int opNum, SStream *O)
{
Sparc_add_cs_detail_0(MI, Sparc_OP_GROUP_MemOperand, opNum);
MCOperand *Op1 = MCInst_getOperand(MI, (opNum));
MCOperand *Op2 = MCInst_getOperand(MI, (opNum + 1));
bool PrintedFirstOperand = false;
if (MCOperand_isReg(Op1) && MCOperand_getReg(Op1) != Sparc_G0) {
printOperand(MI, opNum, O);
PrintedFirstOperand = true;
}
// Skip the second operand iff it adds nothing (literal 0 or %g0) and we've
// already printed the first one
const bool SkipSecondOperand =
PrintedFirstOperand &&
((MCOperand_isReg(Op2) && MCOperand_getReg(Op2) == Sparc_G0) ||
(MCOperand_isImm(Op2) && MCOperand_getImm(Op2) == 0));
if (!SkipSecondOperand) {
if (PrintedFirstOperand)
SStream_concat0(O, "+");
printOperand(MI, opNum + 1, O);
}
}
void printCCOperand(MCInst *MI, int opNum, SStream *O)
{
Sparc_add_cs_detail_0(MI, Sparc_OP_GROUP_CCOperand, opNum);
int CC = (int)MCOperand_getImm(MCInst_getOperand(MI, (opNum)));
switch (MCInst_getOpcode(MI)) {
default:
break;
case Sparc_FBCOND:
case Sparc_FBCONDA:
case Sparc_FBCOND_V9:
case Sparc_FBCONDA_V9:
case Sparc_BPFCC:
case Sparc_BPFCCA:
case Sparc_BPFCCNT:
case Sparc_BPFCCANT:
case Sparc_MOVFCCrr:
case Sparc_V9MOVFCCrr:
case Sparc_MOVFCCri:
case Sparc_V9MOVFCCri:
case Sparc_FMOVS_FCC:
case Sparc_V9FMOVS_FCC:
case Sparc_FMOVD_FCC:
case Sparc_V9FMOVD_FCC:
case Sparc_FMOVQ_FCC:
case Sparc_V9FMOVQ_FCC:
// Make sure CC is a fp conditional flag.
CC = (CC < SPARC_CC_FCC_BEGIN) ? (CC + SPARC_CC_FCC_BEGIN) : CC;
break;
case Sparc_CBCOND:
case Sparc_CBCONDA:
// Make sure CC is a cp conditional flag.
CC = (CC < SPARC_CC_CPCC_BEGIN) ? (CC + SPARC_CC_CPCC_BEGIN) : CC;
break;
case Sparc_BPR:
case Sparc_BPRA:
case Sparc_BPRNT:
case Sparc_BPRANT:
case Sparc_MOVRri:
case Sparc_MOVRrr:
case Sparc_FMOVRS:
case Sparc_FMOVRD:
case Sparc_FMOVRQ:
// Make sure CC is a register conditional flag.
CC = (CC < SPARC_CC_REG_BEGIN) ? (CC + SPARC_CC_REG_BEGIN) : CC;
break;
}
SStream_concat0(O, SPARCCondCodeToString((sparc_cc)CC));
}
bool printGetPCX(MCInst *MI, unsigned opNum, SStream *O)
{
printf("FIXME: Implement SparcInstPrinter::printGetPCX.");
return true;
}
void printMembarTag(MCInst *MI, int opNum, SStream *O)
{
Sparc_add_cs_detail_0(MI, Sparc_OP_GROUP_MembarTag, opNum);
static const char *const TagNames[] = { "#LoadLoad", "#StoreLoad",
"#LoadStore", "#StoreStore",
"#Lookaside", "#MemIssue",
"#Sync" };
unsigned Imm = MCOperand_getImm(MCInst_getOperand(MI, (opNum)));
if (Imm > 127) {
printUInt32(O, Imm);
return;
}
bool First = true;
for (unsigned i = 0; i < sizeof(TagNames); i++) {
if (Imm & (1ull << i)) {
SStream_concat(O, "%s", (First ? "" : " | "));
SStream_concat0(O, TagNames[i]);
First = false;
}
}
}
#define GET_ASITAG_IMPL
#include "SparcGenSystemOperands.inc"
void printASITag(MCInst *MI, int opNum, SStream *O)
{
Sparc_add_cs_detail_0(MI, Sparc_OP_GROUP_ASITag, opNum);
unsigned Imm = MCOperand_getImm(MCInst_getOperand(MI, (opNum)));
const Sparc_ASITag_ASITag *ASITag = Sparc_ASITag_lookupASITagByEncoding(Imm);
if (Sparc_getFeatureBits(MI->csh->mode, Sparc_FeatureV9) && ASITag) {
SStream_concat1(O, '#');
SStream_concat0(O, ASITag->Name);
} else
printUInt32(O, Imm);
}
void Sparc_LLVM_printInst(MCInst *MI, uint64_t Address, const char *Annot,
SStream *O)
{
printInst(MI, Address, O);
}
const char *Sparc_LLVM_getRegisterName(unsigned RegNo, unsigned AltIdx)
{
return getRegisterName(RegNo, AltIdx);
}
+49
View File
@@ -0,0 +1,49 @@
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2023 */
/* Automatically translated source file from LLVM. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Only small edits allowed. */
/* For multiple similar edits, please create a Patch for the translator. */
/* Capstone's C++ file translator: */
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
//===-- SparcInstPrinter.h - Convert Sparc MCInst to assembly syntax ------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This class prints an Sparc MCInst to a .s file.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCINSTPRINTER_H
#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCINSTPRINTER_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <capstone/platform.h>
#include "SparcMCTargetDesc.h"
#define CONCAT(a, b) CONCAT_(a, b)
#define CONCAT_(a, b) a##_##b
bool printSparcAliasInstr(MCInst *MI, SStream *OS);
void printMemOperand(MCInst *MI, int opNum, SStream *OS);
void printCCOperand(MCInst *MI, int opNum, SStream *OS);
bool printGetPCX(MCInst *MI, unsigned OpNo, SStream *OS);
void printMembarTag(MCInst *MI, int opNum, SStream *O);
void printASITag(MCInst *MI, int opNum, SStream *O);
;
// end namespace llvm
#endif
+19
View File
@@ -0,0 +1,19 @@
#ifndef CS_SPARC_LINKAGE_H
#define CS_SPARC_LINKAGE_H
// Function definitions to call static LLVM functions.
#include "../../MCDisassembler.h"
#include "../../MCInst.h"
#include "../../SStream.h"
DecodeStatus Sparc_LLVM_getInstruction(csh handle, const uint8_t *Bytes,
size_t ByteLen, MCInst *MI, uint16_t *Size,
uint64_t Address, void *Info);
const char *Sparc_LLVM_getRegisterName(unsigned RegNo, unsigned AltIdx);
void Sparc_LLVM_printInstruction(MCInst *MI, SStream *O,
void * /* MCRegisterInfo* */ info);
void Sparc_LLVM_printInst(MCInst *MI, uint64_t Address, const char *Annot,
SStream *O);
#endif // CS_SPARC_LINKAGE_H
+83
View File
@@ -0,0 +1,83 @@
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
/* Rot127 <unisono@quyllur.org> 2022-2023 */
/* Automatically translated source file from LLVM. */
/* LLVM-commit: <commit> */
/* LLVM-tag: <tag> */
/* Only small edits allowed. */
/* For multiple similar edits, please create a Patch for the translator. */
/* Capstone's C++ file translator: */
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
//===-- SparcMCTargetDesc.h - Sparc Target Descriptions ---------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file provides Sparc specific target descriptions.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCTARGETDESC_H
#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCTARGETDESC_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <capstone/platform.h>
#include "../../LEB128.h"
#include "../../MathExtras.h"
#include "../../MCInst.h"
#include "../../MCInstrDesc.h"
#include "../../MCRegisterInfo.h"
#define CONCAT(a, b) CONCAT_(a, b)
#define CONCAT_(a, b) a##_##b
// Defines symbolic names for Sparc v9 ASI tag names.
// CS namespace begin: SparcASITag
typedef union sparc_sys_imm {
sparc_asi asi;
unsigned raw_val;
} sparc_sys_imm;
typedef struct {
const char *Name;
sparc_sys_imm imm;
const char *AltName;
sparc_sys_imm alt_imm;
unsigned Encoding;
} Sparc_ASITag_ASITag;
#define GET_ASITAG_DECL
#include "SparcGenSystemOperands.inc"
// CS namespace end: SparcASITag
// end namespace SparcASITag
// End llvm namespace
// Defines symbolic names for Sparc registers. This defines a mapping from
// register name to register number.
//
#define GET_REGINFO_ENUM
#define GET_REGINFO_MC_DESC
#include "SparcGenRegisterInfo.inc"
// Defines symbolic names for the Sparc instructions.
//
#define GET_INSTRINFO_ENUM
#define GET_INSTRINFO_MC_HELPER_DECLS
#include "SparcGenInstrInfo.inc"
#define GET_SUBTARGETINFO_ENUM
#include "SparcGenSubtargetInfo.inc"
#endif
+494
View File
@@ -0,0 +1,494 @@
/* Capstone Disassembly Engine */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
#ifdef CAPSTONE_HAS_SPARC
#include <stdio.h> // debug
#include <string.h>
#include "../../Mapping.h"
#include "../../utils.h"
#include "../../cs_simple_types.h"
#include "SparcMapping.h"
void Sparc_init_cs_detail(MCInst *MI)
{
if (!detail_is_set(MI)) {
return;
}
memset(get_detail(MI), 0, offsetof(cs_detail, sparc) + sizeof(cs_sparc));
Sparc_get_detail(MI)->cc = SPARC_CC_UNDEF;
Sparc_get_detail(MI)->cc_field = SPARC_CC_FIELD_NONE;
}
const insn_map sparc_insns[] = {
#include "SparcGenCSMappingInsn.inc"
};
void Sparc_set_instr_map_data(MCInst *MI)
{
map_cs_id(MI, sparc_insns, ARR_SIZE(sparc_insns));
map_implicit_reads(MI, sparc_insns);
map_implicit_writes(MI, sparc_insns);
map_groups(MI, sparc_insns);
const sparc_suppl_info *suppl_info =
map_get_suppl_info(MI, sparc_insns);
if (suppl_info) {
Sparc_get_detail(MI)->format = suppl_info->form;
}
}
/// Adds details which are not defined consistently as LLVM operands like
/// condition codes for alias instructions or branch hint bits.
static void Sparc_add_bit_details(MCInst *MI, const uint8_t *Bytes,
size_t BytesLen)
{
if (!Bytes || BytesLen < 4 || !detail_is_set(MI)) {
return;
}
uint32_t insn = readBytes32(MI, Bytes);
// CC field
cs_sparc *detail = Sparc_get_detail(MI);
switch (detail->format) {
default:
break;
case SPARC_INSN_FORM_F2_2: {
// This format is used either by B or FB instructions.
// The op2 == 6 for the FB and 2 for B.
// This is the only indicator we have here to determine which CC field is used
// if we don't want big switch cases.
//
// See: Opcode Maps - Table 39 - Sparc V9 ISA
size_t op2 = get_insn_field_r(insn, 22, 24);
detail->cc_field = op2 == 6 ? SPARC_CC_FIELD_FCC0 : SPARC_CC_FIELD_ICC;
break;
}
case SPARC_INSN_FORM_F2_3:
detail->cc_field = 0x4 | get_insn_field_r(insn, 20, 21);
break;
case SPARC_INSN_FORM_TRAPSP:
detail->cc_field = 0x4 | get_insn_field_r(insn, 11, 12);
break;
case SPARC_INSN_FORM_F4_1:
case SPARC_INSN_FORM_F4_2:
detail->cc_field = get_insn_field_r(insn, 11, 12);
detail->cc_field |= get_insn_field_r(insn, 18, 18) << 2;
break;
case SPARC_INSN_FORM_F4_3:
detail->cc_field = get_insn_field_r(insn, 11, 13);
break;
}
// Condition codes
switch (detail->format) {
default:
break;
case SPARC_INSN_FORM_F2_1:
case SPARC_INSN_FORM_F2_2:
case SPARC_INSN_FORM_F2_3:
case SPARC_INSN_FORM_TRAPSP: {
// cond
// Alias instructions don't define the conditions as operands.
// We need to add them here to the details again.
sparc_cc cc = get_insn_field_r(insn, 25, 28);
if (MCInst_getOpcode(MI) == Sparc_CBCOND ||
MCInst_getOpcode(MI) == Sparc_CBCONDA) {
cc += SPARC_CC_CPCC_BEGIN;
}
detail->cc = cc;
break;
}
case SPARC_INSN_FORM_F4_1:
case SPARC_INSN_FORM_F4_2:
case SPARC_INSN_FORM_F4_3: {
sparc_cc cc = get_insn_field_r(insn, 14, 17);
detail->cc = cc;
break;
}
case SPARC_INSN_FORM_F2_4: {
// cond
// Alias instructions don't define the conditions as operands.
// We need to add them here to the details again.
sparc_cc rcc = get_insn_field_r(insn, 25, 27);
detail->cc = rcc + SPARC_CC_REG_BEGIN;
break;
}
case SPARC_INSN_FORM_F4_4R:
case SPARC_INSN_FORM_F4_4I: {
sparc_cc rcc = get_insn_field_r(insn, 10, 12);
detail->cc = rcc + SPARC_CC_REG_BEGIN;
break;
}
}
switch (detail->cc_field) {
default:
case SPARC_CC_FIELD_ICC:
case SPARC_CC_FIELD_XCC:
break;
case SPARC_CC_FIELD_FCC0:
case SPARC_CC_FIELD_FCC1:
case SPARC_CC_FIELD_FCC2:
case SPARC_CC_FIELD_FCC3:
detail->cc += SPARC_CC_FCC_BEGIN;
break;
}
// Hints
switch (detail->format) {
default:
break;
case SPARC_INSN_FORM_F2_2:
detail->hint = get_insn_field_r(insn, 29, 29);
break;
case SPARC_INSN_FORM_F2_3:
case SPARC_INSN_FORM_F2_4:
detail->hint = get_insn_field_r(insn, 29, 29);
detail->hint |=
get_insn_field_r(insn, 19, 19) == 0 ? SPARC_HINT_PN :
SPARC_HINT_PT;
break;
}
}
bool Sparc_getInstruction(csh handle, const uint8_t *code, size_t code_len,
MCInst *instr, uint16_t *size, uint64_t address,
void *info)
{
Sparc_init_cs_detail(instr);
bool Result = Sparc_LLVM_getInstruction(handle, code, code_len, instr,
size, address,
info) != MCDisassembler_Fail;
Sparc_set_instr_map_data(instr);
Sparc_add_bit_details(instr, code, code_len);
return Result;
}
void Sparc_init_mri(MCRegisterInfo *MRI)
{
MCRegisterInfo_InitMCRegisterInfo(
MRI, SparcRegDesc, sizeof(SparcRegDesc), 0, 0,
SparcMCRegisterClasses, ARR_SIZE(SparcMCRegisterClasses), 0, 0,
SparcRegDiffLists, 0, SparcSubRegIdxLists,
ARR_SIZE(SparcSubRegIdxLists), 0);
}
const char *Sparc_reg_name(csh handle, unsigned int reg)
{
int syntax_opt = ((cs_struct *)(uintptr_t)handle)->syntax;
if (syntax_opt & CS_OPT_SYNTAX_NOREGNAME) {
return Sparc_LLVM_getRegisterName(reg, Sparc_NoRegAltName);
}
return Sparc_LLVM_getRegisterName(reg, Sparc_RegNamesStateReg);
}
void Sparc_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
{
// Not used by Sparc. Information is set after disassembly.
}
static const char *const insn_name_maps[] = {
#include "SparcGenCSMappingInsnName.inc"
};
#ifndef CAPSTONE_DIET
static const name_map insn_alias_mnem_map[] = {
#include "SparcGenCSAliasMnemMap.inc"
{ SPARC_INS_ALIAS_CALL, "call" },
{ SPARC_INS_ALIAS_END, NULL },
};
#endif
static void insert_op(MCInst *MI, unsigned index, cs_sparc_op op)
{
if (!detail_is_set(MI)) {
return;
}
Sparc_check_safe_inc(MI);
cs_sparc_op *ops = Sparc_get_detail(MI)->operands;
int i = Sparc_get_detail(MI)->op_count;
if (index == -1) {
ops[i] = op;
Sparc_inc_op_count(MI);
return;
}
for (; i > 0 && i > index; --i) {
ops[i] = ops[i - 1];
}
ops[index] = op;
Sparc_inc_op_count(MI);
}
/// Inserts a register to the detail operands at @index.
/// Already present operands are moved.
/// If @index is -1 the operand is appended.
static void Sparc_insert_detail_op_reg_at(MCInst *MI, unsigned index, sparc_reg Reg,
cs_ac_type access)
{
if (!detail_is_set(MI))
return;
cs_sparc_op op = { 0 };
op.type = SPARC_OP_REG;
op.reg = Reg;
op.access = access;
insert_op(MI, index, op);
}
static void Sparc_correct_details(MCInst *MI)
{
if (!detail_is_set(MI)) {
return;
}
switch (MCInst_getOpcode(MI)) {
default:
return;
case Sparc_LDSTUBri:
case Sparc_LDSTUBrr:
case Sparc_LDSTUBAri:
case Sparc_LDSTUBArr:
// The memory gets written back with ones
// but there is not write back memory operand defined
// (if even possible).
Sparc_get_detail(MI)->operands[0].access = CS_AC_READ_WRITE;
break;
case Sparc_RDPSR:
Sparc_insert_detail_op_reg_at(MI, 0, SPARC_REG_PSR, CS_AC_READ);
break;
case Sparc_PWRPSRri:
case Sparc_PWRPSRrr:
case Sparc_WRPSRri:
case Sparc_WRPSRrr:
Sparc_insert_detail_op_reg_at(MI, -1, SPARC_REG_PSR, CS_AC_WRITE);
break;
case Sparc_RDWIM:
Sparc_insert_detail_op_reg_at(MI, 0, SPARC_REG_WIM, CS_AC_READ);
break;
case Sparc_WRWIMri:
case Sparc_WRWIMrr:
Sparc_insert_detail_op_reg_at(MI, -1, SPARC_REG_WIM, CS_AC_WRITE);
break;
case Sparc_RDTBR:
Sparc_insert_detail_op_reg_at(MI, 0, SPARC_REG_TBR, CS_AC_READ);
break;
case Sparc_WRTBRri:
case Sparc_WRTBRrr:
Sparc_insert_detail_op_reg_at(MI, -1, SPARC_REG_TBR, CS_AC_WRITE);
break;
}
}
void Sparc_printer(MCInst *MI, SStream *O, void * /* MCRegisterInfo* */ info)
{
MCRegisterInfo *MRI = (MCRegisterInfo *)info;
MI->MRI = MRI;
MI->flat_insn->usesAliasDetails = map_use_alias_details(MI);
Sparc_LLVM_printInst(MI, MI->address, "", O);
#ifndef CAPSTONE_DIET
map_set_alias_id(MI, O, insn_alias_mnem_map,
ARR_SIZE(insn_alias_mnem_map));
Sparc_correct_details(MI);
#endif
}
const char *Sparc_insn_name(csh handle, unsigned int id)
{
#ifndef CAPSTONE_DIET
if (id < SPARC_INS_ALIAS_END && id > SPARC_INS_ALIAS_BEGIN) {
if (id - SPARC_INS_ALIAS_BEGIN >= ARR_SIZE(insn_alias_mnem_map))
return NULL;
return insn_alias_mnem_map[id - SPARC_INS_ALIAS_BEGIN - 1].name;
}
if (id >= SPARC_INS_ENDING)
return NULL;
if (id < ARR_SIZE(insn_name_maps))
return insn_name_maps[id];
// not found
return NULL;
#else
return NULL;
#endif
}
#ifndef CAPSTONE_DIET
static const name_map group_name_maps[] = {
{ SPARC_GRP_INVALID, NULL },
{ SPARC_GRP_JUMP, "jump" },
{ SPARC_GRP_CALL, "call" },
{ SPARC_GRP_RET, "return" },
{ SPARC_GRP_INT, "int" },
{ SPARC_GRP_IRET, "iret" },
{ SPARC_GRP_PRIVILEGE, "privilege" },
{ SPARC_GRP_BRANCH_RELATIVE, "branch_relative" },
// architecture-specific groups
#include "SparcGenCSFeatureName.inc"
};
#endif
const char *Sparc_group_name(csh handle, unsigned int id)
{
#ifndef CAPSTONE_DIET
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
#else
return NULL;
#endif
}
static const map_insn_ops insn_operands[] = {
#include "SparcGenCSMappingInsnOp.inc"
};
void Sparc_set_detail_op_imm(MCInst *MI, unsigned OpNum, sparc_op_type ImmType,
int64_t Imm)
{
if (!detail_is_set(MI))
return;
CS_ASSERT_RET((map_get_op_type(MI, OpNum) & ~CS_OP_MEM) == CS_OP_IMM);
CS_ASSERT_RET(ImmType == SPARC_OP_IMM);
Sparc_get_detail_op(MI, 0)->type = ImmType;
Sparc_get_detail_op(MI, 0)->imm = Imm;
Sparc_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
Sparc_inc_op_count(MI);
}
void Sparc_set_detail_op_reg(MCInst *MI, unsigned OpNum, sparc_reg Reg)
{
if (!detail_is_set(MI))
return;
CS_ASSERT_RET((map_get_op_type(MI, OpNum) & ~CS_OP_MEM) == CS_OP_REG);
switch (Reg) {
default:
Sparc_get_detail_op(MI, 0)->type = SPARC_OP_REG;
Sparc_get_detail_op(MI, 0)->reg = Reg;
Sparc_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
Sparc_inc_op_count(MI);
return;
// The LLVM definition is inconsistent with the cc fields.
// Sometimes they are encoded as register, sometimes not at all.
// For Capstone they are always saved in the cc_field field for now.
case SPARC_REG_ICC:
Sparc_get_detail(MI)->cc_field = SPARC_CC_FIELD_ICC;
break;
case SPARC_REG_FCC0:
Sparc_get_detail(MI)->cc_field = SPARC_CC_FIELD_FCC0;
break;
case SPARC_REG_FCC1:
Sparc_get_detail(MI)->cc_field = SPARC_CC_FIELD_FCC1;
break;
case SPARC_REG_FCC2:
Sparc_get_detail(MI)->cc_field = SPARC_CC_FIELD_FCC2;
break;
case SPARC_REG_FCC3:
Sparc_get_detail(MI)->cc_field = SPARC_CC_FIELD_FCC3;
break;
}
}
static inline bool is_single_reg_mem_case(MCInst *MI, unsigned OpNo)
{
if (map_get_op_type(MI, OpNo) != CS_OP_MEM_REG) {
return false;
}
if (MI->size == 1) {
return true;
} else if (MI->size > OpNo + 1 && Sparc_get_detail(MI)->operands[0].type != SPARC_OP_MEM) {
// Next operand is not a memory operand (disponent or index reg).
return !(map_get_op_type(MI, OpNo + 1) & SPARC_OP_MEM);
}
return false;
}
void Sparc_add_cs_detail_0(MCInst *MI, sparc_op_group op_group, unsigned OpNo)
{
if (!detail_is_set(MI) || !map_fill_detail_ops(MI))
return;
cs_op_type op_type = map_get_op_type(MI, OpNo);
switch (op_group) {
default:
case Sparc_OP_GROUP_GetPCX:
printf("Operand group %d not handled!\n", op_group);
return;
case Sparc_OP_GROUP_Operand:
if (op_type & CS_OP_MEM) {
if (is_single_reg_mem_case(MI, OpNo)) {
Sparc_get_detail_op(MI, 0)->type = SPARC_OP_MEM;
Sparc_get_detail_op(MI, 0)->mem.base =
MCInst_getOpVal(MI, OpNo);
Sparc_get_detail_op(MI, 0)->access =
map_get_op_access(MI, OpNo);
Sparc_inc_op_count(MI);
}
break;
}
if (op_type == CS_OP_IMM) {
Sparc_set_detail_op_imm(MI, OpNo, SPARC_OP_IMM,
MCInst_getOpVal(MI, OpNo));
} else if (op_type == CS_OP_REG) {
Sparc_set_detail_op_reg(MI, OpNo,
MCInst_getOpVal(MI, OpNo));
} else {
CS_ASSERT_RET(0 && "Op type not handled.");
}
Sparc_get_detail_op(MI, 0)->access =
map_get_op_access(MI, OpNo);
break;
case Sparc_OP_GROUP_CCOperand: {
// Handled in Sparc_add_bit_details().
break;
}
case Sparc_OP_GROUP_MemOperand: {
MCOperand *Op1 = MCInst_getOperand(MI, (OpNo));
MCOperand *Op2 = MCInst_getOperand(MI, (OpNo + 1));
if (!MCOperand_isReg(Op1) ||
MCOperand_getReg(Op1) == Sparc_G0) {
// Ignored
return;
}
Sparc_get_detail_op(MI, 0)->type = SPARC_OP_MEM;
Sparc_get_detail_op(MI, 0)->access =
map_get_op_access(MI, OpNo);
Sparc_get_detail_op(MI, 0)->mem.base = MCOperand_getReg(Op1);
if (MCOperand_isReg(Op2) && MCOperand_getReg(Op2) != Sparc_G0) {
Sparc_get_detail_op(MI, 0)->mem.index =
MCOperand_getReg(Op2);
} else if (MCOperand_isImm(Op2) && MCOperand_getImm(Op2) != 0) {
Sparc_get_detail_op(MI, 0)->mem.disp =
MCOperand_getImm(Op2);
}
Sparc_inc_op_count(MI);
break;
}
case Sparc_OP_GROUP_ASITag:
Sparc_get_detail_op(MI, 0)->type = SPARC_OP_ASI;
Sparc_get_detail_op(MI, 0)->access =
map_get_op_access(MI, OpNo);
Sparc_get_detail_op(MI, 0)->asi =
MCOperand_getImm(MCInst_getOperand(MI, OpNo));
Sparc_inc_op_count(MI);
break;
case Sparc_OP_GROUP_MembarTag:
Sparc_get_detail_op(MI, 0)->type = SPARC_OP_MEMBAR_TAG;
Sparc_get_detail_op(MI, 0)->access =
map_get_op_access(MI, OpNo);
Sparc_get_detail_op(MI, 0)->membar_tag =
MCOperand_getImm(MCInst_getOperand(MI, OpNo));
Sparc_inc_op_count(MI);
break;
}
}
#endif
+40
View File
@@ -0,0 +1,40 @@
/* Capstone Disassembly Engine */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
#ifndef CS_SPARC_MAP_H
#define CS_SPARC_MAP_H
#include "../../utils.h"
#include "SparcMCTargetDesc.h"
#include "SparcLinkage.h"
#include <capstone/capstone.h>
typedef enum {
#include "SparcGenCSOpGroup.inc"
} sparc_op_group;
void Sparc_add_cs_detail_0(MCInst *MI, sparc_op_group op_group, unsigned OpNo);
// return name of register in friendly string
const char *Sparc_reg_name(csh handle, unsigned int reg);
void Sparc_init_mri(MCRegisterInfo *MRI);
void Sparc_printer(MCInst *MI, SStream *O,
void * /* MCRegisterInfo* */ info);
bool Sparc_getInstruction(csh handle, const uint8_t *code, size_t code_len,
MCInst *instr, uint16_t *size, uint64_t address,
void *info);
// given internal insn id, return public instruction info
void Sparc_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id);
const char *Sparc_insn_name(csh handle, unsigned int id);
const char *Sparc_group_name(csh handle, unsigned int id);
void Sparc_set_detail_op_imm(MCInst *MI, unsigned OpNum,
sparc_op_type ImmType, int64_t Imm);
void Sparc_set_detail_op_reg(MCInst *MI, unsigned OpNum, sparc_reg Reg);
void Sparc_add_cs_detail_0(MCInst *MI, sparc_op_group op_group, unsigned OpNo);
void Sparc_set_instr_map_data(MCInst *MI);
#endif
+47
View File
@@ -0,0 +1,47 @@
/* Capstone Disassembly Engine */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
#ifdef CAPSTONE_HAS_SPARC
#include "../../utils.h"
#include "../../MCRegisterInfo.h"
#include "SparcMapping.h"
#include "SparcModule.h"
cs_err Sparc_global_init(cs_struct *ud)
{
MCRegisterInfo *mri;
mri = cs_mem_malloc(sizeof(*mri));
Sparc_init_mri(mri);
ud->printer = Sparc_printer;
ud->printer_info = mri;
ud->getinsn_info = mri;
ud->disasm = Sparc_getInstruction;
ud->post_printer = NULL;
ud->reg_name = Sparc_reg_name;
ud->insn_id = Sparc_get_insn_id;
ud->insn_name = Sparc_insn_name;
ud->group_name = Sparc_group_name;
return CS_ERR_OK;
}
cs_err Sparc_option(cs_struct *handle, cs_opt_type type, size_t value)
{
if (type == CS_OPT_SYNTAX)
handle->syntax = (int) value;
if (type == CS_OPT_MODE) {
handle->mode |= (cs_mode)value;
if (value & CS_MODE_V9 || value & CS_MODE_64) {
// V9 implies 64bit.
handle->mode |= (CS_MODE_64 | CS_MODE_V9);
}
}
return CS_ERR_OK;
}
#endif
+12
View File
@@ -0,0 +1,12 @@
/* Capstone Disassembly Engine */
/* By Travis Finkenauer <tmfinken@gmail.com>, 2018 */
#ifndef CS_SPARC_MODULE_H
#define CS_SPARC_MODULE_H
#include "../../utils.h"
cs_err Sparc_global_init(cs_struct *ud);
cs_err Sparc_option(cs_struct *handle, cs_opt_type type, size_t value);
#endif