static ir_node *convert_to_modeb(ir_node *node) { ir_node *block = get_nodes_block(node); ir_graph *irg = get_irn_irg(node); ir_node *zero = new_r_Const_null(irg, lowered_mode); ir_node *cmp = new_r_Cmp(block, node, zero, ir_relation_less_greater); return cmp; }
static ir_node *gcji_instanceof(ir_node *objptr, ir_type *classtype, ir_graph *irg, ir_node *block, ir_node **mem) { ir_node *jclass = gcji_get_runtime_classinfo_(block, mem, classtype); ir_node *addr = new_r_Address(irg, gcj_instanceof_entity); ir_node *args[] = { objptr, jclass }; ir_type *call_type = get_entity_type(gcj_instanceof_entity); ir_node *call = new_r_Call(block, *mem, addr, ARRAY_SIZE(args), args, call_type); ir_node *new_mem = new_r_Proj(call, mode_M, pn_Call_M); ir_node *ress = new_r_Proj(call, mode_T, pn_Call_T_result); ir_node *call_res = new_r_Proj(ress, mode_int, 0); ir_node *zero = new_r_Const(irg, get_mode_null(mode_int)); ir_node *res = new_r_Cmp(block, call_res, zero, ir_relation_less_greater); *mem = new_mem; return res; }
/** * Transforms a Cmp into the appropriate soft float function. */ static bool lower_Cmp(ir_node *const n) { ir_node *const left = get_Cmp_left(n); ir_mode *const op_mode = get_irn_mode(left); if (!mode_is_float(op_mode)) return false; dbg_info *const dbgi = get_irn_dbg_info(n); ir_graph *const irg = get_irn_irg(n); ir_node *const zero = new_rd_Const_null(dbgi, irg, mode_Is); char const *name = NULL; char const *name2 = NULL; ir_node *result = NULL; ir_relation relation = get_Cmp_relation(n); switch (relation) { case ir_relation_false: result = zero; break; case ir_relation_equal: name = "eq"; break; case ir_relation_less: name = "lt"; break; case ir_relation_greater: name = "gt"; break; case ir_relation_unordered: name = "unord"; relation = ir_relation_less_greater; break; case ir_relation_less_equal: name = "le"; break; case ir_relation_greater_equal: name = "ge"; break; case ir_relation_less_greater: name = "unord"; name2 = "ne"; break; case ir_relation_less_equal_greater: name = "unord"; relation = ir_relation_equal; break; case ir_relation_unordered_equal: name = "unord"; relation = ir_relation_less_greater; name2 = "ne"; break; case ir_relation_unordered_less: name = "ge"; relation = ir_relation_less; break; case ir_relation_unordered_less_equal: name = "gt"; relation = ir_relation_less_equal; break; case ir_relation_unordered_greater: name = "le"; relation = ir_relation_greater; break; case ir_relation_unordered_greater_equal: name = "lt"; relation = ir_relation_greater_equal; break; case ir_relation_unordered_less_greater: name = "eq"; relation = ir_relation_less_greater; break; case ir_relation_true: result = zero; break; } ir_node *const block = get_nodes_block(n); ir_node *const right = get_Cmp_right(n); if (result == NULL) { ir_node *const in[] = { left, right }; result = make_softfloat_call(n, name, ARRAY_SIZE(in), in); } ir_node *cmp = new_r_Cmp(block, result, zero, relation); /* We need two calls into the softfloat library */ if (name2 != NULL) { ir_node *const in[] = { left, right }; result = make_softfloat_call(n, name2, ARRAY_SIZE(in), in); relation = get_Cmp_relation(n); ir_node *const mux = new_rd_Mux(dbgi, block, cmp, result, zero); arch_allow_ifconv_func const allow_ifconv = be_get_backend_param()->allow_ifconv; if (!allow_ifconv(cmp, result, zero)) ir_nodeset_insert(&created_mux_nodes, mux); cmp = new_r_Cmp(block, mux, zero, relation); } exchange(n, cmp); return true; }