Hello
I noticed a strange behaviour of the DMD compiler when it has to call a function with float arguments.

I build with the flags "-mcpu=avx2 -O -m64" under windows 64 bits using "DMD32 D Compiler v2.090.1-dirty"

I have the following function :
   float mul_add(float a, float b, float c); //Return a * b + c

When I try to call it :
   float f = d_mul_add(1.0, 2.0, 3.0);

I tested with other functions with float parameters, and there is the same problem.

Then the following instructions are generated :
        //Loads the values, as it can be expected
        vmovss xmm2,dword [rel 0x64830]
        vmovss xmm1,dword [rel 0x64834]
        vmovss xmm0,dword [rel 0x64838]
        //Why ?
        movq r8,xmm2
        movq rdx,xmm1
        movq rcx,xmm0
        //
        call 0x400   //0x400 is where the mul_add function is located

My questions are :
- Is there a reason why the registers xmm0/1/2 are saved in rcx/rdx/r8 before calling ? The calling convention specifies that the floating point parameters have to be put in xmm registers, and not GPR, unless you are using your own calling convention. - Why is it done using non-avx instructions ? Mixing AVX and non-AVX instructions may impact the speed greatly.

Any idea ? Thank you in advance.

Reply via email to