Blame include/opcode/visium.h

Packit bbfece
/* Opcode table header for Visium.
Packit bbfece
Packit bbfece
   Copyright (C) 2003-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This file is part of GDB, GAS, and GNU binutils.
Packit bbfece
Packit bbfece
   GDB, GAS and the GNU binutils are free software; you can redistribute
Packit bbfece
   them and/or modify them under the terms of the GNU General Public
Packit bbfece
   License as published by the Free Software Foundation; either version 3,
Packit bbfece
   or (at your option) any later version.
Packit bbfece
Packit bbfece
   GDB, GAS, and the GNU binutils are distributed in the hope that they
Packit bbfece
   will be useful, but WITHOUT ANY WARRANTY; without even the implied
Packit bbfece
   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
Packit bbfece
   the GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this file; see the file COPYING3.  If not, write to the Free
Packit bbfece
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
Packit bbfece
   MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
enum visium_opcode_arch_val
Packit bbfece
{
Packit bbfece
  VISIUM_OPCODE_ARCH_DEF = 0,
Packit bbfece
  VISIUM_OPCODE_ARCH_GR5,
Packit bbfece
  VISIUM_OPCODE_ARCH_GR6,
Packit bbfece
  VISIUM_OPCODE_ARCH_BAD
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The highest architecture in the table.  */
Packit bbfece
#define VISIUM_OPCODE_ARCH_MAX (VISIUM_OPCODE_ARCH_BAD - 1)
Packit bbfece
Packit bbfece
/* Given an enum visium_opcode_arch_val, return the bitmask to use in
Packit bbfece
   insn encoding/decoding.  */
Packit bbfece
#define VISIUM_OPCODE_ARCH_MASK(arch) (1 << (arch))
Packit bbfece
Packit bbfece
/* Some defines to make life easy.  */
Packit bbfece
#define MASK_DEF VISIUM_OPCODE_ARCH_MASK (VISIUM_OPCODE_ARCH_DEF)
Packit bbfece
#define MASK_GR5 VISIUM_OPCODE_ARCH_MASK (VISIUM_OPCODE_ARCH_GR5)
Packit bbfece
#define MASK_GR6 VISIUM_OPCODE_ARCH_MASK (VISIUM_OPCODE_ARCH_GR6)
Packit bbfece
Packit bbfece
/* Bit masks of architectures supporting the insn.  */
Packit bbfece
#define def (MASK_DEF | MASK_GR5 | MASK_GR6)
Packit bbfece
#define gr5 (MASK_GR5 | MASK_GR6)
Packit bbfece
#define gr6 (MASK_GR6)
Packit bbfece
Packit bbfece
/* The condition code field is not used (zero) for most instructions.
Packit bbfece
   BRR and BRA make normal use of it. Floating point instructions use
Packit bbfece
   it as a sub-opcode.  */
Packit bbfece
#define CC_MASK (0xf << 27)
Packit bbfece
Packit bbfece
/* It seems a shame not to use these bits in a class 0 instruction,
Packit bbfece
   since they could be used to extend the range of the branch.  */
Packit bbfece
#define CLASS0_UNUSED_MASK (0x1f << 16)
Packit bbfece
Packit bbfece
/* For class 1 instructions the following bit is unused.  */
Packit bbfece
#define CLASS1_UNUSED_MASK (1 << 9)
Packit bbfece
Packit bbfece
/* For class 1 instructions this field gives the index for a write
Packit bbfece
   instruction, the specific operation for an EAM instruction, or
Packit bbfece
   the floating point destination register for a floating point
Packit bbfece
   instruction.  */
Packit bbfece
#define CLASS1_INDEX_MASK (0x1f << 10)
Packit bbfece
Packit bbfece
/* For class 3 instructions the following field gives the destination
Packit bbfece
   general register.  */
Packit bbfece
#define CLASS3_DEST_MASK (0x1f << 10)
Packit bbfece
Packit bbfece
/* For class 1 and class 3 instructions the following bit selects an
Packit bbfece
   EAM write/read rather than a memory write/read.  */
Packit bbfece
#define EAM_SELECT_MASK (1 << 15)
Packit bbfece
Packit bbfece
/* Floating point instructions are distinguished from general EAM
Packit bbfece
   instructions by the following bit.  */
Packit bbfece
#define FP_SELECT_MASK (1 << 3)
Packit bbfece
Packit bbfece
/* For both class 1 and class 3 the following fields give, where
Packit bbfece
   appropriate the srcA and srcB registers whether floating point
Packit bbfece
   or general.  */
Packit bbfece
#define SRCA_MASK (0x1f << 16)
Packit bbfece
#define SRCB_MASK (0x1f << 4)
Packit bbfece
Packit bbfece
/* The class 3 interrupt bit. It turns a BRA into a SYS1, and an
Packit bbfece
   RFLAG into a SYS2. This bit should not be set in the user's
Packit bbfece
   class 3 instructions. This bit is also used in class 3
Packit bbfece
   to distinguish between floating point and other EAM operations.
Packit bbfece
   (see FP_SELECT_MASK).  */
Packit bbfece
#define CLASS3_INT (1 << 3)
Packit bbfece
Packit bbfece
/* Class 3 shift instructions use this bit to indicate that the
Packit bbfece
   srcB field is a 5 bit immediate shift count rather than a
Packit bbfece
   register number.  */
Packit bbfece
#define CLASS3_SOURCEB_IMMED (1 << 9)
Packit bbfece
Packit bbfece
#define BMD 0x02630004
Packit bbfece
#define BMI 0x82230004
Packit bbfece
#define DSI 0x82800004
Packit bbfece
#define ENI 0x02a00004
Packit bbfece
#define RFI 0x82fe01d4
Packit bbfece
Packit bbfece
struct reg_entry
Packit bbfece
{
Packit bbfece
  const char *name;
Packit bbfece
  unsigned char code;
Packit bbfece
};
Packit bbfece
Packit bbfece
static const struct reg_entry gen_reg_table[] ATTRIBUTE_UNUSED =
Packit bbfece
{
Packit bbfece
  {"fp", 0x16},
Packit bbfece
  {"r0", 0x0},
Packit bbfece
  {"r1", 0x1},
Packit bbfece
  {"r10", 0xA},
Packit bbfece
  {"r11", 0xB},
Packit bbfece
  {"r12", 0xC},
Packit bbfece
  {"r13", 0xD},
Packit bbfece
  {"r14", 0xE},
Packit bbfece
  {"r15", 0xF},
Packit bbfece
  {"r16", 0x10},
Packit bbfece
  {"r17", 0x11},
Packit bbfece
  {"r18", 0x12},
Packit bbfece
  {"r19", 0x13},
Packit bbfece
  {"r2", 0x2},
Packit bbfece
  {"r20", 0x14},
Packit bbfece
  {"r21", 0x15},
Packit bbfece
  {"r22", 0x16},
Packit bbfece
  {"r23", 0x17},
Packit bbfece
  {"r24", 0x18},
Packit bbfece
  {"r25", 0x19},
Packit bbfece
  {"r26", 0x1a},
Packit bbfece
  {"r27", 0x1b},
Packit bbfece
  {"r28", 0x1c},
Packit bbfece
  {"r29", 0x1d},
Packit bbfece
  {"r3", 0x3},
Packit bbfece
  {"r30", 0x1e},
Packit bbfece
  {"r31", 0x1f},
Packit bbfece
  {"r4", 0x4},
Packit bbfece
  {"r5", 0x5},
Packit bbfece
  {"r6", 0x6},
Packit bbfece
  {"r7", 0x7},
Packit bbfece
  {"r8", 0x8},
Packit bbfece
  {"r9", 0x9},
Packit bbfece
  {"sp", 0x17},
Packit bbfece
};
Packit bbfece
Packit bbfece
static const struct reg_entry fp_reg_table[] ATTRIBUTE_UNUSED =
Packit bbfece
{
Packit bbfece
  {"f0", 0x0},
Packit bbfece
  {"f1", 0x1},
Packit bbfece
  {"f10", 0xa},
Packit bbfece
  {"f11", 0xb},
Packit bbfece
  {"f12", 0xc},
Packit bbfece
  {"f13", 0xd},
Packit bbfece
  {"f14", 0xe},
Packit bbfece
  {"f15", 0xf},
Packit bbfece
  {"f2", 0x2},
Packit bbfece
  {"f3", 0x3},
Packit bbfece
  {"f4", 0x4},
Packit bbfece
  {"f5", 0x5},
Packit bbfece
  {"f6", 0x6},
Packit bbfece
  {"f7", 0x7},
Packit bbfece
  {"f8", 0x8},
Packit bbfece
  {"f9", 0x9},
Packit bbfece
};
Packit bbfece
Packit bbfece
static const struct cc_entry
Packit bbfece
{
Packit bbfece
  const char *name;
Packit bbfece
  int code;
Packit bbfece
} cc_table [] ATTRIBUTE_UNUSED =
Packit bbfece
{
Packit bbfece
  {"cc", 6},
Packit bbfece
  {"cs", 2},
Packit bbfece
  {"eq", 1},
Packit bbfece
  {"fa", 0},
Packit bbfece
  {"ge", 9},
Packit bbfece
  {"gt", 10},
Packit bbfece
  {"hi", 11},
Packit bbfece
  {"le", 12},
Packit bbfece
  {"ls", 13},
Packit bbfece
  {"lt", 14},
Packit bbfece
  {"nc", 8},
Packit bbfece
  {"ne", 5},
Packit bbfece
  {"ns", 4},
Packit bbfece
  {"oc", 7},
Packit bbfece
  {"os", 3},
Packit bbfece
  {"tr", 15},
Packit bbfece
};
Packit bbfece
Packit bbfece
enum addressing_mode
Packit bbfece
{
Packit bbfece
  mode_d,	/* register := */
Packit bbfece
  mode_a,	/* op= register */
Packit bbfece
  mode_da,	/* register := register */
Packit bbfece
  mode_ab,	/* register * register */
Packit bbfece
  mode_dab,	/* register := register * register */
Packit bbfece
  mode_iab,	/* 5-bit immediate * register * register */
Packit bbfece
  mode_0ab,	/* zero * register * register */
Packit bbfece
  mode_da0,	/* register := register * zero */
Packit bbfece
  mode_cad,	/* condition * register * register */
Packit bbfece
  mode_das,	/* register := register * 5-bit immed/register shift count */
Packit bbfece
  mode_di,	/* register := 5-bit immediate */
Packit bbfece
  mode_ir,	/* 5-bit immediate * register */
Packit bbfece
  mode_ai,	/* register 16-bit unsigned immediate */
Packit bbfece
  mode_i,	/* 16-bit unsigned immediate */
Packit bbfece
  mode_bax,	/* register * register * 5-bit immediate */
Packit bbfece
  mode_dax,	/* register := register * 5-bit immediate */
Packit bbfece
  mode_s,	/* special mode */
Packit bbfece
  mode_sr,	/* special mode with register */
Packit bbfece
  mode_ci,	/* condition * 16-bit signed word displacement */
Packit bbfece
  mode_fdab,	/* float := float * float */
Packit bbfece
  mode_ifdab,	/* fpinst: 4-bit immediate * float * float * float */
Packit bbfece
  mode_idfab,	/* fpuread: 4-bit immediate * register * float * float */
Packit bbfece
  mode_fda,	/* float := float */
Packit bbfece
  mode_fdra,	/* float := register */
Packit bbfece
  mode_rdfab,	/* register := float * float */
Packit bbfece
  mode_rdfa,	/* register := float */
Packit bbfece
  mode_rrr,	/* 3 register sources and destinations (block move) */
Packit bbfece
};
Packit bbfece
Packit bbfece
#define class0 (0<<25)
Packit bbfece
#define class1 (1<<25)
Packit bbfece
#define class2 (2<<25)
Packit bbfece
#define class3 (3<<25)
Packit bbfece
Packit bbfece
static const struct opcode_entry
Packit bbfece
{
Packit bbfece
  const char *mnem;
Packit bbfece
  enum addressing_mode mode;
Packit bbfece
  unsigned code;
Packit bbfece
  char flags;
Packit bbfece
}
Packit bbfece
opcode_table[] ATTRIBUTE_UNUSED =
Packit bbfece
{
Packit bbfece
  { "adc.b",    mode_dab,  class3|(1<<21)|(1), def },
Packit bbfece
  { "adc.l",    mode_dab,  class3|(1<<21)|(4), def },
Packit bbfece
  { "adc.w",    mode_dab,  class3|(1<<21)|(2), def },
Packit bbfece
  { "add.b",    mode_dab,  class3|(0<<21)|(1), def },
Packit bbfece
  { "add.l",    mode_dab,  class3|(0<<21)|(4), def },
Packit bbfece
  { "add.w",    mode_dab,  class3|(0<<21)|(2), def },
Packit bbfece
  { "addi",     mode_ai,   class2, def },
Packit bbfece
  { "and.b",    mode_dab,  class3|(10<<21)|(1), def},
Packit bbfece
  { "and.l",    mode_dab,  class3|(10<<21)|(4), def },
Packit bbfece
  { "and.w",    mode_dab,  class3|(10<<21)|(2), def },
Packit bbfece
  { "asl.b",    mode_das,  class3|(7<<21)|(1), def },
Packit bbfece
  { "asl.l",    mode_das,  class3|(7<<21)|(4), def },
Packit bbfece
  { "asl.w",    mode_das,  class3|(7<<21)|(2), def },
Packit bbfece
  { "asld",     mode_a,    class1|(15<<21)|(1<<15)|(11<<10)|(4), def },
Packit bbfece
  { "asr.b",    mode_das,  class3|(5<<21)|(1), def },
Packit bbfece
  { "asr.l",    mode_das,  class3|(5<<21)|(4), def },
Packit bbfece
  { "asr.w",    mode_das,  class3|(5<<21)|(2), def },
Packit bbfece
  { "asrd",     mode_a,    class1|(15<<21)|(1<<15)|(9<<10)|(4), def },
Packit bbfece
  { "bmd",      mode_rrr,  class1|(3<<21)|(3<<16)|(4), gr6 },
Packit bbfece
  { "bmi",      mode_rrr,  class1|(1<<21)|(3<<16)|(4), gr6 },
Packit bbfece
  { "bra",      mode_cad,  class3|(12<<21)|(4), def },
Packit bbfece
  { "brr",      mode_ci,   class0, def },
Packit bbfece
  { "cmp.b",    mode_0ab,  class3|(2<<21)|(1), def },
Packit bbfece
  { "cmp.l",    mode_0ab,  class3|(2<<21)|(4), def },
Packit bbfece
  { "cmp.w",    mode_0ab,  class3|(2<<21)|(2), def },
Packit bbfece
  { "cmpc.b",   mode_0ab,  class3|(3<<21)|(1), def },
Packit bbfece
  { "cmpc.l",   mode_0ab,  class3|(3<<21)|(4), def },
Packit bbfece
  { "cmpc.w",   mode_0ab,  class3|(3<<21)|(2), def },
Packit bbfece
  { "divds",    mode_a,    class1|(15<<21)|(1<<15)|(6<<10)|(4), def },
Packit bbfece
  { "divdu",    mode_a,    class1|(15<<21)|(1<<15)|(7<<10)|(4), def },
Packit bbfece
  { "divs",     mode_a,    class1|(15<<21)|(1<<15)|(2<<10)|(4), def },
Packit bbfece
  { "divu",     mode_a,    class1|(15<<21)|(1<<15)|(3<<10)|(4), def },
Packit bbfece
  { "dsi",      mode_s,    class1|(4<<21)|(4), def },
Packit bbfece
  { "eamread",  mode_di,   class3|(15<<21)|(1<<15)|(1<<9)|(4), def },
Packit bbfece
  { "eamwrite", mode_iab,  class1|(15<<21)|(1<<15)|(4), def },
Packit bbfece
  { "eni",      mode_s,    class1|(5<<21)|(4), def },
Packit bbfece
  { "extb.b",   mode_da,   class3|(14<<21)|(1), def },
Packit bbfece
  { "extb.l",   mode_da,   class3|(14<<21)|(4), def },
Packit bbfece
  { "extb.w",   mode_da,   class3|(14<<21)|(2), def },
Packit bbfece
  { "extw.l",   mode_da,   class3|(4<<21)|(4), def },
Packit bbfece
  { "extw.w",   mode_da,   class3|(4<<21)|(2), def },
Packit bbfece
  { "fabs",     mode_fda,  class1|(7<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fadd",     mode_fdab, class1|(1<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fcmp",     mode_rdfab,class3|(10<<27)|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fcmpe",    mode_rdfab,class3|(11<<27)|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fdiv",     mode_fdab, class1|(4<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fload",    mode_fdra, class1|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fmove",    mode_fda,  class1|(12<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5},
Packit bbfece
  { "fmult",    mode_fdab, class1|(3<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fneg",     mode_fda,  class1|(6<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fpinst",   mode_ifdab,class1|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fpuread",  mode_idfab,class3|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fsqrt",    mode_fda,  class1|(5<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fstore",   mode_rdfa, class3|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 },
Packit bbfece
  { "fsub",     mode_fdab, class1|(2<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "ftoi",     mode_fda,  class1|(8<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "itof",     mode_fda,  class1|(9<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 },
Packit bbfece
  { "lsr.b",    mode_das,  class3|(6<<21)|(1), def },
Packit bbfece
  { "lsr.l",    mode_das,  class3|(6<<21)|(4), def },
Packit bbfece
  { "lsr.w",    mode_das,  class3|(6<<21)|(2), def },
Packit bbfece
  { "lsrd",     mode_a,    class1|(15<<21)|(1<<15)|(10<<10)|(4), def },
Packit bbfece
  { "move.b",   mode_da0,  class3|(9<<21)|(1), def },
Packit bbfece
  { "move.l",   mode_da0,  class3|(9<<21)|(4), def },
Packit bbfece
  { "move.w",   mode_da0,  class3|(9<<21)|(2), def },
Packit bbfece
  { "movil",    mode_ai,   class2|(4<<21), def },
Packit bbfece
  { "moviq",    mode_ai,   class2|(6<<21), def },
Packit bbfece
  { "moviu",    mode_ai,   class2|(5<<21), def },
Packit bbfece
  { "mults",    mode_ab,   class1|(15<<21)|(1<<15)|(0<<10)|(4), def },
Packit bbfece
  { "multu",    mode_ab,   class1|(15<<21)|(1<<15)|(1<<10)|(4), def },
Packit bbfece
  { "nop",      mode_s,    class0, def },
Packit bbfece
  { "not.b",    mode_da,   class3|(11<<21)|(1), def },
Packit bbfece
  { "not.l",    mode_da,   class3|(11<<21)|(4), def },
Packit bbfece
  { "not.w",    mode_da,   class3|(11<<21)|(2), def },
Packit bbfece
  { "or.b",     mode_dab,  class3|(9<<21)|(1), def },
Packit bbfece
  { "or.l",     mode_dab,  class3|(9<<21)|(4), def },
Packit bbfece
  { "or.w",     mode_dab,  class3|(9<<21)|(2), def },
Packit bbfece
  { "read.b",   mode_dax,  class3|(15<<21)|(1<<9)|(1), def },
Packit bbfece
  { "read.l",   mode_dax,  class3|(15<<21)|(1<<9)|(4), def },
Packit bbfece
  { "read.w",   mode_dax,  class3|(15<<21)|(1<<9)|(2), def },
Packit bbfece
  { "readmda",  mode_d,    class3|(15<<21)|(1<<15)|(1<<9)|(4), def },
Packit bbfece
  { "readmdb",  mode_d,    class3|(15<<21)|(1<<15)|(1<<9)|(1<<4)|(4), def },
Packit bbfece
  { "readmdc",  mode_d,    class3|(15<<21)|(1<<15)|(1<<9)|(2<<4)|(4), def },
Packit bbfece
  { "rfi",      mode_s,    class1|(7<<21)|(30<<16)|(29<<4)|(4), def },
Packit bbfece
  { "rflag",    mode_d,    class3|(13<<21)|(4), def },
Packit bbfece
  { "stop",     mode_ir,   class1|(0<<21)|(4), def },
Packit bbfece
  { "sub.b",    mode_dab,  class3|(2<<21)|(1), def },
Packit bbfece
  { "sub.l",    mode_dab,  class3|(2<<21)|(4), def },
Packit bbfece
  { "sub.w",    mode_dab,  class3|(2<<21)|(2), def },
Packit bbfece
  { "subc.b",   mode_dab,  class3|(3<<21)|(1), def },
Packit bbfece
  { "subc.l",   mode_dab,  class3|(3<<21)|(4), def },
Packit bbfece
  { "subc.w",   mode_dab,  class3|(3<<21)|(2), def },
Packit bbfece
  { "subi",     mode_ai,   class2|(2<<21), def },
Packit bbfece
  { "trace",    mode_ir,   class1|(13<<21), def },
Packit bbfece
  { "write.b",  mode_bax,  class1|(15<<21)|(1), def },
Packit bbfece
  { "write.l",  mode_bax,  class1|(15<<21)|(4), def },
Packit bbfece
  { "write.w",  mode_bax,  class1|(15<<21)|(2), def },
Packit bbfece
  { "writemd",  mode_ab,   class1|(15<<21)|(1<<15)|(4<<10)|(4), def },
Packit bbfece
  { "writemdc", mode_a,    class1|(15<<21)|(1<<15)|(5<<10)|(4), def },
Packit bbfece
  { "wrtl",     mode_i,    class2|(8<<21), gr6 },
Packit bbfece
  { "wrtu",     mode_i,    class2|(9<<21), gr6 },
Packit bbfece
  { "xor.b",    mode_dab,  class3|(8<<21)|(1), def },
Packit bbfece
  { "xor.l",    mode_dab,  class3|(8<<21)|(4), def },
Packit bbfece
  { "xor.w",    mode_dab,  class3|(8<<21)|(2), def },
Packit bbfece
};
Packit bbfece