qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

opcode-cris.h (10037B)


      1 /* cris.h -- Header file for CRIS opcode and register tables.
      2    Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
      3    Contributed by Axis Communications AB, Lund, Sweden.
      4    Originally written for GAS 1.38.1 by Mikael Asker.
      5    Updated, BFDized and GNUified by Hans-Peter Nilsson.
      6 
      7 This file is part of GAS, GDB and the GNU binutils.
      8 
      9 GAS, GDB, and GNU binutils is free software; you can redistribute it
     10 and/or modify it under the terms of the GNU General Public License as
     11 published by the Free Software Foundation; either version 2, or (at your
     12 option) any later version.
     13 
     14 GAS, GDB, and GNU binutils are distributed in the hope that they will be
     15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17 GNU General Public License for more details.
     18 
     19 You should have received a copy of the GNU General Public License
     20 along with this program; if not, see <http://www.gnu.org/licenses/>.  */
     21 
     22 #ifndef TARGET_CRIS_OPCODE_CRIS_H
     23 #define TARGET_CRIS_OPCODE_CRIS_H
     24 
     25 #if !defined(__STDC__) && !defined(const)
     26 #define const
     27 #endif
     28 
     29 
     30 /* Registers.  */
     31 #define MAX_REG (15)
     32 #define CRIS_REG_SP (14)
     33 #define CRIS_REG_PC (15)
     34 
     35 /* CPU version control of disassembly and assembly of instructions.
     36    May affect how the instruction is assembled, at least the size of
     37    immediate operands.  */
     38 enum cris_insn_version_usage
     39 {
     40   /* Any version.  */
     41   cris_ver_version_all=0,
     42 
     43   /* Indeterminate (intended for disassembly only, or obsolete).  */
     44   cris_ver_warning,
     45 
     46   /* Only for v0..3 (Etrax 1..4).  */
     47   cris_ver_v0_3,
     48 
     49   /* Only for v3 or higher (ETRAX 4 and beyond).  */
     50   cris_ver_v3p,
     51 
     52   /* Only for v8 (Etrax 100).  */
     53   cris_ver_v8,
     54 
     55   /* Only for v8 or higher (ETRAX 100, ETRAX 100 LX).  */
     56   cris_ver_v8p,
     57 
     58   /* Only for v0..10.  FIXME: Not sure what to do with this.  */
     59   cris_ver_sim_v0_10,
     60 
     61   /* Only for v0..10.  */
     62   cris_ver_v0_10,
     63 
     64   /* Only for v3..10.  (ETRAX 4, ETRAX 100 and ETRAX 100 LX).  */
     65   cris_ver_v3_10,
     66 
     67   /* Only for v8..10 (ETRAX 100 and ETRAX 100 LX).  */
     68   cris_ver_v8_10,
     69 
     70   /* Only for v10 (ETRAX 100 LX) and same series.  */
     71   cris_ver_v10,
     72 
     73   /* Only for v10 (ETRAX 100 LX) and same series.  */
     74   cris_ver_v10p,
     75 
     76   /* Only for v32 or higher (codename GUINNESS).
     77      Of course some or all these of may change to cris_ver_v32p if/when
     78      there's a new revision. */
     79   cris_ver_v32p
     80 };
     81 
     82 
     83 /* Special registers.  */
     84 struct cris_spec_reg
     85 {
     86   const char *const name;
     87   unsigned int number;
     88 
     89   /* The size of the register.  */
     90   unsigned int reg_size;
     91 
     92   /* What CPU version the special register of that name is implemented
     93      in.  If cris_ver_warning, emit an unimplemented-warning.  */
     94   enum cris_insn_version_usage applicable_version;
     95 
     96   /* There might be a specific warning for using a special register
     97      here.  */
     98   const char *const warning;
     99 };
    100 extern const struct cris_spec_reg cris_spec_regs[];
    101 
    102 
    103 /* Support registers (kind of special too, but not named as such).  */
    104 struct cris_support_reg
    105 {
    106   const char *const name;
    107   unsigned int number;
    108 };
    109 extern const struct cris_support_reg cris_support_regs[];
    110 
    111 /* Opcode-dependent constants.  */
    112 #define AUTOINCR_BIT (0x04)
    113 
    114 /* Prefixes.  */
    115 #define BDAP_QUICK_OPCODE (0x0100)
    116 #define BDAP_QUICK_Z_BITS (0x0e00)
    117 
    118 #define BIAP_OPCODE	  (0x0540)
    119 #define BIAP_Z_BITS	  (0x0a80)
    120 
    121 #define DIP_OPCODE	  (0x0970)
    122 #define DIP_Z_BITS	  (0xf280)
    123 
    124 #define BDAP_INDIR_LOW	  (0x40)
    125 #define BDAP_INDIR_LOW_Z  (0x80)
    126 #define BDAP_INDIR_HIGH	  (0x09)
    127 #define BDAP_INDIR_HIGH_Z (0x02)
    128 
    129 #define BDAP_INDIR_OPCODE (BDAP_INDIR_HIGH * 0x0100 + BDAP_INDIR_LOW)
    130 #define BDAP_INDIR_Z_BITS (BDAP_INDIR_HIGH_Z * 0x100 + BDAP_INDIR_LOW_Z)
    131 #define BDAP_PC_LOW	  (BDAP_INDIR_LOW + CRIS_REG_PC)
    132 #define BDAP_INCR_HIGH	  (BDAP_INDIR_HIGH + AUTOINCR_BIT)
    133 
    134 /* No prefix must have this code for its "match" bits in the
    135    opcode-table.  "BCC .+2" will do nicely.  */
    136 #define NO_CRIS_PREFIX 0
    137 
    138 /* Definitions for condition codes.  */
    139 #define CC_CC  0x0
    140 #define CC_HS  0x0
    141 #define CC_CS  0x1
    142 #define CC_LO  0x1
    143 #define CC_NE  0x2
    144 #define CC_EQ  0x3
    145 #define CC_VC  0x4
    146 #define CC_VS  0x5
    147 #define CC_PL  0x6
    148 #define CC_MI  0x7
    149 #define CC_LS  0x8
    150 #define CC_HI  0x9
    151 #define CC_GE  0xA
    152 #define CC_LT  0xB
    153 #define CC_GT  0xC
    154 #define CC_LE  0xD
    155 #define CC_A   0xE
    156 #define CC_EXT 0xF
    157 
    158 /* A table of strings "cc", "cs"... indexed with condition code
    159    values as above.  */
    160 extern const char *const cris_cc_strings[];
    161 
    162 /* Bcc quick.  */
    163 #define BRANCH_QUICK_LOW  (0)
    164 #define BRANCH_QUICK_HIGH (0)
    165 #define BRANCH_QUICK_OPCODE (BRANCH_QUICK_HIGH * 0x0100 + BRANCH_QUICK_LOW)
    166 #define BRANCH_QUICK_Z_BITS (0x0F00)
    167 
    168 /* BA quick.  */
    169 #define BA_QUICK_HIGH (BRANCH_QUICK_HIGH + CC_A * 0x10)
    170 #define BA_QUICK_OPCODE (BA_QUICK_HIGH * 0x100 + BRANCH_QUICK_LOW)
    171 
    172 /* Bcc [PC+].  */
    173 #define BRANCH_PC_LOW	 (0xFF)
    174 #define BRANCH_INCR_HIGH (0x0D)
    175 #define BA_PC_INCR_OPCODE \
    176  ((BRANCH_INCR_HIGH + CC_A * 0x10) * 0x0100 + BRANCH_PC_LOW)
    177 
    178 /* Jump.  */
    179 /* Note that old versions generated special register 8 (in high bits)
    180    and not-that-old versions recognized it as a jump-instruction.
    181    That opcode now belongs to JUMPU.  */
    182 #define JUMP_INDIR_OPCODE (0x0930)
    183 #define JUMP_INDIR_Z_BITS (0xf2c0)
    184 #define JUMP_PC_INCR_OPCODE \
    185  (JUMP_INDIR_OPCODE + AUTOINCR_BIT * 0x0100 + CRIS_REG_PC)
    186 
    187 #define MOVE_M_TO_PREG_OPCODE 0x0a30
    188 #define MOVE_M_TO_PREG_ZBITS 0x01c0
    189 
    190 /* BDAP.D N,PC.  */
    191 #define MOVE_PC_INCR_OPCODE_PREFIX \
    192  (((BDAP_INCR_HIGH | (CRIS_REG_PC << 4)) << 8) | BDAP_PC_LOW | (2 << 4))
    193 #define MOVE_PC_INCR_OPCODE_SUFFIX \
    194  (MOVE_M_TO_PREG_OPCODE | CRIS_REG_PC | (AUTOINCR_BIT << 8))
    195 
    196 #define JUMP_PC_INCR_OPCODE_V32 (0x0DBF)
    197 
    198 /* BA DWORD (V32).  */
    199 #define BA_DWORD_OPCODE (0x0EBF)
    200 
    201 /* Nop.  */
    202 #define NOP_OPCODE (0x050F)
    203 #define NOP_Z_BITS (0xFFFF ^ NOP_OPCODE)
    204 
    205 #define NOP_OPCODE_V32 (0x05B0)
    206 #define NOP_Z_BITS_V32 (0xFFFF ^ NOP_OPCODE_V32)
    207 
    208 /* For the compatibility mode, let's use "MOVE R0,P0".  Doesn't affect
    209    registers or flags.  Unfortunately shuts off interrupts for one cycle
    210    for < v32, but there doesn't seem to be any alternative without that
    211    effect.  */
    212 #define NOP_OPCODE_COMMON (0x630)
    213 #define NOP_OPCODE_ZBITS_COMMON (0xffff & ~NOP_OPCODE_COMMON)
    214 
    215 /* LAPC.D  */
    216 #define LAPC_DWORD_OPCODE (0x0D7F)
    217 #define LAPC_DWORD_Z_BITS (0x0fff & ~LAPC_DWORD_OPCODE)
    218 
    219 /* Structure of an opcode table entry.  */
    220 enum cris_imm_oprnd_size_type
    221 {
    222   /* No size is applicable.  */
    223   SIZE_NONE,
    224 
    225   /* Always 32 bits.  */
    226   SIZE_FIX_32,
    227 
    228   /* Indicated by size of special register.  */
    229   SIZE_SPEC_REG,
    230 
    231   /* Indicated by size field, signed.  */
    232   SIZE_FIELD_SIGNED,
    233 
    234   /* Indicated by size field, unsigned.  */
    235   SIZE_FIELD_UNSIGNED,
    236 
    237   /* Indicated by size field, no sign implied.  */
    238   SIZE_FIELD
    239 };
    240 
    241 /* For GDB.  FIXME: Is this the best way to handle opcode
    242    interpretation?  */
    243 enum cris_op_type
    244 {
    245   cris_not_implemented_op = 0,
    246   cris_abs_op,
    247   cris_addi_op,
    248   cris_asr_op,
    249   cris_asrq_op,
    250   cris_ax_ei_setf_op,
    251   cris_bdap_prefix,
    252   cris_biap_prefix,
    253   cris_break_op,
    254   cris_btst_nop_op,
    255   cris_clearf_di_op,
    256   cris_dip_prefix,
    257   cris_dstep_logshift_mstep_neg_not_op,
    258   cris_eight_bit_offset_branch_op,
    259   cris_move_mem_to_reg_movem_op,
    260   cris_move_reg_to_mem_movem_op,
    261   cris_move_to_preg_op,
    262   cris_muls_op,
    263   cris_mulu_op,
    264   cris_none_reg_mode_add_sub_cmp_and_or_move_op,
    265   cris_none_reg_mode_clear_test_op,
    266   cris_none_reg_mode_jump_op,
    267   cris_none_reg_mode_move_from_preg_op,
    268   cris_quick_mode_add_sub_op,
    269   cris_quick_mode_and_cmp_move_or_op,
    270   cris_quick_mode_bdap_prefix,
    271   cris_reg_mode_add_sub_cmp_and_or_move_op,
    272   cris_reg_mode_clear_op,
    273   cris_reg_mode_jump_op,
    274   cris_reg_mode_move_from_preg_op,
    275   cris_reg_mode_test_op,
    276   cris_scc_op,
    277   cris_sixteen_bit_offset_branch_op,
    278   cris_three_operand_add_sub_cmp_and_or_op,
    279   cris_three_operand_bound_op,
    280   cris_two_operand_bound_op,
    281   cris_xor_op
    282 };
    283 
    284 struct cris_opcode
    285 {
    286   /* The name of the insn.  */
    287   const char *name;
    288 
    289   /* Bits that must be 1 for a match.  */
    290   unsigned int match;
    291 
    292   /* Bits that must be 0 for a match.  */
    293   unsigned int lose;
    294 
    295   /* See the table in "opcodes/cris-opc.c".  */
    296   const char *args;
    297 
    298   /* Nonzero if this is a delayed branch instruction.  */
    299   char delayed;
    300 
    301   /* Size of immediate operands.  */
    302   enum cris_imm_oprnd_size_type imm_oprnd_size;
    303 
    304   /* Indicates which version this insn was first implemented in.  */
    305   enum cris_insn_version_usage applicable_version;
    306 
    307   /* What kind of operation this is.  */
    308   enum cris_op_type op;
    309 };
    310 extern const struct cris_opcode cris_opcodes[];
    311 
    312 
    313 /* These macros are for the target-specific flags in disassemble_info
    314    used at disassembly.  */
    315 
    316 /* This insn accesses memory.  This flag is more trustworthy than
    317    checking insn_type for "dis_dref" which does not work for
    318    e.g. "JSR [foo]".  */
    319 #define CRIS_DIS_FLAG_MEMREF (1 << 0)
    320 
    321 /* The "target" field holds a register number.  */
    322 #define CRIS_DIS_FLAG_MEM_TARGET_IS_REG (1 << 1)
    323 
    324 /* The "target2" field holds a register number; add it to "target".  */
    325 #define CRIS_DIS_FLAG_MEM_TARGET2_IS_REG (1 << 2)
    326 
    327 /* Yet another add-on: the register in "target2" must be multiplied
    328    by 2 before adding to "target".  */
    329 #define CRIS_DIS_FLAG_MEM_TARGET2_MULT2 (1 << 3)
    330 
    331 /* Yet another add-on: the register in "target2" must be multiplied
    332    by 4 (mutually exclusive with .._MULT2).  */
    333 #define CRIS_DIS_FLAG_MEM_TARGET2_MULT4 (1 << 4)
    334 
    335 /* The register in "target2" is an indirect memory reference (of the
    336    register there), add to "target".  Assumed size is dword (mutually
    337    exclusive with .._MULT[24]).  */
    338 #define CRIS_DIS_FLAG_MEM_TARGET2_MEM (1 << 5)
    339 
    340 /* Add-on to CRIS_DIS_FLAG_MEM_TARGET2_MEM; the memory access is "byte";
    341    sign-extended before adding to "target".  */
    342 #define CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE (1 << 6)
    343 
    344 /* Add-on to CRIS_DIS_FLAG_MEM_TARGET2_MEM; the memory access is "word";
    345    sign-extended before adding to "target".  */
    346 #define CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD (1 << 7)
    347 
    348 #endif /* TARGET_CRIS_OPCODE_CRIS_H */
    349 
    350 /*
    351  * Local variables:
    352  * eval: (c-set-style "gnu")
    353  * indent-tabs-mode: t
    354  * End:
    355  */