+static ir_type *create_lowered_type(void)
+{
+ if (lowered_type == NULL) {
+ lowered_type = new_type_primitive(config->lowered_mode);
+ }
+ return lowered_type;
+}
+
+ir_node *ir_create_mux_set(ir_node *cond, ir_mode *dest_mode)
+{
+ ir_graph *irg = get_irn_irg(cond);
+ ir_node *block = get_nodes_block(cond);
+ ir_tarval *tv_one = get_mode_one(dest_mode);
+ ir_node *one = new_r_Const(irg, tv_one);
+ ir_tarval *tv_zero = get_mode_null(dest_mode);
+ ir_node *zero = new_r_Const(irg, tv_zero);
+ ir_node *set = new_r_Mux(block, cond, zero, one, dest_mode);
+ return set;
+}
+
+ir_node *ir_create_cond_set(ir_node *cond_value, ir_mode *dest_mode)
+{
+ ir_node *lower_block = part_block_edges(cond_value);
+ ir_node *upper_block = get_nodes_block(cond_value);
+ ir_graph *irg = get_irn_irg(cond_value);
+ ir_node *cond = new_r_Cond(upper_block, cond_value);
+ ir_node *proj_true = new_r_Proj(cond, mode_X, pn_Cond_true);
+ ir_node *proj_false = new_r_Proj(cond, mode_X, pn_Cond_false);
+ ir_node *in_true[1] = { proj_true };
+ ir_node *in_false[1] = { proj_false };
+ ir_node *true_block = new_r_Block(irg, ARRAY_SIZE(in_true), in_true);
+ ir_node *false_block = new_r_Block(irg, ARRAY_SIZE(in_false),in_false);
+ ir_node *true_jmp = new_r_Jmp(true_block);
+ ir_node *false_jmp = new_r_Jmp(false_block);
+ ir_node *lower_in[2] = { true_jmp, false_jmp };
+ ir_node *one = new_r_Const(irg, get_mode_one(dest_mode));
+ ir_node *zero = new_r_Const(irg, get_mode_null(dest_mode));
+ ir_node *phi_in[2] = { one, zero };
+ ir_node *phi;
+
+ set_irn_in(lower_block, ARRAY_SIZE(lower_in), lower_in);
+ phi = new_r_Phi(lower_block, ARRAY_SIZE(phi_in), phi_in, dest_mode);
+
+ /* make sure we do visit the cond_value later... */
+ ARR_APP1(ir_node*, check_later, cond_value);
+
+ return phi;
+}
+
+static void adjust_method_type(ir_type *method_type)
+{
+ int i;
+ int n_params;
+ int n_res;
+
+ n_params = get_method_n_params(method_type);
+ for (i = 0; i < n_params; ++i) {
+ ir_type *param = get_method_param_type(method_type, i);
+ if (get_type_mode(param) == mode_b) {
+ set_method_param_type(method_type, i, create_lowered_type());
+ }
+ }
+
+ n_res = get_method_n_ress(method_type);
+ for (i = 0; i < n_res; ++i) {
+ ir_type *res_type = get_method_res_type(method_type, i);
+ if (get_type_mode(res_type) == mode_b) {
+ set_method_res_type(method_type, i, create_lowered_type());
+ }
+ }