18c2ecf20Sopenharmony_ci|
28c2ecf20Sopenharmony_ci|	scale.sa 3.3 7/30/91
38c2ecf20Sopenharmony_ci|
48c2ecf20Sopenharmony_ci|	The entry point sSCALE computes the destination operand
58c2ecf20Sopenharmony_ci|	scaled by the source operand.  If the absolute value of
68c2ecf20Sopenharmony_ci|	the source operand is (>= 2^14) an overflow or underflow
78c2ecf20Sopenharmony_ci|	is returned.
88c2ecf20Sopenharmony_ci|
98c2ecf20Sopenharmony_ci|	The entry point sscale is called from do_func to emulate
108c2ecf20Sopenharmony_ci|	the fscale unimplemented instruction.
118c2ecf20Sopenharmony_ci|
128c2ecf20Sopenharmony_ci|	Input: Double-extended destination operand in FPTEMP,
138c2ecf20Sopenharmony_ci|		double-extended source operand in ETEMP.
148c2ecf20Sopenharmony_ci|
158c2ecf20Sopenharmony_ci|	Output: The function returns scale(X,Y) to fp0.
168c2ecf20Sopenharmony_ci|
178c2ecf20Sopenharmony_ci|	Modifies: fp0.
188c2ecf20Sopenharmony_ci|
198c2ecf20Sopenharmony_ci|	Algorithm:
208c2ecf20Sopenharmony_ci|
218c2ecf20Sopenharmony_ci|		Copyright (C) Motorola, Inc. 1990
228c2ecf20Sopenharmony_ci|			All Rights Reserved
238c2ecf20Sopenharmony_ci|
248c2ecf20Sopenharmony_ci|       For details on the license for this file, please see the
258c2ecf20Sopenharmony_ci|       file, README, in this same directory.
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci|SCALE    idnt    2,1 | Motorola 040 Floating Point Software Package
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	|section	8
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#include "fpsp.h"
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	|xref	t_ovfl2
348c2ecf20Sopenharmony_ci	|xref	t_unfl
358c2ecf20Sopenharmony_ci	|xref	round
368c2ecf20Sopenharmony_ci	|xref	t_resdnrm
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciSRC_BNDS: .short	0x3fff,0x400c
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci|
418c2ecf20Sopenharmony_ci| This entry point is used by the unimplemented instruction exception
428c2ecf20Sopenharmony_ci| handler.
438c2ecf20Sopenharmony_ci|
448c2ecf20Sopenharmony_ci|
458c2ecf20Sopenharmony_ci|
468c2ecf20Sopenharmony_ci|	FSCALE
478c2ecf20Sopenharmony_ci|
488c2ecf20Sopenharmony_ci	.global	sscale
498c2ecf20Sopenharmony_cisscale:
508c2ecf20Sopenharmony_ci	fmovel		#0,%fpcr		|clr user enabled exc
518c2ecf20Sopenharmony_ci	clrl		%d1
528c2ecf20Sopenharmony_ci	movew		FPTEMP(%a6),%d1	|get dest exponent
538c2ecf20Sopenharmony_ci	smi		L_SCR1(%a6)	|use L_SCR1 to hold sign
548c2ecf20Sopenharmony_ci	andil		#0x7fff,%d1	|strip sign
558c2ecf20Sopenharmony_ci	movew		ETEMP(%a6),%d0	|check src bounds
568c2ecf20Sopenharmony_ci	andiw		#0x7fff,%d0	|clr sign bit
578c2ecf20Sopenharmony_ci	cmp2w		SRC_BNDS,%d0
588c2ecf20Sopenharmony_ci	bccs		src_in
598c2ecf20Sopenharmony_ci	cmpiw		#0x400c,%d0	|test for too large
608c2ecf20Sopenharmony_ci	bge		src_out
618c2ecf20Sopenharmony_ci|
628c2ecf20Sopenharmony_ci| The source input is below 1, so we check for denormalized numbers
638c2ecf20Sopenharmony_ci| and set unfl.
648c2ecf20Sopenharmony_ci|
658c2ecf20Sopenharmony_cisrc_small:
668c2ecf20Sopenharmony_ci	moveb		DTAG(%a6),%d0
678c2ecf20Sopenharmony_ci	andib		#0xe0,%d0
688c2ecf20Sopenharmony_ci	tstb		%d0
698c2ecf20Sopenharmony_ci	beqs		no_denorm
708c2ecf20Sopenharmony_ci	st		STORE_FLG(%a6)	|dest already contains result
718c2ecf20Sopenharmony_ci	orl		#unfl_mask,USER_FPSR(%a6) |set UNFL
728c2ecf20Sopenharmony_ciden_done:
738c2ecf20Sopenharmony_ci	leal		FPTEMP(%a6),%a0
748c2ecf20Sopenharmony_ci	bra		t_resdnrm
758c2ecf20Sopenharmony_cino_denorm:
768c2ecf20Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
778c2ecf20Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|simply return dest
788c2ecf20Sopenharmony_ci	rts
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci|
828c2ecf20Sopenharmony_ci| Source is within 2^14 range.  To perform the int operation,
838c2ecf20Sopenharmony_ci| move it to d0.
848c2ecf20Sopenharmony_ci|
858c2ecf20Sopenharmony_cisrc_in:
868c2ecf20Sopenharmony_ci	fmovex		ETEMP(%a6),%fp0	|move in src for int
878c2ecf20Sopenharmony_ci	fmovel		#rz_mode,%fpcr	|force rz for src conversion
888c2ecf20Sopenharmony_ci	fmovel		%fp0,%d0		|int src to d0
898c2ecf20Sopenharmony_ci	fmovel		#0,%FPSR		|clr status from above
908c2ecf20Sopenharmony_ci	tstw		ETEMP(%a6)	|check src sign
918c2ecf20Sopenharmony_ci	blt		src_neg
928c2ecf20Sopenharmony_ci|
938c2ecf20Sopenharmony_ci| Source is positive.  Add the src to the dest exponent.
948c2ecf20Sopenharmony_ci| The result can be denormalized, if src = 0, or overflow,
958c2ecf20Sopenharmony_ci| if the result of the add sets a bit in the upper word.
968c2ecf20Sopenharmony_ci|
978c2ecf20Sopenharmony_cisrc_pos:
988c2ecf20Sopenharmony_ci	tstw		%d1		|check for denorm
998c2ecf20Sopenharmony_ci	beq		dst_dnrm
1008c2ecf20Sopenharmony_ci	addl		%d0,%d1		|add src to dest exp
1018c2ecf20Sopenharmony_ci	beqs		denorm		|if zero, result is denorm
1028c2ecf20Sopenharmony_ci	cmpil		#0x7fff,%d1	|test for overflow
1038c2ecf20Sopenharmony_ci	bges		ovfl
1048c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
1058c2ecf20Sopenharmony_ci	beqs		spos_pos
1068c2ecf20Sopenharmony_ci	orw		#0x8000,%d1
1078c2ecf20Sopenharmony_cispos_pos:
1088c2ecf20Sopenharmony_ci	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
1098c2ecf20Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
1108c2ecf20Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
1118c2ecf20Sopenharmony_ci	rts
1128c2ecf20Sopenharmony_ciovfl:
1138c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
1148c2ecf20Sopenharmony_ci	beqs		sovl_pos
1158c2ecf20Sopenharmony_ci	orw		#0x8000,%d1
1168c2ecf20Sopenharmony_cisovl_pos:
1178c2ecf20Sopenharmony_ci	movew		FPTEMP(%a6),ETEMP(%a6)	|result in ETEMP
1188c2ecf20Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
1198c2ecf20Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
1208c2ecf20Sopenharmony_ci	bra		t_ovfl2
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_cidenorm:
1238c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
1248c2ecf20Sopenharmony_ci	beqs		den_pos
1258c2ecf20Sopenharmony_ci	orw		#0x8000,%d1
1268c2ecf20Sopenharmony_ciden_pos:
1278c2ecf20Sopenharmony_ci	tstl		FPTEMP_HI(%a6)	|check j bit
1288c2ecf20Sopenharmony_ci	blts		nden_exit	|if set, not denorm
1298c2ecf20Sopenharmony_ci	movew		%d1,ETEMP(%a6)	|input expected in ETEMP
1308c2ecf20Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
1318c2ecf20Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
1328c2ecf20Sopenharmony_ci	orl		#unfl_bit,USER_FPSR(%a6)	|set unfl
1338c2ecf20Sopenharmony_ci	leal		ETEMP(%a6),%a0
1348c2ecf20Sopenharmony_ci	bra		t_resdnrm
1358c2ecf20Sopenharmony_cinden_exit:
1368c2ecf20Sopenharmony_ci	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
1378c2ecf20Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
1388c2ecf20Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
1398c2ecf20Sopenharmony_ci	rts
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci|
1428c2ecf20Sopenharmony_ci| Source is negative.  Add the src to the dest exponent.
1438c2ecf20Sopenharmony_ci| (The result exponent will be reduced).  The result can be
1448c2ecf20Sopenharmony_ci| denormalized.
1458c2ecf20Sopenharmony_ci|
1468c2ecf20Sopenharmony_cisrc_neg:
1478c2ecf20Sopenharmony_ci	addl		%d0,%d1		|add src to dest
1488c2ecf20Sopenharmony_ci	beqs		denorm		|if zero, result is denorm
1498c2ecf20Sopenharmony_ci	blts		fix_dnrm	|if negative, result is
1508c2ecf20Sopenharmony_ci|					;needing denormalization
1518c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
1528c2ecf20Sopenharmony_ci	beqs		sneg_pos
1538c2ecf20Sopenharmony_ci	orw		#0x8000,%d1
1548c2ecf20Sopenharmony_cisneg_pos:
1558c2ecf20Sopenharmony_ci	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
1568c2ecf20Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
1578c2ecf20Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
1588c2ecf20Sopenharmony_ci	rts
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci|
1628c2ecf20Sopenharmony_ci| The result exponent is below denorm value.  Test for catastrophic
1638c2ecf20Sopenharmony_ci| underflow and force zero if true.  If not, try to shift the
1648c2ecf20Sopenharmony_ci| mantissa right until a zero exponent exists.
1658c2ecf20Sopenharmony_ci|
1668c2ecf20Sopenharmony_cifix_dnrm:
1678c2ecf20Sopenharmony_ci	cmpiw		#0xffc0,%d1	|lower bound for normalization
1688c2ecf20Sopenharmony_ci	blt		fix_unfl	|if lower, catastrophic unfl
1698c2ecf20Sopenharmony_ci	movew		%d1,%d0		|use d0 for exp
1708c2ecf20Sopenharmony_ci	movel		%d2,-(%a7)	|free d2 for norm
1718c2ecf20Sopenharmony_ci	movel		FPTEMP_HI(%a6),%d1
1728c2ecf20Sopenharmony_ci	movel		FPTEMP_LO(%a6),%d2
1738c2ecf20Sopenharmony_ci	clrl		L_SCR2(%a6)
1748c2ecf20Sopenharmony_cifix_loop:
1758c2ecf20Sopenharmony_ci	addw		#1,%d0		|drive d0 to 0
1768c2ecf20Sopenharmony_ci	lsrl		#1,%d1		|while shifting the
1778c2ecf20Sopenharmony_ci	roxrl		#1,%d2		|mantissa to the right
1788c2ecf20Sopenharmony_ci	bccs		no_carry
1798c2ecf20Sopenharmony_ci	st		L_SCR2(%a6)	|use L_SCR2 to capture inex
1808c2ecf20Sopenharmony_cino_carry:
1818c2ecf20Sopenharmony_ci	tstw		%d0		|it is finished when
1828c2ecf20Sopenharmony_ci	blts		fix_loop	|d0 is zero or the mantissa
1838c2ecf20Sopenharmony_ci	tstb		L_SCR2(%a6)
1848c2ecf20Sopenharmony_ci	beqs		tst_zero
1858c2ecf20Sopenharmony_ci	orl		#unfl_inx_mask,USER_FPSR(%a6)
1868c2ecf20Sopenharmony_ci|					;set unfl, aunfl, ainex
1878c2ecf20Sopenharmony_ci|
1888c2ecf20Sopenharmony_ci| Test for zero. If zero, simply use fmove to return +/- zero
1898c2ecf20Sopenharmony_ci| to the fpu.
1908c2ecf20Sopenharmony_ci|
1918c2ecf20Sopenharmony_citst_zero:
1928c2ecf20Sopenharmony_ci	clrw		FPTEMP_EX(%a6)
1938c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|test for sign
1948c2ecf20Sopenharmony_ci	beqs		tst_con
1958c2ecf20Sopenharmony_ci	orw		#0x8000,FPTEMP_EX(%a6) |set sign bit
1968c2ecf20Sopenharmony_citst_con:
1978c2ecf20Sopenharmony_ci	movel		%d1,FPTEMP_HI(%a6)
1988c2ecf20Sopenharmony_ci	movel		%d2,FPTEMP_LO(%a6)
1998c2ecf20Sopenharmony_ci	movel		(%a7)+,%d2
2008c2ecf20Sopenharmony_ci	tstl		%d1
2018c2ecf20Sopenharmony_ci	bnes		not_zero
2028c2ecf20Sopenharmony_ci	tstl		FPTEMP_LO(%a6)
2038c2ecf20Sopenharmony_ci	bnes		not_zero
2048c2ecf20Sopenharmony_ci|
2058c2ecf20Sopenharmony_ci| Result is zero.  Check for rounding mode to set lsb.  If the
2068c2ecf20Sopenharmony_ci| mode is rp, and the zero is positive, return smallest denorm.
2078c2ecf20Sopenharmony_ci| If the mode is rm, and the zero is negative, return smallest
2088c2ecf20Sopenharmony_ci| negative denorm.
2098c2ecf20Sopenharmony_ci|
2108c2ecf20Sopenharmony_ci	btstb		#5,FPCR_MODE(%a6) |test if rm or rp
2118c2ecf20Sopenharmony_ci	beqs		no_dir
2128c2ecf20Sopenharmony_ci	btstb		#4,FPCR_MODE(%a6) |check which one
2138c2ecf20Sopenharmony_ci	beqs		zer_rm
2148c2ecf20Sopenharmony_cizer_rp:
2158c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
2168c2ecf20Sopenharmony_ci	bnes		no_dir		|if set, neg op, no inc
2178c2ecf20Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
2188c2ecf20Sopenharmony_ci	bras		sm_dnrm
2198c2ecf20Sopenharmony_cizer_rm:
2208c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
2218c2ecf20Sopenharmony_ci	beqs		no_dir		|if clr, neg op, no inc
2228c2ecf20Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
2238c2ecf20Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
2248c2ecf20Sopenharmony_ci	bras		sm_dnrm
2258c2ecf20Sopenharmony_cino_dir:
2268c2ecf20Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
2278c2ecf20Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0	|use fmove to set cc's
2288c2ecf20Sopenharmony_ci	rts
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci|
2318c2ecf20Sopenharmony_ci| The rounding mode changed the zero to a smallest denorm. Call
2328c2ecf20Sopenharmony_ci| t_resdnrm with exceptional operand in ETEMP.
2338c2ecf20Sopenharmony_ci|
2348c2ecf20Sopenharmony_cism_dnrm:
2358c2ecf20Sopenharmony_ci	movel		FPTEMP_EX(%a6),ETEMP_EX(%a6)
2368c2ecf20Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
2378c2ecf20Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
2388c2ecf20Sopenharmony_ci	leal		ETEMP(%a6),%a0
2398c2ecf20Sopenharmony_ci	bra		t_resdnrm
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci|
2428c2ecf20Sopenharmony_ci| Result is still denormalized.
2438c2ecf20Sopenharmony_ci|
2448c2ecf20Sopenharmony_cinot_zero:
2458c2ecf20Sopenharmony_ci	orl		#unfl_mask,USER_FPSR(%a6) |set unfl
2468c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|check for sign
2478c2ecf20Sopenharmony_ci	beqs		fix_exit
2488c2ecf20Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
2498c2ecf20Sopenharmony_cifix_exit:
2508c2ecf20Sopenharmony_ci	bras		sm_dnrm
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci|
2548c2ecf20Sopenharmony_ci| The result has underflowed to zero. Return zero and set
2558c2ecf20Sopenharmony_ci| unfl, aunfl, and ainex.
2568c2ecf20Sopenharmony_ci|
2578c2ecf20Sopenharmony_cifix_unfl:
2588c2ecf20Sopenharmony_ci	orl		#unfl_inx_mask,USER_FPSR(%a6)
2598c2ecf20Sopenharmony_ci	btstb		#5,FPCR_MODE(%a6) |test if rm or rp
2608c2ecf20Sopenharmony_ci	beqs		no_dir2
2618c2ecf20Sopenharmony_ci	btstb		#4,FPCR_MODE(%a6) |check which one
2628c2ecf20Sopenharmony_ci	beqs		zer_rm2
2638c2ecf20Sopenharmony_cizer_rp2:
2648c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
2658c2ecf20Sopenharmony_ci	bnes		no_dir2		|if set, neg op, no inc
2668c2ecf20Sopenharmony_ci	clrl		FPTEMP_EX(%a6)
2678c2ecf20Sopenharmony_ci	clrl		FPTEMP_HI(%a6)
2688c2ecf20Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
2698c2ecf20Sopenharmony_ci	bras		sm_dnrm		|return smallest denorm
2708c2ecf20Sopenharmony_cizer_rm2:
2718c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|check sign
2728c2ecf20Sopenharmony_ci	beqs		no_dir2		|if clr, neg op, no inc
2738c2ecf20Sopenharmony_ci	movew		#0x8000,FPTEMP_EX(%a6)
2748c2ecf20Sopenharmony_ci	clrl		FPTEMP_HI(%a6)
2758c2ecf20Sopenharmony_ci	movel		#1,FPTEMP_LO(%a6) |set lsb
2768c2ecf20Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
2778c2ecf20Sopenharmony_ci	bra		sm_dnrm		|return smallest denorm
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_cino_dir2:
2808c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
2818c2ecf20Sopenharmony_ci	bges		pos_zero
2828c2ecf20Sopenharmony_cineg_zero:
2838c2ecf20Sopenharmony_ci	clrl		FP_SCR1(%a6)	|clear the exceptional operand
2848c2ecf20Sopenharmony_ci	clrl		FP_SCR1+4(%a6)	|for gen_except.
2858c2ecf20Sopenharmony_ci	clrl		FP_SCR1+8(%a6)
2868c2ecf20Sopenharmony_ci	fmoves		#0x80000000,%fp0
2878c2ecf20Sopenharmony_ci	rts
2888c2ecf20Sopenharmony_cipos_zero:
2898c2ecf20Sopenharmony_ci	clrl		FP_SCR1(%a6)	|clear the exceptional operand
2908c2ecf20Sopenharmony_ci	clrl		FP_SCR1+4(%a6)	|for gen_except.
2918c2ecf20Sopenharmony_ci	clrl		FP_SCR1+8(%a6)
2928c2ecf20Sopenharmony_ci	fmoves		#0x00000000,%fp0
2938c2ecf20Sopenharmony_ci	rts
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci|
2968c2ecf20Sopenharmony_ci| The destination is a denormalized number.  It must be handled
2978c2ecf20Sopenharmony_ci| by first shifting the bits in the mantissa until it is normalized,
2988c2ecf20Sopenharmony_ci| then adding the remainder of the source to the exponent.
2998c2ecf20Sopenharmony_ci|
3008c2ecf20Sopenharmony_cidst_dnrm:
3018c2ecf20Sopenharmony_ci	moveml		%d2/%d3,-(%a7)
3028c2ecf20Sopenharmony_ci	movew		FPTEMP_EX(%a6),%d1
3038c2ecf20Sopenharmony_ci	movel		FPTEMP_HI(%a6),%d2
3048c2ecf20Sopenharmony_ci	movel		FPTEMP_LO(%a6),%d3
3058c2ecf20Sopenharmony_cidst_loop:
3068c2ecf20Sopenharmony_ci	tstl		%d2		|test for normalized result
3078c2ecf20Sopenharmony_ci	blts		dst_norm	|exit loop if so
3088c2ecf20Sopenharmony_ci	tstl		%d0		|otherwise, test shift count
3098c2ecf20Sopenharmony_ci	beqs		dst_fin		|if zero, shifting is done
3108c2ecf20Sopenharmony_ci	subil		#1,%d0		|dec src
3118c2ecf20Sopenharmony_ci	lsll		#1,%d3
3128c2ecf20Sopenharmony_ci	roxll		#1,%d2
3138c2ecf20Sopenharmony_ci	bras		dst_loop
3148c2ecf20Sopenharmony_ci|
3158c2ecf20Sopenharmony_ci| Destination became normalized.  Simply add the remaining
3168c2ecf20Sopenharmony_ci| portion of the src to the exponent.
3178c2ecf20Sopenharmony_ci|
3188c2ecf20Sopenharmony_cidst_norm:
3198c2ecf20Sopenharmony_ci	addw		%d0,%d1		|dst is normalized; add src
3208c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
3218c2ecf20Sopenharmony_ci	beqs		dnrm_pos
3228c2ecf20Sopenharmony_ci	orl		#0x8000,%d1
3238c2ecf20Sopenharmony_cidnrm_pos:
3248c2ecf20Sopenharmony_ci	movemw		%d1,FPTEMP_EX(%a6)
3258c2ecf20Sopenharmony_ci	moveml		%d2,FPTEMP_HI(%a6)
3268c2ecf20Sopenharmony_ci	moveml		%d3,FPTEMP_LO(%a6)
3278c2ecf20Sopenharmony_ci	fmovel		USER_FPCR(%a6),%FPCR
3288c2ecf20Sopenharmony_ci	fmovex		FPTEMP(%a6),%fp0
3298c2ecf20Sopenharmony_ci	moveml		(%a7)+,%d2/%d3
3308c2ecf20Sopenharmony_ci	rts
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci|
3338c2ecf20Sopenharmony_ci| Destination remained denormalized.  Call t_excdnrm with
3348c2ecf20Sopenharmony_ci| exceptional operand in ETEMP.
3358c2ecf20Sopenharmony_ci|
3368c2ecf20Sopenharmony_cidst_fin:
3378c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)	|check for sign
3388c2ecf20Sopenharmony_ci	beqs		dst_exit
3398c2ecf20Sopenharmony_ci	orl		#neg_mask,USER_FPSR(%a6) |set N
3408c2ecf20Sopenharmony_ci	orl		#0x8000,%d1
3418c2ecf20Sopenharmony_cidst_exit:
3428c2ecf20Sopenharmony_ci	movemw		%d1,ETEMP_EX(%a6)
3438c2ecf20Sopenharmony_ci	moveml		%d2,ETEMP_HI(%a6)
3448c2ecf20Sopenharmony_ci	moveml		%d3,ETEMP_LO(%a6)
3458c2ecf20Sopenharmony_ci	orl		#unfl_mask,USER_FPSR(%a6) |set unfl
3468c2ecf20Sopenharmony_ci	moveml		(%a7)+,%d2/%d3
3478c2ecf20Sopenharmony_ci	leal		ETEMP(%a6),%a0
3488c2ecf20Sopenharmony_ci	bra		t_resdnrm
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci|
3518c2ecf20Sopenharmony_ci| Source is outside of 2^14 range.  Test the sign and branch
3528c2ecf20Sopenharmony_ci| to the appropriate exception handler.
3538c2ecf20Sopenharmony_ci|
3548c2ecf20Sopenharmony_cisrc_out:
3558c2ecf20Sopenharmony_ci	tstb		L_SCR1(%a6)
3568c2ecf20Sopenharmony_ci	beqs		scro_pos
3578c2ecf20Sopenharmony_ci	orl		#0x8000,%d1
3588c2ecf20Sopenharmony_ciscro_pos:
3598c2ecf20Sopenharmony_ci	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
3608c2ecf20Sopenharmony_ci	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
3618c2ecf20Sopenharmony_ci	tstw		ETEMP(%a6)
3628c2ecf20Sopenharmony_ci	blts		res_neg
3638c2ecf20Sopenharmony_cires_pos:
3648c2ecf20Sopenharmony_ci	movew		%d1,ETEMP(%a6)	|result in ETEMP
3658c2ecf20Sopenharmony_ci	bra		t_ovfl2
3668c2ecf20Sopenharmony_cires_neg:
3678c2ecf20Sopenharmony_ci	movew		%d1,ETEMP(%a6)	|result in ETEMP
3688c2ecf20Sopenharmony_ci	leal		ETEMP(%a6),%a0
3698c2ecf20Sopenharmony_ci	bra		t_unfl
3708c2ecf20Sopenharmony_ci	|end
371