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.