/* vax-inst.h - GNU - Part of vax.c
   Copyright 1987, 1992, 1995, 2000 Free Software Foundation, Inc.

   This file is part of GAS, the GNU Assembler.

   GAS is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   GAS is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GAS; see the file COPYING.  If not, write to
   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

/*
 * This is part of vax-ins-parse.c & friends.
 * We want to parse a vax instruction text into a tree defined here.
 */

#define VIT_MAX_OPERANDS (6)	/* maximum number of operands in one       */
/* single vax instruction */

struct vop			/* vax instruction operand                 */
{
  short int vop_ndx;		/* -1, or index register. eg 7=[R7]	   */
  short int vop_reg;		/* -1, or register number. eg @I^#=0xF     */
  /* Helps distinguish "abs" from "abs(PC)".  */
  short int vop_mode;		/* addressing mode 4 bits. eg I^#=0x9	   */
  char vop_short;		/* operand displacement length as written  */
  /* ' '=none, "bilsw"=B^I^L^S^W^.           */
  char vop_access;		/* 'b'branch ' 'no-instruction 'amrvw'norm */
  char vop_width;		/* Operand width, one of "bdfghloqw"	   */
  const char *vop_warn;		/* warning message of this operand, if any */
  const char *vop_error;	/* say if operand is inappropriate         */
  char *vop_expr_begin;		/* Unparsed expression, 1st char ...	   */
  char *vop_expr_end;		/* ... last char.			   */
  unsigned char vop_nbytes;	/* number of bytes in datum		   */
};

typedef long vax_opcodeT;	/* For initialising array of opcodes	   */
/* Some synthetic opcodes > 16 bits!       */

#define VIT_OPCODE_SYNTHETIC 0x80000000	/* Not real hardware instruction.  */
#define VIT_OPCODE_SPECIAL   0x40000000	/* Not normal branch optimising.   */
/* Never set without ..._SYNTHETIC */

#define VAX_WIDTH_UNCONDITIONAL_JUMP '-'	/* These are encoded into         */
#define VAX_WIDTH_CONDITIONAL_JUMP   '?'	/* vop_width when vop_access=='b' */
#define VAX_WIDTH_WORD_JUMP          '!'	/* and VIT_OPCODE_SYNTHETIC set.  */
#define VAX_WIDTH_BYTE_JUMP	     ':'	/*                                */

#define VAX_JMP (0x17)		/* Useful for branch optimising. Jump instr*/
#define VAX_PC_RELATIVE_MODE (0xef)	/* Use it after VAX_JMP		   */
#define VAX_ABSOLUTE_MODE (0x9F)/* Use as @#...			   */
#define VAX_BRB (0x11)		/* Canonical branch.			   */
#define VAX_BRW (0x31)		/* Another canonical branch		   */
#define VAX_WIDEN_WORD (0x20)	/* Add this to byte branch to get word br.  */
#define VAX_WIDEN_LONG (0x6)	/* Add this to byte branch to get long jmp.*/
/* Needs VAX_PC_RELATIVE_MODE byte after it*/

struct vit			/* vax instruction tree                    */
{
  /* vit_opcode is char[] for portability.   */
  char vit_opcode[sizeof (vax_opcodeT)];
  unsigned char vit_opcode_nbytes;	/* How long is _opcode? (chars)	   */
  unsigned char vit_operands;	/*					   */
  struct vop vit_operand[VIT_MAX_OPERANDS];	/* operands             */
  const char *vit_error;	/* "" or error text */
};

/* end of vax-inst.h */
