Acked-by: Alan Cox <alan@redhat.com> Signed-off-by: Matt Waddel <Matt.Waddel@freescale.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			3.6 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			3.6 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|
 | 
						|
|	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
 | 
						|
|
 | 
						|
|       For details on the license for this file, please see the
 | 
						|
|       file, README, in this same directory.
 | 
						|
 | 
						|
|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
 | 
						|
|
 | 
						|
 | 
						|
	.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
 |