diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-04-26 09:59:31 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-04-26 09:59:31 +0000 |
commit | 4ef8a24ca5416226d82ca272dea88e460ae2ce86 (patch) | |
tree | e81d8dc1edc113abec32121c11d2f3fa210706f8 /gcc/tree.h | |
parent | 25efa5fb15e36a1b35f3c9bbe38139d6244a35e3 (diff) | |
download | gcc-4ef8a24ca5416226d82ca272dea88e460ae2ce86.zip gcc-4ef8a24ca5416226d82ca272dea88e460ae2ce86.tar.gz gcc-4ef8a24ca5416226d82ca272dea88e460ae2ce86.tar.bz2 |
Add commentary to (SET_)TYPE_VECTOR_SUBPARTS
2019-04-26 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree.h (TYPE_VECTOR_SUBPARTS, SET_TYPE_VECTOR_SUBPARTS): Add
commentary about the encoding of precision.
From-SVN: r270593
Diffstat (limited to 'gcc/tree.h')
-rw-r--r-- | gcc/tree.h | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -3734,6 +3734,8 @@ TYPE_VECTOR_SUBPARTS (const_tree node) unsigned int precision = VECTOR_TYPE_CHECK (node)->type_common.precision; if (NUM_POLY_INT_COEFFS == 2) { + /* See the corresponding code in SET_TYPE_VECTOR_SUBPARTS for a + description of the encoding. */ poly_uint64 res = 0; res.coeffs[0] = HOST_WIDE_INT_1U << (precision & 0xff); if (precision & 0x100) @@ -3756,6 +3758,21 @@ SET_TYPE_VECTOR_SUBPARTS (tree node, poly_uint64 subparts) gcc_assert (index >= 0); if (NUM_POLY_INT_COEFFS == 2) { + /* We have two coefficients that are each in the range 1 << [0, 63], + so supporting all combinations would require 6 bits per coefficient + and 12 bits in total. Since the precision field is only 10 bits + in size, we need to be more restrictive than that. + + At present, coeff[1] is always either 0 (meaning that the number + of units is constant) or equal to coeff[0] (meaning that the number + of units is N + X * N for some target-dependent zero-based runtime + parameter X). We can therefore encode coeff[1] in a single bit. + + The most compact encoding would be to use mask 0x3f for coeff[0] + and 0x40 for coeff[1], leaving 0x380 unused. It's possible to + get slightly more efficient code on some hosts if we instead + treat the shift amount as an independent byte, so here we use + 0xff for coeff[0] and 0x100 for coeff[1]. */ unsigned HOST_WIDE_INT coeff1 = subparts.coeffs[1]; gcc_assert (coeff1 == 0 || coeff1 == coeff0); VECTOR_TYPE_CHECK (node)->type_common.precision |