Blame include/opcode/cr16.h

Packit bbfece
/* cr16.h -- Header file for CR16 opcode and register tables.
Packit bbfece
   Copyright (C) 2007-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by M R Swami Reddy
Packit bbfece
Packit bbfece
   This file is part of GAS, GDB and the GNU binutils.
Packit bbfece
Packit bbfece
   GAS, GDB, and GNU binutils is free software; you can redistribute it
Packit bbfece
   and/or modify it under the terms of the GNU General Public License as
Packit bbfece
   published by the Free Software Foundation; either version 3, or (at your
Packit bbfece
   option) any later version.
Packit bbfece
Packit bbfece
   GAS, GDB, and GNU binutils are distributed in the hope that they will be
Packit bbfece
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   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 program; if not, write to the Free Software Foundation,
Packit bbfece
   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
#ifndef _CR16_H_
Packit bbfece
#define _CR16_H_
Packit bbfece
Packit bbfece
/* CR16 core Registers :
Packit bbfece
   The enums are used as indices to CR16 registers table (cr16_regtab).
Packit bbfece
   Therefore, order MUST be preserved.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
{
Packit bbfece
  /* 16-bit general purpose registers.  */
Packit bbfece
  r0, r1, r2, r3, 
Packit bbfece
  r4, r5, r6, r7, 
Packit bbfece
  r8, r9, r10, r11, 
Packit bbfece
  r12_L = 12, r13_L = 13, ra = 14, sp_L = 15,
Packit bbfece
Packit bbfece
  /* 32-bit general purpose registers.  */
Packit bbfece
  r12 = 12, r13 = 13, r14 = 14, r15 = 15, 
Packit bbfece
  era = 14, sp = 15, RA,
Packit bbfece
Packit bbfece
  /* Not a register.  */
Packit bbfece
  nullregister,
Packit bbfece
  MAX_REG
Packit bbfece
}
Packit bbfece
reg;
Packit bbfece
Packit bbfece
/* CR16 processor registers and special registers :
Packit bbfece
   The enums are used as indices to CR16 processor registers table
Packit bbfece
   (cr16_pregtab). Therefore, order MUST be preserved.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
{
Packit bbfece
  /* processor registers.  */
Packit bbfece
  dbs = MAX_REG, 
Packit bbfece
  dsr, dcrl, dcrh, 
Packit bbfece
  car0l, car0h, car1l, car1h, 
Packit bbfece
  cfg, psr, intbasel, intbaseh, 
Packit bbfece
  ispl, isph, uspl, usph,
Packit bbfece
  dcr =  dcrl, 
Packit bbfece
  car0 = car0l, 
Packit bbfece
  car1 = car1l, 
Packit bbfece
  intbase = intbasel, 
Packit bbfece
  isp =  ispl, 
Packit bbfece
  usp =  uspl,
Packit bbfece
  /* Not a processor register.  */
Packit bbfece
  nullpregister = usph + 1,
Packit bbfece
  MAX_PREG
Packit bbfece
}
Packit bbfece
preg;
Packit bbfece
Packit bbfece
/* CR16 Register types. */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
{
Packit bbfece
  CR16_R_REGTYPE,    /* r<N>      */
Packit bbfece
  CR16_RP_REGTYPE,   /* reg pair  */
Packit bbfece
  CR16_P_REGTYPE     /* Processor register  */
Packit bbfece
}
Packit bbfece
reg_type;
Packit bbfece
Packit bbfece
/* CR16 argument types :
Packit bbfece
   The argument types correspond to instructions operands
Packit bbfece
Packit bbfece
   Argument types :
Packit bbfece
   r - register
Packit bbfece
   rp - register pair
Packit bbfece
   c - constant
Packit bbfece
   i - immediate
Packit bbfece
   idxr - index with register
Packit bbfece
   idxrp - index with register pair
Packit bbfece
   rbase - register base
Packit bbfece
   rpbase - register pair base
Packit bbfece
   pr - processor register.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
{
Packit bbfece
  arg_r,
Packit bbfece
  arg_c,
Packit bbfece
  arg_cr,
Packit bbfece
  arg_crp,
Packit bbfece
  arg_ic,
Packit bbfece
  arg_icr,
Packit bbfece
  arg_idxr,
Packit bbfece
  arg_idxrp,
Packit bbfece
  arg_rbase,
Packit bbfece
  arg_rpbase,
Packit bbfece
  arg_rp,
Packit bbfece
  arg_pr,
Packit bbfece
  arg_prp,
Packit bbfece
  arg_cc,
Packit bbfece
  arg_ra,
Packit bbfece
  /* Not an argument.  */
Packit bbfece
  nullargs
Packit bbfece
}
Packit bbfece
argtype;
Packit bbfece
Packit bbfece
/* CR16 operand types:The operand types correspond to instructions operands.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
{
Packit bbfece
  dummy,
Packit bbfece
  /* N-bit signed immediate.  */
Packit bbfece
  imm3, imm4, imm5, imm6, imm16, imm20, imm32,
Packit bbfece
  /* N-bit unsigned immediate.  */
Packit bbfece
  uimm3, uimm3_1, uimm4, uimm4_1, uimm5, uimm16, uimm20, uimm32,
Packit bbfece
  /* N-bit signed displacement.  */
Packit bbfece
  disps5, disps17, disps25,
Packit bbfece
  /* N-bit unsigned displacement.  */
Packit bbfece
  dispe9,
Packit bbfece
  /* N-bit absolute address.  */
Packit bbfece
  abs20, abs24,
Packit bbfece
  /* Register relative.  */
Packit bbfece
  rra, rbase, rbase_disps20, rbase_dispe20,
Packit bbfece
  /* Register pair relative.  */
Packit bbfece
  rpbase_disps0, rpbase_dispe4, rpbase_disps4, rpbase_disps16,
Packit bbfece
  rpbase_disps20, rpbase_dispe20,
Packit bbfece
  /* Register index.  */
Packit bbfece
  rindex7_abs20, rindex8_abs20,
Packit bbfece
  /* Register pair index.  */
Packit bbfece
  rpindex_disps0, rpindex_disps14, rpindex_disps20,
Packit bbfece
  /* register.  */
Packit bbfece
  regr, 
Packit bbfece
  /* register pair.  */
Packit bbfece
  regp, 
Packit bbfece
  /* processor register.  */
Packit bbfece
  pregr, 
Packit bbfece
  /* processor register 32 bit.  */
Packit bbfece
  pregrp, 
Packit bbfece
  /* condition code - 4 bit.  */
Packit bbfece
  cc, 
Packit bbfece
  /* Not an operand.  */
Packit bbfece
  nulloperand,
Packit bbfece
  /* Maximum supported operand.  */
Packit bbfece
  MAX_OPRD
Packit bbfece
}
Packit bbfece
operand_type;
Packit bbfece
Packit bbfece
/* CR16 instruction types.  */
Packit bbfece
Packit bbfece
#define NO_TYPE_INS       0
Packit bbfece
#define ARITH_INS         1
Packit bbfece
#define LD_STOR_INS       2
Packit bbfece
#define BRANCH_INS        3
Packit bbfece
#define ARITH_BYTE_INS    4
Packit bbfece
#define SHIFT_INS         5
Packit bbfece
#define BRANCH_NEQ_INS    6
Packit bbfece
#define LD_STOR_INS_INC   7
Packit bbfece
#define STOR_IMM_INS      8
Packit bbfece
#define CSTBIT_INS        9
Packit bbfece
Packit bbfece
/* Maximum value supported for instruction types.  */
Packit bbfece
#define CR16_INS_MAX        (1 << 4)
Packit bbfece
/* Mask to record an instruction type.  */
Packit bbfece
#define CR16_INS_MASK       (CR16_INS_MAX - 1)
Packit bbfece
/* Return instruction type, given instruction's attributes.  */
Packit bbfece
#define CR16_INS_TYPE(attr) ((attr) & CR16_INS_MASK)
Packit bbfece
Packit bbfece
/* Indicates whether this instruction has a register list as parameter.  */
Packit bbfece
#define REG_LIST        CR16_INS_MAX
Packit bbfece
Packit bbfece
/* The operands in binary and assembly are placed in reverse order.
Packit bbfece
   load - (REVERSE_MATCH)/store - (! REVERSE_MATCH).  */
Packit bbfece
#define REVERSE_MATCH  (1 << 5)
Packit bbfece
Packit bbfece
/* Printing formats, where the instruction prefix isn't consecutive.  */
Packit bbfece
#define FMT_1          (1 << 9)    /* 0xF0F00000 */
Packit bbfece
#define FMT_2          (1 << 10)   /* 0xFFF0FF00 */
Packit bbfece
#define FMT_3          (1 << 11)   /* 0xFFF00F00 */
Packit bbfece
#define FMT_4          (1 << 12)   /* 0xFFF0F000 */
Packit bbfece
#define FMT_5          (1 << 13)   /* 0xFFF0FFF0 */
Packit bbfece
#define FMT_CR16       (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5)
Packit bbfece
Packit bbfece
/* Indicates whether this instruction can be relaxed.  */
Packit bbfece
#define RELAXABLE      (1 << 14)
Packit bbfece
Packit bbfece
/* Indicates that instruction uses user registers (and not 
Packit bbfece
   general-purpose registers) as operands.  */
Packit bbfece
#define USER_REG       (1 << 15)
Packit bbfece
Packit bbfece
Packit bbfece
/* Instruction shouldn't allow 'sp' usage.  */
Packit bbfece
#define NO_SP          (1 << 17)
Packit bbfece
Packit bbfece
/* Instruction shouldn't allow to push a register which is used as a rptr.  */
Packit bbfece
#define NO_RPTR        (1 << 18)
Packit bbfece
Packit bbfece
/* Maximum operands per instruction.  */
Packit bbfece
#define MAX_OPERANDS     5
Packit bbfece
/* Maximum register name length. */
Packit bbfece
#define MAX_REGNAME_LEN  10
Packit bbfece
/* Maximum instruction length. */
Packit bbfece
#define MAX_INST_LEN     256
Packit bbfece
Packit bbfece
Packit bbfece
/* Values defined for the flags field of a struct operand_entry.  */
Packit bbfece
Packit bbfece
/* Operand must be an unsigned number.  */
Packit bbfece
#define OP_UNSIGNED   (1 << 0)
Packit bbfece
/* Operand must be a signed number.  */
Packit bbfece
#define OP_SIGNED     (1 << 1)
Packit bbfece
/* Operand must be a negative number.  */
Packit bbfece
#define OP_NEG        (1 << 2)
Packit bbfece
/* A special load/stor 4-bit unsigned displacement operand.  */
Packit bbfece
#define OP_DEC        (1 << 3)
Packit bbfece
/* Operand must be an even number.  */
Packit bbfece
#define OP_EVEN       (1 << 4)
Packit bbfece
/* Operand is shifted right.  */
Packit bbfece
#define OP_SHIFT      (1 << 5)
Packit bbfece
/* Operand is shifted right and decremented.  */
Packit bbfece
#define OP_SHIFT_DEC  (1 << 6)
Packit bbfece
/* Operand has reserved escape sequences.  */
Packit bbfece
#define OP_ESC        (1 << 7)
Packit bbfece
/* Operand must be a ABS20 number.  */
Packit bbfece
#define OP_ABS20      (1 << 8)
Packit bbfece
/* Operand must be a ABS24 number.  */
Packit bbfece
#define OP_ABS24      (1 << 9)
Packit bbfece
/* Operand has reserved escape sequences type 1.  */
Packit bbfece
#define OP_ESC1       (1 << 10)
Packit bbfece
Packit bbfece
/* Single operand description.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Operand type.  */
Packit bbfece
  operand_type op_type;
Packit bbfece
  /* Operand location within the opcode.  */
Packit bbfece
  unsigned int shift;
Packit bbfece
}
Packit bbfece
operand_desc;
Packit bbfece
Packit bbfece
/* Instruction data structure used in instruction table.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Name.  */
Packit bbfece
  const char *mnemonic;
Packit bbfece
  /* Size (in words).  */
Packit bbfece
  unsigned int size;
Packit bbfece
  /* Constant prefix (matched by the disassembler).  */
Packit bbfece
  unsigned long match;  /* ie opcode */
Packit bbfece
  /* Match size (in bits).  */
Packit bbfece
  /* MASK: if( (i & match_bits) == match ) then match */
Packit bbfece
  int match_bits;
Packit bbfece
  /* Attributes.  */
Packit bbfece
  unsigned int flags;
Packit bbfece
  /* Operands (always last, so unreferenced operands are initialized).  */
Packit bbfece
  operand_desc operands[MAX_OPERANDS];
Packit bbfece
}
Packit bbfece
inst;
Packit bbfece
Packit bbfece
/* Data structure for a single instruction's arguments (Operands).  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Register or base register.  */
Packit bbfece
  reg r;
Packit bbfece
  /* Register pair register.  */
Packit bbfece
  reg rp;
Packit bbfece
  /* Index register.  */
Packit bbfece
  reg i_r;
Packit bbfece
  /* Processor register.  */
Packit bbfece
  preg pr;
Packit bbfece
  /* Processor register. 32 bit  */
Packit bbfece
  preg prp;
Packit bbfece
  /* Constant/immediate/absolute value.  */
Packit bbfece
  long constant;
Packit bbfece
  /* CC code.  */
Packit bbfece
  unsigned int cc;
Packit bbfece
  /* Scaled index mode.  */
Packit bbfece
  unsigned int scale;
Packit bbfece
  /* Argument type.  */
Packit bbfece
  argtype type;
Packit bbfece
  /* Size of the argument (in bits) required to represent.  */
Packit bbfece
  int size;
Packit bbfece
  /* The type of the expression.  */
Packit bbfece
  unsigned char X_op;
Packit bbfece
}
Packit bbfece
argument;
Packit bbfece
Packit bbfece
/* Internal structure to hold the various entities
Packit bbfece
   corresponding to the current assembling instruction.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Number of arguments.  */
Packit bbfece
  int nargs;
Packit bbfece
  /* The argument data structure for storing args (operands).  */
Packit bbfece
  argument arg[MAX_OPERANDS];
Packit bbfece
/* The following fields are required only by CR16-assembler.  */
Packit bbfece
#ifdef TC_CR16
Packit bbfece
  /* Expression used for setting the fixups (if any).  */
Packit bbfece
  expressionS exp;
Packit bbfece
  bfd_reloc_code_real_type rtype;
Packit bbfece
#endif /* TC_CR16 */
Packit bbfece
  /* Instruction size (in bytes).  */
Packit bbfece
  int size;
Packit bbfece
}
Packit bbfece
ins;
Packit bbfece
Packit bbfece
/* Structure to hold information about predefined operands.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Size (in bits).  */
Packit bbfece
  unsigned int bit_size;
Packit bbfece
  /* Argument type.  */
Packit bbfece
  argtype arg_type;
Packit bbfece
  /* One bit syntax flags.  */
Packit bbfece
  int flags;
Packit bbfece
}
Packit bbfece
operand_entry;
Packit bbfece
Packit bbfece
/* Structure to hold trap handler information.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Trap name.  */
Packit bbfece
  char *name;
Packit bbfece
  /* Index in dispatch table.  */
Packit bbfece
  unsigned int entry;
Packit bbfece
}
Packit bbfece
trap_entry;
Packit bbfece
Packit bbfece
/* Structure to hold information about predefined registers.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* Name (string representation).  */
Packit bbfece
  char *name;
Packit bbfece
  /* Value (enum representation).  */
Packit bbfece
  union
Packit bbfece
  {
Packit bbfece
    /* Register.  */
Packit bbfece
    reg reg_val;
Packit bbfece
    /* processor register.  */
Packit bbfece
    preg preg_val;
Packit bbfece
  } value;
Packit bbfece
  /* Register image.  */
Packit bbfece
  int image;
Packit bbfece
  /* Register type.  */
Packit bbfece
  reg_type type;
Packit bbfece
}
Packit bbfece
reg_entry;
Packit bbfece
Packit bbfece
/* CR16 opcode table.  */
Packit bbfece
extern const inst cr16_instruction[];
Packit bbfece
extern const unsigned int cr16_num_opcodes;
Packit bbfece
#define NUMOPCODES cr16_num_opcodes
Packit bbfece
Packit bbfece
/* CR16 operands table.  */
Packit bbfece
extern const operand_entry cr16_optab[];
Packit bbfece
extern const unsigned int cr16_num_optab;
Packit bbfece
Packit bbfece
/* CR16 registers table.  */
Packit bbfece
extern const reg_entry cr16_regtab[];
Packit bbfece
extern const unsigned int cr16_num_regs;
Packit bbfece
#define NUMREGS cr16_num_regs
Packit bbfece
Packit bbfece
/* CR16 register pair table.  */
Packit bbfece
extern const reg_entry cr16_regptab[];
Packit bbfece
extern const unsigned int cr16_num_regps;
Packit bbfece
#define NUMREGPS cr16_num_regps
Packit bbfece
Packit bbfece
/* CR16 processor registers table.  */
Packit bbfece
extern const reg_entry cr16_pregtab[];
Packit bbfece
extern const unsigned int cr16_num_pregs;
Packit bbfece
#define NUMPREGS cr16_num_pregs
Packit bbfece
Packit bbfece
/* CR16 processor registers - 32 bit table.  */
Packit bbfece
extern const reg_entry cr16_pregptab[];
Packit bbfece
extern const unsigned int cr16_num_pregps;
Packit bbfece
#define NUMPREGPS cr16_num_pregps
Packit bbfece
Packit bbfece
/* CR16 trap/interrupt table.  */
Packit bbfece
extern const trap_entry cr16_traps[];
Packit bbfece
extern const unsigned int cr16_num_traps;
Packit bbfece
#define NUMTRAPS cr16_num_traps
Packit bbfece
Packit bbfece
/* CR16 CC - codes bit table.  */
Packit bbfece
extern const char * cr16_b_cond_tab[];
Packit bbfece
extern const unsigned int cr16_num_cc;
Packit bbfece
#define NUMCC cr16_num_cc;
Packit bbfece
Packit bbfece
Packit bbfece
/* Table of instructions with no operands.  */
Packit bbfece
extern const char * cr16_no_op_insn[];
Packit bbfece
Packit bbfece
/* A macro for representing the instruction "constant" opcode, that is,
Packit bbfece
   the FIXED part of the instruction. The "constant" opcode is represented
Packit bbfece
   as a 32-bit unsigned long, where OPC is expanded (by a left SHIFT)
Packit bbfece
   over that range.  */
Packit bbfece
#define BIN(OPC,SHIFT)        (OPC << SHIFT)
Packit bbfece
Packit bbfece
/* Is the current instruction type is TYPE ?  */
Packit bbfece
#define IS_INSN_TYPE(TYPE)              \
Packit bbfece
  (CR16_INS_TYPE (instruction->flags) == TYPE)
Packit bbfece
Packit bbfece
/* Is the current instruction mnemonic is MNEMONIC ?  */
Packit bbfece
#define IS_INSN_MNEMONIC(MNEMONIC)    \
Packit bbfece
  (strcmp (instruction->mnemonic, MNEMONIC) == 0)
Packit bbfece
Packit bbfece
/* Does the current instruction has register list ?  */
Packit bbfece
#define INST_HAS_REG_LIST              \
Packit bbfece
  (instruction->flags & REG_LIST)
Packit bbfece
Packit bbfece
Packit bbfece
/* Utility macros for string comparison.  */
Packit bbfece
#define streq(a, b)           (strcmp (a, b) == 0)
Packit bbfece
#define strneq(a, b, c)       (strncmp (a, b, c) == 0)
Packit bbfece
Packit bbfece
/* Long long type handling.  */
Packit bbfece
/* Replace all appearances of 'long long int' with LONGLONG.  */
Packit bbfece
typedef long long int LONGLONG;
Packit bbfece
typedef unsigned long long ULONGLONG;
Packit bbfece
Packit bbfece
/* Data types for opcode handling.  */
Packit bbfece
typedef unsigned long dwordU;
Packit bbfece
typedef unsigned short wordU;
Packit bbfece
Packit bbfece
/* Prototypes for function in cr16-dis.c.  */
Packit bbfece
extern void cr16_make_instruction (void);
Packit bbfece
extern int  cr16_match_opcode (void);
Packit bbfece
Packit bbfece
#endif /* _CR16_H_ */