https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94609
--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> --- LP64 has: (gdb) disass _D8runnable6test52FZv Dump of assembler code for function _D8runnable6test52FZv: 0x000000000040943a <+0>: push %rbp 0x000000000040943b <+1>: mov %rsp,%rbp 0x000000000040943e <+4>: push %r13 0x0000000000409440 <+6>: push %r12 0x0000000000409442 <+8>: push %rbx 0x0000000000409443 <+9>: sub $0x28,%rsp 0x0000000000409447 <+13>: lea -0x40(%rbp),%rax 0x000000000040944b <+17>: mov %rax,%rdi 0x000000000040944e <+20>: callq 0x409326 <_D8runnable7test52aFZS8runnable7test52aFZ6Scoped> The argument is passed in RDI. But x32 has Dump of assembler code for function _D8runnable6test52FZv: 0x00407a33 <+0>: push %rbp 0x00407a34 <+1>: mov %esp,%ebp 0x00407a36 <+3>: push %rbx 0x00407a37 <+4>: sub $0x18,%esp 0x00407a3a <+7>: callq 0x4078f0 <_D8runnable7test52aFZS8runnable7test52aFZ6Scoped> RDI/EDI isn't used to pass argument. Is this done on purpose? Where does D frontend decide how to pass argument?