xref: /openbmc/linux/arch/m68k/fpsp040/scale.S (revision e00d82d0)
11da177e4SLinus Torvalds|
21da177e4SLinus Torvalds|	scale.sa 3.3 7/30/91
31da177e4SLinus Torvalds|
41da177e4SLinus Torvalds|	The entry point sSCALE computes the destination operand
51da177e4SLinus Torvalds|	scaled by the source operand.  If the absolute value of
61da177e4SLinus Torvalds|	the source operand is (>= 2^14) an overflow or underflow
71da177e4SLinus Torvalds|	is returned.
81da177e4SLinus Torvalds|
91da177e4SLinus Torvalds|	The entry point sscale is called from do_func to emulate
101da177e4SLinus Torvalds|	the fscale unimplemented instruction.
111da177e4SLinus Torvalds|
121da177e4SLinus Torvalds|	Input: Double-extended destination operand in FPTEMP,
131da177e4SLinus Torvalds|		double-extended source operand in ETEMP.
141da177e4SLinus Torvalds|
151da177e4SLinus Torvalds|	Output: The function returns scale(X,Y) to fp0.
161da177e4SLinus Torvalds|
171da177e4SLinus Torvalds|	Modifies: fp0.
181da177e4SLinus Torvalds|
191da177e4SLinus Torvalds|	Algorithm:
201da177e4SLinus Torvalds|
211da177e4SLinus Torvalds|		Copyright (C) Motorola, Inc. 1990
221da177e4SLinus Torvalds|			All Rights Reserved
231da177e4SLinus Torvalds|
24e00d82d0SMatt Waddel|       For details on the license for this file, please see the
25e00d82d0SMatt Waddel|       file, README, in this same directory.
261da177e4SLinus Torvalds
271da177e4SLinus Torvalds|SCALE    idnt    2,1 | Motorola 040 Floating Point Software Package
281da177e4SLinus Torvalds
291da177e4SLinus Torvalds	|section	8
301da177e4SLinus Torvalds
311da177e4SLinus Torvalds#include "fpsp.h"
321da177e4SLinus Torvalds
331da177e4SLinus Torvalds	|xref	t_ovfl2
341da177e4SLinus Torvalds	|xref	t_unfl
351da177e4SLinus Torvalds	|xref	round
361da177e4SLinus Torvalds	|xref	t_resdnrm
371da177e4SLinus Torvalds
381da177e4SLinus TorvaldsSRC_BNDS: .short	0x3fff,0x400c
391da177e4SLinus Torvalds
401da177e4SLinus Torvalds|
411da177e4SLinus Torvalds| This entry point is used by the unimplemented instruction exception
421da177e4SLinus Torvalds| handler.
431da177e4SLinus Torvalds|
441da177e4SLinus Torvalds|
451da177e4SLinus Torvalds|
461da177e4SLinus Torvalds|	FSCALE
471da177e4SLinus Torvalds|
481da177e4SLinus Torvalds	.global	sscale
491da177e4SLinus Torvaldssscale:
501da177e4SLinus Torvalds	fmovel		#0,%fpcr		|clr user enabled exc
511da177e4SLinus Torvalds	clrl		%d1
521da177e4SLinus Torvalds	movew		FPTEMP(%a6),%d1	|get dest exponent
531da177e4SLinus Torvalds	smi		L_SCR1(%a6)	|use L_SCR1 to hold sign
541da177e4SLinus Torvalds	andil		#0x7fff,%d1	|strip sign
551da177e4SLinus Torvalds	movew		ETEMP(%a6),%d0	|check src bounds
561da177e4SLinus Torvalds	andiw		#0x7fff,%d0	|clr sign bit
571da177e4SLinus Torvalds	cmp2w		SRC_BNDS,%d0
581da177e4SLinus Torvalds	bccs		src_in
591da177e4SLinus Torvalds	cmpiw		#0x400c,%d0	|test for too large
601da177e4SLinus Torvalds	bge		src_out
611da177e4SLinus Torvalds|
621da177e4SLinus Torvalds| The source input is below 1, so we check for denormalized numbers
631da177e4SLinus Torvalds| and set unfl.
641da177e4SLinus Torvalds|
651da177e4SLinus Torvaldssrc_small:
661da177e4SLinus Torvalds	moveb		DTAG(%a6),%d0
671da177e4SLinus Torvalds	andib		#0xe0,%d0
681da177e4SLinus Torvalds	tstb		%d0
691da177e4SLinus Torvalds	beqs		no_denorm
701da177e4SLinus Torvalds	st		STORE_FLG(%a6)	|dest already contains result
711da177e4SLinus Torvalds	orl		#unfl_mask,USER_FPSR(%a6) |set UNFL
721da177e4SLinus Torvaldsden_done:
731da177e4SLinus Torvalds	leal		FPTEMP(%a6),%a0
741da177e4SLinus Torvalds	bra		t_resdnrm
751da177e4SLinus Torvaldsno_denorm:
761da177e4SLinus Torvalds	fmovel		USER_FPCR(%a6),%FPCR
771da177e4SLinus Torvalds	fmovex		FPTEMP(%a6),%fp0	|simply return dest
781da177e4SLinus Torvalds	rts
791da177e4SLinus Torvalds
801da177e4SLinus Torvalds
811da177e4SLinus Torvalds|
821da177e4SLinus Torvalds| Source is within 2^14 range.  To perform the int operation,
831da177e4SLinus Torvalds| move it to d0.
841da177e4SLinus Torvalds|
851da177e4SLinus Torvaldssrc_in:
861da177e4SLinus Torvalds	fmovex		ETEMP(%a6),%fp0	|move in src for int
871da177e4SLinus Torvalds	fmovel		#rz_mode,%fpcr	|force rz for src conversion
881da177e4SLinus Torvalds	fmovel		%fp0,%d0		|int src to d0
891da177e4SLinus Torvalds	fmovel		#0,%FPSR		|clr status from above
901da177e4SLinus Torvalds	tstw		ETEMP(%a6)	|check src sign
911da177e4SLinus Torvalds	blt		src_neg
921da177e4SLinus Torvalds|
931da177e4SLinus Torvalds| Source is positive.  Add the src to the dest exponent.
941da177e4SLinus Torvalds| The result can be denormalized, if src = 0, or overflow,
951da177e4SLinus Torvalds| if the result of the add sets a bit in the upper word.
961da177e4SLinus Torvalds|
971da177e4SLinus Torvaldssrc_pos:
981da177e4SLinus Torvalds	tstw		%d1		|check for denorm
991da177e4SLinus Torvalds	beq		dst_dnrm
1001da177e4SLinus Torvalds	addl		%d0,%d1		|add src to dest exp
1011da177e4SLinus Torvalds	beqs		denorm		|if zero, result is denorm
1021da177e4SLinus Torvalds	cmpil		#0x7fff,%d1	|test for overflow
1031da177e4SLinus Torvalds	bges		ovfl
1041da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
1051da177e4SLinus Torvalds	beqs		spos_pos
1061da177e4SLinus Torvalds	orw		#0x8000,%d1
1071da177e4SLinus Torvaldsspos_pos:
1081da177e4SLinus Torvalds	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
1091da177e4SLinus Torvalds	fmovel		USER_FPCR(%a6),%FPCR
1101da177e4SLinus Torvalds	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
1111da177e4SLinus Torvalds	rts
1121da177e4SLinus Torvaldsovfl:
1131da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
1141da177e4SLinus Torvalds	beqs		sovl_pos
1151da177e4SLinus Torvalds	orw		#0x8000,%d1
1161da177e4SLinus Torvaldssovl_pos:
1171da177e4SLinus Torvalds	movew		FPTEMP(%a6),ETEMP(%a6)	|result in ETEMP
1181da177e4SLinus Torvalds	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
1191da177e4SLinus Torvalds	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
1201da177e4SLinus Torvalds	bra		t_ovfl2
1211da177e4SLinus Torvalds
1221da177e4SLinus Torvaldsdenorm:
1231da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
1241da177e4SLinus Torvalds	beqs		den_pos
1251da177e4SLinus Torvalds	orw		#0x8000,%d1
1261da177e4SLinus Torvaldsden_pos:
1271da177e4SLinus Torvalds	tstl		FPTEMP_HI(%a6)	|check j bit
1281da177e4SLinus Torvalds	blts		nden_exit	|if set, not denorm
1291da177e4SLinus Torvalds	movew		%d1,ETEMP(%a6)	|input expected in ETEMP
1301da177e4SLinus Torvalds	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
1311da177e4SLinus Torvalds	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
1321da177e4SLinus Torvalds	orl		#unfl_bit,USER_FPSR(%a6)	|set unfl
1331da177e4SLinus Torvalds	leal		ETEMP(%a6),%a0
1341da177e4SLinus Torvalds	bra		t_resdnrm
1351da177e4SLinus Torvaldsnden_exit:
1361da177e4SLinus Torvalds	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
1371da177e4SLinus Torvalds	fmovel		USER_FPCR(%a6),%FPCR
1381da177e4SLinus Torvalds	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
1391da177e4SLinus Torvalds	rts
1401da177e4SLinus Torvalds
1411da177e4SLinus Torvalds|
1421da177e4SLinus Torvalds| Source is negative.  Add the src to the dest exponent.
1431da177e4SLinus Torvalds| (The result exponent will be reduced).  The result can be
1441da177e4SLinus Torvalds| denormalized.
1451da177e4SLinus Torvalds|
1461da177e4SLinus Torvaldssrc_neg:
1471da177e4SLinus Torvalds	addl		%d0,%d1		|add src to dest
1481da177e4SLinus Torvalds	beqs		denorm		|if zero, result is denorm
1491da177e4SLinus Torvalds	blts		fix_dnrm	|if negative, result is
1501da177e4SLinus Torvalds|					;needing denormalization
1511da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
1521da177e4SLinus Torvalds	beqs		sneg_pos
1531da177e4SLinus Torvalds	orw		#0x8000,%d1
1541da177e4SLinus Torvaldssneg_pos:
1551da177e4SLinus Torvalds	movew		%d1,FPTEMP(%a6)	|result in FPTEMP
1561da177e4SLinus Torvalds	fmovel		USER_FPCR(%a6),%FPCR
1571da177e4SLinus Torvalds	fmovex		FPTEMP(%a6),%fp0	|write result to fp0
1581da177e4SLinus Torvalds	rts
1591da177e4SLinus Torvalds
1601da177e4SLinus Torvalds
1611da177e4SLinus Torvalds|
1621da177e4SLinus Torvalds| The result exponent is below denorm value.  Test for catastrophic
1631da177e4SLinus Torvalds| underflow and force zero if true.  If not, try to shift the
1641da177e4SLinus Torvalds| mantissa right until a zero exponent exists.
1651da177e4SLinus Torvalds|
1661da177e4SLinus Torvaldsfix_dnrm:
1671da177e4SLinus Torvalds	cmpiw		#0xffc0,%d1	|lower bound for normalization
1681da177e4SLinus Torvalds	blt		fix_unfl	|if lower, catastrophic unfl
1691da177e4SLinus Torvalds	movew		%d1,%d0		|use d0 for exp
1701da177e4SLinus Torvalds	movel		%d2,-(%a7)	|free d2 for norm
1711da177e4SLinus Torvalds	movel		FPTEMP_HI(%a6),%d1
1721da177e4SLinus Torvalds	movel		FPTEMP_LO(%a6),%d2
1731da177e4SLinus Torvalds	clrl		L_SCR2(%a6)
1741da177e4SLinus Torvaldsfix_loop:
1751da177e4SLinus Torvalds	addw		#1,%d0		|drive d0 to 0
1761da177e4SLinus Torvalds	lsrl		#1,%d1		|while shifting the
1771da177e4SLinus Torvalds	roxrl		#1,%d2		|mantissa to the right
1781da177e4SLinus Torvalds	bccs		no_carry
1791da177e4SLinus Torvalds	st		L_SCR2(%a6)	|use L_SCR2 to capture inex
1801da177e4SLinus Torvaldsno_carry:
1811da177e4SLinus Torvalds	tstw		%d0		|it is finished when
1821da177e4SLinus Torvalds	blts		fix_loop	|d0 is zero or the mantissa
1831da177e4SLinus Torvalds	tstb		L_SCR2(%a6)
1841da177e4SLinus Torvalds	beqs		tst_zero
1851da177e4SLinus Torvalds	orl		#unfl_inx_mask,USER_FPSR(%a6)
1861da177e4SLinus Torvalds|					;set unfl, aunfl, ainex
1871da177e4SLinus Torvalds|
1881da177e4SLinus Torvalds| Test for zero. If zero, simply use fmove to return +/- zero
1891da177e4SLinus Torvalds| to the fpu.
1901da177e4SLinus Torvalds|
1911da177e4SLinus Torvaldstst_zero:
1921da177e4SLinus Torvalds	clrw		FPTEMP_EX(%a6)
1931da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|test for sign
1941da177e4SLinus Torvalds	beqs		tst_con
1951da177e4SLinus Torvalds	orw		#0x8000,FPTEMP_EX(%a6) |set sign bit
1961da177e4SLinus Torvaldstst_con:
1971da177e4SLinus Torvalds	movel		%d1,FPTEMP_HI(%a6)
1981da177e4SLinus Torvalds	movel		%d2,FPTEMP_LO(%a6)
1991da177e4SLinus Torvalds	movel		(%a7)+,%d2
2001da177e4SLinus Torvalds	tstl		%d1
2011da177e4SLinus Torvalds	bnes		not_zero
2021da177e4SLinus Torvalds	tstl		FPTEMP_LO(%a6)
2031da177e4SLinus Torvalds	bnes		not_zero
2041da177e4SLinus Torvalds|
2051da177e4SLinus Torvalds| Result is zero.  Check for rounding mode to set lsb.  If the
2061da177e4SLinus Torvalds| mode is rp, and the zero is positive, return smallest denorm.
2071da177e4SLinus Torvalds| If the mode is rm, and the zero is negative, return smallest
2081da177e4SLinus Torvalds| negative denorm.
2091da177e4SLinus Torvalds|
2101da177e4SLinus Torvalds	btstb		#5,FPCR_MODE(%a6) |test if rm or rp
2111da177e4SLinus Torvalds	beqs		no_dir
2121da177e4SLinus Torvalds	btstb		#4,FPCR_MODE(%a6) |check which one
2131da177e4SLinus Torvalds	beqs		zer_rm
2141da177e4SLinus Torvaldszer_rp:
2151da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|check sign
2161da177e4SLinus Torvalds	bnes		no_dir		|if set, neg op, no inc
2171da177e4SLinus Torvalds	movel		#1,FPTEMP_LO(%a6) |set lsb
2181da177e4SLinus Torvalds	bras		sm_dnrm
2191da177e4SLinus Torvaldszer_rm:
2201da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|check sign
2211da177e4SLinus Torvalds	beqs		no_dir		|if clr, neg op, no inc
2221da177e4SLinus Torvalds	movel		#1,FPTEMP_LO(%a6) |set lsb
2231da177e4SLinus Torvalds	orl		#neg_mask,USER_FPSR(%a6) |set N
2241da177e4SLinus Torvalds	bras		sm_dnrm
2251da177e4SLinus Torvaldsno_dir:
2261da177e4SLinus Torvalds	fmovel		USER_FPCR(%a6),%FPCR
2271da177e4SLinus Torvalds	fmovex		FPTEMP(%a6),%fp0	|use fmove to set cc's
2281da177e4SLinus Torvalds	rts
2291da177e4SLinus Torvalds
2301da177e4SLinus Torvalds|
2311da177e4SLinus Torvalds| The rounding mode changed the zero to a smallest denorm. Call
2321da177e4SLinus Torvalds| t_resdnrm with exceptional operand in ETEMP.
2331da177e4SLinus Torvalds|
2341da177e4SLinus Torvaldssm_dnrm:
2351da177e4SLinus Torvalds	movel		FPTEMP_EX(%a6),ETEMP_EX(%a6)
2361da177e4SLinus Torvalds	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
2371da177e4SLinus Torvalds	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
2381da177e4SLinus Torvalds	leal		ETEMP(%a6),%a0
2391da177e4SLinus Torvalds	bra		t_resdnrm
2401da177e4SLinus Torvalds
2411da177e4SLinus Torvalds|
2421da177e4SLinus Torvalds| Result is still denormalized.
2431da177e4SLinus Torvalds|
2441da177e4SLinus Torvaldsnot_zero:
2451da177e4SLinus Torvalds	orl		#unfl_mask,USER_FPSR(%a6) |set unfl
2461da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|check for sign
2471da177e4SLinus Torvalds	beqs		fix_exit
2481da177e4SLinus Torvalds	orl		#neg_mask,USER_FPSR(%a6) |set N
2491da177e4SLinus Torvaldsfix_exit:
2501da177e4SLinus Torvalds	bras		sm_dnrm
2511da177e4SLinus Torvalds
2521da177e4SLinus Torvalds
2531da177e4SLinus Torvalds|
2541da177e4SLinus Torvalds| The result has underflowed to zero. Return zero and set
2551da177e4SLinus Torvalds| unfl, aunfl, and ainex.
2561da177e4SLinus Torvalds|
2571da177e4SLinus Torvaldsfix_unfl:
2581da177e4SLinus Torvalds	orl		#unfl_inx_mask,USER_FPSR(%a6)
2591da177e4SLinus Torvalds	btstb		#5,FPCR_MODE(%a6) |test if rm or rp
2601da177e4SLinus Torvalds	beqs		no_dir2
2611da177e4SLinus Torvalds	btstb		#4,FPCR_MODE(%a6) |check which one
2621da177e4SLinus Torvalds	beqs		zer_rm2
2631da177e4SLinus Torvaldszer_rp2:
2641da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|check sign
2651da177e4SLinus Torvalds	bnes		no_dir2		|if set, neg op, no inc
2661da177e4SLinus Torvalds	clrl		FPTEMP_EX(%a6)
2671da177e4SLinus Torvalds	clrl		FPTEMP_HI(%a6)
2681da177e4SLinus Torvalds	movel		#1,FPTEMP_LO(%a6) |set lsb
2691da177e4SLinus Torvalds	bras		sm_dnrm		|return smallest denorm
2701da177e4SLinus Torvaldszer_rm2:
2711da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|check sign
2721da177e4SLinus Torvalds	beqs		no_dir2		|if clr, neg op, no inc
2731da177e4SLinus Torvalds	movew		#0x8000,FPTEMP_EX(%a6)
2741da177e4SLinus Torvalds	clrl		FPTEMP_HI(%a6)
2751da177e4SLinus Torvalds	movel		#1,FPTEMP_LO(%a6) |set lsb
2761da177e4SLinus Torvalds	orl		#neg_mask,USER_FPSR(%a6) |set N
2771da177e4SLinus Torvalds	bra		sm_dnrm		|return smallest denorm
2781da177e4SLinus Torvalds
2791da177e4SLinus Torvaldsno_dir2:
2801da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
2811da177e4SLinus Torvalds	bges		pos_zero
2821da177e4SLinus Torvaldsneg_zero:
2831da177e4SLinus Torvalds	clrl		FP_SCR1(%a6)	|clear the exceptional operand
2841da177e4SLinus Torvalds	clrl		FP_SCR1+4(%a6)	|for gen_except.
2851da177e4SLinus Torvalds	clrl		FP_SCR1+8(%a6)
2861da177e4SLinus Torvalds	fmoves		#0x80000000,%fp0
2871da177e4SLinus Torvalds	rts
2881da177e4SLinus Torvaldspos_zero:
2891da177e4SLinus Torvalds	clrl		FP_SCR1(%a6)	|clear the exceptional operand
2901da177e4SLinus Torvalds	clrl		FP_SCR1+4(%a6)	|for gen_except.
2911da177e4SLinus Torvalds	clrl		FP_SCR1+8(%a6)
2921da177e4SLinus Torvalds	fmoves		#0x00000000,%fp0
2931da177e4SLinus Torvalds	rts
2941da177e4SLinus Torvalds
2951da177e4SLinus Torvalds|
2961da177e4SLinus Torvalds| The destination is a denormalized number.  It must be handled
2971da177e4SLinus Torvalds| by first shifting the bits in the mantissa until it is normalized,
2981da177e4SLinus Torvalds| then adding the remainder of the source to the exponent.
2991da177e4SLinus Torvalds|
3001da177e4SLinus Torvaldsdst_dnrm:
3011da177e4SLinus Torvalds	moveml		%d2/%d3,-(%a7)
3021da177e4SLinus Torvalds	movew		FPTEMP_EX(%a6),%d1
3031da177e4SLinus Torvalds	movel		FPTEMP_HI(%a6),%d2
3041da177e4SLinus Torvalds	movel		FPTEMP_LO(%a6),%d3
3051da177e4SLinus Torvaldsdst_loop:
3061da177e4SLinus Torvalds	tstl		%d2		|test for normalized result
3071da177e4SLinus Torvalds	blts		dst_norm	|exit loop if so
3081da177e4SLinus Torvalds	tstl		%d0		|otherwise, test shift count
3091da177e4SLinus Torvalds	beqs		dst_fin		|if zero, shifting is done
3101da177e4SLinus Torvalds	subil		#1,%d0		|dec src
3111da177e4SLinus Torvalds	lsll		#1,%d3
3121da177e4SLinus Torvalds	roxll		#1,%d2
3131da177e4SLinus Torvalds	bras		dst_loop
3141da177e4SLinus Torvalds|
3151da177e4SLinus Torvalds| Destination became normalized.  Simply add the remaining
3161da177e4SLinus Torvalds| portion of the src to the exponent.
3171da177e4SLinus Torvalds|
3181da177e4SLinus Torvaldsdst_norm:
3191da177e4SLinus Torvalds	addw		%d0,%d1		|dst is normalized; add src
3201da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
3211da177e4SLinus Torvalds	beqs		dnrm_pos
3221da177e4SLinus Torvalds	orl		#0x8000,%d1
3231da177e4SLinus Torvaldsdnrm_pos:
3241da177e4SLinus Torvalds	movemw		%d1,FPTEMP_EX(%a6)
3251da177e4SLinus Torvalds	moveml		%d2,FPTEMP_HI(%a6)
3261da177e4SLinus Torvalds	moveml		%d3,FPTEMP_LO(%a6)
3271da177e4SLinus Torvalds	fmovel		USER_FPCR(%a6),%FPCR
3281da177e4SLinus Torvalds	fmovex		FPTEMP(%a6),%fp0
3291da177e4SLinus Torvalds	moveml		(%a7)+,%d2/%d3
3301da177e4SLinus Torvalds	rts
3311da177e4SLinus Torvalds
3321da177e4SLinus Torvalds|
3331da177e4SLinus Torvalds| Destination remained denormalized.  Call t_excdnrm with
3341da177e4SLinus Torvalds| exceptional operand in ETEMP.
3351da177e4SLinus Torvalds|
3361da177e4SLinus Torvaldsdst_fin:
3371da177e4SLinus Torvalds	tstb		L_SCR1(%a6)	|check for sign
3381da177e4SLinus Torvalds	beqs		dst_exit
3391da177e4SLinus Torvalds	orl		#neg_mask,USER_FPSR(%a6) |set N
3401da177e4SLinus Torvalds	orl		#0x8000,%d1
3411da177e4SLinus Torvaldsdst_exit:
3421da177e4SLinus Torvalds	movemw		%d1,ETEMP_EX(%a6)
3431da177e4SLinus Torvalds	moveml		%d2,ETEMP_HI(%a6)
3441da177e4SLinus Torvalds	moveml		%d3,ETEMP_LO(%a6)
3451da177e4SLinus Torvalds	orl		#unfl_mask,USER_FPSR(%a6) |set unfl
3461da177e4SLinus Torvalds	moveml		(%a7)+,%d2/%d3
3471da177e4SLinus Torvalds	leal		ETEMP(%a6),%a0
3481da177e4SLinus Torvalds	bra		t_resdnrm
3491da177e4SLinus Torvalds
3501da177e4SLinus Torvalds|
3511da177e4SLinus Torvalds| Source is outside of 2^14 range.  Test the sign and branch
3521da177e4SLinus Torvalds| to the appropriate exception handler.
3531da177e4SLinus Torvalds|
3541da177e4SLinus Torvaldssrc_out:
3551da177e4SLinus Torvalds	tstb		L_SCR1(%a6)
3561da177e4SLinus Torvalds	beqs		scro_pos
3571da177e4SLinus Torvalds	orl		#0x8000,%d1
3581da177e4SLinus Torvaldsscro_pos:
3591da177e4SLinus Torvalds	movel		FPTEMP_HI(%a6),ETEMP_HI(%a6)
3601da177e4SLinus Torvalds	movel		FPTEMP_LO(%a6),ETEMP_LO(%a6)
3611da177e4SLinus Torvalds	tstw		ETEMP(%a6)
3621da177e4SLinus Torvalds	blts		res_neg
3631da177e4SLinus Torvaldsres_pos:
3641da177e4SLinus Torvalds	movew		%d1,ETEMP(%a6)	|result in ETEMP
3651da177e4SLinus Torvalds	bra		t_ovfl2
3661da177e4SLinus Torvaldsres_neg:
3671da177e4SLinus Torvalds	movew		%d1,ETEMP(%a6)	|result in ETEMP
3681da177e4SLinus Torvalds	leal		ETEMP(%a6),%a0
3691da177e4SLinus Torvalds	bra		t_unfl
3701da177e4SLinus Torvalds	|end
371