126 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Header$ */
 | 
						|
 | 
						|
/*
 | 
						|
 * pattern contains the optimization patterns in an apparently
 | 
						|
 * unordered fashion. All patterns follow each other unaligned.
 | 
						|
 * Each pattern looks as follows:
 | 
						|
 *   Byte 0:	high byte of hash value associated with this pattern.
 | 
						|
 *   Byte 1-2:	index of next pattern with same low byte of hash value.
 | 
						|
 *   Byte 3- :	pattern and replacement.
 | 
						|
 *                First comes the pattern length
 | 
						|
 *                then the pattern opcodes,
 | 
						|
 *		  then a boolean expression,
 | 
						|
 *		  then the one-byte replacement length
 | 
						|
 *		  then the intermixed pattern opcodes and operands or
 | 
						|
 *		  0 followed by the one-byte special optimization expression.
 | 
						|
 *   If the DIAGOPT option is set, the optimization is followed
 | 
						|
 *   by the line number in the tables.
 | 
						|
 */
 | 
						|
 | 
						|
/* #define ALLOWSPECIAL /* Special optimizations allowed */
 | 
						|
 | 
						|
#define PO_HASH		0
 | 
						|
#define PO_NEXT		1
 | 
						|
#define PO_MATCH	3
 | 
						|
 | 
						|
struct exprnode {
 | 
						|
	short ex_operator;
 | 
						|
	short ex_lnode;
 | 
						|
	short ex_rnode;
 | 
						|
};
 | 
						|
typedef struct exprnode expr_t;
 | 
						|
typedef struct exprnode *expr_p;
 | 
						|
 | 
						|
/*
 | 
						|
 * contents of .ex_operator
 | 
						|
 */
 | 
						|
 | 
						|
#define EX_CON		0
 | 
						|
#define EX_ARG		1
 | 
						|
#define EX_CMPEQ	2
 | 
						|
#define EX_CMPNE	3
 | 
						|
#define EX_CMPGT	4
 | 
						|
#define EX_CMPGE	5
 | 
						|
#define EX_CMPLT	6
 | 
						|
#define EX_CMPLE	7
 | 
						|
#define EX_OR2		8
 | 
						|
#define EX_AND2		9
 | 
						|
#define EX_OR1		10
 | 
						|
#define EX_XOR1		11
 | 
						|
#define EX_AND1		12
 | 
						|
#define EX_PLUS		13
 | 
						|
#define EX_MINUS	14
 | 
						|
#define EX_TIMES	15
 | 
						|
#define EX_DIVIDE	16
 | 
						|
#define EX_MOD		17
 | 
						|
#define EX_LSHIFT	18
 | 
						|
#define EX_RSHIFT	19
 | 
						|
#define EX_UMINUS	20
 | 
						|
#define EX_NOT		21
 | 
						|
#define EX_COMP		22
 | 
						|
#define EX_ROM		23
 | 
						|
#define EX_NOTREG	24
 | 
						|
#define EX_POINTERSIZE	25
 | 
						|
#define EX_WORDSIZE	26
 | 
						|
#define EX_DEFINED	27
 | 
						|
#define EX_SAMESIGN	28
 | 
						|
#define EX_SFIT		29
 | 
						|
#define EX_UFIT		30
 | 
						|
#define EX_ROTATE	31
 | 
						|
#define N_EX_OPS	32	/* must be one higher then previous */
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Definition of special opcodes used in patterns
 | 
						|
 */
 | 
						|
 | 
						|
#define op_pfirst op_LLP
 | 
						|
#define op_LLP	(op_last+1)
 | 
						|
#define op_LEP	(op_last+2)
 | 
						|
#define op_SLP	(op_last+3)
 | 
						|
#define op_SEP	(op_last+4)
 | 
						|
#define op_plast op_SEP
 | 
						|
 | 
						|
/*
 | 
						|
 * Definition of the structure in which instruction operands
 | 
						|
 * are kept during pattern matching.
 | 
						|
 */
 | 
						|
 | 
						|
typedef struct eval eval_t;
 | 
						|
typedef struct eval *eval_p;
 | 
						|
 | 
						|
struct eval {
 | 
						|
	short	e_typ;
 | 
						|
	union {
 | 
						|
		offset	e_con;
 | 
						|
		num_p	e_np;
 | 
						|
	} e_v;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * contents of .e_typ
 | 
						|
 */
 | 
						|
#define EV_UNDEF	0
 | 
						|
#define EV_CONST	1
 | 
						|
#define EV_NUMLAB	2
 | 
						|
#define EV_FRAG		3	/* and all higher numbers */
 | 
						|
 | 
						|
typedef struct iarg iarg_t;
 | 
						|
typedef struct iarg *iarg_p;
 | 
						|
 | 
						|
struct iarg {
 | 
						|
	eval_t	ia_ev;
 | 
						|
	sym_p	ia_sp;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * The next extern declarations refer to data generated by mktab
 | 
						|
 */
 | 
						|
 | 
						|
extern byte pattern[];
 | 
						|
extern short  lastind;
 | 
						|
extern iarg_t iargs[];
 | 
						|
extern byte nparam[];
 | 
						|
extern bool nonumlab[];
 | 
						|
extern bool onlyconst[];
 | 
						|
extern expr_t enodes[];
 |