poly_int: emit_single_push_insn_1
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 3 Jan 2018 07:18:05 +0000 (07:18 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 3 Jan 2018 07:18:05 +0000 (07:18 +0000)
This patch makes emit_single_push_insn_1 cope with polynomial mode sizes.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* expr.c (emit_single_push_insn_1): Treat mode sizes as polynomial.
Use plus_constant instead of gen_rtx_PLUS.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256154

gcc/ChangeLog
gcc/expr.c

index 660d354e49abf1cd1d1b9a4677b415ed9bb69f82..d37f05a5cfe2d5c70f8b12c44a819d4e92b5f228 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * expr.c (emit_single_push_insn_1): Treat mode sizes as polynomial.
+       Use plus_constant instead of gen_rtx_PLUS.
+
 2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index a82d9e41ae22e688c762659012a60a40177342d1..336673f059aaddf372422de001c98b944b2a6d3a 100644 (file)
@@ -4155,9 +4155,6 @@ emit_single_push_insn_1 (machine_mode mode, rtx x, tree type)
      access to type.  */
   else if (targetm.calls.function_arg_padding (mode, type) == PAD_DOWNWARD)
     {
-      unsigned padding_size = rounded_size - GET_MODE_SIZE (mode);
-      HOST_WIDE_INT offset;
-
       emit_move_insn (stack_pointer_rtx,
                      expand_binop (Pmode,
                                    STACK_GROWS_DOWNWARD ? sub_optab
@@ -4166,31 +4163,27 @@ emit_single_push_insn_1 (machine_mode mode, rtx x, tree type)
                                    gen_int_mode (rounded_size, Pmode),
                                    NULL_RTX, 0, OPTAB_LIB_WIDEN));
 
-      offset = (HOST_WIDE_INT) padding_size;
+      poly_int64 offset = rounded_size - GET_MODE_SIZE (mode);
       if (STACK_GROWS_DOWNWARD && STACK_PUSH_CODE == POST_DEC)
        /* We have already decremented the stack pointer, so get the
           previous value.  */
-       offset += (HOST_WIDE_INT) rounded_size;
+       offset += rounded_size;
 
       if (!STACK_GROWS_DOWNWARD && STACK_PUSH_CODE == POST_INC)
        /* We have already incremented the stack pointer, so get the
           previous value.  */
-       offset -= (HOST_WIDE_INT) rounded_size;
+       offset -= rounded_size;
 
-      dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
-                               gen_int_mode (offset, Pmode));
+      dest_addr = plus_constant (Pmode, stack_pointer_rtx, offset);
     }
   else
     {
       if (STACK_GROWS_DOWNWARD)
        /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC.  */
-       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
-                                 gen_int_mode (-(HOST_WIDE_INT) rounded_size,
-                                               Pmode));
+       dest_addr = plus_constant (Pmode, stack_pointer_rtx, -rounded_size);
       else
        /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC.  */
-       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
-                                 gen_int_mode (rounded_size, Pmode));
+       dest_addr = plus_constant (Pmode, stack_pointer_rtx, rounded_size);
 
       dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr);
     }