Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | | |
Matt Waddel | e00d82d | 2006-02-11 17:55:48 -0800 | [diff] [blame] | 27 | | For details on the license for this file, please see the |
| 28 | | file, README, in this same directory. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |