Peter Maydell <peter.mayd...@linaro.org> writes: > On 18 January 2018 at 14:59, Philippe Mathieu-Daudé <f4...@amsat.org> wrote: >> My comment was for a previous line: >> >> uint64_t frac : 64; >> >> I don't have enough compiler knowledge to be sure how this bitfield is >> interpreted by the compiler. I understood the standard as bitfields are >> for 'unsigned', and for IL32 we have sizeof(unsigned) = 32, so I wonder >> how a :64 bitfield ends (bits >= 32 silently truncated?). > > Defining a 64-bit bitfield is a bit pointless (why not just use > uint64_t?) but there's nothing particularly different for IL32P64 here. > The spec says the underlying type is _Bool, signed int, unsigned > into, or an implementation defined type. For QEMU's hosts 'int' > is always 32 bits, so if gcc and clang allow bitfields on a > 64-bit type like uint64_t (as an impdef extension) then they > should work on all hosts. (In any case it needs to either work > or give a compiler error, silent truncation isn't an option.)
Using explicit size types and an attribute on FloatClass seemed to be enough: /* * Classify a floating point number. Everything above float_class_qnan * is a NaN so cls >= float_class_qnan is any NaN. */ typedef enum __attribute__ ((__packed__)) { float_class_unclassified, float_class_zero, float_class_normal, float_class_inf, float_class_qnan, /* all NaNs from here */ float_class_snan, float_class_dnan, float_class_msnan, /* maybe silenced */ } FloatClass; /* * Structure holding all of the decomposed parts of a float. The * exponent is unbiased and the fraction is normalized. All * calculations are done with a 64 bit fraction and then rounded as * appropriate for the final format. * * Thanks to the packed FloatClass a decent compiler should be able to * fit the whole structure into registers and avoid using the stack * for parameter passing. */ typedef struct { uint64_t frac; int32_t exp; FloatClass cls; bool sign; } FloatParts; -- Alex Bennée