/*	@(#)defs	1.4	*/

/*	machine dependent include file for the CLIPPER series */

#define	CLIPPER
/*
** Enable optimizer features
*/

#define	MAXOPS 3
/* maximum number of operands per instruction */

#define	NUMLBLS	((640*5)+1)
/* 3201 labels */

#define	PEEPHOLE 1
/* invoke peephole optimizing hooks */

#define LIVEDEAD 32
/* perform live/dead register analysis using 32 bits */

#define	USERDATA 1
/* add declaration "USERTYPE userdata;" to node struct*/

struct	instruc
{
	char		*instr;		/* instruction name */
	char		code;		/* operation code */
	char		nargs;		/* number of arguments */
	unsigned char	args[MAXOPS];	/* operand information */
};

typedef	struct	instruc	*USERTYPE;

/*
** Fields and values for the args[] members of the instruc structure
*/
#define	ACC	0x07	/* Access mode of operand */
#define	AA	0x01	/* Address of it */
#define	AB	0x02	/* Branch displacement of it */
#define	AI	0x03	/* Immediate value of it */
#define	AM	0x04	/* Modify it (read then optional write) */
#define	AR	0x05	/* Read it */
#define	AW	0x06	/* Write it */

#define	TYP	0x70	/* Type of operand (size) */
#define	TB	0x10	/* Byte */
#define	TW	0x20	/* Word */
#define	TL	0x30	/* Long */
#define	TQ	0x40	/* Quad */
#define	TF	0x50	/* Float */
#define	TD	0x60	/* Double */

#define	optyp(x) ((x)&TYP)
#define	opacc(x) ((x)&ACC)

/*
** Significant node types
*/
#define MAJ	0xF0
#define BRA	0x10
#define ARITH	0x20
#define MOV	0x30
#define	SDB	0x40

#define	LABEL	3
#define	OTHER	4
#define	CALL	5	/* function call */
#define	HLABEL	6	/* non-removable label (and block) */
/* branches */
#define	RET	BRA	/* generic return */
#define CASE	BRA+1
#define	JBR	BRA+2	/* shortenable goto */
#define	JEQ	BRA+3	/* conditional branches */
#define	JNE	BRA+4
#define	JLE	BRA+5
#define	JGE	BRA+6
#define	JLT	BRA+7
#define	JGT	BRA+8
#define	JLEU	BRA+9
#define	JGEU	BRA+10
#define	JLTU	BRA+11
#define	JGTU	BRA+12
#define	HBRAN	BRA+13	/* other branches */
/* arithmetic */
#define	ADD	ARITH
#define	MUL	ARITH+1
#define AND	ARITH+2
#define	XOR	ARITH+3
#define IOR	ARITH+4
#define	DIV	ARITH+5
#define MOD	ARITH+6
#define	SUB	ARITH+7
#define	ASH	ARITH+8
#define	LSH	ARITH+9
#define	NEG	ARITH+10
#define	CMP	ARITH+11
#define	NOT	ARITH+12
/* moves */
#define	MOVE	MOV+1
#define	MOVX	MOV+2
#define	MOVU	MOV+3
#define	MOVA	MOV+4
#define	CNV	MOV+5
#define	MOVC	MOV+6
#define	PUSH	MOV+7
#define	POP	MOV+8
#define REST	MOV+9
#define SAVE	MOV+10
/* SDB information */
#define	SDB_I	SDB
#define	GDEF	(SDB_I+0)
#define	GDIM	(SDB_I+1)
#define	GENDEF	(SDB_I+2)
#define	GLINE	(SDB_I+3)
#define	GSCL	(SDB_I+4)
#define	GSIZE	(SDB_I+5)
#define	GTAG	(SDB_I+6)
#define	GTYPE	(SDB_I+7)
#define	GVAL	(SDB_I+8)
/* Assembler pseudo-ops */
#define	PSEUDOP	(SDB_I+9)
#define	PALIGN	(PSEUDOP+0)
#define	PBSS	(PSEUDOP+1)
#define	PBYTE	(PSEUDOP+2)
#define	PCOMM	(PSEUDOP+3)
#define	PDATA	(PSEUDOP+4)
#define	PDOUBL	(PSEUDOP+5)
#define	PFILE	(PSEUDOP+6)
#define	PFLOAT	(PSEUDOP+7)
#define	PGLOBL	(PSEUDOP+8)
#define	PIDENT	(PSEUDOP+9)
#define	PLONG	(PSEUDOP+10)
#define	PLN	(PSEUDOP+11)
#define	PORG	(PSEUDOP+12)
#define	PSET	(PSEUDOP+13)
#define	PSPACE	(PSEUDOP+14)
#define	PTEXT	(PSEUDOP+15)
#define	PWORD	(PSEUDOP+16)

/* begin comment character */

#define	CC '#'

/* predicates and functions */

extern	int	isret();	/* sets RETREG, too */
extern	int	RETREG;
#define	setlab(p)	((p)->op = LABEL)
#define	islabel(p)	((p) && (((p)->op == LABEL) || (p)->op == HLABEL))
#define	ishl(p)		((p) && (((p)->op == HLABEL) || ((p)->op == LABEL && (p)->ops[0][0] != '.')))
#define	setbr(p,l)	(chgop((p), JBR, "b"), (p)->ops[1] = l)
#define	bboptim(x,y)	0
#define	isbr(p)		(((p)->op & MAJ) == BRA)
#define	isuncbr(p)	((p)->op >= RET && (p)->op <= JBR)	
#define	isrev(p)	((p)->op >= JEQ && (p)->op <= JGTU)
#define	ishb(p)		((p)->op == HBRAN)

#define	ispseudo(p)	((p)->op >= PALIGN && (p)->op <= WORD)
#define	isaop(p)	(((p)->op & MAJ) == ARITH)
#define	ismov(p)	(((p)->op & MAJ) == MOV)

#ifdef	LIVEDEAD
#define	R0	0x000001
#define	R1	0x000002
#define	R2	0x000004
#define	R3	0x000008
#define	R4	0x000010
#define	R5	0x000020
#define	R6	0x000040
#define	R7	0x000080
#define	R8	0x000100
#define	R9	0x000200
#define	R10	0x000400
#define	R11	0x000800
#define	R12	0x001000
#define	R13	0x002000
#define	R14	0x004000
#define	R15	0x008000
#define	F0	0x010000
#define	F1	0x020000
#define	F2	0x040000
#define	F3	0x080000
#define	F4	0x100000
#define	F5	0x200000
#define	F6	0x400000
#define	F7	0x800000


#define	REGS 0xFFFFFF
#define	LIVEREGS 0x0000
#endif

/*
** Assertion macro
*/
#define	assert(x) if(!(x))abort("x");
