- /* create the barrier before the epilog code */
- be_epilog_create_barrier(abihelper, new_block);
-
- /* epilog code: an incsp */
- sp_proj = be_epilog_get_reg_value(abihelper, sp_reg);
- incsp = be_new_IncSP(sp_reg, new_block, sp_proj,
- BE_STACK_FRAME_SIZE_SHRINK, 0);
- be_epilog_set_reg_value(abihelper, sp_reg, incsp);
+ /* we need a restore instruction */
+ if (!cconv->omit_fp) {
+ ir_node *fp = be_prolog_get_reg_value(abihelper, fp_reg);
+ ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, fp);
+ arch_irn_add_flags(restore, arch_irn_flags_epilog);
+ arch_set_irn_register(restore, sp_reg);
+ be_epilog_set_reg_value(abihelper, sp_reg, restore);
+ } else {
+ /* epilog code: an incsp */
+ sp = be_epilog_get_reg_value(abihelper, sp_reg);
+ sp = be_new_IncSP(sp_reg, new_block, sp,
+ BE_STACK_FRAME_SIZE_SHRINK, 0);
+ arch_irn_add_flags(sp, arch_irn_flags_epilog);
+ be_epilog_set_reg_value(abihelper, sp_reg, sp);
+ }