123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- typedef short valnum;
- typedef struct entity *entity_p;
- typedef struct avail *avail_p;
- typedef struct token *token_p;
- typedef struct occur *occur_p;
- struct token {
- valnum tk_vn;
- offset tk_size;
- line_p tk_lfirst; /* Textually first instruction, involved
- * in pushing this token.
- */
- };
- /* We distinguish these entities. */
- #define ENCONST 0
- #define ENLOCAL 1
- #define ENEXTERNAL 2
- #define ENINDIR 3
- #define ENOFFSETTED 4
- #define ENALOCAL 5
- #define ENAEXTERNAL 6
- #define ENAOFFSETTED 7
- #define ENALOCBASE 8
- #define ENAARGBASE 9
- #define ENPROC 10
- #define ENFZER 11
- #define ENARRELEM 12
- #define ENLOCBASE 13
- #define ENHEAPPTR 14
- #define ENIGNMASK 15
- struct entity {
- valnum en_vn;
- bool en_static;
- byte en_kind; /* ENLOCAL, ENEXTERNAL, etc. */
- offset en_size;
- union {
- offset en__val; /* ENCONST. */
- offset en__loc; /* ENLOCAL, ENALOCAL. */
- obj_p en__ext; /* ENEXTERNAL, ENAEXTERNAL. */
- valnum en__ind; /* ENINDIR. */
- struct {
- valnum en__base;
- offset en__off;
- } en_offs; /* ENOFFSETTED, ENAOFFSETTED. */
- offset en__levels; /* ENALOCBASE, ENAARGBASE. */
- proc_p en__pro; /* ENPROC. */
- struct {
- valnum en__arbase;
- valnum en__index;
- valnum en__adesc;
- } en_arr; /* ENARRELEM. */
- } en_inf;
- };
- /* Macros to increase ease of use. */
- #define en_val en_inf.en__val
- #define en_loc en_inf.en__loc
- #define en_ext en_inf.en__ext
- #define en_ind en_inf.en__ind
- #define en_base en_inf.en_offs.en__base
- #define en_off en_inf.en_offs.en__off
- #define en_levels en_inf.en__levels
- #define en_pro en_inf.en__pro
- #define en_arbase en_inf.en_arr.en__arbase
- #define en_index en_inf.en_arr.en__index
- #define en_adesc en_inf.en_arr.en__adesc
- struct occur {
- line_p oc_lfirst; /* First instruction of expression. */
- line_p oc_llast; /* Last one. */
- bblock_p oc_belongs; /* Basic block it belongs to. */
- };
-
- /* We distinguish these groups of instructions. */
- #define SIMPLE_LOAD 0
- #define EXPENSIVE_LOAD 1
- #define LOAD_ARRAY 2
- #define STORE_DIRECT 3
- #define STORE_INDIR 4
- #define STORE_ARRAY 5
- #define UNAIR_OP 6
- #define BINAIR_OP 7
- #define TERNAIR_OP 8
- #define KILL_ENTITY 9
- #define SIDE_EFFECTS 10
- #define FIDDLE_STACK 11
- #define IGNORE 12
- #define HOPELESS 13
- #define BBLOCK_END 14
- struct avail {
- avail_p av_before; /* Ptr to earlier discovered expressions. */
- byte av_instr; /* Operator instruction. */
- offset av_size;
- line_p av_found; /* Line where expression is first found. */
- lset av_occurs; /* Set of recurrences of expression. */
- entity_p av_saveloc; /* Local where result is put in. */
- valnum av_result;
- union {
- valnum av__operand; /* EXPENSIVE_LOAD, UNAIR_OP. */
- struct {
- valnum av__oleft;
- valnum av__oright;
- } av_2; /* BINAIR_OP. */
- struct {
- valnum av__ofirst;
- valnum av__osecond;
- valnum av__othird;
- } av_3; /* TERNAIR_OP. */
- } av_o;
- };
- /* Macros to increase ease of use. */
- #define av_operand av_o.av__operand
- #define av_oleft av_o.av_2.av__oleft
- #define av_oright av_o.av_2.av__oright
- #define av_ofirst av_o.av_3.av__ofirst
- #define av_osecond av_o.av_3.av__osecond
- #define av_othird av_o.av_3.av__othird
- extern int Scs; /* Number of optimizations found. */
|