|
|
1.1 root 1: #ifdef LIBC_SCCS
2: .asciz "@(#)modf.s 1.1 (Berkeley/CCI) 7/2/86"
3: #endif LIBC_SCCS
4:
5: /*
6: * double modf (value, iptr)
7: * double value, *iptr;
8: *
9: * Modf returns the fractional part of "value",
10: * and stores the integer part indirectly through "iptr".
11: */
12: #include <tahoemath/fp.h>
13: #include "DEFS.h"
14:
15: ENTRY(modf, R2|R3|R4|R5)
16: /*
17: * Some initializations:
18: */
19: ldd 4(fp) /* load accumulator, for converison */
20: cvdl r2 /* to an integer. */
21: bvs gsb /* iff too big grunt it out */
22: cvld r2 /* float the integer part */
23: std r2
24: ldd 4(fp) /* isolate the fraction */
25: subd r2
26: std r0
27: movl 12(fp),r6 /* get int return address */
28: movl r2,(r6)
29: movl r3,4(r6)
30: ret
31: gsb: clrl r3
32: movl 4(fp),r0 /* fetch operand to r0,r1. */
33: movl 8(fp),r1
34: movl 12(fp),r6 /* fetch addr of int to r6. */
35: /*
36: * get exponent
37: */
38: andl3 $EXPMASK,r0,r2 /* r2 will hold the exponent. */
39: jeql is_reserved /* check for reserved operand. */
40: shrl $EXPSHIFT,r2,r2
41: subl2 $BIAS,r2 /* unbias it. */
42: jleq allfrac /* it's int part is zero. */
43: cmpl r2,$56
44: jgeq allint /* it's fraction part is zero. */
45: /*
46: * get fraction
47: */
48: movl r0,r4 /* remember the original number. */
49: movl r1,r5
50: bbc $31,r0,positive /* if negative remember it. */
51: incl r3
52: positive:
53: /* clear the non fraction parts. */
54: andl2 $(0!(EXPMASK | SIGNBIT)),r0
55: /* add the hidden bit. */
56: orl2 $(0!CLEARHID),r0
57:
58: cmpl r2,$HID_POS /* see if there are bits to clear only in r0 */
59: /* or r1 has to be taken care of. */
60: /* ( for fraction calculation) */
61:
62: jgtr in_r1 /* some bytes in r1. */
63:
64: jeql onlyallr0 /* all r0 must be cleared,r1 unchanged. */
65:
66: /* only r0 must be canged. */
67: mnegl r2,r7 /* r7 - loop counter. */
68: movl $CLEARHID,r8 /* first bit to clear. */
69: 1:
70: andl2 r8,r0 /* clear int. bits from fraction part. */
71: shar $1,r8,r8
72: aoblss $0,r7,1b
73: 1:
74: andl2 r8,r4 /* clear frac bits for int calculation: */
75: shar $1,r8,r8
76: cmpl $0xffffffff,r8
77: jneq 1b
78: clrl r5
79: jmp norm
80:
81: onlyallr0:
82: clrl r0
83: clrl r5
84: jmp norm
85:
86: in_r1:
87: clrl r0 /* clear int part for frac. calculation. */
88: subl3 r2,$HID_POS,r7
89: movl $0x7fffffff,r8
90: 1:
91: andl2 r8,r1
92: shar $1,r8,r8
93: orl2 $0x80000000,r8 /* force the 'sign' bit to be on. */
94: aoblss $0,r7,1b
95: 1:
96: andl2 r8,r5
97: shar $1,r8,r8
98: cmpl $0xffffffff,r8
99: jneq 1b
100:
101: norm:
102: addl2 $BIAS,r2 /* fnorm expects it biased. */
103: callf $4,fnorm /* normelize fraction part. */
104: cmpl $0,r0
105: jeql 1f
106: bbc $0,r3,1f
107: orl2 $0x80000000,r0
108: 1:
109: movl r4,(r6) /* put int part in place. */
110: movl r5,4(r6)
111: ret
112:
113: allint:
114: movl r0,(r6) /* copy the argument to the int addr. */
115: movl r1,4(r6)
116: clrl r0 /* clear the fraction part. */
117: clrl r1
118: ret
119:
120: allfrac:
121: /* the fraction is ready in r0,r1. */
122: clrl (r6) /* zero the int part. */
123: clrl 4(r6)
124: ret
125:
126: ret_zero:
127: clrl (r6)
128: clrl 4(r6)
129: clrl r0
130: clrl r1
131: ret
132:
133: is_reserved:
134: bbc $31,r0,ret_zero
135: callf $4,fpresop
136: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.