|
|
1.1 root 1: .data
2: /* .asciz "@(#)frexp.s 1.1 86/02/03 SMI" */
3: .text
4:
5: #include "fpcrtdefs.h"
6:
7: NSAVED = 5*4 | save registers d2-d7
8: SAVEMASK = 0x3f00
9: RESTMASK = 0x00fc
10:
11: M0 = d0
12: M1 = d1
13: EXP = d2
14: TYPE = d3
15: /* type values: */
16: ZERO = 1 | wonderful
17: GU = 2
18: PLAIN = 3
19: INF = 4
20: NAN = 5
21:
22: /*
23: * double
24: * frexp( value, eptr)
25: * double value;
26: * int *eptr;
27: *
28: * return a value v s.t. fabs(v) < 1.0
29: * and return *eptr value e s.t.
30: * v * (2**e) == value
31: */
32:
33: .globl _frexp
34: _frexp: link a6,#0
35: MCOUNT
36: movl a6@(8),d0 | suck parameters into registers
37: movl a6@(12),d1
38: movl a6@(16),a0
39: moveml #SAVEMASK,sp@- | state save
40: jbsr d_unpk
41: cmpb #PLAIN,TYPE | is it a funny number?
42: beqs 2$ | Branch if normal.
43: bgts gohome | yes -- repack and forget
44: cmpb #ZERO,TYPE
45: beqs gohome | can't do much with zero, either
46: 1$:
47: subqw #1,EXP | Subnormal requires normalization.
48: lsll #1,d1
49: roxll #1,d0
50: btst #20,d0
51: beqs 1$ | Branch if not yet normalized.
52: 2$: | normal path through here
53: addw #(52+1),EXP | return current exp val +1
54: | 52 is unpacked bias -- mantissa has point on right?
55: extl EXP
56: movl EXP,a0@
57: movw #-53,EXP | repack with exp val of -1
58: gohome:
59: jbsr d_pack
60: gone: moveml sp@+,#RESTMASK
61: unlk a6
62: rts
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.