<HTML>
It turns out I did over-engineer the solution somewhat - this version is far more efficient, honours NaNs and triggers SIGFPE if infinity is passed in (subsd triggers it), hence there are no regressions.<br>
<br>
****<br>
<br>
function fpc_frac_real(d: ValReal): ValReal; compilerproc; assembler; nostackframe;<br>
asm<br>
movq %xmm0, %rax<br>
movapd %xmm0, %xmm4<br>
shr $48, %rax<br>
and $0x7ff0,%ax<br>
cmp $0x4330,%ax<br>
jge .L0<br>
cvttsd2si %xmm0, %rax<br>
cvtsi2sd %rax, %xmm4<br>
.L0:<br>
subsd %xmm4, %xmm0<br>
end;<br>
<br>
****<br>
<br>
This is effectively "x - Int(x)" with some opcode reordering to take advantage of the multiple SSE ports present in a processor (hence the positioning of "movapd %xmm0,%xmm4" in between "movq %xmm0,%rax" and "shr $48,%rax") - it is generally equal in speed to my last routine and is faster when dealing with numbers that don't have fractional components. It is also only 38 bytes in size.<br>
<br>
New patch coming soon once I test it properly.<br>
<br>
Gareth aka. Kit<br>
</HTML>