https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118070

--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Each psABI defines the rules, and those can be quite different.
Right now, the target hook is prepared to decide on the modes/alignment used
for small _BitInts, whether the padding bits are unspecified or sign/zero
extended, what the limb mode size, what the limb abi mode/alignment is, what is
the limb ordering.
Right now we have just 3 targets supporting _BitInt, because those are the only
ones with defined psABI and backend implementation.
For _BitInt(N) or unsigned _BitInt(N), the x86_64 rules are:
N <= 64 handled like the smallest of {,un}signed {char,short,int,long} into
which it fits, with the padding bits unspecified.
N > 64, it is like unsigned long limbs[(N + 63) / 64]; (passed as struct
containing that though), little endian ordering of the limbs, again with
padding bits unspecified.
ia32 has it similar except s/64/32/g;s/63/31/g.
AArch64 has N <= 128 handled like the smallest of {,un}signed
{char,short,int,long,__int128} into which it fits, with the padding bits
unspecified.
N > 128 like unsigned __int128 limbs[(N + 127) / 128];, little endian, padding
bits unspecified, though for libgcc purposes the limb is 64-bit (only possible
when the limb ordering matches bit ordering within limbs).
There is also ARM 32-bit psABI but that e.g. requires sign/zero extension of
padding bits, currently the backend not implemented in GCC.
Other targets can define something different.
So, would say big-endian SSO imply just the limbs are byteswapped, or the limb
order is swapped, or both, same limb size and other parameters, something
different?

Reply via email to