Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/fpsp040/sgetem.S
10817 views
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
| For details on the license for this file, please see the
28
| file, README, in this same directory.
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
141
142