On Fri, Oct 2, 2015 at 2:51 PM, Yulia Koval <vaalfr...@gmail.com> wrote: > Hi, > Here is a new patch. Added HJ's changes and review changes. > > Implement x86 interrupt attribute
+ incoming_stack_boundary + = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary + ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary); MAX (crtl->parm_stack_boundary, ix86_incoming_stack_boundary); +bool +ix86_epilogue_uses (int regno) +{ + /* If there are no caller-saved registers, we preserve all registers, + except for MMX and x87 registers which aren't supported when saving + and restoring registers. Don't explicitly save SP register since + it is always preserved. */ + return (cfun->machine->no_caller_saved_registers + && reg_names[regno][0] + && !fixed_regs[regno] + && !STACK_REGNO_P (regno) + && !MMX_REGNO_P (regno)); There is still a redundant check for reg_names with !fixed_regs. When member of fixed_regs is 0, we are sure that corresponding reg_names is non-null. As can be seen in ix86_conditional_register_usage, register names are squashed depending on target for non-existent registers in order to prevent their usage in "asm" statements. + /* If there are no caller-saved registers, add all registers + that are clobbered by the call. */ + for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++) + if (reg_names[i][0] + && !fixed_regs[i] + && (ix86_call_used_regs[i] == 1 + || (ix86_call_used_regs[i] & c_mask)) + && !STACK_REGNO_P (i) + && !MMX_REGNO_P (i)) And here. Uros.