Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
struct alignment in src/lib/libc/arch/m68k/softfloat
Am 17.09.2025 um 13:32 schrieb Nathanial Sloss:
> Module Name: src
> Committed By: nat
> Date: Wed Sep 17 11:32:06 UTC 2025
>
> Modified Files:
> src/lib/libc/arch/m68k/softfloat: softfloat.h
>
> Log Message:
> Store 80 bit floats properly on m68k.
>
> The libc/softfloat would store the high word as a short, where as gcc
> will store it as a long with the sign and 15 bit exponent in the high bytes.
>
> I had to use the __packed attribute as they were stored with an 8-byte
> alignment....Why????
struct floatx80 {
uint64_t lo;
uint16_t hi;
};
When you have an array of this type, each access to arr[i].lo should be
aligned at an 8-byte boundary. Therefore, there's 6 bytes of padding at
the end of the struct.
On some architectures such as sparc, this padding is necessary to
prevent SIGBUS, on other architectures such as x86_64, accessing an
unaligned object results in bad performance, due to overlapping reads.
C23 6.7.3.2p16 doesn't directly impose any alignment requirements on a
struct or its members, other that each member has to be aligned
"appropriate to its type". On the other hand, C23 6.7.3.2p19 allows
unnamed padding at the end of a struct, so that sizeof(arr) can be the
same as sizeof(arr[0]) * array_length(arr).
Roland
Home |
Main Index |
Thread Index |
Old Index