On Saturday, 18 August 2018 at 04:16:11 UTC, Sean O'Connor wrote:
What calling convention is used for assembly language in Linux
AMD64?
Normally the parameters go in fixed order into designated
registers.
import std.stdio;
// Linux AMD64
float* test(float *x,ulong y){
asm{
naked;
align 16;
mov RAX,RDI;
ret;
}
}
void main(){
float[] f=new float[16];
writeln(&f[0]);
float* a=test(&f[0],7);
writeln(a);
}
If the ulong y parameter is removed from the function
definition the pointer x goes into RDI as expected. When y is
added it all goes wrong. According to AMD64 the pointer should
stay in RDI and the ulong go into RSI.
If you compile with DMD, DMD passes the arguments in reverse
order. LDC and GDC use normal C calling conventions.