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