ir_node *be_new_Start(ir_graph *const irg, be_start_out const *const outs) { ir_node *const block = get_irg_start_block(irg); ir_node *const start = new_ir_node(NULL, irg, block, op_be_Start, mode_T, 0, NULL); unsigned const n_regs = isa_if->n_registers; /* Count the number of outsputs. */ unsigned k = 1; /* +1 for memory */ for (unsigned i = 0; i != n_regs; ++i) { if (outs[i] != BE_START_NO) ++k; } be_info_init_irn(start, arch_irn_flag_schedule_first, NULL, k); /* Set out requirements and registers. */ unsigned l = 0; arch_set_irn_register_req_out(start, l++, arch_memory_req); arch_register_t const *const regs = isa_if->registers; for (unsigned i = 0; i != n_regs; ++i) { if (outs[i] != BE_START_NO) { arch_register_t const *const reg = ®s[i]; bool const ignore = outs[i] == BE_START_IGNORE; arch_register_req_t const *const req = be_create_reg_req(irg, reg, ignore); arch_set_irn_register_req_out(start, l, req); arch_set_irn_register_out( start, l, reg); ++l; } } assert(l == k); return start; }
ir_node *be_new_Copy_before_reg(ir_node *const val, ir_node *const before, arch_register_t const *const reg) { ir_node *const block = get_nodes_block(before); ir_node *const copy = be_new_Copy(block, val); sched_add_before(before, copy); arch_set_irn_register_out(copy, 0, reg); return copy; }
void be_make_start_out(be_start_info_t *const info, ir_node *const start, unsigned const pos, arch_register_t const *const reg, bool const ignore) { info->pos = pos; info->irn = NULL; arch_register_req_t const *const req = ignore ? be_create_reg_req(be_get_be_obst(get_irn_irg(start)), reg, true) : reg->single_req; arch_set_irn_register_req_out(start, pos, req); arch_set_irn_register_out(start, pos, reg); }