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