return dwarf;
}
-/* return true if popretz pattern can be matched.
- set (reg 10 a0) (const_int 0)
- use (reg 10 a0)
- NOTE_INSN_EPILOGUE_BEG */
-static rtx_insn *
-riscv_zcmp_can_use_popretz (void)
-{
- rtx_insn *insn = NULL, *use = NULL, *clear = NULL;
-
- /* sequence stack for NOTE_INSN_EPILOGUE_BEG*/
- struct sequence_stack *outer_seq = get_current_sequence ()->next;
- if (!outer_seq)
- return NULL;
- insn = outer_seq->first;
- if (!insn || !NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_EPILOGUE_BEG)
- return NULL;
-
- /* sequence stack for the insn before NOTE_INSN_EPILOGUE_BEG*/
- outer_seq = outer_seq->next;
- if (outer_seq)
- insn = outer_seq->last;
-
- /* skip notes */
- while (insn && NOTE_P (insn))
- {
- insn = PREV_INSN (insn);
- }
- use = insn;
-
- /* match use (reg 10 a0) */
- if (use == NULL || !INSN_P (use) || GET_CODE (PATTERN (use)) != USE
- || !REG_P (XEXP (PATTERN (use), 0))
- || REGNO (XEXP (PATTERN (use), 0)) != A0_REGNUM)
- return NULL;
-
- /* match set (reg 10 a0) (const_int 0 [0]) */
- clear = PREV_INSN (use);
- if (clear != NULL && INSN_P (clear) && GET_CODE (PATTERN (clear)) == SET
- && REG_P (SET_DEST (PATTERN (clear)))
- && REGNO (SET_DEST (PATTERN (clear))) == A0_REGNUM
- && SET_SRC (PATTERN (clear)) == const0_rtx)
- return clear;
-
- return NULL;
-}
-
static void
riscv_gen_multi_pop_insn (bool use_multi_pop_normal, unsigned mask,
unsigned multipop_size)
if (!use_multi_pop_normal)
insn = emit_insn (
riscv_gen_multi_push_pop_insn (POP_IDX, multipop_size, regs_count));
- else if (rtx_insn *clear_a0_insn = riscv_zcmp_can_use_popretz ())
- {
- delete_insn (NEXT_INSN (clear_a0_insn));
- delete_insn (clear_a0_insn);
- insn = emit_jump_insn (
- riscv_gen_multi_push_pop_insn (POPRETZ_IDX, multipop_size, regs_count));
- }
else
insn = emit_jump_insn (
riscv_gen_multi_push_pop_insn (POPRET_IDX, multipop_size, regs_count));