Merge tag 'v3.3.7' into 3.3/master
[zen-stable.git] / arch / m68k / fpsp040 / sgetem.S
blobd9234f4aed57c8801c2a23b99fe4a2d91bdd2ec5
2 |       sgetem.sa 3.1 12/10/90
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.
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).
16 |       Input:  Double-extended number X in the ETEMP space in
17 |               the floating-point save stack.
19 |       Output: The functions return exp(X) or man(X) in fp0.
21 |       Modified: fp0.
24 |               Copyright (C) Motorola, Inc. 1990
25 |                       All Rights Reserved
27 |       For details on the license for this file, please see the
28 |       file, README, in this same directory.
30 |SGETEM idnt    2,1 | Motorola 040 Floating Point Software Package
32         |section 8
34 #include "fpsp.h"
36         |xref   nrm_set
39 | This entry point is used by the unimplemented instruction exception
40 | handler.  It points a0 to the input operand.
44 |       SGETEXP
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
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
65 | This entry point is used by the unimplemented instruction exception
66 | handler.  It points a0 to the input operand.
70 |       SGETMAN
73 | For normalized numbers, leave the mantissa alone, simply load
74 | with an exponent of +/- $3fff.
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
89 | For denormalized numbers, shift the mantissa until the j-bit = 1,
90 | then load the exponent with +/1 $3fff.
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
102 |       SHFT
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:
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
140         |end