Simplify pad_below implementation
authorRichard Sandiford <richard.sandiford@linaro.org>
Mon, 21 Aug 2017 14:52:43 +0000 (14:52 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 21 Aug 2017 14:52:43 +0000 (14:52 +0000)
This patch simplifies the alignment calculations in pad_below.
The first arm of the "if" was:

- taking GET_MODE_BITSIZE (always equal to GET_MODE_SIZE * BITS_PER_UNIT),
- rounding up to the next multiple of PARM_BOUNDARY
- converting bits to bytes and
- subtracting the GET_MODE_SIZE

so was in effect calculating the number of bytes needed to round
GET_MODE_SIZE up to (PARM_BOUNDARY / BITS_PER_UNIT).  That can be
done more directly as -size & (align - 1), which is easier to
convert to variable-sized modes.

2017-08-21  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* function.c (pad_below): Simplify padding calculation.

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

gcc/ChangeLog
gcc/function.c

index 4c0b975e26aa299c97c23dea934240e42df75b5e..26b34a363aa39817d02d129b91438cdf83b25b32 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-21  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * function.c (pad_below): Simplify padding calculation.
+
 2017-08-21  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 20c287bc8e01436831814ad7f375b37b3bb49895..7fce0c530b8ff91986aafca7822bd1fa842ac2b7 100644 (file)
@@ -4322,21 +4322,16 @@ pad_to_arg_alignment (struct args_size *offset_ptr, int boundary,
 static void
 pad_below (struct args_size *offset_ptr, machine_mode passed_mode, tree sizetree)
 {
+  unsigned int align = PARM_BOUNDARY / BITS_PER_UNIT;
   if (passed_mode != BLKmode)
-    {
-      if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
-       offset_ptr->constant
-         += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
-              / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
-             - GET_MODE_SIZE (passed_mode));
-    }
+    offset_ptr->constant += -GET_MODE_SIZE (passed_mode) & (align - 1);
   else
     {
       if (TREE_CODE (sizetree) != INTEGER_CST
-         || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
+         || (TREE_INT_CST_LOW (sizetree) & (align - 1)) != 0)
        {
          /* Round the size up to multiple of PARM_BOUNDARY bits.  */
-         tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
+         tree s2 = round_up (sizetree, align);
          /* Add it in.  */
          ADD_PARM_SIZE (*offset_ptr, s2);
          SUB_PARM_SIZE (*offset_ptr, sizetree);