inline ASM function calling conventions.

Basile B. b2.temp at gmx.com
Sun Sep 30 12:07:53 UTC 2018


On Sunday, 30 September 2018 at 11:53:17 UTC, Basile B. wrote:
> On Sunday, 30 September 2018 at 10:46:33 UTC, Sjoerd Nijboer 
> wrote:
>> [...]
>
> Hello, i think this should be here 
> (https://dlang.org/spec/abi.html) because myself i never 
> remember them correctly without playing a bit with a 
> disassembler.
> After playing a bit:
>

Without all the save/restore BS:

module runnable;

import std.stdio;

alias write4Int = writeln!(int,int,int,int);

struct MyStruct{int i;}

extern(D) void foo(ref MyStruct s1, ref MyStruct s2, ref MyStruct 
s3, ref MyStruct s4)
{
     asm
     {
         naked;
         mov     RCX, MyStruct.i.offsetof[RCX];
         mov     RDX, MyStruct.i.offsetof[RDX];
         mov     RSI, MyStruct.i.offsetof[RSI];
         mov     RDI, MyStruct.i.offsetof[RDI];
         call    write4Int;
         ret;
     }
}

void main()
{
     MyStruct s1 = MyStruct(1);
     MyStruct s2 = MyStruct(2);
     MyStruct s3 = MyStruct(3);
     MyStruct s4 = MyStruct(4);
     foo(s1, s2, s3, s4);
}


More information about the Digitalmars-d-learn mailing list