summaryrefslogtreecommitdiff
path: root/sys/arch/m68k/fpsp/sgetem.sa
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/m68k/fpsp/sgetem.sa')
-rw-r--r--sys/arch/m68k/fpsp/sgetem.sa166
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