*/
#include "config.h"
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
+#include <stdlib.h>
#include <assert.h>
#include "irnode_t.h"
case LEA:
l = build_graph(env, inst->in[0]);
r = build_graph(env, inst->in[1]);
- c = new_Const(env->shf_mode, new_tarval_from_long(inst->shift_count, env->shf_mode));
+ c = new_Const_long(env->shf_mode, inst->shift_count);
r = new_rd_Shl(env->dbg, current_ir_graph, env->blk, r, c, env->mode);
return inst->irn = new_rd_Add(env->dbg, current_ir_graph, env->blk, l, r, env->mode);
case SHIFT:
l = build_graph(env, inst->in[0]);
- c = new_Const(env->shf_mode, new_tarval_from_long(inst->shift_count, env->shf_mode));
+ c = new_Const_long(env->shf_mode, inst->shift_count);
return inst->irn = new_rd_Shl(env->dbg, current_ir_graph, env->blk, l, c, env->mode);
case SUB:
l = build_graph(env, inst->in[0]);
r = build_graph(env, inst->in[1]);
return inst->irn = new_rd_Add(env->dbg, current_ir_graph, env->blk, l, r, env->mode);
case ZERO:
- return inst->irn = new_Const(env->mode, get_mode_null(env->mode));
+ return inst->irn = new_Const(get_mode_null(env->mode));
default:
panic("Unsupported instruction kind");
return NULL;
case ZERO:
inst->costs = costs = env->evaluate(inst->kind, NULL);
return costs;
+ case MUL:
+ case ROOT:
+ break;
}
panic("Unsupported instruction kind");
}
/* Replace Muls with Shifts and Add/Subs. */
ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn) {
- ir_node *res = irn;
+ ir_graph *irg;
+ ir_node *res = irn;
ir_mode *mode = get_irn_mode(irn);
+ ir_node *left;
+ ir_node *right;
+ ir_node *operand;
+ tarval *tv;
+
/* If the architecture dependent optimizations were not initialized
or this optimization was not enabled. */
if (params == NULL || (opts & arch_dep_mul_to_shift) == 0)
return irn;
- set_arch_dep_running(1);
- {
- if (is_Mul(irn) && mode_is_int(mode)) {
- 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 (is_Const(left)) {
- tv = get_Const_tarval(left);
- operand = right;
- } else if (is_Const(right)) {
- tv = get_Const_tarval(right);
- operand = left;
- }
+ if (!is_Mul(irn) || !mode_is_int(mode))
+ return res;
+
+ /* we should never do the reverse transformations again
+ (like x+x -> 2*x) */
+ irg = get_irn_irg(irn);
+ set_irg_state(irg, IR_GRAPH_STATE_ARCH_DEP);
+
+ left = get_binop_left(irn);
+ right = get_binop_right(irn);
+ tv = NULL;
+ operand = NULL;
+
+ /* Look, if one operand is a constant. */
+ if (is_Const(left)) {
+ tv = get_Const_tarval(left);
+ operand = right;
+ } else if (is_Const(right)) {
+ tv = get_Const_tarval(right);
+ operand = left;
+ }
- if (tv != NULL) {
- res = do_decomposition(irn, operand, tv);
+ if (tv != NULL) {
+ res = do_decomposition(irn, operand, tv);
- if (res != irn) {
- hook_arch_dep_replace_mul_with_shifts(irn);
- exchange(irn, res);
- }
- }
+ if (res != irn) {
+ hook_arch_dep_replace_mul_with_shifts(irn);
+ exchange(irn, res);
}
}
- //set_arch_dep_running(0);
return res;
}
struct ms mag = magic(tv);
/* generate the Mulh instruction */
- c = new_Const(mode, mag.M);
+ c = new_Const(mag.M);
q = new_rd_Mulh(dbg, current_ir_graph, block, n, c, mode);
/* do we need an Add or Sub */
ir_node *c;
/* generate the Mulh instruction */
- c = new_Const(mode, mag.M);
+ c = new_Const(mag.M);
q = new_rd_Mulh(dbg, current_ir_graph, block, n, c, mode);
if (mag.need_add) {
/* use the GM scheme */
t = new_rd_Sub(dbg, current_ir_graph, block, n, q, mode);
- c = new_Const(mode_Iu, get_mode_one(mode_Iu));
+ c = new_Const(get_mode_one(mode_Iu));
t = new_rd_Shr(dbg, current_ir_graph, block, t, c, mode);
t = new_rd_Add(dbg, current_ir_graph, block, t, q, mode);
ir_node *curr = left;
/* create the correction code for signed values only if there might be a remainder */
- if (! is_Div_remainderless(irn)) {
+ if (! get_Div_no_remainder(irn)) {
if (k != 1) {
k_node = new_Const_long(mode_Iu, k - 1);
curr = new_rd_Shrs(dbg, current_ir_graph, block, left, k_node, mode);
if (n_flag) { /* negate the result */
ir_node *k_node;
- k_node = new_Const(mode, get_mode_null(mode));
+ k_node = new_Const(get_mode_null(mode));
res = new_rd_Sub(dbg, current_ir_graph, block, k_node, res, mode);
}
} else { /* unsigned case */
if (n_flag) { /* negate the div result */
ir_node *k_node;
- k_node = new_Const(mode, get_mode_null(mode));
+ k_node = new_Const(get_mode_null(mode));
*div = new_rd_Sub(dbg, current_ir_graph, block, k_node, *div, mode);
}