On Sunday, 15 May 2016 at 13:25:42 UTC, Michael wrote:
Well I'm pretty sure the code was working just fine earlier in
the week at the office, but running the code at home with the
newest version of DMD started producing these odd results.
Typing this function into asm.dlang.org shows a minor difference
in the assembly generated:
auto f1(double d1)
{
d1 *= -1.0;
return d1;
}
With DMD 2.070.2:
pure nothrow @nogc @safe double example.f1(double):
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp
movsd %xmm0,-0x8(%rbp)
xorb $0x80,-0x1(%rbp)
rex.W movsd -0x8(%rbp),%xmm0
leaveq
retq
nopl 0x0(%rax)
With DMD 2.071.0:
pure nothrow @nogc @safe double example.f1(double):
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp
movsd %xmm0,-0x8(%rbp)
xorb $0x80,-0x8(%rbp)
rex.W movsd -0x8(%rbp),%xmm0
leaveq
retq
nopl 0x0(%rax)
The xorb line is different and I conjecture that it is causing
the bug. I have never used floating-point assembly instructions,
so I cannot understand what the logic is here. I'll read up and
try to interpret to confirm.
Hope this helps.