Comment #0 by bearophile_hugs — 2010-03-31T09:45:44Z
This small D2 program calls two times a function msin that I have tagged as pure, but in the binary there are two sin instructions, I don't understand:
import std.c.stdio: printf;
import std.c.stdlib: atof;
import std.math: sin;
pure double msin(double x) {
return sin(x);
}
void main() {
double x = atof("0.3");
double y = msin(x) + msin(x);
printf("%f\n", y);
}
Compiled with dmd v2.042:
dmd -O -release -inline bug1.d
Produces:
_D4bug14msinFNadZd:
fld qword ptr 4[ESP]
fsin
ret 8
__Dmain:
L0: sub ESP,01Ch
mov EAX,offset FLAT:_DATA
push EAX
call near ptr _atof
mov ECX,offset FLAT:_DATA[4]
fstp qword ptr 8[ESP]
fld qword ptr 8[ESP]
fsin
fld qword ptr 8[ESP]
sub ESP,8
fsin
faddp ST(1),ST
fstp qword ptr [ESP]
push ECX
call near ptr _printf
add ESP,010h
add ESP,01Ch
xor EAX,EAX
ret
Similar code is produced with this line:
double y = sin(x) + sin(x);
Comment #1 by dkorpel — 2021-09-04T12:51:07Z
I don't think this is about returning double, but about `msin` not being `nothrow`.
Comment #2 by robert.schadek — 2024-12-13T17:52:02Z