digitalmars.D - Extended Double bytesize/alignment
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (45/45) Apr 04 2005 I looked up the size and alignment of the
I looked up the size and alignment of the
"long double" (IEEE 754 Extended Double),
at least if you count the default ABIs ?
(it is usually overridable at your peril)
It tends to vary a lot between CPU and OS...
Here is the table:
C "long double" / D "real"
==========================
PPC (64-bit FP registers)
Size Align
Mac OS X 8 4/8
Linux PPC 8 4/8
Linux PPC64* 8 8
IBM AIX "Double-Double"* 16 16
X86 (80-bit FP registers)
Windows 10 2
Linux X86 12 4
Linux X86_64 16 16
SPARC (64-bit FP registers)
"libcx" library (slow) 16 16
2 hardware regs (fast) 16 16
Note that both standard X86 and standard PPC
system ABIs put these "extended doubles" at
sub-optimal alignments, due to compatibility.
(the 32-bit ABIs, that is, not the 64-bit ABI)
(Both the Pentium and above and the PowerPC G3
and above, prefers that their 80-bit / 64-bit
registers are stored at "bigger" boundaries:
i.e. 128-bit and 64-bit aligned, respectively)
Neither implementation has a "real" 16-byte FP,
the X86 just stores a 80-bit with 0-padding and
the PPC uses 2 doubles with different magnitudes.
(does *not* follow the IEEE 754 Standard, AFAIK)
I don't have any SPARC, but I read that using
128-bit long doubles can be like 10 times slower...
(if they are being implemented in a software lib)
So they also look unusable for D's "real" type ?
Might as well wait until we get real Quad "FPUs"...
(before trying to support a 128-bit floating point)
--anders
* PS.
PPC64 ABI v1.4.1 uses 32-bit long, 64-bit double
and 64-bit long double, ABI v1.7.1 uses a 64-bit
long, 64-bit double and 128-bit "AIX" long double.
See http://www.linuxbase.org/spec/ELF/ppc64/
Apr 04 2005








=?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se>