Blame include/opcode/crx.h

Packit bbfece
/* crx.h -- Header file for CRX opcode and register tables.
Packit bbfece
   Copyright (C) 2004-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by Tomer Levi, NSC, Israel.
Packit bbfece
   Originally written for GAS 2.12 by Tomer Levi, NSC, Israel.
Packit bbfece
   Updates, BFDizing, GNUifying and ELF support by Tomer Levi.
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
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit bbfece
   MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
#ifndef _CRX_H_
Packit bbfece
#define _CRX_H_
Packit bbfece
Packit bbfece
/* CRX core/debug Registers :
Packit bbfece
   The enums are used as indices to CRX registers table (crx_regtab).
Packit bbfece
   Therefore, order MUST be preserved.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
  {
Packit bbfece
    /* 32-bit general purpose registers.  */
Packit bbfece
    r0, r1, r2, r3, r4, r5, r6, r7, r8, r9,
Packit bbfece
    r10, r11, r12, r13, r14, r15, ra, sp,
Packit bbfece
    /* 32-bit user registers.  */
Packit bbfece
    u0, u1, u2, u3, u4, u5, u6, u7, u8, u9,
Packit bbfece
    u10, u11, u12, u13, u14, u15, ura, usp,
Packit bbfece
    /* hi and lo registers.  */
Packit bbfece
    hi, lo,
Packit bbfece
    /* hi and lo user registers.  */
Packit bbfece
    uhi, ulo,
Packit bbfece
    /* Processor Status Register.  */
Packit bbfece
    psr,
Packit bbfece
    /* Interrupt Base Register.  */
Packit bbfece
    intbase,
Packit bbfece
    /* Interrupt Stack Pointer Register.  */
Packit bbfece
    isp,
Packit bbfece
    /* Configuration Register.  */
Packit bbfece
    cfg,
Packit bbfece
    /* Coprocessor Configuration Register.  */
Packit bbfece
    cpcfg,
Packit bbfece
    /* Coprocessor Enable Register.  */
Packit bbfece
    cen,
Packit bbfece
    /* Not a register.  */
Packit bbfece
    nullregister,
Packit bbfece
    MAX_REG
Packit bbfece
  }
Packit bbfece
reg;
Packit bbfece
Packit bbfece
/* CRX Coprocessor registers and special registers :
Packit bbfece
   The enums are used as indices to CRX coprocessor registers table
Packit bbfece
   (crx_copregtab). Therefore, order MUST be preserved.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
  {
Packit bbfece
    /* Coprocessor registers.  */
Packit bbfece
    c0 = MAX_REG, c1, c2, c3, c4, c5, c6, c7, c8,
Packit bbfece
    c9, c10, c11, c12, c13, c14, c15,
Packit bbfece
    /* Coprocessor special registers.  */
Packit bbfece
    cs0, cs1 ,cs2, cs3, cs4, cs5, cs6, cs7, cs8,
Packit bbfece
    cs9, cs10, cs11, cs12, cs13, cs14, cs15,
Packit bbfece
    /* Not a Coprocessor register.  */
Packit bbfece
    nullcopregister,
Packit bbfece
    MAX_COPREG
Packit bbfece
  }
Packit bbfece
copreg;
Packit bbfece
Packit bbfece
/* CRX Register types. */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
  {
Packit bbfece
    CRX_R_REGTYPE,    /*  r<N>	  */
Packit bbfece
    CRX_U_REGTYPE,    /*  u<N>	  */
Packit bbfece
    CRX_C_REGTYPE,    /*  c<N>	  */
Packit bbfece
    CRX_CS_REGTYPE,   /*  cs<N>	  */
Packit bbfece
    CRX_CFG_REGTYPE   /*  configuration register   */
Packit bbfece
  }
Packit bbfece
reg_type;
Packit bbfece
Packit bbfece
/* CRX argument types :
Packit bbfece
   The argument types correspond to instructions operands
Packit bbfece
Packit bbfece
   Argument types :
Packit bbfece
   r - register
Packit bbfece
   c - constant
Packit bbfece
   i - immediate
Packit bbfece
   idxr - index register
Packit bbfece
   rbase - register base
Packit bbfece
   s - star ('*')
Packit bbfece
   copr - coprocessor register
Packit bbfece
   copsr - coprocessor special register.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
  {
Packit bbfece
    arg_r, arg_c, arg_cr, arg_ic, arg_icr, arg_sc,
Packit bbfece
    arg_idxr, arg_rbase, arg_copr, arg_copsr,
Packit bbfece
    /* Not an argument.  */
Packit bbfece
    nullargs
Packit bbfece
  }
Packit bbfece
argtype;
Packit bbfece
Packit bbfece
/* CRX operand types :
Packit bbfece
   The operand types correspond to instructions operands.  */
Packit bbfece
Packit bbfece
typedef enum
Packit bbfece
  {
Packit bbfece
    dummy,
Packit bbfece
    /* 4-bit encoded constant.  */
Packit bbfece
    cst4,
Packit bbfece
    /* N-bit immediate.  */
Packit bbfece
    i16, i32,
Packit bbfece
    /* N-bit unsigned immediate.  */
Packit bbfece
    ui3, ui4, ui5, ui16,
Packit bbfece
    /* N-bit signed displacement.  */
Packit bbfece
    disps9, disps17, disps25, disps32,
Packit bbfece
    /* N-bit unsigned displacement.  */
Packit bbfece
    dispu5, 
Packit bbfece
    /* N-bit escaped displacement.  */
Packit bbfece
    dispe9,
Packit bbfece
    /* N-bit absolute address.  */
Packit bbfece
    abs16, abs32,
Packit bbfece
    /* Register relative.  */
Packit bbfece
    rbase, rbase_dispu4,
Packit bbfece
    rbase_disps12, rbase_disps16, rbase_disps28, rbase_disps32,
Packit bbfece
    /* Register index.  */
Packit bbfece
    rindex_disps6, rindex_disps22,
Packit bbfece
    /* 4-bit genaral-purpose register specifier.  */
Packit bbfece
    regr, 
Packit bbfece
    /* 8-bit register address space.  */
Packit bbfece
    regr8,
Packit bbfece
    /* coprocessor register.  */
Packit bbfece
    copregr, 
Packit bbfece
    /* coprocessor special register.  */
Packit bbfece
    copsregr,
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
/* CRX 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 CMPBR_INS         5
Packit bbfece
#define SHIFT_INS         6
Packit bbfece
#define BRANCH_NEQ_INS    7
Packit bbfece
#define LD_STOR_INS_INC   8
Packit bbfece
#define STOR_IMM_INS	  9
Packit bbfece
#define CSTBIT_INS       10
Packit bbfece
#define COP_BRANCH_INS   11
Packit bbfece
#define COP_REG_INS      12
Packit bbfece
#define COPS_REG_INS     13
Packit bbfece
#define DCR_BRANCH_INS   14
Packit bbfece
Packit bbfece
/* Maximum value supported for instruction types.  */
Packit bbfece
#define CRX_INS_MAX	(1 << 4)
Packit bbfece
/* Mask to record an instruction type.  */
Packit bbfece
#define CRX_INS_MASK	(CRX_INS_MAX - 1)
Packit bbfece
/* Return instruction type, given instruction's attributes.  */
Packit bbfece
#define CRX_INS_TYPE(attr) ((attr) & CRX_INS_MASK)
Packit bbfece
Packit bbfece
/* Indicates whether this instruction has a register list as parameter.  */
Packit bbfece
#define REG_LIST	CRX_INS_MAX
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
/* Kind of displacement map used DISPU[BWD]4.  */
Packit bbfece
#define DISPUB4	       (1 << 6)
Packit bbfece
#define DISPUW4	       (1 << 7)
Packit bbfece
#define DISPUD4	       (1 << 8)
Packit bbfece
#define DISPU4MAP      (DISPUB4 | DISPUW4 | DISPUD4)
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_CRX	       (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
/* Indicates that instruction can perfom a cst4 mapping.  */
Packit bbfece
#define CST4MAP	       (1 << 16)
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
/* A special arithmetic 4-bit constant operand.  */
Packit bbfece
#define OP_CST4	      (1 << 2)
Packit bbfece
/* A special load/stor 4-bit unsigned displacement operand.  */
Packit bbfece
#define OP_DISPU4     (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 is used only for the upper 64 KB (FFFF0000 to FFFFFFFF).  */
Packit bbfece
#define OP_UPPER_64KB (1 << 8)
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;
Packit bbfece
    /* Match size (in bits).  */
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
    /* Index register.  */
Packit bbfece
    reg i_r;
Packit bbfece
    /* Coprocessor register.  */
Packit bbfece
    copreg cr;
Packit bbfece
    /* Constant/immediate/absolute value.  */
Packit bbfece
    long constant;
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 CRX-assembler.  */
Packit bbfece
#ifdef TC_CRX
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_CRX */
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
      /* Coprocessor register.  */
Packit bbfece
      copreg copreg_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
/* Structure to hold a cst4 operand mapping.  */
Packit bbfece
Packit bbfece
/* CRX opcode table.  */
Packit bbfece
extern const inst crx_instruction[];
Packit bbfece
extern const int crx_num_opcodes;
Packit bbfece
#define NUMOPCODES crx_num_opcodes
Packit bbfece
Packit bbfece
/* CRX operands table.  */
Packit bbfece
extern const operand_entry crx_optab[];
Packit bbfece
Packit bbfece
/* CRX registers table.  */
Packit bbfece
extern const reg_entry crx_regtab[];
Packit bbfece
extern const int crx_num_regs;
Packit bbfece
#define NUMREGS crx_num_regs
Packit bbfece
Packit bbfece
/* CRX coprocessor registers table.  */
Packit bbfece
extern const reg_entry crx_copregtab[];
Packit bbfece
extern const int crx_num_copregs;
Packit bbfece
#define NUMCOPREGS crx_num_copregs
Packit bbfece
Packit bbfece
/* CRX trap/interrupt table.  */
Packit bbfece
extern const trap_entry crx_traps[];
Packit bbfece
extern const int crx_num_traps;
Packit bbfece
#define NUMTRAPS crx_num_traps
Packit bbfece
Packit bbfece
/* cst4 operand mapping.  */
Packit bbfece
extern const int crx_cst4_map[];
Packit bbfece
extern const int crx_cst4_maps;
Packit bbfece
Packit bbfece
/* Table of instructions with no operands.  */
Packit bbfece
extern const char* crx_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
  (CRX_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
/* 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
#endif /* _CRX_H_ */