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.

Reply via email to