- /* Output the delay insns interleaved with the memory operations. */
- if (! store_p && current_function_epilogue_delay_list)
- {
- rtx delay_insns = current_function_epilogue_delay_list;
- rtx insn;
-
- /* The first delay insn goes after the restore of r1. */
- if (save_regs[1])
- {
- final_scan_insn (XEXP (delay_insns, 0), stream, 1, 0, 1);
- delay_insns = XEXP (delay_insns, 1);
- }
-
- while (delay_insns)
- {
- /* Find a memory operation that doesn't conflict with this insn. */
- for (mo_ptr = mem_op; mo_ptr->regno != 0; mo_ptr++)
- {
- if (mo_ptr->nregs)
- {
- int nregs = (mo_ptr->regno < FIRST_EXTENDED_REGISTER
- ? mo_ptr->nregs : 1);
- rtx ok_insns = delay_insns;
- int i;
-
- for (i = 0; i < nregs; i++)
- epilogue_dead_regs[mo_ptr->regno + i] = 1;
-
- while (ok_insns)
- {
- insn = XEXP (ok_insns, 0);
- ok_insns = XEXP (ok_insns, 1);
-
- if (! ok_for_epilogue_p (PATTERN (insn)))
- {
- for (i = 0; i < nregs; i++)
- epilogue_dead_regs[mo_ptr->regno + i] = 0;
- insn = 0;
- break; /* foreach delay insn */
- }
- }
- if (insn)
- {
- fprintf (stream, fmt, mo_ptr->nregs > 1 ? ".d" : "",
- reg_names[mo_ptr->regno], reg_names[31],
- mo_ptr->offset);
- mo_ptr->nregs = 0;
- break; /* foreach memory operation */
- }
- }
- }
- final_scan_insn (XEXP (delay_insns, 0), stream, 1, 0, 1);
- delay_insns = XEXP (delay_insns, 1);
- }
- }
-