pat = & XEXP (*pat, 0);
break;
+ case UNSPEC:
+ if (XINT (*pat, 1) == UNSPEC_TRUNC_NOOP)
+ pat = & XVECEXP (*pat, 0, 0);
+ return pat;
+
case FLOAT_TRUNCATE:
if (!flag_unsafe_math_optimizations)
return pat;
static int
convert_regs_entry (void)
{
+ tree params = DECL_ARGUMENTS (current_function_decl);
+ tree p;
+ HARD_REG_SET incoming_regs;
+ rtx inc_rtx;
+
int inserted = 0;
edge e;
edge_iterator ei;
- /* Load something into each stack register live at function entry.
+ /* Find out which registers were used as argument passing registers. */
+
+ CLEAR_HARD_REG_SET (incoming_regs);
+ for (p = params; p; p = TREE_CHAIN (p))
+ {
+ inc_rtx = DECL_INCOMING_RTL (p);
+
+ if (REG_P (inc_rtx)
+ && IN_RANGE (REGNO (inc_rtx), FIRST_STACK_REG, LAST_STACK_REG))
+ SET_HARD_REG_BIT (incoming_regs, REGNO (inc_rtx));
+ }
+
+ /* Load something into remaining stack register live at function entry.
Such live registers can be caused by uninitialized variables or
functions not returning values on all paths. In order to keep
the push/pop code happy, and to not scrog the register stack, we
bi->stack_in.reg[++top] = reg;
+ /* Skip argument passing registers. */
+ if (TEST_HARD_REG_BIT (incoming_regs, reg))
+ continue;
+
init = gen_rtx_SET (VOIDmode,
FP_MODE_REG (FIRST_STACK_REG, SFmode),
not_a_num);