dmd asm output

js.mdnq js_adddot+mdng at gmail.com
Mon Apr 1 03:24:20 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.

What's after the code?

The 0x76 call is an inline call function, the ret returns it. The 
stuff before it is setting up the registers for the call and what 
comes after

> 0x0000000000000076 <+54>:    call   0x7b 
> <_D3sse5addtoFAiAiZv+59>
> 0x000000000000007b <+59>:    mov    rsp,rbp
> 0x000000000000007e <+62>:    pop    rbp
> 0x000000000000007f <+63>:    ret

As you can see, the call is calling the function right below it, 
but when it returns it depends on what is on the stack as to 
where the function returns(since ip is being popped into rbp).

To me, and this is a guess, this looks like some type of table of 
functions being called(the ret function is being redirected to 
somewhere other than to the place that it was being called from).

So there is much more going on than meets the eye. It would be 
easier to understand if you stepped through the code to see where 
the ret is headed.





More information about the Digitalmars-d-learn mailing list