diff options
Diffstat (limited to 'sys/arch/m68k/fpsp/sgetem.sa')
-rw-r--r-- | sys/arch/m68k/fpsp/sgetem.sa | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/sys/arch/m68k/fpsp/sgetem.sa b/sys/arch/m68k/fpsp/sgetem.sa new file mode 100644 index 00000000000..2a4f28f612d --- /dev/null +++ b/sys/arch/m68k/fpsp/sgetem.sa @@ -0,0 +1,166 @@ +* $NetBSD: sgetem.sa,v 1.2 1994/10/26 07:49:45 cgd Exp $ + +* MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP +* M68000 Hi-Performance Microprocessor Division +* M68040 Software Package +* +* M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc. +* All rights reserved. +* +* THE SOFTWARE is provided on an "AS IS" basis and without warranty. +* To the maximum extent permitted by applicable law, +* MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, +* INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A +* PARTICULAR PURPOSE and any warranty against infringement with +* regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) +* and any accompanying written materials. +* +* To the maximum extent permitted by applicable law, +* IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER +* (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS +* PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR +* OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE +* SOFTWARE. Motorola assumes no responsibility for the maintenance +* and support of the SOFTWARE. +* +* You are hereby granted a copyright license to use, modify, and +* distribute the SOFTWARE so long as this entire notice is retained +* without alteration in any modified and/or redistributed versions, +* and that such modified versions are clearly identified as such. +* No licenses are granted by implication, estoppel or otherwise +* under any patents or trademarks of Motorola, Inc. + +* +* 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. +* + +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 +* + + xdef sgetexp +sgetexp: + move.w LOCAL_EX(a0),d0 ;get the exponent + bclr.l #15,d0 ;clear the sign bit + sub.w #$3fff,d0 ;subtract off the bias + fmove.w d0,fp0 ;move the exp to fp0 + rts + + xdef sgetexpd +sgetexpd: + bclr.b #sign_bit,LOCAL_EX(a0) + bsr nrm_set ;normalize (exp will go negative) + move.w LOCAL_EX(a0),d0 ;load resulting exponent into d0 + sub.w #$3fff,d0 ;subtract off the bias + fmove.w 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. +* + xdef sgetman +sgetman: + move.l USER_FPCR(a6),d0 + andi.l #$ffffff00,d0 ;clear rounding precision and mode + fmove.l d0,fpcr ;this fpcr setting is used by the 882 + move.w LOCAL_EX(a0),d0 ;get the exp (really just want sign bit) + or.w #$7fff,d0 ;clear old exp + bclr.l #14,d0 ;make it the new exp +-3fff + move.w d0,LOCAL_EX(a0) ;move the sign & exp back to fsave stack + fmove.x (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. +* + xdef sgetmand +sgetmand: + move.l LOCAL_HI(a0),d0 ;load ms mant in d0 + move.l LOCAL_LO(a0),d1 ;load ls mant in d1 + bsr shft ;shift mantissa bits till msbit is set + move.l d0,LOCAL_HI(a0) ;put ms mant back on stack + move.l d1,LOCAL_LO(a0) ;put ls mant back on stack + bra.b 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: + tst.l d0 ;if any bits set in ms mant + bne.b upper ;then branch +* ;else no bits set in ms mant + tst.l d1 ;test if any bits set in ls mant + bne.b cont ;if set then continue + bra.b shft_end ;else return +cont: + move.l 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 + lsl.l d3,d0 ;shift first 1 to integer bit in ms mant + move.l (a7)+,d3 ;restore d3 + bra.b shft_end +upper: + + movem.l d3/d5/d6,-(a7) ;save registers + bfffo d0{0:32},d3 ;find first 1 in ls mant to d0 + lsl.l d3,d0 ;shift ms mant until j-bit is set + move.l d1,d6 ;save ls mant in d6 + lsl.l d3,d1 ;shift ls mant by count + move.l #32,d5 + sub.l d3,d5 ;sub 32 from shift for ls mant + lsr.l d5,d6 ;shift off all bits but those that will +* ;be shifted into ms mant + or.l d6,d0 ;shift the ls mant bits into the ms mant + movem.l (a7)+,d3/d5/d6 ;restore registers +shft_end: + rts + + end |