try to keep console output flow control from wedging procs after reset fails
[unix-history] / usr / src / sys / tahoe / math / Kmodf.s
CommitLineData
9d1834ba 1/* Kmodf.s 1.3 86/01/05 */
85e2e771 2
9d1834ba
SL
3#include "../tahoe/SYS.h"
4#include "../tahoemath/fp.h"
85e2e771
SL
5
6/*
2b252132
SL
7 * float Kmodf (value, iptr, hfs)
8 * float value, *iptr;
9 * int hfs;
10 *
11 * Modf returns the fractional part of "value",
12 * and stores the integer part indirectly through "iptr".
13 */
85e2e771 14 .text
2b252132 15ENTRY(Kmodf, R8|R7|R6|R5|R4|R3|R2)
85e2e771
SL
16 /*
17 * Some initializations:
18 */
19 clrl r3
20 movl 4(fp),r0 /* fetch operand to r0. */
21 movl 8(fp),r1
22 movl 12(fp),r6 /* fetch addr of int to r6. */
23 /*
2b252132
SL
24 * get exponent
25 */
85e2e771
SL
26 andl3 $EXPMASK,r0,r2 /* r2 will hold the exponent. */
27 shrl $EXPSHIFT,r2,r2
28 subl2 $BIAS,r2 /* unbias it. */
29 jleq allfrac /* it's int part is zero. */
30 cmpl r2,$56
31 jgeq allint /* it's fraction part is zero. */
32 /*
2b252132
SL
33 * get fraction
34 */
85e2e771
SL
35 movl r0,r4 /* remember the original number. */
36 movl r1,r5
37 bbc $31,r0,positive /* if negative remember it. */
38 incl r3
39positive:
40 /* clear the non fraction parts. */
41 andl2 $(0!(EXPMASK | SIGNBIT)),r0
42 /* add the hidden bit. */
43 orl2 $(0!CLEARHID),r0
44
45 cmpl r2,$HID_POS /* see if there are bits to clear only in r0 */
46 jgtr in_r1 /* some bytes in r1 */
47 jeql onlyallr0 /* all r0 must be cleared. */
48 mnegl r2,r7 /* r7 - loop counter. */
49 movl $CLEARHID,r8 /* first bit to clear. */
501:
51 andl2 r8,r0 /* clear int. bits from fraction part. */
52 shar $1,r8,r8
53 aoblss $0,r7,1b
541:
55 andl2 r8,r4 /* clear frac bits for int calculation: */
56 shar $1,r8,r8
57 cmpl $0xffffffff,r8
58 jneq 1b
59 clrl r5
60 jmp norm
61
62onlyallr0:
63 clrl r0
64 clrl r5
65 jmp norm
66
67in_r1:
68 clrl r0
69 subl3 r2,$HID_POS,r7
70 movl $0x7fffffff,r8
711:
72 andl2 r8,r1
73 shar $1,r8,r8
74 orl2 $0x80000000,r8
75 aoblss $0,r7,1b
761:
77 andl2 r8,r5
78 shar $1,r8,r8
79 cmpl $0xffffffff,r8
80 jneq 1b
81norm:
82 addl2 $BIAS,r2 /* fnorm expects it biased. */
83 pushl 16(fp) /* hfs */
2b252132 84 callf $8,_Kfnorm /* normelize fraction part. */
85e2e771
SL
85 cmpl $0,r0
86 jeql 1f
87 bbc $0,r3,1f
88 orl2 $0x80000000,r0
891:
90 movl r4,(r6) /* put int part in place. */
91 movl r5,4(r6)
92 ret
93
94allint:
95 movl r0,(r6) /* copy the argument to the int addr. */
96 movl r1,4(r6)
97 clrl r0 /* clear the fraction part. */
98 clrl r1
99 ret
100
101allfrac:
102 /* the fraction is ready in r0. */
103 clrl (r6) /* zero the int part. */
104 clrl 4(r6)
105 ret
106
107ret_zero:
108 clrl (r6)
109 clrl 4(r6)
110 clrl r0
111 clrl r1
112 ret