the int part was wrong when -1 < x <= -0 (+0.0 instead of -0.0)
and the size and performace gain of the asm version was negligible
+++ /dev/null
-.global modf
-.type modf,@function
-modf:
- mov 12(%esp),%ecx
- fldl 4(%esp)
- fxam
- fnstsw %ax
- sahf
- jnp 1f
- jc 2f
-1: fld1
- fld %st(1)
-1: fprem
- fnstsw %ax
- sahf
- jp 1b
- fstp %st(1)
- fsubr %st(0),%st(1)
- fxch %st(1)
- fstpl (%ecx)
- ret
-
-2: fstpl (%ecx)
- mov 4(%ecx),%eax
- and $0x80000000,%eax
- mov %eax,4(%esp)
- flds 4(%esp)
- ret
+++ /dev/null
-.global modff
-.type modff,@function
-modff:
- mov 8(%esp),%ecx
- flds 4(%esp)
- fxam
- fnstsw %ax
- sahf
- jnp 1f
- jc 2f
-1: fld1
- fld %st(1)
-1: fprem
- fnstsw %ax
- sahf
- jp 1b
- fstp %st(1)
- fsubr %st(0),%st(1)
- fxch %st(1)
- fstps (%ecx)
- ret
-
-2: fstps (%ecx)
- mov (%ecx),%eax
- and $0x80000000,%eax
- mov %eax,4(%esp)
- flds 4(%esp)
- ret
+++ /dev/null
-.global modfl
-.type modfl,@function
-modfl:
- mov 16(%esp),%ecx
- fldt 4(%esp)
- fxam
- fnstsw %ax
- sahf
- jnp 1f
- jc 2f
-1: fld1
- fld %st(1)
-1: fprem
- fnstsw %ax
- sahf
- jp 1b
- fstp %st(1)
- fsubr %st(0),%st(1)
- fxch %st(1)
- fstpt (%ecx)
- ret
-
-2: fstpt (%ecx)
- mov 6(%ecx),%eax
- and $0x80000000,%eax
- mov %eax,4(%esp)
- flds 4(%esp)
- ret
+++ /dev/null
-.global modfl
-.type modfl,@function
-modfl:
- fldt 8(%rsp)
- fxam
- fnstsw %ax
- sahf
- jnp 1f
- jc 2f
-1: fld1
- fld %st(1)
-1: fprem
- fnstsw %ax
- sahf
- jp 1b
- fstp %st(1)
- fsubr %st(0),%st(1)
- fxch %st(1)
- fstpt (%rdi)
- ret
-
-2: fstpt (%rdi)
- mov 6(%rdi),%eax
- and $0x80000000,%eax
- mov %eax,8(%rsp)
- flds 8(%rsp)
- ret