static void arm_generate_code(FILE *output, const char *cup_name) { be_gas_emit_types = false; be_gas_elf_type_char = '%'; be_begin(output, cup_name); unsigned *const sp_is_non_ssa = rbitset_alloca(N_ARM_REGISTERS); rbitset_set(sp_is_non_ssa, REG_SP); arm_emit_file_prologue(); foreach_irp_irg(i, irg) { if (!be_step_first(irg)) continue; struct obstack *obst = be_get_be_obst(irg); be_birg_from_irg(irg)->isa_link = OALLOCZ(obst, arm_irg_data_t); be_birg_from_irg(irg)->non_ssa_regs = sp_is_non_ssa; arm_select_instructions(irg); be_step_schedule(irg); be_timer_push(T_RA_PREPARATION); be_sched_fix_flags(irg, &arm_reg_classes[CLASS_arm_flags], NULL, NULL, NULL); be_timer_pop(T_RA_PREPARATION); be_step_regalloc(irg, &arm_regalloc_if); be_timer_push(T_EMIT); arm_finish_graph(irg); arm_emit_function(irg); be_timer_pop(T_EMIT); be_step_last(irg); } be_finish(); }
/** * Transforms the standard Firm graph into an ARM firm graph. */ static void arm_select_instructions(ir_graph *irg) { /* transform nodes into assembler instructions */ be_timer_push(T_CODEGEN); arm_transform_graph(irg); be_timer_pop(T_CODEGEN); be_dump(DUMP_BE, irg, "code-selection"); /* do local optimizations (mainly CSE) */ local_optimize_graph(irg); /* do code placement, to optimize the position of constants */ place_code(irg); }