According to this (http://msdn.microsoft.com/en-us/library/windows/hardware/ff561499(v=vs.85).aspx) 32-bit registers are automatically zero extended on x64 architecture while 16-bit and 8-bit registers are not.


"Operations that output to a 32-bit subregister are automatically zero-extended to the entire 64-bit register. Operations that output to 8-bit or 16-bit subregisters are not zero-extended (this is compatible x86 behavior)."

Hmmm. Sounds like 32-bit compatibilty mode stuff. I'm concerned that a 64-bit binary outputted by dmd would contain no 32-bit mode instructions, therefore, although a load instuction exists that would automatically zero-pad, I'm not sure dmd uses it.

The file command (in Linux) tells me that my outputted binary is a 64-bit binary, not a 32-bit/64-bit hybrid binary. Then again, maybe it's not programmed to check for hybrid binaries and just says "64-bit" if it is 64-bit overall.


To try and check for myself, I ran the binary through objdump. I found the "LEA" instruction. I don't know if it's a 32-bit load instruction or a 64-bit load instruction.

But _wow_ was I shocked at how many lines of assembly were generated!

I tried the following:

int main()
{
  int loadMe = void;
  return loadMe;
}

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?


I guess the exact type of variables should remain up in the air until the whole thing is implemented and tested using different types?

Yes very much so.

Ah ha. Thanks for the tip. I see that this makes one's effort to lay down an API/library/module specification a little interesting. Can't publish your chickens until they hatch.

Reply via email to