|
|
1.1 root 1: .data
2: /* .asciz "@(#)modf.s 1.1 86/02/03 SMI" */
3: .text
4:
5: /*
6: * double-precision operations: frexp, ldexp, modf
7: * frexp.s 1.1 83/04/12
8: *
9: */
10: #include "fpcrtdefs.h"
11:
12: /*
13: * double
14: * modf( value, iptr)
15: * double value, *iptr;
16: *
17: * return a value v and stores through iptr a value i s.t.:
18: * v + i == value, and
19: *4.2 BSD:
20: * 1 > v >= 0
21: * Note that for -0.5 < value < 0, v may not be representable.
22: *System V:
23: v has sign of value and |v| < 1.
24: v is always exact.
25: */
26:
27: .globl _modf
28: _modf: link a6,#0
29: MCOUNT
30: moveml a6@(8),d0/d1 | d0/d1 gets x.
31: jsr Ffloord | d0/d1 gets floor(x). 4.2 BSD definition.
32: | jsr Faintd | d0/d1 gets aint(x). System V definition.
33: movl a6@(16),a0 | a0 gets address of *iptr.
34: moveml d0/d1,a0@ | *iptr gets floor(x).
35: lea a6@(8),a0 | a0 points to x.
36: jsr Fsubd | d0/d1 gets floor(x)-x.
37: bchg #31,d0 | d0/d1 gets x-floor(x) >= 0 unless x is inf or nan.
38: unlk a6
39: rts
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.