[fpc-devel] *** GMX Spamverdacht *** Re: Broken frac function in FPC3.1.1 / Windows x86_64

Thorsten Engler thorsten.engler at gmx.net
Fri Apr 27 16:09:12 CEST 2018

Highest integer that fits in a Int64:





Your Int is overflowing.


You can’t implement Frac by going through an Integer, that will never work. Except if you have an integer that can hold 1.8E308 (which would be a 1024 bit integer, or thereabouts).


From: fpc-devel <fpc-devel-bounces at lists.freepascal.org> On Behalf Of Sven Barth via fpc-devel
Sent: Friday, 27 April 2018 23:47
To: FPC developers' list <fpc-devel at lists.freepascal.org>
Cc: Sven Barth <pascaldragon at googlemail.com>
Subject: *** GMX Spamverdacht *** Re: [fpc-devel] Broken frac function in FPC3.1.1 / Windows x86_64


Bart <bartjunk64 at gmail.com <mailto:bartjunk64 at gmail.com> > schrieb am Fr., 27. Apr. 2018, 13:42:

On Wed, Apr 25, 2018 at 11:04 AM,  <info at wolfgang-ehrhardt.de <mailto:info at wolfgang-ehrhardt.de> > wrote:

> If you compile and run this 64-bit program on Win 64 you get a crash

And AFAICS your analysis of the cause (see bugtracker) is correct as well.

function fpc_frac_real(d: ValReal) : ValReal;compilerproc; assembler;
    cvttsd2si %xmm0,%rax
    { Windows defines %xmm4 and %xmm5 as first non-parameter volatile registers;
      on SYSV systems all are considered as such, so use %xmm4 }
    cvtsi2sd %rax,%xmm4
    subsd %xmm4,%xmm0

CVTTSD2SI — Convert with Truncation Scalar Double-Precision
Floating-Point Value to Signed Integer
This should not be used to get a ValReal result.


The code essentially does the following (instruction by instruction):


=== code begin ===


tmpi := int64(d - trunc(d));

tmpd := double(tmpi);

Result := d - tmpd;


=== code end ===


Though why it fails with the given value is a different topic... 




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20180428/fb323502/attachment.html>

More information about the fpc-devel mailing list