8 #include "firm_types.h"
10 #include "ia32_new_nodes.h"
11 #include "bearch_ia32_t.h"
14 * creates a unique ident by adding a number to a tag
16 * @param tag the tag string, must contain a %d if a number
19 static ident *unique_id(const char *tag)
21 static unsigned id = 0;
24 snprintf(str, sizeof(str), tag, ++id);
25 return new_id_from_str(str);
31 * Transforms a SymConst.
33 * @param mod the debug module
34 * @param block the block the new node should belong to
35 * @param node the ir SymConst node
36 * @param mode mode of the SymConst
37 * @return the created ia32 Const node
39 static ir_node *gen_SymConst(ia32_transform_env_t *env) {
41 firm_dbg_module_t *mod = env->mod;
42 dbg_info *dbg = env->dbg;
43 ir_mode *mode = env->mode;
44 ir_graph *irg = env->irg;
45 ir_node *block = env->block;
47 if (mode_is_float(mode)) {
48 cnst = new_rd_ia32_fConst(dbg, irg, block, mode);
52 cnst = new_rd_ia32_Const(dbg, irg, block, mode);
55 set_ia32_Const_attr(cnst, env->irn);
62 * @param mod the debug module
63 * @param block the block the new node should belong to
64 * @param node the ir Const node
65 * @param mode mode of the Const
66 * @return the created ia32 Const node
68 static ir_node *gen_Const(ia32_transform_env_t *env) {
73 firm_dbg_module_t *mod = env->mod;
74 dbg_info *dbg = env->dbg;
75 ir_mode *mode = env->mode;
76 ir_graph *irg = env->irg;
77 ir_node *block = env->block;
78 ir_node *node = env->irn;
80 if (mode_is_float(mode)) {
81 tp = get_Const_type(node);
82 if (tp == firm_unknown_type) {
83 tp = new_type_primitive(unique_id("tp_ia32_float_%u"), mode);
86 ent = new_entity(get_glob_type(), unique_id("ia32FloatCnst_%u"), tp);
88 set_entity_ld_ident(ent, get_entity_ident(ent));
89 set_entity_visibility(ent, visibility_local);
90 set_entity_variability(ent, variability_constant);
91 set_entity_allocation(ent, allocation_static);
93 set_atomic_ent_value(ent, node);
97 cnst = new_rd_SymConst(dbg, irg, block, sym, symconst_addr_ent);
99 cnst = gen_SymConst(env);
102 cnst = new_rd_ia32_Const(dbg, irg, block, mode);
103 set_ia32_Const_attr(cnst, node);
112 * Transforms (all) Const's into ia32_Const and places them in the
113 * block where they are used (or in the cfg-pred Block in case of Phi's)
115 void ia32_place_consts(ir_node *irn, void *env) {
116 ia32_code_gen_t *cg = env;
117 ia32_transform_env_t tenv;
119 ir_node *pred, *cnst;
126 mode = get_irn_mode(irn);
128 tenv.arch_env = cg->arch_env;
129 tenv.block = get_nodes_block(irn);
132 tenv.mod = firm_dbg_register("ir.be.ia32.optimize");
134 /* Loop over all predecessors and check for Sym/Const nodes */
135 for (i = 0; i < get_irn_arity(irn); i++) {
136 pred = get_irn_n(irn, i);
138 opc = get_irn_opcode(pred);
140 tenv.mode = get_irn_mode(pred);
141 tenv.dbg = get_irn_dbg_info(pred);
143 /* If it's a Phi, then we need to create the */
144 /* new Const in it's predecessor block */
146 tenv.block = get_Block_cfgpred_block(get_nodes_block(irn), i);
151 cnst = gen_Const(&tenv);
154 cnst = gen_SymConst(&tenv);
160 /* if we found a const, then set it */
162 set_irn_n(irn, i, cnst);