sgetem.S (3666B)
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 48sgetexp: 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 56sgetexpd: 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 77sgetman: 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 93sgetmand: 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 110shft: 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 117cont: 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 124upper: 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 137shft_end: 138 rts 139 140 |end