+2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com>
+
+ * config/nds32/nds32-predicates.c
+ (nds32_valid_stack_push_pop): Rename to ...
+ (nds32_valid_stack_push_pop_p): ... this.
+ * config/nds32/nds32-protos.h: Likewise.
+ * config/nds32/predicates.md: Likewise.
+
2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.c (nds32_gen_stack_v3push): Rename to ...
3. The last element must be stack adjustment rtx.
See the prologue/epilogue implementation for details. */
bool
-nds32_valid_stack_push_pop (rtx op, bool push_p)
+nds32_valid_stack_push_pop_p (rtx op, bool push_p)
{
int index;
int total_count;
int rest_count;
int first_regno;
+ int save_fp, save_gp, save_lp;
rtx elt;
rtx elt_reg;
rtx elt_mem;
The $sp adjustment rtx, $fp push rtx, $gp push rtx,
and $lp push rtx are excluded. */
+ /* Detect whether we have $fp, $gp, or $lp in the parallel rtx. */
+ save_fp = reg_mentioned_p (gen_rtx_REG (SImode, FP_REGNUM), op);
+ save_gp = reg_mentioned_p (gen_rtx_REG (SImode, GP_REGNUM), op);
+ save_lp = reg_mentioned_p (gen_rtx_REG (SImode, LP_REGNUM), op);
/* Exclude last $sp adjustment rtx. */
rest_count = total_count - 1;
/* Exclude $fp, $gp, and $lp if they are in the parallel rtx. */
- if (cfun->machine->fp_size)
+ if (save_fp)
rest_count--;
- if (cfun->machine->gp_size)
+ if (save_gp)
rest_count--;
- if (cfun->machine->lp_size)
+ if (save_lp)
rest_count--;
if (rest_count > 0)
/* Check $fp/$gp/$lp one by one.
We use 'push_p' to pick up reg rtx and mem rtx. */
- if (cfun->machine->fp_size)
+ if (save_fp)
{
elt = XVECEXP (op, 0, index);
elt_mem = push_p ? SET_DEST (elt) : SET_SRC (elt);
|| REGNO (elt_reg) != FP_REGNUM)
return false;
}
- if (cfun->machine->gp_size)
+ if (save_gp)
{
elt = XVECEXP (op, 0, index);
elt_mem = push_p ? SET_DEST (elt) : SET_SRC (elt);
|| REGNO (elt_reg) != GP_REGNUM)
return false;
}
- if (cfun->machine->lp_size)
+ if (save_lp)
{
elt = XVECEXP (op, 0, index);
elt_mem = push_p ? SET_DEST (elt) : SET_SRC (elt);
(match_code "parallel")
{
/* To verify 'push' operation, pass 'true' for the second argument.
- See the implementation in nds32.c for details. */
- return nds32_valid_stack_push_pop (op, true);
+ See the implementation in nds32-predicates.c for details. */
+ return nds32_valid_stack_push_pop_p (op, true);
})
(define_special_predicate "nds32_stack_pop_operation"
(match_code "parallel")
{
/* To verify 'pop' operation, pass 'false' for the second argument.
- See the implementation in nds32.c for details. */
- return nds32_valid_stack_push_pop (op, false);
+ See the implementation in nds32-predicates.c for details. */
+ return nds32_valid_stack_push_pop_p (op, false);
})
;; ------------------------------------------------------------------------