X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fbearch_ia32_t.h;h=142d3f84e0be532ef6a9d3577be6809c19411bb3;hb=0010f7194f0b4a77d4fc18c55ae15e97617ee301;hp=de218455b687d42f180015a478d30590d4199fe5;hpb=2808fdeddf46746cb0580dbc422da9afe6499331;p=libfirm diff --git a/ir/be/ia32/bearch_ia32_t.h b/ir/be/ia32/bearch_ia32_t.h index de218455b..142d3f84e 100644 --- a/ir/be/ia32/bearch_ia32_t.h +++ b/ir/be/ia32/bearch_ia32_t.h @@ -1,16 +1,77 @@ #ifndef _BEARCH_IA32_T_H_ #define _BEARCH_IA32_T_H_ +#include "firm_config.h" + +#include "debug.h" #include "bearch_ia32.h" +#include "ia32_nodes_attr.h" +#include "set.h" +#include "../be.h" + +/* some typedefs */ + +typedef struct _ia32_optimize_t { + unsigned incdec : 1; /**< optimize add/sub 1/-1 to inc/dec */ + unsigned doam : 1; /**< do address mode optimizations */ + unsigned placecnst : 1; /**< place constants in the blocks where they are used */ + unsigned immops : 1; /**< create operations with immediates */ + unsigned extbb : 1; /**< do extended basic block scheduling */ +} ia32_optimize_t; typedef struct _ia32_code_gen_t { - const arch_code_generator_if_t *impl; /* implementation */ - ir_graph *irg; /* current irg */ - FILE *out; /* output file */ - const arch_env_t *arch_env; /* the arch env */ - set *reg_set; /* set to memorize registers for non-ia32 nodes (e.g. phi nodes) */ - firm_dbg_module_t *mod; /* debugging module */ - int emit_decls; + const arch_code_generator_if_t *impl; /**< implementation */ + ir_graph *irg; /**< current irg */ + FILE *out; /**< output file */ + const arch_env_t *arch_env; /**< the arch env */ + set *reg_set; /**< set to memorize registers for non-ia32 nodes (e.g. phi nodes) */ + firm_dbg_module_t *mod; /**< debugging module */ + int emit_decls; /**< flag indicating if decls were already emitted */ + pmap *types; /**< A map of modes to primitive types */ + pmap *tv_ent; /**< A map of entities that store tarvals */ + const be_irg_t *birg; /**< The be-irg (contains additional information about the irg) */ + ia32_optimize_t opt; /**< contains optimization information */ } ia32_code_gen_t; +typedef struct _ia32_isa_t { + const arch_isa_if_t *impl; + const arch_register_t *sp; /**< The stack pointer register. */ + const arch_register_t *bp; /**< The base pointer register. */ + const int stack_dir; /**< -1 for decreasing, 1 for increasing. */ + int num_codegens; /**< The number of code generator objects created so far */ + pmap *regs_16bit; /**< Contains the 16bits names of the gp registers */ + pmap *regs_8bit; /**< Contains the 8bits names of the gp registers */ +#ifndef NDEBUG + struct obstack *name_obst; /**< holds the original node names (for debugging) */ + unsigned long name_obst_size; +#endif /* NDEBUG */ +} ia32_isa_t; + +typedef struct _ia32_irn_ops_t { + const arch_irn_ops_if_t *impl; + ia32_code_gen_t *cg; +} ia32_irn_ops_t; + +/* this is a struct to minimize the number of parameters + for transformation walker */ +typedef struct _ia32_transform_env_t { + firm_dbg_module_t *mod; /**< The firm debugger */ + dbg_info *dbg; /**< The node debug info */ + ir_graph *irg; /**< The irg, the node should be created in */ + ir_node *block; /**< The block, the node should belong to */ + ir_node *irn; /**< The irn, to be transformed */ + ir_mode *mode; /**< The mode of the irn */ + ia32_code_gen_t *cg; /**< The code generator */ +} ia32_transform_env_t; + +/** + * Creates the unique per irg GP NoReg node. + */ +ir_node *ia32_new_NoReg_gp(ia32_code_gen_t *cg); + +/** + * Creates the unique per irg FP NoReg node. + */ +ir_node *ia32_new_NoReg_fp(ia32_code_gen_t *cg); + #endif /* _BEARCH_IA32_T_H_ */