On Wednesday, 28 November 2018 at 21:58:16 UTC, kinke wrote:
You're not using naked asm; this entails a prologue (spilling the params to stack etc.). Additionally, LDC doesn't really like accessing params and locals in DMD-style inline asm, see https://github.com/ldc-developers/ldc/issues/2854.

You can check the final asm trivially online, e.g., https://run.dlang.io/is/e0c2Ly (click the ASM button). You'll see that your params are in R8, RDX and RCX (reversed order as mentioned earlier).

Hi again.

I just tried a new debugger: x64dbg. I really like it, it is not the bloatware I got used to nowadays.

It turns out that LDC2's parameter/register handling is really clever:

- Register saving/restoring: fully automatic. It analyzes my asm and saves/restores only those regs I overwrite. - Parameters: Reversed Microsoft x64 calling convention, just as you said. Parameters in the registers will be 'spilled' onto the stack no matter if I'm using them by their names or by the register. Maybe this is not too clever but as I can use the params by their name from anywhere, it can make my code nicer. - Must not use the "ret" instruction because it will take it literally and will skip the auto-generated exit code.

In conclusion: Maybe LDC2 generates a lot of extra code, but I always make longer asm routines, so it's not a problem for me at all while it helps me a lot.

Reply via email to