-#if 0
-
-static void get_regparams_startbarrier(ir_graph *irg, ir_node **regparams, ir_node **startbarrier)
-{
- const ir_edge_t *edge;
- ir_node *start_block = get_irg_start_block(irg);
-
- *regparams = NULL;
- *startbarrier = NULL;
- foreach_out_edge(start_block, edge) {
- ir_node *src = get_edge_src_irn(edge);
-
- if(be_is_RegParams(src)) {
- *regparams = src;
- if(*startbarrier != NULL)
- return;
- }
- if(be_is_Barrier(src)) {
- *startbarrier = src;
- if(*regparams != NULL)
- return;
- }
- }
-
- panic("Couldn't find regparams and startbarrier!");
-}
-
-static void add_fpu_edges(be_irg_t *birg)
-{
- ir_graph *irg = be_get_birg_irg(birg);
- ir_node *regparams;
- ir_node *startbarrier;
- ir_node *fp_cw_reg;
- ir_node *end_block;
- const arch_env_t *arch_env = birg->main_env->arch_env;
- const arch_register_t *reg = &ia32_fp_cw_regs[REG_FPCW];
- int i, arity;
- int pos;
-
- get_regparams_startbarrier(irg, ®params, &startbarrier);
-
- fp_cw_reg = be_RegParams_append_out_reg(regparams, arch_env, reg);
-
- fp_cw_reg = be_Barrier_append_node(startbarrier, fp_cw_reg);
- pos = get_Proj_proj(fp_cw_reg);
- be_set_constr_single_reg(startbarrier, BE_OUT_POS(pos), reg);
- arch_set_irn_register(arch_env, fp_cw_reg, reg);
-
- /* search returns */
- end_block = get_irg_end_block(irg);
- arity = get_irn_arity(end_block);
- for(i = 0; i < arity; ++i) {
- int i2, arity2;
- ir_node *ret = get_irn_n(end_block, i);
- ir_node *end_barrier = NULL;
- ir_node *fp_cw_after_end_barrier;
- if(!be_is_Return(ret))
- continue;
-
- /* search the barrier before the return */
- arity2 = get_irn_arity(ret);
- for(i2 = 0; i2 < arity2; i2++) {
- ir_node *proj = get_irn_n(ret, i2);
-
- if(!is_Proj(proj))
- continue;
-
- end_barrier = get_Proj_pred(proj);
- if(!be_is_Barrier(end_barrier))
- continue;
- break;
- }
- assert(end_barrier != NULL);
-
- /* add fp_cw to the barrier */
- fp_cw_after_end_barrier = be_Barrier_append_node(end_barrier, fp_cw_reg);
- pos = get_Proj_proj(fp_cw_after_end_barrier);
- be_set_constr_single_reg(end_barrier, BE_OUT_POS(pos), reg);
- arch_set_irn_register(arch_env, fp_cw_after_end_barrier, reg);
-
- /* and append it to the return node */
- be_Return_append_node(ret, fp_cw_after_end_barrier);
- }
-}
-#endif
-
-
-#if 0
-static unsigned count_callee_saves(ia32_code_gen_t *cg)
-{
- unsigned callee_saves = 0;
- int c, num_reg_classes;
- arch_isa_if_t *isa;
-
- num_reg_classes = arch_isa_get_n_reg_class(isa);
- for(c = 0; c < num_reg_classes; ++c) {
- int r, num_registers;
- arch_register_class_t *regclass = arch_isa_get_reg_class(isa, c);
-
- num_registers = arch_register_class_n_regs(regclass);
- for(r = 0; r < num_registers; ++r) {
- arch_register_t *reg = arch_register_for_index(regclass, r);
- if(arch_register_type_is(reg, callee_save))
- callee_saves++;
- }
- }
-
- return callee_saves;
-}
-
-static void create_callee_save_regprojs(ia32_code_gen_t *cg, ir_node *regparams)
-{
- int c, num_reg_classes;
- arch_isa_if_t *isa;
- long n = 0;
-
- num_reg_classes = arch_isa_get_n_reg_class(isa);
- cg->initial_regs = obstack_alloc(cg->obst,
- num_reg_classes * sizeof(cg->initial_regs[0]));
-
- for(c = 0; c < num_reg_classes; ++c) {
- int r, num_registers;
- ir_node **initial_regclass;
- arch_register_class_t *regclass = arch_isa_get_reg_class(isa, c);
-
- num_registers = arch_register_class_n_regs(regclass);
- initial_regclass = obstack_alloc(num_registers * sizeof(initial_regclass[0]));
- for(r = 0; r < num_registers; ++r) {
- ir_node *proj;
- arch_register_t *reg = arch_register_for_index(regclass, r);
- if(!arch_register_type_is(reg, callee_save))
- continue;
-
- proj = new_r_Proj(irg, start_block, regparams, n);
- be_set_constr_single_reg(regparams, n, reg);
- arch_set_irn_register(cg->arch_env, proj, reg);
-
- initial_regclass[r] = proj;
- n++;
- }
- cg->initial_regs[c] = initial_regclass;
- }
-}
-
-static void callee_saves_obstack_grow(ia32_code_gen_t *cg)
-{
- int c, num_reg_classes;
- arch_isa_if_t *isa;
-
- for(c = 0; c < num_reg_classes; ++c) {
- int r, num_registers;
-
- num_registers = arch_register_class_n_regs(regclass);
- for(r = 0; r < num_registers; ++r) {
- ir_node *proj;
- arch_register_t *reg = arch_register_for_index(regclass, r);
- if(!arch_register_type_is(reg, callee_save))
- continue;
-
- proj = cg->initial_regs[c][r];
- obstack_ptr_grow(cg->obst, proj);
- }
- }
-}
-
-static unsigned count_parameters_in_regs(ia32_code_gen_t *cg)
-{
- return 0;
-}
-
-static void ia32_gen_prologue(ia32_code_gen_t *cg)
-{
- ir_graph *irg = cg->irg;
- ir_node *start_block = get_irg_start_block(irg);
- ir_node *sp;
- ir_node *regparams;
- int n_regparams_out;
-
- /* Create the regparams node */
- n_regparams_out = count_callee_saves(cg) + count_parameters_in_regs(cg);
- regparams = be_new_RegParams(irg, start_block, n_regparams_out);
-
- create_callee_save_regprojs(cg, regparams);
-
- /* Setup the stack */
- if(!omit_fp) {
- ir_node *bl = get_irg_start_block(env->irg);
- ir_node *curr_sp = be_abi_reg_map_get(reg_map, env->isa->sp);
- ir_node *curr_bp = be_abi_reg_map_get(reg_map, env->isa->bp);
- ir_node *noreg = ia32_new_NoReg_gp(cg);
- ir_node *push;
-
- /* push ebp */
- push = new_rd_ia32_Push(NULL, env->irg, bl, noreg, noreg, curr_bp, curr_sp, *mem);
- curr_sp = new_r_Proj(env->irg, bl, push, get_irn_mode(curr_sp), pn_ia32_Push_stack);
- *mem = new_r_Proj(env->irg, bl, push, mode_M, pn_ia32_Push_M);
-
- /* the push must have SP out register */
- arch_set_irn_register(env->aenv, curr_sp, env->isa->sp);
- set_ia32_flags(push, arch_irn_flags_ignore);
-
- /* move esp to ebp */
- curr_bp = be_new_Copy(env->isa->bp->reg_class, env->irg, bl, curr_sp);
- be_set_constr_single_reg(curr_bp, BE_OUT_POS(0), env->isa->bp);
- arch_set_irn_register(env->aenv, curr_bp, env->isa->bp);
- be_node_set_flags(curr_bp, BE_OUT_POS(0), arch_irn_flags_ignore);
-
- /* beware: the copy must be done before any other sp use */
- curr_sp = be_new_CopyKeep_single(env->isa->sp->reg_class, env->irg, bl, curr_sp, curr_bp, get_irn_mode(curr_sp));
- be_set_constr_single_reg(curr_sp, BE_OUT_POS(0), env->isa->sp);
- arch_set_irn_register(env->aenv, curr_sp, env->isa->sp);
- be_node_set_flags(curr_sp, BE_OUT_POS(0), arch_irn_flags_ignore);
-
- be_abi_reg_map_set(reg_map, env->isa->sp, curr_sp);
- be_abi_reg_map_set(reg_map, env->isa->bp, curr_bp);
- }
-
- sp = be_new_IncSP(sp, irg, start_block, initialsp, BE_STACK_FRAME_SIZE_EXPAND);
- set_irg_frame(irg, sp);
-}
-
-static void ia32_gen_epilogue(ia32_code_gen_t *cg)
-{
- int n_callee_saves = count_callee_saves(cg);
- int n_results_regs = 0;
- int barrier_size;
- ir_node *barrier;
- ir_node *end_block = get_irg_end_block(irg);
- ir_node **in;
-
- /* We have to make sure that all reloads occur before the stack frame
- gets destroyed, so we create a barrier for all callee-save and return
- values here */
- barrier_size = n_callee_saves + n_results_regs;
- barrier = be_new_Barrier(irg, end_block, barrier_size,
-
- /* simply remove the stack frame here */
- curr_sp = be_new_IncSP(env->isa->sp, env->irg, bl, curr_sp, BE_STACK_FRAME_SIZE_SHRINK);
- add_irn_dep(curr_sp, *mem);
-}
-#endif
-