blob: d9234f4aed57c8801c2a23b99fe4a2d91bdd2ec5 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001|
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|
Matt Waddele00d82d2006-02-11 17:55:48 -080027| For details on the license for this file, please see the
28| file, README, in this same directory.
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
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
48sgetexp:
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
56sgetexpd:
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
77sgetman:
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
93sgetmand:
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
110shft:
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
117cont:
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
124upper:
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
137shft_end:
138 rts
139
140 |end