X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_intrinsics.c;h=504881387a9ec80c094babb8dd2d7c33db754aa5;hb=a767106e3a7f4c79586915b9ecc043ebbfb39017;hp=9835b9dbfe84c93daf2090a1020f0fb61553b772;hpb=cad8bfd2f34bc2f01649ec675cc78ebf869e3d88;p=libfirm diff --git a/ir/lower/lower_intrinsics.c b/ir/lower/lower_intrinsics.c index 9835b9dbf..504881387 100644 --- a/ir/lower/lower_intrinsics.c +++ b/ir/lower/lower_intrinsics.c @@ -40,6 +40,7 @@ #include "pmap.h" #include "array_t.h" #include "iropt_dbg.h" +#include "error.h" /** Walker environment. */ typedef struct _walker_env { @@ -214,7 +215,12 @@ int i_mapper_alloca(ir_node *call, void *ctx) { (void) ctx; if (mode_is_signed(get_irn_mode(op))) { - op = new_rd_Conv(dbg, current_ir_graph, block, op, mode_Iu); + ir_mode *mode = get_irn_mode(op); + mode = find_unsigned_mode(mode); + if (mode == NULL) { + panic("Cannot find unsigned mode for %M", mode); + } + op = new_rd_Conv(dbg, current_ir_graph, block, op, mode); } irn = new_rd_Alloc(dbg, current_ir_graph, block, mem, op, firm_unknown_type, stack_alloc); @@ -290,7 +296,7 @@ int i_mapper_pow(ir_node *call, void *ctx) { if (tarval_is_null(tv)) { /* pow(x, 0.0) = 1.0 */ ir_mode *mode = get_tarval_mode(tv); - irn = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode)); + irn = new_Const(get_mode_one(mode)); } else if (tarval_is_one(tv)) { /* pow(x, 1.0) = x */ irn = left; @@ -310,7 +316,7 @@ int i_mapper_pow(ir_node *call, void *ctx) { ir_mode *mode = get_irn_mode(left); ir_node *quot; - irn = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode)); + irn = new_Const(get_mode_one(mode)); quot = new_rd_Quot(dbg, current_ir_graph, block, mem, irn, left, mode, op_pin_state_pinned); mem = new_r_Proj(current_ir_graph, block, quot, mode_M, pn_Quot_M); irn = new_r_Proj(current_ir_graph, block, quot, mode, pn_Quot_res); @@ -329,9 +335,8 @@ int i_mapper_exp(ir_node *call, void *ctx) { if (is_Const(val) && is_Const_null(val)) { /* exp(0.0) = 1.0 */ - ir_node *block = get_nodes_block(call); ir_mode *mode = get_irn_mode(val); - ir_node *irn = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode)); + ir_node *irn = new_Const(get_mode_one(mode)); ir_node *mem = get_Call_mem(call); DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_EXP); replace_call(irn, call, mem, NULL, NULL); @@ -366,9 +371,8 @@ static int i_mapper_one_to_zero(ir_node *call, void *ctx, int reason) { if (is_Const(val) && is_Const_one(val)) { /* acos(1.0) = 0.0 */ - ir_node *block = get_nodes_block(call); ir_mode *mode = get_irn_mode(val); - ir_node *irn = new_r_Const(current_ir_graph, block, mode, get_mode_null(mode)); + ir_node *irn = new_Const(get_mode_null(mode)); ir_node *mem = get_Call_mem(call); DBG_OPT_ALGSIM0(call, irn, reason); replace_call(irn, call, mem, NULL, NULL); @@ -412,9 +416,8 @@ static int i_mapper_symmetric_zero_to_one(ir_node *call, void *ctx, int reason) if (is_Const(val) && is_Const_null(val)) { /* f(0.0) = 1.0 */ - ir_node *block = get_nodes_block(call); ir_mode *mode = get_irn_mode(val); - ir_node *irn = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode)); + ir_node *irn = new_Const(get_mode_one(mode)); ir_node *mem = get_Call_mem(call); DBG_OPT_ALGSIM0(call, irn, reason); replace_call(irn, call, mem, NULL, NULL); @@ -524,7 +527,7 @@ static ir_node *eval_strlen(ir_entity *ent, ir_type *res_tp) { mode = get_type_mode(tp); /* FIXME: This is too restrict, as the type char might be more the 8bits */ - if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs)) + if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8) return NULL; n = get_compound_ent_n_values(ent); @@ -597,7 +600,7 @@ static ir_node *eval_strcmp(ir_entity *left, ir_entity *right, ir_type *res_tp) mode = get_type_mode(tp); /* FIXME: This is too restrict, as the type char might be more the 8bits */ - if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs)) + if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8) return NULL; tp = get_entity_type(right); @@ -609,7 +612,7 @@ static ir_node *eval_strcmp(ir_entity *left, ir_entity *right, ir_type *res_tp) mode = get_type_mode(tp); /* FIXME: This is too restrict, as the type char might be more the 8bits */ - if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs)) + if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8) return NULL; n = get_compound_ent_n_values(left); @@ -676,7 +679,7 @@ static int is_empty_string(ir_entity *ent) { mode = get_type_mode(tp); /* FIXME: This is too restrict, as the type char might be more the 8bits */ - if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs)) + if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8) return 0; n = get_compound_ent_n_values(ent); @@ -716,9 +719,8 @@ int i_mapper_strcmp(ir_node *call, void *ctx) { /* a strcmp(s, s) ==> 0 */ ir_node *mem = get_Call_mem(call); ir_mode *mode = get_type_mode(res_tp); - ir_node *block = get_nodes_block(call); - irn = new_r_Const(current_ir_graph, block, mode, get_mode_null(mode)); + irn = new_Const(get_mode_null(mode)); DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_STRCMP); replace_call(irn, call, mem, NULL, NULL); return 1; @@ -750,7 +752,7 @@ replace_by_call: mode = get_type_mode(char_tp); /* replace the strcmp by (*x) */ - irn = new_rd_Load(dbg, current_ir_graph, block, mem, v, mode); + irn = new_rd_Load(dbg, current_ir_graph, block, mem, v, mode, 0); mem = new_r_Proj(current_ir_graph, block, irn, mode_M, pn_Load_M); exc = new_r_Proj(current_ir_graph, block, irn, mode_X, pn_Load_X_except); reg = new_r_Proj(current_ir_graph, block, irn, mode_X, pn_Load_X_regular); @@ -794,9 +796,8 @@ int i_mapper_strncmp(ir_node *call, void *ctx) { ir_type *call_tp = get_entity_type(ent); ir_type *res_tp = get_method_res_type(call_tp, 0); ir_mode *mode = get_type_mode(res_tp); - ir_node *block = get_nodes_block(call); - irn = new_r_Const(current_ir_graph, block, mode, get_mode_null(mode)); + irn = new_Const(get_mode_null(mode)); DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_STRNCMP); replace_call(irn, call, mem, NULL, NULL); return 1;