// // $Id$ // // 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.defs" |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