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