/*
 * (c) copyright 1990 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
#define RCSID1 "$Id$"

/*
 * VAX-11 Machine dependent C declarations
 */

/* Addressing modes */

#define REG_MODE	 5
#define REGDEF_MODE	 6
#define AI_MODE		 8
#define AI_DEF_MODE	 9
#define AD_MODE		 7
#define DISPLB_MODE	10
#define DISPLW_MODE	12
#define DISPLL_MODE	14
#define DISPLB_DEF_MODE	11
#define DISPLW_DEF_MODE	13
#define DISPLL_DEF_MODE	15
#define INDEX_MODE	 4

#define DISPL		16	/* not an addressing mode; used for branch
				   displacement addressing
				*/
#define ABS		17	/* absolute mode (only for internal use) */
#define IMM		18	/* immediate mode (only for internal use) */
#define REL		19	/* relative mode (only for internal use) */
#define REL_DEF		20	/* relative deferred mode (only for internal
				   use)
				*/

/* Some mnemonics used in mach5.c */

#define PC		15	/* program counter */
#define BRB		0x11	/* opcode of branch with byte offset */
#define BRW		0x31	/* opcode of branch with word offset */
#define JMP		0x17	/* opcode of jmp instruction */

/* Test if a constant is suitable for literal mode */

#define literal(z)	(((z) & ~(int)0x3f) == 0)

/* Declarations for operands */

struct operand {
	expr_t	exp;
	int	mode;		/* addressing mode */
	int	reg;		/* register used in addressing mode */
	int	relo;		/* index in relocation table for exp */
	int	size;		/* size as imposed by instruction
				   -1 indicates bit-field (no immediate mode
				      allowed)
				   -2 indicates address (no register mode
				      or immediate mode allowed)
				*/
	int	index_reg;	/* for indexed mode contains index reg,
				   -1 if not index mode
				*/
};

extern struct operand opnd[6];	/* maximum number of operands of a VAX
				   instruction is 6
				*/
extern int op_ind;		/* index in opng array */

/* VAX4 Specific instructions */
void branch(int opc, expr_t exp);
void ext_branch(int opc, expr_t exp);
void operands(void);