1984-05-17 14:14:29 +00:00
|
|
|
/* $Header$ */
|
|
|
|
|
1984-05-17 13:42:36 +00:00
|
|
|
/*
|
|
|
|
* 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[];
|