[BACK]Return to sgetem.sa CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / fpsp

File: [local] / sys / arch / m68k / fpsp / sgetem.sa (download)

Revision 1.1, Tue Mar 4 16:07:07 2008 UTC (16 years, 2 months ago) by nbrk
Branch point for: MAIN

Initial revision

*	$OpenBSD: sgetem.sa,v 1.2 1996/05/29 21:05:37 niklas Exp $
*	$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