<div dir="auto"><div><div class="gmail_quote"><div dir="ltr">Bart <<a href="mailto:bartjunk64@gmail.com">bartjunk64@gmail.com</a>> schrieb am Fr., 27. Apr. 2018, 13:42:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, Apr 25, 2018 at 11:04 AM,  <<a href="mailto:info@wolfgang-ehrhardt.de" target="_blank" rel="noreferrer">info@wolfgang-ehrhardt.de</a>> wrote:<br>
<br>
> If you compile and run this 64-bit program on Win 64 you get a crash<br>
<br>
And AFAICS your analysis of the cause (see bugtracker) is correct as well.<br>
<br>
function fpc_frac_real(d: ValReal) : ValReal;compilerproc; assembler;<br>
nostackframe;<br>
  asm<br>
    cvttsd2si %xmm0,%rax<br>
    { Windows defines %xmm4 and %xmm5 as first non-parameter volatile registers;<br>
      on SYSV systems all are considered as such, so use %xmm4 }<br>
    cvtsi2sd %rax,%xmm4<br>
    subsd %xmm4,%xmm0<br>
  end;<br>
<br>
CVTTSD2SI — Convert with Truncation Scalar Double-Precision<br>
Floating-Point Value to Signed Integer<br>
This should not be used to get a ValReal result.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">The code essentially does the following (instruction by instruction):</div><div dir="auto"><br></div><div dir="auto">=== code begin ===</div><div dir="auto"><br></div><div dir="auto">tmpi := int64(d - trunc(d));</div><div dir="auto">tmpd := double(tmpi);</div><div dir="auto">Result := d - tmpd;</div><div dir="auto"><br></div><div dir="auto">=== code end ===</div><div dir="auto"><br></div><div dir="auto">Though why it fails with the given value is a different topic... </div><div dir="auto"><br></div><div dir="auto">Regards, </div><div dir="auto">Sven </div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
</blockquote></div></div></div>