mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
arc: Add new opcode functions for ARCv3 ISA.
opcodes/ xxxx-xx-xx Claudiu Zissulescu <claziss@synopsys.com> Cupertino Miranda <cmiranda@synopsys.com> * opcodes/Makefile.am: Add ARC64 opcode file. * opcodes/Makefile.in: Regenerate. * opcodes/arc-opc.c: Move the common functionality to arcxx-opc.inc. Keep only ARCv2 ARCv1 specifics. * opcodes/arc-ext-tbl.h: Deleted file. * opcodes/arcxx-opc.inc: New file. * opcodes/arc64-opc.c: Likewise. * opcodes/arc-fxi.h (insert_uimm9_a32_11_s): New function. (extract_uimm9_a32_11_s): Likewise. (insert_uimm10_13_s): Likewise. (extract_uimm10_13_s): Likewise. * opcodes/configure: Regenerate. * opcodes/configure.ac: Add ARC64 target. * opcodes/disassemble.c: Likewise. * opcodes/arc-dis.c (regmod_t): New type. (regmods): New structure. (fpnames): New strings with fp-regs name. (REG_PCL, REG_LIMM, REG_LIMM_S, REG_U32, REG_S32): New defines. (getregname): New function. (find_format_from_table): Discriminate between signed and unsigned 32bit immediates. (find_format): Handle extract function for flags. (arc_insn_length): Update insn lengths to various architectures. (print_insn_arc): Update printing for various ARC architectures. * opcodes/arc-flag-classes.def: New file. * opcodes/arc-flag.def: New file. * opcodes/arc-operands.def: New file. * opcodes/arc-regs.h: Changed. Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
This commit is contained in:
parent
f3d38d7d0b
commit
c99dc76089
@ -116,6 +116,7 @@ TARGET32_LIBOPCODES_CFILES = \
|
||||
arc-dis.c \
|
||||
arc-ext.c \
|
||||
arc-opc.c \
|
||||
arc64-opc.c \
|
||||
arm-dis.c \
|
||||
avr-dis.c \
|
||||
bfin-dis.c \
|
||||
|
@ -508,6 +508,7 @@ TARGET32_LIBOPCODES_CFILES = \
|
||||
arc-dis.c \
|
||||
arc-ext.c \
|
||||
arc-opc.c \
|
||||
arc64-opc.c \
|
||||
arm-dis.c \
|
||||
avr-dis.c \
|
||||
bfin-dis.c \
|
||||
@ -876,6 +877,7 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arc-dis.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arc-ext.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arc-opc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arc64-opc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm-dis.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avr-dis.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bfin-dis.Plo@am__quote@
|
||||
|
@ -60,7 +60,7 @@ struct arc_disassemble_info
|
||||
/* Instruction length w/o limm field. */
|
||||
unsigned insn_len;
|
||||
|
||||
/* TRUE if we have limm. */
|
||||
/* true if we have limm. */
|
||||
bool limm_p;
|
||||
|
||||
/* LIMM value, if exists. */
|
||||
@ -85,7 +85,7 @@ static const char * const regnames[64] =
|
||||
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
||||
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
|
||||
"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
|
||||
"r24", "r25", "gp", "fp", "sp", "ilink", "r30", "blink",
|
||||
"r24", "r25", "r26", "fp", "sp", "ilink", "r30", "blink",
|
||||
|
||||
"r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
|
||||
"r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
|
||||
@ -93,6 +93,29 @@ static const char * const regnames[64] =
|
||||
"r56", "r57", "r58", "r59", "lp_count", "reserved", "LIMM", "pcl"
|
||||
};
|
||||
|
||||
typedef struct regmod
|
||||
{
|
||||
const unsigned int index;
|
||||
const unsigned int isa;
|
||||
const char *rname;
|
||||
} regmod_t;
|
||||
|
||||
static regmod_t regmods[] =
|
||||
{
|
||||
{ 26, ARC_OPCODE_ARCV1 | ARC_OPCODE_ARCV2, "gp" },
|
||||
{ 29, ARC_OPCODE_ARCV1, "ilink1" },
|
||||
{ 30, ARC_OPCODE_ARCV1, "ilink2" },
|
||||
{ 0, ARC_OPCODE_NONE, 0 }
|
||||
};
|
||||
|
||||
static const char * const fpnames[32] =
|
||||
{
|
||||
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
|
||||
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
|
||||
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
|
||||
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
|
||||
};
|
||||
|
||||
static const char * const addrtypenames[ARC_NUM_ADDRTYPES] =
|
||||
{
|
||||
"bd", "jid", "lbd", "mbd", "sd", "sm", "xa", "xd",
|
||||
@ -126,7 +149,6 @@ static unsigned enforced_isa_mask = ARC_OPCODE_NONE;
|
||||
static bool print_hex = false;
|
||||
|
||||
/* Macros section. */
|
||||
|
||||
#ifdef DEBUG
|
||||
# define pr_debug(fmt, args...) fprintf (stderr, fmt, ##args)
|
||||
#else
|
||||
@ -140,8 +162,29 @@ static bool print_hex = false;
|
||||
#define BITS(word,s,e) (((word) >> (s)) & ((1ull << ((e) - (s)) << 1) - 1))
|
||||
#define OPCODE_32BIT_INSN(word) (BITS ((word), 27, 31))
|
||||
|
||||
#define REG_PCL 63
|
||||
#define REG_LIMM 62
|
||||
#define REG_LIMM_S 30
|
||||
#define REG_U32 62
|
||||
#define REG_S32 60
|
||||
|
||||
/* Functions implementation. */
|
||||
|
||||
static const char *
|
||||
getregname (unsigned int index, unsigned int isa_mask)
|
||||
{
|
||||
regmod_t *iregmods = regmods;
|
||||
while (iregmods->rname)
|
||||
{
|
||||
if (index == iregmods->index
|
||||
&& (isa_mask & iregmods->isa))
|
||||
return iregmods->rname;
|
||||
iregmods ++;
|
||||
}
|
||||
|
||||
return regnames[index % 64];
|
||||
}
|
||||
|
||||
/* Initialize private data. */
|
||||
static bool
|
||||
init_arc_disasm_info (struct disassemble_info *info)
|
||||
@ -170,7 +213,7 @@ add_to_decodelist (insn_class_t insn_class,
|
||||
decodelist = t;
|
||||
}
|
||||
|
||||
/* Return TRUE if we need to skip the opcode from being
|
||||
/* Return true if we need to skip the opcode from being
|
||||
disassembled. */
|
||||
|
||||
static bool
|
||||
@ -277,7 +320,7 @@ find_format_from_table (struct disassemble_info *info,
|
||||
if (arc_opcode_len (opcode) != (int) insn_len)
|
||||
continue;
|
||||
|
||||
if ((insn & opcode->mask) != opcode->opcode)
|
||||
if ((insn & opcode->mask) != (opcode->mask & opcode->opcode))
|
||||
continue;
|
||||
|
||||
*has_limm = false;
|
||||
@ -285,7 +328,7 @@ find_format_from_table (struct disassemble_info *info,
|
||||
/* Possible candidate, check the operands. */
|
||||
for (opidx = opcode->operands; *opidx; opidx++)
|
||||
{
|
||||
int value, limmind;
|
||||
int value, slimmind;
|
||||
const struct arc_operand *operand = &arc_operands[*opidx];
|
||||
|
||||
if (operand->flags & ARC_OPERAND_FAKE)
|
||||
@ -296,19 +339,19 @@ find_format_from_table (struct disassemble_info *info,
|
||||
else
|
||||
value = (insn >> operand->shift) & ((1ull << operand->bits) - 1);
|
||||
|
||||
/* Check for LIMM indicator. If it is there, then make sure
|
||||
we pick the right format. */
|
||||
limmind = (isa_mask & ARC_OPCODE_ARCV2) ? 0x1E : 0x3E;
|
||||
/* Check for (short) LIMM indicator. If it is there, then
|
||||
make sure we pick the right format. */
|
||||
slimmind = (isa_mask & ARC_OPCODE_ARCVx) ? REG_LIMM_S : REG_LIMM;
|
||||
if (operand->flags & ARC_OPERAND_IR
|
||||
&& !(operand->flags & ARC_OPERAND_LIMM))
|
||||
{
|
||||
if ((value == 0x3E && insn_len == 4)
|
||||
|| (value == limmind && insn_len == 2))
|
||||
{
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((value == REG_LIMM && insn_len == 4)
|
||||
|| (value == slimmind && insn_len == 2)
|
||||
|| (isa_mask & ARC_OPCODE_ARC64
|
||||
&& (value == REG_S32) && (insn_len == 4)))
|
||||
{
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (operand->flags & ARC_OPERAND_LIMM
|
||||
&& !(operand->flags & ARC_OPERAND_DUPLICATE))
|
||||
@ -338,11 +381,15 @@ find_format_from_table (struct disassemble_info *info,
|
||||
|
||||
for (flgopridx = cl_flags->flags; *flgopridx; ++flgopridx)
|
||||
{
|
||||
bool tmp = false;
|
||||
const struct arc_flag_operand *flg_operand =
|
||||
&arc_flag_operands[*flgopridx];
|
||||
|
||||
value = (insn >> flg_operand->shift)
|
||||
& ((1 << flg_operand->bits) - 1);
|
||||
if (cl_flags->extract)
|
||||
value = (*cl_flags->extract)(insn, &tmp);
|
||||
else
|
||||
value = (insn >> flg_operand->shift)
|
||||
& ((1 << flg_operand->bits) - 1);
|
||||
if (value == flg_operand->code)
|
||||
foundA = 1;
|
||||
if (value)
|
||||
@ -396,15 +443,15 @@ find_format_from_table (struct disassemble_info *info,
|
||||
the found opcode requires a LIMM then the LIMM value will be loaded into a
|
||||
field of ITER.
|
||||
|
||||
This function returns TRUE in almost all cases, FALSE is reserved to
|
||||
This function returns true in almost all cases, false is reserved to
|
||||
indicate an error (failing to find an opcode is not an error) a returned
|
||||
result of FALSE would indicate that the disassembler can't continue.
|
||||
result of false would indicate that the disassembler can't continue.
|
||||
|
||||
If no matching opcode is found then the returned result will be TRUE, the
|
||||
If no matching opcode is found then the returned result will be true, the
|
||||
value placed into OPCODE_RESULT will be NULL, ITER will be undefined, and
|
||||
INSN_LEN will be unchanged.
|
||||
|
||||
If a matching opcode is found, then the returned result will be TRUE, the
|
||||
If a matching opcode is found, then the returned result will be true, the
|
||||
opcode pointer is placed into OPCODE_RESULT, INSN_LEN will be increased by
|
||||
4 if the instruction requires a LIMM, and the LIMM value will have been
|
||||
loaded into a field of ITER. Finally, ITER will have been initialised so
|
||||
@ -421,11 +468,14 @@ find_format (bfd_vma memaddr,
|
||||
struct arc_operand_iterator * iter)
|
||||
{
|
||||
const struct arc_opcode *opcode = NULL;
|
||||
const struct arc_opcode *opcodeList = NULL;
|
||||
bool needs_limm = false;
|
||||
const extInstruction_t *einsn, *i;
|
||||
unsigned limm = 0;
|
||||
struct arc_disassemble_info *arc_infop = info->private_data;
|
||||
|
||||
opcodeList = arc_opcodes;
|
||||
|
||||
/* First, try the extension instructions. */
|
||||
if (*insn_len == 4)
|
||||
{
|
||||
@ -452,7 +502,7 @@ find_format (bfd_vma memaddr,
|
||||
|
||||
/* Then, try finding the first match in the opcode table. */
|
||||
if (opcode == NULL)
|
||||
opcode = find_format_from_table (info, arc_opcodes, insn, *insn_len,
|
||||
opcode = find_format_from_table (info, opcodeList, insn, *insn_len,
|
||||
isa_mask, &needs_limm, true);
|
||||
|
||||
if (opcode != NULL && needs_limm)
|
||||
@ -542,8 +592,14 @@ print_flags (const struct arc_opcode *opcode,
|
||||
if (!flg_operand->favail)
|
||||
continue;
|
||||
|
||||
value = (insn[0] >> flg_operand->shift)
|
||||
& ((1 << flg_operand->bits) - 1);
|
||||
if (cl_flags->extract)
|
||||
{
|
||||
bool tmp = false;
|
||||
value = (*cl_flags->extract)(insn[0], &tmp);
|
||||
}
|
||||
else
|
||||
value = (insn[0] >> flg_operand->shift)
|
||||
& ((1 << flg_operand->bits) - 1);
|
||||
if (value == flg_operand->code)
|
||||
{
|
||||
/* FIXME!: print correctly nt/t flag. */
|
||||
@ -646,34 +702,59 @@ arc_insn_length (bfd_byte msb, bfd_byte lsb, struct disassemble_info *info)
|
||||
{
|
||||
bfd_byte major_opcode = msb >> 3;
|
||||
|
||||
switch (info->mach)
|
||||
switch (info->arch)
|
||||
{
|
||||
case bfd_mach_arc_arc700:
|
||||
/* The nps400 extension set requires this special casing of the
|
||||
instruction length calculation. Right now this is not causing any
|
||||
problems as none of the known extensions overlap in opcode space,
|
||||
but, if they ever do then we might need to start carrying
|
||||
information around in the elf about which extensions are in use. */
|
||||
if (major_opcode == 0xb)
|
||||
{
|
||||
bfd_byte minor_opcode = lsb & 0x1f;
|
||||
case bfd_arch_arc:
|
||||
switch (info->mach)
|
||||
{
|
||||
case bfd_mach_arc_arc700:
|
||||
/* The nps400 extension set requires this special casing of
|
||||
the instruction length calculation. Right now this is
|
||||
not causing any problems as none of the known extensions
|
||||
overlap in opcode space, but, if they ever do then we
|
||||
might need to start carrying information around in the
|
||||
elf about which extensions are in use. */
|
||||
if (major_opcode == 0xb)
|
||||
{
|
||||
bfd_byte minor_opcode = lsb & 0x1f;
|
||||
|
||||
if (minor_opcode < 4)
|
||||
return 6;
|
||||
else if (minor_opcode == 0x10 || minor_opcode == 0x11)
|
||||
return 8;
|
||||
}
|
||||
if (major_opcode == 0xa)
|
||||
{
|
||||
return 8;
|
||||
}
|
||||
/* Fall through. */
|
||||
case bfd_mach_arc_arc600:
|
||||
return (major_opcode > 0xb) ? 2 : 4;
|
||||
if (minor_opcode < 4)
|
||||
return 6;
|
||||
else if (minor_opcode == 0x10 || minor_opcode == 0x11)
|
||||
return 8;
|
||||
}
|
||||
if (major_opcode == 0xa)
|
||||
{
|
||||
return 8;
|
||||
}
|
||||
/* Fall through. */
|
||||
case bfd_mach_arc_arc600:
|
||||
return (major_opcode > 0xb) ? 2 : 4;
|
||||
break;
|
||||
|
||||
case bfd_mach_arc_arcv2:
|
||||
return (major_opcode > 0x7) ? 2 : 4;
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case bfd_mach_arc_arcv2:
|
||||
return (major_opcode > 0x7) ? 2 : 4;
|
||||
case bfd_arch_arc64:
|
||||
switch (info->mach)
|
||||
{
|
||||
case bfd_mach_arcv3_32:
|
||||
case bfd_mach_arcv3_64:
|
||||
if (major_opcode == 0x0b
|
||||
|| major_opcode == 0x0d
|
||||
|| major_opcode == 0x1c)
|
||||
return 4;
|
||||
return (major_opcode > 0x7) ? 2 : 4;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -723,8 +804,8 @@ extract_operand_value (const struct arc_operand *operand,
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Find the next operand, and the operands value from ITER. Return TRUE if
|
||||
there is another operand, otherwise return FALSE. If there is an
|
||||
/* Find the next operand, and the operands value from ITER. Return true if
|
||||
there is another operand, otherwise return false. If there is an
|
||||
operand returned then the operand is placed into OPERAND, and the value
|
||||
into VALUE. If there is no operand returned then OPERAND and VALUE are
|
||||
unchanged. */
|
||||
@ -808,14 +889,18 @@ parse_option (const char *option)
|
||||
}
|
||||
|
||||
#define ARC_CPU_TYPE_A6xx(NAME,EXTRA) \
|
||||
{ #NAME, ARC_OPCODE_ARC600, "ARC600" }
|
||||
{ #NAME, ARC_OPCODE_ARC600, "ARC600" },
|
||||
#define ARC_CPU_TYPE_A7xx(NAME,EXTRA) \
|
||||
{ #NAME, ARC_OPCODE_ARC700, "ARC700" }
|
||||
{ #NAME, ARC_OPCODE_ARC700, "ARC700" },
|
||||
#define ARC_CPU_TYPE_AV2EM(NAME,EXTRA) \
|
||||
{ #NAME, ARC_OPCODE_ARCv2EM, "ARC EM" }
|
||||
{ #NAME, ARC_OPCODE_ARCv2EM, "ARC EM" },
|
||||
#define ARC_CPU_TYPE_AV2HS(NAME,EXTRA) \
|
||||
{ #NAME, ARC_OPCODE_ARCv2HS, "ARC HS" }
|
||||
#define ARC_CPU_TYPE_NONE \
|
||||
{ #NAME, ARC_OPCODE_ARCv2HS, "ARC HS" },
|
||||
#define ARC_CPU_TYPE_A64x(NAME,EXTRA) \
|
||||
{ #NAME, ARC_OPCODE_ARC64, "ARC64" },
|
||||
#define ARC_CPU_TYPE_A32x(NAME,EXTRA) \
|
||||
{ #NAME, ARC_OPCODE_ARC64, "ARC32" },
|
||||
#define ARC_CPU_TYPE_NONE \
|
||||
{ 0, 0, 0 }
|
||||
|
||||
/* A table of CPU names and opcode sets. */
|
||||
@ -950,7 +1035,8 @@ print_insn_arc (bfd_vma memaddr,
|
||||
bool open_braket;
|
||||
int size;
|
||||
const struct arc_operand *operand;
|
||||
int value, vpcl;
|
||||
int value;
|
||||
bfd_vma vpcl;
|
||||
struct arc_operand_iterator iter;
|
||||
struct arc_disassemble_info *arc_infop;
|
||||
bool rpcl = false, rset = false;
|
||||
@ -978,25 +1064,54 @@ print_insn_arc (bfd_vma memaddr,
|
||||
if (info->section && info->section->owner)
|
||||
header = elf_elfheader (info->section->owner);
|
||||
|
||||
switch (info->mach)
|
||||
switch (info->arch)
|
||||
{
|
||||
case bfd_mach_arc_arc700:
|
||||
isa_mask = ARC_OPCODE_ARC700;
|
||||
case bfd_arch_arc:
|
||||
switch (info->mach)
|
||||
{
|
||||
case bfd_mach_arc_arc700:
|
||||
isa_mask = ARC_OPCODE_ARC700;
|
||||
break;
|
||||
|
||||
case bfd_mach_arc_arc600:
|
||||
isa_mask = ARC_OPCODE_ARC600;
|
||||
break;
|
||||
|
||||
case bfd_mach_arc_arcv2:
|
||||
default:
|
||||
isa_mask = ARC_OPCODE_ARCv2EM;
|
||||
/* TODO: Perhaps remove definition of header since it is
|
||||
only used at this location. */
|
||||
if (header != NULL
|
||||
&& (header->e_flags & EF_ARC_MACH_MSK) == EF_ARC_CPU_ARCV2HS)
|
||||
isa_mask = ARC_OPCODE_ARCv2HS;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case bfd_mach_arc_arc600:
|
||||
isa_mask = ARC_OPCODE_ARC600;
|
||||
case bfd_arch_arc64:
|
||||
switch (info->mach)
|
||||
{
|
||||
case bfd_mach_arcv3_64:
|
||||
isa_mask = ARC_OPCODE_ARC64;
|
||||
break;
|
||||
|
||||
case bfd_mach_arcv3_32:
|
||||
isa_mask = ARC_OPCODE_ARC32;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* xgettext:c-format */
|
||||
opcodes_error_handler (_("unrecognised arc64 disassembler \
|
||||
variant"));
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
case bfd_mach_arc_arcv2:
|
||||
default:
|
||||
isa_mask = ARC_OPCODE_ARCv2EM;
|
||||
/* TODO: Perhaps remove definition of header since it is only used at
|
||||
this location. */
|
||||
if (header != NULL
|
||||
&& (header->e_flags & EF_ARC_MACH_MSK) == EF_ARC_CPU_ARCV2HS)
|
||||
isa_mask = ARC_OPCODE_ARCv2HS;
|
||||
break;
|
||||
/* xgettext:c-format */
|
||||
opcodes_error_handler (_("unrecognised disassembler architecture"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1289,8 +1404,10 @@ print_insn_arc (bfd_vma memaddr,
|
||||
rpcl = true;
|
||||
vpcl = value;
|
||||
rset = true;
|
||||
|
||||
info->target = (bfd_vma) (memaddr & ~3) + value;
|
||||
if ((operand->flags & ARC_OPERAND_LIMM)
|
||||
&& (operand->flags & ARC_OPERAND_ALIGNED32))
|
||||
vpcl <<= 2;
|
||||
info->target = (bfd_vma) (memaddr & ~3) + vpcl;
|
||||
}
|
||||
else if (!(operand->flags & ARC_OPERAND_IR))
|
||||
{
|
||||
@ -1303,10 +1420,15 @@ print_insn_arc (bfd_vma memaddr,
|
||||
{
|
||||
const char *rname;
|
||||
|
||||
assert (value >=0 && value < 64);
|
||||
assert (value >= 0 && value < 64);
|
||||
rname = arcExtMap_coreRegName (value);
|
||||
if (!rname)
|
||||
rname = regnames[value];
|
||||
{
|
||||
if (operand->flags & ARC_OPERAND_FP)
|
||||
rname = fpnames[value & 0x1f];
|
||||
else
|
||||
rname = getregname (value, isa_mask);
|
||||
}
|
||||
(*info->fprintf_styled_func) (info->stream, dis_style_register,
|
||||
"%s", rname);
|
||||
|
||||
@ -1316,8 +1438,10 @@ print_insn_arc (bfd_vma memaddr,
|
||||
if ((value & 0x01) == 0)
|
||||
{
|
||||
rname = arcExtMap_coreRegName (value + 1);
|
||||
if (!rname)
|
||||
rname = regnames[value + 1];
|
||||
if (operand->flags & ARC_OPERAND_FP)
|
||||
rname = fpnames[(value + 1) & 0x1f];
|
||||
else
|
||||
rname = getregname (value + 1, isa_mask);
|
||||
}
|
||||
else
|
||||
rname = _("\nWarning: illegal use of double register "
|
||||
@ -1325,7 +1449,7 @@ print_insn_arc (bfd_vma memaddr,
|
||||
(*info->fprintf_styled_func) (info->stream, dis_style_register,
|
||||
"%s", rname);
|
||||
}
|
||||
if (value == 63)
|
||||
if (value == REG_PCL)
|
||||
rpcl = true;
|
||||
else
|
||||
rpcl = false;
|
||||
@ -1339,8 +1463,12 @@ print_insn_arc (bfd_vma memaddr,
|
||||
"%s", rname);
|
||||
else
|
||||
{
|
||||
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
|
||||
"%#x", value);
|
||||
if (operand->flags & ARC_OPERAND_SIGNED)
|
||||
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
|
||||
"%d@s32", value);
|
||||
else
|
||||
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
|
||||
"%#x", value);
|
||||
if (info->insn_type == dis_branch
|
||||
|| info->insn_type == dis_jsr)
|
||||
info->target = (bfd_vma) value;
|
||||
@ -1418,7 +1546,7 @@ print_insn_arc (bfd_vma memaddr,
|
||||
= ARC_OPERAND_KIND_LIMM;
|
||||
/* It is not important to have exactly the LIMM indicator
|
||||
here. */
|
||||
arc_infop->operands[arc_infop->operands_count].value = 63;
|
||||
arc_infop->operands[arc_infop->operands_count].value = REG_PCL;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1,124 +0,0 @@
|
||||
/* ARC instruction defintions.
|
||||
Copyright (C) 2016-2023 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Claudiu Zissulescu (claziss@synopsys.com)
|
||||
|
||||
This file is part of libopcodes.
|
||||
|
||||
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 program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Common combinations of FLAGS. */
|
||||
#define FLAGS_NONE { 0 }
|
||||
#define FLAGS_F { C_F }
|
||||
#define FLAGS_CC { C_CC }
|
||||
#define FLAGS_CCF { C_CC, C_F }
|
||||
|
||||
/* Common combination of arguments. */
|
||||
#define ARG_NONE { 0 }
|
||||
#define ARG_32BIT_RARBRC { RA, RB, RC }
|
||||
#define ARG_32BIT_ZARBRC { ZA, RB, RC }
|
||||
#define ARG_32BIT_RBRBRC { RB, RBdup, RC }
|
||||
#define ARG_32BIT_RARBU6 { RA, RB, UIMM6_20 }
|
||||
#define ARG_32BIT_ZARBU6 { ZA, RB, UIMM6_20 }
|
||||
#define ARG_32BIT_RBRBU6 { RB, RBdup, UIMM6_20 }
|
||||
#define ARG_32BIT_RBRBS12 { RB, RBdup, SIMM12_20 }
|
||||
#define ARG_32BIT_RALIMMRC { RA, LIMM, RC }
|
||||
#define ARG_32BIT_RARBLIMM { RA, RB, LIMM }
|
||||
#define ARG_32BIT_ZALIMMRC { ZA, LIMM, RC }
|
||||
#define ARG_32BIT_ZARBLIMM { ZA, RB, LIMM }
|
||||
|
||||
#define ARG_32BIT_RBRBLIMM { RB, RBdup, LIMM }
|
||||
#define ARG_32BIT_RALIMMU6 { RA, LIMM, UIMM6_20 }
|
||||
#define ARG_32BIT_ZALIMMU6 { ZA, LIMM, UIMM6_20 }
|
||||
|
||||
#define ARG_32BIT_ZALIMMS12 { ZA, LIMM, SIMM12_20 }
|
||||
#define ARG_32BIT_RALIMMLIMM { RA, LIMM, LIMMdup }
|
||||
#define ARG_32BIT_ZALIMMLIMM { ZA, LIMM, LIMMdup }
|
||||
|
||||
#define ARG_32BIT_RBRC { RB, RC }
|
||||
#define ARG_32BIT_ZARC { ZA, RC }
|
||||
#define ARG_32BIT_RBU6 { RB, UIMM6_20 }
|
||||
#define ARG_32BIT_ZAU6 { ZA, UIMM6_20 }
|
||||
#define ARG_32BIT_RBLIMM { RB, LIMM }
|
||||
#define ARG_32BIT_ZALIMM { ZA, LIMM }
|
||||
|
||||
/* Macro to generate 2 operand extension instruction. */
|
||||
#define EXTINSN2OPF(NAME, CPU, CLASS, SCLASS, MOP, SOP, FL) \
|
||||
{ NAME, INSN2OP_BC (MOP,SOP), MINSN2OP_BC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRC, FL }, \
|
||||
{ NAME, INSN2OP_0C (MOP,SOP), MINSN2OP_0C, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARC, FL }, \
|
||||
{ NAME, INSN2OP_BU (MOP,SOP), MINSN2OP_BU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBU6, FL }, \
|
||||
{ NAME, INSN2OP_0U (MOP,SOP), MINSN2OP_0U, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZAU6, FL }, \
|
||||
{ NAME, INSN2OP_BL (MOP,SOP), MINSN2OP_BL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBLIMM, FL }, \
|
||||
{ NAME, INSN2OP_0L (MOP,SOP), MINSN2OP_0L, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMM, FL },
|
||||
|
||||
#define EXTINSN2OP(NAME, CPU, CLASS, SCLASS, MOP, SOP) \
|
||||
EXTINSN2OPF(NAME, CPU, CLASS, SCLASS, MOP, SOP, FLAGS_F)
|
||||
|
||||
/* Macro to generate 3 operand extesion instruction. */
|
||||
#define EXTINSN3OP(NAME, CPU, CLASS, SCLASS, MOP, SOP) \
|
||||
{ NAME, INSN3OP_ABC (MOP,SOP), MINSN3OP_ABC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BC (MOP,SOP), MINSN3OP_0BC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBC (MOP,SOP), MINSN3OP_CBBC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBRC, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_ABU (MOP,SOP), MINSN3OP_ABU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BU (MOP,SOP), MINSN3OP_0BU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBU (MOP,SOP), MINSN3OP_CBBU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBU6, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_BBS (MOP,SOP), MINSN3OP_BBS, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBS12, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ALC (MOP,SOP), MINSN3OP_ALC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ABL (MOP,SOP), MINSN3OP_ABL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0LC (MOP,SOP), MINSN3OP_0LC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BL (MOP,SOP), MINSN3OP_0BL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_C0LC (MOP,SOP), MINSN3OP_C0LC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMRC, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_CBBL (MOP,SOP), MINSN3OP_CBBL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBLIMM, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_ALU (MOP,SOP), MINSN3OP_ALU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0LU (MOP,SOP), MINSN3OP_0LU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_C0LU (MOP,SOP), MINSN3OP_C0LU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMU6, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_0LS (MOP,SOP), MINSN3OP_0LS, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMS12, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ALL (MOP,SOP), MINSN3OP_ALL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0LL (MOP,SOP), MINSN3OP_0LL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_C0LL (MOP,SOP), MINSN3OP_C0LL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMLIMM, FLAGS_CCF },
|
||||
|
||||
/* Extension instruction declarations. */
|
||||
EXTINSN2OP ("dsp_fp_flt2i", ARC_OPCODE_ARCv2EM, FLOAT, QUARKSE1, 7, 43)
|
||||
EXTINSN2OP ("dsp_fp_i2flt", ARC_OPCODE_ARCv2EM, FLOAT, QUARKSE1, 7, 44)
|
||||
EXTINSN2OP ("dsp_fp_sqrt", ARC_OPCODE_ARCv2EM, FLOAT, QUARKSE2, 7, 45)
|
||||
|
||||
EXTINSN3OP ("dsp_fp_div", ARC_OPCODE_ARCv2EM, FLOAT, QUARKSE2, 7, 42)
|
||||
EXTINSN3OP ("dsp_fp_cmp", ARC_OPCODE_ARCv2EM, FLOAT, QUARKSE1, 7, 43)
|
125
opcodes/arc-flag-classes.def
Normal file
125
opcodes/arc-flag-classes.def
Normal file
@ -0,0 +1,125 @@
|
||||
/* ARC flag class defintions.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Claudiu Zissulescu (claziss@synopsys.com)
|
||||
Refactored by Cupertino Miranda (cmiranda@synopsys.com)
|
||||
|
||||
This file is part of libopcodes.
|
||||
|
||||
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 program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
FLAG_CLASS(EMPTY, F_CLASS_NONE, 0, 0, F_NULL)
|
||||
FLAG_CLASS(CC_EQ, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0 , F_EQUAL)
|
||||
FLAG_CLASS(CC_GE, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0 , F_GE)
|
||||
FLAG_CLASS(CC_GT, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_GT)
|
||||
FLAG_CLASS(CC_HI, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_HI)
|
||||
FLAG_CLASS(CC_HS, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_NOTCARRY)
|
||||
FLAG_CLASS(CC_LE, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_LE)
|
||||
FLAG_CLASS(CC_LO, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_CARRY)
|
||||
FLAG_CLASS(CC_LS, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_LS)
|
||||
FLAG_CLASS(CC_LT, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_LT)
|
||||
FLAG_CLASS(CC_NE, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_NOTEQUAL)
|
||||
|
||||
FLAG_CLASS(AA_AB, F_CLASS_IMPLICIT | F_CLASS_WB, 0, 0, F_AB3)
|
||||
FLAG_CLASS(AA_AW, F_CLASS_IMPLICIT | F_CLASS_WB, 0, 0, F_AW3)
|
||||
|
||||
FLAG_CLASS(ZZ_D, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_SIZED)
|
||||
FLAG_CLASS(ZZ_L, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_SIZEL)
|
||||
FLAG_CLASS(ZZ_W, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_SIZEW)
|
||||
FLAG_CLASS(ZZ_H, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_H1)
|
||||
FLAG_CLASS(ZZ_B, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_SIZEB1)
|
||||
|
||||
FLAG_CLASS(CC, F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND, 0, 0, F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR, F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T)
|
||||
|
||||
FLAG_CLASS(AA_ADDR3, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A3, F_AW3, F_AB3, F_AS3)
|
||||
FLAG_CLASS(AA27, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A3, F_AW3, F_AB3, F_AS3)
|
||||
FLAG_CLASS(AS27, F_CLASS_OPTIONAL, 0, 0, F_AS3)
|
||||
FLAG_CLASS(AA_ADDR9, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9, F_AS9)
|
||||
FLAG_CLASS(AA21, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9, F_AS9)
|
||||
FLAG_CLASS(AAB21, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9)
|
||||
FLAG_CLASS(AA_ADDR22, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22, F_AS22)
|
||||
FLAG_CLASS(AA8, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22, F_AS22)
|
||||
FLAG_CLASS(AAB8, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22)
|
||||
|
||||
FLAG_CLASS(F, F_CLASS_OPTIONAL, 0, 0, F_FLAG)
|
||||
FLAG_CLASS(FHARD, F_CLASS_OPTIONAL, 0, 0, F_FFAKE)
|
||||
|
||||
FLAG_CLASS(RL, F_CLASS_OPTIONAL, 0, 0, F_RL)
|
||||
FLAG_CLASS(AQ, F_CLASS_OPTIONAL, 0, 0, F_AQ)
|
||||
|
||||
FLAG_CLASS(ATOP, F_CLASS_REQUIRED, 0, 0, F_ATO_ADD, F_ATO_OR, F_ATO_AND, F_ATO_XOR, F_ATO_MINU, F_ATO_MAXU, F_ATO_MIN, F_ATO_MAX)
|
||||
|
||||
FLAG_CLASS(T, F_CLASS_OPTIONAL, 0, 0, F_NT, F_T)
|
||||
FLAG_CLASS(D, F_CLASS_OPTIONAL, 0, 0, F_ND, F_D)
|
||||
FLAG_CLASS(DNZ_D, F_CLASS_OPTIONAL, 0, 0, F_DNZ_ND, F_DNZ_D)
|
||||
|
||||
FLAG_CLASS(DHARD, F_CLASS_OPTIONAL, 0, 0, F_DFAKE)
|
||||
|
||||
FLAG_CLASS(DI20, F_CLASS_OPTIONAL, 0, 0, F_DI11)
|
||||
FLAG_CLASS(DI14, F_CLASS_OPTIONAL, 0, 0, F_DI14)
|
||||
FLAG_CLASS(DI16, F_CLASS_OPTIONAL, 0, 0, F_DI15)
|
||||
FLAG_CLASS(DI26, F_CLASS_OPTIONAL, 0, 0, F_DI5)
|
||||
|
||||
FLAG_CLASS(X25, F_CLASS_OPTIONAL, 0, 0, F_SIGN6)
|
||||
FLAG_CLASS(X15, F_CLASS_OPTIONAL, 0, 0, F_SIGN16)
|
||||
FLAG_CLASS(XHARD, F_CLASS_OPTIONAL, 0, 0, F_SIGNX)
|
||||
FLAG_CLASS(X, F_CLASS_OPTIONAL, 0, 0, F_SIGNX)
|
||||
|
||||
FLAG_CLASS(ZZ13, F_CLASS_OPTIONAL, 0, 0, F_SIZEB17, F_SIZEW17, F_H17)
|
||||
FLAG_CLASS(ZZ23, F_CLASS_OPTIONAL, 0, 0, F_SIZEB7, F_SIZEW7, F_H7)
|
||||
FLAG_CLASS(ZZ29, F_CLASS_OPTIONAL, 0, 0, F_SIZEB1, F_SIZEW1, F_H1)
|
||||
FLAG_CLASS(ZZW6, F_CLASS_OPTIONAL, 0, 0, F_SIZEB1)
|
||||
FLAG_CLASS(ZZH1, F_CLASS_OPTIONAL, 0, 0, F_SIZEW1, F_H1)
|
||||
|
||||
FLAG_CLASS(AS, F_CLASS_OPTIONAL, 0, 0, F_ASFAKE)
|
||||
FLAG_CLASS(AAHARD13, F_CLASS_OPTIONAL, 0, 0, F_ASFAKE)
|
||||
FLAG_CLASS(NE, F_CLASS_REQUIRED, 0, 0, F_NE)
|
||||
|
||||
/* ARC NPS400 Support: See comment near head of file. */
|
||||
FLAG_CLASS(NPS_CL, F_CLASS_REQUIRED, 0, 0, F_NPS_CL)
|
||||
FLAG_CLASS(NPS_NA, F_CLASS_OPTIONAL, 0, 0, F_NPS_NA)
|
||||
FLAG_CLASS(NPS_SR, F_CLASS_OPTIONAL, 0, 0, F_NPS_SR)
|
||||
FLAG_CLASS(NPS_M, F_CLASS_OPTIONAL, 0, 0, F_NPS_M)
|
||||
FLAG_CLASS(NPS_F, F_CLASS_OPTIONAL, 0, 0, F_NPS_FLAG)
|
||||
FLAG_CLASS(NPS_R, F_CLASS_OPTIONAL, 0, 0, F_NPS_R)
|
||||
FLAG_CLASS(NPS_SCHD_RW, F_CLASS_REQUIRED, 0, 0, F_NPS_RW, F_NPS_RD)
|
||||
FLAG_CLASS(NPS_SCHD_TRIG, F_CLASS_REQUIRED, 0, 0, F_NPS_WFT)
|
||||
FLAG_CLASS(NPS_SCHD_IE, F_CLASS_OPTIONAL, 0, 0, F_NPS_IE1, F_NPS_IE2, F_NPS_IE12)
|
||||
FLAG_CLASS(NPS_SYNC, F_CLASS_REQUIRED, 0, 0, F_NPS_SYNC_RD, F_NPS_SYNC_WR)
|
||||
FLAG_CLASS(NPS_HWS_OFF, F_CLASS_REQUIRED, 0, 0, F_NPS_HWS_OFF)
|
||||
FLAG_CLASS(NPS_HWS_RESTORE, F_CLASS_REQUIRED, 0, 0, F_NPS_HWS_RESTORE)
|
||||
FLAG_CLASS(NPS_SX, F_CLASS_OPTIONAL, 0, 0, F_NPS_SX)
|
||||
FLAG_CLASS(NPS_AR_AL, F_CLASS_REQUIRED, 0, 0, F_NPS_AR, F_NPS_AL)
|
||||
FLAG_CLASS(NPS_S, F_CLASS_REQUIRED, 0, 0, F_NPS_S)
|
||||
FLAG_CLASS(NPS_ZNCV, F_CLASS_REQUIRED, 0, 0, F_NPS_ZNCV_RD, F_NPS_ZNCV_WR)
|
||||
FLAG_CLASS(NPS_P0, F_CLASS_REQUIRED, 0, 0, F_NPS_P0)
|
||||
FLAG_CLASS(NPS_P1, F_CLASS_REQUIRED, 0, 0, F_NPS_P1)
|
||||
FLAG_CLASS(NPS_P2, F_CLASS_REQUIRED, 0, 0, F_NPS_P2)
|
||||
FLAG_CLASS(NPS_P3, F_CLASS_REQUIRED, 0, 0, F_NPS_P3)
|
||||
FLAG_CLASS(NPS_LDBIT_DI, F_CLASS_REQUIRED, 0, 0, F_NPS_LDBIT_DI)
|
||||
FLAG_CLASS(NPS_LDBIT_CL1, F_CLASS_OPTIONAL, 0, 0, F_NPS_LDBIT_CL1)
|
||||
FLAG_CLASS(NPS_LDBIT_CL2, F_CLASS_OPTIONAL, 0, 0, F_NPS_LDBIT_CL2)
|
||||
FLAG_CLASS(NPS_LDBIT_X_1, F_CLASS_OPTIONAL, 0, 0, F_NPS_LDBIT_X2_1, F_NPS_LDBIT_X4_1)
|
||||
FLAG_CLASS(NPS_LDBIT_X_2, F_CLASS_OPTIONAL, 0, 0, F_NPS_LDBIT_X2_2, F_NPS_LDBIT_X4_2)
|
||||
FLAG_CLASS(NPS_CORE, F_CLASS_REQUIRED, 0, 0, F_NPS_CORE)
|
||||
FLAG_CLASS(NPS_CLSR, F_CLASS_REQUIRED, 0, 0, F_NPS_CLSR)
|
||||
FLAG_CLASS(NPS_ALL, F_CLASS_REQUIRED, 0, 0, F_NPS_ALL)
|
||||
FLAG_CLASS(NPS_GIC, F_CLASS_REQUIRED, 0, 0, F_NPS_GIC)
|
||||
FLAG_CLASS(NPS_RSPI_GIC, F_CLASS_REQUIRED, 0, 0, F_NPS_RSPI_GIC)
|
||||
FLAG_CLASS(FPCC, F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND, insert_fs2, extract_fs2, F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR, F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T)
|
||||
FLAG_CLASS(AA_128, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_AA128, F_AA128W, F_AA128B, F_AA128S)
|
||||
FLAG_CLASS(AS_128, F_CLASS_OPTIONAL, 0, 0, F_AA128S)
|
||||
FLAG_CLASS(AA_128S, F_CLASS_OPTIONAL | F_CLASS_WB, insert_qq, extract_qq, F_AA128, F_AA128W, F_AA128B, F_AA128S)
|
||||
FLAG_CLASS(AS_128S, F_CLASS_OPTIONAL, insert_qq, extract_qq, F_AA128S)
|
179
opcodes/arc-flag.def
Normal file
179
opcodes/arc-flag.def
Normal file
@ -0,0 +1,179 @@
|
||||
/* ARC flag defintions.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Claudiu Zissulescu (claziss@synopsys.com)
|
||||
Refactored by Cupertino Miranda (cmiranda@synopsys.com)
|
||||
|
||||
This file is part of libopcodes.
|
||||
|
||||
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 program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
FLAG(ALWAYS, "al", 0, 0, 0, 0)
|
||||
FLAG(RA, "ra", 0, 0, 0, 0)
|
||||
FLAG(EQUAL, "eq", 1, 5, 0, 1)
|
||||
FLAG(ZERO, "z", 1, 5, 0, 0)
|
||||
FLAG(NOTEQUAL, "ne", 2, 5, 0, 1)
|
||||
FLAG(NOTZERO, "nz", 2, 5, 0, 0)
|
||||
FLAG(POZITIVE, "p", 3, 5, 0, 1)
|
||||
FLAG(PL, "pl", 3, 5, 0, 0)
|
||||
FLAG(NEGATIVE, "n", 4, 5, 0, 1)
|
||||
FLAG(MINUS, "mi", 4, 5, 0, 0)
|
||||
FLAG(CARRY, "c", 5, 5, 0, 1)
|
||||
FLAG(CARRYSET, "cs", 5, 5, 0, 0)
|
||||
FLAG(LOWER, "lo", 5, 5, 0, 0)
|
||||
FLAG(CARRYCLR, "cc", 6, 5, 0, 0)
|
||||
FLAG(NOTCARRY, "nc", 6, 5, 0, 1)
|
||||
FLAG(HIGHER, "hs", 6, 5, 0, 0)
|
||||
FLAG(OVERFLOWSET, "vs", 7, 5, 0, 0)
|
||||
FLAG(OVERFLOW, "v", 7, 5, 0, 1)
|
||||
FLAG(NOTOVERFLOW, "nv", 8, 5, 0, 1)
|
||||
FLAG(OVERFLOWCLR, "vc", 8, 5, 0, 0)
|
||||
FLAG(GT, "gt", 9, 5, 0, 1)
|
||||
FLAG(GE, "ge", 10, 5, 0, 1)
|
||||
FLAG(LT, "lt", 11, 5, 0, 1)
|
||||
FLAG(LE, "le", 12, 5, 0, 1)
|
||||
FLAG(HI, "hi", 13, 5, 0, 1)
|
||||
FLAG(LS, "ls", 14, 5, 0, 1)
|
||||
FLAG(PNZ, "pnz", 15, 5, 0, 1)
|
||||
FLAG(NJ, "nj", 21, 5, 0, 1)
|
||||
FLAG(NM, "nm", 23, 5, 0, 1)
|
||||
FLAG(NO_T, "nt", 24, 5, 0, 1)
|
||||
|
||||
/* FLAG. */
|
||||
FLAG(FLAG, "f", 1, 1, 15, 1)
|
||||
FLAG(FFAKE, "f", 0, 0, 0, 1)
|
||||
FLAG(AQ, "aq", 1, 1, 15, 1)
|
||||
FLAG(RL, "rl", 1, 1, 15, 1)
|
||||
|
||||
/* Atomic operations. */
|
||||
FLAG(ATO_ADD, "add", 0, 3, 0, 1)
|
||||
FLAG(ATO_OR, "or", 1, 3, 0, 1)
|
||||
FLAG(ATO_AND, "and", 2, 3, 0, 1)
|
||||
FLAG(ATO_XOR, "xor", 3, 3, 0, 1)
|
||||
FLAG(ATO_MINU, "minu", 4, 3, 0, 1)
|
||||
FLAG(ATO_MAXU, "maxu", 5, 3, 0, 1)
|
||||
FLAG(ATO_MIN, "min", 6, 3, 0, 1)
|
||||
FLAG(ATO_MAX, "max", 7, 3, 0, 1)
|
||||
|
||||
/* Delay slot. */
|
||||
FLAG(ND, "nd", 0, 1, 5, 0)
|
||||
FLAG(D, "d", 1, 1, 5, 1)
|
||||
FLAG(DFAKE, "d", 0, 0, 0, 1)
|
||||
FLAG(DNZ_ND, "nd", 0, 1, 16, 0)
|
||||
FLAG(DNZ_D, "d", 1, 1, 16, 1)
|
||||
|
||||
/* Data size. */
|
||||
FLAG(SIZEB1, "b", 1, 2, 1, 1)
|
||||
FLAG(SIZEB7, "b", 1, 2, 7, 1)
|
||||
FLAG(SIZEB17, "b", 1, 2, 17, 1)
|
||||
FLAG(SIZEW1, "w", 2, 2, 1, 0)
|
||||
FLAG(SIZEW7, "w", 2, 2, 7, 0)
|
||||
FLAG(SIZEW17, "w", 2, 2, 17, 0)
|
||||
|
||||
/* Sign extension. */
|
||||
FLAG(SIGN6, "x", 1, 1, 6, 1)
|
||||
FLAG(SIGN16, "x", 1, 1, 16, 1)
|
||||
FLAG(SIGNX, "x", 0, 0, 0, 1)
|
||||
|
||||
/* Address write-back modes. */
|
||||
FLAG(A3, "a", 1, 2, 3, 0)
|
||||
FLAG(A9, "a", 1, 2, 9, 0)
|
||||
FLAG(A22, "a", 1, 2, 22, 0)
|
||||
FLAG(AW3, "aw", 1, 2, 3, 1)
|
||||
FLAG(AW9, "aw", 1, 2, 9, 1)
|
||||
FLAG(AW22, "aw", 1, 2, 22, 1)
|
||||
FLAG(AB3, "ab", 2, 2, 3, 1)
|
||||
FLAG(AB9, "ab", 2, 2, 9, 1)
|
||||
FLAG(AB22, "ab", 2, 2, 22, 1)
|
||||
FLAG(AS3, "as", 3, 2, 3, 1)
|
||||
FLAG(AS9, "as", 3, 2, 9, 1)
|
||||
FLAG(AS22, "as", 3, 2, 22, 1)
|
||||
FLAG(ASFAKE, "as", 0, 0, 0, 1)
|
||||
|
||||
/* address writebacks for 128-bit loads.
|
||||
,---.---.----------.
|
||||
| X | D | mnemonic |
|
||||
|---+---+----------|
|
||||
| 0 | 0 | none |
|
||||
| 0 | 1 | as |
|
||||
| 1 | 0 | a/aw |
|
||||
| 1 | 1 | ab |
|
||||
`---^---^----------' */
|
||||
FLAG(AA128, "a", 2, 2, 15, 0)
|
||||
FLAG(AA128W, "aw", 2, 2, 15, 1)
|
||||
FLAG(AA128B, "ab", 3, 2, 15, 1)
|
||||
FLAG(AA128S, "as", 1, 2, 15, 1)
|
||||
|
||||
/* Cache bypass. */
|
||||
FLAG(DI5, "di", 1, 1, 5, 1)
|
||||
FLAG(DI11, "di", 1, 1, 11, 1)
|
||||
FLAG(DI14, "di", 1, 1, 14, 1)
|
||||
FLAG(DI15, "di", 1, 1, 15, 1)
|
||||
|
||||
/* ARCv2 specific. */
|
||||
FLAG(NT, "nt", 0, 1, 3, 1)
|
||||
FLAG(T, "t", 1, 1, 3, 1)
|
||||
FLAG(H1, "h", 2, 2, 1, 1)
|
||||
FLAG(H7, "h", 2, 2, 7, 1)
|
||||
FLAG(H17, "h", 2, 2, 17, 1)
|
||||
/* Fake */
|
||||
FLAG(SIZED, "dd", 8, 0, 0, 0)
|
||||
/* Fake */
|
||||
FLAG(SIZEL, "dl", 8, 0, 0, 0)
|
||||
/* Fake */
|
||||
FLAG(SIZEW, "xx", 4, 0, 0, 0)
|
||||
|
||||
/* Fake Flags. */
|
||||
FLAG(NE, "ne", 0, 0, 0, 1)
|
||||
|
||||
/* ARC NPS400 Support: See comment near head of arcxx-opc.inc file. */
|
||||
FLAG(NPS_CL, "cl", 0, 0, 0, 1)
|
||||
FLAG(NPS_NA, "na", 1, 1, 9, 1)
|
||||
FLAG(NPS_SR, "s", 1, 1, 13, 1)
|
||||
FLAG(NPS_M, "m", 1, 1, 7, 1)
|
||||
FLAG(NPS_FLAG, "f", 1, 1, 20, 1)
|
||||
FLAG(NPS_R, "r", 1, 1, 15, 1)
|
||||
FLAG(NPS_RW, "rw", 0, 1, 7, 1)
|
||||
FLAG(NPS_RD, "rd", 1, 1, 7, 1)
|
||||
FLAG(NPS_WFT, "wft", 0, 0, 0, 1)
|
||||
FLAG(NPS_IE1, "ie1", 1, 2, 8, 1)
|
||||
FLAG(NPS_IE2, "ie2", 2, 2, 8, 1)
|
||||
FLAG(NPS_IE12, "ie12", 3, 2, 8, 1)
|
||||
FLAG(NPS_SYNC_RD, "rd", 0, 1, 6, 1)
|
||||
FLAG(NPS_SYNC_WR, "wr", 1, 1, 6, 1)
|
||||
FLAG(NPS_HWS_OFF, "off", 0, 0, 0, 1)
|
||||
FLAG(NPS_HWS_RESTORE, "restore", 0, 0, 0, 1)
|
||||
FLAG(NPS_SX, "sx", 1, 1, 14, 1)
|
||||
FLAG(NPS_AR, "ar", 0, 1, 0, 1)
|
||||
FLAG(NPS_AL, "al", 1, 1, 0, 1)
|
||||
FLAG(NPS_S, "s", 0, 0, 0, 1)
|
||||
FLAG(NPS_ZNCV_RD, "rd", 0, 1, 15, 1)
|
||||
FLAG(NPS_ZNCV_WR, "wr", 1, 1, 15, 1)
|
||||
FLAG(NPS_P0, "p0", 0, 0, 0, 1)
|
||||
FLAG(NPS_P1, "p1", 0, 0, 0, 1)
|
||||
FLAG(NPS_P2, "p2", 0, 0, 0, 1)
|
||||
FLAG(NPS_P3, "p3", 0, 0, 0, 1)
|
||||
FLAG(NPS_LDBIT_DI, "di", 0, 0, 0, 1)
|
||||
FLAG(NPS_LDBIT_CL1, "cl", 1, 1, 6, 1)
|
||||
FLAG(NPS_LDBIT_CL2, "cl", 1, 1, 16, 1)
|
||||
FLAG(NPS_LDBIT_X2_1, "x2", 1, 2, 9, 1)
|
||||
FLAG(NPS_LDBIT_X2_2, "x2", 1, 2, 22, 1)
|
||||
FLAG(NPS_LDBIT_X4_1, "x4", 2, 2, 9, 1)
|
||||
FLAG(NPS_LDBIT_X4_2, "x4", 2, 2, 22, 1)
|
||||
FLAG(NPS_CORE, "core", 1, 3, 6, 1)
|
||||
FLAG(NPS_CLSR, "clsr", 2, 3, 6, 1)
|
||||
FLAG(NPS_ALL, "all", 3, 3, 6, 1)
|
||||
FLAG(NPS_GIC, "gic", 4, 3, 6, 1)
|
||||
FLAG(NPS_RSPI_GIC, "gic", 5, 3, 6, 1)
|
@ -1318,3 +1318,63 @@ extract_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED,
|
||||
return value;
|
||||
}
|
||||
#endif /* EXTRACT_UIMM6_AXX_ */
|
||||
|
||||
/* mask = 0000022000011111. */
|
||||
#ifndef INSERT_UIMM9_A32_11_S
|
||||
#define INSERT_UIMM9_A32_11_S
|
||||
ATTRIBUTE_UNUSED static unsigned long long
|
||||
insert_uimm9_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
|
||||
long long int value ATTRIBUTE_UNUSED,
|
||||
const char **errmsg ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (value & 0x03)
|
||||
*errmsg = "Target address is not 32bit aligned.";
|
||||
|
||||
insn |= ((value >> 2) & 0x001f) << 0;
|
||||
insn |= ((value >> 7) & 0x0003) << 9;
|
||||
return insn;
|
||||
}
|
||||
#endif /* INSERT_UIMM9_A32_11_S. */
|
||||
|
||||
#ifndef EXTRACT_UIMM9_A32_11_S
|
||||
#define EXTRACT_UIMM9_A32_11_S
|
||||
ATTRIBUTE_UNUSED static long long int
|
||||
extract_uimm9_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
|
||||
bool *invalid ATTRIBUTE_UNUSED)
|
||||
{
|
||||
unsigned value = 0;
|
||||
value |= ((insn >> 0) & 0x001f) << 2;
|
||||
value |= ((insn >> 9) & 0x0003) << 7;
|
||||
|
||||
return value;
|
||||
}
|
||||
#endif /* EXTRACT_UIMM9_A32_11_S. */
|
||||
|
||||
/* mask = 0000022222220111. */
|
||||
#ifndef INSERT_UIMM10_13_S
|
||||
#define INSERT_UIMM10_13_S
|
||||
ATTRIBUTE_UNUSED static unsigned long long
|
||||
insert_uimm10_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
|
||||
long long int value ATTRIBUTE_UNUSED,
|
||||
const char **errmsg ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn |= ((value >> 0) & 0x0007) << 0;
|
||||
insn |= ((value >> 3) & 0x007f) << 4;
|
||||
|
||||
return insn;
|
||||
}
|
||||
#endif /* INSERT_UIMM10_13_S. */
|
||||
|
||||
#ifndef EXTRACT_UIMM10_13_S
|
||||
#define EXTRACT_UIMM10_13_S
|
||||
ATTRIBUTE_UNUSED static long long int
|
||||
extract_uimm10_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
|
||||
bool *invalid ATTRIBUTE_UNUSED)
|
||||
{
|
||||
unsigned value = 0;
|
||||
value |= ((insn >> 0) & 0x0007) << 0;
|
||||
value |= ((insn >> 4) & 0x007f) << 3;
|
||||
|
||||
return value;
|
||||
}
|
||||
#endif /* EXTRACT_UIMM10_13_S. */
|
||||
|
2992
opcodes/arc-opc.c
2992
opcodes/arc-opc.c
File diff suppressed because it is too large
Load Diff
502
opcodes/arc-operands.def
Normal file
502
opcodes/arc-operands.def
Normal file
@ -0,0 +1,502 @@
|
||||
/* ARC operands defintions.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Claudiu Zissulescu (claziss@synopsys.com)
|
||||
Refactored by Cupertino Miranda (cmiranda@synopsys.com)
|
||||
|
||||
This file is part of libopcodes.
|
||||
|
||||
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 program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
|
||||
/*
|
||||
* ARC_OPERAND(NAME, BITS, SHIFT, RELO, FLAGS, FUN)
|
||||
*
|
||||
* BITS => The number of bits in the operand.
|
||||
* SHIFT => How far the operand is left shifted in the instruction.
|
||||
* RELO => The default relocation type for this operand.
|
||||
* FLAGS => One bit syntax flags.
|
||||
* FUN => Insertion function. This is used by the assembler.
|
||||
*/
|
||||
|
||||
ARC_OPERAND(IGNORED, 0, 0, 0, ARC_OPERAND_IGNORE | ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, 0, 0)
|
||||
|
||||
/* The plain integer register fields. Used by 32 bit instructions. */
|
||||
ARC_OPERAND(RA, 6, 0, 0, ARC_OPERAND_IR, 0, 0)
|
||||
ARC_OPERAND(RA_CHK, 6, 0, 0, ARC_OPERAND_IR, insert_ra_chk, 0)
|
||||
ARC_OPERAND(RB, 6, 12, 0, ARC_OPERAND_IR, insert_rb, extract_rb)
|
||||
ARC_OPERAND(RB_CHK, 6, 12, 0, ARC_OPERAND_IR, insert_rb_chk, extract_rb)
|
||||
ARC_OPERAND(RBB_S, 6, 12, 0, ARC_OPERAND_IR, insert_rbb, extract_rbb)
|
||||
ARC_OPERAND(RC, 6, 6, 0, ARC_OPERAND_IR, 0, 0)
|
||||
ARC_OPERAND(RC_CHK, 6, 6, 0, ARC_OPERAND_IR, 0, 0)
|
||||
ARC_OPERAND(RBdup, 6, 12, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rb, extract_rb)
|
||||
|
||||
ARC_OPERAND(RAD, 6, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rad, 0)
|
||||
ARC_OPERAND(RAD_CHK, 6, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rad, 0)
|
||||
ARC_OPERAND(RCD, 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rcd, 0)
|
||||
ARC_OPERAND(RBD, 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rbd, extract_rb)
|
||||
ARC_OPERAND(RBDdup, 6, 12, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_TRUNCATE, insert_rbd, extract_rb)
|
||||
|
||||
/* The plain integer register fields. Used by short instructions. */
|
||||
ARC_OPERAND(RA16, 4, 0, 0, ARC_OPERAND_IR, insert_ras, extract_ras)
|
||||
ARC_OPERAND(RA_S, 4, 0, 0, ARC_OPERAND_IR, insert_ras, extract_ras)
|
||||
ARC_OPERAND(RB16, 4, 8, 0, ARC_OPERAND_IR, insert_rbs, extract_rbs)
|
||||
ARC_OPERAND(RB_S, 4, 8, 0, ARC_OPERAND_IR, insert_rbs, extract_rbs)
|
||||
ARC_OPERAND(RB16dup, 4, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rbs, extract_rbs)
|
||||
ARC_OPERAND(RB_Sdup, 4, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rbs, extract_rbs)
|
||||
ARC_OPERAND(RC16, 4, 5, 0, ARC_OPERAND_IR, insert_rcs, extract_rcs)
|
||||
ARC_OPERAND(RC_S, 4, 5, 0, ARC_OPERAND_IR, insert_rcs, extract_rcs)
|
||||
|
||||
/* 6bit register field 'h' used by V1 cpus. */
|
||||
ARC_OPERAND(R6H, 6, 5, 0, ARC_OPERAND_IR, insert_rhv1, extract_rhv1)
|
||||
/* 5bit register field 'h' used by V2 cpus. */
|
||||
ARC_OPERAND(R5H, 5, 5, 0, ARC_OPERAND_IR, insert_rhv2, extract_rhv2)
|
||||
ARC_OPERAND(RH_S, 5, 5, 0, ARC_OPERAND_IR, insert_rhv2, extract_rhv2)
|
||||
ARC_OPERAND(R5Hdup, 5, 5, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rhv2, extract_rhv2)
|
||||
ARC_OPERAND(RH_Sdup, 5, 5, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rhv2, extract_rhv2)
|
||||
|
||||
ARC_OPERAND(RG, 5, 5, 0, ARC_OPERAND_IR, insert_g_s, extract_g_s)
|
||||
ARC_OPERAND(G_S, 5, 5, 0, ARC_OPERAND_IR, insert_g_s, extract_g_s)
|
||||
|
||||
/* Fix registers. */
|
||||
ARC_OPERAND(R0, 0, 0, 0, ARC_OPERAND_IR, insert_r0, extract_r0)
|
||||
ARC_OPERAND(R0_S, 0, 0, 0, ARC_OPERAND_IR, insert_r0, extract_r0)
|
||||
ARC_OPERAND(R1, 1, 0, 0, ARC_OPERAND_IR, insert_r1, extract_r1)
|
||||
ARC_OPERAND(R1_S, 1, 0, 0, ARC_OPERAND_IR, insert_r1, extract_r1)
|
||||
ARC_OPERAND(R2, 2, 0, 0, ARC_OPERAND_IR, insert_r2, extract_r2)
|
||||
ARC_OPERAND(R2_S, 2, 0, 0, ARC_OPERAND_IR, insert_r2, extract_r2)
|
||||
ARC_OPERAND(R3, 2, 0, 0, ARC_OPERAND_IR, insert_r3, extract_r3)
|
||||
ARC_OPERAND(R3_S, 2, 0, 0, ARC_OPERAND_IR, insert_r3, extract_r3)
|
||||
ARC_OPERAND(RSP, 5, 0, 0, ARC_OPERAND_IR, insert_sp, extract_sp)
|
||||
ARC_OPERAND(SP_S, 5, 0, 0, ARC_OPERAND_IR, insert_sp, extract_sp)
|
||||
ARC_OPERAND(SPdup, 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_sp, extract_sp)
|
||||
ARC_OPERAND(SP_Sdup, 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_sp, extract_sp)
|
||||
ARC_OPERAND(GP, 5, 0, 0, ARC_OPERAND_IR, insert_gp, extract_gp)
|
||||
ARC_OPERAND(GP_S, 5, 0, 0, ARC_OPERAND_IR, insert_gp, extract_gp)
|
||||
|
||||
ARC_OPERAND(PCL_S, 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_pcl, extract_pcl)
|
||||
|
||||
ARC_OPERAND(BLINK, 5, 0, 0, ARC_OPERAND_IR, insert_blink, extract_blink)
|
||||
ARC_OPERAND(BLINK_S, 5, 0, 0, ARC_OPERAND_IR, insert_blink, extract_blink)
|
||||
|
||||
ARC_OPERAND(ILINK1, 5, 0, 0, ARC_OPERAND_IR, insert_ilink1, extract_ilink1)
|
||||
ARC_OPERAND(ILINK2, 5, 0, 0, ARC_OPERAND_IR, insert_ilink2, extract_ilink2)
|
||||
|
||||
/* Long immediate. */
|
||||
ARC_OPERAND(LIMM, 32, 0, BFD_RELOC_ARC_32_ME, ARC_OPERAND_LIMM, insert_limm, 0)
|
||||
ARC_OPERAND(LIMM_S, 32, 0, BFD_RELOC_ARC_32_ME, ARC_OPERAND_LIMM, insert_limm, 0)
|
||||
ARC_OPERAND(LO32, 32, 0, BFD_RELOC_ARC_LO32_ME, ARC_OPERAND_LIMM, insert_limm, 0)
|
||||
ARC_OPERAND(HI32, 32, 0, BFD_RELOC_ARC_HI32_ME, ARC_OPERAND_LIMM, insert_limm, 0)
|
||||
ARC_OPERAND(LIMM34, 34, 0, BFD_RELOC_ARC_PCLO32_ME_2, ARC_OPERAND_LIMM | ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_limm, 0)
|
||||
ARC_OPERAND(XIMM_S, 32, 0, BFD_RELOC_ARC_LO32_ME, ARC_OPERAND_LIMM | ARC_OPERAND_SIGNED, insert_limm, 0)
|
||||
ARC_OPERAND(XIMM, 32, 0, BFD_RELOC_ARC_LO32_ME, ARC_OPERAND_LIMM | ARC_OPERAND_SIGNED, insert_limm, 0)
|
||||
ARC_OPERAND(LIMMdup, 32, 0, 0, ARC_OPERAND_LIMM | ARC_OPERAND_DUPLICATE, insert_limm, 0)
|
||||
ARC_OPERAND(XIMMdup, 32, 0, 0, ARC_OPERAND_LIMM | ARC_OPERAND_DUPLICATE | ARC_OPERAND_SIGNED, insert_limm, 0)
|
||||
|
||||
/* Special operands. */
|
||||
ARC_OPERAND(ZA, 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0)
|
||||
ARC_OPERAND(ZB, 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0)
|
||||
ARC_OPERAND(ZA_S, 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0)
|
||||
ARC_OPERAND(ZB_S, 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0)
|
||||
ARC_OPERAND(ZC_S, 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0)
|
||||
|
||||
ARC_OPERAND(RRANGE_EL, 4, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK | ARC_OPERAND_TRUNCATE, insert_rrange, extract_rrange)
|
||||
ARC_OPERAND(R13_EL, 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK, insert_r13el, extract_rrange)
|
||||
ARC_OPERAND(FP_EL, 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK, insert_fpel, extract_fpel)
|
||||
ARC_OPERAND(BLINK_EL, 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK, insert_blinkel, extract_blinkel)
|
||||
ARC_OPERAND(PCL_EL, 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK, insert_pclel, extract_pclel)
|
||||
|
||||
/* Fake operand to handle the T flag. */
|
||||
ARC_OPERAND(BRAKET, 0, 0, 0, ARC_OPERAND_FAKE | ARC_OPERAND_BRAKET, 0, 0)
|
||||
ARC_OPERAND(BRAKETdup, 0, 0, 0, ARC_OPERAND_FAKE | ARC_OPERAND_BRAKET, 0, 0)
|
||||
|
||||
/* Fake operand to handle the T flag. */
|
||||
ARC_OPERAND(FKT_T, 1, 3, 0, ARC_OPERAND_FAKE, insert_Ybit, 0)
|
||||
/* Fake operand to handle the T flag. */
|
||||
ARC_OPERAND(FKT_NT, 1, 3, 0, ARC_OPERAND_FAKE, insert_NYbit, 0)
|
||||
|
||||
/* UIMM6_20 mask = 00000000000000000000111111000000. */
|
||||
ARC_OPERAND(UIMM6_20, 6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_20, extract_uimm6_20)
|
||||
|
||||
/* Exactly like the above but used by relaxation. */
|
||||
ARC_OPERAND(UIMM6_20R, 6, 0, -UIMM6_20R, ARC_OPERAND_UNSIGNED | ARC_OPERAND_PCREL, insert_uimm6_20, extract_uimm6_20)
|
||||
|
||||
/* SIMM12_20 mask = 00000000000000000000111111222222. */
|
||||
ARC_OPERAND(SIMM12_20, 12, 0, 0, ARC_OPERAND_SIGNED, insert_simm12_20, extract_simm12_20)
|
||||
|
||||
/* Exactly like the above but used by relaxation. */
|
||||
ARC_OPERAND(SIMM12_20R, 12, 0, -SIMM12_20R, ARC_OPERAND_SIGNED | ARC_OPERAND_PCREL, insert_simm12_20, extract_simm12_20)
|
||||
|
||||
/* UIMM12_20 mask = 00000000000000000000111111222222. */
|
||||
ARC_OPERAND(UIMM12_20, 12, 0, 0, ARC_OPERAND_UNSIGNED, insert_simm12_20, extract_uimm12_20)
|
||||
|
||||
/* SIMM3_5_S mask = 0000011100000000. */
|
||||
ARC_OPERAND(SIMM3_5_S, 3, 0, 0, ARC_OPERAND_SIGNED | ARC_OPERAND_NCHK, insert_simm3s, extract_simm3s)
|
||||
|
||||
/* UIMM7_A32_11_S mask = 0000000000011111. */
|
||||
ARC_OPERAND(UIMM7_A32_11_S, 7, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm7_a32_11_s, extract_uimm7_a32_11_s)
|
||||
|
||||
/* The same as above but used by relaxation. */
|
||||
ARC_OPERAND(UIMM7_A32_11R_S, 7, 0, -UIMM7_A32_11R_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE | ARC_OPERAND_PCREL, insert_uimm7_a32_11_s, extract_uimm7_a32_11_s)
|
||||
|
||||
ARC_OPERAND(UIMM9_A32_11_S, 9, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm9_a32_11_s, extract_uimm9_a32_11_s)
|
||||
|
||||
/* UIMM7_9_S mask = 0000000001111111. */
|
||||
ARC_OPERAND(UIMM7_9_S, 7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_9_s, extract_uimm7_9_s)
|
||||
|
||||
/* UIMM3_13_S mask = 0000000000000111. */
|
||||
ARC_OPERAND(UIMM3_13_S, 3, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm3_13_s, extract_uimm3_13_s)
|
||||
|
||||
/* Exactly like the above but used for relaxation. */
|
||||
ARC_OPERAND(UIMM3_13R_S, 3, 0, -UIMM3_13R_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_PCREL, insert_uimm3_13_s, extract_uimm3_13_s)
|
||||
|
||||
/* SIMM11_A32_7_S mask = 0000000111111111. */
|
||||
ARC_OPERAND(SIMM11_A32_7_S, 11, 0, BFD_RELOC_ARC_SDA16_LD2, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE, insert_simm11_a32_7_s, extract_simm11_a32_7_s)
|
||||
|
||||
/* UIMM6_13_S mask = 0000000002220111. */
|
||||
ARC_OPERAND(UIMM6_13_S, 6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_13_s, extract_uimm6_13_s)
|
||||
/* UIMM5_11_S mask = 0000000000011111. */
|
||||
ARC_OPERAND(UIMM5_11_S, 5, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_IGNORE, insert_uimm5_11_s, extract_uimm5_11_s)
|
||||
|
||||
/* SIMM9_A16_8 mask = 00000000111111102000000000000000. */
|
||||
ARC_OPERAND(SIMM9_A16_8, 9, 0, BFD_RELOC_ARC_S9H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_PCREL | ARC_OPERAND_TRUNCATE, insert_simm9_a16_8, extract_simm9_a16_8)
|
||||
|
||||
/* UIMM6_8 mask = 00000000000000000000111111000000. */
|
||||
ARC_OPERAND(UIMM6_8, 6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_8, extract_uimm6_8)
|
||||
|
||||
/* SIMM21_A16_5 mask = 00000111111111102222222222000000. */
|
||||
ARC_OPERAND(SIMM21_A16_5, 21, 0, BFD_RELOC_ARC_S21H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm21_a16_5, extract_simm21_a16_5)
|
||||
|
||||
/* SIMM25_A16_5 mask = 00000111111111102222222222003333. */
|
||||
ARC_OPERAND(SIMM25_A16_5, 25, 0, BFD_RELOC_ARC_S25H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm25_a16_5, extract_simm25_a16_5)
|
||||
|
||||
/* SIMM10_A16_7_S mask = 0000000111111111. */
|
||||
ARC_OPERAND(SIMM10_A16_7_S, 10, 0, BFD_RELOC_ARC_S10H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm10_a16_7_s, extract_simm10_a16_7_s)
|
||||
|
||||
ARC_OPERAND(SIMM10_A16_7_Sbis, 10, 0, -SIMM10_A16_7_Sbis, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE, insert_simm10_a16_7_s, extract_simm10_a16_7_s)
|
||||
|
||||
/* SIMM7_A16_10_S mask = 0000000000111111. */
|
||||
ARC_OPERAND(SIMM7_A16_10_S, 7, 0, BFD_RELOC_ARC_S7H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm7_a16_10_s, extract_simm7_a16_10_s)
|
||||
|
||||
/* SIMM21_A32_5 mask = 00000111111111002222222222000000. */
|
||||
ARC_OPERAND(SIMM21_A32_5, 21, 0, BFD_RELOC_ARC_S21W_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm21_a32_5, extract_simm21_a32_5)
|
||||
|
||||
/* SIMM25_A32_5 mask = 00000111111111002222222222003333. */
|
||||
ARC_OPERAND(SIMM25_A32_5, 25, 0, BFD_RELOC_ARC_S25W_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm25_a32_5, extract_simm25_a32_5)
|
||||
|
||||
/* SIMM13_A32_5_S mask = 0000011111111111. */
|
||||
ARC_OPERAND(SIMM13_A32_5_S, 13, 0, BFD_RELOC_ARC_S13_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm13_a32_5_s, extract_simm13_a32_5_s)
|
||||
|
||||
/* SIMM8_A16_9_S mask = 0000000001111111. */
|
||||
ARC_OPERAND(SIMM8_A16_9_S, 8, 0, BFD_RELOC_ARC_S8H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm8_a16_9_s, extract_simm8_a16_9_s)
|
||||
|
||||
/* UIMM10_6_S_JLIOFF mask = 0000001111111111. */
|
||||
ARC_OPERAND(UIMM10_6_S_JLIOFF, 12, 0, BFD_RELOC_ARC_JLI_SECTOFF, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE, insert_uimm10_6_s, extract_uimm10_6_s)
|
||||
|
||||
/* UIMM3_23 mask = 00000000000000000000000111000000. */
|
||||
ARC_OPERAND(UIMM3_23, 3, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm3_23, extract_uimm3_23)
|
||||
|
||||
/* UIMM10_6_S mask = 0000001111111111. */
|
||||
ARC_OPERAND(UIMM10_6_S, 10, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm10_6_s, extract_uimm10_6_s)
|
||||
|
||||
ARC_OPERAND(UIMM10_13_S, 10, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm10_13_s, extract_uimm10_13_s)
|
||||
|
||||
/* UIMM6_11_S mask = 0000002200011110. */
|
||||
ARC_OPERAND(UIMM6_11_S, 6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_11_s, extract_uimm6_11_s)
|
||||
|
||||
/* SIMM9_8 mask = 00000000111111112000000000000000. */
|
||||
ARC_OPERAND(SIMM9_8, 9, 0, BFD_RELOC_ARC_SDA_LDST, ARC_OPERAND_SIGNED | ARC_OPERAND_IGNORE, insert_simm9_8, extract_simm9_8)
|
||||
|
||||
/* The same as above but used by relaxation. */
|
||||
ARC_OPERAND(SIMM9_8R, 9, 0, -SIMM9_8R, ARC_OPERAND_SIGNED | ARC_OPERAND_IGNORE | ARC_OPERAND_PCREL, insert_simm9_8, extract_simm9_8)
|
||||
|
||||
/* UIMM10_A32_8_S mask = 0000000011111111. */
|
||||
ARC_OPERAND(UIMM10_A32_8_S, 10, 0, -UIMM10_A32_8_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_uimm10_a32_8_s, extract_uimm10_a32_8_s)
|
||||
|
||||
/* SIMM9_7_S mask = 0000000111111111. */
|
||||
ARC_OPERAND(SIMM9_7_S, 9, 0, BFD_RELOC_ARC_SDA16_LD, ARC_OPERAND_SIGNED, insert_simm9_7_s, extract_simm9_7_s)
|
||||
|
||||
/* UIMM6_A16_11_S mask = 0000000000011111. */
|
||||
ARC_OPERAND(UIMM6_A16_11_S, 6, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm6_a16_11_s, extract_uimm6_a16_11_s)
|
||||
|
||||
/* UIMM5_A32_11_S mask = 0000020000011000. */
|
||||
ARC_OPERAND(UIMM5_A32_11_S, 5, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm5_a32_11_s, extract_uimm5_a32_11_s)
|
||||
|
||||
/* SIMM11_A32_13_S mask = 0000022222200111. */
|
||||
ARC_OPERAND(SIMM11_A32_13_S, 11, 0, BFD_RELOC_ARC_SDA16_ST2, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE, insert_simm11_a32_13_s, extract_simm11_a32_13_s)
|
||||
|
||||
/* UIMM7_13_S mask = 0000000022220111. */
|
||||
ARC_OPERAND(UIMM7_13_S, 7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_13_s, extract_uimm7_13_s)
|
||||
|
||||
/* UIMM6_A16_21 mask = 00000000000000000000011111000000. */
|
||||
ARC_OPERAND(UIMM6_A16_21, 6, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE, insert_uimm6_a16_21, extract_uimm6_a16_21)
|
||||
|
||||
/* UIMM7_11_S mask = 0000022200011110. */
|
||||
ARC_OPERAND(UIMM7_11_S, 7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_11_s, extract_uimm7_11_s)
|
||||
|
||||
/* UIMM7_A16_20 mask = 00000000000000000000111111000000. */
|
||||
ARC_OPERAND(UIMM7_A16_20, 7, 0, -UIMM7_A16_20, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_uimm7_a16_20, extract_uimm7_a16_20)
|
||||
|
||||
/* SIMM13_A16_20 mask = 00000000000000000000111111222222. */
|
||||
ARC_OPERAND(SIMM13_A16_20, 13, 0, BFD_RELOC_ARC_S13H_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm13_a16_20, extract_simm13_a16_20)
|
||||
|
||||
/* UIMM8_8_S mask = 0000000011111111. */
|
||||
ARC_OPERAND(UIMM8_8_S, 8, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm8_8_s, extract_uimm8_8_s)
|
||||
|
||||
/* The same as above but used for relaxation. */
|
||||
ARC_OPERAND(UIMM8_8R_S, 8, 0, -UIMM8_8R_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_PCREL, insert_uimm8_8_s, extract_uimm8_8_s)
|
||||
|
||||
/* W6 mask = 00000000000000000000111111000000. */
|
||||
ARC_OPERAND(W6, 6, 0, 0, ARC_OPERAND_SIGNED, insert_w6, extract_w6)
|
||||
|
||||
/* UIMM6_5_S mask = 0000011111100000. */
|
||||
ARC_OPERAND(UIMM6_5_S, 6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_5_s, extract_uimm6_5_s)
|
||||
|
||||
/* ARC NPS400 Support: See comment near head of file. */
|
||||
ARC_OPERAND(NPS_R_DST_3B, 3, 24, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_24_dst, extract_nps_3bit_reg_at_24_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC1_3B, 3, 24, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_24_dst, extract_nps_3bit_reg_at_24_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC2_3B, 3, 21, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_21_src2, extract_nps_3bit_reg_at_21_src2)
|
||||
|
||||
ARC_OPERAND(NPS_R_DST, 6, 21, 0, ARC_OPERAND_IR, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC1, 6, 21, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS, 5, 5, 0, ARC_OPERAND_UNSIGNED, 0, 0)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SRC_POS, 5, 0, 0, ARC_OPERAND_UNSIGNED, 0, 0)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SIZE, 5, 10, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bitop_size, extract_nps_bitop_size)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS_SZ, 5, 0, 0, ARC_OPERAND_UNSIGNED, insert_nps_dst_pos_and_size, extract_nps_dst_pos_and_size)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SIZE_2B, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bitop_size_2b, extract_nps_bitop_size_2b)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_UIMM8, 8, 0, 0, ARC_OPERAND_UNSIGNED, insert_nps_bitop_uimm8, extract_nps_bitop_uimm8)
|
||||
|
||||
ARC_OPERAND(NPS_UIMM16, 16, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_SIMM16, 16, 0, 0, ARC_OPERAND_SIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_RFLT_UIMM6, 6, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_rflt_uimm6, extract_nps_rflt_uimm6)
|
||||
|
||||
ARC_OPERAND(NPS_XLDST_UIMM16, 16, 0, BFD_RELOC_ARC_NPS_CMEM16, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_cmem_uimm16, extract_nps_cmem_uimm16)
|
||||
|
||||
ARC_OPERAND(NPS_SRC2_POS, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_src2_pos, extract_nps_src2_pos)
|
||||
|
||||
ARC_OPERAND(NPS_SRC1_POS, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_src1_pos, extract_nps_src1_pos)
|
||||
|
||||
ARC_OPERAND(NPS_ADDB_SIZE, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_addb_size, extract_nps_addb_size)
|
||||
|
||||
ARC_OPERAND(NPS_ANDB_SIZE, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_andb_size, extract_nps_andb_size)
|
||||
|
||||
ARC_OPERAND(NPS_FXORB_SIZE, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_fxorb_size, extract_nps_fxorb_size)
|
||||
|
||||
ARC_OPERAND(NPS_WXORB_SIZE, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_wxorb_size, extract_nps_wxorb_size)
|
||||
|
||||
ARC_OPERAND(NPS_R_XLDST, 6, 5, 0, ARC_OPERAND_IR, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_DIV_UIMM4, 4, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_QCMP_SIZE, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_qcmp_size, extract_nps_qcmp_size)
|
||||
|
||||
ARC_OPERAND(NPS_QCMP_M1, 1, 14, 0, ARC_OPERAND_UNSIGNED, NULL, extract_nps_qcmp_m1)
|
||||
|
||||
ARC_OPERAND(NPS_QCMP_M2, 1, 15, 0, ARC_OPERAND_UNSIGNED, NULL, extract_nps_qcmp_m2)
|
||||
|
||||
ARC_OPERAND(NPS_QCMP_M3, 4, 5, 0, ARC_OPERAND_UNSIGNED, NULL, extract_nps_qcmp_m3)
|
||||
|
||||
ARC_OPERAND(NPS_CALC_ENTRY_SIZE, 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_calc_entry_size, extract_nps_calc_entry_size)
|
||||
|
||||
ARC_OPERAND(NPS_R_DST_3B_SHORT, 3, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_8_dst, extract_nps_3bit_reg_at_8_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC1_3B_SHORT, 3, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_8_dst, extract_nps_3bit_reg_at_8_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC2_3B_SHORT, 3, 5, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_5_src2, extract_nps_3bit_reg_at_5_src2)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SIZE2, 5, 25, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bitop2_size, extract_nps_bitop2_size)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SIZE1, 5, 20, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bitop1_size, extract_nps_bitop1_size)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS3_POS4, 5, 0, 0, ARC_OPERAND_UNSIGNED, insert_nps_bitop_dst_pos3_pos4, extract_nps_bitop_dst_pos3_pos4)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS4, 5, 42, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS3, 5, 37, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS2, 5, 15, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_DST_POS1, 5, 10, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SRC_POS4, 5, 32, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SRC_POS3, 5, 20, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SRC_POS2, 5, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_SRC_POS1, 5, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_MOD4, 2, 0, 0, ARC_OPERAND_UNSIGNED, insert_nps_bitop_mod4, extract_nps_bitop_mod4)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_MOD3, 2, 29, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_MOD2, 2, 27, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_MOD1, 2, 25, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BITOP_INS_EXT, 5, 20, 0, ARC_OPERAND_UNSIGNED, insert_nps_bitop_ins_ext, extract_nps_bitop_ins_ext)
|
||||
|
||||
ARC_OPERAND(NPS_FIELD_START_POS, 3, 3, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_FIELD_SIZE, 3, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_field_size, extract_nps_field_size)
|
||||
|
||||
ARC_OPERAND(NPS_SHIFT_FACTOR, 3, 9, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_shift_factor, extract_nps_shift_factor)
|
||||
|
||||
ARC_OPERAND(NPS_BITS_TO_SCRAMBLE, 3, 12, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bits_to_scramble, extract_nps_bits_to_scramble)
|
||||
|
||||
ARC_OPERAND(NPS_SRC2_POS_5B, 5, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BDLEN_MAX_LEN, 8, 5, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bdlen_max_len, extract_nps_bdlen_max_len)
|
||||
|
||||
ARC_OPERAND(NPS_MIN_HOFS, 4, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_min_hofs, extract_nps_min_hofs)
|
||||
|
||||
ARC_OPERAND(NPS_PSBC, 1, 11, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_DPI_DST, 5, 11, 0, ARC_OPERAND_IR, NULL, NULL)
|
||||
|
||||
/* NPS_DPI_SRC1_3B is similar to NPS_R_SRC1_3B
|
||||
but doesn't duplicate an operand. */
|
||||
ARC_OPERAND(NPS_DPI_SRC1_3B, 3, 24, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_24_dst, extract_nps_3bit_reg_at_24_dst)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_WIDTH, 5, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_hash_width, extract_nps_hash_width)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_PERM, 3, 2, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_NONLINEAR, 1, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_BASEMAT, 2, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_LEN, 3, 2, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_hash_len, extract_nps_hash_len)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_OFS, 2, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_HASH_BASEMAT2, 1, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_E4BY_INDEX0, 3, 8, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_E4BY_INDEX1, 3, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_E4BY_INDEX2, 3, 2, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_E4BY_INDEX3, 2, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_index3, extract_nps_index3)
|
||||
|
||||
ARC_OPERAND(COLON, 0, 0, 0, ARC_OPERAND_COLON | ARC_OPERAND_FAKE, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_bd, extract_nps_bd)
|
||||
|
||||
ARC_OPERAND(NPS_JID, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_jid, extract_nps_jid)
|
||||
|
||||
ARC_OPERAND(NPS_LBD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_lbd, extract_nps_lbd)
|
||||
|
||||
ARC_OPERAND(NPS_MBD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_mbd, extract_nps_mbd)
|
||||
|
||||
ARC_OPERAND(NPS_SD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_sd, extract_nps_sd)
|
||||
|
||||
ARC_OPERAND(NPS_SM, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_sm, extract_nps_sm)
|
||||
|
||||
ARC_OPERAND(NPS_XA, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_xa, extract_nps_xa)
|
||||
|
||||
ARC_OPERAND(NPS_XD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_xd, extract_nps_xd)
|
||||
|
||||
ARC_OPERAND(NPS_CD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_cd, extract_nps_cd)
|
||||
|
||||
ARC_OPERAND(NPS_CBD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_cbd, extract_nps_cbd)
|
||||
|
||||
ARC_OPERAND(NPS_CJID, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_cjid, extract_nps_cjid)
|
||||
|
||||
ARC_OPERAND(NPS_CLBD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_clbd, extract_nps_clbd)
|
||||
|
||||
ARC_OPERAND(NPS_CM, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_cm, extract_nps_cm)
|
||||
|
||||
ARC_OPERAND(NPS_CSD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_csd, extract_nps_csd)
|
||||
|
||||
ARC_OPERAND(NPS_CXA, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_cxa, extract_nps_cxa)
|
||||
|
||||
ARC_OPERAND(NPS_CXD, 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK, insert_nps_cxd, extract_nps_cxd)
|
||||
|
||||
ARC_OPERAND(NPS_BD_TYPE, 1, 10, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_BMU_NUM, 3, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_bd_num_buff, extract_nps_bd_num_buff)
|
||||
|
||||
ARC_OPERAND(NPS_PMU_NXT_DST, 4, 6, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_WHASH_SIZE, 6, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_size_16bit, extract_nps_size_16bit)
|
||||
|
||||
ARC_OPERAND(NPS_PMU_NUM_JOB, 2, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_pmu_num_job, extract_nps_pmu_num_job)
|
||||
|
||||
ARC_OPERAND(NPS_DMA_IMM_ENTRY, 3, 2, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_imm_entry, extract_nps_imm_entry)
|
||||
|
||||
ARC_OPERAND(NPS_DMA_IMM_OFFSET, 4, 10, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_imm_offset, extract_nps_imm_offset)
|
||||
|
||||
ARC_OPERAND(NPS_MISC_IMM_SIZE, 7, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_MISC_IMM_OFFSET, 5, 8, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_misc_imm_offset, extract_nps_misc_imm_offset)
|
||||
|
||||
ARC_OPERAND(NPS_R_DST_3B_48, 3, 40, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_40_dst, extract_nps_3bit_reg_at_40_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC1_3B_48, 3, 40, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_40_dst, extract_nps_3bit_reg_at_40_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC2_3B_48, 3, 37, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_37_src2, extract_nps_3bit_reg_at_37_src2)
|
||||
|
||||
ARC_OPERAND(NPS_R_DST_3B_64, 3, 56, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_56_dst, extract_nps_3bit_reg_at_56_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC1_3B_64, 3, 56, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_56_dst, extract_nps_3bit_reg_at_56_dst)
|
||||
|
||||
ARC_OPERAND(NPS_R_SRC2_3B_64, 3, 53, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_3bit_reg_at_53_src2, extract_nps_3bit_reg_at_53_src2)
|
||||
|
||||
ARC_OPERAND(NPS_RA_64, 6, 53, 0, ARC_OPERAND_IR, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_RB_64, 5, 48, 0, ARC_OPERAND_IR, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_RBdup_64, 5, 43, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_RBdouble_64, 10, 43, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_nps_rbdouble_64, extract_nps_rbdouble_64)
|
||||
|
||||
ARC_OPERAND(NPS_RC_64, 5, 43, 0, ARC_OPERAND_IR, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_UIMM16_0_64, 16, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL)
|
||||
|
||||
ARC_OPERAND(NPS_PROTO_SIZE, 6, 16, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, insert_nps_proto_size, extract_nps_proto_size)
|
||||
|
||||
/* ARC64's floating point registers. */
|
||||
ARC_OPERAND(FA, 5, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_FP, 0, 0)
|
||||
ARC_OPERAND(FB, 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_FP, 0, 0)
|
||||
ARC_OPERAND(FC, 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_FP, insert_fs2, extract_fs2)
|
||||
ARC_OPERAND(FD, 5, 19, 0, ARC_OPERAND_IR | ARC_OPERAND_FP, 0, 0)
|
||||
|
||||
/* Double 128 registers, the same like above but only the odd ones
|
||||
allowed. */
|
||||
ARC_OPERAND(FDA, 5, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_FP | ARC_OPERAND_TRUNCATE, 0, 0)
|
||||
ARC_OPERAND(FDB, 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_FP | ARC_OPERAND_TRUNCATE, 0, 0)
|
||||
ARC_OPERAND(FDC, 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_FP | ARC_OPERAND_TRUNCATE, insert_fs2, extract_fs2)
|
||||
ARC_OPERAND(FDD, 5, 19, 0, ARC_OPERAND_IR | ARC_OPERAND_FP | ARC_OPERAND_TRUNCATE, 0, 0)
|
||||
|
||||
/* 5bit integer registers used by fp instructions. */
|
||||
ARC_OPERAND(FRD, 5, 6, 0, ARC_OPERAND_IR, 0, 0)
|
||||
ARC_OPERAND(FRB, 5, 0, 0, ARC_OPERAND_IR, insert_fs2, extract_fs2)
|
||||
|
||||
/* 5bit unsigned immediate used by vfext and vfins. */
|
||||
ARC_OPERAND(UIMM5_FP, 5, 0, 0, ARC_OPERAND_UNSIGNED, insert_fs2, extract_fs2)
|
@ -208,7 +208,7 @@ DEF (0xad, ARC_OPCODE_ARCALL, NONE, se_watch)
|
||||
DEF (0xc0, ARC_OPCODE_ARCALL, NONE, bpu_build)
|
||||
DEF (0xc1, ARC_OPCODE_ARC600, NONE, arc600_build_config)
|
||||
DEF (0xc1, ARC_OPCODE_ARC700, NONE, isa_config)
|
||||
DEF (0xc1, ARC_OPCODE_ARCV2, NONE, isa_config)
|
||||
DEF (0xc1, ARC_OPCODE_ARCVx, NONE, isa_config)
|
||||
DEF (0xf4, ARC_OPCODE_ARCALL, NONE, hwp_build)
|
||||
DEF (0xf5, ARC_OPCODE_ARCALL, NONE, pct_build)
|
||||
DEF (0xf6, ARC_OPCODE_ARCALL, NONE, cc_build)
|
||||
@ -346,11 +346,17 @@ DEF (0x451, ARC_OPCODE_ARC600, NONE, wake)
|
||||
DEF (0x452, ARC_OPCODE_ARC600, NONE, dvfs_performance)
|
||||
DEF (0x453, ARC_OPCODE_ARC600, NONE, pwr_ctrl)
|
||||
DEF (0x460, ARC_OPCODE_ARCv2HS, NONE, tlbpd0)
|
||||
DEF (0x460, ARC_OPCODE_ARC64, NONE, mmu_rtp0_lo)
|
||||
DEF (0x461, ARC_OPCODE_ARCv2HS, NONE, tlbpd1)
|
||||
DEF (0x461, ARC_OPCODE_ARC64, NONE, mmu_rtp0_hi)
|
||||
DEF (0x462, ARC_OPCODE_ARC64, NONE, mmu_rtp1_lo)
|
||||
DEF (0x463, ARC_OPCODE_ARC64, NONE, mmu_rtp1_hi)
|
||||
DEF (0x464, ARC_OPCODE_ARCv2HS, NONE, tlbindex)
|
||||
DEF (0x465, ARC_OPCODE_ARCv2HS, NONE, tlbcommand)
|
||||
DEF (0x468, ARC_OPCODE_ARCv2HS, NONE, pid)
|
||||
DEF (0x46c, ARC_OPCODE_ARCv2HS, NONE, scratch_data0)
|
||||
DEF (0x468, ARC_OPCODE_ARC64, NONE, mmu_ctrl)
|
||||
DEF (0x469, ARC_OPCODE_ARC64, NONE, mmu_ttbc)
|
||||
DEF (0x500, ARC_OPCODE_ARC700, NONE, aux_vlc_buf_idx)
|
||||
DEF (0x501, ARC_OPCODE_ARC700, NONE, aux_vlc_read_buf)
|
||||
DEF (0x502, ARC_OPCODE_ARC700, NONE, aux_vlc_valid_bits)
|
||||
|
834
opcodes/arc64-opc.c
Normal file
834
opcodes/arc64-opc.c
Normal file
@ -0,0 +1,834 @@
|
||||
/* Opcode table for ARC64.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Claudiu Zissulescu (claziss@synopsys.com)
|
||||
|
||||
This file is part of libopcodes.
|
||||
|
||||
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 program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include "arcxx-opc.inc"
|
||||
|
||||
#define F32_BR0 0x00
|
||||
#define F32_BR1 0x01
|
||||
#define F32_LD_OFFSET 0x02
|
||||
#define F32_ST_OFFSET 0x03
|
||||
#define F32_GEN4 0x04
|
||||
#define F32_EXT5 0x05
|
||||
#define F32_EXT6 0x06
|
||||
#define F32_APEX 0x07
|
||||
|
||||
#define F16_COMPACT0 0x08
|
||||
#define F16_COMPACT1 0x08
|
||||
#define F16_MOVL 0x08
|
||||
|
||||
#define F16_LD_ADD_SUB 0x09
|
||||
|
||||
#define LD_ST_R01 0x0A
|
||||
#define LDI_S 0x0A
|
||||
#define JLI_S_U10 0x0A
|
||||
|
||||
#define F16_JLI_EI 0x0B
|
||||
#define F32_GEN_OP64 0x0B
|
||||
|
||||
/* Macros required for ARCv3 floating point instructions. */
|
||||
/* Flags. */
|
||||
#define FL_NONE { 0 }
|
||||
#define FL_CC { C_FPCC }
|
||||
|
||||
/* Arguments. */
|
||||
#define ARG_NONE { 0 }
|
||||
#define ARG_64FP_3OP { FA, FB, FC, FD }
|
||||
#define ARG_128FP_3OP { FDA, FDB, FDC, FDD }
|
||||
#define ARG_64FP_2OP { FA, FB, FC }
|
||||
#define ARG_64FP_CMP { FB, FC }
|
||||
#define ARG_128FP_2OP { FDA, FDB, FDC }
|
||||
#define ARG_64FP_1OP { FA, FC }
|
||||
#define ARG_64FP_SOP { FA, FB }
|
||||
#define ARG_128FP_SOP { FDA, FDB }
|
||||
|
||||
#define ARG_64FP_CVI2F { FA, FRB }
|
||||
#define ARG_64FP_CVF2I { FRD, FC }
|
||||
|
||||
/* Macros to help generating floating point pattern instructions. */
|
||||
/* Define FP_TOP. */
|
||||
#define FIELDS1(word) (word & 0x1F)
|
||||
#define FIELDS2(word) (((word & 0x07) << 24) | (((word >> 3) & 0x03) << 12))
|
||||
#define FIELDS3(word) ((word & 0x1F) << 19)
|
||||
#define FIELDD(word) ((word & 0x1F) << 6)
|
||||
#define FIELDTOP(word) (((word & 0x01) << 5) | ((word >> 1) & 0x07) << 16)
|
||||
#define FIELDP(word) ((word & 0x03) << 14)
|
||||
#define MASK_32BIT(VAL) (0xffffffff & (VAL))
|
||||
|
||||
#define INSNFP3OP(TOPF, P) \
|
||||
((0x1C << 27) | FIELDTOP (TOPF) | FIELDP (P) | (1 << 11))
|
||||
#define MINSNFP3OP \
|
||||
(MASK_32BIT (~(FIELDS1 (31) | FIELDS2 (31) | FIELDS3 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_DOP. */
|
||||
#define FIELDDOP(ops) ((ops & 0x1f) << 16)
|
||||
|
||||
#define INSNFP2OP(DOPF, P) \
|
||||
((0x1C << 27) | FIELDDOP (DOPF) | FIELDP (P) | (1 << 5))
|
||||
#define MINSNFP2OP \
|
||||
(MASK_32BIT (~(FIELDS2 (31) | FIELDS1 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_CVF2F. */
|
||||
#define FIELDCVTF(WORD) ((WORD & 0x03) << 16)
|
||||
#define FIELDU0(BIT) (BIT & 0x01)
|
||||
#define FIELDU1(BIT) (BIT & 0x02)
|
||||
#define FIELDU3(BIT) (BIT & 0x08)
|
||||
#define FIELDU4(BIT) (BIT & 0x10)
|
||||
|
||||
#define FP_CVF2F_MACHINE(CVTF, BIT) \
|
||||
((0x1C << 27) | (0x03 << 21) | FIELDCVTF (CVTF) \
|
||||
| (1 << 5) | (1 << 2) | FIELDU0 (BIT) | FIELDU3 (BIT) | FIELDU4 (BIT))
|
||||
#define MFP_CVF2F (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_RND. */
|
||||
#define FP_RND_MACHINE(CVTF, BIT) \
|
||||
((0x1C << 27) | (0x03 << 21) | FIELDCVTF (CVTF) | (1 << 5) | (0x03 << 1) \
|
||||
| FIELDU3 (BIT))
|
||||
#define MFP_RND (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_CVF2I. */
|
||||
#define FP_CVF2I_MACHINE(CVTF, BIT) ((0x1C << 27) | (0x03 << 21) \
|
||||
| FIELDCVTF (CVTF) | (1 << 5) | 1 \
|
||||
| FIELDU3 (BIT) | FIELDU1 (BIT))
|
||||
#define MFP_CVF2I (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FMVVF2I. */
|
||||
#define FM_VVF2I(CVTF, BIT) ((0x1C << 27) | (0x03 << 21) | FIELDCVTF (CVTF) \
|
||||
| (1 << 5) | 1 << 4 | 1)
|
||||
#define MFM_VVF2I (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_SOP. */
|
||||
#define FP_SOP_MACHINE(SOPF, P) \
|
||||
((0x1C << 27) | (0x02 << 21) | FIELDCVTF (SOPF) | FIELDP (P) | (1 << 5))
|
||||
#define MFP_SOP_MACHINE (MASK_32BIT (~(FIELDS1 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_COP. */
|
||||
#define FP_COP_MACHINE(COPF, P) \
|
||||
((0x1C << 27) | (0x09 << 19) | FIELDCVTF (COPF) | FIELDP (P) | (1 << 5))
|
||||
#define MFP_COP_MACHINE \
|
||||
(MASK_32BIT (~(FIELDS1 (31) | FIELDD (31) | FIELDS2(31))))
|
||||
|
||||
/* Define FP_ZOP. */
|
||||
#define INSNFPZOP(COPF) \
|
||||
((0x1C << 27) | (0x07 << 20) | FIELDCVTF (COPF) | (1 << 5))
|
||||
|
||||
/* Define FP_VMVI. */
|
||||
#define INSNFPVMVI(WMVF, P) \
|
||||
((0x1C << 27) | (0x05 << 20) | FIELDCVTF (WMVF) | FIELDP (P) | (1 << 5))
|
||||
#define MINSNFPCOP (MASK_32BIT (~(FIELDS1 (31) | FIELDD (31) | FIELDS2 (31))))
|
||||
#define MINSNFPVMVIZ (MASK_32BIT (~(FIELDS1 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_VMVR. */
|
||||
#define INSNFPVMVR(WMVF, P) \
|
||||
((0x1C << 27) | (0x01 << 23) | FIELDCVTF (WMVF) | FIELDP (P) | (1 << 5))
|
||||
#define MINSNFPVMVR (MASK_32BIT (~(FIELDS1 (31) | FIELDD (31) | FIELDS2 (31))))
|
||||
|
||||
/* Define FP_CVI2F. */
|
||||
#define INSNFPCVI2F(CVTF, BIT) ((0x1C << 27) | (0x07 << 21) | FIELDCVTF (CVTF) \
|
||||
| (1 << 5) | FIELDU3 (BIT) | FIELDU1 (BIT))
|
||||
#define MINSNFPCVI2F (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FMVI2F. */
|
||||
#define INSNFMVI2F(CVTF, BIT) ((0x1C << 27) | (0x07 << 21) | FIELDCVTF (CVTF) \
|
||||
| (1 << 5) | (1 << 4))
|
||||
#define MINSNFMVI2F (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FMVF2I. */
|
||||
#define INSNFMVF2I(CVTF, BIT) ((0x1C << 27) | (0x03 << 21) | FIELDCVTF (CVTF) \
|
||||
| (1 << 5) | (1 << 4) | (1))
|
||||
#define MINSNFMVF2I (MASK_32BIT (~(FIELDS2 (31) | FIELDD (31))))
|
||||
|
||||
/* Define FP_LOAD. */
|
||||
#define FP_LOAD_ENCODING(SIZE, D) (0x0D << 27 | ((SIZE & 0x03) << 1) \
|
||||
| ((D & 0x01) << 5))
|
||||
#define MSK_FP_LOAD (MASK_32BIT (~(FIELDB (63) | FIELDD (31) | (0x03 << 3) \
|
||||
| (0x1FF << 15))))
|
||||
|
||||
#define FP_LSYM_ENCODING(SIZE, D) (0x0D << 27 | ((SIZE & 0x03) << 1) \
|
||||
| FIELDB(62) | ((D & 0x01) << 5))
|
||||
#define MSK_FP_SYM (MASK_32BIT (~(FIELDD (31))))
|
||||
|
||||
/* Define FP_STORE. */
|
||||
#define FP_STORE_ENCODING(SIZE, D) ((0x0D << 27) | ((SIZE & 0x03) << 1) \
|
||||
| ((D & 0x01) << 5) | (1))
|
||||
#define MSK_FP_STORE (MASK_32BIT (~(FIELDB (63) | FIELDD (31) | (0x03 << 3) \
|
||||
| (0x1FF << 15))))
|
||||
#define FP_SSYM_ENCODING(SIZE, D) (0x0D << 27 | ((SIZE & 0x03) << 1) \
|
||||
| FIELDB(62) | ((D & 0x01) << 5) | (1))
|
||||
|
||||
/* FP Load/Store. */
|
||||
#define FP_LOAD(NAME, SIZE, D) \
|
||||
{ #NAME, FP_LOAD_ENCODING (SIZE, D), MSK_FP_LOAD, ARC_OPCODE_ARC64, LOAD, \
|
||||
NONE, { FA, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 } }, \
|
||||
{ #NAME, FP_LSYM_ENCODING (SIZE, D), MSK_FP_SYM, ARC_OPCODE_ARC64, LOAD, \
|
||||
NONE, { FA, BRAKET, LIMM, BRAKETdup }, FL_NONE },
|
||||
|
||||
#define FP_STORE(NAME, SIZE, D) \
|
||||
{ #NAME, FP_STORE_ENCODING (SIZE, D), MSK_FP_STORE, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { FA, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 } }, \
|
||||
{ #NAME, FP_SSYM_ENCODING (SIZE, D), MSK_FP_SYM, ARC_OPCODE_ARC64, LOAD, \
|
||||
NONE, { FA, BRAKET, LIMM, BRAKETdup }, FL_NONE },
|
||||
|
||||
/* Macros used to generate conversion instructions. */
|
||||
#define FMVF2I_INSN(NAME, CPU, CLASS, SCLASS, OPS, BIT, ARG) \
|
||||
{ NAME, INSNFMVF2I (OPS, BIT), MINSNFMVF2I, CPU, CLASS, \
|
||||
SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FMVF2I(NAME, OPS, BIT) \
|
||||
FMVF2I_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, OPS, \
|
||||
BIT, ARG_64FP_CVF2I)
|
||||
|
||||
#define FMVI2F_INSN(NAME, CPU, CLASS, SCLASS, OPS, BIT, ARG) \
|
||||
{ NAME, INSNFMVI2F (OPS, BIT), MINSNFMVI2F, CPU, CLASS, \
|
||||
SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FMVI2F(NAME, OPS, BIT) \
|
||||
FMVI2F_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, OPS, \
|
||||
BIT, ARG_64FP_CVI2F)
|
||||
|
||||
#define FP_RND_INSN(NAME, CPU, CLASS, SCLASS, OPS, BIT, ARG) \
|
||||
{ NAME, FP_RND_MACHINE (OPS, BIT), MFP_RND, CPU, CLASS, \
|
||||
SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FP_RND(NAME, OPS, BIT) \
|
||||
FP_RND_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, OPS, \
|
||||
BIT, ARG_64FP_1OP)
|
||||
|
||||
#define FP_CVF2F_INSN(NAME, CPU, CLASS, SCLASS, OPS, BIT, ARG) \
|
||||
{ NAME, FP_CVF2F_MACHINE (OPS, BIT), MFP_CVF2F, CPU, CLASS, \
|
||||
SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FP_CVF2F(NAME, OPS, BIT) \
|
||||
FP_CVF2F_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, OPS, \
|
||||
BIT, ARG_64FP_1OP)
|
||||
|
||||
#define FP_CVF2I_INSN(NAME, CPU, CLASS, SCLASS, OPS, BIT, ARG) \
|
||||
{ NAME, FP_CVF2I_MACHINE (OPS, BIT), MFP_CVF2I, CPU, CLASS, \
|
||||
SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FP_CVF2I(NAME, OPS, BIT) \
|
||||
FP_CVF2I_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, OPS, \
|
||||
BIT, ARG_64FP_CVF2I)
|
||||
|
||||
#define FP_CVI2F_INSN(NAME, CPU, CLASS, SCLASS, OPS, BIT, ARG) \
|
||||
{ NAME, INSNFPCVI2F (OPS, BIT), MINSNFPCVI2F, CPU, CLASS, \
|
||||
SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FP_CVI2F(NAME, OPS, BIT) \
|
||||
FP_CVI2F_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, OPS, \
|
||||
BIT, ARG_64FP_CVI2F)
|
||||
|
||||
/* Macro to generate 1 operand extension instruction. */
|
||||
#define FP_SOP_INSN(NAME, CPU, CLASS, SCLASS, OPS, PRC, ARG) \
|
||||
{ NAME, FP_SOP_MACHINE (OPS, PRC), MFP_SOP_MACHINE, CPU, CLASS, SCLASS, \
|
||||
ARG, FL_NONE },
|
||||
|
||||
#define FP_SOP(NAME, OPS, PRECISION) \
|
||||
FP_SOP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, SOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_64FP_SOP)
|
||||
|
||||
#define FP_SOP_D(NAME, OPS, PRECISION) \
|
||||
FP_SOP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, SOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_128FP_SOP)
|
||||
|
||||
/* Macro to generate 2 operand extension instruction. */
|
||||
#define FP_DOP_INSN(NAME, CPU, CLASS, SCLASS, OPS, PRC, ARG) \
|
||||
{ NAME, INSNFP2OP (OPS, PRC), MINSNFP2OP, CPU, CLASS, SCLASS, \
|
||||
ARG, FL_NONE },
|
||||
|
||||
#define FP_DOP(NAME, OPS, PRECISION) \
|
||||
FP_DOP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, DOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_64FP_2OP)
|
||||
|
||||
#define FP_DOPC_INSN(NAME, CPU, CLASS, SCLASS, OPS, PRC, ARG) \
|
||||
{ NAME, INSNFP2OP (OPS, PRC) | FIELDD (0), MINSNFP2OP, CPU, \
|
||||
CLASS, SCLASS, ARG, FL_NONE },
|
||||
|
||||
#define FP_DOP_C(NAME, OPS, PRECISION) \
|
||||
FP_DOPC_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, DOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_64FP_CMP)
|
||||
|
||||
#define FP_DOP_D(NAME, OPS, PRECISION) \
|
||||
FP_DOP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, DOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_128FP_2OP)
|
||||
|
||||
/* Macro to generate 3 operand generic instruction. */
|
||||
#define FP_TOP_INSN(NAME, CPU, CLASS, SCLASS, TOPF, P, ARG) \
|
||||
{ NAME, INSNFP3OP (TOPF, P), MINSNFP3OP, CPU, CLASS, SCLASS, \
|
||||
ARG, FL_NONE },
|
||||
|
||||
#define FP_TOP(NAME, OPS, PRECISION) \
|
||||
FP_TOP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, TOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_64FP_3OP)
|
||||
|
||||
#define FP_TOP_D(NAME, OPS, PRECISION) \
|
||||
FP_TOP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, TOPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_128FP_3OP)
|
||||
|
||||
/* Conditional mov instructions. */
|
||||
#define FP_COP_INSN(NAME, CPU, CLASS, SCLASS, OPS, PRC, ARG) \
|
||||
{ NAME, FP_COP_MACHINE (OPS, PRC), MFP_COP_MACHINE, CPU, CLASS, SCLASS, \
|
||||
ARG, FL_CC },
|
||||
|
||||
#define FP_COP(NAME, OPS, PRECISION) \
|
||||
FP_COP_INSN (#NAME, ARC_OPCODE_ARC64, FLOAT, NONE, COPF_ ## OPS, \
|
||||
P_ ## PRECISION, ARG_64FP_SOP)
|
||||
|
||||
#define FP_EXT(NAME, PRECISION) \
|
||||
{#NAME, INSNFPVMVI (0x00, P_ ## PRECISION), MINSNFPCOP, \
|
||||
ARC_OPCODE_ARC64, FLOAT, NONE, { FA, FB, BRAKET, UIMM5_FP, \
|
||||
BRAKETdup }, FL_NONE }, \
|
||||
{#NAME, INSNFPVMVR (0x00, P_ ## PRECISION), MINSNFPVMVR, \
|
||||
ARC_OPCODE_ARC64, FLOAT, NONE, { FA, FB, BRAKET, FRB, BRAKETdup}, \
|
||||
FL_NONE },
|
||||
|
||||
#define FP_INS(NAME, PRECISION) \
|
||||
{#NAME, INSNFPVMVI (0x01, P_ ## PRECISION), MINSNFPCOP, \
|
||||
ARC_OPCODE_ARC64, FLOAT, NONE, { FA, BRAKET, UIMM5_FP, BRAKETdup, \
|
||||
FB }, FL_NONE }, \
|
||||
{#NAME, INSNFPVMVR (0x01, P_ ## PRECISION), MINSNFPVMVR, \
|
||||
ARC_OPCODE_ARC64, FLOAT, NONE, { FA, BRAKET, FRB, BRAKETdup, \
|
||||
FB }, FL_NONE },
|
||||
|
||||
#define FP_REP(NAME, PRECISION) \
|
||||
{#NAME, INSNFPVMVI (0x02, P_ ## PRECISION) | FIELDS2 (0x00), \
|
||||
MINSNFPVMVIZ, ARC_OPCODE_ARC64, FLOAT, NONE, { FA, FB }, FL_NONE },
|
||||
|
||||
|
||||
/* Common combinations of FLAGS. */
|
||||
#define FLAGS_NONE { 0 }
|
||||
#define FLAGS_F { C_F }
|
||||
#define FLAGS_CC { C_CC }
|
||||
#define FLAGS_CCF { C_CC, C_F }
|
||||
|
||||
/* Common combination of arguments. */
|
||||
#define ARG_NONE { 0 }
|
||||
#define ARG_32BIT_RARBRC { RA, RB, RC }
|
||||
#define ARG_32BIT_ZARBRC { ZA, RB, RC }
|
||||
#define ARG_32BIT_RBRBRC { RB, RBdup, RC }
|
||||
#define ARG_32BIT_RARBU6 { RA, RB, UIMM6_20 }
|
||||
#define ARG_32BIT_ZARBU6 { ZA, RB, UIMM6_20 }
|
||||
#define ARG_32BIT_RBRBU6 { RB, RBdup, UIMM6_20 }
|
||||
#define ARG_32BIT_RBRBS12 { RB, RBdup, SIMM12_20 }
|
||||
#define ARG_32BIT_RALIMMRC { RA, LIMM, RC }
|
||||
#define ARG_32BIT_RARBLIMM { RA, RB, LIMM }
|
||||
#define ARG_32BIT_ZALIMMRC { ZA, LIMM, RC }
|
||||
#define ARG_32BIT_ZARBLIMM { ZA, RB, LIMM }
|
||||
|
||||
#define ARG_32BIT_RBRBLIMM { RB, RBdup, LIMM }
|
||||
#define ARG_32BIT_RALIMMU6 { RA, LIMM, UIMM6_20 }
|
||||
#define ARG_32BIT_ZALIMMU6 { ZA, LIMM, UIMM6_20 }
|
||||
|
||||
#define ARG_32BIT_ZALIMMS12 { ZA, LIMM, SIMM12_20 }
|
||||
#define ARG_32BIT_RALIMMLIMM { RA, LIMM, LIMMdup }
|
||||
#define ARG_32BIT_ZALIMMLIMM { ZA, LIMM, LIMMdup }
|
||||
|
||||
#define ARG_32BIT_RBRC { RB, RC }
|
||||
#define ARG_32BIT_ZARC { ZA, RC }
|
||||
#define ARG_32BIT_RBU6 { RB, UIMM6_20 }
|
||||
#define ARG_32BIT_ZAU6 { ZA, UIMM6_20 }
|
||||
#define ARG_32BIT_RBLIMM { RB, LIMM }
|
||||
#define ARG_32BIT_ZALIMM { ZA, LIMM }
|
||||
|
||||
#define ARG_32BIT_RAXIMMRC { RA, XIMM, RC }
|
||||
#define ARG_32BIT_RARBXIMM { RA, RB, XIMM }
|
||||
#define ARG_32BIT_RBRBXIMM { RB, RBdup, XIMM }
|
||||
#define ARG_32BIT_RAXIMMU6 { RA, XIMM, UIMM6_20 }
|
||||
|
||||
/* Macro to generate 2 operand extension instruction. */
|
||||
#define EXTINSN2OPF(NAME, CPU, CLASS, SCLASS, MOP, SOP, FL) \
|
||||
{ NAME, INSN2OP_BC (MOP,SOP), MINSN2OP_BC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRC, FL }, \
|
||||
{ NAME, INSN2OP_0C (MOP,SOP), MINSN2OP_0C, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARC, FL }, \
|
||||
{ NAME, INSN2OP_BU (MOP,SOP), MINSN2OP_BU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBU6, FL }, \
|
||||
{ NAME, INSN2OP_0U (MOP,SOP), MINSN2OP_0U, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZAU6, FL }, \
|
||||
{ NAME, INSN2OP_BL (MOP,SOP), MINSN2OP_BL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBLIMM, FL }, \
|
||||
{ NAME, INSN2OP_0L (MOP,SOP), MINSN2OP_0L, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMM, FL },
|
||||
|
||||
#define EXTINSN2OP(NAME, CPU, CLASS, SCLASS, MOP, SOP) \
|
||||
EXTINSN2OPF(NAME, CPU, CLASS, SCLASS, MOP, SOP, FLAGS_F)
|
||||
|
||||
/* Macro to generate 3 operand extesion instruction. */
|
||||
#define EXTINSN3OP(NAME, CPU, CLASS, SCLASS, MOP, SOP) \
|
||||
{ NAME, INSN3OP_ABC (MOP,SOP), MINSN3OP_ABC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BC (MOP,SOP), MINSN3OP_0BC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBC (MOP,SOP), MINSN3OP_CBBC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBRC, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_ABU (MOP,SOP), MINSN3OP_ABU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BU (MOP,SOP), MINSN3OP_0BU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBU (MOP,SOP), MINSN3OP_CBBU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBU6, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_BBS (MOP,SOP), MINSN3OP_BBS, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBS12, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ALC (MOP,SOP), MINSN3OP_ALC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ABL (MOP,SOP), MINSN3OP_ABL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0LC (MOP,SOP), MINSN3OP_0LC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BL (MOP,SOP), MINSN3OP_0BL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_C0LC (MOP,SOP), MINSN3OP_C0LC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMRC, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_CBBL (MOP,SOP), MINSN3OP_CBBL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBLIMM, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_ALU (MOP,SOP), MINSN3OP_ALU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0LU (MOP,SOP), MINSN3OP_0LU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_C0LU (MOP,SOP), MINSN3OP_C0LU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMU6, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_0LS (MOP,SOP), MINSN3OP_0LS, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMS12, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ALL (MOP,SOP), MINSN3OP_ALL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0LL (MOP,SOP), MINSN3OP_0LL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_C0LL (MOP,SOP), MINSN3OP_C0LL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZALIMMLIMM, FLAGS_CCF },
|
||||
|
||||
|
||||
/* Generate sign extend 32-bit immediate instructions. */
|
||||
#define INSN3OP_AXC(MOP,SOP) (INSN3OP (MOP,SOP) | FIELDB (60))
|
||||
#define INSN3OP_ABX(MOP,SOP) (INSN3OP (MOP,SOP) | FIELDC (60))
|
||||
#define INSN3OP_CBBX(MOP,SOP) (INSN3OP (MOP,SOP) | (0x03 << 22) | FIELDC (60))
|
||||
#define INSN3OP_AXU(MOP,SOP) (INSN3OP (MOP,SOP) | (0x01 << 22) | FIELDB (60))
|
||||
|
||||
/* Macro to generate 3 operand 64bit instruction. */
|
||||
#define OP64INSN3OP(NAME, CPU, CLASS, SCLASS, MOP, SOP) \
|
||||
{ NAME, INSN3OP_ABC (MOP,SOP), MINSN3OP_ABC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BC (MOP,SOP), MINSN3OP_0BC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBC (MOP,SOP), MINSN3OP_CBBC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBRC, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_ABU (MOP,SOP), MINSN3OP_ABU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_0BU (MOP,SOP), MINSN3OP_0BU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_ZARBU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBU (MOP,SOP), MINSN3OP_CBBU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBU6, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_BBS (MOP,SOP), MINSN3OP_BBS, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBS12, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_AXC (MOP,SOP), MINSN3OP_ALC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RAXIMMRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ABX (MOP,SOP), MINSN3OP_ABL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBXIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBX (MOP,SOP), MINSN3OP_CBBL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBXIMM, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_AXU (MOP,SOP), MINSN3OP_ALU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RAXIMMU6, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ALC (MOP,SOP), MINSN3OP_ALC, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMRC, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_ABL (MOP,SOP), MINSN3OP_ABL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RARBLIMM, FLAGS_F }, \
|
||||
{ NAME, INSN3OP_CBBL (MOP,SOP), MINSN3OP_CBBL, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RBRBLIMM, FLAGS_CCF }, \
|
||||
{ NAME, INSN3OP_ALU (MOP,SOP), MINSN3OP_ALU, CPU, CLASS, SCLASS, \
|
||||
ARG_32BIT_RALIMMU6, FLAGS_F },
|
||||
|
||||
|
||||
#define STDL_ENCODING(K, ZZ) ((F32_ST_OFFSET << 27) | (1 << 5) | (ZZ << 1) \
|
||||
| (K))
|
||||
#define MSK_STDL (MASK_32BIT (~(FIELDB (63) | (0x1ff << 15) | FIELDC (63) \
|
||||
| (0x3 << 3))))
|
||||
#define STDL_ASYM_ENCODING(K, ZZ, X) ((F32_ST_OFFSET << 27) | FIELDB (X) \
|
||||
| (1 << 5) | (ZZ << 1) | (K))
|
||||
#define STDL_DIMM_ENCODING(K, ZZ, X) ((F32_ST_OFFSET << 27) | FIELDC (X) \
|
||||
| (1 << 5) | (ZZ << 1) | (K))
|
||||
|
||||
/* stdl<.aa> c,[b,s9]
|
||||
stdl<.aa> w6,[b,s9]
|
||||
stdl<.as> c,[ximm]
|
||||
stdl<.as> w6,[ximm]
|
||||
stdl<.aa> ximm,[b,s9]
|
||||
stdl<.aa> limm,[b,s9]
|
||||
*/
|
||||
#define STDL \
|
||||
{ "stdl", STDL_ENCODING (0, 0x03), MSK_STDL, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { RCD, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \
|
||||
{ "stdl", STDL_ENCODING (1, 0x02), MSK_STDL, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { W6, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \
|
||||
{ "stdl", STDL_ASYM_ENCODING (0, 0x03, 60), 0xFF007027, ARC_OPCODE_ARC64, \
|
||||
STORE, NONE, { RCD, BRAKET, XIMM, BRAKETdup }, {C_AS27 }}, \
|
||||
{ "stdl", STDL_ASYM_ENCODING (1, 0x02, 60), 0xFF007027, ARC_OPCODE_ARC64, \
|
||||
STORE, NONE, { W6, BRAKET, XIMM, BRAKETdup }, { C_AS27 }}, \
|
||||
{ "stdl", STDL_ASYM_ENCODING (0, 0x03, 62), 0xFF007027, ARC_OPCODE_ARC64, \
|
||||
STORE, NONE, { RCD, BRAKET, LIMM, BRAKETdup }, {C_AS27 }}, \
|
||||
{ "stdl", STDL_ASYM_ENCODING (1, 0x02, 62), 0xFF007027, ARC_OPCODE_ARC64, \
|
||||
STORE, NONE, { W6, BRAKET, LIMM, BRAKETdup }, { C_AS27 }}, \
|
||||
{ "stdl", STDL_DIMM_ENCODING (0, 0x03, 60), 0XF8000FE7, ARC_OPCODE_ARC64, \
|
||||
STORE, NONE, { XIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \
|
||||
{ "stdl", STDL_DIMM_ENCODING (0, 0x03, 62), 0xF8000FE7, ARC_OPCODE_ARC64, \
|
||||
STORE, NONE, { LIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }},
|
||||
|
||||
#define STL_ENCODING(DI) ((F32_ST_OFFSET << 27) | (DI << 5) | (0X03 << 1) \
|
||||
| (1))
|
||||
#define MSK_STL (MASK_32BIT (~(FIELDB (63) | (0x1ff << 15) | FIELDC (63) \
|
||||
| (0x03 << 3))))
|
||||
#define STL_ASYM_ENCODING(DI, X) ((F32_ST_OFFSET << 27) | (DI << 5) \
|
||||
| (0X03 << 1) | FIELDB (X) | (1))
|
||||
#define STL_DSYM_ENCODING(X) ((F32_ST_OFFSET << 27) | (0X03 << 1) \
|
||||
| FIELDC (X) | (1))
|
||||
|
||||
/* stl<.aa> c,[b,s9]
|
||||
stl<.aa> w6,[b,s9]
|
||||
stl<.as> c,[ximm]
|
||||
stl<.as> w6,[ximm]
|
||||
stl<.aa> ximm,[b,s9]
|
||||
stl<.aa> limm,[b,s9]
|
||||
*/
|
||||
#define STL \
|
||||
{ "stl", STL_ENCODING (0), MSK_STL, ARC_OPCODE_ARC64, STORE, NONE, \
|
||||
{ RC, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \
|
||||
{ "stl", STL_ENCODING (1), MSK_STL, ARC_OPCODE_ARC64, STORE, NONE, \
|
||||
{ W6, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \
|
||||
{ "stl", STL_ASYM_ENCODING (0, 60), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { RC, BRAKET, XIMM, BRAKETdup }, { C_AS27 }}, \
|
||||
{ "stl", STL_ASYM_ENCODING (1, 60), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { W6, BRAKET, XIMM, BRAKETdup }, { C_AS27 }}, \
|
||||
{ "stl", STL_ASYM_ENCODING (0, 62), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { RC, BRAKET, LIMM, BRAKETdup }, { C_AS27 }}, \
|
||||
{ "stl", STL_ASYM_ENCODING (1, 62), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { W6, BRAKET, LIMM, BRAKETdup }, { C_AS27 }}, \
|
||||
{ "stl", STL_DSYM_ENCODING (60), 0xF8000FC7, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { XIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \
|
||||
{ "stl", STL_DSYM_ENCODING (62), 0xF8000FC7, ARC_OPCODE_ARC64, STORE, \
|
||||
NONE, { LIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }},
|
||||
|
||||
/* The opcode table.
|
||||
|
||||
The format of the opcode table is:
|
||||
|
||||
NAME OPCODE MASK CPU CLASS SUBCLASS { OPERANDS } { FLAGS }.
|
||||
|
||||
The table is organised such that, where possible, all instructions with
|
||||
the same mnemonic are together in a block. When the assembler searches
|
||||
for a suitable instruction the entries are checked in table order, so
|
||||
more specific, or specialised cases should appear earlier in the table.
|
||||
|
||||
As an example, consider two instructions 'add a,b,u6' and 'add
|
||||
a,b,limm'. The first takes a 6-bit immediate that is encoded within the
|
||||
32-bit instruction, while the second takes a 32-bit immediate that is
|
||||
encoded in a follow-on 32-bit, making the total instruction length
|
||||
64-bits. In this case the u6 variant must appear first in the table, as
|
||||
all u6 immediates could also be encoded using the 'limm' extension,
|
||||
however, we want to use the shorter instruction wherever possible.
|
||||
|
||||
It is possible though to split instructions with the same mnemonic into
|
||||
multiple groups. However, the instructions are still checked in table
|
||||
order, even across groups. The only time that instructions with the
|
||||
same mnemonic should be split into different groups is when different
|
||||
variants of the instruction appear in different architectures, in which
|
||||
case, grouping all instructions from a particular architecture together
|
||||
might be preferable to merging the instruction into the main instruction
|
||||
table.
|
||||
|
||||
An example of this split instruction groups can be found with the 'sync'
|
||||
instruction. The core arc architecture provides a 'sync' instruction,
|
||||
while the nps instruction set extension provides 'sync.rd' and
|
||||
'sync.wr'. The rd/wr flags are instruction flags, not part of the
|
||||
mnemonic, so we end up with two groups for the sync instruction, the
|
||||
first within the core arc instruction table, and the second within the
|
||||
nps extension instructions. */
|
||||
|
||||
const struct arc_opcode arc_opcodes[] =
|
||||
{
|
||||
|
||||
/* STL and STDL instructions. */
|
||||
STL
|
||||
STDL
|
||||
|
||||
#include "arc64-tbl.h"
|
||||
|
||||
FP_TOP (fhmadd , FMADD , HALF)
|
||||
FP_TOP (fhmsub , FMSUB , HALF)
|
||||
FP_TOP (fhnmadd, FNMADD, HALF)
|
||||
FP_TOP (fhnmsub, FNMSUB, HALF)
|
||||
|
||||
FP_TOP (fsmadd , FMADD , SINGLE)
|
||||
FP_TOP (fsmsub , FMSUB , SINGLE)
|
||||
FP_TOP (fsnmadd, FNMADD, SINGLE)
|
||||
FP_TOP (fsnmsub, FNMSUB, SINGLE)
|
||||
|
||||
FP_TOP (fdmadd , FMADD , DOUBLE)
|
||||
FP_TOP (fdmsub , FMSUB , DOUBLE)
|
||||
FP_TOP (fdnmadd, FNMADD, DOUBLE)
|
||||
FP_TOP (fdnmsub, FNMSUB, DOUBLE)
|
||||
|
||||
/* Vectors. */
|
||||
FP_TOP (vfhmadd , VFMADD , HALF)
|
||||
FP_TOP (vfhmsub , VFMSUB , HALF)
|
||||
FP_TOP (vfhnmadd, VFNMADD, HALF)
|
||||
FP_TOP (vfhnmsub, VFNMSUB, HALF)
|
||||
FP_TOP (vfhmadds , VFMADDS , HALF)
|
||||
FP_TOP (vfhmsubs , VFMSUBS , HALF)
|
||||
FP_TOP (vfhnmadds, VFNMADDS, HALF)
|
||||
FP_TOP (vfhnmsubs, VFNMSUBS, HALF)
|
||||
|
||||
FP_TOP (vfsmadd , VFMADD , SINGLE)
|
||||
FP_TOP (vfsmsub , VFMSUB , SINGLE)
|
||||
FP_TOP (vfsnmadd, VFNMADD, SINGLE)
|
||||
FP_TOP (vfsnmsub, VFNMSUB, SINGLE)
|
||||
FP_TOP (vfsmadds , VFMADDS , SINGLE)
|
||||
FP_TOP (vfsmsubs , VFMSUBS , SINGLE)
|
||||
FP_TOP (vfsnmadds, VFNMADDS, SINGLE)
|
||||
FP_TOP (vfsnmsubs, VFNMSUBS, SINGLE)
|
||||
|
||||
FP_TOP_D (vfdmadd , VFMADD , DOUBLE)
|
||||
FP_TOP_D (vfdmsub , VFMSUB , DOUBLE)
|
||||
FP_TOP_D (vfdnmadd, VFNMADD, DOUBLE)
|
||||
FP_TOP_D (vfdnmsub, VFNMSUB, DOUBLE)
|
||||
FP_TOP_D (vfdmadds , VFMADDS , DOUBLE)
|
||||
FP_TOP_D (vfdmsubs , VFMSUBS , DOUBLE)
|
||||
FP_TOP_D (vfdnmadds, VFNMADDS, DOUBLE)
|
||||
FP_TOP_D (vfdnmsubs, VFNMSUBS, DOUBLE)
|
||||
|
||||
/* 2OPS. */
|
||||
FP_DOP (fhadd , FADD , HALF)
|
||||
FP_DOP (fhsub , FSUB , HALF)
|
||||
FP_DOP (fhmul , FMUL , HALF)
|
||||
FP_DOP (fhdiv , FDIV , HALF)
|
||||
FP_DOP (fhmin , FMIN , HALF)
|
||||
FP_DOP (fhmax , FMAX , HALF)
|
||||
FP_DOP (fhsgnj , FSGNJ , HALF)
|
||||
FP_DOP (fhsgnjn, FSGNJN, HALF)
|
||||
FP_DOP (fhsgnjx, FSGNJX, HALF)
|
||||
|
||||
FP_DOP (fsadd , FADD , SINGLE)
|
||||
FP_DOP (fssub , FSUB , SINGLE)
|
||||
FP_DOP (fsmul , FMUL , SINGLE)
|
||||
FP_DOP (fsdiv , FDIV , SINGLE)
|
||||
FP_DOP (fsmin , FMIN , SINGLE)
|
||||
FP_DOP (fsmax , FMAX , SINGLE)
|
||||
FP_DOP (fssgnj , FSGNJ , SINGLE)
|
||||
FP_DOP (fssgnjn, FSGNJN, SINGLE)
|
||||
FP_DOP (fssgnjx, FSGNJX, SINGLE)
|
||||
|
||||
FP_DOP (fdadd , FADD , DOUBLE)
|
||||
FP_DOP (fdsub , FSUB , DOUBLE)
|
||||
FP_DOP (fdmul , FMUL , DOUBLE)
|
||||
FP_DOP (fddiv , FDIV , DOUBLE)
|
||||
FP_DOP (fdmin , FMIN , DOUBLE)
|
||||
FP_DOP (fdmax , FMAX , DOUBLE)
|
||||
FP_DOP (fdsgnj , FSGNJ , DOUBLE)
|
||||
FP_DOP (fdsgnjn, FSGNJN, DOUBLE)
|
||||
FP_DOP (fdsgnjx, FSGNJX, DOUBLE)
|
||||
|
||||
FP_DOP_C (fhcmp , FCMP , HALF)
|
||||
FP_DOP_C (fhcmpf, FCMPF, HALF)
|
||||
FP_DOP_C (fscmp , FCMP , SINGLE)
|
||||
FP_DOP_C (fscmpf, FCMPF, SINGLE)
|
||||
FP_DOP_C (fdcmp , FCMP , DOUBLE)
|
||||
FP_DOP_C (fdcmpf, FCMPF, DOUBLE)
|
||||
|
||||
/* Vectors. */
|
||||
FP_DOP (vfhadd , VFADD , HALF)
|
||||
FP_DOP (vfhsub , VFSUB , HALF)
|
||||
FP_DOP (vfhmul , VFMUL , HALF)
|
||||
FP_DOP (vfhdiv , VFDIV , HALF)
|
||||
FP_DOP (vfhadds, VFADDS, HALF)
|
||||
FP_DOP (vfhsubs, VFSUBS, HALF)
|
||||
FP_DOP (vfhmuls, VFMULS, HALF)
|
||||
FP_DOP (vfhdivs, VFDIVS, HALF)
|
||||
|
||||
FP_DOP (vfhunpkl , VFUNPKL , HALF)
|
||||
FP_DOP (vfhunpkm , VFUNPKM , HALF)
|
||||
FP_DOP (vfhpackl , VFPACKL , HALF)
|
||||
FP_DOP (vfhpackm , VFPACKM , HALF)
|
||||
FP_DOP (vfhbflyl , VFBFLYL , HALF)
|
||||
FP_DOP (vfhbflym , VFBFLYM , HALF)
|
||||
FP_DOP (vfhaddsub, VFADDSUB, HALF)
|
||||
FP_DOP (vfhsubadd, VFSUBADD, HALF)
|
||||
|
||||
FP_DOP (vfsadd , VFADD , SINGLE)
|
||||
FP_DOP (vfssub , VFSUB , SINGLE)
|
||||
FP_DOP (vfsmul , VFMUL , SINGLE)
|
||||
FP_DOP (vfsdiv , VFDIV , SINGLE)
|
||||
FP_DOP (vfsadds, VFADDS, SINGLE)
|
||||
FP_DOP (vfssubs, VFSUBS, SINGLE)
|
||||
FP_DOP (vfsmuls, VFMULS, SINGLE)
|
||||
FP_DOP (vfsdivs, VFDIVS, SINGLE)
|
||||
|
||||
FP_DOP (vfsunpkl , VFUNPKL , SINGLE)
|
||||
FP_DOP (vfsunpkm , VFUNPKM , SINGLE)
|
||||
FP_DOP (vfspackl , VFPACKL , SINGLE)
|
||||
FP_DOP (vfspackm , VFPACKM , SINGLE)
|
||||
FP_DOP (vfsbflyl , VFBFLYL , SINGLE)
|
||||
FP_DOP (vfsbflym , VFBFLYM , SINGLE)
|
||||
FP_DOP (vfsaddsub, VFADDSUB, SINGLE)
|
||||
FP_DOP (vfssubadd, VFSUBADD, SINGLE)
|
||||
|
||||
FP_DOP_D (vfdadd , VFADD , DOUBLE)
|
||||
FP_DOP_D (vfdsub , VFSUB , DOUBLE)
|
||||
FP_DOP_D (vfdmul , VFMUL , DOUBLE)
|
||||
FP_DOP_D (vfddiv , VFDIV , DOUBLE)
|
||||
FP_DOP_D (vfdadds, VFADDS, DOUBLE)
|
||||
FP_DOP_D (vfdsubs, VFSUBS, DOUBLE)
|
||||
FP_DOP_D (vfdmuls, VFMULS, DOUBLE)
|
||||
FP_DOP_D (vfddivs, VFDIVS, DOUBLE)
|
||||
|
||||
FP_DOP_D (vfdunpkl , VFUNPKL , DOUBLE)
|
||||
FP_DOP_D (vfdunpkm , VFUNPKM , DOUBLE)
|
||||
FP_DOP_D (vfdpackl , VFPACKL , DOUBLE)
|
||||
FP_DOP_D (vfdpackm , VFPACKM , DOUBLE)
|
||||
FP_DOP_D (vfdbflyl , VFBFLYL , DOUBLE)
|
||||
FP_DOP_D (vfdbflym , VFBFLYM , DOUBLE)
|
||||
FP_DOP_D (vfdaddsub, VFADDSUB, DOUBLE)
|
||||
FP_DOP_D (vfdsubadd, VFSUBADD, DOUBLE)
|
||||
|
||||
FP_SOP (fhsqrt, FSQRT, HALF)
|
||||
FP_SOP (fssqrt, FSQRT, SINGLE)
|
||||
FP_SOP (fdsqrt, FSQRT, DOUBLE)
|
||||
FP_SOP (vfhsqrt, VFSQRT, HALF)
|
||||
FP_SOP (vfssqrt, VFSQRT, SINGLE)
|
||||
FP_SOP_D (vfdsqrt, VFSQRT,DOUBLE)
|
||||
|
||||
FP_SOP (vfhexch, VFEXCH, HALF)
|
||||
FP_SOP (vfsexch, VFEXCH, SINGLE)
|
||||
FP_SOP_D (vfdexch, VFEXCH, DOUBLE)
|
||||
|
||||
FP_COP (fhmov, FMOV, HALF)
|
||||
FP_COP (fsmov, FMOV, SINGLE)
|
||||
FP_COP (fdmov, FMOV, DOUBLE)
|
||||
FP_COP (vfhmov, VFMOV, HALF)
|
||||
FP_COP (vfsmov, VFMOV, SINGLE)
|
||||
FP_COP (vfdmov, VFMOV, DOUBLE)
|
||||
|
||||
FP_CVI2F (fuint2s, FUINT2S, 0x00)
|
||||
FP_CVI2F (fuint2d, FUINT2D, 0x00)
|
||||
FP_CVI2F (ful2s, FUL2S, 0x00)
|
||||
FP_CVI2F (ful2d, FUL2D, 0x00)
|
||||
|
||||
FP_CVF2I (fs2uint, FS2UINT, 0x01)
|
||||
FP_CVF2I (fs2ul, FS2UL, 0x01)
|
||||
FP_CVF2I (fd2uint, FD2UINT, 0x01)
|
||||
FP_CVF2I (fd2ul, FD2UL, 0x01)
|
||||
|
||||
FP_CVI2F (fint2s, FINT2S, 0x02)
|
||||
FP_CVI2F (fint2d, FINT2D, 0x02)
|
||||
FP_CVI2F (fl2s, FL2S, 0x02)
|
||||
FP_CVI2F (fl2d, FL2D, 0x02)
|
||||
|
||||
FP_CVF2I (fs2int, FS2INT, 0x03)
|
||||
FP_CVF2I (fs2l, FS2L, 0x03)
|
||||
FP_CVF2I (fd2int, FD2INT, 0x03)
|
||||
FP_CVF2I (fd2l, FD2L, 0x03)
|
||||
|
||||
FP_CVF2F (fs2d, FS2D, 0x04)
|
||||
FP_CVF2F (fd2s, FD2S, 0x04)
|
||||
|
||||
FP_RND (fsrnd, FSRND, 0x06)
|
||||
FP_RND (fdrnd, FDRND, 0x06)
|
||||
|
||||
FP_CVF2I (fs2uint_rz, F2UINT_RZ, 0x09)
|
||||
FP_CVF2I (fs2ul_rz, FS2UL_RZ, 0x09)
|
||||
FP_CVF2I (fd2uint_rz, FD2UINT_RZ, 0x09)
|
||||
FP_CVF2I (fd2ul_rz, FD2UL_RZ, 0x09)
|
||||
|
||||
FP_CVF2I (fs2int_rz, FSINT_RZ, 0x0B)
|
||||
FP_CVF2I (fs2l_rz, FS2L_RZ, 0x0B)
|
||||
FP_CVF2I (fd2int_rz, FD2INT_RZ, 0x0B)
|
||||
FP_CVF2I (fd2l_rz, FD2L_RZ, 0x0B)
|
||||
|
||||
FP_RND (fsrnd_rz, FSRND_RZ, 0x0E)
|
||||
FP_RND (fdrnd_rz, FDRND_RZ, 0x0E)
|
||||
|
||||
FMVI2F (fmvi2s, FMVI2S, 0x10)
|
||||
FMVI2F (fmvl2d, FMVL2D, 0x10)
|
||||
|
||||
FMVF2I (fmvs2i, FMVS2I, 0x11)
|
||||
FMVF2I (fmvd2l, FMVD2L, 0x11)
|
||||
|
||||
FP_CVF2F (fs2h, FS2H, 0x14)
|
||||
FP_CVF2F (fh2s, FH2S, 0x15)
|
||||
FP_CVF2F (fs2h_rz, FS2H_RZ, 0x1C)
|
||||
|
||||
FP_LOAD (fld16, 0x02, 0)
|
||||
FP_LOAD (fld32, 0x00, 0)
|
||||
FP_LOAD (fld64, 0x01, 0)
|
||||
FP_LOAD (fldd32, 0x00, 1)
|
||||
FP_LOAD (fldd64, 0x01, 1)
|
||||
|
||||
FP_STORE (fst16, 0x02, 0)
|
||||
FP_STORE (fst32, 0x00, 0)
|
||||
FP_STORE (fst64, 0x01, 0)
|
||||
FP_STORE (fstd32, 0x00, 1)
|
||||
FP_STORE (fstd64, 0x01, 1)
|
||||
|
||||
FP_EXT (vfhext, HALF)
|
||||
FP_EXT (vfsext, SINGLE)
|
||||
FP_EXT (vfdext, DOUBLE)
|
||||
|
||||
FP_INS (vfhins, HALF)
|
||||
FP_INS (vfsins, SINGLE)
|
||||
FP_INS (vfdins, DOUBLE)
|
||||
|
||||
FP_REP (vfhrep, HALF)
|
||||
FP_REP (vfsrep, SINGLE)
|
||||
FP_REP (vfdrep, DOUBLE)
|
||||
|
||||
#undef FLAGS_F
|
||||
#define FLAGS_F { 0 }
|
||||
|
||||
#undef FLAGS_CCF
|
||||
#define FLAGS_CCF { C_CC }
|
||||
|
||||
#undef FIELDF
|
||||
#define FIELDF 0x0
|
||||
|
||||
EXTINSN3OP ("vmin2", ARC_OPCODE_ARC32, MOVE, NONE, F32_GEN4, 0x11)
|
||||
EXTINSN3OP ("vmax2", ARC_OPCODE_ARC32, MOVE, NONE, F32_GEN4, 0x0b)
|
||||
|
||||
#undef HARD_FIELDF
|
||||
#define HARD_FIELDF (0x01 << 15)
|
||||
|
||||
EXTINSN3OP ("vmin2", ARC_OPCODE_ARC64, MOVE, NONE, F32_EXT5, 0x38)
|
||||
EXTINSN3OP ("vmax2", ARC_OPCODE_ARC64, MOVE, NONE, F32_EXT5, 0x39)
|
||||
|
||||
EXTINSN3OP ("vpack4hl", ARC_OPCODE_ARC64, MOVE, NONE, F32_GEN_OP64, 0x30)
|
||||
EXTINSN3OP ("vpack4hm", ARC_OPCODE_ARC64, MOVE, NONE, F32_GEN_OP64, 0x31)
|
||||
EXTINSN3OP ("vpack2wl", ARC_OPCODE_ARC64, MOVE, NONE, F32_GEN_OP64, 0x32)
|
||||
EXTINSN3OP ("vpack2wm", ARC_OPCODE_ARC64, MOVE, NONE, F32_GEN_OP64, 0x33)
|
||||
EXTINSN3OP ("vpack2hm", ARC_OPCODE_ARC32 | ARC_OPCODE_ARC64, MOVE, NONE,
|
||||
F32_EXT5, 0x29)
|
||||
|
||||
#undef HARD_FIELDF
|
||||
#define HARD_FIELDF (0x0)
|
||||
|
||||
OP64INSN3OP ("mpyl", ARC_OPCODE_ARC64, ARITH, NONE, F32_GEN_OP64, 0x30)
|
||||
OP64INSN3OP ("mpyml", ARC_OPCODE_ARC64, ARITH, NONE, F32_GEN_OP64, 0x31)
|
||||
OP64INSN3OP ("mpymul", ARC_OPCODE_ARC64, ARITH, NONE, F32_GEN_OP64, 0x32)
|
||||
OP64INSN3OP ("mpymsul", ARC_OPCODE_ARC64, ARITH, NONE, F32_GEN_OP64, 0x33)
|
||||
|
||||
EXTINSN3OP ("vpack2hl", ARC_OPCODE_ARC32 | ARC_OPCODE_ARC64, MOVE, NONE,
|
||||
F32_EXT5, 0x29)
|
||||
|
||||
{ NULL, 0, 0, 0, 0, 0, { 0 }, { 0 } }
|
||||
};
|
1840
opcodes/arcxx-opc.inc
Normal file
1840
opcodes/arcxx-opc.inc
Normal file
File diff suppressed because it is too large
Load Diff
1
opcodes/configure
vendored
1
opcodes/configure
vendored
@ -12551,6 +12551,7 @@ if test x${all_targets} = xfalse ; then
|
||||
bfd_alpha_arch) ta="$ta alpha-dis.lo alpha-opc.lo" ;;
|
||||
bfd_amdgcn_arch) ;;
|
||||
bfd_arc_arch) ta="$ta arc-dis.lo arc-opc.lo arc-ext.lo" ;;
|
||||
bfd_arc64_arch) ta="$ta arc-dis.lo arc64-opc.lo arc-ext.lo" ;;
|
||||
bfd_arm_arch) ta="$ta arm-dis.lo" ;;
|
||||
bfd_avr_arch) ta="$ta avr-dis.lo" ;;
|
||||
bfd_bfin_arch) ta="$ta bfin-dis.lo" ;;
|
||||
|
@ -268,6 +268,7 @@ if test x${all_targets} = xfalse ; then
|
||||
bfd_alpha_arch) ta="$ta alpha-dis.lo alpha-opc.lo" ;;
|
||||
bfd_amdgcn_arch) ;;
|
||||
bfd_arc_arch) ta="$ta arc-dis.lo arc-opc.lo arc-ext.lo" ;;
|
||||
bfd_arc64_arch) ta="$ta arc-dis.lo arc64-opc.lo arc-ext.lo" ;;
|
||||
bfd_arm_arch) ta="$ta arm-dis.lo" ;;
|
||||
bfd_avr_arch) ta="$ta avr-dis.lo" ;;
|
||||
bfd_bfin_arch) ta="$ta bfin-dis.lo" ;;
|
||||
|
@ -38,6 +38,7 @@
|
||||
#define ARCH_tilegx
|
||||
#endif
|
||||
#define ARCH_arc
|
||||
#define ARCH_arc64
|
||||
#define ARCH_arm
|
||||
#define ARCH_avr
|
||||
#define ARCH_bfin
|
||||
@ -136,6 +137,11 @@ disassembler (enum bfd_architecture a,
|
||||
disassemble = arc_get_disassembler (abfd);
|
||||
break;
|
||||
#endif
|
||||
#ifdef ARCH_arc64
|
||||
case bfd_arch_arc64:
|
||||
disassemble = arc_get_disassembler (abfd);
|
||||
break;
|
||||
#endif
|
||||
#ifdef ARCH_arm
|
||||
case bfd_arch_arm:
|
||||
if (big)
|
||||
|
Loading…
Reference in New Issue
Block a user