V9/libc/sun/modf.s
.data
/* .asciz "@(#)modf.s 1.1 86/02/03 SMI" */
.text
/*
* double-precision operations: frexp, ldexp, modf
* frexp.s 1.1 83/04/12
*
*/
#include "fpcrtdefs.h"
/*
* double
* modf( value, iptr)
* double value, *iptr;
*
* return a value v and stores through iptr a value i s.t.:
* v + i == value, and
*4.2 BSD:
* 1 > v >= 0
* Note that for -0.5 < value < 0, v may not be representable.
*System V:
v has sign of value and |v| < 1.
v is always exact.
*/
.globl _modf
_modf: link a6,#0
MCOUNT
moveml a6@(8),d0/d1 | d0/d1 gets x.
jsr Ffloord | d0/d1 gets floor(x). 4.2 BSD definition.
| jsr Faintd | d0/d1 gets aint(x). System V definition.
movl a6@(16),a0 | a0 gets address of *iptr.
moveml d0/d1,a0@ | *iptr gets floor(x).
lea a6@(8),a0 | a0 points to x.
jsr Fsubd | d0/d1 gets floor(x)-x.
bchg #31,d0 | d0/d1 gets x-floor(x) >= 0 unless x is inf or nan.
unlk a6
rts