diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-03 07:18:13 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-03 07:18:13 +0000 |
commit | 7b4df2bf95d2254756f6509ee57a90c398baf81b (patch) | |
tree | c05cbaa50ad24f72ed0785372d754691a8e79a2b /gcc/expr.c | |
parent | a930fe51508f431a97eaeb0f546d4b26b40dbfa1 (diff) | |
download | gcc-7b4df2bf95d2254756f6509ee57a90c398baf81b.zip gcc-7b4df2bf95d2254756f6509ee57a90c398baf81b.tar.gz gcc-7b4df2bf95d2254756f6509ee57a90c398baf81b.tar.bz2 |
poly_int: PUSH_ROUNDING
PUSH_ROUNDING is difficult to convert to a hook since there is still
a lot of conditional code based on it. It isn't clear that a direct
conversion with checks for null hooks is the right thing to do.
Rather than untangle that, this patch converts all implementations
that do something to out-of-line functions that have the same
interface as a hook would have. This should at least help towards
any future hook conversion.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* config/cr16/cr16-protos.h (cr16_push_rounding): Declare.
* config/cr16/cr16.h (PUSH_ROUNDING): Move implementation to...
* config/cr16/cr16.c (cr16_push_rounding): ...this new function.
* config/h8300/h8300-protos.h (h8300_push_rounding): Declare.
* config/h8300/h8300.h (PUSH_ROUNDING): Move implementation to...
* config/h8300/h8300.c (h8300_push_rounding): ...this new function.
* config/i386/i386-protos.h (ix86_push_rounding): Declare.
* config/i386/i386.h (PUSH_ROUNDING): Move implementation to...
* config/i386/i386.c (ix86_push_rounding): ...this new function.
* config/m32c/m32c-protos.h (m32c_push_rounding): Take and return
a poly_int64.
* config/m32c/m32c.c (m32c_push_rounding): Likewise.
* config/m68k/m68k-protos.h (m68k_push_rounding): Declare.
* config/m68k/m68k.h (PUSH_ROUNDING): Move implementation to...
* config/m68k/m68k.c (m68k_push_rounding): ...this new function.
* config/pdp11/pdp11-protos.h (pdp11_push_rounding): Declare.
* config/pdp11/pdp11.h (PUSH_ROUNDING): Move implementation to...
* config/pdp11/pdp11.c (pdp11_push_rounding): ...this new function.
* config/stormy16/stormy16-protos.h (xstormy16_push_rounding): Declare.
* config/stormy16/stormy16.h (PUSH_ROUNDING): Move implementation to...
* config/stormy16/stormy16.c (xstormy16_push_rounding): ...this new
function.
* expr.c (emit_move_resolve_push): Treat the input and result
of PUSH_ROUNDING as a poly_int64.
(emit_move_complex_push, emit_single_push_insn_1): Likewise.
(emit_push_insn): Likewise.
* lra-eliminations.c (mark_not_eliminable): Likewise.
* recog.c (push_operand): Likewise.
* reload1.c (elimination_effects): Likewise.
* rtlanal.c (nonzero_bits1): Likewise.
* calls.c (store_one_arg): Likewise. Require the padding to be
known at compile time.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256155
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 23 |
1 files changed, 10 insertions, 13 deletions
@@ -3347,10 +3347,9 @@ rtx emit_move_resolve_push (machine_mode mode, rtx x) { enum rtx_code code = GET_CODE (XEXP (x, 0)); - HOST_WIDE_INT adjust; rtx temp; - adjust = GET_MODE_SIZE (mode); + poly_int64 adjust = GET_MODE_SIZE (mode); #ifdef PUSH_ROUNDING adjust = PUSH_ROUNDING (adjust); #endif @@ -3359,14 +3358,12 @@ emit_move_resolve_push (machine_mode mode, rtx x) else if (code == PRE_MODIFY || code == POST_MODIFY) { rtx expr = XEXP (XEXP (x, 0), 1); - HOST_WIDE_INT val; gcc_assert (GET_CODE (expr) == PLUS || GET_CODE (expr) == MINUS); - gcc_assert (CONST_INT_P (XEXP (expr, 1))); - val = INTVAL (XEXP (expr, 1)); + poly_int64 val = rtx_to_poly_int64 (XEXP (expr, 1)); if (GET_CODE (expr) == MINUS) val = -val; - gcc_assert (adjust == val || adjust == -val); + gcc_assert (known_eq (adjust, val) || known_eq (adjust, -val)); adjust = val; } @@ -3408,11 +3405,11 @@ emit_move_complex_push (machine_mode mode, rtx x, rtx y) bool imag_first; #ifdef PUSH_ROUNDING - unsigned int submodesize = GET_MODE_SIZE (submode); + poly_int64 submodesize = GET_MODE_SIZE (submode); /* In case we output to the stack, but the size is smaller than the machine can push exactly, we need to use move instructions. */ - if (PUSH_ROUNDING (submodesize) != submodesize) + if (maybe_ne (PUSH_ROUNDING (submodesize), submodesize)) { x = emit_move_resolve_push (mode, x); return emit_move_insn (x, y); @@ -4132,7 +4129,7 @@ static void emit_single_push_insn_1 (machine_mode mode, rtx x, tree type) { rtx dest_addr; - unsigned rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode)); + poly_int64 rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode)); rtx dest; enum insn_code icode; @@ -4147,7 +4144,7 @@ emit_single_push_insn_1 (machine_mode mode, rtx x, tree type) if (maybe_expand_insn (icode, 1, ops)) return; } - if (GET_MODE_SIZE (mode) == rounded_size) + if (known_eq (GET_MODE_SIZE (mode), rounded_size)) dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx); /* If we are to pad downward, adjust the stack pointer first and then store X into the stack location using an offset. This is @@ -4375,9 +4372,9 @@ emit_push_insn (rtx x, machine_mode mode, tree type, rtx size, and such small pushes do rounding that causes trouble. */ && ((!targetm.slow_unaligned_access (word_mode, align)) || align >= BIGGEST_ALIGNMENT - || (PUSH_ROUNDING (align / BITS_PER_UNIT) - == (align / BITS_PER_UNIT))) - && (HOST_WIDE_INT) PUSH_ROUNDING (INTVAL (size)) == INTVAL (size)) + || known_eq (PUSH_ROUNDING (align / BITS_PER_UNIT), + align / BITS_PER_UNIT)) + && known_eq (PUSH_ROUNDING (INTVAL (size)), INTVAL (size))) { /* Push padding now if padding above and stack grows down, or if padding below and stack grows up. |