ack/util/opt/pattern.h

127 lines
2.6 KiB
C
Raw Normal View History

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[];