mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-07-24 22:13:57 +00:00
Initial Commit
This commit is contained in:
532
thirdparty/capstone/arch/PowerPC/PPCDisassembler.c
vendored
Normal file
532
thirdparty/capstone/arch/PowerPC/PPCDisassembler.c
vendored
Normal file
@@ -0,0 +1,532 @@
|
||||
/* 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 */
|
||||
|
||||
//===------ PPCDisassembler.cpp - Disassembler for PowerPC ------*- 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <capstone/platform.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../../LEB128.h"
|
||||
#include "../../MCDisassembler.h"
|
||||
#include "../../MCFixedLenDisassembler.h"
|
||||
#include "../../MCInst.h"
|
||||
#include "../../MCInstPrinter.h"
|
||||
#include "../../MCInstrDesc.h"
|
||||
#include "../../MCRegisterInfo.h"
|
||||
#include "../../SStream.h"
|
||||
#include "../../utils.h"
|
||||
#include "PPCLinkage.h"
|
||||
#include "PPCMapping.h"
|
||||
#include "PPCMCTargetDesc.h"
|
||||
#include "PPCPredicates.h"
|
||||
|
||||
#define CONCAT(a, b) CONCAT_(a, b)
|
||||
#define CONCAT_(a, b) a##_##b
|
||||
|
||||
DEFINE_PPC_REGCLASSES
|
||||
|
||||
#define DEBUG_TYPE "ppc-disassembler"
|
||||
|
||||
DecodeStatus getInstruction(csh ud, const uint8_t *Bytes, size_t BytesLen,
|
||||
MCInst *MI, uint16_t *Size, uint64_t Address,
|
||||
void *Info);
|
||||
// end anonymous namespace
|
||||
|
||||
static DecodeStatus decodeCondBrTarget(MCInst *Inst, unsigned Imm,
|
||||
uint64_t Address, const void *Decoder)
|
||||
{
|
||||
MCOperand_CreateImm0(Inst, (SignExtend32((Imm), 14)));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeDirectBrTarget(MCInst *Inst, unsigned Imm,
|
||||
uint64_t Address, const void *Decoder)
|
||||
{
|
||||
int32_t Offset = SignExtend32((Imm), 24);
|
||||
MCOperand_CreateImm0(Inst, (Offset));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
// FIXME: These can be generated by TableGen from the existing register
|
||||
// encoding values!
|
||||
|
||||
static DecodeStatus decodeRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
const MCPhysReg *Regs)
|
||||
{
|
||||
MCOperand_CreateReg0(Inst, (Regs[RegNo]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeCRRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, CRRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeCRBITRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, CRBITRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeF4RCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, FRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeF8RCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, FRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVFRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, VFRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVRRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, VRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVSRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, VSRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVSFRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, VSFRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVSSRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, VSSRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeGPRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, RRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeGPRC_NOR0RegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, RRegsNoR0);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeG8RCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, XRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeG8pRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, XRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeG8RC_NOX0RegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, XRegsNoX0);
|
||||
}
|
||||
|
||||
#define DecodePointerLikeRegClass0 DecodeGPRCRegisterClass
|
||||
#define DecodePointerLikeRegClass1 DecodeGPRC_NOR0RegisterClass
|
||||
|
||||
static DecodeStatus DecodeSPERCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, SPERegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeACCRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, ACCRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeWACCRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, WACCRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeWACC_HIRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, WACC_HIRegs);
|
||||
}
|
||||
|
||||
// TODO: Make this function static when the register class is used by a new
|
||||
// instruction.
|
||||
DecodeStatus DecodeDMRROWRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address, const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, DMRROWRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeDMRROWpRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, DMRROWpRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeDMRRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, DMRRegs);
|
||||
}
|
||||
|
||||
// TODO: Make this function static when the register class is used by a new
|
||||
// instruction.
|
||||
DecodeStatus DecodeDMRpRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address, const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, DMRpRegs);
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeVSRpRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, VSRpRegs);
|
||||
}
|
||||
|
||||
#define DecodeQSRCRegisterClass DecodeQFRCRegisterClass
|
||||
#define DecodeQBRCRegisterClass DecodeQFRCRegisterClass
|
||||
|
||||
static DecodeStatus DecodeQFRCRegisterClass(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
return decodeRegisterClass(Inst, RegNo, QFRegs);
|
||||
}
|
||||
|
||||
#define DEFINE_decodeUImmOperand(N) \
|
||||
static DecodeStatus CONCAT(decodeUImmOperand, \
|
||||
N)(MCInst * Inst, uint64_t Imm, \
|
||||
int64_t Address, const void *Decoder) \
|
||||
{ \
|
||||
MCOperand_CreateImm0(Inst, (Imm)); \
|
||||
return MCDisassembler_Success; \
|
||||
}
|
||||
DEFINE_decodeUImmOperand(5) DEFINE_decodeUImmOperand(16)
|
||||
DEFINE_decodeUImmOperand(6) DEFINE_decodeUImmOperand(10)
|
||||
DEFINE_decodeUImmOperand(8) DEFINE_decodeUImmOperand(7)
|
||||
DEFINE_decodeUImmOperand(12)
|
||||
|
||||
#define DEFINE_decodeSImmOperand(N) \
|
||||
static DecodeStatus CONCAT(decodeSImmOperand, \
|
||||
N)(MCInst * Inst, uint64_t Imm, \
|
||||
int64_t Address, const void *Decoder) \
|
||||
{ \
|
||||
MCOperand_CreateImm0(Inst, (SignExtend64(Imm, N))); \
|
||||
return MCDisassembler_Success; \
|
||||
}
|
||||
DEFINE_decodeSImmOperand(16)
|
||||
DEFINE_decodeSImmOperand(5)
|
||||
DEFINE_decodeSImmOperand(34)
|
||||
|
||||
static DecodeStatus
|
||||
decodeImmZeroOperand(MCInst *Inst, uint64_t Imm, int64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
if (Imm != 0)
|
||||
return MCDisassembler_Fail;
|
||||
MCOperand_CreateImm0(Inst, (Imm));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeVSRpEvenOperands(MCInst *Inst, uint64_t RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
if (RegNo & 1)
|
||||
return MCDisassembler_Fail;
|
||||
MCOperand_CreateReg0(Inst, (VSRpRegs[RegNo >> 1]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeMemRIOperands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the memri field (imm, reg), which has the low 16-bits as the
|
||||
// displacement and the next 5 bits as the register #.
|
||||
|
||||
uint64_t Base = Imm >> 16;
|
||||
uint64_t Disp = Imm & 0xFFFF;
|
||||
|
||||
switch (MCInst_getOpcode(Inst)) {
|
||||
default:
|
||||
break;
|
||||
case PPC_LBZU:
|
||||
case PPC_LHAU:
|
||||
case PPC_LHZU:
|
||||
case PPC_LWZU:
|
||||
case PPC_LFSU:
|
||||
case PPC_LFDU:
|
||||
// Add the tied output operand.
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
break;
|
||||
case PPC_STBU:
|
||||
case PPC_STHU:
|
||||
case PPC_STWU:
|
||||
case PPC_STFSU:
|
||||
case PPC_STFDU:
|
||||
MCInst_insert0(Inst, 0,
|
||||
MCOperand_CreateReg1(Inst, RRegsNoR0[Base]));
|
||||
break;
|
||||
}
|
||||
|
||||
MCOperand_CreateImm0(Inst, (SignExtend64(Disp, 16)));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeMemRIXOperands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the memrix field (imm, reg), which has the low 14-bits as the
|
||||
// displacement and the next 5 bits as the register #.
|
||||
|
||||
uint64_t Base = Imm >> 14;
|
||||
uint64_t Disp = Imm & 0x3FFF;
|
||||
|
||||
if (MCInst_getOpcode(Inst) == PPC_LDU)
|
||||
// Add the tied output operand.
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
else if (MCInst_getOpcode(Inst) == PPC_STDU)
|
||||
MCInst_insert0(Inst, 0,
|
||||
MCOperand_CreateReg1(Inst, RRegsNoR0[Base]));
|
||||
|
||||
MCOperand_CreateImm0(Inst, (SignExtend64(Disp << 2, 16)));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeMemRIHashOperands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
// Decode the memrix field for a hash store or hash check operation.
|
||||
// The field is composed of a register and an immediate value that is 6 bits
|
||||
// and covers the range -8 to -512. The immediate is always negative and 2s
|
||||
// complement which is why we sign extend a 7 bit value.
|
||||
const uint64_t Base = Imm >> 6;
|
||||
const int64_t Disp = SignExtend64((Imm & 0x3F) + 64, 7) * 8;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (Disp));
|
||||
MCOperand_CreateReg0(Inst, (RRegs[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeMemRIX16Operands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the memrix16 field (imm, reg), which has the low 12-bits as the
|
||||
// displacement with 16-byte aligned, and the next 5 bits as the register #.
|
||||
|
||||
uint64_t Base = Imm >> 12;
|
||||
uint64_t Disp = Imm & 0xFFF;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (SignExtend64(Disp << 4, 16)));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeMemRI34PCRelOperands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address,
|
||||
const void *Decoder)
|
||||
{
|
||||
// Decode the memri34_pcrel field (imm, reg), which has the low 34-bits as
|
||||
// the displacement, and the next 5 bits as an immediate 0.
|
||||
uint64_t Base = Imm >> 34;
|
||||
uint64_t Disp = Imm & 0x3FFFFFFFFUL;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (SignExtend64(Disp, 34)));
|
||||
return decodeImmZeroOperand(Inst, Base, Address, Decoder);
|
||||
}
|
||||
|
||||
static DecodeStatus decodeMemRI34Operands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the memri34 field (imm, reg), which has the low 34-bits as the
|
||||
// displacement, and the next 5 bits as the register #.
|
||||
uint64_t Base = Imm >> 34;
|
||||
uint64_t Disp = Imm & 0x3FFFFFFFFUL;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (SignExtend64(Disp, 34)));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeSPE8Operands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the spe8disp field (imm, reg), which has the low 5-bits as the
|
||||
// displacement with 8-byte aligned, and the next 5 bits as the register #.
|
||||
|
||||
uint64_t Base = Imm >> 5;
|
||||
uint64_t Disp = Imm & 0x1F;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (Disp << 3));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeSPE4Operands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the spe4disp field (imm, reg), which has the low 5-bits as the
|
||||
// displacement with 4-byte aligned, and the next 5 bits as the register #.
|
||||
|
||||
uint64_t Base = Imm >> 5;
|
||||
uint64_t Disp = Imm & 0x1F;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (Disp << 2));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeSPE2Operands(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// Decode the spe2disp field (imm, reg), which has the low 5-bits as the
|
||||
// displacement with 2-byte aligned, and the next 5 bits as the register #.
|
||||
|
||||
uint64_t Base = Imm >> 5;
|
||||
uint64_t Disp = Imm & 0x1F;
|
||||
|
||||
MCOperand_CreateImm0(Inst, (Disp << 1));
|
||||
MCOperand_CreateReg0(Inst, (RRegsNoR0[Base]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
static DecodeStatus decodeCRBitMOperand(MCInst *Inst, uint64_t Imm,
|
||||
int64_t Address, const void *Decoder)
|
||||
{
|
||||
// The cr bit encoding is 0x80 >> cr_reg_num.
|
||||
|
||||
unsigned Zeros = CountTrailingZeros_32(Imm);
|
||||
if (Zeros >= 8)
|
||||
return MCDisassembler_Fail;
|
||||
|
||||
MCOperand_CreateReg0(Inst, (CRRegs[7 - Zeros]));
|
||||
return MCDisassembler_Success;
|
||||
}
|
||||
|
||||
#include "PPCGenDisassemblerTables.inc"
|
||||
|
||||
DecodeStatus getInstruction(csh ud, const uint8_t *Bytes, size_t BytesLen,
|
||||
MCInst *MI, uint16_t *Size, uint64_t Address,
|
||||
void *Info)
|
||||
{
|
||||
// If this is an 8-byte prefixed instruction, handle it here.
|
||||
// Note: prefixed instructions aren't technically 8-byte entities - the
|
||||
// prefix
|
||||
// appears in memory at an address 4 bytes prior to that of the base
|
||||
// instruction regardless of endianness. So we read the two pieces and
|
||||
// rebuild the 8-byte instruction.
|
||||
// TODO: In this function we call decodeInstruction several times with
|
||||
// different decoder tables. It may be possible to only call once by
|
||||
// looking at the top 6 bits of the instruction.
|
||||
if (PPC_getFeatureBits(MI->csh->mode, PPC_FeaturePrefixInstrs) &&
|
||||
BytesLen >= 8) {
|
||||
uint32_t Prefix = readBytes32(MI, Bytes);
|
||||
uint32_t BaseInst = readBytes32(MI, Bytes + 4);
|
||||
uint64_t Inst = BaseInst | (uint64_t)Prefix << 32;
|
||||
DecodeStatus result =
|
||||
decodeInstruction_4(DecoderTable64, MI, Inst, Address);
|
||||
if (result != MCDisassembler_Fail) {
|
||||
*Size = 8;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the four bytes of the instruction.
|
||||
*Size = 4;
|
||||
if (BytesLen < 4) {
|
||||
*Size = 0;
|
||||
return MCDisassembler_Fail;
|
||||
}
|
||||
|
||||
// Read the instruction in the proper endianness.
|
||||
uint64_t Inst = readBytes32(MI, Bytes);
|
||||
|
||||
if (PPC_getFeatureBits(MI->csh->mode, PPC_FeatureQPX)) {
|
||||
DecodeStatus result = decodeInstruction_4(DecoderTableQPX32, MI,
|
||||
Inst, Address);
|
||||
if (result != MCDisassembler_Fail)
|
||||
return result;
|
||||
} else if (PPC_getFeatureBits(MI->csh->mode, PPC_FeatureSPE)) {
|
||||
DecodeStatus result = decodeInstruction_4(DecoderTableSPE32, MI,
|
||||
Inst, Address);
|
||||
if (result != MCDisassembler_Fail)
|
||||
return result;
|
||||
} else if (PPC_getFeatureBits(MI->csh->mode, PPC_FeaturePS)) {
|
||||
DecodeStatus result = decodeInstruction_4(DecoderTablePS32, MI,
|
||||
Inst, Address);
|
||||
if (result != MCDisassembler_Fail)
|
||||
return result;
|
||||
}
|
||||
|
||||
return decodeInstruction_4(DecoderTable32, MI, Inst, Address);
|
||||
}
|
||||
|
||||
DecodeStatus PPC_LLVM_getInstruction(csh handle, const uint8_t *Bytes,
|
||||
size_t BytesLen, MCInst *MI,
|
||||
uint16_t *Size, uint64_t Address,
|
||||
void *Info)
|
||||
{
|
||||
return getInstruction(handle, Bytes, BytesLen, MI, Size, Address, Info);
|
||||
}
|
15761
thirdparty/capstone/arch/PowerPC/PPCGenAsmWriter.inc
vendored
Normal file
15761
thirdparty/capstone/arch/PowerPC/PPCGenAsmWriter.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
687
thirdparty/capstone/arch/PowerPC/PPCGenCSAliasMnemMap.inc
vendored
Normal file
687
thirdparty/capstone/arch/PowerPC/PPCGenCSAliasMnemMap.inc
vendored
Normal file
@@ -0,0 +1,687 @@
|
||||
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
|
||||
/* Rot127 <unisono@quyllur.org> 2022-2023 */
|
||||
/* 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 */
|
||||
|
||||
{ PPC_INS_ALIAS_RFEBB, "rfebb" },
|
||||
{ PPC_INS_ALIAS_LI, "li" },
|
||||
{ PPC_INS_ALIAS_LIS, "lis" },
|
||||
{ PPC_INS_ALIAS_MR, "mr" },
|
||||
{ PPC_INS_ALIAS_MR_, "mr." },
|
||||
{ PPC_INS_ALIAS_NOT, "not" },
|
||||
{ PPC_INS_ALIAS_NOT_, "not." },
|
||||
{ PPC_INS_ALIAS_NOP, "nop" },
|
||||
{ PPC_INS_ALIAS_MTUDSCR, "mtudscr" },
|
||||
{ PPC_INS_ALIAS_MFUDSCR, "mfudscr" },
|
||||
{ PPC_INS_ALIAS_MTVRSAVE, "mtvrsave" },
|
||||
{ PPC_INS_ALIAS_MFVRSAVE, "mfvrsave" },
|
||||
{ PPC_INS_ALIAS_MTCR, "mtcr" },
|
||||
{ PPC_INS_ALIAS_SUB, "sub" },
|
||||
{ PPC_INS_ALIAS_SUB_, "sub." },
|
||||
{ PPC_INS_ALIAS_SUBC, "subc" },
|
||||
{ PPC_INS_ALIAS_SUBC_, "subc." },
|
||||
{ PPC_INS_ALIAS_VMR, "vmr" },
|
||||
{ PPC_INS_ALIAS_VNOT, "vnot" },
|
||||
{ PPC_INS_ALIAS_ROTLWI, "rotlwi" },
|
||||
{ PPC_INS_ALIAS_ROTLWI_, "rotlwi." },
|
||||
{ PPC_INS_ALIAS_ROTLW, "rotlw" },
|
||||
{ PPC_INS_ALIAS_ROTLW_, "rotlw." },
|
||||
{ PPC_INS_ALIAS_CLRLWI, "clrlwi" },
|
||||
{ PPC_INS_ALIAS_CLRLWI_, "clrlwi." },
|
||||
{ PPC_INS_ALIAS_ISELLT, "isellt" },
|
||||
{ PPC_INS_ALIAS_ISELGT, "iselgt" },
|
||||
{ PPC_INS_ALIAS_ISELEQ, "iseleq" },
|
||||
{ PPC_INS_ALIAS_XNOP, "xnop" },
|
||||
{ PPC_INS_ALIAS_CNTLZW, "cntlzw" },
|
||||
{ PPC_INS_ALIAS_CNTLZW_, "cntlzw." },
|
||||
{ PPC_INS_ALIAS_MTXER, "mtxer" },
|
||||
{ PPC_INS_ALIAS_MFXER, "mfxer" },
|
||||
{ PPC_INS_ALIAS_MFRTCU, "mfrtcu" },
|
||||
{ PPC_INS_ALIAS_MFRTCL, "mfrtcl" },
|
||||
{ PPC_INS_ALIAS_MTLR, "mtlr" },
|
||||
{ PPC_INS_ALIAS_MFLR, "mflr" },
|
||||
{ PPC_INS_ALIAS_MTCTR, "mtctr" },
|
||||
{ PPC_INS_ALIAS_MFCTR, "mfctr" },
|
||||
{ PPC_INS_ALIAS_MTUAMR, "mtuamr" },
|
||||
{ PPC_INS_ALIAS_MFUAMR, "mfuamr" },
|
||||
{ PPC_INS_ALIAS_MTDSCR, "mtdscr" },
|
||||
{ PPC_INS_ALIAS_MFDSCR, "mfdscr" },
|
||||
{ PPC_INS_ALIAS_MTDSISR, "mtdsisr" },
|
||||
{ PPC_INS_ALIAS_MFDSISR, "mfdsisr" },
|
||||
{ PPC_INS_ALIAS_MTDAR, "mtdar" },
|
||||
{ PPC_INS_ALIAS_MFDAR, "mfdar" },
|
||||
{ PPC_INS_ALIAS_MTDEC, "mtdec" },
|
||||
{ PPC_INS_ALIAS_MFDEC, "mfdec" },
|
||||
{ PPC_INS_ALIAS_MTSDR1, "mtsdr1" },
|
||||
{ PPC_INS_ALIAS_MFSDR1, "mfsdr1" },
|
||||
{ PPC_INS_ALIAS_MTSRR0, "mtsrr0" },
|
||||
{ PPC_INS_ALIAS_MFSRR0, "mfsrr0" },
|
||||
{ PPC_INS_ALIAS_MTSRR1, "mtsrr1" },
|
||||
{ PPC_INS_ALIAS_MFSRR1, "mfsrr1" },
|
||||
{ PPC_INS_ALIAS_MTCFAR, "mtcfar" },
|
||||
{ PPC_INS_ALIAS_MFCFAR, "mfcfar" },
|
||||
{ PPC_INS_ALIAS_MTAMR, "mtamr" },
|
||||
{ PPC_INS_ALIAS_MFAMR, "mfamr" },
|
||||
{ PPC_INS_ALIAS_MFSPRG, "mfsprg" },
|
||||
{ PPC_INS_ALIAS_MFSPRG0, "mfsprg0" },
|
||||
{ PPC_INS_ALIAS_MTSPRG, "mtsprg" },
|
||||
{ PPC_INS_ALIAS_MTSPRG0, "mtsprg0" },
|
||||
{ PPC_INS_ALIAS_MFSPRG1, "mfsprg1" },
|
||||
{ PPC_INS_ALIAS_MTSPRG1, "mtsprg1" },
|
||||
{ PPC_INS_ALIAS_MFSPRG2, "mfsprg2" },
|
||||
{ PPC_INS_ALIAS_MTSPRG2, "mtsprg2" },
|
||||
{ PPC_INS_ALIAS_MFSPRG3, "mfsprg3" },
|
||||
{ PPC_INS_ALIAS_MTSPRG3, "mtsprg3" },
|
||||
{ PPC_INS_ALIAS_MFASR, "mfasr" },
|
||||
{ PPC_INS_ALIAS_MTASR, "mtasr" },
|
||||
{ PPC_INS_ALIAS_MTTBL, "mttbl" },
|
||||
{ PPC_INS_ALIAS_MTTBU, "mttbu" },
|
||||
{ PPC_INS_ALIAS_MFPVR, "mfpvr" },
|
||||
{ PPC_INS_ALIAS_MFSPEFSCR, "mfspefscr" },
|
||||
{ PPC_INS_ALIAS_MTSPEFSCR, "mtspefscr" },
|
||||
{ PPC_INS_ALIAS_XVMOVDP, "xvmovdp" },
|
||||
{ PPC_INS_ALIAS_XVMOVSP, "xvmovsp" },
|
||||
{ PPC_INS_ALIAS_XXSPLTD, "xxspltd" },
|
||||
{ PPC_INS_ALIAS_XXMRGHD, "xxmrghd" },
|
||||
{ PPC_INS_ALIAS_XXMRGLD, "xxmrgld" },
|
||||
{ PPC_INS_ALIAS_XXSWAPD, "xxswapd" },
|
||||
{ PPC_INS_ALIAS_MFFPRD, "mffprd" },
|
||||
{ PPC_INS_ALIAS_MTFPRD, "mtfprd" },
|
||||
{ PPC_INS_ALIAS_MFFPRWZ, "mffprwz" },
|
||||
{ PPC_INS_ALIAS_MTFPRWA, "mtfprwa" },
|
||||
{ PPC_INS_ALIAS_MTFPRWZ, "mtfprwz" },
|
||||
{ PPC_INS_ALIAS_TEND_, "tend." },
|
||||
{ PPC_INS_ALIAS_TENDALL_, "tendall." },
|
||||
{ PPC_INS_ALIAS_TSUSPEND_, "tsuspend." },
|
||||
{ PPC_INS_ALIAS_TRESUME_, "tresume." },
|
||||
{ PPC_INS_ALIAS_DCI, "dci" },
|
||||
{ PPC_INS_ALIAS_DCCCI, "dccci" },
|
||||
{ PPC_INS_ALIAS_ICI, "ici" },
|
||||
{ PPC_INS_ALIAS_ICCCI, "iccci" },
|
||||
{ PPC_INS_ALIAS_MTFSFI, "mtfsfi" },
|
||||
{ PPC_INS_ALIAS_MTFSFI_, "mtfsfi." },
|
||||
{ PPC_INS_ALIAS_MTFSF, "mtfsf" },
|
||||
{ PPC_INS_ALIAS_MTFSF_, "mtfsf." },
|
||||
{ PPC_INS_ALIAS_SC, "sc" },
|
||||
{ PPC_INS_ALIAS_SYNC, "sync" },
|
||||
{ PPC_INS_ALIAS_LWSYNC, "lwsync" },
|
||||
{ PPC_INS_ALIAS_PTESYNC, "ptesync" },
|
||||
{ PPC_INS_ALIAS_WAIT, "wait" },
|
||||
{ PPC_INS_ALIAS_WAITRSV, "waitrsv" },
|
||||
{ PPC_INS_ALIAS_WAITIMPL, "waitimpl" },
|
||||
{ PPC_INS_ALIAS_MBAR, "mbar" },
|
||||
{ PPC_INS_ALIAS_CRSET, "crset" },
|
||||
{ PPC_INS_ALIAS_CRCLR, "crclr" },
|
||||
{ PPC_INS_ALIAS_CRMOVE, "crmove" },
|
||||
{ PPC_INS_ALIAS_CRNOT, "crnot" },
|
||||
{ PPC_INS_ALIAS_MFTB, "mftb" },
|
||||
{ PPC_INS_ALIAS_MFTBL, "mftbl" },
|
||||
{ PPC_INS_ALIAS_MFTBU, "mftbu" },
|
||||
{ PPC_INS_ALIAS_MFBR0, "mfbr0" },
|
||||
{ PPC_INS_ALIAS_MTBR0, "mtbr0" },
|
||||
{ PPC_INS_ALIAS_MFBR1, "mfbr1" },
|
||||
{ PPC_INS_ALIAS_MTBR1, "mtbr1" },
|
||||
{ PPC_INS_ALIAS_MFBR2, "mfbr2" },
|
||||
{ PPC_INS_ALIAS_MTBR2, "mtbr2" },
|
||||
{ PPC_INS_ALIAS_MFBR3, "mfbr3" },
|
||||
{ PPC_INS_ALIAS_MTBR3, "mtbr3" },
|
||||
{ PPC_INS_ALIAS_MFBR4, "mfbr4" },
|
||||
{ PPC_INS_ALIAS_MTBR4, "mtbr4" },
|
||||
{ PPC_INS_ALIAS_MFBR5, "mfbr5" },
|
||||
{ PPC_INS_ALIAS_MTBR5, "mtbr5" },
|
||||
{ PPC_INS_ALIAS_MFBR6, "mfbr6" },
|
||||
{ PPC_INS_ALIAS_MTBR6, "mtbr6" },
|
||||
{ PPC_INS_ALIAS_MFBR7, "mfbr7" },
|
||||
{ PPC_INS_ALIAS_MTBR7, "mtbr7" },
|
||||
{ PPC_INS_ALIAS_MTMSRD, "mtmsrd" },
|
||||
{ PPC_INS_ALIAS_MTMSR, "mtmsr" },
|
||||
{ PPC_INS_ALIAS_MTPID, "mtpid" },
|
||||
{ PPC_INS_ALIAS_MFPID, "mfpid" },
|
||||
{ PPC_INS_ALIAS_MFSPRG4, "mfsprg4" },
|
||||
{ PPC_INS_ALIAS_MTSPRG4, "mtsprg4" },
|
||||
{ PPC_INS_ALIAS_MFSPRG5, "mfsprg5" },
|
||||
{ PPC_INS_ALIAS_MTSPRG5, "mtsprg5" },
|
||||
{ PPC_INS_ALIAS_MFSPRG6, "mfsprg6" },
|
||||
{ PPC_INS_ALIAS_MTSPRG6, "mtsprg6" },
|
||||
{ PPC_INS_ALIAS_MFSPRG7, "mfsprg7" },
|
||||
{ PPC_INS_ALIAS_MTSPRG7, "mtsprg7" },
|
||||
{ PPC_INS_ALIAS_MTDBATU, "mtdbatu" },
|
||||
{ PPC_INS_ALIAS_MFDBATU, "mfdbatu" },
|
||||
{ PPC_INS_ALIAS_MTDBATL, "mtdbatl" },
|
||||
{ PPC_INS_ALIAS_MFDBATL, "mfdbatl" },
|
||||
{ PPC_INS_ALIAS_MTIBATU, "mtibatu" },
|
||||
{ PPC_INS_ALIAS_MFIBATU, "mfibatu" },
|
||||
{ PPC_INS_ALIAS_MTIBATL, "mtibatl" },
|
||||
{ PPC_INS_ALIAS_MFIBATL, "mfibatl" },
|
||||
{ PPC_INS_ALIAS_MTPPR, "mtppr" },
|
||||
{ PPC_INS_ALIAS_MFPPR, "mfppr" },
|
||||
{ PPC_INS_ALIAS_MTESR, "mtesr" },
|
||||
{ PPC_INS_ALIAS_MFESR, "mfesr" },
|
||||
{ PPC_INS_ALIAS_MTDEAR, "mtdear" },
|
||||
{ PPC_INS_ALIAS_MFDEAR, "mfdear" },
|
||||
{ PPC_INS_ALIAS_MTTCR, "mttcr" },
|
||||
{ PPC_INS_ALIAS_MFTCR, "mftcr" },
|
||||
{ PPC_INS_ALIAS_MFTBHI, "mftbhi" },
|
||||
{ PPC_INS_ALIAS_MTTBHI, "mttbhi" },
|
||||
{ PPC_INS_ALIAS_MFTBLO, "mftblo" },
|
||||
{ PPC_INS_ALIAS_MTTBLO, "mttblo" },
|
||||
{ PPC_INS_ALIAS_MTSRR2, "mtsrr2" },
|
||||
{ PPC_INS_ALIAS_MFSRR2, "mfsrr2" },
|
||||
{ PPC_INS_ALIAS_MTSRR3, "mtsrr3" },
|
||||
{ PPC_INS_ALIAS_MFSRR3, "mfsrr3" },
|
||||
{ PPC_INS_ALIAS_MTDCCR, "mtdccr" },
|
||||
{ PPC_INS_ALIAS_MFDCCR, "mfdccr" },
|
||||
{ PPC_INS_ALIAS_MTICCR, "mticcr" },
|
||||
{ PPC_INS_ALIAS_MFICCR, "mficcr" },
|
||||
{ PPC_INS_ALIAS_TLBIE, "tlbie" },
|
||||
{ PPC_INS_ALIAS_TLBREHI, "tlbrehi" },
|
||||
{ PPC_INS_ALIAS_TLBRELO, "tlbrelo" },
|
||||
{ PPC_INS_ALIAS_TLBWEHI, "tlbwehi" },
|
||||
{ PPC_INS_ALIAS_TLBWELO, "tlbwelo" },
|
||||
{ PPC_INS_ALIAS_ROTLDI, "rotldi" },
|
||||
{ PPC_INS_ALIAS_ROTLDI_, "rotldi." },
|
||||
{ PPC_INS_ALIAS_ROTLD, "rotld" },
|
||||
{ PPC_INS_ALIAS_ROTLD_, "rotld." },
|
||||
{ PPC_INS_ALIAS_CLRLDI, "clrldi" },
|
||||
{ PPC_INS_ALIAS_CLRLDI_, "clrldi." },
|
||||
{ PPC_INS_ALIAS_LNIA, "lnia" },
|
||||
{ PPC_INS_ALIAS_BCp, "bc+" },
|
||||
{ PPC_INS_ALIAS_BCAp, "bca+" },
|
||||
{ PPC_INS_ALIAS_BCLp, "bcl+" },
|
||||
{ PPC_INS_ALIAS_BCLAp, "bcla+" },
|
||||
{ PPC_INS_ALIAS_BCm, "bc-" },
|
||||
{ PPC_INS_ALIAS_BCAm, "bca-" },
|
||||
{ PPC_INS_ALIAS_BCLm, "bcl-" },
|
||||
{ PPC_INS_ALIAS_BCLAm, "bcla-" },
|
||||
{ PPC_INS_ALIAS_BT, "bt" },
|
||||
{ PPC_INS_ALIAS_BTA, "bta" },
|
||||
{ PPC_INS_ALIAS_BTLR, "btlr" },
|
||||
{ PPC_INS_ALIAS_BTL, "btl" },
|
||||
{ PPC_INS_ALIAS_BTLA, "btla" },
|
||||
{ PPC_INS_ALIAS_BTLRL, "btlrl" },
|
||||
{ PPC_INS_ALIAS_BTCTR, "btctr" },
|
||||
{ PPC_INS_ALIAS_BTCTRL, "btctrl" },
|
||||
{ PPC_INS_ALIAS_BDZLR, "bdzlr" },
|
||||
{ PPC_INS_ALIAS_BDZLRL, "bdzlrl" },
|
||||
{ PPC_INS_ALIAS_BDZL, "bdzl" },
|
||||
{ PPC_INS_ALIAS_BDZLA, "bdzla" },
|
||||
{ PPC_INS_ALIAS_BDZ, "bdz" },
|
||||
{ PPC_INS_ALIAS_BDNZL, "bdnzl" },
|
||||
{ PPC_INS_ALIAS_BDNZLA, "bdnzla" },
|
||||
{ PPC_INS_ALIAS_BDNZ, "bdnz" },
|
||||
{ PPC_INS_ALIAS_BDZLp, "bdzl+" },
|
||||
{ PPC_INS_ALIAS_BDZLAp, "bdzla+" },
|
||||
{ PPC_INS_ALIAS_BDZp, "bdz+" },
|
||||
{ PPC_INS_ALIAS_BDNZLp, "bdnzl+" },
|
||||
{ PPC_INS_ALIAS_BDNZLAp, "bdnzla+" },
|
||||
{ PPC_INS_ALIAS_BDNZp, "bdnz+" },
|
||||
{ PPC_INS_ALIAS_BDZLm, "bdzl-" },
|
||||
{ PPC_INS_ALIAS_BDZLAm, "bdzla-" },
|
||||
{ PPC_INS_ALIAS_BDZm, "bdz-" },
|
||||
{ PPC_INS_ALIAS_BDNZLm, "bdnzl-" },
|
||||
{ PPC_INS_ALIAS_BDNZLAm, "bdnzla-" },
|
||||
{ PPC_INS_ALIAS_BDNZm, "bdnz-" },
|
||||
{ PPC_INS_ALIAS_BDNZLR, "bdnzlr" },
|
||||
{ PPC_INS_ALIAS_BDNZLRL, "bdnzlrl" },
|
||||
{ PPC_INS_ALIAS_BDZLRp, "bdzlr+" },
|
||||
{ PPC_INS_ALIAS_BDZLRLp, "bdzlrl+" },
|
||||
{ PPC_INS_ALIAS_BDNZLRp, "bdnzlr+" },
|
||||
{ PPC_INS_ALIAS_BDNZLRLp, "bdnzlrl+" },
|
||||
{ PPC_INS_ALIAS_BDZLRm, "bdzlr-" },
|
||||
{ PPC_INS_ALIAS_BDZLRLm, "bdzlrl-" },
|
||||
{ PPC_INS_ALIAS_BDNZLRm, "bdnzlr-" },
|
||||
{ PPC_INS_ALIAS_BDNZLRLm, "bdnzlrl-" },
|
||||
{ PPC_INS_ALIAS_BF, "bf" },
|
||||
{ PPC_INS_ALIAS_BFA, "bfa" },
|
||||
{ PPC_INS_ALIAS_BFLR, "bflr" },
|
||||
{ PPC_INS_ALIAS_BFL, "bfl" },
|
||||
{ PPC_INS_ALIAS_BFLA, "bfla" },
|
||||
{ PPC_INS_ALIAS_BFLRL, "bflrl" },
|
||||
{ PPC_INS_ALIAS_BFCTR, "bfctr" },
|
||||
{ PPC_INS_ALIAS_BFCTRL, "bfctrl" },
|
||||
{ PPC_INS_ALIAS_BTm, "bt-" },
|
||||
{ PPC_INS_ALIAS_BTAm, "bta-" },
|
||||
{ PPC_INS_ALIAS_BTLRm, "btlr-" },
|
||||
{ PPC_INS_ALIAS_BTLm, "btl-" },
|
||||
{ PPC_INS_ALIAS_BTLAm, "btla-" },
|
||||
{ PPC_INS_ALIAS_BTLRLm, "btlrl-" },
|
||||
{ PPC_INS_ALIAS_BTCTRm, "btctr-" },
|
||||
{ PPC_INS_ALIAS_BTCTRLm, "btctrl-" },
|
||||
{ PPC_INS_ALIAS_BFm, "bf-" },
|
||||
{ PPC_INS_ALIAS_BFAm, "bfa-" },
|
||||
{ PPC_INS_ALIAS_BFLRm, "bflr-" },
|
||||
{ PPC_INS_ALIAS_BFLm, "bfl-" },
|
||||
{ PPC_INS_ALIAS_BFLAm, "bfla-" },
|
||||
{ PPC_INS_ALIAS_BFLRLm, "bflrl-" },
|
||||
{ PPC_INS_ALIAS_BFCTRm, "bfctr-" },
|
||||
{ PPC_INS_ALIAS_BFCTRLm, "bfctrl-" },
|
||||
{ PPC_INS_ALIAS_BTp, "bt+" },
|
||||
{ PPC_INS_ALIAS_BTAp, "bta+" },
|
||||
{ PPC_INS_ALIAS_BTLRp, "btlr+" },
|
||||
{ PPC_INS_ALIAS_BTLp, "btl+" },
|
||||
{ PPC_INS_ALIAS_BTLAp, "btla+" },
|
||||
{ PPC_INS_ALIAS_BTLRLp, "btlrl+" },
|
||||
{ PPC_INS_ALIAS_BTCTRp, "btctr+" },
|
||||
{ PPC_INS_ALIAS_BTCTRLp, "btctrl+" },
|
||||
{ PPC_INS_ALIAS_BFp, "bf+" },
|
||||
{ PPC_INS_ALIAS_BFAp, "bfa+" },
|
||||
{ PPC_INS_ALIAS_BFLRp, "bflr+" },
|
||||
{ PPC_INS_ALIAS_BFLp, "bfl+" },
|
||||
{ PPC_INS_ALIAS_BFLAp, "bfla+" },
|
||||
{ PPC_INS_ALIAS_BFLRLp, "bflrl+" },
|
||||
{ PPC_INS_ALIAS_BFCTRp, "bfctr+" },
|
||||
{ PPC_INS_ALIAS_BFCTRLp, "bfctrl+" },
|
||||
{ PPC_INS_ALIAS_BDNZT, "bdnzt" },
|
||||
{ PPC_INS_ALIAS_BDNZTA, "bdnzta" },
|
||||
{ PPC_INS_ALIAS_BDNZTLR, "bdnztlr" },
|
||||
{ PPC_INS_ALIAS_BDNZTL, "bdnztl" },
|
||||
{ PPC_INS_ALIAS_BDNZTLA, "bdnztla" },
|
||||
{ PPC_INS_ALIAS_BDNZTLRL, "bdnztlrl" },
|
||||
{ PPC_INS_ALIAS_BDNZF, "bdnzf" },
|
||||
{ PPC_INS_ALIAS_BDNZFA, "bdnzfa" },
|
||||
{ PPC_INS_ALIAS_BDNZFLR, "bdnzflr" },
|
||||
{ PPC_INS_ALIAS_BDNZFL, "bdnzfl" },
|
||||
{ PPC_INS_ALIAS_BDNZFLA, "bdnzfla" },
|
||||
{ PPC_INS_ALIAS_BDNZFLRL, "bdnzflrl" },
|
||||
{ PPC_INS_ALIAS_BDZT, "bdzt" },
|
||||
{ PPC_INS_ALIAS_BDZTA, "bdzta" },
|
||||
{ PPC_INS_ALIAS_BDZTLR, "bdztlr" },
|
||||
{ PPC_INS_ALIAS_BDZTL, "bdztl" },
|
||||
{ PPC_INS_ALIAS_BDZTLA, "bdztla" },
|
||||
{ PPC_INS_ALIAS_BDZTLRL, "bdztlrl" },
|
||||
{ PPC_INS_ALIAS_BDZF, "bdzf" },
|
||||
{ PPC_INS_ALIAS_BDZFA, "bdzfa" },
|
||||
{ PPC_INS_ALIAS_BDZFLR, "bdzflr" },
|
||||
{ PPC_INS_ALIAS_BDZFL, "bdzfl" },
|
||||
{ PPC_INS_ALIAS_BDZFLA, "bdzfla" },
|
||||
{ PPC_INS_ALIAS_BDZFLRL, "bdzflrl" },
|
||||
{ PPC_INS_ALIAS_B, "b" },
|
||||
{ PPC_INS_ALIAS_BA, "ba" },
|
||||
{ PPC_INS_ALIAS_BL, "bl" },
|
||||
{ PPC_INS_ALIAS_BLA, "bla" },
|
||||
{ PPC_INS_ALIAS_BLR, "blr" },
|
||||
{ PPC_INS_ALIAS_BLRL, "blrl" },
|
||||
{ PPC_INS_ALIAS_BCTR, "bctr" },
|
||||
{ PPC_INS_ALIAS_BCTRL, "bctrl" },
|
||||
{ PPC_INS_ALIAS_BLT, "blt" },
|
||||
{ PPC_INS_ALIAS_BLTA, "blta" },
|
||||
{ PPC_INS_ALIAS_BLTLR, "bltlr" },
|
||||
{ PPC_INS_ALIAS_BLTCTR, "bltctr" },
|
||||
{ PPC_INS_ALIAS_BLTL, "bltl" },
|
||||
{ PPC_INS_ALIAS_BLTLA, "bltla" },
|
||||
{ PPC_INS_ALIAS_BLTLRL, "bltlrl" },
|
||||
{ PPC_INS_ALIAS_BLTCTRL, "bltctrl" },
|
||||
{ PPC_INS_ALIAS_BLTm, "blt-" },
|
||||
{ PPC_INS_ALIAS_BLTAm, "blta-" },
|
||||
{ PPC_INS_ALIAS_BLTLRm, "bltlr-" },
|
||||
{ PPC_INS_ALIAS_BLTCTRm, "bltctr-" },
|
||||
{ PPC_INS_ALIAS_BLTLm, "bltl-" },
|
||||
{ PPC_INS_ALIAS_BLTLAm, "bltla-" },
|
||||
{ PPC_INS_ALIAS_BLTLRLm, "bltlrl-" },
|
||||
{ PPC_INS_ALIAS_BLTCTRLm, "bltctrl-" },
|
||||
{ PPC_INS_ALIAS_BLTp, "blt+" },
|
||||
{ PPC_INS_ALIAS_BLTAp, "blta+" },
|
||||
{ PPC_INS_ALIAS_BLTLRp, "bltlr+" },
|
||||
{ PPC_INS_ALIAS_BLTCTRp, "bltctr+" },
|
||||
{ PPC_INS_ALIAS_BLTLp, "bltl+" },
|
||||
{ PPC_INS_ALIAS_BLTLAp, "bltla+" },
|
||||
{ PPC_INS_ALIAS_BLTLRLp, "bltlrl+" },
|
||||
{ PPC_INS_ALIAS_BLTCTRLp, "bltctrl+" },
|
||||
{ PPC_INS_ALIAS_BGT, "bgt" },
|
||||
{ PPC_INS_ALIAS_BGTA, "bgta" },
|
||||
{ PPC_INS_ALIAS_BGTLR, "bgtlr" },
|
||||
{ PPC_INS_ALIAS_BGTCTR, "bgtctr" },
|
||||
{ PPC_INS_ALIAS_BGTL, "bgtl" },
|
||||
{ PPC_INS_ALIAS_BGTLA, "bgtla" },
|
||||
{ PPC_INS_ALIAS_BGTLRL, "bgtlrl" },
|
||||
{ PPC_INS_ALIAS_BGTCTRL, "bgtctrl" },
|
||||
{ PPC_INS_ALIAS_BGTm, "bgt-" },
|
||||
{ PPC_INS_ALIAS_BGTAm, "bgta-" },
|
||||
{ PPC_INS_ALIAS_BGTLRm, "bgtlr-" },
|
||||
{ PPC_INS_ALIAS_BGTCTRm, "bgtctr-" },
|
||||
{ PPC_INS_ALIAS_BGTLm, "bgtl-" },
|
||||
{ PPC_INS_ALIAS_BGTLAm, "bgtla-" },
|
||||
{ PPC_INS_ALIAS_BGTLRLm, "bgtlrl-" },
|
||||
{ PPC_INS_ALIAS_BGTCTRLm, "bgtctrl-" },
|
||||
{ PPC_INS_ALIAS_BGTp, "bgt+" },
|
||||
{ PPC_INS_ALIAS_BGTAp, "bgta+" },
|
||||
{ PPC_INS_ALIAS_BGTLRp, "bgtlr+" },
|
||||
{ PPC_INS_ALIAS_BGTCTRp, "bgtctr+" },
|
||||
{ PPC_INS_ALIAS_BGTLp, "bgtl+" },
|
||||
{ PPC_INS_ALIAS_BGTLAp, "bgtla+" },
|
||||
{ PPC_INS_ALIAS_BGTLRLp, "bgtlrl+" },
|
||||
{ PPC_INS_ALIAS_BGTCTRLp, "bgtctrl+" },
|
||||
{ PPC_INS_ALIAS_BEQ, "beq" },
|
||||
{ PPC_INS_ALIAS_BEQA, "beqa" },
|
||||
{ PPC_INS_ALIAS_BEQLR, "beqlr" },
|
||||
{ PPC_INS_ALIAS_BEQCTR, "beqctr" },
|
||||
{ PPC_INS_ALIAS_BEQL, "beql" },
|
||||
{ PPC_INS_ALIAS_BEQLA, "beqla" },
|
||||
{ PPC_INS_ALIAS_BEQLRL, "beqlrl" },
|
||||
{ PPC_INS_ALIAS_BEQCTRL, "beqctrl" },
|
||||
{ PPC_INS_ALIAS_BEQm, "beq-" },
|
||||
{ PPC_INS_ALIAS_BEQAm, "beqa-" },
|
||||
{ PPC_INS_ALIAS_BEQLRm, "beqlr-" },
|
||||
{ PPC_INS_ALIAS_BEQCTRm, "beqctr-" },
|
||||
{ PPC_INS_ALIAS_BEQLm, "beql-" },
|
||||
{ PPC_INS_ALIAS_BEQLAm, "beqla-" },
|
||||
{ PPC_INS_ALIAS_BEQLRLm, "beqlrl-" },
|
||||
{ PPC_INS_ALIAS_BEQCTRLm, "beqctrl-" },
|
||||
{ PPC_INS_ALIAS_BEQp, "beq+" },
|
||||
{ PPC_INS_ALIAS_BEQAp, "beqa+" },
|
||||
{ PPC_INS_ALIAS_BEQLRp, "beqlr+" },
|
||||
{ PPC_INS_ALIAS_BEQCTRp, "beqctr+" },
|
||||
{ PPC_INS_ALIAS_BEQLp, "beql+" },
|
||||
{ PPC_INS_ALIAS_BEQLAp, "beqla+" },
|
||||
{ PPC_INS_ALIAS_BEQLRLp, "beqlrl+" },
|
||||
{ PPC_INS_ALIAS_BEQCTRLp, "beqctrl+" },
|
||||
{ PPC_INS_ALIAS_BUN, "bun" },
|
||||
{ PPC_INS_ALIAS_BUNA, "buna" },
|
||||
{ PPC_INS_ALIAS_BUNLR, "bunlr" },
|
||||
{ PPC_INS_ALIAS_BUNCTR, "bunctr" },
|
||||
{ PPC_INS_ALIAS_BUNL, "bunl" },
|
||||
{ PPC_INS_ALIAS_BUNLA, "bunla" },
|
||||
{ PPC_INS_ALIAS_BUNLRL, "bunlrl" },
|
||||
{ PPC_INS_ALIAS_BUNCTRL, "bunctrl" },
|
||||
{ PPC_INS_ALIAS_BUNm, "bun-" },
|
||||
{ PPC_INS_ALIAS_BUNAm, "buna-" },
|
||||
{ PPC_INS_ALIAS_BUNLRm, "bunlr-" },
|
||||
{ PPC_INS_ALIAS_BUNCTRm, "bunctr-" },
|
||||
{ PPC_INS_ALIAS_BUNLm, "bunl-" },
|
||||
{ PPC_INS_ALIAS_BUNLAm, "bunla-" },
|
||||
{ PPC_INS_ALIAS_BUNLRLm, "bunlrl-" },
|
||||
{ PPC_INS_ALIAS_BUNCTRLm, "bunctrl-" },
|
||||
{ PPC_INS_ALIAS_BUNp, "bun+" },
|
||||
{ PPC_INS_ALIAS_BUNAp, "buna+" },
|
||||
{ PPC_INS_ALIAS_BUNLRp, "bunlr+" },
|
||||
{ PPC_INS_ALIAS_BUNCTRp, "bunctr+" },
|
||||
{ PPC_INS_ALIAS_BUNLp, "bunl+" },
|
||||
{ PPC_INS_ALIAS_BUNLAp, "bunla+" },
|
||||
{ PPC_INS_ALIAS_BUNLRLp, "bunlrl+" },
|
||||
{ PPC_INS_ALIAS_BUNCTRLp, "bunctrl+" },
|
||||
{ PPC_INS_ALIAS_BSO, "bso" },
|
||||
{ PPC_INS_ALIAS_BSOA, "bsoa" },
|
||||
{ PPC_INS_ALIAS_BSOLR, "bsolr" },
|
||||
{ PPC_INS_ALIAS_BSOCTR, "bsoctr" },
|
||||
{ PPC_INS_ALIAS_BSOL, "bsol" },
|
||||
{ PPC_INS_ALIAS_BSOLA, "bsola" },
|
||||
{ PPC_INS_ALIAS_BSOLRL, "bsolrl" },
|
||||
{ PPC_INS_ALIAS_BSOCTRL, "bsoctrl" },
|
||||
{ PPC_INS_ALIAS_BSOm, "bso-" },
|
||||
{ PPC_INS_ALIAS_BSOAm, "bsoa-" },
|
||||
{ PPC_INS_ALIAS_BSOLRm, "bsolr-" },
|
||||
{ PPC_INS_ALIAS_BSOCTRm, "bsoctr-" },
|
||||
{ PPC_INS_ALIAS_BSOLm, "bsol-" },
|
||||
{ PPC_INS_ALIAS_BSOLAm, "bsola-" },
|
||||
{ PPC_INS_ALIAS_BSOLRLm, "bsolrl-" },
|
||||
{ PPC_INS_ALIAS_BSOCTRLm, "bsoctrl-" },
|
||||
{ PPC_INS_ALIAS_BSOp, "bso+" },
|
||||
{ PPC_INS_ALIAS_BSOAp, "bsoa+" },
|
||||
{ PPC_INS_ALIAS_BSOLRp, "bsolr+" },
|
||||
{ PPC_INS_ALIAS_BSOCTRp, "bsoctr+" },
|
||||
{ PPC_INS_ALIAS_BSOLp, "bsol+" },
|
||||
{ PPC_INS_ALIAS_BSOLAp, "bsola+" },
|
||||
{ PPC_INS_ALIAS_BSOLRLp, "bsolrl+" },
|
||||
{ PPC_INS_ALIAS_BSOCTRLp, "bsoctrl+" },
|
||||
{ PPC_INS_ALIAS_BGE, "bge" },
|
||||
{ PPC_INS_ALIAS_BGEA, "bgea" },
|
||||
{ PPC_INS_ALIAS_BGELR, "bgelr" },
|
||||
{ PPC_INS_ALIAS_BGECTR, "bgectr" },
|
||||
{ PPC_INS_ALIAS_BGEL, "bgel" },
|
||||
{ PPC_INS_ALIAS_BGELA, "bgela" },
|
||||
{ PPC_INS_ALIAS_BGELRL, "bgelrl" },
|
||||
{ PPC_INS_ALIAS_BGECTRL, "bgectrl" },
|
||||
{ PPC_INS_ALIAS_BGEm, "bge-" },
|
||||
{ PPC_INS_ALIAS_BGEAm, "bgea-" },
|
||||
{ PPC_INS_ALIAS_BGELRm, "bgelr-" },
|
||||
{ PPC_INS_ALIAS_BGECTRm, "bgectr-" },
|
||||
{ PPC_INS_ALIAS_BGELm, "bgel-" },
|
||||
{ PPC_INS_ALIAS_BGELAm, "bgela-" },
|
||||
{ PPC_INS_ALIAS_BGELRLm, "bgelrl-" },
|
||||
{ PPC_INS_ALIAS_BGECTRLm, "bgectrl-" },
|
||||
{ PPC_INS_ALIAS_BGEp, "bge+" },
|
||||
{ PPC_INS_ALIAS_BGEAp, "bgea+" },
|
||||
{ PPC_INS_ALIAS_BGELRp, "bgelr+" },
|
||||
{ PPC_INS_ALIAS_BGECTRp, "bgectr+" },
|
||||
{ PPC_INS_ALIAS_BGELp, "bgel+" },
|
||||
{ PPC_INS_ALIAS_BGELAp, "bgela+" },
|
||||
{ PPC_INS_ALIAS_BGELRLp, "bgelrl+" },
|
||||
{ PPC_INS_ALIAS_BGECTRLp, "bgectrl+" },
|
||||
{ PPC_INS_ALIAS_BNL, "bnl" },
|
||||
{ PPC_INS_ALIAS_BNLA, "bnla" },
|
||||
{ PPC_INS_ALIAS_BNLLR, "bnllr" },
|
||||
{ PPC_INS_ALIAS_BNLCTR, "bnlctr" },
|
||||
{ PPC_INS_ALIAS_BNLL, "bnll" },
|
||||
{ PPC_INS_ALIAS_BNLLA, "bnlla" },
|
||||
{ PPC_INS_ALIAS_BNLLRL, "bnllrl" },
|
||||
{ PPC_INS_ALIAS_BNLCTRL, "bnlctrl" },
|
||||
{ PPC_INS_ALIAS_BNLm, "bnl-" },
|
||||
{ PPC_INS_ALIAS_BNLAm, "bnla-" },
|
||||
{ PPC_INS_ALIAS_BNLLRm, "bnllr-" },
|
||||
{ PPC_INS_ALIAS_BNLCTRm, "bnlctr-" },
|
||||
{ PPC_INS_ALIAS_BNLLm, "bnll-" },
|
||||
{ PPC_INS_ALIAS_BNLLAm, "bnlla-" },
|
||||
{ PPC_INS_ALIAS_BNLLRLm, "bnllrl-" },
|
||||
{ PPC_INS_ALIAS_BNLCTRLm, "bnlctrl-" },
|
||||
{ PPC_INS_ALIAS_BNLp, "bnl+" },
|
||||
{ PPC_INS_ALIAS_BNLAp, "bnla+" },
|
||||
{ PPC_INS_ALIAS_BNLLRp, "bnllr+" },
|
||||
{ PPC_INS_ALIAS_BNLCTRp, "bnlctr+" },
|
||||
{ PPC_INS_ALIAS_BNLLp, "bnll+" },
|
||||
{ PPC_INS_ALIAS_BNLLAp, "bnlla+" },
|
||||
{ PPC_INS_ALIAS_BNLLRLp, "bnllrl+" },
|
||||
{ PPC_INS_ALIAS_BNLCTRLp, "bnlctrl+" },
|
||||
{ PPC_INS_ALIAS_BLE, "ble" },
|
||||
{ PPC_INS_ALIAS_BLEA, "blea" },
|
||||
{ PPC_INS_ALIAS_BLELR, "blelr" },
|
||||
{ PPC_INS_ALIAS_BLECTR, "blectr" },
|
||||
{ PPC_INS_ALIAS_BLEL, "blel" },
|
||||
{ PPC_INS_ALIAS_BLELA, "blela" },
|
||||
{ PPC_INS_ALIAS_BLELRL, "blelrl" },
|
||||
{ PPC_INS_ALIAS_BLECTRL, "blectrl" },
|
||||
{ PPC_INS_ALIAS_BLEm, "ble-" },
|
||||
{ PPC_INS_ALIAS_BLEAm, "blea-" },
|
||||
{ PPC_INS_ALIAS_BLELRm, "blelr-" },
|
||||
{ PPC_INS_ALIAS_BLECTRm, "blectr-" },
|
||||
{ PPC_INS_ALIAS_BLELm, "blel-" },
|
||||
{ PPC_INS_ALIAS_BLELAm, "blela-" },
|
||||
{ PPC_INS_ALIAS_BLELRLm, "blelrl-" },
|
||||
{ PPC_INS_ALIAS_BLECTRLm, "blectrl-" },
|
||||
{ PPC_INS_ALIAS_BLEp, "ble+" },
|
||||
{ PPC_INS_ALIAS_BLEAp, "blea+" },
|
||||
{ PPC_INS_ALIAS_BLELRp, "blelr+" },
|
||||
{ PPC_INS_ALIAS_BLECTRp, "blectr+" },
|
||||
{ PPC_INS_ALIAS_BLELp, "blel+" },
|
||||
{ PPC_INS_ALIAS_BLELAp, "blela+" },
|
||||
{ PPC_INS_ALIAS_BLELRLp, "blelrl+" },
|
||||
{ PPC_INS_ALIAS_BLECTRLp, "blectrl+" },
|
||||
{ PPC_INS_ALIAS_BNG, "bng" },
|
||||
{ PPC_INS_ALIAS_BNGA, "bnga" },
|
||||
{ PPC_INS_ALIAS_BNGLR, "bnglr" },
|
||||
{ PPC_INS_ALIAS_BNGCTR, "bngctr" },
|
||||
{ PPC_INS_ALIAS_BNGL, "bngl" },
|
||||
{ PPC_INS_ALIAS_BNGLA, "bngla" },
|
||||
{ PPC_INS_ALIAS_BNGLRL, "bnglrl" },
|
||||
{ PPC_INS_ALIAS_BNGCTRL, "bngctrl" },
|
||||
{ PPC_INS_ALIAS_BNGm, "bng-" },
|
||||
{ PPC_INS_ALIAS_BNGAm, "bnga-" },
|
||||
{ PPC_INS_ALIAS_BNGLRm, "bnglr-" },
|
||||
{ PPC_INS_ALIAS_BNGCTRm, "bngctr-" },
|
||||
{ PPC_INS_ALIAS_BNGLm, "bngl-" },
|
||||
{ PPC_INS_ALIAS_BNGLAm, "bngla-" },
|
||||
{ PPC_INS_ALIAS_BNGLRLm, "bnglrl-" },
|
||||
{ PPC_INS_ALIAS_BNGCTRLm, "bngctrl-" },
|
||||
{ PPC_INS_ALIAS_BNGp, "bng+" },
|
||||
{ PPC_INS_ALIAS_BNGAp, "bnga+" },
|
||||
{ PPC_INS_ALIAS_BNGLRp, "bnglr+" },
|
||||
{ PPC_INS_ALIAS_BNGCTRp, "bngctr+" },
|
||||
{ PPC_INS_ALIAS_BNGLp, "bngl+" },
|
||||
{ PPC_INS_ALIAS_BNGLAp, "bngla+" },
|
||||
{ PPC_INS_ALIAS_BNGLRLp, "bnglrl+" },
|
||||
{ PPC_INS_ALIAS_BNGCTRLp, "bngctrl+" },
|
||||
{ PPC_INS_ALIAS_BNE, "bne" },
|
||||
{ PPC_INS_ALIAS_BNEA, "bnea" },
|
||||
{ PPC_INS_ALIAS_BNELR, "bnelr" },
|
||||
{ PPC_INS_ALIAS_BNECTR, "bnectr" },
|
||||
{ PPC_INS_ALIAS_BNEL, "bnel" },
|
||||
{ PPC_INS_ALIAS_BNELA, "bnela" },
|
||||
{ PPC_INS_ALIAS_BNELRL, "bnelrl" },
|
||||
{ PPC_INS_ALIAS_BNECTRL, "bnectrl" },
|
||||
{ PPC_INS_ALIAS_BNEm, "bne-" },
|
||||
{ PPC_INS_ALIAS_BNEAm, "bnea-" },
|
||||
{ PPC_INS_ALIAS_BNELRm, "bnelr-" },
|
||||
{ PPC_INS_ALIAS_BNECTRm, "bnectr-" },
|
||||
{ PPC_INS_ALIAS_BNELm, "bnel-" },
|
||||
{ PPC_INS_ALIAS_BNELAm, "bnela-" },
|
||||
{ PPC_INS_ALIAS_BNELRLm, "bnelrl-" },
|
||||
{ PPC_INS_ALIAS_BNECTRLm, "bnectrl-" },
|
||||
{ PPC_INS_ALIAS_BNEp, "bne+" },
|
||||
{ PPC_INS_ALIAS_BNEAp, "bnea+" },
|
||||
{ PPC_INS_ALIAS_BNELRp, "bnelr+" },
|
||||
{ PPC_INS_ALIAS_BNECTRp, "bnectr+" },
|
||||
{ PPC_INS_ALIAS_BNELp, "bnel+" },
|
||||
{ PPC_INS_ALIAS_BNELAp, "bnela+" },
|
||||
{ PPC_INS_ALIAS_BNELRLp, "bnelrl+" },
|
||||
{ PPC_INS_ALIAS_BNECTRLp, "bnectrl+" },
|
||||
{ PPC_INS_ALIAS_BNU, "bnu" },
|
||||
{ PPC_INS_ALIAS_BNUA, "bnua" },
|
||||
{ PPC_INS_ALIAS_BNULR, "bnulr" },
|
||||
{ PPC_INS_ALIAS_BNUCTR, "bnuctr" },
|
||||
{ PPC_INS_ALIAS_BNUL, "bnul" },
|
||||
{ PPC_INS_ALIAS_BNULA, "bnula" },
|
||||
{ PPC_INS_ALIAS_BNULRL, "bnulrl" },
|
||||
{ PPC_INS_ALIAS_BNUCTRL, "bnuctrl" },
|
||||
{ PPC_INS_ALIAS_BNUm, "bnu-" },
|
||||
{ PPC_INS_ALIAS_BNUAm, "bnua-" },
|
||||
{ PPC_INS_ALIAS_BNULRm, "bnulr-" },
|
||||
{ PPC_INS_ALIAS_BNUCTRm, "bnuctr-" },
|
||||
{ PPC_INS_ALIAS_BNULm, "bnul-" },
|
||||
{ PPC_INS_ALIAS_BNULAm, "bnula-" },
|
||||
{ PPC_INS_ALIAS_BNULRLm, "bnulrl-" },
|
||||
{ PPC_INS_ALIAS_BNUCTRLm, "bnuctrl-" },
|
||||
{ PPC_INS_ALIAS_BNUp, "bnu+" },
|
||||
{ PPC_INS_ALIAS_BNUAp, "bnua+" },
|
||||
{ PPC_INS_ALIAS_BNULRp, "bnulr+" },
|
||||
{ PPC_INS_ALIAS_BNUCTRp, "bnuctr+" },
|
||||
{ PPC_INS_ALIAS_BNULp, "bnul+" },
|
||||
{ PPC_INS_ALIAS_BNULAp, "bnula+" },
|
||||
{ PPC_INS_ALIAS_BNULRLp, "bnulrl+" },
|
||||
{ PPC_INS_ALIAS_BNUCTRLp, "bnuctrl+" },
|
||||
{ PPC_INS_ALIAS_BNS, "bns" },
|
||||
{ PPC_INS_ALIAS_BNSA, "bnsa" },
|
||||
{ PPC_INS_ALIAS_BNSLR, "bnslr" },
|
||||
{ PPC_INS_ALIAS_BNSCTR, "bnsctr" },
|
||||
{ PPC_INS_ALIAS_BNSL, "bnsl" },
|
||||
{ PPC_INS_ALIAS_BNSLA, "bnsla" },
|
||||
{ PPC_INS_ALIAS_BNSLRL, "bnslrl" },
|
||||
{ PPC_INS_ALIAS_BNSCTRL, "bnsctrl" },
|
||||
{ PPC_INS_ALIAS_BNSm, "bns-" },
|
||||
{ PPC_INS_ALIAS_BNSAm, "bnsa-" },
|
||||
{ PPC_INS_ALIAS_BNSLRm, "bnslr-" },
|
||||
{ PPC_INS_ALIAS_BNSCTRm, "bnsctr-" },
|
||||
{ PPC_INS_ALIAS_BNSLm, "bnsl-" },
|
||||
{ PPC_INS_ALIAS_BNSLAm, "bnsla-" },
|
||||
{ PPC_INS_ALIAS_BNSLRLm, "bnslrl-" },
|
||||
{ PPC_INS_ALIAS_BNSCTRLm, "bnsctrl-" },
|
||||
{ PPC_INS_ALIAS_BNSp, "bns+" },
|
||||
{ PPC_INS_ALIAS_BNSAp, "bnsa+" },
|
||||
{ PPC_INS_ALIAS_BNSLRp, "bnslr+" },
|
||||
{ PPC_INS_ALIAS_BNSCTRp, "bnsctr+" },
|
||||
{ PPC_INS_ALIAS_BNSLp, "bnsl+" },
|
||||
{ PPC_INS_ALIAS_BNSLAp, "bnsla+" },
|
||||
{ PPC_INS_ALIAS_BNSLRLp, "bnslrl+" },
|
||||
{ PPC_INS_ALIAS_BNSCTRLp, "bnsctrl+" },
|
||||
{ PPC_INS_ALIAS_CMPWI, "cmpwi" },
|
||||
{ PPC_INS_ALIAS_CMPW, "cmpw" },
|
||||
{ PPC_INS_ALIAS_CMPLWI, "cmplwi" },
|
||||
{ PPC_INS_ALIAS_CMPLW, "cmplw" },
|
||||
{ PPC_INS_ALIAS_CMPDI, "cmpdi" },
|
||||
{ PPC_INS_ALIAS_CMPD, "cmpd" },
|
||||
{ PPC_INS_ALIAS_CMPLDI, "cmpldi" },
|
||||
{ PPC_INS_ALIAS_CMPLD, "cmpld" },
|
||||
{ PPC_INS_ALIAS_CMPI, "cmpi" },
|
||||
{ PPC_INS_ALIAS_CMP, "cmp" },
|
||||
{ PPC_INS_ALIAS_CMPLI, "cmpli" },
|
||||
{ PPC_INS_ALIAS_CMPL, "cmpl" },
|
||||
{ PPC_INS_ALIAS_TRAP, "trap" },
|
||||
{ PPC_INS_ALIAS_TDLTI, "tdlti" },
|
||||
{ PPC_INS_ALIAS_TDLT, "tdlt" },
|
||||
{ PPC_INS_ALIAS_TWLTI, "twlti" },
|
||||
{ PPC_INS_ALIAS_TWLT, "twlt" },
|
||||
{ PPC_INS_ALIAS_TDLEI, "tdlei" },
|
||||
{ PPC_INS_ALIAS_TDLE, "tdle" },
|
||||
{ PPC_INS_ALIAS_TWLEI, "twlei" },
|
||||
{ PPC_INS_ALIAS_TWLE, "twle" },
|
||||
{ PPC_INS_ALIAS_TDEQI, "tdeqi" },
|
||||
{ PPC_INS_ALIAS_TDEQ, "tdeq" },
|
||||
{ PPC_INS_ALIAS_TWEQI, "tweqi" },
|
||||
{ PPC_INS_ALIAS_TWEQ, "tweq" },
|
||||
{ PPC_INS_ALIAS_TDGEI, "tdgei" },
|
||||
{ PPC_INS_ALIAS_TDGE, "tdge" },
|
||||
{ PPC_INS_ALIAS_TWGEI, "twgei" },
|
||||
{ PPC_INS_ALIAS_TWGE, "twge" },
|
||||
{ PPC_INS_ALIAS_TDGTI, "tdgti" },
|
||||
{ PPC_INS_ALIAS_TDGT, "tdgt" },
|
||||
{ PPC_INS_ALIAS_TWGTI, "twgti" },
|
||||
{ PPC_INS_ALIAS_TWGT, "twgt" },
|
||||
{ PPC_INS_ALIAS_TDNLI, "tdnli" },
|
||||
{ PPC_INS_ALIAS_TDNL, "tdnl" },
|
||||
{ PPC_INS_ALIAS_TWNLI, "twnli" },
|
||||
{ PPC_INS_ALIAS_TWNL, "twnl" },
|
||||
{ PPC_INS_ALIAS_TDNEI, "tdnei" },
|
||||
{ PPC_INS_ALIAS_TDNE, "tdne" },
|
||||
{ PPC_INS_ALIAS_TWNEI, "twnei" },
|
||||
{ PPC_INS_ALIAS_TWNE, "twne" },
|
||||
{ PPC_INS_ALIAS_TDNGI, "tdngi" },
|
||||
{ PPC_INS_ALIAS_TDNG, "tdng" },
|
||||
{ PPC_INS_ALIAS_TWNGI, "twngi" },
|
||||
{ PPC_INS_ALIAS_TWNG, "twng" },
|
||||
{ PPC_INS_ALIAS_TDLLTI, "tdllti" },
|
||||
{ PPC_INS_ALIAS_TDLLT, "tdllt" },
|
||||
{ PPC_INS_ALIAS_TWLLTI, "twllti" },
|
||||
{ PPC_INS_ALIAS_TWLLT, "twllt" },
|
||||
{ PPC_INS_ALIAS_TDLLEI, "tdllei" },
|
||||
{ PPC_INS_ALIAS_TDLLE, "tdlle" },
|
||||
{ PPC_INS_ALIAS_TWLLEI, "twllei" },
|
||||
{ PPC_INS_ALIAS_TWLLE, "twlle" },
|
||||
{ PPC_INS_ALIAS_TDLGEI, "tdlgei" },
|
||||
{ PPC_INS_ALIAS_TDLGE, "tdlge" },
|
||||
{ PPC_INS_ALIAS_TWLGEI, "twlgei" },
|
||||
{ PPC_INS_ALIAS_TWLGE, "twlge" },
|
||||
{ PPC_INS_ALIAS_TDLGTI, "tdlgti" },
|
||||
{ PPC_INS_ALIAS_TDLGT, "tdlgt" },
|
||||
{ PPC_INS_ALIAS_TWLGTI, "twlgti" },
|
||||
{ PPC_INS_ALIAS_TWLGT, "twlgt" },
|
||||
{ PPC_INS_ALIAS_TDLNLI, "tdlnli" },
|
||||
{ PPC_INS_ALIAS_TDLNL, "tdlnl" },
|
||||
{ PPC_INS_ALIAS_TWLNLI, "twlnli" },
|
||||
{ PPC_INS_ALIAS_TWLNL, "twlnl" },
|
||||
{ PPC_INS_ALIAS_TDLNGI, "tdlngi" },
|
||||
{ PPC_INS_ALIAS_TDLNG, "tdlng" },
|
||||
{ PPC_INS_ALIAS_TWLNGI, "twlngi" },
|
||||
{ PPC_INS_ALIAS_TWLNG, "twlng" },
|
||||
{ PPC_INS_ALIAS_TDUI, "tdui" },
|
||||
{ PPC_INS_ALIAS_TDU, "tdu" },
|
||||
{ PPC_INS_ALIAS_TWUI, "twui" },
|
||||
{ PPC_INS_ALIAS_TWU, "twu" },
|
||||
{ PPC_INS_ALIAS_PASTE_, "paste." },
|
||||
{ PPC_INS_ALIAS_QVFCLR, "qvfclr" },
|
||||
{ PPC_INS_ALIAS_QVFAND, "qvfand" },
|
||||
{ PPC_INS_ALIAS_QVFANDC, "qvfandc" },
|
||||
{ PPC_INS_ALIAS_QVFCTFB, "qvfctfb" },
|
||||
{ PPC_INS_ALIAS_QVFXOR, "qvfxor" },
|
||||
{ PPC_INS_ALIAS_QVFOR, "qvfor" },
|
||||
{ PPC_INS_ALIAS_QVFNOR, "qvfnor" },
|
||||
{ PPC_INS_ALIAS_QVFEQU, "qvfequ" },
|
||||
{ PPC_INS_ALIAS_QVFNOT, "qvfnot" },
|
||||
{ PPC_INS_ALIAS_QVFORC, "qvforc" },
|
||||
{ PPC_INS_ALIAS_QVFNAND, "qvfnand" },
|
||||
{ PPC_INS_ALIAS_QVFSET, "qvfset" },
|
32
thirdparty/capstone/arch/PowerPC/PPCGenCSFeatureName.inc
vendored
Normal file
32
thirdparty/capstone/arch/PowerPC/PPCGenCSFeatureName.inc
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
|
||||
/* Rot127 <unisono@quyllur.org> 2022-2023 */
|
||||
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
|
||||
|
||||
/* LLVM-commit: 464bda7750a3ba9e23823fc707d7e7b6fc38438d */
|
||||
/* LLVM-tag: llvmorg-16.0.2-5-g464bda7750a3 */
|
||||
|
||||
/* Do not edit. */
|
||||
|
||||
/* Capstone's LLVM TableGen Backends: */
|
||||
/* https://github.com/capstone-engine/llvm-capstone */
|
||||
|
||||
{ PPC_FEATURE_IsNotISAFuture, "IsNotISAFuture" },
|
||||
{ PPC_FEATURE_IsISA3_0, "IsISA3_0" },
|
||||
{ PPC_FEATURE_In64BitMode, "In64BitMode" },
|
||||
{ PPC_FEATURE_In32BitMode, "In32BitMode" },
|
||||
{ PPC_FEATURE_PCRelativeMemops, "PCRelativeMemops" },
|
||||
{ PPC_FEATURE_HasBPERMD, "HasBPERMD" },
|
||||
{ PPC_FEATURE_HasSPE, "HasSPE" },
|
||||
{ PPC_FEATURE_IsE500, "IsE500" },
|
||||
{ PPC_FEATURE_IsPPC4xx, "IsPPC4xx" },
|
||||
{ PPC_FEATURE_HasExtDiv, "HasExtDiv" },
|
||||
{ PPC_FEATURE_IsISAFuture, "IsISAFuture" },
|
||||
{ PPC_FEATURE_HasFPU, "HasFPU" },
|
||||
{ PPC_FEATURE_HasICBT, "HasICBT" },
|
||||
{ PPC_FEATURE_HasPartwordAtomics, "HasPartwordAtomics" },
|
||||
{ PPC_FEATURE_IsISA2_06, "IsISA2_06" },
|
||||
{ PPC_FEATURE_IsBookE, "IsBookE" },
|
||||
{ PPC_FEATURE_HasPS, "HasPS" },
|
||||
{ PPC_FEATURE_HasQPX, "HasQPX" },
|
||||
{ PPC_FEATURE_IsPPC6xx, "IsPPC6xx" },
|
19827
thirdparty/capstone/arch/PowerPC/PPCGenCSMappingInsn.inc
vendored
Normal file
19827
thirdparty/capstone/arch/PowerPC/PPCGenCSMappingInsn.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1664
thirdparty/capstone/arch/PowerPC/PPCGenCSMappingInsnName.inc
vendored
Normal file
1664
thirdparty/capstone/arch/PowerPC/PPCGenCSMappingInsnName.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
15990
thirdparty/capstone/arch/PowerPC/PPCGenCSMappingInsnOp.inc
vendored
Normal file
15990
thirdparty/capstone/arch/PowerPC/PPCGenCSMappingInsnOp.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
42
thirdparty/capstone/arch/PowerPC/PPCGenCSOpGroup.inc
vendored
Normal file
42
thirdparty/capstone/arch/PowerPC/PPCGenCSOpGroup.inc
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
/* Capstone Disassembly Engine, https://www.capstone-engine.org */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
|
||||
/* Rot127 <unisono@quyllur.org> 2022-2023 */
|
||||
/* 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 */
|
||||
|
||||
PPC_OP_GROUP_S12ImmOperand = 0,
|
||||
PPC_OP_GROUP_Operand = 1,
|
||||
PPC_OP_GROUP_MemRegReg = 2,
|
||||
PPC_OP_GROUP_U6ImmOperand = 3,
|
||||
PPC_OP_GROUP_U5ImmOperand = 4,
|
||||
PPC_OP_GROUP_MemRegImm = 5,
|
||||
PPC_OP_GROUP_S16ImmOperand = 6,
|
||||
PPC_OP_GROUP_U2ImmOperand = 7,
|
||||
PPC_OP_GROUP_U16ImmOperand = 8,
|
||||
PPC_OP_GROUP_BranchOperand = 9,
|
||||
PPC_OP_GROUP_AbsBranchOperand = 10,
|
||||
PPC_OP_GROUP_PredicateOperand = 11,
|
||||
PPC_OP_GROUP_U1ImmOperand = 12,
|
||||
PPC_OP_GROUP_TLSCall = 13,
|
||||
PPC_OP_GROUP_U3ImmOperand = 14,
|
||||
PPC_OP_GROUP_S5ImmOperand = 15,
|
||||
PPC_OP_GROUP_MemRegImmHash = 16,
|
||||
PPC_OP_GROUP_U4ImmOperand = 17,
|
||||
PPC_OP_GROUP_U10ImmOperand = 18,
|
||||
PPC_OP_GROUP_crbitm = 19,
|
||||
PPC_OP_GROUP_S34ImmOperand = 20,
|
||||
PPC_OP_GROUP_ImmZeroOperand = 21,
|
||||
PPC_OP_GROUP_MemRegImm34 = 22,
|
||||
PPC_OP_GROUP_MemRegImm34PCRel = 23,
|
||||
PPC_OP_GROUP_U8ImmOperand = 24,
|
||||
PPC_OP_GROUP_MemRegImmPS = 25,
|
||||
PPC_OP_GROUP_U12ImmOperand = 26,
|
||||
PPC_OP_GROUP_U7ImmOperand = 27,
|
||||
PPC_OP_GROUP_ATBitsAsHint = 28,
|
9858
thirdparty/capstone/arch/PowerPC/PPCGenDisassemblerTables.inc
vendored
Normal file
9858
thirdparty/capstone/arch/PowerPC/PPCGenDisassemblerTables.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
6570
thirdparty/capstone/arch/PowerPC/PPCGenInstrInfo.inc
vendored
Normal file
6570
thirdparty/capstone/arch/PowerPC/PPCGenInstrInfo.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2663
thirdparty/capstone/arch/PowerPC/PPCGenRegisterInfo.inc
vendored
Normal file
2663
thirdparty/capstone/arch/PowerPC/PPCGenRegisterInfo.inc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
134
thirdparty/capstone/arch/PowerPC/PPCGenSubtargetInfo.inc
vendored
Normal file
134
thirdparty/capstone/arch/PowerPC/PPCGenSubtargetInfo.inc
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
|
||||
/* Rot127 <unisono@quyllur.org> 2022-2023 */
|
||||
/* Automatically generated file by Capstone's LLVM TableGen Disassembler Backend. */
|
||||
|
||||
/* LLVM-commit: 464bda7750a3ba9e23823fc707d7e7b6fc38438d */
|
||||
/* LLVM-tag: llvmorg-16.0.2-5-g464bda7750a3 */
|
||||
|
||||
/* Do not edit. */
|
||||
|
||||
/* Capstone's LLVM TableGen Backends: */
|
||||
/* https://github.com/capstone-engine/llvm-capstone */
|
||||
|
||||
#ifdef GET_SUBTARGETINFO_ENUM
|
||||
#undef GET_SUBTARGETINFO_ENUM
|
||||
|
||||
enum {
|
||||
PPC_AIXOS = 0,
|
||||
PPC_DeprecatedDST = 1,
|
||||
PPC_Directive32 = 2,
|
||||
PPC_Directive64 = 3,
|
||||
PPC_Directive440 = 4,
|
||||
PPC_Directive601 = 5,
|
||||
PPC_Directive602 = 6,
|
||||
PPC_Directive603 = 7,
|
||||
PPC_Directive604 = 8,
|
||||
PPC_Directive620 = 9,
|
||||
PPC_Directive750 = 10,
|
||||
PPC_Directive970 = 11,
|
||||
PPC_Directive7400 = 12,
|
||||
PPC_DirectiveA2 = 13,
|
||||
PPC_DirectiveE500 = 14,
|
||||
PPC_DirectiveE500mc = 15,
|
||||
PPC_DirectiveE5500 = 16,
|
||||
PPC_DirectivePwr3 = 17,
|
||||
PPC_DirectivePwr4 = 18,
|
||||
PPC_DirectivePwr5 = 19,
|
||||
PPC_DirectivePwr5x = 20,
|
||||
PPC_DirectivePwr6 = 21,
|
||||
PPC_DirectivePwr6x = 22,
|
||||
PPC_DirectivePwr7 = 23,
|
||||
PPC_DirectivePwr8 = 24,
|
||||
PPC_DirectivePwr9 = 25,
|
||||
PPC_DirectivePwr10 = 26,
|
||||
PPC_DirectivePwrFuture = 27,
|
||||
PPC_Feature64Bit = 28,
|
||||
PPC_Feature64BitRegs = 29,
|
||||
PPC_FeatureAddLogicalFusion = 30,
|
||||
PPC_FeatureAddiLoadFusion = 31,
|
||||
PPC_FeatureAddisLoadFusion = 32,
|
||||
PPC_FeatureAltivec = 33,
|
||||
PPC_FeatureArithAddFusion = 34,
|
||||
PPC_FeatureBPERMD = 35,
|
||||
PPC_FeatureBack2BackFusion = 36,
|
||||
PPC_FeatureBookE = 37,
|
||||
PPC_FeatureCMPB = 38,
|
||||
PPC_FeatureCRBits = 39,
|
||||
PPC_FeatureCompareFusion = 40,
|
||||
PPC_FeatureDirectMove = 41,
|
||||
PPC_FeatureE500 = 42,
|
||||
PPC_FeatureEFPU2 = 43,
|
||||
PPC_FeatureExtDiv = 44,
|
||||
PPC_FeatureFCPSGN = 45,
|
||||
PPC_FeatureFPCVT = 46,
|
||||
PPC_FeatureFPRND = 47,
|
||||
PPC_FeatureFPU = 48,
|
||||
PPC_FeatureFRE = 49,
|
||||
PPC_FeatureFRES = 50,
|
||||
PPC_FeatureFRSQRTE = 51,
|
||||
PPC_FeatureFRSQRTES = 52,
|
||||
PPC_FeatureFSqrt = 53,
|
||||
PPC_FeatureFastMFLR = 54,
|
||||
PPC_FeatureFloat128 = 55,
|
||||
PPC_FeatureFusion = 56,
|
||||
PPC_FeatureHTM = 57,
|
||||
PPC_FeatureHardFloat = 58,
|
||||
PPC_FeatureICBT = 59,
|
||||
PPC_FeatureISA2_06 = 60,
|
||||
PPC_FeatureISA2_07 = 61,
|
||||
PPC_FeatureISA3_0 = 62,
|
||||
PPC_FeatureISA3_1 = 63,
|
||||
PPC_FeatureISAFuture = 64,
|
||||
PPC_FeatureISEL = 65,
|
||||
PPC_FeatureInvariantFunctionDescriptors = 66,
|
||||
PPC_FeatureLDBRX = 67,
|
||||
PPC_FeatureLFIWAX = 68,
|
||||
PPC_FeatureLogicalAddFusion = 69,
|
||||
PPC_FeatureLogicalFusion = 70,
|
||||
PPC_FeatureLongCall = 71,
|
||||
PPC_FeatureMFOCRF = 72,
|
||||
PPC_FeatureMFTB = 73,
|
||||
PPC_FeatureMMA = 74,
|
||||
PPC_FeatureMSYNC = 75,
|
||||
PPC_FeatureModernAIXAs = 76,
|
||||
PPC_FeatureP8Altivec = 77,
|
||||
PPC_FeatureP8Crypto = 78,
|
||||
PPC_FeatureP8Vector = 79,
|
||||
PPC_FeatureP9Altivec = 80,
|
||||
PPC_FeatureP9Vector = 81,
|
||||
PPC_FeatureP10Vector = 82,
|
||||
PPC_FeaturePCRelativeMemops = 83,
|
||||
PPC_FeaturePOPCNTD = 84,
|
||||
PPC_FeaturePPC4xx = 85,
|
||||
PPC_FeaturePPC6xx = 86,
|
||||
PPC_FeaturePPCPostRASched = 87,
|
||||
PPC_FeaturePPCPreRASched = 88,
|
||||
PPC_FeaturePS = 89,
|
||||
PPC_FeaturePairedVectorMemops = 90,
|
||||
PPC_FeaturePartwordAtomic = 91,
|
||||
PPC_FeaturePredictableSelectIsExpensive = 92,
|
||||
PPC_FeaturePrefixInstrs = 93,
|
||||
PPC_FeaturePrivileged = 94,
|
||||
PPC_FeatureQPX = 95,
|
||||
PPC_FeatureQuadwordAtomic = 96,
|
||||
PPC_FeatureROPProtect = 97,
|
||||
PPC_FeatureRecipPrec = 98,
|
||||
PPC_FeatureSPE = 99,
|
||||
PPC_FeatureSTFIWX = 100,
|
||||
PPC_FeatureSecurePlt = 101,
|
||||
PPC_FeatureSha3Fusion = 102,
|
||||
PPC_FeatureSlowPOPCNTD = 103,
|
||||
PPC_FeatureStoreFusion = 104,
|
||||
PPC_FeatureTwoConstNR = 105,
|
||||
PPC_FeatureUnalignedFloats = 106,
|
||||
PPC_FeatureVSX = 107,
|
||||
PPC_FeatureVectorsUseTwoUnits = 108,
|
||||
PPC_FeatureWideImmFusion = 109,
|
||||
PPC_FeatureZeroMoveFusion = 110,
|
||||
PPC_NumSubtargetFeatures = 111
|
||||
};
|
||||
#endif // GET_SUBTARGETINFO_ENUM
|
||||
|
||||
|
||||
|
755
thirdparty/capstone/arch/PowerPC/PPCInstPrinter.c
vendored
Normal file
755
thirdparty/capstone/arch/PowerPC/PPCInstPrinter.c
vendored
Normal file
@@ -0,0 +1,755 @@
|
||||
/* 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 */
|
||||
|
||||
//===-- PPCInstPrinter.cpp - Convert PPC 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 PPC MCInst to a .s file.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <capstone/platform.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../../LEB128.h"
|
||||
#include "../../Mapping.h"
|
||||
#include "../../MCInst.h"
|
||||
#include "../../MCInstPrinter.h"
|
||||
#include "../../MCInstrDesc.h"
|
||||
#include "../../MCRegisterInfo.h"
|
||||
#include "PPCInstrInfo.h"
|
||||
#include "PPCInstPrinter.h"
|
||||
#include "PPCLinkage.h"
|
||||
#include "PPCMCTargetDesc.h"
|
||||
#include "PPCMapping.h"
|
||||
#include "PPCPredicates.h"
|
||||
#include "PPCRegisterInfo.h"
|
||||
|
||||
#define CONCAT(a, b) CONCAT_(a, b)
|
||||
#define CONCAT_(a, b) a##_##b
|
||||
|
||||
#define DEBUG_TYPE "asm-printer"
|
||||
|
||||
// Static function declarations. These are functions which have the same identifiers
|
||||
// over all architectures. Therefor they need to be static.
|
||||
#ifndef CAPSTONE_DIET
|
||||
static void printCustomAliasOperand(MCInst *MI, uint64_t Address,
|
||||
unsigned OpIdx, unsigned PrintMethodIdx,
|
||||
SStream *O);
|
||||
#endif
|
||||
static void printOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
static void printPredicateOperand(MCInst *MI, unsigned OpNo, SStream *O,
|
||||
const char *Modifier);
|
||||
static void printInst(MCInst *MI, uint64_t Address, const char *Annot,
|
||||
SStream *O);
|
||||
|
||||
#define PRINT_ALIAS_INSTR
|
||||
#include "PPCGenAsmWriter.inc"
|
||||
|
||||
static void printInst(MCInst *MI, uint64_t Address, const char *Annot,
|
||||
SStream *O)
|
||||
{
|
||||
bool isAlias = false;
|
||||
bool useAliasDetails = false;
|
||||
// Customize printing of the addis instruction on AIX. When an operand is a
|
||||
// symbol reference, the instruction syntax is changed to look like a load
|
||||
// operation, i.e:
|
||||
// Transform: addis $rD, $rA, $src --> addis $rD, $src($rA).
|
||||
if (PPC_getFeatureBits(MI->csh->mode, PPC_FeatureModernAIXAs) &&
|
||||
(MCInst_getOpcode(MI) == PPC_ADDIS8 ||
|
||||
MCInst_getOpcode(MI) == PPC_ADDIS) &&
|
||||
MCOperand_isExpr(MCInst_getOperand(MI, (2)))) {
|
||||
SStream_concat0(O, "\taddis ");
|
||||
printOperand(MI, 0, O);
|
||||
SStream_concat0(O, ", ");
|
||||
printOperand(MI, 2, O);
|
||||
SStream_concat0(O, "(");
|
||||
printOperand(MI, 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the last operand is an expression with the variant kind
|
||||
// VK_PPC_PCREL_OPT. If this is the case then this is a linker optimization
|
||||
// relocation and the .reloc directive needs to be added.
|
||||
unsigned LastOp = MCInst_getNumOperands(MI) - 1;
|
||||
if (MCInst_getNumOperands(MI) > 1) {
|
||||
MCOperand *Operand = MCInst_getOperand(MI, (LastOp));
|
||||
if (MCOperand_isExpr(Operand)) {
|
||||
assert(0 && "Expressions not supported.");
|
||||
}
|
||||
}
|
||||
|
||||
// Check for slwi/srwi mnemonics.
|
||||
if (MCInst_getOpcode(MI) == PPC_RLWINM) {
|
||||
unsigned char SH = MCOperand_getImm(MCInst_getOperand(MI, (2)));
|
||||
unsigned char MB = MCOperand_getImm(MCInst_getOperand(MI, (3)));
|
||||
unsigned char ME = MCOperand_getImm(MCInst_getOperand(MI, (4)));
|
||||
bool useSubstituteMnemonic = false;
|
||||
if (SH <= 31 && MB == 0 && ME == (31 - SH)) {
|
||||
SStream_concat0(O, "slwi ");
|
||||
useSubstituteMnemonic = true;
|
||||
}
|
||||
if (SH <= 31 && MB == (32 - SH) && ME == 31) {
|
||||
SStream_concat0(O, "srwi ");
|
||||
useSubstituteMnemonic = true;
|
||||
SH = 32 - SH;
|
||||
}
|
||||
useAliasDetails |= map_use_alias_details(MI);
|
||||
map_set_fill_detail_ops(MI, useAliasDetails &&
|
||||
useSubstituteMnemonic);
|
||||
if (useSubstituteMnemonic) {
|
||||
isAlias |= true;
|
||||
MCInst_setIsAlias(MI, isAlias);
|
||||
|
||||
printOperand(MI, 0, O);
|
||||
SStream_concat0(O, ", ");
|
||||
printOperand(MI, 1, O);
|
||||
SStream_concat(O, "%s", ", ");
|
||||
printUInt32(O, (unsigned int)SH);
|
||||
PPC_insert_detail_op_imm_at(MI, 2, SH, CS_AC_READ);
|
||||
|
||||
if (useAliasDetails)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (MCInst_getOpcode(MI) == PPC_RLDICR ||
|
||||
MCInst_getOpcode(MI) == PPC_RLDICR_32) {
|
||||
unsigned char SH = MCOperand_getImm(MCInst_getOperand(MI, (2)));
|
||||
unsigned char ME = MCOperand_getImm(MCInst_getOperand(MI, (3)));
|
||||
|
||||
useAliasDetails |= map_use_alias_details(MI);
|
||||
map_set_fill_detail_ops(MI, useAliasDetails && 63 - SH == ME);
|
||||
// rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH
|
||||
if (63 - SH == ME) {
|
||||
isAlias |= true;
|
||||
MCInst_setIsAlias(MI, isAlias);
|
||||
SStream_concat0(O, "sldi ");
|
||||
printOperand(MI, 0, O);
|
||||
SStream_concat0(O, ", ");
|
||||
printOperand(MI, 1, O);
|
||||
SStream_concat(O, "%s", ", ");
|
||||
printUInt32(O, (unsigned int)SH);
|
||||
PPC_insert_detail_op_imm_at(MI, 2, SH, CS_AC_READ);
|
||||
|
||||
if (useAliasDetails)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// dcbt[st] is printed manually here because:
|
||||
// 1. The assembly syntax is different between embedded and server targets
|
||||
// 2. We must print the short mnemonics for TH == 0 because the
|
||||
// embedded/server syntax default will not be stable across assemblers
|
||||
// The syntax for dcbt is:
|
||||
// dcbt ra, rb, th [server]
|
||||
// dcbt th, ra, rb [embedded]
|
||||
// where th can be omitted when it is 0. dcbtst is the same.
|
||||
// On AIX, only emit the extended mnemonics for dcbt and dcbtst if
|
||||
// the "modern assembler" is available.
|
||||
if ((MCInst_getOpcode(MI) == PPC_DCBT ||
|
||||
MCInst_getOpcode(MI) == PPC_DCBTST) &&
|
||||
(!PPC_getFeatureBits(MI->csh->mode, PPC_FeatureModernAIXAs))) {
|
||||
unsigned char TH = MCOperand_getImm(MCInst_getOperand(MI, (0)));
|
||||
SStream_concat0(O, "\tdcbt");
|
||||
if (MCInst_getOpcode(MI) == PPC_DCBTST)
|
||||
SStream_concat0(O, "st");
|
||||
if (TH == 16)
|
||||
SStream_concat0(O, "t");
|
||||
SStream_concat0(O, " ");
|
||||
|
||||
bool IsBookE =
|
||||
PPC_getFeatureBits(MI->csh->mode, PPC_FeatureBookE);
|
||||
if (IsBookE && TH != 0 && TH != 16) {
|
||||
SStream_concat(O, "%s", (unsigned int)TH);
|
||||
SStream_concat0(O, ", ");
|
||||
PPC_set_detail_op_imm(MI, 0, TH);
|
||||
}
|
||||
set_mem_access(MI, true);
|
||||
printOperand(MI, 1, O);
|
||||
SStream_concat0(O, ", ");
|
||||
printOperand(MI, 2, O);
|
||||
set_mem_access(MI, false);
|
||||
|
||||
if (!IsBookE && TH != 0 && TH != 16) {
|
||||
SStream_concat(O, "%s", ", ");
|
||||
printUInt32(O, (unsigned int)TH);
|
||||
PPC_set_detail_op_imm(MI, 0, TH);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (MCInst_getOpcode(MI) == PPC_DCBF) {
|
||||
unsigned char L = MCOperand_getImm(MCInst_getOperand(MI, (0)));
|
||||
if (!L || L == 1 || L == 3 || L == 4 || L == 6) {
|
||||
SStream_concat0(O, "\tdcb");
|
||||
if (L != 6)
|
||||
SStream_concat0(O, "f");
|
||||
if (L == 1)
|
||||
SStream_concat0(O, "l");
|
||||
if (L == 3)
|
||||
SStream_concat0(O, "lp");
|
||||
if (L == 4)
|
||||
SStream_concat0(O, "ps");
|
||||
if (L == 6)
|
||||
SStream_concat0(O, "stps");
|
||||
SStream_concat0(O, " ");
|
||||
|
||||
printOperand(MI, 1, O);
|
||||
SStream_concat0(O, ", ");
|
||||
printOperand(MI, 2, O);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// isAlias/useAliasDetails could have been set before.
|
||||
useAliasDetails |= map_use_alias_details(MI);
|
||||
map_set_fill_detail_ops(MI, useAliasDetails);
|
||||
isAlias |= printAliasInstr(MI, Address, O);
|
||||
MCInst_setIsAlias(MI, isAlias);
|
||||
|
||||
if (!isAlias || !useAliasDetails) {
|
||||
map_set_fill_detail_ops(MI, true);
|
||||
if (isAlias)
|
||||
SStream_Close(O);
|
||||
printInstruction(MI, Address, O);
|
||||
if (isAlias)
|
||||
SStream_Open(O);
|
||||
}
|
||||
}
|
||||
|
||||
void printPredicateOperand(MCInst *MI, unsigned OpNo, SStream *O,
|
||||
const char *Modifier)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_PredicateOperand, OpNo, Modifier);
|
||||
unsigned Code = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
if (strcmp(Modifier, "cc") == 0) {
|
||||
switch ((PPC_Predicate)Code) {
|
||||
default:
|
||||
assert(0 && "Invalid predicate code");
|
||||
case PPC_PRED_LT_MINUS:
|
||||
case PPC_PRED_LT_PLUS:
|
||||
case PPC_PRED_LT:
|
||||
SStream_concat0(O, "lt");
|
||||
return;
|
||||
case PPC_PRED_LE_MINUS:
|
||||
case PPC_PRED_LE_PLUS:
|
||||
case PPC_PRED_LE:
|
||||
SStream_concat0(O, "le");
|
||||
return;
|
||||
case PPC_PRED_EQ_MINUS:
|
||||
case PPC_PRED_EQ_PLUS:
|
||||
case PPC_PRED_EQ:
|
||||
SStream_concat0(O, "eq");
|
||||
return;
|
||||
case PPC_PRED_GE_MINUS:
|
||||
case PPC_PRED_GE_PLUS:
|
||||
case PPC_PRED_GE:
|
||||
SStream_concat0(O, "ge");
|
||||
return;
|
||||
case PPC_PRED_GT_MINUS:
|
||||
case PPC_PRED_GT_PLUS:
|
||||
case PPC_PRED_GT:
|
||||
SStream_concat0(O, "gt");
|
||||
return;
|
||||
case PPC_PRED_NE_MINUS:
|
||||
case PPC_PRED_NE_PLUS:
|
||||
case PPC_PRED_NE:
|
||||
SStream_concat0(O, "ne");
|
||||
return;
|
||||
case PPC_PRED_UN_MINUS:
|
||||
case PPC_PRED_UN_PLUS:
|
||||
case PPC_PRED_UN:
|
||||
SStream_concat0(O, "un");
|
||||
return;
|
||||
case PPC_PRED_NU_MINUS:
|
||||
case PPC_PRED_NU_PLUS:
|
||||
case PPC_PRED_NU:
|
||||
SStream_concat0(O, "nu");
|
||||
return;
|
||||
case PPC_PRED_BIT_SET:
|
||||
case PPC_PRED_BIT_UNSET:
|
||||
assert(0 && "Invalid use of bit predicate code");
|
||||
}
|
||||
assert(0 && "Invalid predicate code");
|
||||
}
|
||||
|
||||
if (strcmp(Modifier, "pm") == 0) {
|
||||
switch ((PPC_Predicate)Code) {
|
||||
default:
|
||||
assert(0 && "Invalid predicate code");
|
||||
case PPC_PRED_LT:
|
||||
case PPC_PRED_LE:
|
||||
case PPC_PRED_EQ:
|
||||
case PPC_PRED_GE:
|
||||
case PPC_PRED_GT:
|
||||
case PPC_PRED_NE:
|
||||
case PPC_PRED_UN:
|
||||
case PPC_PRED_NU:
|
||||
return;
|
||||
case PPC_PRED_LT_MINUS:
|
||||
case PPC_PRED_LE_MINUS:
|
||||
case PPC_PRED_EQ_MINUS:
|
||||
case PPC_PRED_GE_MINUS:
|
||||
case PPC_PRED_GT_MINUS:
|
||||
case PPC_PRED_NE_MINUS:
|
||||
case PPC_PRED_UN_MINUS:
|
||||
case PPC_PRED_NU_MINUS:
|
||||
SStream_concat0(O, "-");
|
||||
return;
|
||||
case PPC_PRED_LT_PLUS:
|
||||
case PPC_PRED_LE_PLUS:
|
||||
case PPC_PRED_EQ_PLUS:
|
||||
case PPC_PRED_GE_PLUS:
|
||||
case PPC_PRED_GT_PLUS:
|
||||
case PPC_PRED_NE_PLUS:
|
||||
case PPC_PRED_UN_PLUS:
|
||||
case PPC_PRED_NU_PLUS:
|
||||
SStream_concat0(O, "+");
|
||||
return;
|
||||
case PPC_PRED_BIT_SET:
|
||||
case PPC_PRED_BIT_UNSET:
|
||||
assert(0 && "Invalid use of bit predicate code");
|
||||
}
|
||||
assert(0 && "Invalid predicate code");
|
||||
}
|
||||
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
}
|
||||
|
||||
void printATBitsAsHint(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_ATBitsAsHint, OpNo);
|
||||
unsigned Code = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
if (Code == 2)
|
||||
SStream_concat0(O, "-");
|
||||
else if (Code == 3)
|
||||
SStream_concat0(O, "+");
|
||||
}
|
||||
|
||||
void printU1ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U1ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU2ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U2ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU3ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U3ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU4ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U4ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printS5ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_S5ImmOperand, OpNo);
|
||||
int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
Value = SignExtend32((Value), 5);
|
||||
printInt32(O, (int)Value);
|
||||
}
|
||||
|
||||
void printImmZeroOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_ImmZeroOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU5ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U5ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU6ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U6ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU7ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U7ImmOperand, OpNo);
|
||||
unsigned int Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
// Operands of BUILD_VECTOR are signed and we use this to print operands
|
||||
// of XXSPLTIB which are unsigned. So we simply truncate to 8 bits and
|
||||
// print as unsigned.
|
||||
void printU8ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U8ImmOperand, OpNo);
|
||||
unsigned char Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
printUInt32(O, (unsigned int)Value);
|
||||
}
|
||||
|
||||
void printU10ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U10ImmOperand, OpNo);
|
||||
unsigned short Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned short)Value);
|
||||
}
|
||||
|
||||
void printU12ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U12ImmOperand, OpNo);
|
||||
unsigned short Value = MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printUInt32(O, (unsigned short)Value);
|
||||
}
|
||||
|
||||
void printS12ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_S12ImmOperand, OpNo);
|
||||
if (MCOperand_isImm(MCInst_getOperand(MI, OpNo))) {
|
||||
int Imm = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
|
||||
Imm = SignExtend32(Imm, 12);
|
||||
printInt32(O, Imm);
|
||||
} else
|
||||
printOperand(MI, OpNo, O);
|
||||
}
|
||||
|
||||
void printMemRegImmPS(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
set_mem_access(MI, true);
|
||||
|
||||
printS12ImmOperand(MI, OpNo, O);
|
||||
SStream_concat0(O, "(");
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
void printS16ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_S16ImmOperand, OpNo);
|
||||
if (MCOperand_isImm(MCInst_getOperand(MI, (OpNo))))
|
||||
printInt32(O, (short)MCOperand_getImm(
|
||||
MCInst_getOperand(MI, (OpNo))));
|
||||
else
|
||||
printOperand(MI, OpNo, O);
|
||||
}
|
||||
|
||||
void printS34ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_S34ImmOperand, OpNo);
|
||||
if (MCOperand_isImm(MCInst_getOperand(MI, (OpNo)))) {
|
||||
long long Value =
|
||||
MCOperand_getImm(MCInst_getOperand(MI, (OpNo)));
|
||||
|
||||
printInt64(O, (long long)Value);
|
||||
} else
|
||||
printOperand(MI, OpNo, O);
|
||||
}
|
||||
|
||||
void printU16ImmOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_U16ImmOperand, OpNo);
|
||||
if (MCOperand_isImm(MCInst_getOperand(MI, (OpNo))))
|
||||
printUInt32(O, (unsigned short)MCOperand_getImm(
|
||||
MCInst_getOperand(MI, (OpNo))));
|
||||
else
|
||||
printOperand(MI, OpNo, O);
|
||||
}
|
||||
|
||||
void printBranchOperand(MCInst *MI, uint64_t Address, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_BranchOperand, OpNo);
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, (OpNo)))) {
|
||||
printOperand(MI, OpNo, O);
|
||||
return;
|
||||
}
|
||||
int32_t Imm = SignExtend32(
|
||||
((unsigned)MCOperand_getImm(MCInst_getOperand(MI, (OpNo)))
|
||||
<< 2),
|
||||
32);
|
||||
if (!MI->csh->PrintBranchImmNotAsAddress) {
|
||||
uint64_t Target = Address + Imm;
|
||||
if (!IS_64BIT(MI->csh->mode))
|
||||
Target &= 0xffffffff;
|
||||
printUInt64(O, (Target));
|
||||
} else {
|
||||
// Branches can take an immediate operand. This is used by the branch
|
||||
// selection pass to print, for example `.+8` (for ELF) or `$+8` (for
|
||||
// AIX) to express an eight byte displacement from the program counter.
|
||||
if (!PPC_getFeatureBits(MI->csh->mode, PPC_FeatureModernAIXAs))
|
||||
SStream_concat0(O, ".");
|
||||
else
|
||||
SStream_concat0(O, "$");
|
||||
|
||||
if (Imm >= 0)
|
||||
SStream_concat0(O, "+");
|
||||
printInt32(O, Imm);
|
||||
}
|
||||
}
|
||||
|
||||
void printAbsBranchOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_AbsBranchOperand, OpNo);
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, (OpNo)))) {
|
||||
printOperand(MI, OpNo, O);
|
||||
return;
|
||||
}
|
||||
|
||||
printInt32(O, SignExtend32(((unsigned)MCOperand_getImm(
|
||||
MCInst_getOperand(MI, (OpNo)))
|
||||
<< 2),
|
||||
32));
|
||||
}
|
||||
|
||||
void printcrbitm(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_crbitm, OpNo);
|
||||
unsigned CCReg = MCOperand_getReg(MCInst_getOperand(MI, (OpNo)));
|
||||
unsigned RegNo;
|
||||
switch (CCReg) {
|
||||
default:
|
||||
assert(0 && "Unknown CR register");
|
||||
case PPC_CR0:
|
||||
RegNo = 0;
|
||||
break;
|
||||
case PPC_CR1:
|
||||
RegNo = 1;
|
||||
break;
|
||||
case PPC_CR2:
|
||||
RegNo = 2;
|
||||
break;
|
||||
case PPC_CR3:
|
||||
RegNo = 3;
|
||||
break;
|
||||
case PPC_CR4:
|
||||
RegNo = 4;
|
||||
break;
|
||||
case PPC_CR5:
|
||||
RegNo = 5;
|
||||
break;
|
||||
case PPC_CR6:
|
||||
RegNo = 6;
|
||||
break;
|
||||
case PPC_CR7:
|
||||
RegNo = 7;
|
||||
break;
|
||||
}
|
||||
printUInt32(O, (0x80 >> RegNo));
|
||||
}
|
||||
|
||||
void printMemRegImm(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
set_mem_access(MI, true);
|
||||
add_cs_detail(MI, PPC_OP_GROUP_MemRegImm, OpNo);
|
||||
printS16ImmOperand(MI, OpNo, O);
|
||||
SStream_concat0(O, "(");
|
||||
|
||||
if (MCOperand_getReg(MCInst_getOperand(MI, (OpNo + 1))) == PPC_R0)
|
||||
SStream_concat0(O, "0");
|
||||
else
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
void printMemRegImmHash(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
set_mem_access(MI, true);
|
||||
add_cs_detail(MI, PPC_OP_GROUP_MemRegImmHash, OpNo);
|
||||
printInt32(O, MCOperand_getImm(MCInst_getOperand(MI, (OpNo))));
|
||||
SStream_concat0(O, "(");
|
||||
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
void printMemRegImm34PCRel(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
set_mem_access(MI, true);
|
||||
add_cs_detail(MI, PPC_OP_GROUP_MemRegImm34PCRel, OpNo);
|
||||
printS34ImmOperand(MI, OpNo, O);
|
||||
SStream_concat0(O, "(");
|
||||
|
||||
printImmZeroOperand(MI, OpNo + 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
void printMemRegImm34(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
set_mem_access(MI, true);
|
||||
add_cs_detail(MI, PPC_OP_GROUP_MemRegImm34, OpNo);
|
||||
printS34ImmOperand(MI, OpNo, O);
|
||||
SStream_concat0(O, "(");
|
||||
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
void printMemRegReg(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
set_mem_access(MI, true);
|
||||
add_cs_detail(MI, PPC_OP_GROUP_MemRegReg, OpNo);
|
||||
// When used as the base register, r0 reads constant zero rather than
|
||||
// the value contained in the register. For this reason, the darwin
|
||||
// assembler requires that we print r0 as 0 (no r) when used as the base.
|
||||
if (MCOperand_getReg(MCInst_getOperand(MI, (OpNo))) == PPC_R0)
|
||||
SStream_concat0(O, "0");
|
||||
else
|
||||
printOperand(MI, OpNo, O);
|
||||
SStream_concat0(O, ", ");
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
void printTLSCall(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_TLSCall, OpNo);
|
||||
|
||||
// Expression logic removed.
|
||||
|
||||
set_mem_access(MI, true);
|
||||
SStream_concat0(O, "(");
|
||||
|
||||
printOperand(MI, OpNo + 1, O);
|
||||
SStream_concat0(O, ")");
|
||||
set_mem_access(MI, false);
|
||||
}
|
||||
|
||||
/// showRegistersWithPercentPrefix - Check if this register name should be
|
||||
/// printed with a percentage symbol as prefix.
|
||||
bool showRegistersWithPercentPrefix(const MCInst *MI, const char *RegName)
|
||||
{
|
||||
if ((MI->csh->syntax & CS_OPT_SYNTAX_NOREGNAME) ||
|
||||
!(MI->csh->syntax & CS_OPT_SYNTAX_PERCENT) ||
|
||||
PPC_getFeatureBits(MI->csh->mode, PPC_FeatureModernAIXAs))
|
||||
return false;
|
||||
|
||||
switch (RegName[0]) {
|
||||
default:
|
||||
return false;
|
||||
case 'r':
|
||||
case 'f':
|
||||
case 'q':
|
||||
case 'v':
|
||||
case 'c':
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// getVerboseConditionalRegName - This method expands the condition register
|
||||
/// when requested explicitly or targeting Darwin.
|
||||
const char *getVerboseConditionRegName(const MCInst *MI, unsigned RegNum,
|
||||
unsigned RegEncoding)
|
||||
{
|
||||
if (MI->csh->syntax & CS_OPT_SYNTAX_NOREGNAME)
|
||||
return NULL;
|
||||
if (RegNum < PPC_CR0EQ || RegNum > PPC_CR7UN)
|
||||
return NULL;
|
||||
const char *CRBits[] = {
|
||||
"lt", "gt", "eq", "un", "4*cr1+lt",
|
||||
"4*cr1+gt", "4*cr1+eq", "4*cr1+un", "4*cr2+lt", "4*cr2+gt",
|
||||
"4*cr2+eq", "4*cr2+un", "4*cr3+lt", "4*cr3+gt", "4*cr3+eq",
|
||||
"4*cr3+un", "4*cr4+lt", "4*cr4+gt", "4*cr4+eq", "4*cr4+un",
|
||||
"4*cr5+lt", "4*cr5+gt", "4*cr5+eq", "4*cr5+un", "4*cr6+lt",
|
||||
"4*cr6+gt", "4*cr6+eq", "4*cr6+un", "4*cr7+lt", "4*cr7+gt",
|
||||
"4*cr7+eq", "4*cr7+un"
|
||||
};
|
||||
return CRBits[RegEncoding];
|
||||
}
|
||||
|
||||
// showRegistersWithPrefix - This method determines whether registers
|
||||
// should be number-only or include the prefix.
|
||||
bool showRegistersWithPrefix(const MCInst *MI)
|
||||
{
|
||||
return !(MI->csh->syntax & CS_OPT_SYNTAX_NOREGNAME);
|
||||
}
|
||||
|
||||
void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
|
||||
{
|
||||
add_cs_detail(MI, PPC_OP_GROUP_Operand, OpNo);
|
||||
MCOperand *Op = MCInst_getOperand(MI, (OpNo));
|
||||
if (MCOperand_isReg(Op)) {
|
||||
unsigned Reg = MCOperand_getReg(Op);
|
||||
if (!MI->csh->ShowVSRNumsAsVR)
|
||||
Reg = PPCInstrInfo_getRegNumForOperand(
|
||||
&PPCInsts[MCInst_getOpcode(MI)], Reg, OpNo);
|
||||
|
||||
const char *RegName;
|
||||
RegName = getVerboseConditionRegName(
|
||||
MI, Reg, MI->MRI->RegEncodingTable[Reg]);
|
||||
if (RegName == NULL)
|
||||
RegName = getRegisterName(Reg);
|
||||
if (showRegistersWithPercentPrefix(MI, RegName))
|
||||
SStream_concat0(O, "%");
|
||||
if (!showRegistersWithPrefix(MI))
|
||||
RegName = PPCRegisterInfo_stripRegisterPrefix(RegName);
|
||||
|
||||
SStream_concat0(O, RegName);
|
||||
return;
|
||||
}
|
||||
|
||||
if (MCOperand_isImm(Op)) {
|
||||
printInt64(O, MCOperand_getImm(Op));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const char *PPC_LLVM_getRegisterName(unsigned RegNo)
|
||||
{
|
||||
return getRegisterName(RegNo);
|
||||
}
|
||||
|
||||
void PPC_LLVM_printInst(MCInst *MI, uint64_t Address, const char *Annot,
|
||||
SStream *O)
|
||||
{
|
||||
printInst(MI, Address, Annot, O);
|
||||
}
|
79
thirdparty/capstone/arch/PowerPC/PPCInstPrinter.h
vendored
Normal file
79
thirdparty/capstone/arch/PowerPC/PPCInstPrinter.h
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
/* 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 */
|
||||
|
||||
//===- PPCInstPrinter.h - Convert PPC MCInst to assembly syntax -*- 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 class prints an PPC MCInst to a .s file.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef CS_PPC_INSTPRINTER_H
|
||||
#define CS_PPC_INSTPRINTER_H
|
||||
|
||||
#include <capstone/platform.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../../LEB128.h"
|
||||
#include "../../MCDisassembler.h"
|
||||
#include "../../MCInst.h"
|
||||
#include "../../MCInstrDesc.h"
|
||||
#include "../../MCRegisterInfo.h"
|
||||
#include "../../SStream.h"
|
||||
#include "PPCMCTargetDesc.h"
|
||||
#define CONCAT(a, b) CONCAT_(a, b)
|
||||
#define CONCAT_(a, b) a##_##b
|
||||
|
||||
bool showRegistersWithPercentPrefix(const MCInst *MI, const char *RegName);
|
||||
bool showRegistersWithPrefix(const MCInst *MI);
|
||||
// Autogenerated by tblgen.
|
||||
void printATBitsAsHint(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU1ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU2ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU3ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU4ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printS5ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU5ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU6ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU7ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU8ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU10ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU12ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printS12ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printS16ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printS34ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printU16ImmOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printImmZeroOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printBranchOperand(MCInst *MI, uint64_t Address, unsigned OpNo,
|
||||
SStream *O);
|
||||
void printAbsBranchOperand(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printTLSCall(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printcrbitm(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printMemRegImm(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printMemRegImmPS(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printMemRegImmHash(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printMemRegImm34PCRel(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printMemRegImm34(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
void printMemRegReg(MCInst *MI, unsigned OpNo, SStream *O);
|
||||
;
|
||||
// end namespace llvm
|
||||
|
||||
#endif // CS_PPC_INSTPRINTER_H
|
53
thirdparty/capstone/arch/PowerPC/PPCInstrInfo.h
vendored
Normal file
53
thirdparty/capstone/arch/PowerPC/PPCInstrInfo.h
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
|
||||
/* By Rot127 <unisono@quyllur.org> 2022-2023 */
|
||||
|
||||
#ifndef CS_PPC_INSTRINFO_H
|
||||
#define CS_PPC_INSTRINFO_H
|
||||
|
||||
#include "PPCMCTargetDesc.h"
|
||||
|
||||
extern const MCInstrDesc PPCInsts[];
|
||||
|
||||
static bool isVFRegister(unsigned Reg)
|
||||
{
|
||||
return Reg >= PPC_VF0 && Reg <= PPC_VF31;
|
||||
}
|
||||
static bool isVRRegister(unsigned Reg)
|
||||
{
|
||||
return Reg >= PPC_V0 && Reg <= PPC_V31;
|
||||
}
|
||||
|
||||
/// getRegNumForOperand - some operands use different numbering schemes
|
||||
/// for the same registers. For example, a VSX instruction may have any of
|
||||
/// vs0-vs63 allocated whereas an Altivec instruction could only have
|
||||
/// vs32-vs63 allocated (numbered as v0-v31). This function returns the actual
|
||||
/// register number needed for the opcode/operand number combination.
|
||||
/// The operand number argument will be useful when we need to extend this
|
||||
/// to instructions that use both Altivec and VSX numbering (for different
|
||||
/// operands).
|
||||
static unsigned PPCInstrInfo_getRegNumForOperand(const MCInstrDesc *Desc,
|
||||
unsigned Reg, unsigned OpNo)
|
||||
{
|
||||
int16_t regClass = Desc->OpInfo[OpNo].RegClass;
|
||||
switch (regClass) {
|
||||
// We store F0-F31, VF0-VF31 in MCOperand and it should be F0-F31,
|
||||
// VSX32-VSX63 during encoding/disassembling
|
||||
case PPC_VSSRCRegClassID:
|
||||
case PPC_VSFRCRegClassID:
|
||||
if (isVFRegister(Reg))
|
||||
return PPC_VSX32 + (Reg - PPC_VF0);
|
||||
break;
|
||||
// We store VSL0-VSL31, V0-V31 in MCOperand and it should be VSL0-VSL31,
|
||||
// VSX32-VSX63 during encoding/disassembling
|
||||
case PPC_VSRCRegClassID:
|
||||
if (isVRRegister(Reg))
|
||||
return PPC_VSX32 + (Reg - PPC_V0);
|
||||
break;
|
||||
// Other RegClass doesn't need mapping
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return Reg;
|
||||
}
|
||||
|
||||
#endif // CS_PPC_INSTRINFO_H
|
22
thirdparty/capstone/arch/PowerPC/PPCLinkage.h
vendored
Normal file
22
thirdparty/capstone/arch/PowerPC/PPCLinkage.h
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
/* Capstone Disassembly Engine */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */
|
||||
|
||||
#ifndef CS_PPC_LINKAGE_H
|
||||
#define CS_PPC_LINKAGE_H
|
||||
|
||||
// Function definitions to call static LLVM functions.
|
||||
|
||||
#include "../../MCDisassembler.h"
|
||||
#include "../../MCInst.h"
|
||||
#include "../../MCRegisterInfo.h"
|
||||
#include "../../SStream.h"
|
||||
#include "capstone/capstone.h"
|
||||
|
||||
DecodeStatus PPC_LLVM_getInstruction(csh handle, const uint8_t *Bytes,
|
||||
size_t ByteLen, MCInst *MI, uint16_t *Size,
|
||||
uint64_t Address, void *Info);
|
||||
const char *PPC_LLVM_getRegisterName(unsigned RegNo);
|
||||
void PPC_LLVM_printInst(MCInst *MI, uint64_t Address, const char *Annot,
|
||||
SStream *O);
|
||||
|
||||
#endif // CS_PPC_LINKAGE_H
|
222
thirdparty/capstone/arch/PowerPC/PPCMCTargetDesc.h
vendored
Normal file
222
thirdparty/capstone/arch/PowerPC/PPCMCTargetDesc.h
vendored
Normal file
@@ -0,0 +1,222 @@
|
||||
/* 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 */
|
||||
|
||||
//===-- PPCMCTargetDesc.h - PowerPC 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 PowerPC specific target descriptions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef CS_PPC_MCTARGETDESC_H
|
||||
#define CS_PPC_MCTARGETDESC_H
|
||||
|
||||
// GCC #defines PPC on Linux but we use it as our namespace name
|
||||
#undef PPC
|
||||
|
||||
#include <capstone/platform.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.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
|
||||
|
||||
/// Returns true iff Val consists of one contiguous run of 1s with any number of
|
||||
/// 0s on either side. The 1s are allowed to wrap from LSB to MSB, so
|
||||
/// 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs. 0x0F0F0000 is not,
|
||||
/// since all 1s are not contiguous.
|
||||
static inline bool isRunOfOnes(unsigned Val, unsigned *MB, unsigned *ME)
|
||||
{
|
||||
if (!Val)
|
||||
return false;
|
||||
|
||||
if (isShiftedMask_32(Val)) {
|
||||
// look for the first non-zero bit
|
||||
*MB = countLeadingZeros(Val);
|
||||
// look for the first zero bit after the run of ones
|
||||
*ME = countLeadingZeros((Val - 1) ^ Val);
|
||||
return true;
|
||||
} else {
|
||||
Val = ~Val; // invert mask
|
||||
if (isShiftedMask_32(Val)) {
|
||||
// effectively look for the first zero bit
|
||||
*ME = countLeadingZeros(Val) - 1;
|
||||
// effectively look for the first one bit after the run of zeros
|
||||
*MB = countLeadingZeros((Val - 1) ^ Val) + 1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// no run present
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool isRunOfOnes64(uint64_t Val, unsigned *MB, unsigned *ME)
|
||||
{
|
||||
if (!Val)
|
||||
return false;
|
||||
|
||||
if (isShiftedMask_64(Val)) {
|
||||
// look for the first non-zero bit
|
||||
*MB = countLeadingZeros(Val);
|
||||
// look for the first zero bit after the run of ones
|
||||
*ME = countLeadingZeros((Val - 1) ^ Val);
|
||||
return true;
|
||||
} else {
|
||||
Val = ~Val; // invert mask
|
||||
if (isShiftedMask_64(Val)) {
|
||||
// effectively look for the first zero bit
|
||||
*ME = countLeadingZeros(Val) - 1;
|
||||
// effectively look for the first one bit after the run of zeros
|
||||
*MB = countLeadingZeros((Val - 1) ^ Val) + 1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// no run present
|
||||
return false;
|
||||
}
|
||||
|
||||
// end namespace llvm
|
||||
|
||||
// Generated files will use "namespace PPC". To avoid symbol clash,
|
||||
// undefine PPC here. PPC may be predefined on some hosts.
|
||||
#undef PPC
|
||||
|
||||
// Defines symbolic names for PowerPC registers. This defines a mapping from
|
||||
// register name to register number.
|
||||
//
|
||||
#define GET_REGINFO_ENUM
|
||||
#include "PPCGenRegisterInfo.inc"
|
||||
|
||||
// Defines symbolic names for the PowerPC instructions.
|
||||
//
|
||||
#define GET_INSTRINFO_ENUM
|
||||
#define GET_INSTRINFO_SCHED_ENUM
|
||||
#define GET_INSTRINFO_MC_HELPER_DECLS
|
||||
#define GET_INSTRINFO_MC_DESC
|
||||
#include "PPCGenInstrInfo.inc"
|
||||
|
||||
#define GET_SUBTARGETINFO_ENUM
|
||||
#include "PPCGenSubtargetInfo.inc"
|
||||
|
||||
#define PPC_REGS0_7(X) \
|
||||
{ \
|
||||
X##0, X##1, X##2, X##3, X##4, X##5, X##6, X##7 \
|
||||
}
|
||||
|
||||
#define PPC_REGS0_31(X) \
|
||||
{ \
|
||||
X##0, X##1, X##2, X##3, X##4, X##5, X##6, X##7, X##8, X##9, \
|
||||
X##10, X##11, X##12, X##13, X##14, X##15, X##16, \
|
||||
X##17, X##18, X##19, X##20, X##21, X##22, X##23, \
|
||||
X##24, X##25, X##26, X##27, X##28, X##29, X##30, X##31 \
|
||||
}
|
||||
|
||||
#define PPC_REGS0_63(X) \
|
||||
{ \
|
||||
X##0, X##1, X##2, X##3, X##4, X##5, X##6, X##7, X##8, X##9, \
|
||||
X##10, X##11, X##12, X##13, X##14, X##15, X##16, \
|
||||
X##17, X##18, X##19, X##20, X##21, X##22, X##23, \
|
||||
X##24, X##25, X##26, X##27, X##28, X##29, X##30, \
|
||||
X##31, X##32, X##33, X##34, X##35, X##36, X##37, \
|
||||
X##38, X##39, X##40, X##41, X##42, X##43, X##44, \
|
||||
X##45, X##46, X##47, X##48, X##49, X##50, X##51, \
|
||||
X##52, X##53, X##54, X##55, X##56, X##57, X##58, \
|
||||
X##59, X##60, X##61, X##62, X##63 \
|
||||
}
|
||||
|
||||
#define PPC_REGS_NO0_31(Z, X) \
|
||||
{ \
|
||||
Z, X##1, X##2, X##3, X##4, X##5, X##6, X##7, X##8, X##9, \
|
||||
X##10, X##11, X##12, X##13, X##14, X##15, X##16, \
|
||||
X##17, X##18, X##19, X##20, X##21, X##22, X##23, \
|
||||
X##24, X##25, X##26, X##27, X##28, X##29, X##30, X##31 \
|
||||
}
|
||||
|
||||
#define PPC_REGS_LO_HI(LO, HI) \
|
||||
{ \
|
||||
LO##0, LO##1, LO##2, LO##3, LO##4, LO##5, LO##6, LO##7, LO##8, \
|
||||
LO##9, LO##10, LO##11, LO##12, LO##13, LO##14, LO##15, \
|
||||
LO##16, LO##17, LO##18, LO##19, LO##20, LO##21, \
|
||||
LO##22, LO##23, LO##24, LO##25, LO##26, LO##27, \
|
||||
LO##28, LO##29, LO##30, LO##31, HI##0, HI##1, HI##2, \
|
||||
HI##3, HI##4, HI##5, HI##6, HI##7, HI##8, HI##9, \
|
||||
HI##10, HI##11, HI##12, HI##13, HI##14, HI##15, \
|
||||
HI##16, HI##17, HI##18, HI##19, HI##20, HI##21, \
|
||||
HI##22, HI##23, HI##24, HI##25, HI##26, HI##27, \
|
||||
HI##28, HI##29, HI##30, HI##31 \
|
||||
}
|
||||
|
||||
#define PPC_REGS0_7(X) \
|
||||
{ \
|
||||
X##0, X##1, X##2, X##3, X##4, X##5, X##6, X##7 \
|
||||
}
|
||||
|
||||
#define PPC_REGS0_3(X) \
|
||||
{ \
|
||||
X##0, X##1, X##2, X##3 \
|
||||
}
|
||||
|
||||
#define DEFINE_PPC_REGCLASSES \
|
||||
static const MCPhysReg RRegs[32] = PPC_REGS0_31(PPC_R); \
|
||||
static const MCPhysReg XRegs[32] = PPC_REGS0_31(PPC_X); \
|
||||
static const MCPhysReg FRegs[32] = PPC_REGS0_31(PPC_F); \
|
||||
static const MCPhysReg VSRpRegs[32] = PPC_REGS0_31(PPC_VSRp); \
|
||||
static const MCPhysReg SPERegs[32] = PPC_REGS0_31(PPC_S); \
|
||||
static const MCPhysReg VFRegs[32] = PPC_REGS0_31(PPC_VF); \
|
||||
static const MCPhysReg VRegs[32] = PPC_REGS0_31(PPC_V); \
|
||||
static const MCPhysReg RRegsNoR0[32] = \
|
||||
PPC_REGS_NO0_31(PPC_ZERO, PPC_R); \
|
||||
static const MCPhysReg XRegsNoX0[32] = \
|
||||
PPC_REGS_NO0_31(PPC_ZERO8, PPC_X); \
|
||||
static const MCPhysReg VSRegs[64] = PPC_REGS_LO_HI(PPC_VSL, PPC_V); \
|
||||
static const MCPhysReg VSFRegs[64] = PPC_REGS_LO_HI(PPC_F, PPC_VF); \
|
||||
static const MCPhysReg VSSRegs[64] = PPC_REGS_LO_HI(PPC_F, PPC_VF); \
|
||||
static const MCPhysReg CRBITRegs[32] = { \
|
||||
PPC_CR0LT, PPC_CR0GT, PPC_CR0EQ, PPC_CR0UN, PPC_CR1LT, \
|
||||
PPC_CR1GT, PPC_CR1EQ, PPC_CR1UN, PPC_CR2LT, PPC_CR2GT, \
|
||||
PPC_CR2EQ, PPC_CR2UN, PPC_CR3LT, PPC_CR3GT, PPC_CR3EQ, \
|
||||
PPC_CR3UN, PPC_CR4LT, PPC_CR4GT, PPC_CR4EQ, PPC_CR4UN, \
|
||||
PPC_CR5LT, PPC_CR5GT, PPC_CR5EQ, PPC_CR5UN, PPC_CR6LT, \
|
||||
PPC_CR6GT, PPC_CR6EQ, PPC_CR6UN, PPC_CR7LT, PPC_CR7GT, \
|
||||
PPC_CR7EQ, PPC_CR7UN \
|
||||
}; \
|
||||
static const MCPhysReg CRRegs[8] = PPC_REGS0_7(PPC_CR); \
|
||||
static const MCPhysReg ACCRegs[8] = PPC_REGS0_7(PPC_ACC); \
|
||||
static const MCPhysReg WACCRegs[8] = PPC_REGS0_7(PPC_WACC); \
|
||||
static const MCPhysReg WACC_HIRegs[8] = PPC_REGS0_7(PPC_WACC_HI); \
|
||||
static const MCPhysReg DMRROWpRegs[32] = PPC_REGS0_31(PPC_DMRROWp); \
|
||||
static const MCPhysReg DMRROWRegs[64] = PPC_REGS0_63(PPC_DMRROW); \
|
||||
static const MCPhysReg DMRRegs[8] = PPC_REGS0_7(PPC_DMR); \
|
||||
static const MCPhysReg DMRpRegs[4] = PPC_REGS0_3(PPC_DMRp);
|
||||
|
||||
static const MCPhysReg QFRegs[] = {
|
||||
PPC_QF0, PPC_QF1, PPC_QF2, PPC_QF3, PPC_QF4, PPC_QF5, PPC_QF6,
|
||||
PPC_QF7, PPC_QF8, PPC_QF9, PPC_QF10, PPC_QF11, PPC_QF12, PPC_QF13,
|
||||
PPC_QF14, PPC_QF15, PPC_QF16, PPC_QF17, PPC_QF18, PPC_QF19, PPC_QF20,
|
||||
PPC_QF21, PPC_QF22, PPC_QF23, PPC_QF24, PPC_QF25, PPC_QF26, PPC_QF27,
|
||||
PPC_QF28, PPC_QF29, PPC_QF30, PPC_QF31
|
||||
};
|
||||
|
||||
#endif // CS_PPC_MCTARGETDESC_H
|
651
thirdparty/capstone/arch/PowerPC/PPCMapping.c
vendored
Normal file
651
thirdparty/capstone/arch/PowerPC/PPCMapping.c
vendored
Normal file
@@ -0,0 +1,651 @@
|
||||
/* Capstone Disassembly Engine */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
|
||||
|
||||
#include "capstone/ppc.h"
|
||||
#ifdef CAPSTONE_HAS_POWERPC
|
||||
|
||||
#include <stdio.h> // debug
|
||||
#include <string.h>
|
||||
|
||||
#include "../../cs_simple_types.h"
|
||||
#include "../../Mapping.h"
|
||||
#include "../../MCDisassembler.h"
|
||||
#include "../../utils.h"
|
||||
|
||||
#include "PPCLinkage.h"
|
||||
#include "PPCMapping.h"
|
||||
#include "PPCMCTargetDesc.h"
|
||||
|
||||
#define GET_REGINFO_MC_DESC
|
||||
#include "PPCGenRegisterInfo.inc"
|
||||
|
||||
void PPC_init_mri(MCRegisterInfo *MRI)
|
||||
{
|
||||
MCRegisterInfo_InitMCRegisterInfo(MRI, PPCRegDesc, PPC_REG_ENDING, 0, 0,
|
||||
PPCMCRegisterClasses,
|
||||
ARR_SIZE(PPCMCRegisterClasses), 0, 0,
|
||||
PPCRegDiffLists, 0, PPCSubRegIdxLists,
|
||||
ARR_SIZE(PPCSubRegIdxLists),
|
||||
PPCRegEncodingTable);
|
||||
}
|
||||
|
||||
const char *PPC_reg_name(csh handle, unsigned int reg)
|
||||
{
|
||||
if (reg > PPC_REG_INVALID && reg < PPC_REG_ENDING)
|
||||
return PPC_LLVM_getRegisterName(reg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// given internal insn id, return public instruction info
|
||||
void PPC_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
|
||||
{
|
||||
// We do this after Instruction disassembly.
|
||||
}
|
||||
|
||||
#ifndef CAPSTONE_DIET
|
||||
|
||||
static const char *const insn_name_maps[] = {
|
||||
#include "PPCGenCSMappingInsnName.inc"
|
||||
};
|
||||
|
||||
static const name_map insn_alias_mnem_map[] = {
|
||||
#include "PPCGenCSAliasMnemMap.inc"
|
||||
{ PPC_INS_ALIAS_SLWI, "slwi" },
|
||||
{ PPC_INS_ALIAS_SRWI, "srwi" },
|
||||
{ PPC_INS_ALIAS_SLDI, "sldi" },
|
||||
{ PPC_INS_ALIAS_END, NULL },
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
const char *PPC_insn_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
if (id < PPC_INS_ALIAS_END && id > PPC_INS_ALIAS_BEGIN) {
|
||||
if (id - PPC_INS_ALIAS_BEGIN >= ARR_SIZE(insn_alias_mnem_map))
|
||||
return NULL;
|
||||
|
||||
return insn_alias_mnem_map[id - PPC_INS_ALIAS_BEGIN - 1].name;
|
||||
}
|
||||
if (id >= PPC_INS_ENDING)
|
||||
return NULL;
|
||||
|
||||
return insn_name_maps[id];
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef CAPSTONE_DIET
|
||||
static const name_map group_name_maps[] = {
|
||||
// generic groups
|
||||
{ PPC_GRP_INVALID, NULL },
|
||||
{ PPC_GRP_JUMP, "jump" },
|
||||
{ PPC_GRP_CALL, "call" },
|
||||
{ PPC_GRP_INT, "int" },
|
||||
{ PPC_GRP_PRIVILEGE, "privilege" },
|
||||
{ PPC_GRP_BRANCH_RELATIVE, "branch_relative" },
|
||||
|
||||
// architecture-specific groups
|
||||
#include "PPCGenCSFeatureName.inc"
|
||||
};
|
||||
#endif
|
||||
|
||||
const char *PPC_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
|
||||
}
|
||||
|
||||
const insn_map ppc_insns[] = {
|
||||
#include "PPCGenCSMappingInsn.inc"
|
||||
};
|
||||
|
||||
void PPC_check_updates_cr0(MCInst *MI)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
cs_detail *detail = get_detail(MI);
|
||||
for (int i = 0; i < detail->regs_write_count; ++i) {
|
||||
if (detail->regs_write[i] == 0)
|
||||
return;
|
||||
if (detail->regs_write[i] == PPC_REG_CR0) {
|
||||
PPC_get_detail(MI)->update_cr0 = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // CAPSTONE_DIET
|
||||
}
|
||||
|
||||
/// Parses and adds the branch predicate information and the BH field.
|
||||
static void PPC_add_branch_predicates(MCInst *MI, const uint8_t *Bytes,
|
||||
size_t BytesLen)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
#ifndef CAPSTONE_DIET
|
||||
assert(MI && Bytes);
|
||||
if (BytesLen < 4)
|
||||
return;
|
||||
|
||||
ppc_insn_form form = ppc_insns[MI->Opcode].suppl_info.ppc.form;
|
||||
bool b_form = ppc_is_b_form(form);
|
||||
if (!(b_form || form == PPC_INSN_FORM_XLFORM_2))
|
||||
return;
|
||||
|
||||
uint32_t Inst = readBytes32(MI, Bytes);
|
||||
|
||||
uint8_t bi = 0;
|
||||
if (b_form)
|
||||
bi = (Inst & PPC_INSN_FORM_B_BI_MASK) >> 16;
|
||||
else
|
||||
bi = (Inst & PPC_INSN_FORM_XL_BI_MASK) >> 16;
|
||||
|
||||
uint8_t bo = 0;
|
||||
if (b_form)
|
||||
bo = (Inst & PPC_INSN_FORM_B_BO_MASK) >> 21;
|
||||
else
|
||||
bo = (Inst & PPC_INSN_FORM_XL_BO_MASK) >> 21;
|
||||
|
||||
PPC_get_detail(MI)->bc.bo = bo;
|
||||
PPC_get_detail(MI)->bc.bi = bi;
|
||||
PPC_get_detail(MI)->bc.crX_bit = bi % 4;
|
||||
PPC_get_detail(MI)->bc.crX = PPC_REG_CR0 + (bi / 4);
|
||||
PPC_get_detail(MI)->bc.hint = PPC_get_hint(bo);
|
||||
PPC_get_detail(MI)->bc.pred_cr = PPC_get_branch_pred(bi, bo, true);
|
||||
PPC_get_detail(MI)->bc.pred_ctr = PPC_get_branch_pred(bi, bo, false);
|
||||
|
||||
if (ppc_is_b_form(form))
|
||||
return;
|
||||
|
||||
uint8_t bh = (Inst & PPC_INSN_FORM_XL_BH_MASK) >> 11;
|
||||
uint16_t xo = (Inst & PPC_INSN_FORM_XL_XO_MASK) >> 1;
|
||||
// Pre-defined values for XO fields (PowerISA v3.1B)
|
||||
uint16_t bcctr_xo_field = 528;
|
||||
uint16_t bctar_xo_field = 560;
|
||||
bool cond = (xo == bcctr_xo_field || xo == bctar_xo_field);
|
||||
switch (bh) {
|
||||
default:
|
||||
assert(0 && "Invalid BH value.");
|
||||
case 0:
|
||||
PPC_get_detail(MI)->bc.bh = cond ? PPC_BH_NO_SUBROUTINE_RET :
|
||||
PPC_BH_SUBROUTINE_RET;
|
||||
break;
|
||||
case 1:
|
||||
PPC_get_detail(MI)->bc.bh = cond ? PPC_BH_RESERVED :
|
||||
PPC_BH_NO_SUBROUTINE_RET;
|
||||
break;
|
||||
case 2:
|
||||
PPC_get_detail(MI)->bc.bh = PPC_BH_RESERVED;
|
||||
break;
|
||||
case 3:
|
||||
PPC_get_detail(MI)->bc.bh = PPC_BH_NOT_PREDICTABLE;
|
||||
break;
|
||||
}
|
||||
#endif // CAPSTONE_DIET
|
||||
}
|
||||
|
||||
void PPC_set_instr_map_data(MCInst *MI, const uint8_t *Bytes, size_t BytesLen)
|
||||
{
|
||||
map_cs_id(MI, ppc_insns, ARR_SIZE(ppc_insns));
|
||||
map_implicit_reads(MI, ppc_insns);
|
||||
map_implicit_writes(MI, ppc_insns);
|
||||
map_groups(MI, ppc_insns);
|
||||
PPC_add_branch_predicates(MI, Bytes, BytesLen);
|
||||
PPC_check_updates_cr0(MI);
|
||||
const ppc_suppl_info *suppl_info = map_get_suppl_info(MI, ppc_insns);
|
||||
if (suppl_info) {
|
||||
PPC_get_detail(MI)->format = suppl_info->form;
|
||||
}
|
||||
}
|
||||
|
||||
/// Initialize PPCs detail.
|
||||
void PPC_init_cs_detail(MCInst *MI)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
memset(get_detail(MI), 0, offsetof(cs_detail, ppc) + sizeof(cs_ppc));
|
||||
PPC_get_detail(MI)->bc.bi = UINT8_MAX;
|
||||
PPC_get_detail(MI)->bc.bo = UINT8_MAX;
|
||||
PPC_get_detail(MI)->bc.crX = PPC_REG_INVALID;
|
||||
PPC_get_detail(MI)->bc.crX_bit = PPC_BI_INVALID;
|
||||
PPC_get_detail(MI)->bc.pred_cr = PPC_PRED_INVALID;
|
||||
PPC_get_detail(MI)->bc.pred_ctr = PPC_PRED_INVALID;
|
||||
PPC_get_detail(MI)->bc.hint = PPC_BR_NOT_GIVEN;
|
||||
PPC_get_detail(MI)->bc.bh = PPC_BH_INVALID;
|
||||
}
|
||||
|
||||
void PPC_printer(MCInst *MI, SStream *O, void * /* MCRegisterInfo* */ info)
|
||||
{
|
||||
MI->MRI = (MCRegisterInfo *)info;
|
||||
MI->fillDetailOps = detail_is_set(MI);
|
||||
MI->flat_insn->usesAliasDetails = map_use_alias_details(MI);
|
||||
PPC_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));
|
||||
#endif
|
||||
}
|
||||
|
||||
bool PPC_getInstruction(csh handle, const uint8_t *bytes, size_t bytes_len,
|
||||
MCInst *instr, uint16_t *size, uint64_t address,
|
||||
void *info)
|
||||
{
|
||||
PPC_init_cs_detail(instr);
|
||||
DecodeStatus result = PPC_LLVM_getInstruction(
|
||||
handle, bytes, bytes_len, instr, size, address, info);
|
||||
PPC_set_instr_map_data(instr, bytes, bytes_len);
|
||||
return result != MCDisassembler_Fail;
|
||||
}
|
||||
|
||||
bool PPC_getFeatureBits(unsigned int mode, unsigned int feature)
|
||||
{
|
||||
if ((feature == PPC_FeatureQPX) && (mode & CS_MODE_QPX) == 0) {
|
||||
return false;
|
||||
} else if ((feature == PPC_FeatureSPE) && (mode & CS_MODE_SPE) == 0) {
|
||||
return false;
|
||||
} else if ((feature == PPC_FeatureBookE) &&
|
||||
(mode & CS_MODE_BOOKE) == 0) {
|
||||
return false;
|
||||
} else if ((feature == PPC_FeaturePS) && (mode & CS_MODE_PS) == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// No AIX support for now.
|
||||
if (feature == PPC_FeatureModernAIXAs || feature == PPC_AIXOS)
|
||||
return false;
|
||||
// TODO Make it optional
|
||||
if (feature == PPC_FeatureMSYNC)
|
||||
return false;
|
||||
|
||||
// By default support everything
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifndef CAPSTONE_DIET
|
||||
static const map_insn_ops insn_operands[] = {
|
||||
#include "PPCGenCSMappingInsnOp.inc"
|
||||
};
|
||||
#endif
|
||||
|
||||
/// @brief Handles memory operands.
|
||||
/// @param MI The MCInst.
|
||||
/// @param OpNum The operand index.
|
||||
static void handle_memory_operand(MCInst *MI, unsigned OpNum)
|
||||
{
|
||||
cs_op_type op_type = map_get_op_type(MI, OpNum) & ~CS_OP_MEM;
|
||||
|
||||
// If this is called from printOperand() we do not know if a
|
||||
// register is a base or an offset reg (imm is always disponent).
|
||||
// So we assume the base register is always added before the offset register
|
||||
// and set the flag appropriately.
|
||||
bool is_off_reg =
|
||||
((op_type == CS_OP_REG) &&
|
||||
PPC_get_detail_op(MI, 0)->mem.base != PPC_REG_INVALID);
|
||||
PPC_set_detail_op_mem(MI, OpNum, MCInst_getOpVal(MI, OpNum),
|
||||
is_off_reg);
|
||||
}
|
||||
|
||||
static void add_cs_detail_general(MCInst *MI, ppc_op_group op_group,
|
||||
unsigned OpNum)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
|
||||
switch (op_group) {
|
||||
default:
|
||||
printf("General operand group %d not handled!\n", op_group);
|
||||
return;
|
||||
case PPC_OP_GROUP_Operand: {
|
||||
cs_op_type op_type = map_get_op_type(MI, OpNum);
|
||||
|
||||
// Check for memory operands emitted via printOperand()
|
||||
if (doing_mem(MI) && !(op_type & CS_OP_MEM)) {
|
||||
// Close previous memory operand
|
||||
set_mem_access(MI, false);
|
||||
} else if (doing_mem(MI) || (op_type & CS_OP_MEM)) {
|
||||
// The memory operands use printOperand() to
|
||||
// emit their register and immediates.
|
||||
if (!doing_mem(MI))
|
||||
set_mem_access(MI, true);
|
||||
handle_memory_operand(MI, OpNum);
|
||||
return;
|
||||
}
|
||||
|
||||
assert((op_type & CS_OP_MEM) ==
|
||||
0); // doing_mem should have been true.
|
||||
|
||||
if (op_type == CS_OP_REG)
|
||||
PPC_set_detail_op_reg(MI, OpNum,
|
||||
MCInst_getOpVal(MI, OpNum));
|
||||
else if (op_type == CS_OP_IMM)
|
||||
PPC_set_detail_op_imm(MI, OpNum,
|
||||
MCInst_getOpVal(MI, OpNum));
|
||||
else
|
||||
assert(0 && "Operand type not handled.");
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_ImmZeroOperand:
|
||||
case PPC_OP_GROUP_U1ImmOperand:
|
||||
case PPC_OP_GROUP_U2ImmOperand:
|
||||
case PPC_OP_GROUP_U3ImmOperand:
|
||||
case PPC_OP_GROUP_U4ImmOperand:
|
||||
case PPC_OP_GROUP_U5ImmOperand:
|
||||
case PPC_OP_GROUP_U6ImmOperand:
|
||||
case PPC_OP_GROUP_U7ImmOperand:
|
||||
case PPC_OP_GROUP_U8ImmOperand:
|
||||
case PPC_OP_GROUP_U10ImmOperand:
|
||||
case PPC_OP_GROUP_U12ImmOperand:
|
||||
PPC_set_detail_op_imm(MI, OpNum,
|
||||
(uint32_t)MCInst_getOpVal(MI, OpNum));
|
||||
break;
|
||||
case PPC_OP_GROUP_U16ImmOperand:
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, OpNum)))
|
||||
// Handled in printOperand()
|
||||
return;
|
||||
PPC_set_detail_op_imm(MI, OpNum,
|
||||
(uint32_t)MCInst_getOpVal(MI, OpNum));
|
||||
break;
|
||||
case PPC_OP_GROUP_S5ImmOperand: {
|
||||
int Imm = MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
|
||||
Imm = SignExtend32((Imm), 5);
|
||||
PPC_set_detail_op_imm(MI, OpNum, Imm);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_S12ImmOperand: {
|
||||
int64_t Imm = SignExtend64(
|
||||
MCOperand_getImm(MCInst_getOperand(MI, (OpNum))), 12);
|
||||
if (doing_mem(MI)) {
|
||||
PPC_set_detail_op_mem(MI, OpNum, Imm, true);
|
||||
break;
|
||||
}
|
||||
PPC_set_detail_op_imm(MI, OpNum, Imm);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_S16ImmOperand: {
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, OpNum)))
|
||||
// Handled in printOperand()
|
||||
return;
|
||||
int16_t Imm = MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
|
||||
if (doing_mem(MI)) {
|
||||
PPC_set_detail_op_mem(MI, OpNum, Imm, true);
|
||||
break;
|
||||
}
|
||||
PPC_set_detail_op_imm(MI, OpNum, Imm);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_S34ImmOperand: {
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, OpNum)))
|
||||
// Handled in printOperand()
|
||||
return;
|
||||
int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
|
||||
if (doing_mem(MI)) {
|
||||
PPC_set_detail_op_mem(MI, OpNum, Imm, true);
|
||||
break;
|
||||
}
|
||||
PPC_set_detail_op_imm(MI, OpNum, Imm);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_ATBitsAsHint: {
|
||||
PPC_get_detail(MI)->bc.hint =
|
||||
(ppc_br_hint)MCInst_getOpVal(MI, OpNum);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_AbsBranchOperand: {
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, OpNum)))
|
||||
// Handled in printOperand()
|
||||
return;
|
||||
unsigned Val = MCInst_getOpVal(MI, OpNum) << 2;
|
||||
int32_t Imm = SignExtend32(Val, 32);
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_IMM;
|
||||
PPC_get_detail_op(MI, 0)->imm = Imm;
|
||||
PPC_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
|
||||
PPC_inc_op_count(MI);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_TLSCall:
|
||||
// Handled in PPCInstPrinter and printOperand.
|
||||
return;
|
||||
case PPC_OP_GROUP_crbitm: {
|
||||
unsigned CCReg = MCInst_getOpVal(MI, OpNum);
|
||||
PPC_set_detail_op_reg(MI, OpNum, CCReg);
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_BranchOperand: {
|
||||
if (!MCOperand_isImm(MCInst_getOperand(MI, (OpNum))))
|
||||
// Handled in printOperand()
|
||||
return;
|
||||
int32_t Imm = SignExtend32(
|
||||
((unsigned)MCInst_getOpVal(MI, (OpNum)) << 2), 32);
|
||||
uint64_t Address = MI->address + Imm;
|
||||
if (IS_32BIT(MI->csh->mode))
|
||||
Address &= 0xffffffff;
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_IMM;
|
||||
PPC_get_detail_op(MI, 0)->imm = Address;
|
||||
PPC_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
|
||||
PPC_inc_op_count(MI);
|
||||
break;
|
||||
}
|
||||
// Memory operands have their `set_mem_access()` calls
|
||||
// in PPCInstPrinter.
|
||||
case PPC_OP_GROUP_MemRegImm:
|
||||
case PPC_OP_GROUP_MemRegReg: {
|
||||
// These cases print 0 if the base register is R0.
|
||||
// So no printOperand() function is called.
|
||||
// We must handle the zero case here.
|
||||
unsigned OpNumReg = 0;
|
||||
if (op_group == PPC_OP_GROUP_MemRegImm)
|
||||
OpNumReg = OpNum + 1;
|
||||
else
|
||||
OpNumReg = OpNum;
|
||||
|
||||
MCOperand *Op = MCInst_getOperand(MI, OpNumReg);
|
||||
if (MCOperand_isReg(Op) && MCOperand_getReg(Op) == PPC_R0) {
|
||||
PPC_get_detail_op(MI, 0)->mem.base = PPC_REG_ZERO;
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_MEM;
|
||||
PPC_get_detail_op(MI, 0)->access =
|
||||
map_get_op_access(MI, OpNum);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PPC_OP_GROUP_MemRegImmHash:
|
||||
case PPC_OP_GROUP_MemRegImm34:
|
||||
case PPC_OP_GROUP_MemRegImm34PCRel:
|
||||
// Handled in other printOperand functions.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// Fills cs_detail with the data of the operand.
|
||||
/// Calls to this function should not be added by hand! Please checkout the
|
||||
/// patch `AddCSDetail` of the CppTranslator.
|
||||
void PPC_add_cs_detail(MCInst *MI, ppc_op_group op_group, va_list args)
|
||||
{
|
||||
if (!detail_is_set(MI) || !map_fill_detail_ops(MI))
|
||||
return;
|
||||
|
||||
switch (op_group) {
|
||||
default:
|
||||
printf("Operand group %d not handled!\n", op_group);
|
||||
return;
|
||||
case PPC_OP_GROUP_PredicateOperand: {
|
||||
unsigned OpNum = va_arg(args, unsigned);
|
||||
const char *Modifier = va_arg(args, const char *);
|
||||
if ((strcmp(Modifier, "cc") == 0) ||
|
||||
(strcmp(Modifier, "pm") == 0)) {
|
||||
unsigned Val = MCInst_getOpVal(MI, OpNum);
|
||||
unsigned bo = Val & 0x1f;
|
||||
unsigned bi = (Val & 0x1e0) >> 5;
|
||||
PPC_get_detail(MI)->bc.bo = bo;
|
||||
PPC_get_detail(MI)->bc.bi = bi;
|
||||
PPC_get_detail(MI)->bc.crX_bit = bi % 4;
|
||||
PPC_get_detail(MI)->bc.crX = PPC_REG_CR0 + (bi / 4);
|
||||
PPC_get_detail(MI)->bc.pred_cr =
|
||||
PPC_get_branch_pred(bi, bo, true);
|
||||
PPC_get_detail(MI)->bc.pred_ctr =
|
||||
PPC_get_branch_pred(bi, bo, false);
|
||||
PPC_get_detail(MI)->bc.hint = PPC_get_hint(bo);
|
||||
}
|
||||
return;
|
||||
}
|
||||
case PPC_OP_GROUP_S12ImmOperand:
|
||||
case PPC_OP_GROUP_Operand:
|
||||
case PPC_OP_GROUP_MemRegReg:
|
||||
case PPC_OP_GROUP_U6ImmOperand:
|
||||
case PPC_OP_GROUP_U5ImmOperand:
|
||||
case PPC_OP_GROUP_MemRegImm:
|
||||
case PPC_OP_GROUP_S16ImmOperand:
|
||||
case PPC_OP_GROUP_U2ImmOperand:
|
||||
case PPC_OP_GROUP_U16ImmOperand:
|
||||
case PPC_OP_GROUP_BranchOperand:
|
||||
case PPC_OP_GROUP_AbsBranchOperand:
|
||||
case PPC_OP_GROUP_U1ImmOperand:
|
||||
case PPC_OP_GROUP_TLSCall:
|
||||
case PPC_OP_GROUP_U3ImmOperand:
|
||||
case PPC_OP_GROUP_S5ImmOperand:
|
||||
case PPC_OP_GROUP_MemRegImmHash:
|
||||
case PPC_OP_GROUP_U4ImmOperand:
|
||||
case PPC_OP_GROUP_U10ImmOperand:
|
||||
case PPC_OP_GROUP_crbitm:
|
||||
case PPC_OP_GROUP_S34ImmOperand:
|
||||
case PPC_OP_GROUP_ImmZeroOperand:
|
||||
case PPC_OP_GROUP_MemRegImm34:
|
||||
case PPC_OP_GROUP_MemRegImm34PCRel:
|
||||
case PPC_OP_GROUP_U8ImmOperand:
|
||||
case PPC_OP_GROUP_U12ImmOperand:
|
||||
case PPC_OP_GROUP_U7ImmOperand:
|
||||
case PPC_OP_GROUP_ATBitsAsHint: {
|
||||
unsigned OpNum = va_arg(args, unsigned);
|
||||
add_cs_detail_general(MI, op_group, OpNum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PPC_set_detail_op_mem(MCInst *MI, unsigned OpNum, uint64_t Val,
|
||||
bool is_off_reg)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
|
||||
assert(map_get_op_type(MI, OpNum) & CS_OP_MEM);
|
||||
cs_op_type secondary_type = map_get_op_type(MI, OpNum) & ~CS_OP_MEM;
|
||||
|
||||
switch (secondary_type) {
|
||||
default:
|
||||
assert(0 && "Secondary type not supported yet.");
|
||||
case CS_OP_REG:
|
||||
if (is_off_reg) {
|
||||
PPC_get_detail_op(MI, 0)->mem.offset = Val;
|
||||
if (PPC_get_detail_op(MI, 0)->mem.base != PPC_REG_INVALID)
|
||||
set_mem_access(MI, false);
|
||||
} else {
|
||||
PPC_get_detail_op(MI, 0)->mem.base = Val;
|
||||
if (MCInst_opIsTying(MI, OpNum))
|
||||
map_add_implicit_write(MI, MCInst_getOpVal(MI, OpNum));
|
||||
}
|
||||
break;
|
||||
case CS_OP_IMM:
|
||||
PPC_get_detail_op(MI, 0)->mem.disp = Val;
|
||||
if (PPC_get_detail_op(MI, 0)->mem.base != PPC_REG_INVALID)
|
||||
set_mem_access(MI, false);
|
||||
break;
|
||||
}
|
||||
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_MEM;
|
||||
PPC_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
|
||||
}
|
||||
|
||||
/// Adds a register PPC operand at position OpNum and increases the op_count by
|
||||
/// one.
|
||||
void PPC_set_detail_op_reg(MCInst *MI, unsigned OpNum, ppc_reg Reg)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
assert(!(map_get_op_type(MI, OpNum) & CS_OP_MEM));
|
||||
assert(map_get_op_type(MI, OpNum) == CS_OP_REG);
|
||||
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_REG;
|
||||
PPC_get_detail_op(MI, 0)->reg = Reg;
|
||||
PPC_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
|
||||
PPC_inc_op_count(MI);
|
||||
}
|
||||
|
||||
/// Adds an immediate PPC operand at position OpNum and increases the op_count
|
||||
/// by one.
|
||||
void PPC_set_detail_op_imm(MCInst *MI, unsigned OpNum, int64_t Imm)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
assert(!(map_get_op_type(MI, OpNum) & CS_OP_MEM));
|
||||
assert(map_get_op_type(MI, OpNum) == CS_OP_IMM);
|
||||
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_IMM;
|
||||
PPC_get_detail_op(MI, 0)->imm = Imm;
|
||||
PPC_get_detail_op(MI, 0)->access = map_get_op_access(MI, OpNum);
|
||||
PPC_inc_op_count(MI);
|
||||
}
|
||||
|
||||
void PPC_set_mem_access(MCInst *MI, bool status)
|
||||
{
|
||||
if (!detail_is_set(MI))
|
||||
return;
|
||||
if ((!status && !doing_mem(MI)) || (status && doing_mem(MI)))
|
||||
return; // Nothing to do
|
||||
|
||||
set_doing_mem(MI, status);
|
||||
if (status) {
|
||||
PPC_get_detail_op(MI, 0)->type = PPC_OP_MEM;
|
||||
PPC_get_detail_op(MI, 0)->mem.base = PPC_REG_INVALID;
|
||||
PPC_get_detail_op(MI, 0)->mem.offset = PPC_REG_INVALID;
|
||||
PPC_get_detail_op(MI, 0)->mem.disp = 0;
|
||||
|
||||
#ifndef CAPSTONE_DIET
|
||||
uint8_t access =
|
||||
map_get_op_access(MI, PPC_get_detail(MI)->op_count);
|
||||
PPC_get_detail_op(MI, 0)->access = access;
|
||||
#endif
|
||||
} else {
|
||||
// done, select the next operand slot
|
||||
PPC_inc_op_count(MI);
|
||||
}
|
||||
}
|
||||
|
||||
void PPC_setup_op(cs_ppc_op *op)
|
||||
{
|
||||
memset(op, 0, sizeof(cs_ppc_op));
|
||||
op->type = PPC_OP_INVALID;
|
||||
}
|
||||
|
||||
/// Inserts a immediate to the detail operands at @index.
|
||||
/// Already present operands are moved.
|
||||
void PPC_insert_detail_op_imm_at(MCInst *MI, unsigned index, int64_t Val,
|
||||
cs_ac_type access)
|
||||
{
|
||||
if (!detail_is_set(MI) || !map_fill_detail_ops(MI))
|
||||
return;
|
||||
|
||||
assert(PPC_get_detail(MI)->op_count < PPC_NUM_OPS);
|
||||
|
||||
cs_ppc_op op;
|
||||
PPC_setup_op(&op);
|
||||
op.type = PPC_OP_IMM;
|
||||
op.imm = Val;
|
||||
op.access = access;
|
||||
|
||||
cs_ppc_op *ops = PPC_get_detail(MI)->operands;
|
||||
int i = PPC_get_detail(MI)->op_count - 1;
|
||||
for (; i >= index; --i) {
|
||||
ops[i + 1] = ops[i];
|
||||
if (i == index)
|
||||
break;
|
||||
}
|
||||
ops[index] = op;
|
||||
PPC_inc_op_count(MI);
|
||||
}
|
||||
|
||||
#endif
|
74
thirdparty/capstone/arch/PowerPC/PPCMapping.h
vendored
Normal file
74
thirdparty/capstone/arch/PowerPC/PPCMapping.h
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
/* Capstone Disassembly Engine */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
|
||||
|
||||
#ifndef CS_PPC_MAP_H
|
||||
#define CS_PPC_MAP_H
|
||||
|
||||
#include "../../cs_priv.h"
|
||||
#include "../../MCDisassembler.h"
|
||||
#include "capstone/capstone.h"
|
||||
|
||||
typedef enum {
|
||||
#include "PPCGenCSOpGroup.inc"
|
||||
} ppc_op_group;
|
||||
|
||||
void PPC_init_mri(MCRegisterInfo *MRI);
|
||||
|
||||
void PPC_init_cs_detail(MCInst *MI);
|
||||
|
||||
// return name of register in friendly string
|
||||
const char *PPC_reg_name(csh handle, unsigned int reg);
|
||||
|
||||
void PPC_printer(MCInst *MI, SStream *O, void * /* MCRegisterInfo* */ info);
|
||||
bool PPC_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 PPC_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id);
|
||||
|
||||
const char *PPC_insn_name(csh handle, unsigned int id);
|
||||
const char *PPC_group_name(csh handle, unsigned int id);
|
||||
|
||||
typedef struct {
|
||||
unsigned int id; // instruction id
|
||||
const char *mnem;
|
||||
} ppc_alias_id;
|
||||
|
||||
void PPC_set_mem_access(MCInst *MI, bool status);
|
||||
static inline void set_mem_access(MCInst *MI, bool status)
|
||||
{
|
||||
PPC_set_mem_access(MI, status);
|
||||
}
|
||||
|
||||
// map internal raw register to 'public' register
|
||||
ppc_reg PPC_map_register(unsigned int r);
|
||||
|
||||
bool PPC_getFeatureBits(unsigned int mode, unsigned int feature);
|
||||
|
||||
void PPC_add_cs_detail(MCInst *MI, ppc_op_group op_group, va_list args);
|
||||
|
||||
static inline void add_cs_detail(MCInst *MI, ppc_op_group op_group, ...)
|
||||
{
|
||||
if (!MI->flat_insn->detail)
|
||||
return;
|
||||
va_list args;
|
||||
va_start(args, op_group);
|
||||
PPC_add_cs_detail(MI, op_group, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void PPC_set_detail_op_reg(MCInst *MI, unsigned OpNum, ppc_reg Reg);
|
||||
void PPC_set_detail_op_imm(MCInst *MI, unsigned OpNum, int64_t Imm);
|
||||
void PPC_set_detail_op_mem(MCInst *MI, unsigned OpNum, uint64_t Val,
|
||||
bool is_off_reg);
|
||||
|
||||
void PPC_insert_detail_op_imm_at(MCInst *MI, unsigned index, int64_t Val,
|
||||
cs_ac_type access);
|
||||
|
||||
void PPC_setup_op(cs_ppc_op *op);
|
||||
|
||||
void PPC_check_updates_cr0(MCInst *MI);
|
||||
void PPC_set_instr_map_data(MCInst *MI, const uint8_t *Bytes, size_t BytesLen);
|
||||
|
||||
#endif
|
44
thirdparty/capstone/arch/PowerPC/PPCModule.c
vendored
Normal file
44
thirdparty/capstone/arch/PowerPC/PPCModule.c
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
/* Capstone Disassembly Engine */
|
||||
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
|
||||
|
||||
#ifdef CAPSTONE_HAS_POWERPC
|
||||
|
||||
#include "../../utils.h"
|
||||
#include "../../MCRegisterInfo.h"
|
||||
#include "PPCInstPrinter.h"
|
||||
#include "PPCMapping.h"
|
||||
#include "PPCModule.h"
|
||||
|
||||
cs_err PPC_global_init(cs_struct *ud)
|
||||
{
|
||||
MCRegisterInfo *mri;
|
||||
mri = (MCRegisterInfo *)cs_mem_malloc(sizeof(*mri));
|
||||
|
||||
PPC_init_mri(mri);
|
||||
ud->printer = PPC_printer;
|
||||
ud->printer_info = mri;
|
||||
ud->getinsn_info = mri;
|
||||
ud->disasm = PPC_getInstruction;
|
||||
ud->post_printer = NULL;
|
||||
|
||||
ud->reg_name = PPC_reg_name;
|
||||
ud->insn_id = PPC_get_insn_id;
|
||||
ud->insn_name = PPC_insn_name;
|
||||
ud->group_name = PPC_group_name;
|
||||
|
||||
return CS_ERR_OK;
|
||||
}
|
||||
|
||||
cs_err PPC_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;
|
||||
}
|
||||
|
||||
return CS_ERR_OK;
|
||||
}
|
||||
|
||||
#endif
|
12
thirdparty/capstone/arch/PowerPC/PPCModule.h
vendored
Normal file
12
thirdparty/capstone/arch/PowerPC/PPCModule.h
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/* Capstone Disassembly Engine */
|
||||
/* By Travis Finkenauer <tmfinken@gmail.com>, 2018 */
|
||||
|
||||
#ifndef CS_POWERPC_MODULE_H
|
||||
#define CS_POWERPC_MODULE_H
|
||||
|
||||
#include "../../utils.h"
|
||||
|
||||
cs_err PPC_global_init(cs_struct *ud);
|
||||
cs_err PPC_option(cs_struct *handle, cs_opt_type type, size_t value);
|
||||
|
||||
#endif
|
65
thirdparty/capstone/arch/PowerPC/PPCPredicates.h
vendored
Normal file
65
thirdparty/capstone/arch/PowerPC/PPCPredicates.h
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
/* 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 */
|
||||
|
||||
//===-- PPCPredicates.h - PPC Branch Predicate Information ------*- 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 describes the PowerPC branch predicates.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef CS_PPC_PREDICATES_H
|
||||
#define CS_PPC_PREDICATES_H
|
||||
|
||||
// GCC #defines PPC on Linux but we use it as our namespace name
|
||||
#include "capstone/ppc.h"
|
||||
#undef PPC
|
||||
|
||||
// Generated files will use "namespace PPC". To avoid symbol clash,
|
||||
// undefine PPC here. PPC may be predefined on some hosts.
|
||||
#undef PPC
|
||||
|
||||
// Predicates moved to ppc.h
|
||||
typedef ppc_pred PPC_Predicate;
|
||||
|
||||
/// Invert the specified predicate. != -> ==, < -> >=.
|
||||
PPC_Predicate InvertPredicate(PPC_Predicate Opcode);
|
||||
/// Assume the condition register is set by MI(a,b), return the predicate if
|
||||
/// we modify the instructions such that condition register is set by MI(b,a).
|
||||
PPC_Predicate getSwappedPredicate(PPC_Predicate Opcode);
|
||||
/// Return the condition without hint bits.
|
||||
static inline unsigned PPC_getPredicateCondition(PPC_Predicate Opcode)
|
||||
{
|
||||
return (unsigned)(Opcode & ~PPC_BR_HINT_MASK);
|
||||
}
|
||||
|
||||
/// Return the hint bits of the predicate.
|
||||
static inline unsigned PPC_getPredicateHint(PPC_Predicate Opcode)
|
||||
{
|
||||
return (unsigned)(Opcode & PPC_BR_HINT_MASK);
|
||||
}
|
||||
|
||||
/// Return predicate consisting of specified condition and hint bits.
|
||||
static inline PPC_Predicate PPC_getPredicate(unsigned Condition, unsigned Hint)
|
||||
{
|
||||
return (PPC_Predicate)((Condition & ~PPC_BR_HINT_MASK) |
|
||||
(Hint & PPC_BR_HINT_MASK));
|
||||
}
|
||||
|
||||
#endif // CS_PPC_PREDICATES_H
|
61
thirdparty/capstone/arch/PowerPC/PPCRegisterInfo.h
vendored
Normal file
61
thirdparty/capstone/arch/PowerPC/PPCRegisterInfo.h
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
|
||||
/* By Rot127 <unisono@quyllur.org> 2022-2023 */
|
||||
|
||||
#ifndef CS_PPC_REGISTERINFO_H
|
||||
#define CS_PPC_REGISTERINFO_H
|
||||
|
||||
#include "PPCMCTargetDesc.h"
|
||||
|
||||
/// stripRegisterPrefix - This method strips the character prefix from a
|
||||
/// register name so that only the number is left. Used by for linux asm.
|
||||
static const char *PPCRegisterInfo_stripRegisterPrefix(const char *RegName)
|
||||
{
|
||||
switch (RegName[0]) {
|
||||
case 'a':
|
||||
if (RegName[1] == 'c' && RegName[2] == 'c')
|
||||
return RegName + 3;
|
||||
break;
|
||||
case 'r':
|
||||
case 'f':
|
||||
case 'v':
|
||||
if (RegName[1] == 's') {
|
||||
if (RegName[2] == 'p')
|
||||
return RegName + 3;
|
||||
return RegName + 2;
|
||||
}
|
||||
return RegName + 1;
|
||||
case 'c':
|
||||
if (RegName[1] == 'r')
|
||||
return RegName + 2;
|
||||
break;
|
||||
case 'w':
|
||||
// For wacc and wacc_hi
|
||||
if (RegName[1] == 'a' && RegName[2] == 'c' &&
|
||||
RegName[3] == 'c') {
|
||||
if (RegName[4] == '_')
|
||||
return RegName + 7;
|
||||
else
|
||||
return RegName + 4;
|
||||
}
|
||||
break;
|
||||
case 'd':
|
||||
// For dmr, dmrp, dmrrow, dmrrowp
|
||||
if (RegName[1] == 'm' && RegName[2] == 'r') {
|
||||
if (RegName[3] == 'r' && RegName[4] == 'o' &&
|
||||
RegName[5] == 'w' && RegName[6] == 'p')
|
||||
return RegName + 7;
|
||||
else if (RegName[3] == 'r' && RegName[4] == 'o' &&
|
||||
RegName[5] == 'w')
|
||||
return RegName + 6;
|
||||
else if (RegName[3] == 'p')
|
||||
return RegName + 4;
|
||||
else
|
||||
return RegName + 3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return RegName;
|
||||
}
|
||||
|
||||
#endif // CS_PPC_REGISTERINFO_H
|
Reference in New Issue
Block a user