diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-08-21 14:52:43 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-08-21 14:52:43 +0000 |
commit | b66fd4fc3777e1d072a63529b70b2ff777e6efcb (patch) | |
tree | 16ed38c19f780a1c7f311546e6eeffca79e4eac6 /gcc/function.c | |
parent | 427764163985bbfb309ee43a85605d6b32c225d5 (diff) | |
download | gcc-b66fd4fc3777e1d072a63529b70b2ff777e6efcb.zip gcc-b66fd4fc3777e1d072a63529b70b2ff777e6efcb.tar.gz gcc-b66fd4fc3777e1d072a63529b70b2ff777e6efcb.tar.bz2 |
Simplify pad_below implementation
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/gcc/function.c b/gcc/function.c index 20c287b..7fce0c5 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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); |