mirror of
https://github.com/radareorg/radare2.git
synced 2025-01-21 05:05:48 +00:00
Rename sysz to s390 and add the s390.gnu plugin from binutils 2.36 ##asm
This commit is contained in:
parent
a00b5d4a4d
commit
162e223028
5
dist/plugins-cfg/plugins.def.cfg
vendored
5
dist/plugins-cfg/plugins.def.cfg
vendored
@ -32,7 +32,7 @@ anal.ppc_gnu
|
||||
anal.sh
|
||||
anal.sparc_cs
|
||||
anal.sparc_gnu
|
||||
anal.sysz
|
||||
anal.s390_cs
|
||||
anal.tms320
|
||||
anal.tricore
|
||||
anal.v850
|
||||
@ -101,7 +101,8 @@ asm.sh
|
||||
asm.snes
|
||||
asm.sparc_cs
|
||||
asm.sparc_gnu
|
||||
asm.sysz
|
||||
asm.s390_gnu
|
||||
asm.s390_cs
|
||||
asm.tms320
|
||||
asm.v850
|
||||
asm.v850_gnu
|
||||
|
4
dist/plugins-cfg/plugins.nogpl.cfg
vendored
4
dist/plugins-cfg/plugins.nogpl.cfg
vendored
@ -19,7 +19,7 @@ anal.msp430
|
||||
anal.null
|
||||
anal.ppc_cs
|
||||
anal.sparc_cs
|
||||
anal.sysz
|
||||
anal.s390_cs
|
||||
anal.tms320
|
||||
anal.v850
|
||||
anal.ws
|
||||
@ -48,7 +48,7 @@ asm.mips_cs
|
||||
asm.msp430
|
||||
asm.ppc_cs
|
||||
asm.sparc_cs
|
||||
asm.sysz
|
||||
asm.s390_cs
|
||||
asm.tms320
|
||||
asm.v850
|
||||
asm.ws
|
||||
|
5
dist/plugins-cfg/plugins.static.cfg
vendored
5
dist/plugins-cfg/plugins.static.cfg
vendored
@ -23,7 +23,7 @@ anal.ppc_gnu
|
||||
anal.sh
|
||||
anal.sparc_cs
|
||||
anal.sparc_gnu
|
||||
anal.sysz
|
||||
anal.s390_cs
|
||||
anal.m680x_cs
|
||||
anal.ws
|
||||
anal.xap
|
||||
@ -67,7 +67,8 @@ asm.sh
|
||||
asm.snes
|
||||
asm.sparc_cs
|
||||
asm.sparc_gnu
|
||||
asm.sysz
|
||||
asm.s390_cs
|
||||
asm.s390_gnu
|
||||
asm.ws
|
||||
asm.xap
|
||||
asm.arm_as
|
||||
|
4
dist/plugins-cfg/plugins.static.nogpl.cfg
vendored
4
dist/plugins-cfg/plugins.static.nogpl.cfg
vendored
@ -21,7 +21,7 @@ anal.null
|
||||
anal.sh
|
||||
anal.sparc_cs
|
||||
anal.sparc_gnu
|
||||
anal.sysz
|
||||
anal.s390_cs
|
||||
anal.ws
|
||||
anal.xap
|
||||
anal.x86_cs
|
||||
@ -61,7 +61,7 @@ asm.sh
|
||||
asm.snes
|
||||
asm.sparc_cs
|
||||
asm.sparc_gnu
|
||||
asm.sysz
|
||||
asm.s390_cs
|
||||
asm.ws
|
||||
asm.xap
|
||||
asm.arm_as
|
||||
|
@ -32,7 +32,7 @@ F+= cc-xtensa-32
|
||||
F+= cc-riscv-64
|
||||
F+= cc-hexagon-32
|
||||
F+= cc-v850-32
|
||||
F+= cc-sysz-64
|
||||
F+= cc-s390-64
|
||||
|
||||
WIN_TYPES=
|
||||
WIN_TYPES+= bcrypt
|
||||
|
@ -11,7 +11,7 @@ sdb_files = [
|
||||
'cc-riscv-64',
|
||||
'cc-sparc-32',
|
||||
'cc-v850-32',
|
||||
'cc-sysz-64',
|
||||
'cc-s390-64',
|
||||
'cc-x86-16',
|
||||
'cc-x86-32',
|
||||
'cc-x86-64',
|
||||
|
@ -80,7 +80,7 @@ r_anal_sources = [
|
||||
'p/anal_snes.c',
|
||||
'p/anal_sparc_cs.c',
|
||||
'p/anal_sparc_gnu.c',
|
||||
'p/anal_sysz.c',
|
||||
'p/anal_s390_cs.c',
|
||||
'p/anal_tms320.c',
|
||||
'p/anal_tms320_c55x_plus.c',
|
||||
#'p/anal_tms320c64x.c',
|
||||
|
@ -12,7 +12,7 @@ all: ${ALL_TARGETS}
|
||||
|
||||
ALL_TARGETS=
|
||||
# TODO: rename to enabled plugins
|
||||
ARCHS=null.mk ppc_gnu.mk ppc_cs.mk arm_gnu.mk avr.mk xap.mk dalvik.mk sh.mk ebc.mk gb.mk malbolge.mk ws.mk h8300.mk cr16.mk v850.mk v850_gnu.mk msp430.mk sparc_gnu.mk sparc_cs.mk x86_cs.mk cris.mk 6502.mk snes.mk riscv.mk vax.mk xtensa.mk rsp.mk mcore.mk tricore.mk
|
||||
ARCHS=null.mk ppc_gnu.mk ppc_cs.mk arm_gnu.mk avr.mk xap.mk dalvik.mk sh.mk ebc.mk gb.mk malbolge.mk ws.mk h8300.mk cr16.mk v850.mk v850_gnu.mk msp430.mk sparc_gnu.mk sparc_cs.mk x86_cs.mk cris.mk 6502.mk snes.mk riscv.mk vax.mk xtensa.mk rsp.mk mcore.mk tricore.mk s390_cs.mk
|
||||
include $(ARCHS)
|
||||
|
||||
clean:
|
||||
|
@ -196,12 +196,12 @@ static int archinfo(RAnal *anal, int q) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
RAnalPlugin r_anal_plugin_sysz = {
|
||||
.name = "sysz",
|
||||
RAnalPlugin r_anal_plugin_s390_cs = {
|
||||
.name = "s390",
|
||||
.desc = "Capstone SystemZ microanalysis",
|
||||
.esil = false,
|
||||
.license = "BSD",
|
||||
.arch = "sysz",
|
||||
.arch = "s390",
|
||||
.bits = 32|64,
|
||||
.op = &analop,
|
||||
.archinfo = archinfo,
|
13
libr/anal/p/s390_cs.mk
Normal file
13
libr/anal/p/s390_cs.mk
Normal file
@ -0,0 +1,13 @@
|
||||
OBJ_ANAL_S390CS_CS=anal_s390_cs.o
|
||||
|
||||
include p/capstone.mk
|
||||
|
||||
STATIC_OBJ+=${OBJ_ANAL_S390CS_CS}
|
||||
|
||||
TARGET_ANAL_S390CS_CS=anal_s390_cs.${EXT_SO}
|
||||
|
||||
ALL_TARGETS+=${TARGET_ANAL_S390CS_CS}
|
||||
|
||||
${TARGET_ANAL_S390CS_CS}: ${OBJ_SYSTEMZ_CS}
|
||||
${CC} ${CFLAGS} $(call libname,anal_s390_cs) $(CS_LDFLAGS) \
|
||||
-o anal_s390_cs.${EXT_SO} ${OBJ_ANAL_S390CS_CS}
|
@ -1,13 +0,0 @@
|
||||
OBJ_SYSTEMZ_CS=anal_sysz.o
|
||||
|
||||
include p/capstone.mk
|
||||
|
||||
STATIC_OBJ+=${OBJ_SYSTEMZ_CS}
|
||||
|
||||
TARGET_SYSTEMZ_CS=anal_sysz.${EXT_SO}
|
||||
|
||||
ALL_TARGETS+=${TARGET_SYSTEMZ_CS}
|
||||
|
||||
${TARGET_SYSTEMZ_CS}: ${OBJ_SYSTEMZ_CS}
|
||||
${CC} ${CFLAGS} $(call libname,anal_sysz) $(CS_LDFLAGS) \
|
||||
-o anal_sysz.${EXT_SO} ${OBJ_SYSTEMZ_CS}
|
174
libr/asm/arch/include/opcode/s390.h
Normal file
174
libr/asm/arch/include/opcode/s390.h
Normal file
@ -0,0 +1,174 @@
|
||||
/* s390.h -- Header file for S390 opcode table
|
||||
Copyright (C) 2000-2021 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
02110-1301, USA. */
|
||||
|
||||
#ifndef S390_H
|
||||
#define S390_H
|
||||
|
||||
/* List of instruction sets variations. */
|
||||
|
||||
enum s390_opcode_mode_val
|
||||
{
|
||||
S390_OPCODE_ESA = 0,
|
||||
S390_OPCODE_ZARCH
|
||||
};
|
||||
|
||||
enum s390_opcode_cpu_val
|
||||
{
|
||||
S390_OPCODE_G5 = 0,
|
||||
S390_OPCODE_G6,
|
||||
S390_OPCODE_Z900,
|
||||
S390_OPCODE_Z990,
|
||||
S390_OPCODE_Z9_109,
|
||||
S390_OPCODE_Z9_EC,
|
||||
S390_OPCODE_Z10,
|
||||
S390_OPCODE_Z196,
|
||||
S390_OPCODE_ZEC12,
|
||||
S390_OPCODE_Z13,
|
||||
S390_OPCODE_ARCH12,
|
||||
S390_OPCODE_ARCH13,
|
||||
S390_OPCODE_MAXCPU
|
||||
};
|
||||
|
||||
/* Instruction specific flags. */
|
||||
#define S390_INSTR_FLAG_OPTPARM 0x1
|
||||
#define S390_INSTR_FLAG_OPTPARM2 0x2
|
||||
|
||||
#define S390_INSTR_FLAG_HTM 0x4
|
||||
#define S390_INSTR_FLAG_VX 0x8
|
||||
#define S390_INSTR_FLAG_FACILITY_MASK 0xc
|
||||
|
||||
/* The opcode table is an array of struct s390_opcode. */
|
||||
|
||||
struct s390_opcode
|
||||
{
|
||||
/* The opcode name. */
|
||||
const char * name;
|
||||
|
||||
/* The opcode itself. Those bits which will be filled in with
|
||||
operands are zeroes. */
|
||||
unsigned char opcode[6];
|
||||
|
||||
/* The opcode mask. This is used by the disassembler. This is a
|
||||
mask containing ones indicating those bits which must match the
|
||||
opcode field, and zeroes indicating those bits which need not
|
||||
match (and are presumably filled in by operands). */
|
||||
unsigned char mask[6];
|
||||
|
||||
/* The opcode length in bytes. */
|
||||
int oplen;
|
||||
|
||||
/* An array of operand codes. Each code is an index into the
|
||||
operand table. They appear in the order which the operands must
|
||||
appear in assembly code, and are terminated by a zero. */
|
||||
unsigned char operands[6];
|
||||
|
||||
/* Bitmask of execution modes this opcode is available for. */
|
||||
unsigned int modes;
|
||||
|
||||
/* First cpu this opcode is available for. */
|
||||
enum s390_opcode_cpu_val min_cpu;
|
||||
|
||||
/* Instruction specific flags. */
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
/* The table itself is sorted by major opcode number, and is otherwise
|
||||
in the order in which the disassembler should consider
|
||||
instructions. */
|
||||
extern const struct s390_opcode s390_opcodes[];
|
||||
extern const int s390_num_opcodes;
|
||||
|
||||
/* A opcode format table for the .insn pseudo mnemonic. */
|
||||
extern const struct s390_opcode s390_opformats[];
|
||||
extern const int s390_num_opformats;
|
||||
|
||||
/* Values defined for the flags field of a struct s390_opcode. */
|
||||
|
||||
/* The operands table is an array of struct s390_operand. */
|
||||
|
||||
struct s390_operand
|
||||
{
|
||||
/* The number of bits in the operand. */
|
||||
int bits;
|
||||
|
||||
/* How far the operand is left shifted in the instruction. */
|
||||
int shift;
|
||||
|
||||
/* One bit syntax flags. */
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
/* Elements in the table are retrieved by indexing with values from
|
||||
the operands field of the s390_opcodes table. */
|
||||
|
||||
extern const struct s390_operand s390_operands[];
|
||||
|
||||
/* Values defined for the flags field of a struct s390_operand. */
|
||||
|
||||
/* This operand names a register. The disassembler uses this to print
|
||||
register names with a leading 'r'. */
|
||||
#define S390_OPERAND_GPR 0x1
|
||||
|
||||
/* This operand names a floating point register. The disassembler
|
||||
prints these with a leading 'f'. */
|
||||
#define S390_OPERAND_FPR 0x2
|
||||
|
||||
/* This operand names an access register. The disassembler
|
||||
prints these with a leading 'a'. */
|
||||
#define S390_OPERAND_AR 0x4
|
||||
|
||||
/* This operand names a control register. The disassembler
|
||||
prints these with a leading 'c'. */
|
||||
#define S390_OPERAND_CR 0x8
|
||||
|
||||
/* This operand is a displacement. */
|
||||
#define S390_OPERAND_DISP 0x10
|
||||
|
||||
/* This operand names a base register. */
|
||||
#define S390_OPERAND_BASE 0x20
|
||||
|
||||
/* This operand names an index register, it can be skipped. */
|
||||
#define S390_OPERAND_INDEX 0x40
|
||||
|
||||
/* This operand is a relative branch displacement. The disassembler
|
||||
prints these symbolically if possible. */
|
||||
#define S390_OPERAND_PCREL 0x80
|
||||
|
||||
/* This operand takes signed values. */
|
||||
#define S390_OPERAND_SIGNED 0x100
|
||||
|
||||
/* This operand is a length. */
|
||||
#define S390_OPERAND_LENGTH 0x200
|
||||
|
||||
/* The operand needs to be a valid GP or FP register pair. */
|
||||
#define S390_OPERAND_REG_PAIR 0x400
|
||||
|
||||
/* This operand names a vector register. The disassembler uses this
|
||||
to print register names with a leading 'v'. */
|
||||
#define S390_OPERAND_VR 0x800
|
||||
|
||||
#define S390_OPERAND_CP16 0x1000
|
||||
|
||||
#define S390_OPERAND_OR1 0x2000
|
||||
#define S390_OPERAND_OR2 0x4000
|
||||
#define S390_OPERAND_OR8 0x8000
|
||||
|
||||
#endif /* S390_H */
|
436
libr/asm/arch/s390/gnu/s390-dis.c
Normal file
436
libr/asm/arch/s390/gnu/s390-dis.c
Normal file
@ -0,0 +1,436 @@
|
||||
/* s390-dis.c -- Disassemble S390 instructions
|
||||
Copyright (C) 2000-2021 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
This file is part of the GNU opcodes library.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
It is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this file; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
#include "sysdep.h"
|
||||
#include <stdio.h>
|
||||
#include "ansidecl.h"
|
||||
// #include "disassemble.h"
|
||||
#include "opintl.h"
|
||||
#include <disas-asm.h>
|
||||
#include "opcode/s390.h"
|
||||
#include "libiberty.h"
|
||||
|
||||
static int opc_index[256];
|
||||
static int current_arch_mask = 0;
|
||||
static int option_use_insn_len_bits_p = 0;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
const char *description;
|
||||
} s390_options_t;
|
||||
|
||||
static const s390_options_t options[] =
|
||||
{
|
||||
{ "esa" , N_("Disassemble in ESA architecture mode") },
|
||||
{ "zarch", N_("Disassemble in z/Architecture mode") },
|
||||
{ "insnlength", N_("Print unknown instructions according to "
|
||||
"length from first two bits") }
|
||||
};
|
||||
|
||||
/* Set up index table for first opcode byte. */
|
||||
|
||||
void
|
||||
disassemble_init_s390 (struct disassemble_info *info)
|
||||
{
|
||||
int i;
|
||||
const char *p;
|
||||
|
||||
memset (opc_index, 0, sizeof (opc_index));
|
||||
|
||||
/* Reverse order, such that each opc_index ends up pointing to the
|
||||
first matching entry instead of the last. */
|
||||
for (i = s390_num_opcodes; i--; )
|
||||
opc_index[s390_opcodes[i].opcode[0]] = i;
|
||||
|
||||
current_arch_mask = 1 << S390_OPCODE_ZARCH;
|
||||
option_use_insn_len_bits_p = 0;
|
||||
|
||||
for (p = info->disassembler_options; p != NULL; )
|
||||
{
|
||||
if (CONST_STRNEQ (p, "esa"))
|
||||
current_arch_mask = 1 << S390_OPCODE_ESA;
|
||||
else if (CONST_STRNEQ (p, "zarch"))
|
||||
current_arch_mask = 1 << S390_OPCODE_ZARCH;
|
||||
else if (CONST_STRNEQ (p, "insnlength"))
|
||||
option_use_insn_len_bits_p = 1;
|
||||
else {
|
||||
/* xgettext:c-format */
|
||||
// opcodes_error_handler (_("unknown S/390 disassembler option: %s"), p);
|
||||
}
|
||||
|
||||
p = strchr (p, ',');
|
||||
if (p != NULL)
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Derive the length of an instruction from its first byte. */
|
||||
|
||||
static inline int
|
||||
s390_insn_length (const bfd_byte *buffer)
|
||||
{
|
||||
/* 00xxxxxx -> 2, 01xxxxxx/10xxxxxx -> 4, 11xxxxxx -> 6. */
|
||||
return ((buffer[0] >> 6) + 3) & ~1U;
|
||||
}
|
||||
|
||||
/* Match the instruction in BUFFER against the given OPCODE, excluding
|
||||
the first byte. */
|
||||
|
||||
static inline int
|
||||
s390_insn_matches_opcode (const bfd_byte *buffer,
|
||||
const struct s390_opcode *opcode)
|
||||
{
|
||||
return (buffer[1] & opcode->mask[1]) == opcode->opcode[1]
|
||||
&& (buffer[2] & opcode->mask[2]) == opcode->opcode[2]
|
||||
&& (buffer[3] & opcode->mask[3]) == opcode->opcode[3]
|
||||
&& (buffer[4] & opcode->mask[4]) == opcode->opcode[4]
|
||||
&& (buffer[5] & opcode->mask[5]) == opcode->opcode[5];
|
||||
}
|
||||
|
||||
union operand_value
|
||||
{
|
||||
int i;
|
||||
unsigned int u;
|
||||
};
|
||||
|
||||
/* Extracts an operand value from an instruction. */
|
||||
/* We do not perform the shift operation for larl-type address
|
||||
operands here since that would lead to an overflow of the 32 bit
|
||||
integer value. Instead the shift operation is done when printing
|
||||
the operand. */
|
||||
|
||||
static inline union operand_value
|
||||
s390_extract_operand (const bfd_byte *insn,
|
||||
const struct s390_operand *operand)
|
||||
{
|
||||
union operand_value ret;
|
||||
unsigned int val;
|
||||
int bits;
|
||||
const bfd_byte *orig_insn = insn;
|
||||
|
||||
/* Extract fragments of the operand byte for byte. */
|
||||
insn += operand->shift / 8;
|
||||
bits = (operand->shift & 7) + operand->bits;
|
||||
val = 0;
|
||||
do
|
||||
{
|
||||
val <<= 8;
|
||||
val |= (unsigned int) *insn++;
|
||||
bits -= 8;
|
||||
}
|
||||
while (bits > 0);
|
||||
val >>= -bits;
|
||||
val &= ((1U << (operand->bits - 1)) << 1) - 1;
|
||||
|
||||
/* Check for special long displacement case. */
|
||||
if (operand->bits == 20 && operand->shift == 20)
|
||||
val = (val & 0xff) << 12 | (val & 0xfff00) >> 8;
|
||||
|
||||
/* Sign extend value if the operand is signed or pc relative. Avoid
|
||||
integer overflows. */
|
||||
if (operand->flags & (S390_OPERAND_SIGNED | S390_OPERAND_PCREL))
|
||||
{
|
||||
unsigned int m = 1U << (operand->bits - 1);
|
||||
|
||||
if (val >= m)
|
||||
ret.i = (int) (val - m) - 1 - (int) (m - 1U);
|
||||
else
|
||||
ret.i = (int) val;
|
||||
}
|
||||
else if (operand->flags & S390_OPERAND_LENGTH)
|
||||
/* Length x in an instruction has real length x + 1. */
|
||||
ret.u = val + 1;
|
||||
|
||||
else if (operand->flags & S390_OPERAND_VR)
|
||||
{
|
||||
/* Extract the extra bits for a vector register operand stored
|
||||
in the RXB field. */
|
||||
unsigned vr = operand->shift == 32 ? 3
|
||||
: (unsigned) operand->shift / 4 - 2;
|
||||
|
||||
ret.u = val | ((orig_insn[4] & (1 << (3 - vr))) << (vr + 1));
|
||||
}
|
||||
else
|
||||
ret.u = val;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Print the S390 instruction in BUFFER, assuming that it matches the
|
||||
given OPCODE. */
|
||||
|
||||
static void
|
||||
s390_print_insn_with_opcode (bfd_vma memaddr,
|
||||
struct disassemble_info *info,
|
||||
const bfd_byte *buffer,
|
||||
const struct s390_opcode *opcode)
|
||||
{
|
||||
const unsigned char *opindex;
|
||||
char separator;
|
||||
|
||||
/* Mnemonic. */
|
||||
info->fprintf_func (info->stream, "%s", opcode->name);
|
||||
|
||||
/* Operands. */
|
||||
separator = ' ';
|
||||
for (opindex = opcode->operands; *opindex != 0; opindex++)
|
||||
{
|
||||
const struct s390_operand *operand = s390_operands + *opindex;
|
||||
union operand_value val = s390_extract_operand (buffer, operand);
|
||||
unsigned long flags = operand->flags;
|
||||
|
||||
if ((flags & S390_OPERAND_INDEX) && val.u == 0)
|
||||
continue;
|
||||
if ((flags & S390_OPERAND_BASE) &&
|
||||
val.u == 0 && separator == '(')
|
||||
{
|
||||
separator = ',';
|
||||
continue;
|
||||
}
|
||||
|
||||
/* For instructions with a last optional operand don't print it
|
||||
if zero. */
|
||||
if ((opcode->flags & (S390_INSTR_FLAG_OPTPARM | S390_INSTR_FLAG_OPTPARM2))
|
||||
&& val.u == 0
|
||||
&& opindex[1] == 0)
|
||||
break;
|
||||
|
||||
if ((opcode->flags & S390_INSTR_FLAG_OPTPARM2)
|
||||
&& val.u == 0 && opindex[1] != 0 && opindex[2] == 0)
|
||||
{
|
||||
union operand_value next_op_val =
|
||||
s390_extract_operand (buffer, s390_operands + opindex[1]);
|
||||
if (next_op_val.u == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (flags & S390_OPERAND_GPR)
|
||||
info->fprintf_func (info->stream, "%c%%r%u", separator, val.u);
|
||||
else if (flags & S390_OPERAND_FPR)
|
||||
info->fprintf_func (info->stream, "%c%%f%u", separator, val.u);
|
||||
else if (flags & S390_OPERAND_VR)
|
||||
info->fprintf_func (info->stream, "%c%%v%i", separator, val.u);
|
||||
else if (flags & S390_OPERAND_AR)
|
||||
info->fprintf_func (info->stream, "%c%%a%u", separator, val.u);
|
||||
else if (flags & S390_OPERAND_CR)
|
||||
info->fprintf_func (info->stream, "%c%%c%u", separator, val.u);
|
||||
else if (flags & S390_OPERAND_PCREL)
|
||||
{
|
||||
info->fprintf_func (info->stream, "%c", separator);
|
||||
info->print_address_func (memaddr + val.i + val.i, info);
|
||||
}
|
||||
else if (flags & S390_OPERAND_SIGNED)
|
||||
info->fprintf_func (info->stream, "%c%i", separator, val.i);
|
||||
else
|
||||
{
|
||||
if (flags & S390_OPERAND_OR1)
|
||||
val.u &= ~1;
|
||||
if (flags & S390_OPERAND_OR2)
|
||||
val.u &= ~2;
|
||||
if (flags & S390_OPERAND_OR8)
|
||||
val.u &= ~8;
|
||||
|
||||
if ((opcode->flags & S390_INSTR_FLAG_OPTPARM)
|
||||
&& val.u == 0
|
||||
&& opindex[1] == 0)
|
||||
break;
|
||||
info->fprintf_func (info->stream, "%c%u", separator, val.u);
|
||||
}
|
||||
|
||||
if (flags & S390_OPERAND_DISP)
|
||||
separator = '(';
|
||||
else if (flags & S390_OPERAND_BASE)
|
||||
{
|
||||
info->fprintf_func (info->stream, ")");
|
||||
separator = ',';
|
||||
}
|
||||
else
|
||||
separator = ',';
|
||||
}
|
||||
}
|
||||
|
||||
/* Check whether opcode A's mask is more specific than that of B. */
|
||||
|
||||
static int
|
||||
opcode_mask_more_specific (const struct s390_opcode *a,
|
||||
const struct s390_opcode *b)
|
||||
{
|
||||
return (((int) a->mask[0] + a->mask[1] + a->mask[2]
|
||||
+ a->mask[3] + a->mask[4] + a->mask[5])
|
||||
> ((int) b->mask[0] + b->mask[1] + b->mask[2]
|
||||
+ b->mask[3] + b->mask[4] + b->mask[5]));
|
||||
}
|
||||
|
||||
/* Print a S390 instruction. */
|
||||
|
||||
int
|
||||
print_insn_s390 (bfd_vma memaddr, struct disassemble_info *info)
|
||||
{
|
||||
bfd_byte buffer[6];
|
||||
const struct s390_opcode *opcode = NULL;
|
||||
int status, opsize, bufsize, bytes_to_dump;
|
||||
|
||||
/* The output looks better if we put 6 bytes on a line. */
|
||||
info->bytes_per_line = 6;
|
||||
|
||||
/* Every S390 instruction is max 6 bytes long. */
|
||||
memset (buffer, 0, 6);
|
||||
status = info->read_memory_func (memaddr, buffer, 6, info);
|
||||
if (status != 0)
|
||||
{
|
||||
for (bufsize = 0; bufsize < 6; bufsize++)
|
||||
if (info->read_memory_func (memaddr, buffer, bufsize + 1, info) != 0)
|
||||
break;
|
||||
if (bufsize <= 0)
|
||||
{
|
||||
info->memory_error_func (status, memaddr, info);
|
||||
return -1;
|
||||
}
|
||||
opsize = s390_insn_length (buffer);
|
||||
status = opsize > bufsize;
|
||||
}
|
||||
else
|
||||
{
|
||||
bufsize = 6;
|
||||
opsize = s390_insn_length (buffer);
|
||||
}
|
||||
if (status == 0)
|
||||
{
|
||||
const struct s390_opcode *op;
|
||||
|
||||
/* Find the "best match" in the opcode table. */
|
||||
for (op = s390_opcodes + opc_index[buffer[0]];
|
||||
op != s390_opcodes + s390_num_opcodes
|
||||
&& op->opcode[0] == buffer[0];
|
||||
op++)
|
||||
{
|
||||
if ((op->modes & current_arch_mask) && s390_insn_matches_opcode (buffer, op)
|
||||
&& (opcode == NULL || opcode_mask_more_specific (op, opcode)))
|
||||
opcode = op;
|
||||
}
|
||||
|
||||
if (opcode != NULL)
|
||||
{
|
||||
/* The instruction is valid. Print it and return its size. */
|
||||
s390_print_insn_with_opcode (memaddr, info, buffer, opcode);
|
||||
return opsize;
|
||||
}
|
||||
}
|
||||
|
||||
/* For code sections it makes sense to skip unknown instructions
|
||||
according to their length bits. */
|
||||
if (status == 0
|
||||
&& option_use_insn_len_bits_p
|
||||
&& info->section != NULL
|
||||
&& (info->section->flags & SEC_CODE))
|
||||
bytes_to_dump = opsize;
|
||||
else
|
||||
/* By default unknown instructions are printed as .long's/.short'
|
||||
depending on how many bytes are available. */
|
||||
bytes_to_dump = bufsize >= 4 ? 4 : bufsize;
|
||||
|
||||
if (bytes_to_dump == 0)
|
||||
return 0;
|
||||
#if 0
|
||||
unsigned int value;
|
||||
int i;
|
||||
|
||||
/* Fall back to hex print. */
|
||||
switch (bytes_to_dump)
|
||||
{
|
||||
case 4:
|
||||
value = (unsigned int) buffer[0];
|
||||
value = (value << 8) + (unsigned int) buffer[1];
|
||||
value = (value << 8) + (unsigned int) buffer[2];
|
||||
value = (value << 8) + (unsigned int) buffer[3];
|
||||
info->fprintf_func (info->stream, ".long 0x%08x", value);
|
||||
return 4;
|
||||
case 2:
|
||||
value = (unsigned int) buffer[0];
|
||||
value = (value << 8) + (unsigned int) buffer[1];
|
||||
info->fprintf_func (info->stream, ".short 0x%04x", value);
|
||||
return 2;
|
||||
default:
|
||||
info->fprintf_func (info->stream, ".byte 0x%02x",
|
||||
(unsigned int) buffer[0]);
|
||||
for (i = 1; i < bytes_to_dump; i++)
|
||||
info->fprintf_func (info->stream, ",0x%02x",
|
||||
(unsigned int) buffer[i]);
|
||||
return bytes_to_dump;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
const disasm_options_and_args_t *
|
||||
disassembler_options_s390 (void)
|
||||
{
|
||||
static disasm_options_and_args_t *opts_and_args;
|
||||
|
||||
if (opts_and_args == NULL)
|
||||
{
|
||||
size_t i, num_options = ARRAY_SIZE (options);
|
||||
disasm_options_t *opts;
|
||||
|
||||
opts_and_args = XNEW (disasm_options_and_args_t);
|
||||
opts_and_args->args = NULL;
|
||||
|
||||
opts = &opts_and_args->options;
|
||||
opts->name = XNEWVEC (const char *, num_options + 1);
|
||||
opts->description = XNEWVEC (const char *, num_options + 1);
|
||||
opts->arg = NULL;
|
||||
for (i = 0; i < num_options; i++)
|
||||
{
|
||||
opts->name[i] = options[i].name;
|
||||
opts->description[i] = _(options[i].description);
|
||||
}
|
||||
/* The array we return must be NULL terminated. */
|
||||
opts->name[i] = NULL;
|
||||
opts->description[i] = NULL;
|
||||
}
|
||||
|
||||
return opts_and_args;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
print_s390_disassembler_options (FILE *stream)
|
||||
{
|
||||
unsigned int i, max_len = 0;
|
||||
fprintf (stream, _("\n\
|
||||
The following S/390 specific disassembler options are supported for use\n\
|
||||
with the -M switch (multiple options should be separated by commas):\n"));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (options); i++)
|
||||
{
|
||||
unsigned int len = strlen (options[i].name);
|
||||
if (max_len < len)
|
||||
max_len = len;
|
||||
}
|
||||
|
||||
for (i = 0, max_len++; i < ARRAY_SIZE (options); i++)
|
||||
fprintf (stream, " %s%*c %s\n",
|
||||
options[i].name,
|
||||
(int)(max_len - strlen (options[i].name)), ' ',
|
||||
_(options[i].description));
|
||||
}
|
786
libr/asm/arch/s390/gnu/s390-opc.c
Normal file
786
libr/asm/arch/s390/gnu/s390-opc.c
Normal file
@ -0,0 +1,786 @@
|
||||
/* s390-opc.c -- S390 opcode list
|
||||
Copyright (C) 2000-2021 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
This file is part of the GNU opcodes library.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
It is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this file; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "ansidecl.h"
|
||||
#include "opcode/s390.h"
|
||||
|
||||
/* This file holds the S390 opcode table. The opcode table
|
||||
includes almost all of the extended instruction mnemonics. This
|
||||
permits the disassembler to use them, and simplifies the assembler
|
||||
logic, at the cost of increasing the table size. The table is
|
||||
strictly constant data, so the compiler should be able to put it in
|
||||
the .text section.
|
||||
|
||||
This file also holds the operand table. All knowledge about
|
||||
inserting operands into instructions and vice-versa is kept in this
|
||||
file. */
|
||||
|
||||
/* The operands table.
|
||||
The fields are bits, shift, insert, extract, flags. */
|
||||
|
||||
const struct s390_operand s390_operands[] =
|
||||
{
|
||||
#define UNUSED 0
|
||||
{ 0, 0, 0 }, /* Indicates the end of the operand list */
|
||||
|
||||
/* General purpose register operands. */
|
||||
|
||||
#define R_8 1 /* GPR starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_GPR },
|
||||
#define R_12 2 /* GPR starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_GPR },
|
||||
#define R_16 3 /* GPR starting at position 16 */
|
||||
{ 4, 16, S390_OPERAND_GPR },
|
||||
#define R_20 4 /* GPR starting at position 20 */
|
||||
{ 4, 20, S390_OPERAND_GPR },
|
||||
#define R_24 5 /* GPR starting at position 24 */
|
||||
{ 4, 24, S390_OPERAND_GPR },
|
||||
#define R_28 6 /* GPR starting at position 28 */
|
||||
{ 4, 28, S390_OPERAND_GPR },
|
||||
#define R_32 7 /* GPR starting at position 32 */
|
||||
{ 4, 32, S390_OPERAND_GPR },
|
||||
|
||||
/* General purpose register pair operands. */
|
||||
|
||||
#define RE_8 8 /* GPR starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
#define RE_12 9 /* GPR starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
#define RE_16 10 /* GPR starting at position 16 */
|
||||
{ 4, 16, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
#define RE_20 11 /* GPR starting at position 20 */
|
||||
{ 4, 20, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
#define RE_24 12 /* GPR starting at position 24 */
|
||||
{ 4, 24, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
#define RE_28 13 /* GPR starting at position 28 */
|
||||
{ 4, 28, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
#define RE_32 14 /* GPR starting at position 32 */
|
||||
{ 4, 32, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR },
|
||||
|
||||
/* Floating point register operands. */
|
||||
|
||||
#define F_8 15 /* FPR starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_FPR },
|
||||
#define F_12 16 /* FPR starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_FPR },
|
||||
#define F_16 17 /* FPR starting at position 16 */
|
||||
{ 4, 16, S390_OPERAND_FPR },
|
||||
#define F_24 18 /* FPR starting at position 24 */
|
||||
{ 4, 24, S390_OPERAND_FPR },
|
||||
#define F_28 19 /* FPR starting at position 28 */
|
||||
{ 4, 28, S390_OPERAND_FPR },
|
||||
#define F_32 20 /* FPR starting at position 32 */
|
||||
{ 4, 32, S390_OPERAND_FPR },
|
||||
|
||||
/* Floating point register pair operands. */
|
||||
|
||||
#define FE_8 21 /* FPR starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR },
|
||||
#define FE_12 22 /* FPR starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR },
|
||||
#define FE_16 23 /* FPR starting at position 16 */
|
||||
{ 4, 16, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR },
|
||||
#define FE_24 24 /* FPR starting at position 24 */
|
||||
{ 4, 24, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR },
|
||||
#define FE_28 25 /* FPR starting at position 28 */
|
||||
{ 4, 28, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR },
|
||||
#define FE_32 26 /* FPR starting at position 32 */
|
||||
{ 4, 32, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR },
|
||||
|
||||
/* Vector register operands. */
|
||||
|
||||
/* For each of these operands and additional bit in the RXB operand is
|
||||
needed. */
|
||||
|
||||
#define V_8 27 /* Vector reg. starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_VR },
|
||||
#define V_12 28 /* Vector reg. starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_VR },
|
||||
#define V_CP16_12 29 /* Vector reg. starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_VR | S390_OPERAND_CP16 }, /* with a copy at pos 16 */
|
||||
#define V_16 30 /* Vector reg. starting at position 16 */
|
||||
{ 4, 16, S390_OPERAND_VR },
|
||||
#define V_32 31 /* Vector reg. starting at position 32 */
|
||||
{ 4, 32, S390_OPERAND_VR },
|
||||
|
||||
/* Access register operands. */
|
||||
|
||||
#define A_8 32 /* Access reg. starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_AR },
|
||||
#define A_12 33 /* Access reg. starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_AR },
|
||||
#define A_24 34 /* Access reg. starting at position 24 */
|
||||
{ 4, 24, S390_OPERAND_AR },
|
||||
#define A_28 35 /* Access reg. starting at position 28 */
|
||||
{ 4, 28, S390_OPERAND_AR },
|
||||
|
||||
/* Control register operands. */
|
||||
|
||||
#define C_8 36 /* Control reg. starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_CR },
|
||||
#define C_12 37 /* Control reg. starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_CR },
|
||||
|
||||
/* Base register operands. */
|
||||
|
||||
#define B_16 38 /* Base register starting at position 16 */
|
||||
{ 4, 16, S390_OPERAND_BASE | S390_OPERAND_GPR },
|
||||
#define B_32 39 /* Base register starting at position 32 */
|
||||
{ 4, 32, S390_OPERAND_BASE | S390_OPERAND_GPR },
|
||||
|
||||
#define X_12 40 /* Index register starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_INDEX | S390_OPERAND_GPR },
|
||||
|
||||
#define VX_12 41 /* Vector index register starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_INDEX | S390_OPERAND_VR },
|
||||
|
||||
/* Address displacement operands. */
|
||||
|
||||
#define D_20 42 /* Displacement starting at position 20 */
|
||||
{ 12, 20, S390_OPERAND_DISP },
|
||||
#define D_36 43 /* Displacement starting at position 36 */
|
||||
{ 12, 36, S390_OPERAND_DISP },
|
||||
#define D20_20 44 /* 20 bit displacement starting at 20 */
|
||||
{ 20, 20, S390_OPERAND_DISP | S390_OPERAND_SIGNED },
|
||||
|
||||
/* Length operands. */
|
||||
|
||||
#define L4_8 45 /* 4 bit length starting at position 8 */
|
||||
{ 4, 8, S390_OPERAND_LENGTH },
|
||||
#define L4_12 46 /* 4 bit length starting at position 12 */
|
||||
{ 4, 12, S390_OPERAND_LENGTH },
|
||||
#define L8_8 47 /* 8 bit length starting at position 8 */
|
||||
{ 8, 8, S390_OPERAND_LENGTH },
|
||||
|
||||
/* Signed immediate operands. */
|
||||
|
||||
#define I8_8 48 /* 8 bit signed value starting at 8 */
|
||||
{ 8, 8, S390_OPERAND_SIGNED },
|
||||
#define I8_32 49 /* 8 bit signed value starting at 32 */
|
||||
{ 8, 32, S390_OPERAND_SIGNED },
|
||||
#define I12_12 50 /* 12 bit signed value starting at 12 */
|
||||
{ 12, 12, S390_OPERAND_SIGNED },
|
||||
#define I16_16 51 /* 16 bit signed value starting at 16 */
|
||||
{ 16, 16, S390_OPERAND_SIGNED },
|
||||
#define I16_32 52 /* 16 bit signed value starting at 32 */
|
||||
{ 16, 32, S390_OPERAND_SIGNED },
|
||||
#define I24_24 53 /* 24 bit signed value starting at 24 */
|
||||
{ 24, 24, S390_OPERAND_SIGNED },
|
||||
#define I32_16 54 /* 32 bit signed value starting at 16 */
|
||||
{ 32, 16, S390_OPERAND_SIGNED },
|
||||
|
||||
/* Unsigned immediate operands. */
|
||||
|
||||
#define U4_8 55 /* 4 bit unsigned value starting at 8 */
|
||||
{ 4, 8, 0 },
|
||||
#define U4_12 56 /* 4 bit unsigned value starting at 12 */
|
||||
{ 4, 12, 0 },
|
||||
#define U4_16 57 /* 4 bit unsigned value starting at 16 */
|
||||
{ 4, 16, 0 },
|
||||
#define U4_20 58 /* 4 bit unsigned value starting at 20 */
|
||||
{ 4, 20, 0 },
|
||||
#define U4_24 59 /* 4 bit unsigned value starting at 24 */
|
||||
{ 4, 24, 0 },
|
||||
#define U4_OR1_24 60 /* 4 bit unsigned value ORed with 1 */
|
||||
{ 4, 24, S390_OPERAND_OR1 }, /* starting at 24 */
|
||||
#define U4_OR2_24 61 /* 4 bit unsigned value ORed with 2 */
|
||||
{ 4, 24, S390_OPERAND_OR2 }, /* starting at 24 */
|
||||
#define U4_OR3_24 62 /* 4 bit unsigned value ORed with 3 */
|
||||
{ 4, 24, S390_OPERAND_OR1 | S390_OPERAND_OR2 }, /* starting at 24 */
|
||||
#define U4_28 63 /* 4 bit unsigned value starting at 28 */
|
||||
{ 4, 28, 0 },
|
||||
#define U4_OR8_28 64 /* 4 bit unsigned value ORed with 8 */
|
||||
{ 4, 28, S390_OPERAND_OR8 }, /* starting at 28 */
|
||||
#define U4_32 65 /* 4 bit unsigned value starting at 32 */
|
||||
{ 4, 32, 0 },
|
||||
#define U4_36 66 /* 4 bit unsigned value starting at 36 */
|
||||
{ 4, 36, 0 },
|
||||
#define U8_8 67 /* 8 bit unsigned value starting at 8 */
|
||||
{ 8, 8, 0 },
|
||||
#define U8_16 68 /* 8 bit unsigned value starting at 16 */
|
||||
{ 8, 16, 0 },
|
||||
#define U6_26 69 /* 6 bit unsigned value starting at 26 */
|
||||
{ 6, 26, 0 },
|
||||
#define U8_24 70 /* 8 bit unsigned value starting at 24 */
|
||||
{ 8, 24, 0 },
|
||||
#define U8_28 71 /* 8 bit unsigned value starting at 28 */
|
||||
{ 8, 28, 0 },
|
||||
#define U8_32 72 /* 8 bit unsigned value starting at 32 */
|
||||
{ 8, 32, 0 },
|
||||
#define U12_16 73 /* 12 bit unsigned value starting at 16 */
|
||||
{ 12, 16, 0 },
|
||||
#define U16_16 74 /* 16 bit unsigned value starting at 16 */
|
||||
{ 16, 16, 0 },
|
||||
#define U16_32 75 /* 16 bit unsigned value starting at 32 */
|
||||
{ 16, 32, 0 },
|
||||
#define U32_16 76 /* 32 bit unsigned value starting at 16 */
|
||||
{ 32, 16, 0 },
|
||||
|
||||
/* PC-relative address operands. */
|
||||
|
||||
#define J12_12 77 /* 12 bit PC relative offset at 12 */
|
||||
{ 12, 12, S390_OPERAND_PCREL },
|
||||
#define J16_16 78 /* 16 bit PC relative offset at 16 */
|
||||
{ 16, 16, S390_OPERAND_PCREL },
|
||||
#define J16_32 79 /* 16 bit PC relative offset at 32 */
|
||||
{ 16, 32, S390_OPERAND_PCREL },
|
||||
#define J24_24 80 /* 24 bit PC relative offset at 24 */
|
||||
{ 24, 24, S390_OPERAND_PCREL },
|
||||
#define J32_16 81 /* 32 bit PC relative offset at 16 */
|
||||
{ 32, 16, S390_OPERAND_PCREL },
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* Macros used to form opcodes. */
|
||||
|
||||
/* 8/16/48 bit opcodes. */
|
||||
#define OP8(x) { x, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define OP16(x) { x >> 8, x & 255, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define OP32(x) { x >> 24, (x >> 16) & 255, (x >> 8) & 255, x & 255, \
|
||||
0x00, 0x00 }
|
||||
#define OP48(x) { x >> 40, (x >> 32) & 255, (x >> 24) & 255, \
|
||||
(x >> 16) & 255, (x >> 8) & 255, x & 255}
|
||||
|
||||
/* The new format of the INSTR_x_y and MASK_x_y defines is based
|
||||
on the following rules:
|
||||
1) the middle part of the definition (x in INSTR_x_y) is the official
|
||||
names of the instruction format that you can find in the principals
|
||||
of operation.
|
||||
2) the last part of the definition (y in INSTR_x_y) gives you an idea
|
||||
which operands the binary represenation of the instruction has.
|
||||
The meanings of the letters in y are:
|
||||
a - access register
|
||||
c - control register
|
||||
d - displacement, 12 bit
|
||||
f - floating pointer register
|
||||
fe - fpr extended operand, a valid floating pointer register pair
|
||||
i - signed integer, 4, 8, 16 or 32 bit
|
||||
l - length, 4 or 8 bit
|
||||
p - pc relative
|
||||
r - general purpose register
|
||||
re - gpr extended operand, a valid general purpose register pair
|
||||
u - unsigned integer, 4, 8, 16 or 32 bit
|
||||
m - mode field, 4 bit
|
||||
0 - operand skipped.
|
||||
The order of the letters reflects the layout of the format in
|
||||
storage and not the order of the paramaters of the instructions.
|
||||
The use of the letters is not a 100% match with the PoP but it is
|
||||
quite close.
|
||||
|
||||
For example the instruction "mvo" is defined in the PoP as follows:
|
||||
|
||||
MVO D1(L1,B1),D2(L2,B2) [SS]
|
||||
|
||||
--------------------------------------
|
||||
| 'F1' | L1 | L2 | B1 | D1 | B2 | D2 |
|
||||
--------------------------------------
|
||||
0 8 12 16 20 32 36
|
||||
|
||||
The instruction format is: INSTR_SS_LLRDRD / MASK_SS_LLRDRD. */
|
||||
|
||||
#define INSTR_E 2, { 0,0,0,0,0,0 } /* e.g. pr */
|
||||
#define INSTR_IE_UU 4, { U4_24,U4_28,0,0,0,0 } /* e.g. niai */
|
||||
#define INSTR_MII_UPP 6, { U4_8,J12_12,J24_24 } /* e.g. bprp */
|
||||
#define INSTR_RIE_RRP 6, { R_8,R_12,J16_16,0,0,0 } /* e.g. brxhg */
|
||||
#define INSTR_RIE_RRPU 6, { R_8,R_12,U4_32,J16_16,0,0 } /* e.g. crj */
|
||||
#define INSTR_RIE_RRP0 6, { R_8,R_12,J16_16,0,0,0 } /* e.g. cgrjne */
|
||||
#define INSTR_RIE_RRI0 6, { R_8,R_12,I16_16,0,0,0 } /* e.g. ahik */
|
||||
#define INSTR_RIE_RUPI 6, { R_8,I8_32,U4_12,J16_16,0,0 } /* e.g. cij */
|
||||
#define INSTR_RIE_R0PI 6, { R_8,I8_32,J16_16,0,0,0 } /* e.g. cijne */
|
||||
#define INSTR_RIE_RUPU 6, { R_8,U8_32,U4_12,J16_16,0,0 } /* e.g. clij */
|
||||
#define INSTR_RIE_R0PU 6, { R_8,U8_32,J16_16,0,0,0 } /* e.g. clijne */
|
||||
#define INSTR_RIE_R0IU 6, { R_8,I16_16,U4_32,0,0,0 } /* e.g. cit */
|
||||
#define INSTR_RIE_R0I0 6, { R_8,I16_16,0,0,0,0 } /* e.g. citne */
|
||||
#define INSTR_RIE_R0UU 6, { R_8,U16_16,U4_32,0,0,0 } /* e.g. clfit */
|
||||
#define INSTR_RIE_R0U0 6, { R_8,U16_16,0,0,0,0 } /* e.g. clfitne */
|
||||
#define INSTR_RIE_RUI0 6, { R_8,I16_16,U4_12,0,0,0 } /* e.g. lochi */
|
||||
#define INSTR_RIE_RRUUU 6, { R_8,R_12,U8_16,U8_24,U8_32,0 } /* e.g. rnsbg */
|
||||
#define INSTR_RIE_RRUUU2 6, { R_8,R_12,U8_16,U6_26,U8_32,0 } /* e.g. rnsbg */
|
||||
#define INSTR_RIL_0P 6, { J32_16,0,0,0,0 } /* e.g. jg */
|
||||
#define INSTR_RIL_RP 6, { R_8,J32_16,0,0,0,0 } /* e.g. brasl */
|
||||
#define INSTR_RIL_UP 6, { U4_8,J32_16,0,0,0,0 } /* e.g. brcl */
|
||||
#define INSTR_RIL_RI 6, { R_8,I32_16,0,0,0,0 } /* e.g. afi */
|
||||
#define INSTR_RIL_RU 6, { R_8,U32_16,0,0,0,0 } /* e.g. alfi */
|
||||
#define INSTR_RI_0P 4, { J16_16,0,0,0,0,0 } /* e.g. j */
|
||||
#define INSTR_RI_RI 4, { R_8,I16_16,0,0,0,0 } /* e.g. ahi */
|
||||
#define INSTR_RI_RP 4, { R_8,J16_16,0,0,0,0 } /* e.g. brct */
|
||||
#define INSTR_RI_RU 4, { R_8,U16_16,0,0,0,0 } /* e.g. tml */
|
||||
#define INSTR_RI_UP 4, { U4_8,J16_16,0,0,0,0 } /* e.g. brc */
|
||||
#define INSTR_RIS_RURDI 6, { R_8,I8_32,U4_12,D_20,B_16,0 } /* e.g. cib */
|
||||
#define INSTR_RIS_R0RDI 6, { R_8,I8_32,D_20,B_16,0,0 } /* e.g. cibne */
|
||||
#define INSTR_RIS_RURDU 6, { R_8,U8_32,U4_12,D_20,B_16,0 } /* e.g. clib */
|
||||
#define INSTR_RIS_R0RDU 6, { R_8,U8_32,D_20,B_16,0,0 } /* e.g. clibne*/
|
||||
#define INSTR_RRE_00 4, { 0,0,0,0,0,0 } /* e.g. palb */
|
||||
#define INSTR_RRE_0R 4, { R_28,0,0,0,0,0 } /* e.g. tb */
|
||||
#define INSTR_RRE_AA 4, { A_24,A_28,0,0,0,0 } /* e.g. cpya */
|
||||
#define INSTR_RRE_AR 4, { A_24,R_28,0,0,0,0 } /* e.g. sar */
|
||||
#define INSTR_RRE_F0 4, { F_24,0,0,0,0,0 } /* e.g. lzer */
|
||||
#define INSTR_RRE_FE0 4, { FE_24,0,0,0,0,0 } /* e.g. lzxr */
|
||||
#define INSTR_RRE_FF 4, { F_24,F_28,0,0,0,0 } /* e.g. debr */
|
||||
#define INSTR_RRE_FEF 4, { FE_24,F_28,0,0,0,0 } /* e.g. lxdbr */
|
||||
#define INSTR_RRE_FFE 4, { F_24,FE_28,0,0,0,0 } /* e.g. lexr */
|
||||
#define INSTR_RRE_FEFE 4, { FE_24,FE_28,0,0,0,0 } /* e.g. dxr */
|
||||
#define INSTR_RRE_R0 4, { R_24,0,0,0,0,0 } /* e.g. ipm */
|
||||
#define INSTR_RRE_RA 4, { R_24,A_28,0,0,0,0 } /* e.g. ear */
|
||||
#define INSTR_RRE_RF 4, { R_24,F_28,0,0,0,0 } /* e.g. lgdr */
|
||||
#define INSTR_RRE_RFE 4, { R_24,FE_28,0,0,0,0 } /* e.g. csxtr */
|
||||
#define INSTR_RRE_RR 4, { R_24,R_28,0,0,0,0 } /* e.g. lura */
|
||||
#define INSTR_RRE_RER 4, { RE_24,R_28,0,0,0,0 } /* e.g. tre */
|
||||
#define INSTR_RRE_RERE 4, { RE_24,RE_28,0,0,0,0 } /* e.g. cuse */
|
||||
#define INSTR_RRE_FR 4, { F_24,R_28,0,0,0,0 } /* e.g. ldgr */
|
||||
#define INSTR_RRE_FER 4, { FE_24,R_28,0,0,0,0 } /* e.g. cxfbr */
|
||||
#define INSTR_RRF_F0FF 4, { F_16,F_24,F_28,0,0,0 } /* e.g. madbr */
|
||||
#define INSTR_RRF_FE0FF 4, { F_16,F_24,F_28,0,0,0 } /* e.g. myr */
|
||||
#define INSTR_RRF_F0FF2 4, { F_24,F_16,F_28,0,0,0 } /* e.g. cpsdr */
|
||||
#define INSTR_RRF_F0FR 4, { F_24,F_16,R_28,0,0,0 } /* e.g. iedtr */
|
||||
#define INSTR_RRF_FE0FER 4, { FE_24,FE_16,R_28,0,0,0 } /* e.g. iextr */
|
||||
#define INSTR_RRF_FUFF 4, { F_24,F_16,F_28,U4_20,0,0 } /* e.g. didbr */
|
||||
#define INSTR_RRF_FEUFEFE 4, { FE_24,FE_16,FE_28,U4_20,0,0 } /* e.g. qaxtr */
|
||||
#define INSTR_RRF_FUFF2 4, { F_24,F_28,F_16,U4_20,0,0 } /* e.g. adtra */
|
||||
#define INSTR_RRF_FEUFEFE2 4, { FE_24,FE_28,FE_16,U4_20,0,0 } /* e.g. axtra */
|
||||
#define INSTR_RRF_RURR 4, { R_24,R_28,R_16,U4_20,0,0 } /* e.g. ipte */
|
||||
#define INSTR_RRF_RURR2 4, { R_24,R_16,R_28,U4_20,0,0 } /* e.g. lptea */
|
||||
#define INSTR_RRF_R0RR 4, { R_24,R_16,R_28,0,0,0 } /* e.g. idte */
|
||||
#define INSTR_RRF_R0RR2 4, { R_24,R_28,R_16,0,0,0 } /* e.g. ark */
|
||||
#define INSTR_RRF_R0RR3 4, { R_24,R_28,R_16,0,0,0 } /* e.g. selrz */
|
||||
#define INSTR_RRF_U0FF 4, { F_24,U4_16,F_28,0,0,0 } /* e.g. fidbr */
|
||||
#define INSTR_RRF_U0FEFE 4, { FE_24,U4_16,FE_28,0,0,0 } /* e.g. fixbr */
|
||||
#define INSTR_RRF_U0RF 4, { R_24,U4_16,F_28,0,0,0 } /* e.g. cfebr */
|
||||
#define INSTR_RRF_U0RFE 4, { R_24,U4_16,FE_28,0,0,0 } /* e.g. cfxbr */
|
||||
#define INSTR_RRF_UUFF 4, { F_24,U4_16,F_28,U4_20,0,0 } /* e.g. fidtr */
|
||||
#define INSTR_RRF_UUFFE 4, { F_24,U4_16,FE_28,U4_20,0,0 } /* e.g. ldxtr */
|
||||
#define INSTR_RRF_UUFEFE 4, { FE_24,U4_16,FE_28,U4_20,0,0 } /* e.g. fixtr */
|
||||
#define INSTR_RRF_0UFF 4, { F_24,F_28,U4_20,0,0,0 } /* e.g. ldetr */
|
||||
#define INSTR_RRF_0UFEF 4, { FE_24,F_28,U4_20,0,0,0 } /* e.g. lxdtr */
|
||||
#define INSTR_RRF_FFRU 4, { F_24,F_16,R_28,U4_20,0,0 } /* e.g. rrdtr */
|
||||
#define INSTR_RRF_FEFERU 4, { FE_24,FE_16,R_28,U4_20,0,0 } /* e.g. rrxtr */
|
||||
#define INSTR_RRF_U0RR 4, { R_24,R_28,U4_16,0,0,0 } /* e.g. sske */
|
||||
#define INSTR_RRF_U0RER 4, { RE_24,R_28,U4_16,0,0,0 } /* e.g. trte */
|
||||
#define INSTR_RRF_U0RERE 4, { RE_24,RE_28,U4_16,0,0,0 } /* e.g. cu24 */
|
||||
#define INSTR_RRF_00RR 4, { R_24,R_28,0,0,0,0 } /* e.g. clrtne */
|
||||
#define INSTR_RRF_0URF 4, { R_24,F_28,U4_20,0,0,0 } /* e.g. csdtr */
|
||||
#define INSTR_RRF_0UREFE 4, { RE_24,FE_28,U4_20,0,0,0 } /* e.g. csxtr */
|
||||
#define INSTR_RRF_UUFR 4, { F_24,U4_16,R_28,U4_20,0,0 } /* e.g. cdgtra */
|
||||
#define INSTR_RRF_UUFER 4, { FE_24,U4_16,R_28,U4_20,0,0 } /* e.g. cxfbra */
|
||||
#define INSTR_RRF_UURF 4, { R_24,U4_16,F_28,U4_20,0,0 } /* e.g. cgdtra */
|
||||
#define INSTR_RRF_UURFE 4, { R_24,U4_16,FE_28,U4_20,0,0 } /* e.g. cfxbra */
|
||||
#define INSTR_RR_0R 2, { R_12, 0,0,0,0,0 } /* e.g. br */
|
||||
#define INSTR_RR_FF 2, { F_8,F_12,0,0,0,0 } /* e.g. adr */
|
||||
#define INSTR_RR_FEF 2, { FE_8,F_12,0,0,0,0 } /* e.g. mxdr */
|
||||
#define INSTR_RR_FFE 2, { F_8,FE_12,0,0,0,0 } /* e.g. ldxr */
|
||||
#define INSTR_RR_FEFE 2, { FE_8,FE_12,0,0,0,0 } /* e.g. axr */
|
||||
#define INSTR_RR_R0 2, { R_8, 0,0,0,0,0 } /* e.g. spm */
|
||||
#define INSTR_RR_RR 2, { R_8,R_12,0,0,0,0 } /* e.g. lr */
|
||||
#define INSTR_RR_RER 2, { RE_8,R_12,0,0,0,0 } /* e.g. dr */
|
||||
#define INSTR_RR_U0 2, { U8_8, 0,0,0,0,0 } /* e.g. svc */
|
||||
#define INSTR_RR_UR 2, { U4_8,R_12,0,0,0,0 } /* e.g. bcr */
|
||||
#define INSTR_RRR_F0FF 4, { F_24,F_28,F_16,0,0,0 } /* e.g. ddtr */
|
||||
#define INSTR_RRR_FE0FEFE 4, { FE_24,FE_28,FE_16,0,0,0 } /* e.g. axtr */
|
||||
#define INSTR_RRS_RRRDU 6, { R_8,R_12,U4_32,D_20,B_16 } /* e.g. crb */
|
||||
#define INSTR_RRS_RRRD0 6, { R_8,R_12,D_20,B_16,0 } /* e.g. crbne */
|
||||
#define INSTR_RSE_RRRD 6, { R_8,R_12,D_20,B_16,0,0 } /* e.g. lmh */
|
||||
#define INSTR_RSE_RERERD 6, { RE_8,RE_12,D_20,B_16,0,0 } /* e.g. mvclu */
|
||||
#define INSTR_RSE_CCRD 6, { C_8,C_12,D_20,B_16,0,0 } /* e.g. stctg */
|
||||
#define INSTR_RSE_RURD 6, { R_8,U4_12,D_20,B_16,0,0 } /* e.g. icmh */
|
||||
#define INSTR_RSL_R0RD 6, { D_20,L4_8,B_16,0,0,0 } /* e.g. tp */
|
||||
#define INSTR_RSL_LRDFU 6, { F_32,D_20,L8_8,B_16,U4_36,0 } /* e.g. cdzt */
|
||||
#define INSTR_RSL_LRDFEU 6, { FE_32,D_20,L8_8,B_16,U4_36,0 } /* e.g. cxzt */
|
||||
#define INSTR_RSI_RRP 4, { R_8,R_12,J16_16,0,0,0 } /* e.g. brxh */
|
||||
#define INSTR_RSY_RRRD 6, { R_8,R_12,D20_20,B_16,0,0 } /* e.g. stmy */
|
||||
#define INSTR_RSY_RERERD 6, { RE_8,RE_12,D20_20,B_16,0,0 } /* e.g. cdsy */
|
||||
#define INSTR_RSY_RURD 6, { R_8,U4_12,D20_20,B_16,0,0 } /* e.g. icmh */
|
||||
#define INSTR_RSY_RURD2 6, { R_8,D20_20,B_16,U4_12,0,0 } /* e.g. loc */
|
||||
#define INSTR_RSY_R0RD 6, { R_8,D20_20,B_16,0,0,0 } /* e.g. locne */
|
||||
#define INSTR_RSY_AARD 6, { A_8,A_12,D20_20,B_16,0,0 } /* e.g. lamy */
|
||||
#define INSTR_RSY_CCRD 6, { C_8,C_12,D20_20,B_16,0,0 } /* e.g. stctg */
|
||||
#define INSTR_RS_AARD 4, { A_8,A_12,D_20,B_16,0,0 } /* e.g. lam */
|
||||
#define INSTR_RS_CCRD 4, { C_8,C_12,D_20,B_16,0,0 } /* e.g. lctl */
|
||||
#define INSTR_RS_R0RD 4, { R_8,D_20,B_16,0,0,0 } /* e.g. sll */
|
||||
#define INSTR_RS_RE0RD 4, { RE_8,D_20,B_16,0,0,0 } /* e.g. slda */
|
||||
#define INSTR_RS_RRRD 4, { R_8,R_12,D_20,B_16,0,0 } /* e.g. cs */
|
||||
#define INSTR_RS_RERERD 4, { RE_8,RE_12,D_20,B_16,0,0 } /* e.g. cds */
|
||||
#define INSTR_RS_RURD 4, { R_8,U4_12,D_20,B_16,0,0 } /* e.g. icm */
|
||||
#define INSTR_RXE_FRRD 6, { F_8,D_20,X_12,B_16,0,0 } /* e.g. adb */
|
||||
#define INSTR_RXE_FERRD 6, { FE_8,D_20,X_12,B_16,0,0 } /* e.g. lxdb */
|
||||
#define INSTR_RXE_RRRD 6, { R_8,D_20,X_12,B_16,0,0 } /* e.g. lg */
|
||||
#define INSTR_RXE_RRRDU 6, { R_8,D_20,X_12,B_16,U4_32,0 } /* e.g. lcbb */
|
||||
#define INSTR_RXE_RERRD 6, { RE_8,D_20,X_12,B_16,0,0 } /* e.g. dsg */
|
||||
#define INSTR_RXF_FRRDF 6, { F_32,F_8,D_20,X_12,B_16,0 } /* e.g. madb */
|
||||
#define INSTR_RXF_FRRDFE 6, { FE_32,F_8,D_20,X_12,B_16,0 } /* e.g. my */
|
||||
#define INSTR_RXF_FERRDFE 6, { FE_32,FE_8,D_20,X_12,B_16,0 } /* e.g. slxt */
|
||||
#define INSTR_RXF_RRRDR 6, { R_32,R_8,D_20,X_12,B_16,0 } /* e.g. .insn */
|
||||
#define INSTR_RXY_RRRD 6, { R_8,D20_20,X_12,B_16,0,0 } /* e.g. ly */
|
||||
#define INSTR_RXY_RERRD 6, { RE_8,D20_20,X_12,B_16,0,0 } /* e.g. dsg */
|
||||
#define INSTR_RXY_FRRD 6, { F_8,D20_20,X_12,B_16,0,0 } /* e.g. ley */
|
||||
#define INSTR_RXY_URRD 6, { U4_8,D20_20,X_12,B_16,0,0 } /* e.g. pfd */
|
||||
#define INSTR_RXY_0RRD 6, { D20_20,X_12,B_16,0,0 } /* e.g. bic */
|
||||
#define INSTR_RX_0RRD 4, { D_20,X_12,B_16,0,0,0 } /* e.g. be */
|
||||
#define INSTR_RX_FRRD 4, { F_8,D_20,X_12,B_16,0,0 } /* e.g. ae */
|
||||
#define INSTR_RX_FERRD 4, { FE_8,D_20,X_12,B_16,0,0 } /* e.g. mxd */
|
||||
#define INSTR_RX_RRRD 4, { R_8,D_20,X_12,B_16,0,0 } /* e.g. l */
|
||||
#define INSTR_RX_RERRD 4, { RE_8,D_20,X_12,B_16,0,0 } /* e.g. d */
|
||||
#define INSTR_RX_URRD 4, { U4_8,D_20,X_12,B_16,0,0 } /* e.g. bc */
|
||||
#define INSTR_SI_RD 4, { D_20,B_16,0,0,0,0 } /* e.g. lpsw */
|
||||
#define INSTR_SI_URD 4, { D_20,B_16,U8_8,0,0,0 } /* e.g. cli */
|
||||
#define INSTR_SIY_URD 6, { D20_20,B_16,U8_8,0,0,0 } /* e.g. tmy */
|
||||
#define INSTR_SIY_IRD 6, { D20_20,B_16,I8_8,0,0,0 } /* e.g. asi */
|
||||
#define INSTR_SIL_RDI 6, { D_20,B_16,I16_32,0,0,0 } /* e.g. chhsi */
|
||||
#define INSTR_SIL_RDU 6, { D_20,B_16,U16_32,0,0,0 } /* e.g. clfhsi */
|
||||
#define INSTR_SMI_U0RDP 6, { U4_8,J16_32,D_20,B_16,0,0 } /* e.g. bpp */
|
||||
#define INSTR_SSE_RDRD 6, { D_20,B_16,D_36,B_32,0,0 } /* e.g. mvcdk */
|
||||
#define INSTR_SS_L0RDRD 6, { D_20,L8_8,B_16,D_36,B_32,0 } /* e.g. mvc */
|
||||
#define INSTR_SS_L2RDRD 6, { D_20,B_16,D_36,L8_8,B_32,0 } /* e.g. pka */
|
||||
#define INSTR_SS_LIRDRD 6, { D_20,L4_8,B_16,D_36,B_32,U4_12 } /* e.g. srp */
|
||||
#define INSTR_SS_LLRDRD 6, { D_20,L4_8,B_16,D_36,L4_12,B_32 } /* e.g. pack */
|
||||
#define INSTR_SS_RRRDRD 6, { D_20,R_8,B_16,D_36,B_32,R_12 } /* e.g. mvck */
|
||||
#define INSTR_SS_RRRDRD2 6, { R_8,D_20,B_16,R_12,D_36,B_32 } /* e.g. plo */
|
||||
#define INSTR_SS_RRRDRD3 6, { R_8,R_12,D_20,B_16,D_36,B_32 } /* e.g. lmd */
|
||||
#define INSTR_SSF_RRDRD 6, { D_20,B_16,D_36,B_32,R_8,0 } /* e.g. mvcos */
|
||||
#define INSTR_SSF_RERDRD2 6, { RE_8,D_20,B_16,D_36,B_32,0 } /* e.g. lpd */
|
||||
#define INSTR_S_00 4, { 0,0,0,0,0,0 } /* e.g. hsch */
|
||||
#define INSTR_S_RD 4, { D_20,B_16,0,0,0,0 } /* e.g. stck */
|
||||
#define INSTR_VRV_VVXRDU 6, { V_8,D_20,VX_12,B_16,U4_32,0 } /* e.g. vgef */
|
||||
#define INSTR_VRI_V0U 6, { V_8,U16_16,0,0,0,0 } /* e.g. vgbm */
|
||||
#define INSTR_VRI_V 6, { V_8,0,0,0,0,0 } /* e.g. vzero */
|
||||
#define INSTR_VRI_V0UUU 6, { V_8,U8_16,U8_24,U4_32,0,0 } /* e.g. vgm */
|
||||
#define INSTR_VRI_V0UU 6, { V_8,U8_16,U8_24,0,0,0 } /* e.g. vgmb */
|
||||
#define INSTR_VRI_V0UU2 6, { V_8,U16_16,U4_32,0,0,0 } /* e.g. vlip */
|
||||
#define INSTR_VRI_VVUU 6, { V_8,V_12,U16_16,U4_32,0,0 } /* e.g. vrep */
|
||||
#define INSTR_VRI_VVU 6, { V_8,V_12,U16_16,0,0,0 } /* e.g. vrepb */
|
||||
#define INSTR_VRI_VVU2 6, { V_8,V_12,U12_16,0,0,0 } /* e.g. vftcidb */
|
||||
#define INSTR_VRI_V0IU 6, { V_8,I16_16,U4_32,0,0,0 } /* e.g. vrepi */
|
||||
#define INSTR_VRI_V0I 6, { V_8,I16_16,0,0,0,0 } /* e.g. vrepib */
|
||||
#define INSTR_VRI_VVV0UU 6, { V_8,V_12,V_16,U8_24,U4_32,0 } /* e.g. verim */
|
||||
#define INSTR_VRI_VVV0UU2 6, { V_8,V_12,V_16,U8_28,U4_24,0 } /* e.g. vap */
|
||||
#define INSTR_VRI_VVV0U 6, { V_8,V_12,V_16,U8_24,0,0 } /* e.g. verimb*/
|
||||
#define INSTR_VRI_VVUUU 6, { V_8,V_12,U12_16,U4_32,U4_28,0 } /* e.g. vftci */
|
||||
#define INSTR_VRI_VVUUU2 6, { V_8,V_12,U8_28,U8_16,U4_24,0 } /* e.g. vpsop */
|
||||
#define INSTR_VRI_VR0UU 6, { V_8,R_12,U8_28,U4_24,0,0 } /* e.g. vcvd */
|
||||
#define INSTR_VRX_VRRD 6, { V_8,D_20,X_12,B_16,0,0 } /* e.g. vl */
|
||||
#define INSTR_VRX_VV 6, { V_8,V_12,0,0,0,0 } /* e.g. vlr */
|
||||
#define INSTR_VRX_VRRDU 6, { V_8,D_20,X_12,B_16,U4_32,0 } /* e.g. vlrep */
|
||||
#define INSTR_VRS_RVRDU 6, { R_8,V_12,D_20,B_16,U4_32,0 } /* e.g. vlgv */
|
||||
#define INSTR_VRS_RVRD 6, { R_8,V_12,D_20,B_16,0,0 } /* e.g. vlgvb */
|
||||
#define INSTR_VRS_VVRDU 6, { V_8,V_12,D_20,B_16,U4_32,0 } /* e.g. verll */
|
||||
#define INSTR_VRS_VVRD 6, { V_8,V_12,D_20,B_16,0,0 } /* e.g. vlm */
|
||||
#define INSTR_VRS_VRRDU 6, { V_8,R_12,D_20,B_16,U4_32,0 } /* e.g. vlvg */
|
||||
#define INSTR_VRS_VRRD 6, { V_8,R_12,D_20,B_16,0,0 } /* e.g. vlvgb */
|
||||
#define INSTR_VRS_RRDV 6, { V_32,R_12,D_20,B_16,0,0 } /* e.g. vlrlr */
|
||||
#define INSTR_VRR_0V 6, { V_12,0,0,0,0,0 } /* e.g. vtp */
|
||||
#define INSTR_VRR_VRR 6, { V_8,R_12,R_16,0,0,0 } /* e.g. vlvgp */
|
||||
#define INSTR_VRR_VVV0U 6, { V_8,V_12,V_16,U4_32,0,0 } /* e.g. vmrh */
|
||||
#define INSTR_VRR_VVV0U0 6, { V_8,V_12,V_16,U4_24,0,0 } /* e.g. vfaeb */
|
||||
#define INSTR_VRR_VVV0U1 6, { V_8,V_12,V_16,U4_OR1_24,0,0 } /* e.g. vfaebs*/
|
||||
#define INSTR_VRR_VVV0U2 6, { V_8,V_12,V_16,U4_OR2_24,0,0 } /* e.g. vfaezb*/
|
||||
#define INSTR_VRR_VVV0U3 6, { V_8,V_12,V_16,U4_OR3_24,0,0 } /* e.g. vfaezbs*/
|
||||
#define INSTR_VRR_VVV 6, { V_8,V_12,V_16,0,0,0 } /* e.g. vmrhb */
|
||||
#define INSTR_VRR_VVV2 6, { V_8,V_CP16_12,0,0,0,0 } /* e.g. vnot */
|
||||
#define INSTR_VRR_VV0U 6, { V_8,V_12,U4_32,0,0,0 } /* e.g. vseg */
|
||||
#define INSTR_VRR_VV0U2 6, { V_8,V_12,U4_24,0,0,0 } /* e.g. vistrb*/
|
||||
#define INSTR_VRR_VV0UU 6, { V_8,V_12,U4_28,U4_24,0,0 } /* e.g. vcdgb */
|
||||
#define INSTR_VRR_VV0UU2 6, { V_8,V_12,U4_32,U4_28,0,0 } /* e.g. wfc */
|
||||
#define INSTR_VRR_VV0UU8 6, { V_8,V_12,U4_OR8_28,U4_24,0,0 } /* e.g. wcdgb */
|
||||
#define INSTR_VRR_VV 6, { V_8,V_12,0,0,0,0 } /* e.g. vsegb */
|
||||
#define INSTR_VRR_VVVUU0V 6, { V_8,V_12,V_16,V_32,U4_20,U4_24 } /* e.g. vstrc */
|
||||
#define INSTR_VRR_VVVU0V 6, { V_8,V_12,V_16,V_32,U4_20,0 } /* e.g. vac */
|
||||
#define INSTR_VRR_VVVU0VB 6, { V_8,V_12,V_16,V_32,U4_24,0 } /* e.g. vstrcb*/
|
||||
#define INSTR_VRR_VVVU0VB1 6, { V_8,V_12,V_16,V_32,U4_OR1_24,0 } /* e.g. vstrcbs*/
|
||||
#define INSTR_VRR_VVVU0VB2 6, { V_8,V_12,V_16,V_32,U4_OR2_24,0 } /* e.g. vstrczb*/
|
||||
#define INSTR_VRR_VVVU0VB3 6, { V_8,V_12,V_16,V_32,U4_OR3_24,0 } /* e.g. vstrczbs*/
|
||||
#define INSTR_VRR_VVV0V 6, { V_8,V_12,V_16,V_32,0,0 } /* e.g. vacq */
|
||||
#define INSTR_VRR_VVV0U0U 6, { V_8,V_12,V_16,U4_32,U4_24,0 } /* e.g. vfae */
|
||||
#define INSTR_VRR_VVVV 6, { V_8,V_12,V_16,V_32,0,0 } /* e.g. vfmadb*/
|
||||
#define INSTR_VRR_VVV0UUU 6, { V_8,V_12,V_16,U4_32,U4_28,U4_24 }/* e.g. vfch */
|
||||
#define INSTR_VRR_VVV0UU 6, { V_8,V_12,V_16,U4_32,U4_28,0 } /* e.g. vfa */
|
||||
#define INSTR_VRR_VV0UUU 6, { V_8,V_12,U4_32,U4_28,U4_24,0 } /* e.g. vcdg */
|
||||
#define INSTR_VRR_VVVU0UV 6, { V_8,V_12,V_16,V_32,U4_28,U4_20 } /* e.g. vfma */
|
||||
#define INSTR_VRR_VV0U0U 6, { V_8,V_12,U4_32,U4_24,0,0 } /* e.g. vistr */
|
||||
#define INSTR_VRR_0VV0U 6, { V_12,V_16,U4_24,0,0,0 } /* e.g. vcp */
|
||||
#define INSTR_VRR_RV0U 6, { R_8,V_12,U4_24,0,0,0 } /* e.g. vcvb */
|
||||
#define INSTR_VRR_RV0UU 6, { R_8,V_12,U4_24,U4_28,0,0 } /* e.g. vcvb */
|
||||
#define INSTR_VSI_URDV 6, { V_32,D_20,B_16,U8_8,0,0 } /* e.g. vlrl */
|
||||
|
||||
#define MASK_E { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_IE_UU { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_MII_UPP { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RIE_RRP { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_RRPU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_RRP0 { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_RIE_RRI0 { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_RIE_RUPI { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_R0PI { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_RUPU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_R0PU { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_R0IU { 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RIE_R0I0 { 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RIE_R0UU { 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RIE_R0U0 { 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RIE_RUI0 { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RIE_RRUUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIE_RRUUU2 { 0xff, 0x00, 0x00, 0xc0, 0x00, 0xff }
|
||||
#define MASK_RIL_0P { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RIL_RP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RIL_UP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RIL_RI { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RIL_RU { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RI_0P { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RI_RI { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RI_RP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RI_RU { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RI_UP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RIS_RURDI { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIS_R0RDI { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIS_RURDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RIS_R0RDU { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RRE_00 { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 }
|
||||
#define MASK_RRE_0R { 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00 }
|
||||
#define MASK_RRE_AA { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_AR { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_F0 { 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00 }
|
||||
#define MASK_RRE_FE0 { 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00 }
|
||||
#define MASK_RRE_FF { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_FEF { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_FFE { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_FEFE { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_R0 { 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00 }
|
||||
#define MASK_RRE_RA { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_RF { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_RFE { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_RR { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_RER { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_RERE { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_FR { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRE_FER { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_F0FF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FE0FF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_F0FF2 { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_F0FR { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FE0FER { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FUFF { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FEUFEFE { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FUFF2 { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FEUFEFE2 { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_RURR { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_RURR2 { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_R0RR { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_R0RR2 { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_R0RR3 { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0FF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0FEFE { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0RF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0RFE { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UUFF { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UUFFE { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UUFEFE { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_0UFF { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_0UFEF { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FFRU { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_FEFERU { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0RR { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0RER { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_U0RERE { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_00RR { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_0URF { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_0UREFE { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UUFR { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UUFER { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UURF { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRF_UURFE { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_0R { 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_FF { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_FEF { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_FFE { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_FEFE { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_R0 { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_RR { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_RER { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_U0 { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RR_UR { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRR_F0FF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRR_FE0FEFE { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RRS_RRRDU { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RRS_RRRD0 { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RSE_RRRD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RSE_RERERD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RSE_CCRD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RSE_RURD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RSL_R0RD { 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RSL_LRDFU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSL_LRDFEU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSI_RRP { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_AARD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_CCRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_R0RD { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_RE0RD { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_RRRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_RERERD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RS_RURD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RSY_RRRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSY_RERERD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSY_RURD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSY_RURD2 { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSY_R0RD { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSY_AARD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RSY_CCRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RXE_FRRD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RXE_FERRD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RXE_RRRD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RXE_RRRDU { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RXE_RERRD { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
|
||||
#define MASK_RXF_FRRDF { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RXF_FRRDFE { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RXF_FERRDFE { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RXF_RRRDR { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
|
||||
#define MASK_RXY_RRRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RXY_RERRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RXY_FRRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RXY_URRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RXY_0RRD { 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_RX_0RRD { 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RX_FRRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RX_FERRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RX_RRRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RX_RERRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_RX_URRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SI_RD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SI_URD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SIY_URD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_SIY_IRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_SIL_RDI { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SIL_RDU { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SMI_U0RDP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SSE_RDRD { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_L0RDRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_L2RDRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_LIRDRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_LLRDRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_RRRDRD { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_RRRDRD2 { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SS_RRRDRD3 { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SSF_RRDRD { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_SSF_RERDRD2 { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_S_00 { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 }
|
||||
#define MASK_S_RD { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||
#define MASK_VRV_VVXRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_V0U { 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRI_V { 0xff, 0x0f, 0xff, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRI_V0UUU { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_V0UU { 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRI_V0UU2 { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_VVUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_VVU { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRI_VVU2 { 0xff, 0x00, 0x00, 0x0f, 0xf0, 0xff }
|
||||
#define MASK_VRI_V0IU { 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_V0I { 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRI_VVV0UU { 0xff, 0x00, 0x0f, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_VVV0UU2 { 0xff, 0x00, 0x0f, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_VVV0U { 0xff, 0x00, 0x0f, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRI_VVUUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_VVUUU2 { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRI_VR0UU { 0xff, 0x00, 0xff, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRX_VRRD { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRX_VV { 0xff, 0x00, 0xff, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRX_VRRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRS_RVRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRS_RVRD { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRS_VVRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRS_VVRD { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRS_VRRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRS_VRRD { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRS_RRDV { 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRR_0V { 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRR_VRR { 0xff, 0x00, 0x0f, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV0U { 0xff, 0x00, 0x0f, 0xff, 0x00, 0xff }
|
||||
#define MASK_VRR_VVV0U0 { 0xff, 0x00, 0x0f, 0x0f, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV0U1 { 0xff, 0x00, 0x0f, 0x1f, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV0U2 { 0xff, 0x00, 0x0f, 0x2f, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV0U3 { 0xff, 0x00, 0x0f, 0x3f, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV { 0xff, 0x00, 0x0f, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV2 { 0xff, 0x00, 0x0f, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVV0V { 0xff, 0x00, 0x0f, 0xff, 0x00, 0xff }
|
||||
#define MASK_VRR_VV0U { 0xff, 0x00, 0xff, 0xff, 0x00, 0xff }
|
||||
#define MASK_VRR_VV0U2 { 0xff, 0x00, 0xff, 0x0f, 0xf0, 0xff }
|
||||
#define MASK_VRR_VV0UU { 0xff, 0x00, 0xff, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VRR_VV0UU2 { 0xff, 0x00, 0xff, 0xf0, 0x00, 0xff }
|
||||
#define MASK_VRR_VV0UU8 { 0xff, 0x00, 0xff, 0x08, 0xf0, 0xff }
|
||||
#define MASK_VRR_VV { 0xff, 0x00, 0xff, 0xff, 0xf0, 0xff }
|
||||
#define MASK_VRR_VVVUU0V { 0xff, 0x00, 0x00, 0x0f, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVU0V { 0xff, 0x00, 0x00, 0xff, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVU0VB { 0xff, 0x00, 0x0f, 0x0f, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVU0VB1 { 0xff, 0x00, 0x0f, 0x1f, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVU0VB2 { 0xff, 0x00, 0x0f, 0x2f, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVU0VB3 { 0xff, 0x00, 0x0f, 0x3f, 0x00, 0xff }
|
||||
#define MASK_VRR_VVV0U0U { 0xff, 0x00, 0x0f, 0x0f, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVV { 0xff, 0x00, 0x0f, 0xff, 0x00, 0xff }
|
||||
#define MASK_VRR_VVV0UUU { 0xff, 0x00, 0x0f, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRR_VVV0UU { 0xff, 0x00, 0x0f, 0xf0, 0x00, 0xff }
|
||||
#define MASK_VRR_VV0UUU { 0xff, 0x00, 0xff, 0x00, 0x00, 0xff }
|
||||
#define MASK_VRR_VVVU0UV { 0xff, 0x00, 0x00, 0xf0, 0x00, 0xff }
|
||||
#define MASK_VRR_VV0U0U { 0xff, 0x00, 0xff, 0x0f, 0x00, 0xff }
|
||||
#define MASK_VRR_0VV0U { 0xff, 0xf0, 0x0f, 0x0f, 0xf0, 0xff }
|
||||
#define MASK_VRR_RV0U { 0xff, 0x00, 0xff, 0x0f, 0xf0, 0xff }
|
||||
#define MASK_VRR_RV0UU { 0xff, 0x00, 0xff, 0x00, 0xf0, 0xff }
|
||||
#define MASK_VSI_URDV { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
|
||||
|
||||
|
||||
/* The opcode formats table (blueprints for .insn pseudo mnemonic). */
|
||||
|
||||
const struct s390_opcode s390_opformats[] =
|
||||
{
|
||||
{ "e", OP8(0x00LL), MASK_E, INSTR_E, 3, 0 ,0 },
|
||||
{ "ri", OP8(0x00LL), MASK_RI_RI, INSTR_RI_RI, 3, 0 ,0 },
|
||||
{ "rie", OP8(0x00LL), MASK_RIE_RRP, INSTR_RIE_RRP, 3, 0 ,0 },
|
||||
{ "ril", OP8(0x00LL), MASK_RIL_RP, INSTR_RIL_RP, 3, 0 ,0 },
|
||||
{ "rilu", OP8(0x00LL), MASK_RIL_RU, INSTR_RIL_RU, 3, 0 ,0 },
|
||||
{ "ris", OP8(0x00LL), MASK_RIS_RURDI, INSTR_RIS_RURDI, 3, 6 ,0 },
|
||||
{ "rr", OP8(0x00LL), MASK_RR_RR, INSTR_RR_RR, 3, 0 ,0 },
|
||||
{ "rre", OP8(0x00LL), MASK_RRE_RR, INSTR_RRE_RR, 3, 0 ,0 },
|
||||
{ "rrf", OP8(0x00LL), MASK_RRF_RURR, INSTR_RRF_RURR, 3, 0 ,0 },
|
||||
{ "rrs", OP8(0x00LL), MASK_RRS_RRRDU, INSTR_RRS_RRRDU, 3, 6 ,0 },
|
||||
{ "rs", OP8(0x00LL), MASK_RS_RRRD, INSTR_RS_RRRD, 3, 0 ,0 },
|
||||
{ "rse", OP8(0x00LL), MASK_RSE_RRRD, INSTR_RSE_RRRD, 3, 0 ,0 },
|
||||
{ "rsi", OP8(0x00LL), MASK_RSI_RRP, INSTR_RSI_RRP, 3, 0 ,0 },
|
||||
{ "rsy", OP8(0x00LL), MASK_RSY_RRRD, INSTR_RSY_RRRD, 3, 3 ,0 },
|
||||
{ "rx", OP8(0x00LL), MASK_RX_RRRD, INSTR_RX_RRRD, 3, 0 ,0 },
|
||||
{ "rxe", OP8(0x00LL), MASK_RXE_RRRD, INSTR_RXE_RRRD, 3, 0 ,0 },
|
||||
{ "rxf", OP8(0x00LL), MASK_RXF_RRRDR, INSTR_RXF_RRRDR, 3, 0 ,0 },
|
||||
{ "rxy", OP8(0x00LL), MASK_RXY_RRRD, INSTR_RXY_RRRD, 3, 3 ,0 },
|
||||
{ "s", OP8(0x00LL), MASK_S_RD, INSTR_S_RD, 3, 0 ,0 },
|
||||
{ "si", OP8(0x00LL), MASK_SI_URD, INSTR_SI_URD, 3, 0 ,0 },
|
||||
{ "siy", OP8(0x00LL), MASK_SIY_URD, INSTR_SIY_URD, 3, 3 ,0 },
|
||||
{ "sil", OP8(0x00LL), MASK_SIL_RDI, INSTR_SIL_RDI, 3, 6 ,0 },
|
||||
{ "ss", OP8(0x00LL), MASK_SS_RRRDRD, INSTR_SS_RRRDRD, 3, 0 ,0 },
|
||||
{ "sse", OP8(0x00LL), MASK_SSE_RDRD, INSTR_SSE_RDRD, 3, 0 ,0 },
|
||||
{ "ssf", OP8(0x00LL), MASK_SSF_RRDRD, INSTR_SSF_RRDRD, 3, 0 ,0 },
|
||||
{ "vrv", OP8(0x00LL), MASK_VRV_VVXRDU, INSTR_VRV_VVXRDU, 3, 9 ,0 },
|
||||
{ "vri", OP8(0x00LL), MASK_VRI_VVUUU, INSTR_VRI_VVUUU, 3, 9 ,0 },
|
||||
{ "vrx", OP8(0x00LL), MASK_VRX_VRRDU, INSTR_VRX_VRRDU, 3, 9 ,0 },
|
||||
{ "vrs", OP8(0x00LL), MASK_VRS_RVRDU, INSTR_VRS_RVRDU, 3, 9 ,0 },
|
||||
{ "vrr", OP8(0x00LL), MASK_VRR_VVV0UUU, INSTR_VRR_VVV0UUU, 3, 9 ,0 },
|
||||
{ "vsi", OP8(0x00LL), MASK_VSI_URDV, INSTR_VSI_URDV, 3, 10 ,0 },
|
||||
};
|
||||
|
||||
const int s390_num_opformats =
|
||||
sizeof (s390_opformats) / sizeof (s390_opformats[0]);
|
||||
|
||||
#include "s390-opc.tab"
|
2644
libr/asm/arch/s390/gnu/s390-opc.tab
Normal file
2644
libr/asm/arch/s390/gnu/s390-opc.tab
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
FILES=6502 8051 m68k x86 arc arm avr LH5801 ppc z80 mips sparc sh malbolge xtensa
|
||||
FILES+=i8080 java i4004 dalvik msp430 lm32 sysz tms320 riscv propeller v810 v850
|
||||
FILES+=i8080 java i4004 dalvik msp430 lm32 s390 tms320 riscv propeller v810 v850
|
||||
FILES+=pic18c chip8 tricore
|
||||
F_SDB=$(addsuffix .sdb,${FILES})
|
||||
SDB=../../../shlr/sdb/sdb
|
||||
|
@ -20,7 +20,7 @@ sdb_files = [
|
||||
'riscv',
|
||||
'sh',
|
||||
'sparc',
|
||||
'sysz',
|
||||
's390',
|
||||
'tms320',
|
||||
'tricore',
|
||||
'v810',
|
||||
|
@ -56,7 +56,8 @@ r_asm_sources = [
|
||||
'p/asm_snes.c',
|
||||
'p/asm_sparc_cs.c',
|
||||
'p/asm_sparc_gnu.c',
|
||||
'p/asm_sysz.c',
|
||||
'p/asm_s390_cs.c',
|
||||
'p/asm_s390_gnu.c',
|
||||
'p/asm_tms320.c',
|
||||
'p/asm_tms320c64x.c',
|
||||
'p/asm_tricore.c',
|
||||
@ -132,6 +133,8 @@ r_asm_sources = [
|
||||
'arch/pic/pic_midrange.c',
|
||||
'arch/pic/pic_pic18.c',
|
||||
'arch/mcore/mcore.c',
|
||||
'arch/s390/gnu/s390-dis.c',
|
||||
'arch/s390/gnu/s390-opc.c',
|
||||
'arch/ppc/gnu/ppc-dis.c',
|
||||
'arch/ppc/gnu/ppc-opc.c',
|
||||
'arch/ppc/libvle/vle.c',
|
||||
|
@ -23,7 +23,7 @@ ARCHS+=ppc_gnu.mk ppc_as.mk ppc_cs.mk xap.mk x86_nasm.mk avr.mk
|
||||
ARCHS+=sh.mk arm_winedbg.mk tms320.mk gb.mk snes.mk ebc.mk malbolge.mk ws.mk
|
||||
ARCHS+=6502.mk h8300.mk cr16.mk v850.mk propeller.mk msp430.mk i4004.mk
|
||||
ARCHS+=lh5801.mk v810.mk mcs96.mk lm32.mk
|
||||
ARCHS+=riscv.mk rsp.mk mcore.mk
|
||||
ARCHS+=riscv.mk rsp.mk mcore.mk s390_cs.mk s390_gnu.mk
|
||||
include $(ARCHS)
|
||||
|
||||
clean:
|
||||
|
@ -53,11 +53,11 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
|
||||
return op->size;
|
||||
}
|
||||
|
||||
RAsmPlugin r_asm_plugin_sysz = {
|
||||
.name = "sysz",
|
||||
.desc = "SystemZ CPU disassembler",
|
||||
RAsmPlugin r_asm_plugin_s390_cs = {
|
||||
.name = "s390",
|
||||
.desc = "s390/SystemZ CPU disassembler",
|
||||
.license = "BSD",
|
||||
.arch = "sysz",
|
||||
.arch = "s390",
|
||||
.bits = 32 | 64,
|
||||
.endian = R_SYS_ENDIAN_BIG,
|
||||
.fini = the_end,
|
||||
@ -67,7 +67,7 @@ RAsmPlugin r_asm_plugin_sysz = {
|
||||
#ifndef R2_PLUGIN_INCORE
|
||||
R_API RLibStruct radare_plugin = {
|
||||
.type = R_LIB_TYPE_ASM,
|
||||
.data = &r_asm_plugin_sysz,
|
||||
.data = &r_asm_plugin_s390_cs,
|
||||
.version = R2_VERSION
|
||||
};
|
||||
#endif
|
93
libr/asm/p/asm_s390_gnu.c
Normal file
93
libr/asm/p/asm_s390_gnu.c
Normal file
@ -0,0 +1,93 @@
|
||||
/* radare - LGPL - Copyright 2021 - pancake */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <r_types.h>
|
||||
#include <r_lib.h>
|
||||
#include <r_util.h>
|
||||
#include <r_asm.h>
|
||||
|
||||
#include "disas-asm.h"
|
||||
|
||||
|
||||
static unsigned long Offset = 0;
|
||||
static RStrBuf *buf_global = NULL;
|
||||
static unsigned char bytes[4];
|
||||
|
||||
static int s390_buffer_read_memory (bfd_vma memaddr, bfd_byte *myaddr, ut32 length, struct disassemble_info *info) {
|
||||
int delta = (memaddr - Offset);
|
||||
if (delta < 0) {
|
||||
return -1; // disable backward reads
|
||||
}
|
||||
if ((delta + length) > 4) {
|
||||
return -1;
|
||||
}
|
||||
memcpy (myaddr, bytes + delta, length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int symbol_at_address(bfd_vma addr, struct disassemble_info * info) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void memory_error_func(int status, bfd_vma memaddr, struct disassemble_info *info) {
|
||||
//--
|
||||
}
|
||||
|
||||
DECLARE_GENERIC_PRINT_ADDRESS_FUNC()
|
||||
DECLARE_GENERIC_FPRINTF_FUNC()
|
||||
|
||||
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
|
||||
char options[64];
|
||||
struct disassemble_info disasm_obj;
|
||||
if (len < 4) {
|
||||
return -1;
|
||||
}
|
||||
buf_global = &op->buf_asm;
|
||||
Offset = a->pc;
|
||||
memcpy (bytes, buf, 4); // TODO handle thumb
|
||||
|
||||
/* prepare disassembler */
|
||||
memset (&disasm_obj, '\0', sizeof (struct disassemble_info));
|
||||
if (!R_STR_ISEMPTY (a->cpu)) {
|
||||
r_str_ncpy (options, a->cpu, sizeof (options));
|
||||
} else {
|
||||
*options = 0;
|
||||
}
|
||||
disasm_obj.disassembler_options = options;
|
||||
disasm_obj.buffer = bytes;
|
||||
disasm_obj.read_memory_func = &s390_buffer_read_memory;
|
||||
disasm_obj.symbol_at_address_func = &symbol_at_address;
|
||||
disasm_obj.memory_error_func = &memory_error_func;
|
||||
disasm_obj.print_address_func = &generic_print_address_func;
|
||||
disasm_obj.endian = !a->big_endian;
|
||||
disasm_obj.fprintf_func = &generic_fprintf_func;
|
||||
disasm_obj.stream = stdout;
|
||||
disassemble_init_s390 (&disasm_obj);
|
||||
op->size = print_insn_s390 ((bfd_vma)Offset, &disasm_obj);
|
||||
if (op->size == -1) {
|
||||
r_asm_op_set_asm (op, "(data)");
|
||||
}
|
||||
return op->size;
|
||||
}
|
||||
|
||||
RAsmPlugin r_asm_plugin_s390_gnu = {
|
||||
.name = "s390.gnu",
|
||||
.desc = "s390/SystemZ CPU disassembler",
|
||||
.arch = "s390",
|
||||
.license = "GPL3",
|
||||
.cpus = "esa,zarch",
|
||||
.bits = 32 | 64,
|
||||
.endian = R_SYS_ENDIAN_BIG,
|
||||
.disassemble = &disassemble
|
||||
};
|
||||
|
||||
#ifndef R2_PLUGIN_INCORE
|
||||
R_API RLibStruct radare_plugin = {
|
||||
.type = R_LIB_TYPE_ASM,
|
||||
.data = &r_asm_plugin_s390_gnu,
|
||||
.version = R2_VERSION
|
||||
};
|
||||
#endif
|
15
libr/asm/p/s390_cs.mk
Normal file
15
libr/asm/p/s390_cs.mk
Normal file
@ -0,0 +1,15 @@
|
||||
OBJ_S390CS=asm_s390_cs.o
|
||||
|
||||
include p/capstone.mk
|
||||
|
||||
STATIC_OBJ+=${OBJ_S390CS}
|
||||
SHARED_OBJ+=${SHARED_S390CS}
|
||||
TARGET_S390CS=asm_s390_cs.${EXT_SO}
|
||||
|
||||
ifeq ($(WITHPIC),1)
|
||||
ALL_TARGETS+=${TARGET_S390CS}
|
||||
|
||||
${TARGET_S390CS}: ${OBJ_S390CS}
|
||||
${CC} $(call libname,asm_s390_cs) ${LDFLAGS} ${CFLAGS} $(CS_LDFLAGS) \
|
||||
-o ${TARGET_S390CS} ${OBJ_S390CS} ${SHARED2_S390CS}
|
||||
endif
|
13
libr/asm/p/s390_gnu.mk
Normal file
13
libr/asm/p/s390_gnu.mk
Normal file
@ -0,0 +1,13 @@
|
||||
OBJ_S390=asm_s390_gnu.o
|
||||
OBJ_S390+=../arch/s390/gnu/s390-dis.o
|
||||
OBJ_S390+=../arch/s390/gnu/s390-opc.o
|
||||
|
||||
STATIC_OBJ+=${OBJ_S390}
|
||||
TARGET_S390=asm_s390_gnu.${EXT_SO}
|
||||
|
||||
ifeq ($(WITHPIC),1)
|
||||
ALL_TARGETS+=${TARGET_S390}
|
||||
|
||||
${TARGET_S390}: ${OBJ_S390}
|
||||
${CC} $(call libname,asm_s390_gnu) ${LDFLAGS} ${CFLAGS} -o asm_s390_gnu.${EXT_SO} ${OBJ_S390}
|
||||
endif
|
@ -1,15 +0,0 @@
|
||||
OBJ_SYSZCS=asm_sysz.o
|
||||
|
||||
include p/capstone.mk
|
||||
|
||||
STATIC_OBJ+=${OBJ_SYSZCS}
|
||||
SHARED_OBJ+=${SHARED_SYSZCS}
|
||||
TARGET_SYSZCS=asm_sysz.${EXT_SO}
|
||||
|
||||
ifeq ($(WITHPIC),1)
|
||||
ALL_TARGETS+=${TARGET_SYSZCS}
|
||||
|
||||
${TARGET_SYSZCS}: ${OBJ_SYSZCS}
|
||||
${CC} $(call libname,asm_sysz) ${LDFLAGS} ${CFLAGS} $(CS_LDFLAGS) \
|
||||
-o ${TARGET_SYSZCS} ${OBJ_SYSZCS} ${SHARED2_SYSZCS}
|
||||
endif
|
@ -2117,7 +2117,7 @@ char* Elf_(r_bin_elf_get_arch)(ELFOBJ *bin) {
|
||||
case EM_IA_64:
|
||||
return strdup ("ia64");
|
||||
case EM_S390:
|
||||
return strdup ("sysz");
|
||||
return strdup ("s390");
|
||||
default: return strdup ("x86");
|
||||
}
|
||||
}
|
||||
|
@ -2188,7 +2188,7 @@ extern RAnalPlugin r_anal_plugin_sh;
|
||||
extern RAnalPlugin r_anal_plugin_snes;
|
||||
extern RAnalPlugin r_anal_plugin_sparc_cs;
|
||||
extern RAnalPlugin r_anal_plugin_sparc_gnu;
|
||||
extern RAnalPlugin r_anal_plugin_sysz;
|
||||
extern RAnalPlugin r_anal_plugin_s390_cs;
|
||||
extern RAnalPlugin r_anal_plugin_tms320;
|
||||
extern RAnalPlugin r_anal_plugin_tms320c64x;
|
||||
extern RAnalPlugin r_anal_plugin_tricore;
|
||||
|
@ -251,7 +251,8 @@ extern RAsmPlugin r_asm_plugin_sh;
|
||||
extern RAsmPlugin r_asm_plugin_snes;
|
||||
extern RAsmPlugin r_asm_plugin_sparc_cs;
|
||||
extern RAsmPlugin r_asm_plugin_sparc_gnu;
|
||||
extern RAsmPlugin r_asm_plugin_sysz;
|
||||
extern RAsmPlugin r_asm_plugin_s390_cs;
|
||||
extern RAsmPlugin r_asm_plugin_s390_gnu;
|
||||
extern RAsmPlugin r_asm_plugin_tms320;
|
||||
extern RAsmPlugin r_asm_plugin_tms320c64x;
|
||||
extern RAsmPlugin r_asm_plugin_tricore;
|
||||
|
@ -569,7 +569,7 @@ typedef enum {
|
||||
R_SYS_ARCH_H8300,
|
||||
R_SYS_ARCH_CR16,
|
||||
R_SYS_ARCH_V850,
|
||||
R_SYS_ARCH_SYSZ,
|
||||
R_SYS_ARCH_S390,
|
||||
R_SYS_ARCH_XCORE,
|
||||
R_SYS_ARCH_PROPELLER,
|
||||
R_SYS_ARCH_MSP430,
|
||||
|
@ -159,7 +159,7 @@ anal_plugins += [
|
||||
'sh',
|
||||
'snes',
|
||||
'sparc_cs',
|
||||
'sysz',
|
||||
's390_cs',
|
||||
'tms320',
|
||||
#'tms320c64x',
|
||||
'tricore',
|
||||
@ -215,7 +215,7 @@ asm_plugins += [
|
||||
'sh',
|
||||
'snes',
|
||||
'sparc_cs',
|
||||
'sysz',
|
||||
's390_cs',
|
||||
'tms320',
|
||||
'tms320c64x',
|
||||
'tricore',
|
||||
@ -244,6 +244,7 @@ if no_user_plugins
|
||||
'mips_gnu',
|
||||
'ppc_gnu',
|
||||
'sparc_gnu',
|
||||
's390_gnu',
|
||||
'v850_gnu',
|
||||
]
|
||||
anal_plugins += [
|
||||
|
@ -1,7 +1,7 @@
|
||||
NAME=aoj 4140f008
|
||||
FILE=-
|
||||
CMDS=<<EOF
|
||||
e asm.arch=sysz
|
||||
e asm.arch=s390
|
||||
e asm.bits=64
|
||||
wx 4140f008
|
||||
aoj~{}
|
Loading…
x
Reference in New Issue
Block a user