/*
- * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
/** Walker environment. */
typedef struct walker_env {
pmap *c_map; /**< The intrinsic call map. */
- unsigned nr_of_intrinsics; /**< statistics */
+ size_t nr_of_intrinsics; /**< statistics */
i_instr_record **i_map; /**< The intrinsic instruction map. */
} walker_env_t;
*/
static void call_mapper(ir_node *node, void *env)
{
- walker_env_t *wenv = env;
+ walker_env_t *wenv = (walker_env_t*)env;
ir_op *op = get_irn_op(node);
if (op == op_Call) {
p = pmap_find(wenv->c_map, ent);
if (p) {
- r = p->value;
+ r = (const i_call_record*)p->value;
wenv->nr_of_intrinsics += r->i_mapper(node, r->ctx) ? 1 : 0;
}
} else {
++wenv->nr_of_intrinsics;
break;
}
- r = r->link;
+ r = (const i_instr_record*)r->link;
}
}
}
} /* call_mapper */
/* Go through all graphs and map calls to intrinsic functions. */
-unsigned lower_intrinsics(i_record *list, int length, int part_block_used)
+size_t lower_intrinsics(i_record *list, size_t length, int part_block_used)
{
- int i, n_ops = get_irp_n_opcodes();
+ size_t i, n;
+ size_t n_ops = get_irp_n_opcodes();
ir_graph *irg;
pmap *c_map = pmap_create_ex(length);
i_instr_record **i_map;
- unsigned nr_of_intrinsics = 0;
+ size_t nr_of_intrinsics = 0;
walker_env_t wenv;
/* we use the ir_op generic pointers here */
- NEW_ARR_A(const i_instr_record *, i_map, n_ops);
+ NEW_ARR_A(i_instr_record *, i_map, n_ops);
memset((void *)i_map, 0, sizeof(*i_map) * n_ops);
/* fill a map for faster search */
- for (i = length - 1; i >= 0; --i) {
+ for (i = 0; i < length; ++i) {
if (list[i].i_call.kind == INTRINSIC_CALL) {
pmap_insert(c_map, list[i].i_call.i_ent, (void *)&list[i].i_call);
} else {
wenv.c_map = c_map;
wenv.i_map = i_map;
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ for (i = 0, n = get_irp_n_irgs(); i < n; ++i) {
irg = get_irp_irg(i);
if (part_block_used) {
return nr_of_intrinsics;
} /* lower_intrinsics */
-struct pass_t {
+typedef struct pass_t {
ir_prog_pass_t pass;
- int part_block_used;
- int length;
+ int part_block_used;
+ size_t length;
i_record list[1];
-};
+} pass_t;
/**
* Wrapper for running lower_intrinsics() as an ir_prog pass.
*/
static int pass_wrapper(ir_prog *irp, void *context)
{
- struct pass_t *pass = context;
+ pass_t *pass = (pass_t*)context;
(void) irp; /* TODO: set current irp, or remove parameter */
lower_intrinsics(pass->list, pass->length, pass->part_block_used);
/* probably this pass should not run again */
*/
ir_prog_pass_t *lower_intrinsics_pass(
const char *name,
- i_record *list, int length, int part_block_used)
+ i_record *list, size_t length, int part_block_used)
{
- struct pass_t *pass = xmalloc(sizeof(*pass) + (length-1) * sizeof(pass->list[0]));
+ pass_t *pass = (pass_t*)xmalloc(sizeof(*pass) + (length-1) * sizeof(pass->list[0]));
memcpy(pass->list, list, sizeof(list[0]) * length);
pass->length = length;
set_Tuple_pred(call, pn_Call_X_regular, reg_jmp);
set_Tuple_pred(call, pn_Call_X_except, exc_jmp);
set_Tuple_pred(call, pn_Call_T_result, irn);
- set_Tuple_pred(call, pn_Call_P_value_res_base, new_r_Bad(irg));
} /* replace_call */
/* A mapper for the integer abs. */
ir_mode *mode = get_irn_mode(op);
dbg_info *dbg = get_irn_dbg_info(call);
ir_node *zero = new_r_Const(irg, get_mode_null(mode));
- ir_node *cmp = new_rd_Cmp(dbg, block, op, zero);
- ir_node *cond = new_r_Proj(cmp, mode_b, pn_Cmp_Lt);
+ ir_node *cmp = new_rd_Cmp(dbg, block, op, zero, ir_relation_less);
ir_node *minus_op = new_rd_Minus(dbg, block, op, mode);
ir_node *mux;
arch_allow_ifconv_func allow_ifconv = be_get_backend_param()->allow_ifconv;
(void) ctx;
/* mux allowed by backend? */
- if (!allow_ifconv(cond, op, minus_op))
+ if (!allow_ifconv(cmp, op, minus_op))
return 0;
/* construct Mux */
- mux = new_rd_Mux(dbg, block, cond, op, minus_op, mode);
+ mux = new_rd_Mux(dbg, block, cmp, op, minus_op, mode);
DBG_OPT_ALGSIM0(call, mux, FS_OPT_RTS_ABS);
replace_call(mux, call, mem, NULL, NULL);
return 1;
/* A mapper for the floating point sqrt. */
int i_mapper_sqrt(ir_node *call, void *ctx)
{
- ir_node *mem;
- tarval *tv;
- ir_node *op = get_Call_param(call, 0);
+ ir_node *mem;
+ ir_tarval *tv;
+ ir_node *op = get_Call_param(call, 0);
(void) ctx;
if (!is_Const(op))
/* A mapper for the floating point cbrt. */
int i_mapper_cbrt(ir_node *call, void *ctx)
{
- ir_node *mem;
- tarval *tv;
- ir_node *op = get_Call_param(call, 0);
+ ir_node *mem;
+ ir_tarval *tv;
+ ir_node *op = get_Call_param(call, 0);
(void) ctx;
if (!is_Const(op))
/* pow (1.0, x) = 1.0 */
irn = left;
} else if (is_Const(right)) {
- tarval *tv = get_Const_tarval(right);
+ ir_tarval *tv = get_Const_tarval(right);
if (tarval_is_null(tv)) {
/* pow(x, 0.0) = 1.0 */
ir_mode *mode = get_tarval_mode(tv);
if (irn == NULL) {
ir_mode *mode = get_irn_mode(left);
- ir_node *quot;
+ ir_node *div;
irn = new_r_Const(irg, get_mode_one(mode));
- quot = new_rd_Quot(dbg, block, mem, irn, left, mode, op_pin_state_pinned);
- mem = new_r_Proj(quot, mode_M, pn_Quot_M);
- irn = new_r_Proj(quot, mode, pn_Quot_res);
- reg_jmp = new_r_Proj(quot, mode_X, pn_Quot_X_regular);
- exc_jmp = new_r_Proj(quot, mode_X, pn_Quot_X_except);
+ div = new_rd_Div(dbg, block, mem, irn, left, mode, op_pin_state_pinned);
+ mem = new_r_Proj(div, mode_M, pn_Div_M);
+ irn = new_r_Proj(div, mode, pn_Div_res);
+ reg_jmp = new_r_Proj(div, mode_X, pn_Div_X_regular);
+ exc_jmp = new_r_Proj(div, mode_X, pn_Div_X_except);
}
DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_POW);
replace_call(irn, call, mem, reg_jmp, exc_jmp);
*/
static int i_mapper_symmetric_zero_to_one(ir_node *call, void *ctx, int reason)
{
- ir_node *val = get_Call_param(call, 0);
+ int changed = 0;
+ ir_node *val = get_Call_param(call, 0);
(void) ctx;
if (is_strictConv(val)) {
}
DBG_OPT_ALGSIM2(call, op, call, FS_OPT_RTS_SYMMETRIC);
set_Call_param(call, 0, val);
+ changed = 1;
}
} else if (is_Minus(val)) {
/* f(-x) = f(x) */
val = get_Minus_op(val);
DBG_OPT_ALGSIM2(call, val, call, FS_OPT_RTS_SYMMETRIC);
set_Call_param(call, 0, val);
+ changed = 1;
}
if (is_Const(val) && is_Const_null(val)) {
ir_node *mem = get_Call_mem(call);
DBG_OPT_ALGSIM0(call, irn, reason);
replace_call(irn, call, mem, NULL, NULL);
- return 1;
+ changed = 1;
}
- return 0;
+ return changed;
} /* i_mapper_symmetric_zero_to_one */
/* A mapper for the floating point log. */
static bool initializer_val_is_null(ir_initializer_t *init)
{
- tarval *tv;
+ ir_tarval *tv;
if (get_initializer_kind(init) == IR_INITIALIZER_NULL)
return true;
ir_type *tp = get_entity_type(ent);
ir_mode *mode;
ir_initializer_t *initializer;
- unsigned size;
- unsigned i;
+ size_t size;
+ size_t i;
if (! is_Array_type(tp))
return NULL;
return NULL;
if (!has_entity_initializer(ent)) {
- int len = 0;
- int n;
- int i = -1;
+ size_t i, n;
n = get_compound_ent_n_values(ent);
for (i = 0; i < n; ++i) {
if (is_Const_null(irn)) {
/* found the length */
- len = i;
- break;
+ ir_tarval *tv = new_tarval_from_long(i, get_type_mode(res_tp));
+ return new_r_Const(irg, tv);
}
}
- if (len >= 0) {
- tarval *tv = new_tarval_from_long(len, get_type_mode(res_tp));
- return new_r_Const_type(irg, tv, res_tp);
- }
return NULL;
}
for (i = 0; i < size; ++i) {
ir_initializer_t *val = get_initializer_compound_value(initializer, i);
if (initializer_val_is_null(val)) {
- tarval *tv = new_tarval_from_long(i, get_type_mode(res_tp));
- return new_r_Const_type(irg, tv, res_tp);
+ ir_tarval *tv = new_tarval_from_long(i, get_type_mode(res_tp));
+ return new_r_Const(irg, tv);
}
}
{
ir_type *tp;
ir_mode *mode;
- int i, n, n_r, res;
tp = get_entity_type(left);
if (! is_Array_type(tp))
if (!has_entity_initializer(left) && !has_entity_initializer(right)) {
/* code that uses deprecated compound_graph_path stuff */
+ size_t n = get_compound_ent_n_values(left);
+ size_t n_r = get_compound_ent_n_values(right);
+ size_t i;
+ int res = 0;
- n = get_compound_ent_n_values(left);
- n_r = get_compound_ent_n_values(right);
if (n_r < n)
n = n_r;
- res = 0;
for (i = 0; i < n; ++i) {
ir_node *irn;
long v_l, v_r;
- tarval *tv;
+ ir_tarval *tv;
irn = get_compound_ent_value(left, i);
if (! is_Const(irn))
}
if (i < n) {
/* we found an end */
- tarval *tv = new_tarval_from_long(res, get_type_mode(res_tp));
- return new_r_Const_type(irg, tv, res_tp);
+ ir_tarval *tv = new_tarval_from_long(res, get_type_mode(res_tp));
+ return new_r_Const(irg, tv);
}
return NULL;
}
if (!has_entity_initializer(ent)) {
/* code for deprecated compound_graph_path stuff */
- int n = get_compound_ent_n_values(ent);
+ size_t n = get_compound_ent_n_values(ent);
if (n < 1)
return 0;
irn = get_compound_ent_value(ent, 0);
mode = get_type_mode(char_tp);
/* replace the strcmp by (*x) */
- irn = new_rd_Load(dbg, block, mem, v, mode, 0);
+ irn = new_rd_Load(dbg, block, mem, v, mode, cons_none);
mem = new_r_Proj(irn, mode_M, pn_Load_M);
exc = new_r_Proj(irn, mode_X, pn_Load_X_except);
reg = new_r_Proj(irn, mode_X, pn_Load_X_regular);
{
switch (get_irn_opcode(node)) {
case iro_Load: return get_Load_mode(node);
- case iro_Quot: return get_Quot_resmode(node);
case iro_Div: return get_Div_resmode(node);
case iro_Mod: return get_Mod_resmode(node);
- case iro_DivMod: return get_DivMod_resmode(node);
default: return NULL;
}
} /* get_irn_res_mode */