| | |
| | sgetem.sa 3.1 12/10/90 |
| | |
| | The entry point sGETEXP returns the exponent portion |
| | of the input argument. The exponent bias is removed |
| | and the exponent value is returned as an extended |
| | precision number in fp0. sGETEXPD handles denormalized |
| | numbers. |
| | |
| | The entry point sGETMAN extracts the mantissa of the |
| | input argument. The mantissa is converted to an |
| | extended precision number and returned in fp0. The |
| | range of the result is [1.0 - 2.0). |
| | |
| | |
| | Input: Double-extended number X in the ETEMP space in |
| | the floating-point save stack. |
| | |
| | Output: The functions return exp(X) or man(X) in fp0. |
| | |
| | Modified: fp0. |
| | |
| | |
| | Copyright (C) Motorola, Inc. 1990 |
| | All Rights Reserved |
| | |
| | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA |
| | The copyright notice above does not evidence any |
| | actual or intended publication of such source code. |
| |
| |SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package |
| |
| |section 8 |
| |
| #include "fpsp.h" |
| |
| |xref nrm_set |
| |
| | |
| | This entry point is used by the unimplemented instruction exception |
| | handler. It points a0 to the input operand. |
| | |
| | |
| | |
| | SGETEXP |
| | |
| |
| .global sgetexp |
| sgetexp: |
| movew LOCAL_EX(%a0),%d0 |get the exponent |
| bclrl #15,%d0 |clear the sign bit |
| subw #0x3fff,%d0 |subtract off the bias |
| fmovew %d0,%fp0 |move the exp to fp0 |
| rts |
| |
| .global sgetexpd |
| sgetexpd: |
| bclrb #sign_bit,LOCAL_EX(%a0) |
| bsr nrm_set |normalize (exp will go negative) |
| movew LOCAL_EX(%a0),%d0 |load resulting exponent into d0 |
| subw #0x3fff,%d0 |subtract off the bias |
| fmovew %d0,%fp0 |move the exp to fp0 |
| rts |
| | |
| | |
| | This entry point is used by the unimplemented instruction exception |
| | handler. It points a0 to the input operand. |
| | |
| | |
| | |
| | SGETMAN |
| | |
| | |
| | For normalized numbers, leave the mantissa alone, simply load |
| | with an exponent of +/- $3fff. |
| | |
| .global sgetman |
| sgetman: |
| movel USER_FPCR(%a6),%d0 |
| andil #0xffffff00,%d0 |clear rounding precision and mode |
| fmovel %d0,%fpcr |this fpcr setting is used by the 882 |
| movew LOCAL_EX(%a0),%d0 |get the exp (really just want sign bit) |
| orw #0x7fff,%d0 |clear old exp |
| bclrl #14,%d0 |make it the new exp +-3fff |
| movew %d0,LOCAL_EX(%a0) |move the sign & exp back to fsave stack |
| fmovex (%a0),%fp0 |put new value back in fp0 |
| rts |
| |
| | |
| | For denormalized numbers, shift the mantissa until the j-bit = 1, |
| | then load the exponent with +/1 $3fff. |
| | |
| .global sgetmand |
| sgetmand: |
| movel LOCAL_HI(%a0),%d0 |load ms mant in d0 |
| movel LOCAL_LO(%a0),%d1 |load ls mant in d1 |
| bsr shft |shift mantissa bits till msbit is set |
| movel %d0,LOCAL_HI(%a0) |put ms mant back on stack |
| movel %d1,LOCAL_LO(%a0) |put ls mant back on stack |
| bras sgetman |
| |
| | |
| | SHFT |
| | |
| | Shifts the mantissa bits until msbit is set. |
| | input: |
| | ms mantissa part in d0 |
| | ls mantissa part in d1 |
| | output: |
| | shifted bits in d0 and d1 |
| shft: |
| tstl %d0 |if any bits set in ms mant |
| bnes upper |then branch |
| | ;else no bits set in ms mant |
| tstl %d1 |test if any bits set in ls mant |
| bnes cont |if set then continue |
| bras shft_end |else return |
| cont: |
| movel %d3,-(%a7) |save d3 |
| exg %d0,%d1 |shift ls mant to ms mant |
| bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0 |
| lsll %d3,%d0 |shift first 1 to integer bit in ms mant |
| movel (%a7)+,%d3 |restore d3 |
| bras shft_end |
| upper: |
| |
| moveml %d3/%d5/%d6,-(%a7) |save registers |
| bfffo %d0{#0:#32},%d3 |find first 1 in ls mant to d0 |
| lsll %d3,%d0 |shift ms mant until j-bit is set |
| movel %d1,%d6 |save ls mant in d6 |
| lsll %d3,%d1 |shift ls mant by count |
| movel #32,%d5 |
| subl %d3,%d5 |sub 32 from shift for ls mant |
| lsrl %d5,%d6 |shift off all bits but those that will |
| | ;be shifted into ms mant |
| orl %d6,%d0 |shift the ls mant bits into the ms mant |
| moveml (%a7)+,%d3/%d5/%d6 |restore registers |
| shft_end: |
| rts |
| |
| |end |