diff options
Diffstat (limited to 'gcc/recog.c')
-rw-r--r-- | gcc/recog.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/gcc/recog.c b/gcc/recog.c index 99031df..43e8781 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -1258,33 +1258,35 @@ nonmemory_operand (rtx op, machine_mode mode) int push_operand (rtx op, machine_mode mode) { - unsigned int rounded_size = GET_MODE_SIZE (mode); - -#ifdef PUSH_ROUNDING - rounded_size = PUSH_ROUNDING (rounded_size); -#endif - if (!MEM_P (op)) return 0; if (mode != VOIDmode && GET_MODE (op) != mode) return 0; + poly_int64 rounded_size = GET_MODE_SIZE (mode); + +#ifdef PUSH_ROUNDING + rounded_size = PUSH_ROUNDING (MACRO_INT (rounded_size)); +#endif + op = XEXP (op, 0); - if (rounded_size == GET_MODE_SIZE (mode)) + if (known_eq (rounded_size, GET_MODE_SIZE (mode))) { if (GET_CODE (op) != STACK_PUSH_CODE) return 0; } else { + poly_int64 offset; if (GET_CODE (op) != PRE_MODIFY || GET_CODE (XEXP (op, 1)) != PLUS || XEXP (XEXP (op, 1), 0) != XEXP (op, 0) - || !CONST_INT_P (XEXP (XEXP (op, 1), 1)) - || INTVAL (XEXP (XEXP (op, 1), 1)) - != ((STACK_GROWS_DOWNWARD ? -1 : 1) * (int) rounded_size)) + || !poly_int_rtx_p (XEXP (XEXP (op, 1), 1), &offset) + || (STACK_GROWS_DOWNWARD + ? maybe_ne (offset, -rounded_size) + : maybe_ne (offset, rounded_size))) return 0; } |