 | remove exponent from floating point number
 | C Interface
 | double frexp(double value, int *eptr)
 |
 | returns significand (|significand| < 1)
 |	   in *eptr returns n such that value = significand * 2**n
 |-----------------------------------------------------------------------------
 | ported to 68000 by Kai-Uwe Bloem, 12/89
 |  #1  original author: Peter S. Housel 9/21/88,01/17/89,03/19/89,5/24/89
 |  #2	added support for denormalized numbers			-kub-, 01/90
 |  #   ported to gcc  ++jrb 04/90
 |-----------------------------------------------------------------------------

BIAS8	=	0x3ff - 1

	.text; .even
	.globl _frexp
_frexp:
	movel	sp@(12),a0	| initialize exponent for loop
#ifdef __MSHORT__
	clrw	a0@
#else
	clrl	a0@
#endif
	lea	sp@(4),a1
	moveml	d2-d7,sp@-
2:
	movew	a1@,d0		| extract value.exp
	movew	d0,d2		| extract value.sign	++jrb
	lsrw	#4,d0
	andw	#0x7ff,d0	| kill sign bit
	cmpw	#BIAS8,d0	| get out of loop if finally (a1) in [0.5,1.0)
	beq	3f

	andw	#0x0f,a1@	| remove exponent from value.mantissa
	tstw	d0		| check for zero exponent - no leading 1
	beq	0f
	orw	#0x10,a1@	| restore implied leading 1
	bra	1f
0:	addw	#1,d0
1:
	movel	a1@,d1		| check for zero
	orl	a1@(4),d1
	beq	3f		| if zero, all done : exp = 0, num = 0.0

	subw	#BIAS8,d0	| remove bias
#ifdef __MSHORT__		
	addw	d0,a0@		| add current exponent in
#else
	extl	d0
	addl	d0,a0@		| add current exponent in
#endif

	movew	#BIAS8,d0	| set bias for return value
	clrw	d1		| rounding = 0
	pea	L0		| call to norm_df (dirty, but dont ...
	moveml	d2-d7,sp@-	| ... need to copy with -mshort)
	moveml	a1@,d4-d5
	jmp	norm_df		| normalize result
L0:
	moveml	d0-d1,a1@
	bra	2b		| loop around to catch denormalized numbers
3:
	moveml	a1@,d0-d1
	moveml	sp@+,d2-d7
				| d0-d1 has normalized mantissa
	rts
