On 12/30/24 8:16 AM, Richard Sandiford wrote:
The divisor is by definition 1. I think dropping it would make the
loop more obviously correct, since the same assumption is implicit in
the loop body.
I'll likely pick this up as Robin is on PTO for the next ~10 days. So
just to be 100% clear you want the loop iteration to look like:
for (unsigned i = 0; i < GET_MODE_SIZE; i++)
Which seems sensible. Just want to be sure as I haven't been following
too closely.
+ i++)
{
- unsigned HOST_WIDE_INT value = 0;
- unsigned int limit = MIN (nelts - i, elts_per_int);
- for (unsigned int j = 0; j < limit; ++j)
- {
- auto elt = INTVAL (CONST_VECTOR_ELT (x, i + j));
- value |= (elt & mask) << (j * elt_bits);
- }
- output_constant_pool_2 (int_mode, gen_int_mode (value, int_mode),
- i != 0 ? MIN (align, int_bits) : align);
+ unsigned HOST_WIDE_INT value = buffer[i];
+ output_constant_pool_2 (byte_mode, gen_int_mode (value, byte_mode),
+ i == 0 ? 0 : 1);
This should be i == 0 ? align : 1
OK with those three changes, thanks. I tested on aarch64 and similarly
saw no regressions. I don't think we need to test big-endian aarch64
specifically.
ACK on the testing. I could fire up s390x as a final sanity check if
you think it's worthwhile; it takes a day or so in qemu, but it's easy
enough to fire and forget...
jeff