From: Michael Beck Date: Tue, 13 Nov 2007 16:27:48 +0000 (+0000) Subject: i_mapper_log() added X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=0deebf402cdaf234b12a9e3f38f5667719a9cd76;p=libfirm i_mapper_log() added [r16523] --- diff --git a/include/libfirm/lowering.h b/include/libfirm/lowering.h index f6f5a3c1d..007bfc2fe 100644 --- a/include/libfirm/lowering.h +++ b/include/libfirm/lowering.h @@ -306,6 +306,19 @@ int i_mapper_pow(ir_node *call, void *ctx); */ int i_mapper_exp(ir_node *call, void *ctx); +#define i_mapper_exp2 i_mapper_exp +#define i_mapper_exp10 i_mapper_exp + +/** + * A mapper for the floating point log(a): floattype log(floattype a); + * + * @return 0 if the log call was removed, 0 else. + */ +int i_mapper_log(ir_node *call, void *ctx); + +#define i_mapper_log2 i_mapper_log +#define i_mapper_log10 i_mapper_log + /** * A mapper for the floating point sin(a): floattype sin(floattype a); * diff --git a/ir/lower/lower_intrinsics.c b/ir/lower/lower_intrinsics.c index da9ac0484..0d606bd81 100644 --- a/ir/lower/lower_intrinsics.c +++ b/ir/lower/lower_intrinsics.c @@ -301,6 +301,23 @@ int i_mapper_exp(ir_node *call, void *ctx) { return 0; } +/* A mapper for the floating point log. */ +int i_mapper_log(ir_node *call, void *ctx) { + ir_node *val = get_Call_param(call, 0); + (void) ctx; + + if (is_Const(val) && is_Const_one(val)) { + /* log(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 *mem = get_Call_mem(call); + replace_call(val, call, mem, NULL, NULL); + return 1; + } + return 0; +} + /* A mapper for the floating point sin. */ int i_mapper_sin(ir_node *call, void *ctx) { ir_node *val = get_Call_param(call, 0);