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