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.

Reply via email to