- added mapper for hyperbolic functions
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 14 Nov 2007 15:44:41 +0000 (15:44 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 14 Nov 2007 15:44:41 +0000 (15:44 +0000)
- restructured code

[r16532]

include/libfirm/lowering.h
ir/lower/lower_intrinsics.c

index c2daa02..d4ee10c 100644 (file)
@@ -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);
  *
index 30a19d8..57dca38 100644 (file)
@@ -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 */