> > PSImode is 20 bits, fits in a 20 bit register, and uses 20 bit operations. > > Then why do you need this change?
Because parts of the gcc code use the byte size instead of the bit size, or round up, or assume powers-of-two sizes. > > - TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type))); > > + TYPE_SIZE (type) = bitsize_int (GET_MODE_PRECISION (TYPE_MODE > > (type))); TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE > > (type))); break; > > What are GET_MODE_BITSIZE and GET_MODE_PRECISION for PSImode? It *should* be 20 and 20 for msp430. But GET_MODE_BITSIZE returns 32, because it's a macro that does GET_MODE_SIZE * BITS_PER_UNIT, so it cannot return 20. > > If a type is 17-20 bits, PSImode is chosen. If it's 21 bits or > > larger, SImode is chosen. If it's 16 or fewer bits, HImode is chosen. > > Size or precision? That's the crux of the matter. GCC typically uses size for "fits in a" tests.