Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | | |
2 | | sgetem.sa 3.1 12/10/90 | |
3 | | | |
4 | | The entry point sGETEXP returns the exponent portion | |
5 | | of the input argument. The exponent bias is removed | |
6 | | and the exponent value is returned as an extended | |
7 | | precision number in fp0. sGETEXPD handles denormalized | |
8 | | numbers. | |
9 | | | |
10 | | The entry point sGETMAN extracts the mantissa of the | |
11 | | input argument. The mantissa is converted to an | |
12 | | extended precision number and returned in fp0. The | |
13 | | range of the result is [1.0 - 2.0). | |
14 | | | |
15 | | | |
16 | | Input: Double-extended number X in the ETEMP space in | |
17 | | the floating-point save stack. | |
18 | | | |
19 | | Output: The functions return exp(X) or man(X) in fp0. | |
20 | | | |
21 | | Modified: fp0. | |
22 | | | |
23 | | | |
24 | | Copyright (C) Motorola, Inc. 1990 | |
25 | | All Rights Reserved | |
26 | | | |
e00d82d0 MW |
27 | | For details on the license for this file, please see the |
28 | | file, README, in this same directory. | |
1da177e4 LT |
29 | |
30 | |SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package | |
31 | ||
32 | |section 8 | |
33 | ||
34 | #include "fpsp.h" | |
35 | ||
36 | |xref nrm_set | |
37 | ||
38 | | | |
39 | | This entry point is used by the unimplemented instruction exception | |
40 | | handler. It points a0 to the input operand. | |
41 | | | |
42 | | | |
43 | | | |
44 | | SGETEXP | |
45 | | | |
46 | ||
47 | .global sgetexp | |
48 | sgetexp: | |
49 | movew LOCAL_EX(%a0),%d0 |get the exponent | |
50 | bclrl #15,%d0 |clear the sign bit | |
51 | subw #0x3fff,%d0 |subtract off the bias | |
52 | fmovew %d0,%fp0 |move the exp to fp0 | |
53 | rts | |
54 | ||
55 | .global sgetexpd | |
56 | sgetexpd: | |
57 | bclrb #sign_bit,LOCAL_EX(%a0) | |
58 | bsr nrm_set |normalize (exp will go negative) | |
59 | movew LOCAL_EX(%a0),%d0 |load resulting exponent into d0 | |
60 | subw #0x3fff,%d0 |subtract off the bias | |
61 | fmovew %d0,%fp0 |move the exp to fp0 | |
62 | rts | |
63 | | | |
64 | | | |
65 | | This entry point is used by the unimplemented instruction exception | |
66 | | handler. It points a0 to the input operand. | |
67 | | | |
68 | | | |
69 | | | |
70 | | SGETMAN | |
71 | | | |
72 | | | |
73 | | For normalized numbers, leave the mantissa alone, simply load | |
74 | | with an exponent of +/- $3fff. | |
75 | | | |
76 | .global sgetman | |
77 | sgetman: | |
78 | movel USER_FPCR(%a6),%d0 | |
79 | andil #0xffffff00,%d0 |clear rounding precision and mode | |
80 | fmovel %d0,%fpcr |this fpcr setting is used by the 882 | |
81 | movew LOCAL_EX(%a0),%d0 |get the exp (really just want sign bit) | |
82 | orw #0x7fff,%d0 |clear old exp | |
83 | bclrl #14,%d0 |make it the new exp +-3fff | |
84 | movew %d0,LOCAL_EX(%a0) |move the sign & exp back to fsave stack | |
85 | fmovex (%a0),%fp0 |put new value back in fp0 | |
86 | rts | |
87 | ||
88 | | | |
89 | | For denormalized numbers, shift the mantissa until the j-bit = 1, | |
90 | | then load the exponent with +/1 $3fff. | |
91 | | | |
92 | .global sgetmand | |
93 | sgetmand: | |
94 | movel LOCAL_HI(%a0),%d0 |load ms mant in d0 | |
95 | movel LOCAL_LO(%a0),%d1 |load ls mant in d1 | |
96 | bsr shft |shift mantissa bits till msbit is set | |
97 | movel %d0,LOCAL_HI(%a0) |put ms mant back on stack | |
98 | movel %d1,LOCAL_LO(%a0) |put ls mant back on stack | |
99 | bras sgetman | |
100 | ||
101 | | | |
102 | | SHFT | |
103 | | | |
104 | | Shifts the mantissa bits until msbit is set. | |
105 | | input: | |
106 | | ms mantissa part in d0 | |
107 | | ls mantissa part in d1 | |
108 | | output: | |
109 | | shifted bits in d0 and d1 | |
110 | shft: | |
111 | tstl %d0 |if any bits set in ms mant | |
112 | bnes upper |then branch | |
113 | | ;else no bits set in ms mant | |
114 | tstl %d1 |test if any bits set in ls mant | |
115 | bnes cont |if set then continue | |
116 | bras shft_end |else return | |
117 | cont: | |
118 | movel %d3,-(%a7) |save d3 | |
119 | exg %d0,%d1 |shift ls mant to ms mant | |
120 | bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0 | |
121 | lsll %d3,%d0 |shift first 1 to integer bit in ms mant | |
122 | movel (%a7)+,%d3 |restore d3 | |
123 | bras shft_end | |
124 | upper: | |
125 | ||
126 | moveml %d3/%d5/%d6,-(%a7) |save registers | |
127 | bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0 | |
128 | lsll %d3,%d0 |shift ms mant until j-bit is set | |
129 | movel %d1,%d6 |save ls mant in d6 | |
130 | lsll %d3,%d1 |shift ls mant by count | |
131 | movel #32,%d5 | |
132 | subl %d3,%d5 |sub 32 from shift for ls mant | |
133 | lsrl %d5,%d6 |shift off all bits but those that will | |
134 | | ;be shifted into ms mant | |
135 | orl %d6,%d0 |shift the ls mant bits into the ms mant | |
136 | moveml (%a7)+,%d3/%d5/%d6 |restore registers | |
137 | shft_end: | |
138 | rts | |
139 | ||
140 | |end |