|
|
1.1 root 1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Computer Consoles Inc.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #if defined(SYSLIBC_SCCS) && !defined(lint)
24: .asciz "@(#)modf.s 1.3 (Berkeley) 6/1/90"
25: #endif /* SYSLIBC_SCCS and not lint */
26:
27: /*
28: * double modf (value, iptr)
29: * double value, *iptr;
30: *
31: * Modf returns the fractional part of "value",
32: * and stores the integer part indirectly through "iptr".
33: */
34: #include <tahoemath/fp.h>
35: #include "DEFS.h"
36:
37: ENTRY(modf, R2|R3|R4|R5)
38: /*
39: * Some initializations:
40: */
41: ldd 4(fp) /* load accumulator, for converison */
42: cvdl r2 /* to an integer. */
43: bvs gsb /* iff too big grunt it out */
44: cvld r2 /* float the integer part */
45: std r2
46: ldd 4(fp) /* isolate the fraction */
47: subd r2
48: std r0
49: movl 12(fp),r6 /* get int return address */
50: movl r2,(r6)
51: movl r3,4(r6)
52: ret
53: gsb: clrl r3
54: movl 4(fp),r0 /* fetch operand to r0,r1. */
55: movl 8(fp),r1
56: movl 12(fp),r6 /* fetch addr of int to r6. */
57: /*
58: * get exponent
59: */
60: andl3 $EXPMASK,r0,r2 /* r2 will hold the exponent. */
61: jeql is_reserved /* check for reserved operand. */
62: shrl $EXPSHIFT,r2,r2
63: subl2 $BIAS,r2 /* unbias it. */
64: jleq allfrac /* it's int part is zero. */
65: cmpl r2,$56
66: jgeq allint /* it's fraction part is zero. */
67: /*
68: * get fraction
69: */
70: movl r0,r4 /* remember the original number. */
71: movl r1,r5
72: bbc $31,r0,positive /* if negative remember it. */
73: incl r3
74: positive:
75: /* clear the non fraction parts. */
76: andl2 $(0!(EXPMASK | SIGNBIT)),r0
77: /* add the hidden bit. */
78: orl2 $(0!CLEARHID),r0
79:
80: cmpl r2,$HID_POS /* see if there are bits to clear only in r0 */
81: /* or r1 has to be taken care of. */
82: /* ( for fraction calculation) */
83:
84: jgtr in_r1 /* some bytes in r1. */
85:
86: jeql onlyallr0 /* all r0 must be cleared,r1 unchanged. */
87:
88: /* only r0 must be canged. */
89: mnegl r2,r7 /* r7 - loop counter. */
90: movl $CLEARHID,r8 /* first bit to clear. */
91: 1:
92: andl2 r8,r0 /* clear int. bits from fraction part. */
93: shar $1,r8,r8
94: aoblss $0,r7,1b
95: 1:
96: andl2 r8,r4 /* clear frac bits for int calculation: */
97: shar $1,r8,r8
98: cmpl $0xffffffff,r8
99: jneq 1b
100: clrl r5
101: jmp norm
102:
103: onlyallr0:
104: clrl r0
105: clrl r5
106: jmp norm
107:
108: in_r1:
109: clrl r0 /* clear int part for frac. calculation. */
110: subl3 r2,$HID_POS,r7
111: movl $0x7fffffff,r8
112: 1:
113: andl2 r8,r1
114: shar $1,r8,r8
115: orl2 $0x80000000,r8 /* force the 'sign' bit to be on. */
116: aoblss $0,r7,1b
117: 1:
118: andl2 r8,r5
119: shar $1,r8,r8
120: cmpl $0xffffffff,r8
121: jneq 1b
122:
123: norm:
124: addl2 $BIAS,r2 /* fnorm expects it biased. */
125: callf $4,fnorm /* normelize fraction part. */
126: cmpl $0,r0
127: jeql 1f
128: bbc $0,r3,1f
129: orl2 $0x80000000,r0
130: 1:
131: movl r4,(r6) /* put int part in place. */
132: movl r5,4(r6)
133: ret
134:
135: allint:
136: movl r0,(r6) /* copy the argument to the int addr. */
137: movl r1,4(r6)
138: clrl r0 /* clear the fraction part. */
139: clrl r1
140: ret
141:
142: allfrac:
143: /* the fraction is ready in r0,r1. */
144: clrl (r6) /* zero the int part. */
145: clrl 4(r6)
146: ret
147:
148: ret_zero:
149: clrl (r6)
150: clrl 4(r6)
151: clrl r0
152: clrl r1
153: ret
154:
155: is_reserved:
156: bbc $31,r0,ret_zero
157: callf $4,fpresop
158: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.