}
/* A mapper for the integer abs. */
-int i_mapper_Abs(ir_node *call, void *ctx) {
+int i_mapper_abs(ir_node *call, void *ctx) {
ir_node *mem = get_Call_mem(call);
ir_node *block = get_nodes_block(call);
ir_node *op = get_Call_param(call, 0);
}
/* A mapper for the alloca() function. */
-int i_mapper_Alloca(ir_node *call, void *ctx) {
+int i_mapper_alloca(ir_node *call, void *ctx) {
ir_node *mem = get_Call_mem(call);
ir_node *block = get_nodes_block(call);
ir_node *op = get_Call_param(call, 0);
}
/* A mapper for the floating point sqrt. */
-int i_mapper_Sqrt(ir_node *call, void *ctx) {
+int i_mapper_sqrt(ir_node *call, void *ctx) {
ir_node *mem;
tarval *tv;
ir_node *op = get_Call_param(call, 0);
}
/* A mapper for the floating point pow. */
-int i_mapper_Pow(ir_node *call, void *ctx) {
+int i_mapper_pow(ir_node *call, void *ctx) {
dbg_info *dbg;
ir_node *mem;
ir_node *left = get_Call_param(call, 0);
irn = NULL;
} else
return 0;
+ } else {
+ return 0;
}
mem = get_Call_mem(call);
return 1;
}
+/* A mapper for the floating point exp. */
+int i_mapper_exp(ir_node *call, void *ctx) {
+ ir_node *val = get_Call_param(call, 0);
+ (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 *mem = get_Call_mem(call);
+ replace_call(irn, 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);
+ (void) ctx;
+
+ if (is_Const(val) && is_Const_null(val)) {
+ /* sin(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 cos. */
+int i_mapper_cos(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 */
+ ir_node *block = get_nodes_block(call);
+ ir_mode *mode = get_irn_mode(val);
+ dbg_info *dbg = get_irn_dbg_info(val);
+
+ op = get_Minus_op(op);
+ val = new_rd_Conv(dbg, current_ir_graph, block, op, mode);
+ if (is_Conv(val)) {
+ /* still a Conv ? */
+ set_Conv_strict(val, 1);
+ }
+ set_Call_param(call, 0, val);
+ }
+ } else if (is_Minus(val)) {
+ /* cos(-x) = cos(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 */
+ 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 *mem = get_Call_mem(call);
+ replace_call(irn, call, mem, NULL, NULL);
+ return 1;
+ }
+ return 0;
+}
+
+/* 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;
+}
+
+/* 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;
+}
+
+/* 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;
+}
+
+/* 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;
+
+ 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 strcmp */
-int i_mapper_Strcmp(ir_node *call, void *ctx) {
+int i_mapper_strcmp(ir_node *call, void *ctx) {
ir_node *left = get_Call_param(call, 0);
ir_node *right = get_Call_param(call, 1);
ir_node *irn;
return 0;
}
+/* A mapper for strncmp */
+int i_mapper_strncmp(ir_node *call, void *ctx) {
+ ir_node *left = get_Call_param(call, 0);
+ ir_node *right = get_Call_param(call, 1);
+ ir_node *len = get_Call_param(call, 2);
+ ir_node *irn;
+ (void) ctx;
+
+ if (left == right || (is_Const(len) && is_Const_null(len))) {
+ /* a strncmp(s, s, len) ==> 0 OR
+ a strncmp(a, b, 0) ==> 0 */
+ ir_node *mem = get_Call_mem(call);
+ ir_node *adr = get_Call_ptr(call);
+ ir_entity *ent = get_SymConst_entity(adr);
+ 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));
+ replace_call(irn, call, mem, NULL, NULL);
+ return 1;
+ }
+ return 0;
+}
+
/* A mapper for memcpy */
-int i_mapper_Memcpy(ir_node *call, void *ctx) {
- ir_node *count = get_Call_param(call, 2);
+int i_mapper_memcpy(ir_node *call, void *ctx) {
+ ir_node *len = get_Call_param(call, 2);
(void) ctx;
- if (is_Const(count) && is_Const_null(count)) {
+ if (is_Const(len) && is_Const_null(len)) {
/* a memcpy(d, s, 0) ==> d */
ir_node *mem = get_Call_mem(call);
ir_node *dst = get_Call_param(call, 0);
return 0;
}
+/* A mapper for memset */
+int i_mapper_memset(ir_node *call, void *ctx) {
+ ir_node *len = get_Call_param(call, 2);
+ (void) ctx;
+
+ if (is_Const(len) && is_Const_null(len)) {
+ /* a memset(d, C, 0) ==> d */
+ ir_node *mem = get_Call_mem(call);
+ ir_node *dst = get_Call_param(call, 0);
+
+ replace_call(dst, call, mem, NULL, NULL);
+ return 1;
+ }
+ return 0;
+}
+
/**
* Returns the result mode of a node.
*/