dmd asm output
nazriel
spam at dzfl.pl
Mon Apr 1 01:24:46 PDT 2013
On Monday, 1 April 2013 at 01:54:10 UTC, John Colvin wrote:
> I've been learning assembler a bit and I decided to have a look
> at what dmd spits out. I tried a simple function with arrays to
> see what vectorization gets done
>
> void addto(int[] a, int[] b) {
> a[] += b[];
> }
>
> dmd -O -release -inline -noboundscheck -gc -c test.d
>
> disassembled with gdb:
> _D3sse5addtoFAiAiZv:
> 0x0000000000000040 <+0>: push rbp
> 0x0000000000000041 <+1>: mov rbp,rsp
> 0x0000000000000044 <+4>: sub rsp,0x30
> 0x0000000000000048 <+8>: mov QWORD PTR [rbp-0x20],rdi
> 0x000000000000004c <+12>: mov QWORD PTR [rbp-0x18],rsi
> 0x0000000000000050 <+16>: mov QWORD PTR [rbp-0x10],rdx
> 0x0000000000000054 <+20>: mov QWORD PTR [rbp-0x8],rcx
> 0x0000000000000058 <+24>: mov rcx,QWORD PTR [rbp-0x18]
> 0x000000000000005c <+28>: mov rax,QWORD PTR [rbp-0x20]
> 0x0000000000000060 <+32>: mov rdx,rax
> 0x0000000000000063 <+35>: mov QWORD PTR [rbp-0x28],rdx
> 0x0000000000000067 <+39>: mov rdx,QWORD PTR [rbp-0x8]
> 0x000000000000006b <+43>: mov rdi,QWORD PTR [rbp-0x10]
> 0x000000000000006f <+47>: mov rsi,rdx
> 0x0000000000000072 <+50>: mov rdx,QWORD PTR [rbp-0x28]
> 0x0000000000000076 <+54>: call 0x7b
> <_D3sse5addtoFAiAiZv+59>
> 0x000000000000007b <+59>: mov rsp,rbp
> 0x000000000000007e <+62>: pop rbp
> 0x000000000000007f <+63>: ret
>
> This looks nothing like what I expected. At first I thought
> maybe it was due to a crazy calling convention, but adding
> extern(C) changed nothing.
>
> Can anyone explain what on earth is going on here? All that
> moving things on and off the stack, a call to the next line
> (strange) and then we're done bar the cleanup? I feel i must
> be missing something.
It just looks like wrong snippet. Probably GDB isn't best
assembly level debugger.
.text._D4test5addtoFAiAiZAi:08000044 public
_D4test5addtoFAiAiZAi
.text._D4test5addtoFAiAiZAi:08000044 _D4test5addtoFAiAiZAi proc
near
.text._D4test5addtoFAiAiZAi:08000044
.text._D4test5addtoFAiAiZAi:08000044 arg_0 = dword ptr
8
.text._D4test5addtoFAiAiZAi:08000044 arg_8 = dword ptr
10h
.text._D4test5addtoFAiAiZAi:08000044 arg_C = dword ptr
14h
.text._D4test5addtoFAiAiZAi:08000044
.text._D4test5addtoFAiAiZAi:08000044 push ebp
.text._D4test5addtoFAiAiZAi:08000045 mov ebp,
esp
.text._D4test5addtoFAiAiZAi:08000047 push
dword ptr [esp+0Ch]
.text._D4test5addtoFAiAiZAi:0800004B push
[ebp+arg_0]
.text._D4test5addtoFAiAiZAi:0800004E push
[ebp+arg_C]
.text._D4test5addtoFAiAiZAi:08000051 push
[ebp+arg_8]
.text._D4test5addtoFAiAiZAi:08000054 call
_arraySliceSliceAddass_i
.text._D4test5addtoFAiAiZAi:08000059 add esp,
10h
.text._D4test5addtoFAiAiZAi:0800005C pop ebp
.text._D4test5addtoFAiAiZAi:0800005D retn 10h
.text._D4test5addtoFAiAiZAi:0800005D _D4test5addtoFAiAiZAi endp
Pardon 32bits, my IDA free doesn't handle 64bit too well.
The only difference is the fact that arguments here are passed on
stack instead of rdi, rsi etc like it takes place on System V
AMD64 calling convention
More information about the Digitalmars-d-learn
mailing list