On Friday, 5 August 2016 at 08:43:48 UTC, deadalnix wrote:
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


Gotta be careful with those examples. See this: https://godbolt.org/g/0yNUSG

float foo1(float a, float b) {
  return 3.42 * (a / b);
}

float foo2(float a, float b) {
  return 3.0 * (a / b);
}

float foo3(float a, float b) {
  return 3.0 * a / b;
}

float foo4(float a, float b) {
  return 3.0f * a / b;
}

foo1(float, float):
        divss   xmm0, xmm1
        cvtss2sd        xmm0, xmm0
        mulsd   xmm0, QWORD PTR .LC0[rip]
        cvtsd2ss        xmm0, xmm0
        ret
foo2(float, float):
        divss   xmm0, xmm1
        mulss   xmm0, DWORD PTR .LC2[rip]
        ret
foo3(float, float):
        cvtss2sd        xmm0, xmm0
        cvtss2sd        xmm1, xmm1
        mulsd   xmm0, QWORD PTR .LC4[rip]
        divsd   xmm0, xmm1
        cvtsd2ss        xmm0, xmm0
        ret
foo4(float, float):
        mulss   xmm0, DWORD PTR .LC2[rip]
        divss   xmm0, xmm1
        ret
.LC0:
        .long   4123168604
        .long   1074486312
.LC2:
        .long   1077936128
.LC4:
        .long   0
        .long   1074266112


It depends on the literal value, not just the type.

Reply via email to