aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k/fpsp040/sgetem.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/m68k/fpsp040/sgetem.S')
-rw-r--r--arch/m68k/fpsp040/sgetem.S141
1 files changed, 141 insertions, 0 deletions
diff --git a/arch/m68k/fpsp040/sgetem.S b/arch/m68k/fpsp040/sgetem.S
new file mode 100644
index 000000000000..0fcbd045ba75
--- /dev/null
+++ b/arch/m68k/fpsp040/sgetem.S
@@ -0,0 +1,141 @@
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|
27| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
28| The copyright notice above does not evidence any
29| actual or intended publication of such source code.
30
31|SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package
32
33 |section 8
34
35#include "fpsp.h"
36
37 |xref nrm_set
38
39|
40| This entry point is used by the unimplemented instruction exception
41| handler. It points a0 to the input operand.
42|
43|
44|
45| SGETEXP
46|
47
48 .global sgetexp
49sgetexp:
50 movew LOCAL_EX(%a0),%d0 |get the exponent
51 bclrl #15,%d0 |clear the sign bit
52 subw #0x3fff,%d0 |subtract off the bias
53 fmovew %d0,%fp0 |move the exp to fp0
54 rts
55
56 .global sgetexpd
57sgetexpd:
58 bclrb #sign_bit,LOCAL_EX(%a0)
59 bsr nrm_set |normalize (exp will go negative)
60 movew LOCAL_EX(%a0),%d0 |load resulting exponent into d0
61 subw #0x3fff,%d0 |subtract off the bias
62 fmovew %d0,%fp0 |move the exp to fp0
63 rts
64|
65|
66| This entry point is used by the unimplemented instruction exception
67| handler. It points a0 to the input operand.
68|
69|
70|
71| SGETMAN
72|
73|
74| For normalized numbers, leave the mantissa alone, simply load
75| with an exponent of +/- $3fff.
76|
77 .global sgetman
78sgetman:
79 movel USER_FPCR(%a6),%d0
80 andil #0xffffff00,%d0 |clear rounding precision and mode
81 fmovel %d0,%fpcr |this fpcr setting is used by the 882
82 movew LOCAL_EX(%a0),%d0 |get the exp (really just want sign bit)
83 orw #0x7fff,%d0 |clear old exp
84 bclrl #14,%d0 |make it the new exp +-3fff
85 movew %d0,LOCAL_EX(%a0) |move the sign & exp back to fsave stack
86 fmovex (%a0),%fp0 |put new value back in fp0
87 rts
88
89|
90| For denormalized numbers, shift the mantissa until the j-bit = 1,
91| then load the exponent with +/1 $3fff.
92|
93 .global sgetmand
94sgetmand:
95 movel LOCAL_HI(%a0),%d0 |load ms mant in d0
96 movel LOCAL_LO(%a0),%d1 |load ls mant in d1
97 bsr shft |shift mantissa bits till msbit is set
98 movel %d0,LOCAL_HI(%a0) |put ms mant back on stack
99 movel %d1,LOCAL_LO(%a0) |put ls mant back on stack
100 bras sgetman
101
102|
103| SHFT
104|
105| Shifts the mantissa bits until msbit is set.
106| input:
107| ms mantissa part in d0
108| ls mantissa part in d1
109| output:
110| shifted bits in d0 and d1
111shft:
112 tstl %d0 |if any bits set in ms mant
113 bnes upper |then branch
114| ;else no bits set in ms mant
115 tstl %d1 |test if any bits set in ls mant
116 bnes cont |if set then continue
117 bras shft_end |else return
118cont:
119 movel %d3,-(%a7) |save d3
120 exg %d0,%d1 |shift ls mant to ms mant
121 bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0
122 lsll %d3,%d0 |shift first 1 to integer bit in ms mant
123 movel (%a7)+,%d3 |restore d3
124 bras shft_end
125upper:
126
127 moveml %d3/%d5/%d6,-(%a7) |save registers
128 bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0
129 lsll %d3,%d0 |shift ms mant until j-bit is set
130 movel %d1,%d6 |save ls mant in d6
131 lsll %d3,%d1 |shift ls mant by count
132 movel #32,%d5
133 subl %d3,%d5 |sub 32 from shift for ls mant
134 lsrl %d5,%d6 |shift off all bits but those that will
135| ;be shifted into ms mant
136 orl %d6,%d0 |shift the ls mant bits into the ms mant
137 moveml (%a7)+,%d3/%d5/%d6 |restore registers
138shft_end:
139 rts
140
141 |end