Oh Dear
Walter Bright
newshound1 at digitalmars.com
Sun Jul 12 14:23:59 PDT 2009
Michiel Helvensteijn wrote:
> In any case, we will see exactly what kind of division and modulo D uses.
Given the code:
void foo()
{
int x,y,z;
x = y / z;
x = y % z;
uint ux,uy,uz; // unsigned for C
ux = uy / uz;
ux = uy % ux;
}
dmd produces:
enter 010h,0
xor EAX,EAX
mov -010h[EBP],EAX
mov -0Ch[EBP],EAX
mov EAX,-010h[EBP]
cdq
idiv dword ptr -0Ch[EBP]
mov EAX,-010h[EBP]
cdq
idiv dword ptr -0Ch[EBP]
xor ECX,ECX
mov -8[EBP],ECX
mov -4[EBP],ECX
mov EAX,-4[EBP]
xor EDX,EDX
div ECX
mov -8[EBP],EAX
mov EAX,-4[EBP]
xor EDX,EDX
div dword ptr -8[EBP]
mov -8[EBP],EDX
leave
ret
For comparison, gcc produces:
push EBP
mov EBP,ESP
sub ESP,038h
mov EAX,-8[EBP]
mov -034h[EBP],EAX
mov EDX,-034h[EBP]
mov EAX,EDX
sar EDX,01Fh
idiv dword ptr -0Ch[EBP]
mov -4[EBP],EAX
mov EDX,-8[EBP]
mov EAX,EDX
sar EDX,01Fh
idiv dword ptr -0Ch[EBP]
mov -4[EBP],EDX
mov EAX,-014h[EBP]
mov EDX,0
div dword ptr -018h[EBP]
mov -010h[EBP],EAX
mov EAX,-014h[EBP]
mov -038h[EBP],EAX
mov EAX,-038h[EBP]
mov EDX,0
div dword ptr -010h[EBP]
mov -010h[EBP],EDX
leave
ret
Producing the same results as the corresponding C compiler does is quite
deliberate. I'd like to emphasize that the code generator has been in
use for 25 years for several hundred thousand users, and it is
incredibly unlikely that nobody would notice if it is getting basic
integer arithmetic wrong. If you'd like to write up a formal definition
that can be inserted into the D specification, that would be great.
More information about the Digitalmars-d
mailing list