static void replace_with_call(ir_node *node) { widen_builtin(node); ir_type *const mtp = get_Builtin_type(node); ir_builtin_kind const kind = get_Builtin_kind(node); char const *const name = get_builtin_name(kind); ir_type *const arg1 = get_method_param_type(mtp, 0); char const *const machmode = get_gcc_machmode(arg1); ident *const id = new_id_fmt("__%s%s2", name, machmode); ir_entity *const entity = create_compilerlib_entity(get_id_str(id), mtp); dbg_info *const dbgi = get_irn_dbg_info(node); ir_node *const block = get_nodes_block(node); ir_node *const mem = get_Builtin_mem(node); ir_graph *const irg = get_irn_irg(node); ir_node *const callee = new_r_Address(irg, entity); int const n_params = get_Builtin_n_params(node); ir_node **const params = get_Builtin_param_arr(node); ir_node *const call = new_rd_Call(dbgi, block, mem, callee, n_params, params, mtp); ir_node *const call_mem = new_r_Proj(call, mode_M, pn_Call_M); ir_node *const call_ress = new_r_Proj(call, mode_T, pn_Call_T_result); ir_type *const res_type = get_method_res_type(mtp, 0); ir_mode *const res_mode = get_type_mode(res_type); ir_node *const call_res = new_r_Proj(call_ress, res_mode, 0); ir_node *const in[] = { [pn_Builtin_M] = call_mem, [pn_Builtin_max + 1] = call_res, };
static ir_node *get_memcpy_address(ir_graph *irg) { ident *id = new_id_from_str("memcpy"); ir_type *mt = get_memcpy_methodtype(); ir_entity *ent = create_compilerlib_entity(id, mt); return new_r_Address(irg, ent); }
static void arm_create_runtime_entities(void) { if (divsi3 != NULL) return; ir_mode *mode_int = new_int_mode("arm_be_int", ARM_MACHINE_SIZE, true, ARM_MODULO_SHIFT); ir_mode *mode_uint = new_int_mode("arm_be_int", ARM_MACHINE_SIZE, false, ARM_MODULO_SHIFT); ir_type *int_tp = get_type_for_mode(mode_int); ir_type *uint_tp = get_type_for_mode(mode_uint); ir_type *const mtps = make_divmod_type(int_tp); divsi3 = create_compilerlib_entity("__divsi3", mtps); modsi3 = create_compilerlib_entity("__modsi3", mtps); ir_type *const mtpu = make_divmod_type(uint_tp); udivsi3 = create_compilerlib_entity("__udivsi3", mtpu); umodsi3 = create_compilerlib_entity("__umodsi3", mtpu); }
static void arm_create_runtime_entities(void) { if (divsi3 != NULL) return; ir_mode *mode_int = new_int_mode("arm_be_int", irma_twos_complement, ARM_MACHINE_SIZE, true, ARM_MODULO_SHIFT); ir_mode *mode_uint = new_int_mode("arm_be_int", irma_twos_complement, ARM_MACHINE_SIZE, false, ARM_MODULO_SHIFT); ir_type *int_tp = get_type_for_mode(mode_int); ir_type *uint_tp = get_type_for_mode(mode_uint); ir_type *tp_divsi3 = new_type_method(2, 1); set_method_param_type(tp_divsi3, 0, int_tp); set_method_param_type(tp_divsi3, 1, int_tp); set_method_res_type(tp_divsi3, 0, int_tp); divsi3 = create_compilerlib_entity(new_id_from_str("__divsi3"), tp_divsi3); ir_type *tp_udivsi3 = new_type_method(2, 1); set_method_param_type(tp_udivsi3, 0, uint_tp); set_method_param_type(tp_udivsi3, 1, uint_tp); set_method_res_type(tp_udivsi3, 0, uint_tp); udivsi3 = create_compilerlib_entity(new_id_from_str("__udivsi3"), tp_udivsi3); ir_type *tp_modsi3 = new_type_method(2, 1); set_method_param_type(tp_modsi3, 0, int_tp); set_method_param_type(tp_modsi3, 1, int_tp); set_method_res_type(tp_modsi3, 0, int_tp); modsi3 = create_compilerlib_entity(new_id_from_str("__modsi3"), tp_modsi3); ir_type *tp_umodsi3 = new_type_method(2, 1); set_method_param_type(tp_umodsi3, 0, uint_tp); set_method_param_type(tp_umodsi3, 1, uint_tp); set_method_res_type(tp_umodsi3, 0, uint_tp); umodsi3 = create_compilerlib_entity(new_id_from_str("__umodsi3"), tp_umodsi3); }
static ir_entity *ia32_create_intrinsic_fkt(ir_type *method, const ir_op *op, const ir_mode *imode, const ir_mode *omode, void *context) { (void)omode; (void)context; const char *name; if (op == op_Div) { name = mode_is_signed(imode) ? "__divdi3" : "__udivdi3"; } else if (op == op_Mod) { name = mode_is_signed(imode) ? "__moddi3" : "__umoddi3"; } else { panic("ia32: Unexpected lowering of 64bit op %s", get_op_name(op)); } return create_compilerlib_entity(new_id_from_str(name), method); }
/** * @return An Address representing the function that replaces the given node. */ static ir_node *create_softfloat_address(const ir_node *n, const char *name) { ir_type *const method = get_softfloat_type(n); /* Parameter types. */ char const *first_param = ""; char const *second_param = ""; unsigned float_types = 0; unsigned double_types = 0; switch (get_method_n_params(method)) { case 2: { ir_type *const param_type = get_method_param_type(method, 1); ir_mode *const mode = get_type_mode(param_type); if (mode == mode_F) { second_param = "sf"; float_types++; } else if (mode == mode_D) { second_param = "df"; double_types++; } else if (mode == mode_Iu || mode == mode_Is) { second_param = "si"; } else if (mode == mode_Lu || mode == mode_Ls) { second_param = "di"; } } /* FALLTHROUGH */ case 1: { ir_type *const param_type = get_method_param_type(method, 0); ir_mode *const mode = get_type_mode(param_type); if (mode == mode_F) { first_param = float_types > 0 ? "" : "sf"; float_types++; } else if (mode == mode_D) { first_param = double_types > 0 ? "" : "df"; double_types++; } else if (mode == mode_Iu || mode == mode_Is) { first_param = "si"; } else if (mode == mode_Lu || mode == mode_Ls) { first_param = "di"; } break; } default: break; } /* Result type. */ char const *result = ""; ir_mode *const mode = is_Div(n) ? get_Div_resmode(n) : get_irn_mode(n); if (mode == mode_F) { result = float_types > 0 ? "" : "sf"; float_types++; } else if (mode == mode_D) { result = double_types > 0 ? "" : "df"; double_types++; } else if (mode == mode_Iu || mode == mode_Hu || mode == mode_Bu || mode == mode_Is || mode == mode_Hs || mode == mode_Bs) result = "si"; else if (mode == mode_Lu || mode == mode_Ls) result = "di"; assert(float_types <= 3); assert(double_types <= 3); ident *const id = float_types + double_types > 1 ? new_id_fmt("__%s%s%s%s%u", name, first_param, second_param, result, float_types + double_types) : new_id_fmt("__%s%s%s%s", name, first_param, second_param, result); ir_graph *const irg = get_irn_irg(n); ir_entity *const ent = create_compilerlib_entity(id, method); return new_r_Address(irg, ent); }