On Sunday, 5 January 2014 at 06:31:38 UTC, Jake Thomas wrote:
And got 86,421 lines of assembly!! I expected a load instruction to load whatever was at loadMe's location into r0 (the return register) and not much else. Maybe 10 lines - tops - due to compiler fluffiness. I got about 8,641 times that - over 3 more orders of magnatude. What is going on here?

Well the compiler pulls in at minimum the entire D runtime if i'm not mistaken which make the standard .exe about 350kb.

Things like Object.factory also pulls in it's fair share due to not being able to remove classes. So we get alot of fluff in small programs.

The module layout of the standard library is also a problem, there is a lot of interconnections between the different modules in Phobos. (will hopefully be better when the modules are broken down into submodules)


I tested your test program on windows x64 and got the following result:

mov         ebp,esp
sub         rsp,10h
mov         eax,dword ptr [rbp-8]
lea         rsp,[rbp]
pop         rbp
ret

//This does a 32 bit load into the eax register (return register) from the //stack.
mov         eax,dword ptr [rbp-8]


//I also ran this to see if there was any difference
int main()
{
   int loadMe = 10;
   return loadMe;
}

--Resulting main functtion

 mov         ebp,esp
 sub         rsp,10h
 mov         eax,0Ah
 mov         dword ptr [rbp-8],eax
 lea         rsp,[rbp]
 pop         rbp
 ret

//Loads 10 the value to be returned and
//Then stores that value on the stack.
//While this is not rly necessary i ran
//the code in debug mode so it does not
//remove most useless instructions.
 mov         eax,0Ah
 mov         dword ptr [rbp-8],eax


//In optimized mode it is gone
 push        rbp
 mov         rbp,rsp
 mov         eax,0Ah
 pop         rbp
 ret

So it looks like dmd does 32-bit loads at least on windows x64.

Reply via email to