Blame include/opcode/d10v.h

Packit bbfece
/* d10v.h -- Header file for D10V opcode table
Packit bbfece
   Copyright (C) 1996-2018 Free Software Foundation, Inc.
Packit bbfece
   Written by Martin Hunt (hunt@cygnus.com), Cygnus Support
Packit bbfece
Packit bbfece
   This file is part of GDB, GAS, and the 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
#ifndef D10V_H
Packit bbfece
#define D10V_H
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C" {
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* Format Specifier */
Packit bbfece
#define FM00	0
Packit bbfece
#define FM01	0x40000000
Packit bbfece
#define FM10	0x80000000
Packit bbfece
#define FM11	0xC0000000
Packit bbfece
Packit bbfece
#define NOP 0x5e00
Packit bbfece
#define OPCODE_DIVS	0x14002800
Packit bbfece
Packit bbfece
/* The opcode table is an array of struct d10v_opcode.  */
Packit bbfece
Packit bbfece
struct d10v_opcode
Packit bbfece
{
Packit bbfece
  /* The opcode name.  */
Packit bbfece
  const char *name;
Packit bbfece
Packit bbfece
  /* the opcode format */
Packit bbfece
  int format;
Packit bbfece
Packit bbfece
  /* These numbers were picked so we can do if( i & SHORT_OPCODE) */
Packit bbfece
#define SHORT_OPCODE 1
Packit bbfece
#define LONG_OPCODE  8
Packit bbfece
#define SHORT_2	     1		/* short with 2 operands */
Packit bbfece
#define SHORT_B	     3		/* short with 8-bit branch */
Packit bbfece
#define LONG_B	     8		/* long with 16-bit branch */
Packit bbfece
#define LONG_L       10		/* long with 3 operands */
Packit bbfece
#define LONG_R       12		/* reserved */
Packit bbfece
Packit bbfece
  /* just a placeholder for variable-length instructions */
Packit bbfece
  /* for example, "bra" will be a fake for "bra.s" and bra.l" */
Packit bbfece
  /* which will immediately follow in the opcode table.  */
Packit bbfece
#define OPCODE_FAKE  32
Packit bbfece
Packit bbfece
  /* the number of cycles */
Packit bbfece
  int cycles;
Packit bbfece
Packit bbfece
  /* the execution unit(s) used */
Packit bbfece
  int unit;
Packit bbfece
#define EITHER	0
Packit bbfece
#define IU	1
Packit bbfece
#define MU	2
Packit bbfece
#define BOTH	3
Packit bbfece
Packit bbfece
  /* execution type; parallel or sequential */
Packit bbfece
  /* this field is used to decide if two instructions */
Packit bbfece
  /* can be executed in parallel */
Packit bbfece
  int exec_type;
Packit bbfece
#define PARONLY 1	/* parallel only */
Packit bbfece
#define SEQ	2	/* must be sequential */
Packit bbfece
#define PAR	4	/* may be parallel */
Packit bbfece
#define BRANCH_LINK 8	/* subroutine call.  must be aligned */
Packit bbfece
#define RMEM     16	/* reads memory */
Packit bbfece
#define WMEM     32	/* writes memory */
Packit bbfece
#define RF0      64	/* reads f0 */
Packit bbfece
#define WF0     128	/* modifies f0 */
Packit bbfece
#define WCAR    256	/* write Carry */
Packit bbfece
#define BRANCH  512	/* branch, no link */
Packit bbfece
#define ALONE  1024	/* short but pack with a NOP if on asm line alone */
Packit bbfece
Packit bbfece
  /* the opcode */
Packit bbfece
  long opcode;
Packit bbfece
Packit bbfece
  /* mask.  if( (i & mask) == opcode ) then match */
Packit bbfece
  long mask;
Packit bbfece
Packit bbfece
  /* An array of operand codes.  Each code is an index into the
Packit bbfece
     operand table.  They appear in the order which the operands must
Packit bbfece
     appear in assembly code, and are terminated by a zero.  */
Packit bbfece
  unsigned char operands[6];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The table itself is sorted by major opcode number, and is otherwise
Packit bbfece
   in the order in which the disassembler should consider
Packit bbfece
   instructions.  */
Packit bbfece
extern const struct d10v_opcode d10v_opcodes[];
Packit bbfece
extern const int d10v_num_opcodes;
Packit bbfece
Packit bbfece
/* The operands table is an array of struct d10v_operand.  */
Packit bbfece
struct d10v_operand
Packit bbfece
{
Packit bbfece
  /* The number of bits in the operand.  */
Packit bbfece
  int bits;
Packit bbfece
Packit bbfece
  /* How far the operand is left shifted in the instruction.  */
Packit bbfece
  int shift;
Packit bbfece
Packit bbfece
  /* One bit syntax flags.  */
Packit bbfece
  int flags;
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Elements in the table are retrieved by indexing with values from
Packit bbfece
   the operands field of the d10v_opcodes table.  */
Packit bbfece
Packit bbfece
extern const struct d10v_operand d10v_operands[];
Packit bbfece
Packit bbfece
/* Values defined for the flags field of a struct d10v_operand.  */
Packit bbfece
Packit bbfece
/* the operand must be an even number */
Packit bbfece
#define OPERAND_EVEN	(1)
Packit bbfece
Packit bbfece
/* the operand must be an odd number */
Packit bbfece
#define OPERAND_ODD	(2)	
Packit bbfece
Packit bbfece
/* this is the destination register; it will be modified */
Packit bbfece
/* this is used by the optimizer */
Packit bbfece
#define OPERAND_DEST	(4)
Packit bbfece
Packit bbfece
/* number or symbol */
Packit bbfece
#define OPERAND_NUM	(8)
Packit bbfece
Packit bbfece
/* address or label */
Packit bbfece
#define OPERAND_ADDR	(0x10)
Packit bbfece
Packit bbfece
/* register */
Packit bbfece
#define OPERAND_REG	(0x20)
Packit bbfece
Packit bbfece
/* postincrement +  */
Packit bbfece
#define OPERAND_PLUS	(0x40)
Packit bbfece
Packit bbfece
/* postdecrement -  */
Packit bbfece
#define OPERAND_MINUS	(0x80)
Packit bbfece
Packit bbfece
/* @  */
Packit bbfece
#define OPERAND_ATSIGN	(0x100)
Packit bbfece
Packit bbfece
/* @(  */
Packit bbfece
#define OPERAND_ATPAR	(0x200)
Packit bbfece
Packit bbfece
/* accumulator 0 */
Packit bbfece
#define OPERAND_ACC0	(0x400)
Packit bbfece
Packit bbfece
/* accumulator 1 */
Packit bbfece
#define OPERAND_ACC1	(0x800)
Packit bbfece
Packit bbfece
/* f0 / f1 flag register */
Packit bbfece
#define OPERAND_FFLAG	(0x1000)
Packit bbfece
Packit bbfece
/* c flag register */
Packit bbfece
#define OPERAND_CFLAG	(0x2000)
Packit bbfece
Packit bbfece
/* control register  */
Packit bbfece
#define OPERAND_CONTROL	(0x4000)
Packit bbfece
Packit bbfece
/* predecrement mode '@-sp'  */
Packit bbfece
#define OPERAND_ATMINUS	(0x8000)
Packit bbfece
Packit bbfece
/* signed number */
Packit bbfece
#define OPERAND_SIGNED	(0x10000)
Packit bbfece
Packit bbfece
/* special accumulator shifts need a 4-bit number */
Packit bbfece
/* 1 <= x <= 16 */
Packit bbfece
#define OPERAND_SHIFT	(0x20000)
Packit bbfece
Packit bbfece
/* general purpose register */
Packit bbfece
#define OPERAND_GPR	(0x40000)
Packit bbfece
Packit bbfece
/* special imm3 values with range restricted to -2 <= imm3 <= 3 */
Packit bbfece
/* needed for rac/rachi */
Packit bbfece
#define RESTRICTED_NUM3	(0x80000)
Packit bbfece
Packit bbfece
/* Pre-decrement is only supported for SP.  */
Packit bbfece
#define OPERAND_SP      (0x100000)
Packit bbfece
Packit bbfece
/* Post-decrement is not supported for SP.  Like OPERAND_EVEN, and
Packit bbfece
   unlike OPERAND_SP, this flag doesn't prevent the instruction from
Packit bbfece
   matching, it only fails validation later on.  */
Packit bbfece
#define OPERAND_NOSP    (0x200000)
Packit bbfece
Packit bbfece
/* Structure to hold information about predefined registers.  */
Packit bbfece
struct pd_reg
Packit bbfece
{
Packit bbfece
  char *name;		/* name to recognize */
Packit bbfece
  char *pname;		/* name to print for this register */
Packit bbfece
  int value;
Packit bbfece
};
Packit bbfece
Packit bbfece
extern const struct pd_reg d10v_predefined_registers[];
Packit bbfece
int d10v_reg_name_cnt (void);
Packit bbfece
Packit bbfece
/* an expressionS only has one register type, so we fake it */
Packit bbfece
/* by setting high bits to indicate type */
Packit bbfece
#define REGISTER_MASK	0xFF
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#endif /* D10V_H */