162306a36Sopenharmony_ci|
262306a36Sopenharmony_ci|	scale.sa 3.3 7/30/91
362306a36Sopenharmony_ci|
462306a36Sopenharmony_ci|	The entry point sSCALE computes the destination operand
562306a36Sopenharmony_ci|	scaled by the source operand.  If the absolute value of
662306a36Sopenharmony_ci|	the source operand is (>= 2^14) an overflow or underflow
762306a36Sopenharmony_ci|	is returned.
862306a36Sopenharmony_ci|
962306a36Sopenharmony_ci|	The entry point sscale is called from do_func to emulate
1062306a36Sopenharmony_ci|	the fscale unimplemented instruction.
1162306a36Sopenharmony_ci|
1262306a36Sopenharmony_ci|	Input: Double-extended destination operand in FPTEMP,
1362306a36Sopenharmony_ci|		double-extended source operand in ETEMP.
1462306a36Sopenharmony_ci|
1562306a36Sopenharmony_ci|	Output: The function returns scale(X,Y) to fp0.
1662306a36Sopenharmony_ci|
1762306a36Sopenharmony_ci|	Modifies: fp0.
1862306a36Sopenharmony_ci|
1962306a36Sopenharmony_ci|	Algorithm:
2062306a36Sopenharmony_ci|
2162306a36Sopenharmony_ci|		Copyright (C) Motorola, Inc. 1990
2262306a36Sopenharmony_ci|			All Rights Reserved
2362306a36Sopenharmony_ci|
2462306a36Sopenharmony_ci|       For details on the license for this file, please see the
2562306a36Sopenharmony_ci|       file, README, in this same directory.
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci|SCALE    idnt    2,1 | Motorola 040 Floating Point Software Package
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	|section	8
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#include "fpsp.h"
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	|xref	t_ovfl2
3462306a36Sopenharmony_ci	|xref	t_unfl
3562306a36Sopenharmony_ci	|xref	round
3662306a36Sopenharmony_ci	|xref	t_resdnrm
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciSRC_BNDS: .short	0x3fff,0x400c
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci|
4162306a36Sopenharmony_ci| This entry point is used by the unimplemented instruction exception
4262306a36Sopenharmony_ci| handler.
4362306a36Sopenharmony_ci|
4462306a36Sopenharmony_ci|
4562306a36Sopenharmony_ci|
4662306a36Sopenharmony_ci|	FSCALE
4762306a36Sopenharmony_ci|
4862306a36Sopenharmony_ci	.global	sscale
4962306a36Sopenharmony_cisscale:
5062306a36Sopenharmony_ci	fmovel		#0,%fpcr		|clr user enabled exc
5162306a36Sopenharmony_ci	clrl		%d1
5262306a36Sopenharmony_ci	movew		FPTEMP(%a6),%d1	|get dest exponent
5362306a36Sopenharmony_ci	smi		L_SCR1(%a6)	|use L_SCR1 to hold sign
5462306a36Sopenharmony_ci	andil		#0x7fff,%d1	|strip sign
5562306a36Sopenharmony_ci	movew		ETEMP(%a6),%d0	|check src bounds
5662306a36Sopenharmony_ci	andiw		#0x7fff,%d0	|clr sign bit
5762306a36Sopenharmony_ci	cmp2w		SRC_BNDS,%d0
5862306a36Sopenharmony_ci	bccs		src_in
5962306a36Sopenharmony_ci	cmpiw		#0x400c,%d0	|test for too large
6062306a36Sopenharmony_ci	bge		src_out
6162306a36Sopenharmony_ci|
6262306a36Sopenharmony_ci| The source input is below 1, so we check for denormalized numbers
6362306a36Sopenharmony_ci| and set unfl.
6462306a36Sopenharmony_ci|
6562306a36Sopenharmony_cisrc_small:
6662306a36Sopenharmony_ci	moveb		DTAG(%a6),%d0
6762306a36Sopenharmony_ci	andib		#0xe0,%d0
6862306a36Sopenharmony_ci	tstb		%d0
6962306a36Sopenharmony_ci	beqs		no_denorm
7062306a36Sopenharmony_ci	st		STORE_FLG(%a6)	|dest already contains result
7162306a36Sopenharmony_ci	orl		#unfl_mask,USER_FPSR(%a6) |set UNFL
7262306a36Sopenharmony_ciden_done:
7362306a36Sopenharmony_ci	leal		FPTEMP(%a6),%a0
7462306a36Sopenharmony_ci	bra		t_resdnrm
7562306a36Sopenharmony_cino_denorm:
7662306a36Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
7762306a36Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|simply return dest
7862306a36Sopenharmony_ci	rts
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci|
8262306a36Sopenharmony_ci| Source is within 2^14 range.  To perform the int operation,
8362306a36Sopenharmony_ci| move it to d0.
8462306a36Sopenharmony_ci|
8562306a36Sopenharmony_cisrc_in:
8662306a36Sopenharmony_ci	fmovex		ETEMP(%a6),%fp0	|move in src for int
8762306a36Sopenharmony_ci	fmovel		#rz_mode,%fpcr	|force rz for src conversion
8862306a36Sopenharmony_ci	fmovel		%fp0,%d0		|int src to d0
8962306a36Sopenharmony_ci	fmovel		#0,%FPSR		|clr status from above
9062306a36Sopenharmony_ci	tstw		ETEMP(%a6)	|check src sign
9162306a36Sopenharmony_ci	blt		src_neg
9262306a36Sopenharmony_ci|
9362306a36Sopenharmony_ci| Source is positive.  Add the src to the dest exponent.
9462306a36Sopenharmony_ci| The result can be denormalized, if src = 0, or overflow,
9562306a36Sopenharmony_ci| if the result of the add sets a bit in the upper word.
9662306a36Sopenharmony_ci|
9762306a36Sopenharmony_cisrc_pos:
9862306a36Sopenharmony_ci	tstw		%d1		|check for denorm
9962306a36Sopenharmony_ci	beq		dst_dnrm
10062306a36Sopenharmony_ci	addl		%d0,%d1		|add src to dest exp
10162306a36Sopenharmony_ci	beqs		denorm		|if zero, result is denorm
10262306a36Sopenharmony_ci	cmpil		#0x7fff,%d1	|test for overflow
10362306a36Sopenharmony_ci	bges		ovfl
10462306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
10562306a36Sopenharmony_ci	beqs		spos_pos
10662306a36Sopenharmony_ci	orw		#0x8000,%d1
10762306a36Sopenharmony_cispos_pos:
10862306a36Sopenharmony_ci	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
10962306a36Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
11062306a36Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
11162306a36Sopenharmony_ci	rts
11262306a36Sopenharmony_ciovfl:
11362306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
11462306a36Sopenharmony_ci	beqs		sovl_pos
11562306a36Sopenharmony_ci	orw		#0x8000,%d1
11662306a36Sopenharmony_cisovl_pos:
11762306a36Sopenharmony_ci	movew		FPTEMP(%a6),ETEMP(%a6)	|result in ETEMP
11862306a36Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
11962306a36Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
12062306a36Sopenharmony_ci	bra		t_ovfl2
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cidenorm:
12362306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
12462306a36Sopenharmony_ci	beqs		den_pos
12562306a36Sopenharmony_ci	orw		#0x8000,%d1
12662306a36Sopenharmony_ciden_pos:
12762306a36Sopenharmony_ci	tstl		FPTEMP_HI(%a6)	|check j bit
12862306a36Sopenharmony_ci	blts		nden_exit	|if set, not denorm
12962306a36Sopenharmony_ci	movew		%d1,ETEMP(%a6)	|input expected in ETEMP
13062306a36Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
13162306a36Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
13262306a36Sopenharmony_ci	orl		#unfl_bit,USER_FPSR(%a6)	|set unfl
13362306a36Sopenharmony_ci	leal		ETEMP(%a6),%a0
13462306a36Sopenharmony_ci	bra		t_resdnrm
13562306a36Sopenharmony_cinden_exit:
13662306a36Sopenharmony_ci	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
13762306a36Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
13862306a36Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
13962306a36Sopenharmony_ci	rts
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci|
14262306a36Sopenharmony_ci| Source is negative.  Add the src to the dest exponent.
14362306a36Sopenharmony_ci| (The result exponent will be reduced).  The result can be
14462306a36Sopenharmony_ci| denormalized.
14562306a36Sopenharmony_ci|
14662306a36Sopenharmony_cisrc_neg:
14762306a36Sopenharmony_ci	addl		%d0,%d1		|add src to dest
14862306a36Sopenharmony_ci	beqs		denorm		|if zero, result is denorm
14962306a36Sopenharmony_ci	blts		fix_dnrm	|if negative, result is
15062306a36Sopenharmony_ci|					;needing denormalization
15162306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
15262306a36Sopenharmony_ci	beqs		sneg_pos
15362306a36Sopenharmony_ci	orw		#0x8000,%d1
15462306a36Sopenharmony_cisneg_pos:
15562306a36Sopenharmony_ci	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
15662306a36Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
15762306a36Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
15862306a36Sopenharmony_ci	rts
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci|
16262306a36Sopenharmony_ci| The result exponent is below denorm value.  Test for catastrophic
16362306a36Sopenharmony_ci| underflow and force zero if true.  If not, try to shift the
16462306a36Sopenharmony_ci| mantissa right until a zero exponent exists.
16562306a36Sopenharmony_ci|
16662306a36Sopenharmony_cifix_dnrm:
16762306a36Sopenharmony_ci	cmpiw		#0xffc0,%d1	|lower bound for normalization
16862306a36Sopenharmony_ci	blt		fix_unfl	|if lower, catastrophic unfl
16962306a36Sopenharmony_ci	movew		%d1,%d0		|use d0 for exp
17062306a36Sopenharmony_ci	movel		%d2,-(%a7)	|free d2 for norm
17162306a36Sopenharmony_ci	movel		FPTEMP_HI(%a6),%d1
17262306a36Sopenharmony_ci	movel		FPTEMP_LO(%a6),%d2
17362306a36Sopenharmony_ci	clrl		L_SCR2(%a6)
17462306a36Sopenharmony_cifix_loop:
17562306a36Sopenharmony_ci	addw		#1,%d0		|drive d0 to 0
17662306a36Sopenharmony_ci	lsrl		#1,%d1		|while shifting the
17762306a36Sopenharmony_ci	roxrl		#1,%d2		|mantissa to the right
17862306a36Sopenharmony_ci	bccs		no_carry
17962306a36Sopenharmony_ci	st		L_SCR2(%a6)	|use L_SCR2 to capture inex
18062306a36Sopenharmony_cino_carry:
18162306a36Sopenharmony_ci	tstw		%d0		|it is finished when
18262306a36Sopenharmony_ci	blts		fix_loop	|d0 is zero or the mantissa
18362306a36Sopenharmony_ci	tstb		L_SCR2(%a6)
18462306a36Sopenharmony_ci	beqs		tst_zero
18562306a36Sopenharmony_ci	orl		#unfl_inx_mask,USER_FPSR(%a6)
18662306a36Sopenharmony_ci|					;set unfl, aunfl, ainex
18762306a36Sopenharmony_ci|
18862306a36Sopenharmony_ci| Test for zero. If zero, simply use fmove to return +/- zero
18962306a36Sopenharmony_ci| to the fpu.
19062306a36Sopenharmony_ci|
19162306a36Sopenharmony_citst_zero:
19262306a36Sopenharmony_ci	clrw		FPTEMP_EX(%a6)
19362306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|test for sign
19462306a36Sopenharmony_ci	beqs		tst_con
19562306a36Sopenharmony_ci	orw		#0x8000,FPTEMP_EX(%a6) |set sign bit
19662306a36Sopenharmony_citst_con:
19762306a36Sopenharmony_ci	movel		%d1,FPTEMP_HI(%a6)
19862306a36Sopenharmony_ci	movel		%d2,FPTEMP_LO(%a6)
19962306a36Sopenharmony_ci	movel		(%a7)+,%d2
20062306a36Sopenharmony_ci	tstl		%d1
20162306a36Sopenharmony_ci	bnes		not_zero
20262306a36Sopenharmony_ci	tstl		FPTEMP_LO(%a6)
20362306a36Sopenharmony_ci	bnes		not_zero
20462306a36Sopenharmony_ci|
20562306a36Sopenharmony_ci| Result is zero.  Check for rounding mode to set lsb.  If the
20662306a36Sopenharmony_ci| mode is rp, and the zero is positive, return smallest denorm.
20762306a36Sopenharmony_ci| If the mode is rm, and the zero is negative, return smallest
20862306a36Sopenharmony_ci| negative denorm.
20962306a36Sopenharmony_ci|
21062306a36Sopenharmony_ci	btstb		#5,FPCR_MODE(%a6) |test if rm or rp
21162306a36Sopenharmony_ci	beqs		no_dir
21262306a36Sopenharmony_ci	btstb		#4,FPCR_MODE(%a6) |check which one
21362306a36Sopenharmony_ci	beqs		zer_rm
21462306a36Sopenharmony_cizer_rp:
21562306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
21662306a36Sopenharmony_ci	bnes		no_dir		|if set, neg op, no inc
21762306a36Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
21862306a36Sopenharmony_ci	bras		sm_dnrm
21962306a36Sopenharmony_cizer_rm:
22062306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
22162306a36Sopenharmony_ci	beqs		no_dir		|if clr, neg op, no inc
22262306a36Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
22362306a36Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
22462306a36Sopenharmony_ci	bras		sm_dnrm
22562306a36Sopenharmony_cino_dir:
22662306a36Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
22762306a36Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|use fmove to set cc's
22862306a36Sopenharmony_ci	rts
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci|
23162306a36Sopenharmony_ci| The rounding mode changed the zero to a smallest denorm. Call
23262306a36Sopenharmony_ci| t_resdnrm with exceptional operand in ETEMP.
23362306a36Sopenharmony_ci|
23462306a36Sopenharmony_cism_dnrm:
23562306a36Sopenharmony_ci	movel		FPTEMP_EX(%a6),ETEMP_EX(%a6)
23662306a36Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
23762306a36Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
23862306a36Sopenharmony_ci	leal		ETEMP(%a6),%a0
23962306a36Sopenharmony_ci	bra		t_resdnrm
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci|
24262306a36Sopenharmony_ci| Result is still denormalized.
24362306a36Sopenharmony_ci|
24462306a36Sopenharmony_cinot_zero:
24562306a36Sopenharmony_ci	orl		#unfl_mask,USER_FPSR(%a6) |set unfl
24662306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|check for sign
24762306a36Sopenharmony_ci	beqs		fix_exit
24862306a36Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
24962306a36Sopenharmony_cifix_exit:
25062306a36Sopenharmony_ci	bras		sm_dnrm
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci|
25462306a36Sopenharmony_ci| The result has underflowed to zero. Return zero and set
25562306a36Sopenharmony_ci| unfl, aunfl, and ainex.
25662306a36Sopenharmony_ci|
25762306a36Sopenharmony_cifix_unfl:
25862306a36Sopenharmony_ci	orl		#unfl_inx_mask,USER_FPSR(%a6)
25962306a36Sopenharmony_ci	btstb		#5,FPCR_MODE(%a6) |test if rm or rp
26062306a36Sopenharmony_ci	beqs		no_dir2
26162306a36Sopenharmony_ci	btstb		#4,FPCR_MODE(%a6) |check which one
26262306a36Sopenharmony_ci	beqs		zer_rm2
26362306a36Sopenharmony_cizer_rp2:
26462306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
26562306a36Sopenharmony_ci	bnes		no_dir2		|if set, neg op, no inc
26662306a36Sopenharmony_ci	clrl		FPTEMP_EX(%a6)
26762306a36Sopenharmony_ci	clrl		FPTEMP_HI(%a6)
26862306a36Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
26962306a36Sopenharmony_ci	bras		sm_dnrm		|return smallest denorm
27062306a36Sopenharmony_cizer_rm2:
27162306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
27262306a36Sopenharmony_ci	beqs		no_dir2		|if clr, neg op, no inc
27362306a36Sopenharmony_ci	movew		#0x8000,FPTEMP_EX(%a6)
27462306a36Sopenharmony_ci	clrl		FPTEMP_HI(%a6)
27562306a36Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
27662306a36Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
27762306a36Sopenharmony_ci	bra		sm_dnrm		|return smallest denorm
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cino_dir2:
28062306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
28162306a36Sopenharmony_ci	bges		pos_zero
28262306a36Sopenharmony_cineg_zero:
28362306a36Sopenharmony_ci	clrl		FP_SCR1(%a6)	|clear the exceptional operand
28462306a36Sopenharmony_ci	clrl		FP_SCR1+4(%a6)	|for gen_except.
28562306a36Sopenharmony_ci	clrl		FP_SCR1+8(%a6)
28662306a36Sopenharmony_ci	fmoves		#0x80000000,%fp0
28762306a36Sopenharmony_ci	rts
28862306a36Sopenharmony_cipos_zero:
28962306a36Sopenharmony_ci	clrl		FP_SCR1(%a6)	|clear the exceptional operand
29062306a36Sopenharmony_ci	clrl		FP_SCR1+4(%a6)	|for gen_except.
29162306a36Sopenharmony_ci	clrl		FP_SCR1+8(%a6)
29262306a36Sopenharmony_ci	fmoves		#0x00000000,%fp0
29362306a36Sopenharmony_ci	rts
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci|
29662306a36Sopenharmony_ci| The destination is a denormalized number.  It must be handled
29762306a36Sopenharmony_ci| by first shifting the bits in the mantissa until it is normalized,
29862306a36Sopenharmony_ci| then adding the remainder of the source to the exponent.
29962306a36Sopenharmony_ci|
30062306a36Sopenharmony_cidst_dnrm:
30162306a36Sopenharmony_ci	moveml		%d2/%d3,-(%a7)
30262306a36Sopenharmony_ci	movew		FPTEMP_EX(%a6),%d1
30362306a36Sopenharmony_ci	movel		FPTEMP_HI(%a6),%d2
30462306a36Sopenharmony_ci	movel		FPTEMP_LO(%a6),%d3
30562306a36Sopenharmony_cidst_loop:
30662306a36Sopenharmony_ci	tstl		%d2		|test for normalized result
30762306a36Sopenharmony_ci	blts		dst_norm	|exit loop if so
30862306a36Sopenharmony_ci	tstl		%d0		|otherwise, test shift count
30962306a36Sopenharmony_ci	beqs		dst_fin		|if zero, shifting is done
31062306a36Sopenharmony_ci	subil		#1,%d0		|dec src
31162306a36Sopenharmony_ci	lsll		#1,%d3
31262306a36Sopenharmony_ci	roxll		#1,%d2
31362306a36Sopenharmony_ci	bras		dst_loop
31462306a36Sopenharmony_ci|
31562306a36Sopenharmony_ci| Destination became normalized.  Simply add the remaining
31662306a36Sopenharmony_ci| portion of the src to the exponent.
31762306a36Sopenharmony_ci|
31862306a36Sopenharmony_cidst_norm:
31962306a36Sopenharmony_ci	addw		%d0,%d1		|dst is normalized; add src
32062306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
32162306a36Sopenharmony_ci	beqs		dnrm_pos
32262306a36Sopenharmony_ci	orl		#0x8000,%d1
32362306a36Sopenharmony_cidnrm_pos:
32462306a36Sopenharmony_ci	movemw		%d1,FPTEMP_EX(%a6)
32562306a36Sopenharmony_ci	moveml		%d2,FPTEMP_HI(%a6)
32662306a36Sopenharmony_ci	moveml		%d3,FPTEMP_LO(%a6)
32762306a36Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
32862306a36Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0
32962306a36Sopenharmony_ci	moveml		(%a7)+,%d2/%d3
33062306a36Sopenharmony_ci	rts
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci|
33362306a36Sopenharmony_ci| Destination remained denormalized.  Call t_excdnrm with
33462306a36Sopenharmony_ci| exceptional operand in ETEMP.
33562306a36Sopenharmony_ci|
33662306a36Sopenharmony_cidst_fin:
33762306a36Sopenharmony_ci	tstb		L_SCR1(%a6)	|check for sign
33862306a36Sopenharmony_ci	beqs		dst_exit
33962306a36Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
34062306a36Sopenharmony_ci	orl		#0x8000,%d1
34162306a36Sopenharmony_cidst_exit:
34262306a36Sopenharmony_ci	movemw		%d1,ETEMP_EX(%a6)
34362306a36Sopenharmony_ci	moveml		%d2,ETEMP_HI(%a6)
34462306a36Sopenharmony_ci	moveml		%d3,ETEMP_LO(%a6)
34562306a36Sopenharmony_ci	orl		#unfl_mask,USER_FPSR(%a6) |set unfl
34662306a36Sopenharmony_ci	moveml		(%a7)+,%d2/%d3
34762306a36Sopenharmony_ci	leal		ETEMP(%a6),%a0
34862306a36Sopenharmony_ci	bra		t_resdnrm
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci|
35162306a36Sopenharmony_ci| Source is outside of 2^14 range.  Test the sign and branch
35262306a36Sopenharmony_ci| to the appropriate exception handler.
35362306a36Sopenharmony_ci|
35462306a36Sopenharmony_cisrc_out:
35562306a36Sopenharmony_ci	tstb		L_SCR1(%a6)
35662306a36Sopenharmony_ci	beqs		scro_pos
35762306a36Sopenharmony_ci	orl		#0x8000,%d1
35862306a36Sopenharmony_ciscro_pos:
35962306a36Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
36062306a36Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
36162306a36Sopenharmony_ci	tstw		ETEMP(%a6)
36262306a36Sopenharmony_ci	blts		res_neg
36362306a36Sopenharmony_cires_pos:
36462306a36Sopenharmony_ci	movew		%d1,ETEMP(%a6)	|result in ETEMP
36562306a36Sopenharmony_ci	bra		t_ovfl2
36662306a36Sopenharmony_cires_neg:
36762306a36Sopenharmony_ci	movew		%d1,ETEMP(%a6)	|result in ETEMP
36862306a36Sopenharmony_ci	leal		ETEMP(%a6),%a0
36962306a36Sopenharmony_ci	bra		t_unfl
37062306a36Sopenharmony_ci	|end
371