/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $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. */ #undef 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[];