Strange instruction sequence with DMD while calling functions with float parameters

PatateVerte patate.verte at yahoo.com
Fri Feb 14 22:36:20 UTC 2020


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.


More information about the Digitalmars-d-learn mailing list