I’ve only tested it in Delphi, so you’ll have to convert it to the right syntax for fpc, but either of these should do:
function Frac1(const X: Double): Double; asm .align 16 .noframe movq rdx, xmm0 shl rdx, 32 and edx, $7FF00000 cmp edx, $43300000 jge @@zero cmp edx, $3FE00000 jbe @@skip cvttsd2si rax, xmm0 cvtsi2sd xmm4, rax subsd xmm0, xmm4 jmp @@skip @@zero: xorpd xmm0, xmm0 @@skip: end; function Frac2(const X: Double): Double; asm .align 16 .noframe movq rdx, xmm0 shl rdx, 48 and dx, $7FF0 cmp dx, $4330 jge @@zero cmp dx, $3FE0 jbe @@skip cvttsd2si rax, xmm0 cvtsi2sd xmm4, rax subsd xmm0, xmm4 jmp @@skip @@zero: xorpd xmm0, xmm0 @@skip: end; From: fpc-devel <fpc-devel-boun...@lists.freepascal.org> On Behalf Of Sven Barth via fpc-devel Sent: Friday, 27 April 2018 23:47 To: FPC developers' list <fpc-devel@lists.freepascal.org> Cc: Sven Barth <pascaldra...@googlemail.com> Subject: *** GMX Spamverdacht *** Re: [fpc-devel] Broken frac function in FPC3.1.1 / Windows x86_64 Bart <bartjun...@gmail.com <mailto:bartjun...@gmail.com> > schrieb am Fr., 27. Apr. 2018, 13:42: On Wed, Apr 25, 2018 at 11:04 AM, <i...@wolfgang-ehrhardt.de <mailto:i...@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; nostackframe; asm 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 end; 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... Regards, Sven
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel