xref: /csrg-svn/sys/tahoe/math/Kldexpf.s (revision 25664)
1/*	Kldexpf.s	1.2	86/01/03	*/
2
3#include "SYS.h"
4
5/* @(*)Kldexpf.s	4.2 (Berkeley) 12/21/80
6 *	Tahoe 		2/2/83
7 *
8 * float Kldexpf (op_most, op_least, exp, hfs)
9 *
10 * Ldexp returns value*2**exp, if that result is in range.
11 * If underflow occurs, it returns zero.  If overflow occurs,
12 * it returns a value of appropriate sign and largest
13 * possible magnitude.  In case of either overflow or underflow,
14 * the external int "errno" is set to ERANGE.  Note that errno is
15 * not modified if no error occurs, so if you intend to test it
16 * after you use Kldexpf, you had better set it to something
17 * other than ERANGE first (zero is a reasonable value to use).
18 */
19
20#include "fp.h"
21#include "Kfp.h"
22
23	.text
24ENTRY(Kldexpf, R2)
25	movl	4(fp),r0	/* Fetch "value" */
26	movl	8(fp),r1
27
28	andl3	$EXPMASK,r0,r2	/* r2 := shifted biased exponent */
29	jeql	ld1		/* If it's zero, we're done */
30	shar	$EXPSHIFT,r2,r2	/* shift to get value of exponent  */
31
32	addl2	12(fp),r2	/* r2 := new biased exponent */
33	jleq	under		/* if it's <= 0, we have an underflow */
34	cmpl	r2,$256		/* Otherwise check if it's too big */
35	jgeq	over		/* jump if overflow */
36/*
37 *	Construct the result and return
38 */
39	andl2	$0!EXPMASK,r0	/* clear old exponent */
40	shal 	$EXPSHIFT,r2,r2	/* Put the exponent back in the result */
41	orl2	r2,r0
42ld1:	ret
43/*
44 *	Underflow
45 */
46under:	clrl	r0		/* Result is zero */
47	clrl	r1
48	orl2	$HFS_UNDF,*16(fp)
49	jmp	err		/* Join general error code */
50/*
51 *	Overflow
52 */
53over:	movl	huge0,r0	/* Largest possible floating magnitude */
54	movl	huge1,r1
55	orl2	$HFS_OVF,*16(fp)
56	orl2	$SIGNBIT,r0	/* If arg < 0, make result negative */
57
58err:	orl2	$HFS_RANGE,*16(fp)	/* Indicate range error */
59	ret
60
61	.data
62huge0:	.long	0x7fffffff
63huge1:	.long	0xffffffff
64