Why don't we switch to C like floating pointed arithmetic instead of automatic expansion to reals?
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Fri Aug 5 01:43:48 PDT 2016
On Friday, 5 August 2016 at 08:17:00 UTC, Ilya Yaroshenko wrote:
> 1. Could you please provide an assembler example with clang or
> recent gcc?
I have better: compile your favorite project with
-Wdouble-promotion and enjoy the rain of warnings.
But try it yourself:
float foo(float a, float b) {
return 3.0 * a / b;
}
GCC 5.3 gives me
foo(float, float):
cvtss2sd xmm0, xmm0
cvtss2sd xmm1, xmm1
mulsd xmm0, QWORD PTR .LC0[rip]
divsd xmm0, xmm1
cvtsd2ss xmm0, xmm0
ret
.LC0:
.long 0
.long 1074266112
Which clearly uses double precision.
And clang 3.8:
LCPI0_0:
.quad 4613937818241073152 # double 3
foo(float, float): # @foo(float,
float)
cvtss2sd xmm0, xmm0
mulsd xmm0, qword ptr [rip + .LCPI0_0]
cvtss2sd xmm1, xmm1
divsd xmm0, xmm1
cvtsd2ss xmm0, xmm0
ret
which uses double as well.
> 2. C compilers not promote double to 80-bit reals anyway.
VC++ does it on 32 bits build, but initialize the x87 unit to
double precision (on 80 bits floats - yes that's a x87 setting).
VC++ will keep using float for x64 builds.
Intel compiler use compiler flags to promote or not.
In case you were wondering, this is not limited to X86/64 as GCC
gives me on ARM:
foo(float, float):
fmov d2, 3.0e+0
fcvt d0, s0
fmul d0, d0, d2
fcvt d1, s1
fdiv d0, d0, d1
fcvt s0, d0
ret
Which also promotes to double.
More information about the Digitalmars-d
mailing list