X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firarch.c;h=27a66febc87c80829753562ffb7978713e72af4d;hb=2adf5813e8575dd3c7a06433cdcaa3b045202d7f;hp=74a4c839de58b1631fca35df1150750b185b9519;hpb=637542932dc27dcdfc7def09b58d9d5d4c34fb77;p=libfirm diff --git a/ir/ir/irarch.c b/ir/ir/irarch.c index 74a4c839d..27a66febc 100644 --- a/ir/ir/irarch.c +++ b/ir/ir/irarch.c @@ -6,7 +6,14 @@ * * $Id$ */ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_STDLIB_H +# include +#endif + #include #include "irnode_t.h" @@ -23,6 +30,7 @@ #include "irhooks.h" #include "ircons.h" #include "irarch.h" +#include "irreflect.h" #undef DEB @@ -54,10 +62,6 @@ new_rd_Mulh (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *in[2]; ir_node *res; - if (! op_Mulh) { - op_Mulh = new_ir_op(get_next_ir_opcode(), "Mulh", op_pin_state_floats, irop_flag_commutative, oparity_binary, 0, 0); - } - in[0] = op1; in[1] = op2; res = new_ir_node(db, irg, block, op_Mulh, mode, 2, in); @@ -75,11 +79,20 @@ void arch_dep_init(arch_dep_params_factory_t factory) if (factory != NULL) params = factory(); - if (params && (opts & (arch_dep_div_by_const|arch_dep_mod_by_const))) { - if (! op_Mulh) { - /* create the Mulh operation */ - op_Mulh = new_ir_op(get_next_ir_opcode(), "Mulh", op_pin_state_floats, irop_flag_commutative, oparity_binary, 0, 0); - } + if (! op_Mulh) { + rflct_sig_t *sig; + int mulh_opc = get_next_ir_opcode(); + + /* create the Mulh operation */ + op_Mulh = new_ir_op(mulh_opc, "Mulh", op_pin_state_floats, irop_flag_commutative, oparity_binary, 0, 0, NULL); + sig = rflct_signature_allocate(1, 3); + rflct_signature_set_arg(sig, 0, 0, "Res", RFLCT_MC(Int), 0, 0); + rflct_signature_set_arg(sig, 1, 0, "Block", RFLCT_MC(BB), 0, 0); + rflct_signature_set_arg(sig, 1, 1, "Op 0", RFLCT_MC(Int), 0, 0); + rflct_signature_set_arg(sig, 1, 2, "Op 1", RFLCT_MC(Int), 0, 0); + + rflct_new_opcode(mulh_opc, "Mulh", 0); + rflct_opcode_add_signature(mulh_opc, sig); } } @@ -87,7 +100,7 @@ void arch_dep_set_opts(arch_dep_opts_t the_opts) { opts = the_opts; } -/* check, wheater a mode allows a Mulh instruction */ +/* check, whether a mode allows a Mulh instruction */ static int allow_Mulh(ir_mode *mode) { if (get_mode_size_bits(mode) > params->max_bits_for_mulh) @@ -102,18 +115,18 @@ ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn) /* If the architecture dependent optimizations were not initialized or this optimization was not enabled. */ - if(params == NULL || (opts & arch_dep_mul_to_shift) == 0) + if (params == NULL || (opts & arch_dep_mul_to_shift) == 0) return irn; - if(get_irn_opcode(irn) == iro_Mul && mode_is_int(mode)) { - ir_node *block = get_nodes_block(irn); + if (get_irn_op(irn) == op_Mul && mode_is_int(mode)) { + ir_node *block = get_irn_n(irn, -1); ir_node *left = get_binop_left(irn); ir_node *right = get_binop_right(irn); tarval *tv = NULL; ir_node *operand = NULL; /* Look, if one operand is a constant. */ - if(get_irn_opcode(left) == iro_Const) { + if (get_irn_opcode(left) == iro_Const) { tv = get_Const_tarval(left); operand = right; } else if(get_irn_opcode(right) == iro_Const) { @@ -121,7 +134,7 @@ ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn) operand = left; } - if(tv != NULL) { + if (tv != NULL) { int maximum_shifts = params->maximum_shifts; int also_use_subs = params->also_use_subs; int highest_shift_amount = params->highest_shift_amount; @@ -296,13 +309,13 @@ ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn) assert(amount >= 0 && "What is a negative shift??"); - if(amount != 0) { + if (amount != 0) { ir_node *cnst = new_r_Const_long(current_ir_graph, block, mode_Iu, amount); aux = new_r_Shl(current_ir_graph, block, operand, cnst, mode); } - if(curr) { - if(sub) + if (curr) { + if (sub) curr = new_r_Sub(current_ir_graph, block, curr, aux, mode); else curr = new_r_Add(current_ir_graph, block, curr, aux, mode); @@ -318,7 +331,7 @@ ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn) #ifdef DEB { const char *prefix = ""; - for(i = 0; i < n; i++) { + for (i = 0; i < n; ++i) { fprintf(stderr, "%s%d", prefix, shifts[i]); prefix = ", "; } @@ -546,13 +559,13 @@ static struct mu magicu(tarval *d) /** * build the Mulh replacement code for n / tv * - * Note thet 'div' might be a mod or DivMod operation as well + * Note that 'div' might be a mod or DivMod operation as well */ static ir_node *replace_div_by_mulh(ir_node *div, tarval *tv) { dbg_info *dbg = get_irn_dbg_info(div); ir_node *n = get_binop_left(div); - ir_node *block = get_nodes_block(div); + ir_node *block = get_irn_n(div, -1); ir_mode *mode = get_irn_mode(n); int bits = get_mode_size_bits(mode); ir_node *q, *t, *c; @@ -643,7 +656,7 @@ ir_node *arch_dep_replace_div_by_const(ir_node *irn) left = get_Div_left(irn); mode = get_irn_mode(left); - block = get_nodes_block(irn); + block = get_irn_n(irn, -1); dbg = get_irn_dbg_info(irn); tv = get_Const_tarval(c); @@ -703,7 +716,7 @@ ir_node *arch_dep_replace_div_by_const(ir_node *irn) } if (res != irn) - hook_arch_dep_replace_div_by_const(irn); + hook_arch_dep_replace_division_by_const(irn); return res; } @@ -731,7 +744,7 @@ ir_node *arch_dep_replace_mod_by_const(ir_node *irn) left = get_Mod_left(irn); mode = get_irn_mode(left); - block = get_nodes_block(irn); + block = get_irn_n(irn, -1); dbg = get_irn_dbg_info(irn); tv = get_Const_tarval(c); @@ -794,7 +807,7 @@ ir_node *arch_dep_replace_mod_by_const(ir_node *irn) } if (res != irn) - hook_arch_dep_replace_mod_by_const(irn); + hook_arch_dep_replace_division_by_const(irn); return res; } @@ -823,7 +836,7 @@ void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn left = get_DivMod_left(irn); mode = get_irn_mode(left); - block = get_nodes_block(irn); + block = get_irn_n(irn, -1); dbg = get_irn_dbg_info(irn); tv = get_Const_tarval(c); @@ -901,7 +914,7 @@ void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn } if (*div) - hook_arch_dep_replace_DivMod_by_const(irn); + hook_arch_dep_replace_division_by_const(irn); }