From e810b4fa9931a8179bdaf868faec21416e6c87fb Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Wed, 14 Nov 2007 15:44:41 +0000 Subject: [PATCH] - added mapper for hyperbolic functions - restructured code [r16532] --- include/libfirm/lowering.h | 21 +++++++ ir/lower/lower_intrinsics.c | 120 +++++++++++++++++++++--------------- 2 files changed, 91 insertions(+), 50 deletions(-) diff --git a/include/libfirm/lowering.h b/include/libfirm/lowering.h index c2daa027d..d4ee10ccd 100644 --- a/include/libfirm/lowering.h +++ b/include/libfirm/lowering.h @@ -368,6 +368,27 @@ int i_mapper_acos(ir_node *call, void *ctx); */ int i_mapper_atan(ir_node *call, void *ctx); +/** + * A mapper for the floating point sinh(a): floattype sinh(floattype a); + * + * @return 0 if the sinh call was removed, 0 else. + */ +int i_mapper_sinh(ir_node *call, void *ctx); + +/** + * A mapper for the floating point cosh(a): floattype cosh(floattype a); + * + * @return 0 if the cosh call was removed, 0 else. + */ +int i_mapper_cosh(ir_node *call, void *ctx); + +/** + * A mapper for the floating point tanh(a): floattype tanh(floattype a); + * + * @return 0 if the tanh call was removed, 0 else. + */ +int i_mapper_tanh(ir_node *call, void *ctx); + /** * A mapper for the strcmp-Function: inttype strcmp(char pointer a, char pointer b); * diff --git a/ir/lower/lower_intrinsics.c b/ir/lower/lower_intrinsics.c index 30a19d8de..57dca38a8 100644 --- a/ir/lower/lower_intrinsics.c +++ b/ir/lower/lower_intrinsics.c @@ -339,13 +339,15 @@ int i_mapper_log(ir_node *call, void *ctx) { return 0; } -/* A mapper for the floating point sin. */ -int i_mapper_sin(ir_node *call, void *ctx) { +/** + * A mapper for mapping f(0.0) to 0.0. + */ +static int i_mapper_zero_to_zero(ir_node *call, void *ctx) { ir_node *val = get_Call_param(call, 0); (void) ctx; if (is_Const(val) && is_Const_null(val)) { - /* sin(0.0) = 0.0 */ + /* f(0.0) = 0.0 */ ir_node *mem = get_Call_mem(call); replace_call(val, call, mem, NULL, NULL); return 1; @@ -353,15 +355,38 @@ int i_mapper_sin(ir_node *call, void *ctx) { return 0; } -/* A mapper for the floating point cos. */ -int i_mapper_cos(ir_node *call, void *ctx) { +/** + * A mapper for mapping f(1.0) to 0.0. + */ +static int i_mapper_one_to_zero(ir_node *call, void *ctx) { + ir_node *val = get_Call_param(call, 0); + (void) ctx; + + 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 *mem = get_Call_mem(call); + replace_call(irn, call, mem, NULL, NULL); + return 1; + } + return 0; +} + +/** + * A mapper for mapping a functions with the following characteristics: + * f(-x) = f(x). + * f(0.0) = 1.0 + */ +static int i_mapper_symmetric_zero_to_one(ir_node *call, void *ctx) { ir_node *val = get_Call_param(call, 0); (void) ctx; if (is_strictConv(val)) { ir_node *op = get_Conv_op(val); if (is_Minus(op)) { - /* cos(-x) = cos(x) with strictConv */ + /* f(-x) = f(x) with strictConv */ ir_node *block = get_nodes_block(call); ir_mode *mode = get_irn_mode(val); dbg_info *dbg = get_irn_dbg_info(val); @@ -375,13 +400,13 @@ int i_mapper_cos(ir_node *call, void *ctx) { set_Call_param(call, 0, val); } } else if (is_Minus(val)) { - /* cos(-x) = cos(x) */ + /* f(-x) = f(x) */ val = get_Minus_op(val); set_Call_param(call, 0, val); } if (is_Const(val) && is_Const_null(val)) { - /* cos(0.0) = 1.0 */ + /* 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)); @@ -392,63 +417,58 @@ int i_mapper_cos(ir_node *call, void *ctx) { return 0; } +/* A mapper for the floating point sin. */ +int i_mapper_sin(ir_node *call, void *ctx) { + /* sin(0.0) = 0.0 */ + return i_mapper_zero_to_zero(call, ctx); +} + +/* A mapper for the floating point cos. */ +int i_mapper_cos(ir_node *call, void *ctx) { + /* cos(0.0) = 1.0, cos(-x) = x */ + return i_mapper_symmetric_zero_to_one(call, ctx); +} + /* A mapper for the floating point tan. */ int i_mapper_tan(ir_node *call, void *ctx) { - ir_node *val = get_Call_param(call, 0); - (void) ctx; - - if (is_Const(val) && is_Const_null(val)) { - /* tan(0.0) = 0.0 */ - ir_node *mem = get_Call_mem(call); - replace_call(val, call, mem, NULL, NULL); - return 1; - } - return 0; + /* tan(0.0) = 0.0 */ + return i_mapper_zero_to_zero(call, ctx); } /* A mapper for the floating point asin. */ int i_mapper_asin(ir_node *call, void *ctx) { - ir_node *val = get_Call_param(call, 0); - (void) ctx; - - if (is_Const(val) && is_Const_null(val)) { - /* asin(0.0) = 0.0 */ - ir_node *mem = get_Call_mem(call); - replace_call(val, call, mem, NULL, NULL); - return 1; - } - return 0; + /* asin(0.0) = 0.0 */ + return i_mapper_zero_to_zero(call, ctx); } /* A mapper for the floating point acos. */ int i_mapper_acos(ir_node *call, void *ctx) { - ir_node *val = get_Call_param(call, 0); - (void) ctx; - - 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 *mem = get_Call_mem(call); - replace_call(irn, call, mem, NULL, NULL); - return 1; - } - return 0; + /* acos(1.0) = 0.0 */ + return i_mapper_one_to_zero(call, ctx); } /* A mapper for the floating point atan. */ int i_mapper_atan(ir_node *call, void *ctx) { - ir_node *val = get_Call_param(call, 0); - (void) ctx; + /* atan(0.0) = 0.0 */ + return i_mapper_zero_to_zero(call, ctx); +} - if (is_Const(val) && is_Const_null(val)) { - /* atan(0.0) = 0.0 */ - ir_node *mem = get_Call_mem(call); - replace_call(val, call, mem, NULL, NULL); - return 1; - } - return 0; +/* A mapper for the floating point sinh. */ +int i_mapper_sinh(ir_node *call, void *ctx) { + /* sinh(0.0) = 0.0 */ + return i_mapper_zero_to_zero(call, ctx); +} + +/* A mapper for the floating point cosh. */ +int i_mapper_cosh(ir_node *call, void *ctx) { + /* cosh(0.0) = 1.0, cosh(-x) = x */ + return i_mapper_symmetric_zero_to_one(call, ctx); +} + +/* A mapper for the floating point tanh. */ +int i_mapper_tanh(ir_node *call, void *ctx) { + /* tanh(0.0) = 0.0 */ + return i_mapper_zero_to_zero(call, ctx); } /* A mapper for strcmp */ -- 2.20.1