Inline assembly question

Basile B. b2.temp at gmx.com
Mon Nov 13 18:40:42 UTC 2017


On Sunday, 12 November 2017 at 11:01:39 UTC, Dibyendu Majumdar 
wrote:
> Hi,
>
> I have recently started work on building a VM for Lua (actually 
> a derivative of Lua) in X86-64 assembly. I am using the dynasm 
> tool that is part of LuaJIT. I was wondering whether I could 
> also write this in D's inline assembly perhaps, but there is 
> one aspect that I am not sure how to do.
>
> The assembly code uses static allocation of registers, but 
> because of the differences in how registers are used in Win64 
> versus Unix X64 - different registers are assigned depending on 
> the architecture. dynasm makes this easy to do using macros; 
> e.g. below.
>
> |.if X64WIN
> |.define CARG1,		rcx		// x64/WIN64 C call arguments.
> |.define CARG2,		rdx
> |.define CARG3,		r8
> |.define CARG4,		r9
> |.else
> |.define CARG1,		rdi		// x64/POSIX C call arguments.
> |.define CARG2,		rsi
> |.define CARG3,		rdx
> |.define CARG4,		rcx
> |.endif
>
> With above in place, the code can use the mnemonics to refer to 
> the registers rather than the registers themselves. This allows 
> the assembly code to be coded once for both architectures.
>
> How would one do this in D inline assembly?
>
> Thanks and Regards
> Dibyendu

TBH I wonder if this is not worth a enhancement (or even a DIP)
to have in asm blocks a special alias syntax...

{
     asm
     {
         version(...)
         {
            alias First = RDI;
            alias Second = RSI;
            // ...
         }
         else
         {
            alias First = RCX;
            alias Second = RDX;
         }
         mov First, Second;
         call aFunctionWithOneParam; // called with 2nd parent 
param as 1st param
     }
}

since the whole mixin solution make the custom asm unreadable 
just because of this problem.

And Even maybe some special identifiers since extern(...) may 
lead to problems...


More information about the Digitalmars-d-learn mailing list