https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108623

--- Comment #3 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
The explanation is in the SET_TYPE_VECTOR_SUBPARTS code:

      /* 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].  */

If we're happy to extend to 16 bits then things become simpler.
We can just use one byte per coefficient.

Reply via email to