xref: /linux/arch/m68k/fpsp040/util.S (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
11da177e4SLinus Torvalds|
21da177e4SLinus Torvalds|	util.sa 3.7 7/29/91
31da177e4SLinus Torvalds|
41da177e4SLinus Torvalds|	This file contains routines used by other programs.
51da177e4SLinus Torvalds|
61da177e4SLinus Torvalds|	ovf_res: used by overflow to force the correct
71da177e4SLinus Torvalds|		 result. ovf_r_k, ovf_r_x2, ovf_r_x3 are
81da177e4SLinus Torvalds|		 derivatives of this routine.
91da177e4SLinus Torvalds|	get_fline: get user's opcode word
101da177e4SLinus Torvalds|	g_dfmtou: returns the destination format.
111da177e4SLinus Torvalds|	g_opcls: returns the opclass of the float instruction.
121da177e4SLinus Torvalds|	g_rndpr: returns the rounding precision.
131da177e4SLinus Torvalds|	reg_dest: write byte, word, or long data to Dn
141da177e4SLinus Torvalds|
151da177e4SLinus Torvalds|
161da177e4SLinus Torvalds|		Copyright (C) Motorola, Inc. 1990
171da177e4SLinus Torvalds|			All Rights Reserved
181da177e4SLinus Torvalds|
19*e00d82d0SMatt Waddel|       For details on the license for this file, please see the
20*e00d82d0SMatt Waddel|       file, README, in this same directory.
211da177e4SLinus Torvalds
221da177e4SLinus Torvalds|UTIL	idnt    2,1 | Motorola 040 Floating Point Software Package
231da177e4SLinus Torvalds
241da177e4SLinus Torvalds	|section	8
251da177e4SLinus Torvalds
261da177e4SLinus Torvalds#include "fpsp.h"
271da177e4SLinus Torvalds
281da177e4SLinus Torvalds	|xref	mem_read
291da177e4SLinus Torvalds
301da177e4SLinus Torvalds	.global	g_dfmtou
311da177e4SLinus Torvalds	.global	g_opcls
321da177e4SLinus Torvalds	.global	g_rndpr
331da177e4SLinus Torvalds	.global	get_fline
341da177e4SLinus Torvalds	.global	reg_dest
351da177e4SLinus Torvalds
361da177e4SLinus Torvalds|
371da177e4SLinus Torvalds| Final result table for ovf_res. Note that the negative counterparts
381da177e4SLinus Torvalds| are unnecessary as ovf_res always returns the sign separately from
391da177e4SLinus Torvalds| the exponent.
401da177e4SLinus Torvalds|					;+inf
411da177e4SLinus TorvaldsEXT_PINF:	.long	0x7fff0000,0x00000000,0x00000000,0x00000000
421da177e4SLinus Torvalds|					;largest +ext
431da177e4SLinus TorvaldsEXT_PLRG:	.long	0x7ffe0000,0xffffffff,0xffffffff,0x00000000
441da177e4SLinus Torvalds|					;largest magnitude +sgl in ext
451da177e4SLinus TorvaldsSGL_PLRG:	.long	0x407e0000,0xffffff00,0x00000000,0x00000000
461da177e4SLinus Torvalds|					;largest magnitude +dbl in ext
471da177e4SLinus TorvaldsDBL_PLRG:	.long	0x43fe0000,0xffffffff,0xfffff800,0x00000000
481da177e4SLinus Torvalds|					;largest -ext
491da177e4SLinus Torvalds
501da177e4SLinus Torvaldstblovfl:
511da177e4SLinus Torvalds	.long	EXT_RN
521da177e4SLinus Torvalds	.long	EXT_RZ
531da177e4SLinus Torvalds	.long	EXT_RM
541da177e4SLinus Torvalds	.long	EXT_RP
551da177e4SLinus Torvalds	.long	SGL_RN
561da177e4SLinus Torvalds	.long	SGL_RZ
571da177e4SLinus Torvalds	.long	SGL_RM
581da177e4SLinus Torvalds	.long	SGL_RP
591da177e4SLinus Torvalds	.long	DBL_RN
601da177e4SLinus Torvalds	.long	DBL_RZ
611da177e4SLinus Torvalds	.long	DBL_RM
621da177e4SLinus Torvalds	.long	DBL_RP
631da177e4SLinus Torvalds	.long	error
641da177e4SLinus Torvalds	.long	error
651da177e4SLinus Torvalds	.long	error
661da177e4SLinus Torvalds	.long	error
671da177e4SLinus Torvalds
681da177e4SLinus Torvalds
691da177e4SLinus Torvalds|
701da177e4SLinus Torvalds|	ovf_r_k --- overflow result calculation
711da177e4SLinus Torvalds|
721da177e4SLinus Torvalds| This entry point is used by kernel_ex.
731da177e4SLinus Torvalds|
741da177e4SLinus Torvalds| This forces the destination precision to be extended
751da177e4SLinus Torvalds|
761da177e4SLinus Torvalds| Input:	operand in ETEMP
771da177e4SLinus Torvalds| Output:	a result is in ETEMP (internal extended format)
781da177e4SLinus Torvalds|
791da177e4SLinus Torvalds	.global	ovf_r_k
801da177e4SLinus Torvaldsovf_r_k:
811da177e4SLinus Torvalds	lea	ETEMP(%a6),%a0	|a0 points to source operand
821da177e4SLinus Torvalds	bclrb	#sign_bit,ETEMP_EX(%a6)
831da177e4SLinus Torvalds	sne	ETEMP_SGN(%a6)	|convert to internal IEEE format
841da177e4SLinus Torvalds
851da177e4SLinus Torvalds|
861da177e4SLinus Torvalds|	ovf_r_x2 --- overflow result calculation
871da177e4SLinus Torvalds|
881da177e4SLinus Torvalds| This entry point used by x_ovfl.  (opclass 0 and 2)
891da177e4SLinus Torvalds|
901da177e4SLinus Torvalds| Input		a0  points to an operand in the internal extended format
911da177e4SLinus Torvalds| Output	a0  points to the result in the internal extended format
921da177e4SLinus Torvalds|
931da177e4SLinus Torvalds| This sets the round precision according to the user's FPCR unless the
941da177e4SLinus Torvalds| instruction is fsgldiv or fsglmul or fsadd, fdadd, fsub, fdsub, fsmul,
951da177e4SLinus Torvalds| fdmul, fsdiv, fddiv, fssqrt, fsmove, fdmove, fsabs, fdabs, fsneg, fdneg.
961da177e4SLinus Torvalds| If the instruction is fsgldiv of fsglmul, the rounding precision must be
971da177e4SLinus Torvalds| extended.  If the instruction is not fsgldiv or fsglmul but a force-
981da177e4SLinus Torvalds| precision instruction, the rounding precision is then set to the force
991da177e4SLinus Torvalds| precision.
1001da177e4SLinus Torvalds
1011da177e4SLinus Torvalds	.global	ovf_r_x2
1021da177e4SLinus Torvaldsovf_r_x2:
1031da177e4SLinus Torvalds	btstb	#E3,E_BYTE(%a6)		|check for nu exception
1041da177e4SLinus Torvalds	beql	ovf_e1_exc		|it is cu exception
1051da177e4SLinus Torvaldsovf_e3_exc:
1061da177e4SLinus Torvalds	movew	CMDREG3B(%a6),%d0		|get the command word
1071da177e4SLinus Torvalds	andiw	#0x00000060,%d0		|clear all bits except 6 and 5
1081da177e4SLinus Torvalds	cmpil	#0x00000040,%d0
1091da177e4SLinus Torvalds	beql	ovff_sgl		|force precision is single
1101da177e4SLinus Torvalds	cmpil	#0x00000060,%d0
1111da177e4SLinus Torvalds	beql	ovff_dbl		|force precision is double
1121da177e4SLinus Torvalds	movew	CMDREG3B(%a6),%d0		|get the command word again
1131da177e4SLinus Torvalds	andil	#0x7f,%d0			|clear all except operation
1141da177e4SLinus Torvalds	cmpil	#0x33,%d0
1151da177e4SLinus Torvalds	beql	ovf_fsgl		|fsglmul or fsgldiv
1161da177e4SLinus Torvalds	cmpil	#0x30,%d0
1171da177e4SLinus Torvalds	beql	ovf_fsgl
1181da177e4SLinus Torvalds	bra	ovf_fpcr		|instruction is none of the above
1191da177e4SLinus Torvalds|					;use FPCR
1201da177e4SLinus Torvaldsovf_e1_exc:
1211da177e4SLinus Torvalds	movew	CMDREG1B(%a6),%d0		|get command word
1221da177e4SLinus Torvalds	andil	#0x00000044,%d0		|clear all bits except 6 and 2
1231da177e4SLinus Torvalds	cmpil	#0x00000040,%d0
1241da177e4SLinus Torvalds	beql	ovff_sgl		|the instruction is force single
1251da177e4SLinus Torvalds	cmpil	#0x00000044,%d0
1261da177e4SLinus Torvalds	beql	ovff_dbl		|the instruction is force double
1271da177e4SLinus Torvalds	movew	CMDREG1B(%a6),%d0		|again get the command word
1281da177e4SLinus Torvalds	andil	#0x0000007f,%d0		|clear all except the op code
1291da177e4SLinus Torvalds	cmpil	#0x00000027,%d0
1301da177e4SLinus Torvalds	beql	ovf_fsgl		|fsglmul
1311da177e4SLinus Torvalds	cmpil	#0x00000024,%d0
1321da177e4SLinus Torvalds	beql	ovf_fsgl		|fsgldiv
1331da177e4SLinus Torvalds	bra	ovf_fpcr		|none of the above, use FPCR
1341da177e4SLinus Torvalds|
1351da177e4SLinus Torvalds|
1361da177e4SLinus Torvalds| Inst is either fsgldiv or fsglmul.  Force extended precision.
1371da177e4SLinus Torvalds|
1381da177e4SLinus Torvaldsovf_fsgl:
1391da177e4SLinus Torvalds	clrl	%d0
1401da177e4SLinus Torvalds	bra	ovf_res
1411da177e4SLinus Torvalds
1421da177e4SLinus Torvaldsovff_sgl:
1431da177e4SLinus Torvalds	movel	#0x00000001,%d0		|set single
1441da177e4SLinus Torvalds	bra	ovf_res
1451da177e4SLinus Torvaldsovff_dbl:
1461da177e4SLinus Torvalds	movel	#0x00000002,%d0		|set double
1471da177e4SLinus Torvalds	bra	ovf_res
1481da177e4SLinus Torvalds|
1491da177e4SLinus Torvalds| The precision is in the fpcr.
1501da177e4SLinus Torvalds|
1511da177e4SLinus Torvaldsovf_fpcr:
1521da177e4SLinus Torvalds	bfextu	FPCR_MODE(%a6){#0:#2},%d0 |set round precision
1531da177e4SLinus Torvalds	bra	ovf_res
1541da177e4SLinus Torvalds
1551da177e4SLinus Torvalds|
1561da177e4SLinus Torvalds|
1571da177e4SLinus Torvalds|	ovf_r_x3 --- overflow result calculation
1581da177e4SLinus Torvalds|
1591da177e4SLinus Torvalds| This entry point used by x_ovfl. (opclass 3 only)
1601da177e4SLinus Torvalds|
1611da177e4SLinus Torvalds| Input		a0  points to an operand in the internal extended format
1621da177e4SLinus Torvalds| Output	a0  points to the result in the internal extended format
1631da177e4SLinus Torvalds|
1641da177e4SLinus Torvalds| This sets the round precision according to the destination size.
1651da177e4SLinus Torvalds|
1661da177e4SLinus Torvalds	.global	ovf_r_x3
1671da177e4SLinus Torvaldsovf_r_x3:
1681da177e4SLinus Torvalds	bsr	g_dfmtou	|get dest fmt in d0{1:0}
1691da177e4SLinus Torvalds|				;for fmovout, the destination format
1701da177e4SLinus Torvalds|				;is the rounding precision
1711da177e4SLinus Torvalds
1721da177e4SLinus Torvalds|
1731da177e4SLinus Torvalds|	ovf_res --- overflow result calculation
1741da177e4SLinus Torvalds|
1751da177e4SLinus Torvalds| Input:
1761da177e4SLinus Torvalds|	a0	points to operand in internal extended format
1771da177e4SLinus Torvalds| Output:
1781da177e4SLinus Torvalds|	a0	points to result in internal extended format
1791da177e4SLinus Torvalds|
1801da177e4SLinus Torvalds	.global	ovf_res
1811da177e4SLinus Torvaldsovf_res:
1821da177e4SLinus Torvalds	lsll	#2,%d0		|move round precision to d0{3:2}
1831da177e4SLinus Torvalds	bfextu	FPCR_MODE(%a6){#2:#2},%d1 |set round mode
1841da177e4SLinus Torvalds	orl	%d1,%d0		|index is fmt:mode in d0{3:0}
1851da177e4SLinus Torvalds	leal	tblovfl,%a1	|load a1 with table address
1861da177e4SLinus Torvalds	movel	%a1@(%d0:l:4),%a1	|use d0 as index to the table
1871da177e4SLinus Torvalds	jmp	(%a1)		|go to the correct routine
1881da177e4SLinus Torvalds|
1891da177e4SLinus Torvalds|case DEST_FMT = EXT
1901da177e4SLinus Torvalds|
1911da177e4SLinus TorvaldsEXT_RN:
1921da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is +/- infinity
1931da177e4SLinus Torvalds	bsetb	#inf_bit,FPSR_CC(%a6)
1941da177e4SLinus Torvalds	bra	set_sign	|now go set the sign
1951da177e4SLinus TorvaldsEXT_RZ:
1961da177e4SLinus Torvalds	leal	EXT_PLRG,%a1	|answer is +/- large number
1971da177e4SLinus Torvalds	bra	set_sign	|now go set the sign
1981da177e4SLinus TorvaldsEXT_RM:
1991da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2001da177e4SLinus Torvalds	beqs	e_rm_pos
2011da177e4SLinus Torvaldse_rm_neg:
2021da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is negative infinity
2031da177e4SLinus Torvalds	orl	#neginf_mask,USER_FPSR(%a6)
2041da177e4SLinus Torvalds	bra	end_ovfr
2051da177e4SLinus Torvaldse_rm_pos:
2061da177e4SLinus Torvalds	leal	EXT_PLRG,%a1	|answer is large positive number
2071da177e4SLinus Torvalds	bra	end_ovfr
2081da177e4SLinus TorvaldsEXT_RP:
2091da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2101da177e4SLinus Torvalds	beqs	e_rp_pos
2111da177e4SLinus Torvaldse_rp_neg:
2121da177e4SLinus Torvalds	leal	EXT_PLRG,%a1	|answer is large negative number
2131da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
2141da177e4SLinus Torvalds	bra	end_ovfr
2151da177e4SLinus Torvaldse_rp_pos:
2161da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is positive infinity
2171da177e4SLinus Torvalds	bsetb	#inf_bit,FPSR_CC(%a6)
2181da177e4SLinus Torvalds	bra	end_ovfr
2191da177e4SLinus Torvalds|
2201da177e4SLinus Torvalds|case DEST_FMT = DBL
2211da177e4SLinus Torvalds|
2221da177e4SLinus TorvaldsDBL_RN:
2231da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is +/- infinity
2241da177e4SLinus Torvalds	bsetb	#inf_bit,FPSR_CC(%a6)
2251da177e4SLinus Torvalds	bra	set_sign
2261da177e4SLinus TorvaldsDBL_RZ:
2271da177e4SLinus Torvalds	leal	DBL_PLRG,%a1	|answer is +/- large number
2281da177e4SLinus Torvalds	bra	set_sign	|now go set the sign
2291da177e4SLinus TorvaldsDBL_RM:
2301da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2311da177e4SLinus Torvalds	beqs	d_rm_pos
2321da177e4SLinus Torvaldsd_rm_neg:
2331da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is negative infinity
2341da177e4SLinus Torvalds	orl	#neginf_mask,USER_FPSR(%a6)
2351da177e4SLinus Torvalds	bra	end_ovfr	|inf is same for all precisions (ext,dbl,sgl)
2361da177e4SLinus Torvaldsd_rm_pos:
2371da177e4SLinus Torvalds	leal	DBL_PLRG,%a1	|answer is large positive number
2381da177e4SLinus Torvalds	bra	end_ovfr
2391da177e4SLinus TorvaldsDBL_RP:
2401da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2411da177e4SLinus Torvalds	beqs	d_rp_pos
2421da177e4SLinus Torvaldsd_rp_neg:
2431da177e4SLinus Torvalds	leal	DBL_PLRG,%a1	|answer is large negative number
2441da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
2451da177e4SLinus Torvalds	bra	end_ovfr
2461da177e4SLinus Torvaldsd_rp_pos:
2471da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is positive infinity
2481da177e4SLinus Torvalds	bsetb	#inf_bit,FPSR_CC(%a6)
2491da177e4SLinus Torvalds	bra	end_ovfr
2501da177e4SLinus Torvalds|
2511da177e4SLinus Torvalds|case DEST_FMT = SGL
2521da177e4SLinus Torvalds|
2531da177e4SLinus TorvaldsSGL_RN:
2541da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is +/-  infinity
2551da177e4SLinus Torvalds	bsetb	#inf_bit,FPSR_CC(%a6)
2561da177e4SLinus Torvalds	bras	set_sign
2571da177e4SLinus TorvaldsSGL_RZ:
2581da177e4SLinus Torvalds	leal	SGL_PLRG,%a1	|answer is +/- large number
2591da177e4SLinus Torvalds	bras	set_sign
2601da177e4SLinus TorvaldsSGL_RM:
2611da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2621da177e4SLinus Torvalds	beqs	s_rm_pos
2631da177e4SLinus Torvaldss_rm_neg:
2641da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is negative infinity
2651da177e4SLinus Torvalds	orl	#neginf_mask,USER_FPSR(%a6)
2661da177e4SLinus Torvalds	bras	end_ovfr
2671da177e4SLinus Torvaldss_rm_pos:
2681da177e4SLinus Torvalds	leal	SGL_PLRG,%a1	|answer is large positive number
2691da177e4SLinus Torvalds	bras	end_ovfr
2701da177e4SLinus TorvaldsSGL_RP:
2711da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2721da177e4SLinus Torvalds	beqs	s_rp_pos
2731da177e4SLinus Torvaldss_rp_neg:
2741da177e4SLinus Torvalds	leal	SGL_PLRG,%a1	|answer is large negative number
2751da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
2761da177e4SLinus Torvalds	bras	end_ovfr
2771da177e4SLinus Torvaldss_rp_pos:
2781da177e4SLinus Torvalds	leal	EXT_PINF,%a1	|answer is positive infinity
2791da177e4SLinus Torvalds	bsetb	#inf_bit,FPSR_CC(%a6)
2801da177e4SLinus Torvalds	bras	end_ovfr
2811da177e4SLinus Torvalds
2821da177e4SLinus Torvaldsset_sign:
2831da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
2841da177e4SLinus Torvalds	beqs	end_ovfr
2851da177e4SLinus Torvaldsneg_sign:
2861da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
2871da177e4SLinus Torvalds
2881da177e4SLinus Torvaldsend_ovfr:
2891da177e4SLinus Torvalds	movew	LOCAL_EX(%a1),LOCAL_EX(%a0) |do not overwrite sign
2901da177e4SLinus Torvalds	movel	LOCAL_HI(%a1),LOCAL_HI(%a0)
2911da177e4SLinus Torvalds	movel	LOCAL_LO(%a1),LOCAL_LO(%a0)
2921da177e4SLinus Torvalds	rts
2931da177e4SLinus Torvalds
2941da177e4SLinus Torvalds
2951da177e4SLinus Torvalds|
2961da177e4SLinus Torvalds|	ERROR
2971da177e4SLinus Torvalds|
2981da177e4SLinus Torvaldserror:
2991da177e4SLinus Torvalds	rts
3001da177e4SLinus Torvalds|
3011da177e4SLinus Torvalds|	get_fline --- get f-line opcode of interrupted instruction
3021da177e4SLinus Torvalds|
3031da177e4SLinus Torvalds|	Returns opcode in the low word of d0.
3041da177e4SLinus Torvalds|
3051da177e4SLinus Torvaldsget_fline:
3061da177e4SLinus Torvalds	movel	USER_FPIAR(%a6),%a0	|opcode address
3071da177e4SLinus Torvalds	movel	#0,-(%a7)	|reserve a word on the stack
3081da177e4SLinus Torvalds	leal	2(%a7),%a1	|point to low word of temporary
3091da177e4SLinus Torvalds	movel	#2,%d0		|count
3101da177e4SLinus Torvalds	bsrl	mem_read
3111da177e4SLinus Torvalds	movel	(%a7)+,%d0
3121da177e4SLinus Torvalds	rts
3131da177e4SLinus Torvalds|
3141da177e4SLinus Torvalds|	g_rndpr --- put rounding precision in d0{1:0}
3151da177e4SLinus Torvalds|
3161da177e4SLinus Torvalds|	valid return codes are:
3171da177e4SLinus Torvalds|		00 - extended
3181da177e4SLinus Torvalds|		01 - single
3191da177e4SLinus Torvalds|		10 - double
3201da177e4SLinus Torvalds|
3211da177e4SLinus Torvalds| begin
3221da177e4SLinus Torvalds| get rounding precision (cmdreg3b{6:5})
3231da177e4SLinus Torvalds| begin
3241da177e4SLinus Torvalds|  case	opclass = 011 (move out)
3251da177e4SLinus Torvalds|	get destination format - this is the also the rounding precision
3261da177e4SLinus Torvalds|
3271da177e4SLinus Torvalds|  case	opclass = 0x0
3281da177e4SLinus Torvalds|	if E3
3291da177e4SLinus Torvalds|	    *case RndPr(from cmdreg3b{6:5} = 11  then RND_PREC = DBL
3301da177e4SLinus Torvalds|	    *case RndPr(from cmdreg3b{6:5} = 10  then RND_PREC = SGL
3311da177e4SLinus Torvalds|	     case RndPr(from cmdreg3b{6:5} = 00 | 01
3321da177e4SLinus Torvalds|		use precision from FPCR{7:6}
3331da177e4SLinus Torvalds|			case 00 then RND_PREC = EXT
3341da177e4SLinus Torvalds|			case 01 then RND_PREC = SGL
3351da177e4SLinus Torvalds|			case 10 then RND_PREC = DBL
3361da177e4SLinus Torvalds|	else E1
3371da177e4SLinus Torvalds|	     use precision in FPCR{7:6}
3381da177e4SLinus Torvalds|	     case 00 then RND_PREC = EXT
3391da177e4SLinus Torvalds|	     case 01 then RND_PREC = SGL
3401da177e4SLinus Torvalds|	     case 10 then RND_PREC = DBL
3411da177e4SLinus Torvalds| end
3421da177e4SLinus Torvalds|
3431da177e4SLinus Torvaldsg_rndpr:
3441da177e4SLinus Torvalds	bsr	g_opcls		|get opclass in d0{2:0}
3451da177e4SLinus Torvalds	cmpw	#0x0003,%d0	|check for opclass 011
3461da177e4SLinus Torvalds	bnes	op_0x0
3471da177e4SLinus Torvalds
3481da177e4SLinus Torvalds|
3491da177e4SLinus Torvalds| For move out instructions (opclass 011) the destination format
3501da177e4SLinus Torvalds| is the same as the rounding precision.  Pass results from g_dfmtou.
3511da177e4SLinus Torvalds|
3521da177e4SLinus Torvalds	bsr	g_dfmtou
3531da177e4SLinus Torvalds	rts
3541da177e4SLinus Torvaldsop_0x0:
3551da177e4SLinus Torvalds	btstb	#E3,E_BYTE(%a6)
3561da177e4SLinus Torvalds	beql	unf_e1_exc	|branch to e1 underflow
3571da177e4SLinus Torvaldsunf_e3_exc:
3581da177e4SLinus Torvalds	movel	CMDREG3B(%a6),%d0	|rounding precision in d0{10:9}
3591da177e4SLinus Torvalds	bfextu	%d0{#9:#2},%d0	|move the rounding prec bits to d0{1:0}
3601da177e4SLinus Torvalds	cmpil	#0x2,%d0
3611da177e4SLinus Torvalds	beql	unff_sgl	|force precision is single
3621da177e4SLinus Torvalds	cmpil	#0x3,%d0		|force precision is double
3631da177e4SLinus Torvalds	beql	unff_dbl
3641da177e4SLinus Torvalds	movew	CMDREG3B(%a6),%d0	|get the command word again
3651da177e4SLinus Torvalds	andil	#0x7f,%d0		|clear all except operation
3661da177e4SLinus Torvalds	cmpil	#0x33,%d0
3671da177e4SLinus Torvalds	beql	unf_fsgl	|fsglmul or fsgldiv
3681da177e4SLinus Torvalds	cmpil	#0x30,%d0
3691da177e4SLinus Torvalds	beql	unf_fsgl	|fsgldiv or fsglmul
3701da177e4SLinus Torvalds	bra	unf_fpcr
3711da177e4SLinus Torvaldsunf_e1_exc:
3721da177e4SLinus Torvalds	movel	CMDREG1B(%a6),%d0	|get 32 bits off the stack, 1st 16 bits
3731da177e4SLinus Torvalds|				;are the command word
3741da177e4SLinus Torvalds	andil	#0x00440000,%d0	|clear all bits except bits 6 and 2
3751da177e4SLinus Torvalds	cmpil	#0x00400000,%d0
3761da177e4SLinus Torvalds	beql	unff_sgl	|force single
3771da177e4SLinus Torvalds	cmpil	#0x00440000,%d0	|force double
3781da177e4SLinus Torvalds	beql	unff_dbl
3791da177e4SLinus Torvalds	movel	CMDREG1B(%a6),%d0	|get the command word again
3801da177e4SLinus Torvalds	andil	#0x007f0000,%d0	|clear all bits except the operation
3811da177e4SLinus Torvalds	cmpil	#0x00270000,%d0
3821da177e4SLinus Torvalds	beql	unf_fsgl	|fsglmul
3831da177e4SLinus Torvalds	cmpil	#0x00240000,%d0
3841da177e4SLinus Torvalds	beql	unf_fsgl	|fsgldiv
3851da177e4SLinus Torvalds	bra	unf_fpcr
3861da177e4SLinus Torvalds
3871da177e4SLinus Torvalds|
3881da177e4SLinus Torvalds| Convert to return format.  The values from cmdreg3b and the return
3891da177e4SLinus Torvalds| values are:
3901da177e4SLinus Torvalds|	cmdreg3b	return	     precision
3911da177e4SLinus Torvalds|	--------	------	     ---------
3921da177e4SLinus Torvalds|	  00,01		  0		ext
3931da177e4SLinus Torvalds|	   10		  1		sgl
3941da177e4SLinus Torvalds|	   11		  2		dbl
3951da177e4SLinus Torvalds| Force single
3961da177e4SLinus Torvalds|
3971da177e4SLinus Torvaldsunff_sgl:
3981da177e4SLinus Torvalds	movel	#1,%d0		|return 1
3991da177e4SLinus Torvalds	rts
4001da177e4SLinus Torvalds|
4011da177e4SLinus Torvalds| Force double
4021da177e4SLinus Torvalds|
4031da177e4SLinus Torvaldsunff_dbl:
4041da177e4SLinus Torvalds	movel	#2,%d0		|return 2
4051da177e4SLinus Torvalds	rts
4061da177e4SLinus Torvalds|
4071da177e4SLinus Torvalds| Force extended
4081da177e4SLinus Torvalds|
4091da177e4SLinus Torvaldsunf_fsgl:
4101da177e4SLinus Torvalds	movel	#0,%d0
4111da177e4SLinus Torvalds	rts
4121da177e4SLinus Torvalds|
4131da177e4SLinus Torvalds| Get rounding precision set in FPCR{7:6}.
4141da177e4SLinus Torvalds|
4151da177e4SLinus Torvaldsunf_fpcr:
4161da177e4SLinus Torvalds	movel	USER_FPCR(%a6),%d0 |rounding precision bits in d0{7:6}
4171da177e4SLinus Torvalds	bfextu	%d0{#24:#2},%d0	|move the rounding prec bits to d0{1:0}
4181da177e4SLinus Torvalds	rts
4191da177e4SLinus Torvalds|
4201da177e4SLinus Torvalds|	g_opcls --- put opclass in d0{2:0}
4211da177e4SLinus Torvalds|
4221da177e4SLinus Torvaldsg_opcls:
4231da177e4SLinus Torvalds	btstb	#E3,E_BYTE(%a6)
4241da177e4SLinus Torvalds	beqs	opc_1b		|if set, go to cmdreg1b
4251da177e4SLinus Torvaldsopc_3b:
4261da177e4SLinus Torvalds	clrl	%d0		|if E3, only opclass 0x0 is possible
4271da177e4SLinus Torvalds	rts
4281da177e4SLinus Torvaldsopc_1b:
4291da177e4SLinus Torvalds	movel	CMDREG1B(%a6),%d0
4301da177e4SLinus Torvalds	bfextu	%d0{#0:#3},%d0	|shift opclass bits d0{31:29} to d0{2:0}
4311da177e4SLinus Torvalds	rts
4321da177e4SLinus Torvalds|
4331da177e4SLinus Torvalds|	g_dfmtou --- put destination format in d0{1:0}
4341da177e4SLinus Torvalds|
4351da177e4SLinus Torvalds|	If E1, the format is from cmdreg1b{12:10}
4361da177e4SLinus Torvalds|	If E3, the format is extended.
4371da177e4SLinus Torvalds|
4381da177e4SLinus Torvalds|	Dest. Fmt.
4391da177e4SLinus Torvalds|		extended  010 -> 00
4401da177e4SLinus Torvalds|		single    001 -> 01
4411da177e4SLinus Torvalds|		double    101 -> 10
4421da177e4SLinus Torvalds|
4431da177e4SLinus Torvaldsg_dfmtou:
4441da177e4SLinus Torvalds	btstb	#E3,E_BYTE(%a6)
4451da177e4SLinus Torvalds	beqs	op011
4461da177e4SLinus Torvalds	clrl	%d0		|if E1, size is always ext
4471da177e4SLinus Torvalds	rts
4481da177e4SLinus Torvaldsop011:
4491da177e4SLinus Torvalds	movel	CMDREG1B(%a6),%d0
4501da177e4SLinus Torvalds	bfextu	%d0{#3:#3},%d0	|dest fmt from cmdreg1b{12:10}
4511da177e4SLinus Torvalds	cmpb	#1,%d0		|check for single
4521da177e4SLinus Torvalds	bnes	not_sgl
4531da177e4SLinus Torvalds	movel	#1,%d0
4541da177e4SLinus Torvalds	rts
4551da177e4SLinus Torvaldsnot_sgl:
4561da177e4SLinus Torvalds	cmpb	#5,%d0		|check for double
4571da177e4SLinus Torvalds	bnes	not_dbl
4581da177e4SLinus Torvalds	movel	#2,%d0
4591da177e4SLinus Torvalds	rts
4601da177e4SLinus Torvaldsnot_dbl:
4611da177e4SLinus Torvalds	clrl	%d0		|must be extended
4621da177e4SLinus Torvalds	rts
4631da177e4SLinus Torvalds
4641da177e4SLinus Torvalds|
4651da177e4SLinus Torvalds|
4661da177e4SLinus Torvalds| Final result table for unf_sub. Note that the negative counterparts
4671da177e4SLinus Torvalds| are unnecessary as unf_sub always returns the sign separately from
4681da177e4SLinus Torvalds| the exponent.
4691da177e4SLinus Torvalds|					;+zero
4701da177e4SLinus TorvaldsEXT_PZRO:	.long	0x00000000,0x00000000,0x00000000,0x00000000
4711da177e4SLinus Torvalds|					;+zero
4721da177e4SLinus TorvaldsSGL_PZRO:	.long	0x3f810000,0x00000000,0x00000000,0x00000000
4731da177e4SLinus Torvalds|					;+zero
4741da177e4SLinus TorvaldsDBL_PZRO:	.long	0x3c010000,0x00000000,0x00000000,0x00000000
4751da177e4SLinus Torvalds|					;smallest +ext denorm
4761da177e4SLinus TorvaldsEXT_PSML:	.long	0x00000000,0x00000000,0x00000001,0x00000000
4771da177e4SLinus Torvalds|					;smallest +sgl denorm
4781da177e4SLinus TorvaldsSGL_PSML:	.long	0x3f810000,0x00000100,0x00000000,0x00000000
4791da177e4SLinus Torvalds|					;smallest +dbl denorm
4801da177e4SLinus TorvaldsDBL_PSML:	.long	0x3c010000,0x00000000,0x00000800,0x00000000
4811da177e4SLinus Torvalds|
4821da177e4SLinus Torvalds|	UNF_SUB --- underflow result calculation
4831da177e4SLinus Torvalds|
4841da177e4SLinus Torvalds| Input:
4851da177e4SLinus Torvalds|	d0	contains round precision
4861da177e4SLinus Torvalds|	a0	points to input operand in the internal extended format
4871da177e4SLinus Torvalds|
4881da177e4SLinus Torvalds| Output:
4891da177e4SLinus Torvalds|	a0	points to correct internal extended precision result.
4901da177e4SLinus Torvalds|
4911da177e4SLinus Torvalds
4921da177e4SLinus Torvaldstblunf:
4931da177e4SLinus Torvalds	.long	uEXT_RN
4941da177e4SLinus Torvalds	.long	uEXT_RZ
4951da177e4SLinus Torvalds	.long	uEXT_RM
4961da177e4SLinus Torvalds	.long	uEXT_RP
4971da177e4SLinus Torvalds	.long	uSGL_RN
4981da177e4SLinus Torvalds	.long	uSGL_RZ
4991da177e4SLinus Torvalds	.long	uSGL_RM
5001da177e4SLinus Torvalds	.long	uSGL_RP
5011da177e4SLinus Torvalds	.long	uDBL_RN
5021da177e4SLinus Torvalds	.long	uDBL_RZ
5031da177e4SLinus Torvalds	.long	uDBL_RM
5041da177e4SLinus Torvalds	.long	uDBL_RP
5051da177e4SLinus Torvalds	.long	uDBL_RN
5061da177e4SLinus Torvalds	.long	uDBL_RZ
5071da177e4SLinus Torvalds	.long	uDBL_RM
5081da177e4SLinus Torvalds	.long	uDBL_RP
5091da177e4SLinus Torvalds
5101da177e4SLinus Torvalds	.global	unf_sub
5111da177e4SLinus Torvaldsunf_sub:
5121da177e4SLinus Torvalds	lsll	#2,%d0		|move round precision to d0{3:2}
5131da177e4SLinus Torvalds	bfextu	FPCR_MODE(%a6){#2:#2},%d1 |set round mode
5141da177e4SLinus Torvalds	orl	%d1,%d0		|index is fmt:mode in d0{3:0}
5151da177e4SLinus Torvalds	leal	tblunf,%a1	|load a1 with table address
5161da177e4SLinus Torvalds	movel	%a1@(%d0:l:4),%a1	|use d0 as index to the table
5171da177e4SLinus Torvalds	jmp	(%a1)		|go to the correct routine
5181da177e4SLinus Torvalds|
5191da177e4SLinus Torvalds|case DEST_FMT = EXT
5201da177e4SLinus Torvalds|
5211da177e4SLinus TorvaldsuEXT_RN:
5221da177e4SLinus Torvalds	leal	EXT_PZRO,%a1	|answer is +/- zero
5231da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5241da177e4SLinus Torvalds	bra	uset_sign	|now go set the sign
5251da177e4SLinus TorvaldsuEXT_RZ:
5261da177e4SLinus Torvalds	leal	EXT_PZRO,%a1	|answer is +/- zero
5271da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5281da177e4SLinus Torvalds	bra	uset_sign	|now go set the sign
5291da177e4SLinus TorvaldsuEXT_RM:
5301da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative underflow
5311da177e4SLinus Torvalds	beqs	ue_rm_pos
5321da177e4SLinus Torvaldsue_rm_neg:
5331da177e4SLinus Torvalds	leal	EXT_PSML,%a1	|answer is negative smallest denorm
5341da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
5351da177e4SLinus Torvalds	bra	end_unfr
5361da177e4SLinus Torvaldsue_rm_pos:
5371da177e4SLinus Torvalds	leal	EXT_PZRO,%a1	|answer is positive zero
5381da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5391da177e4SLinus Torvalds	bra	end_unfr
5401da177e4SLinus TorvaldsuEXT_RP:
5411da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative underflow
5421da177e4SLinus Torvalds	beqs	ue_rp_pos
5431da177e4SLinus Torvaldsue_rp_neg:
5441da177e4SLinus Torvalds	leal	EXT_PZRO,%a1	|answer is negative zero
5451da177e4SLinus Torvalds	oril	#negz_mask,USER_FPSR(%a6)
5461da177e4SLinus Torvalds	bra	end_unfr
5471da177e4SLinus Torvaldsue_rp_pos:
5481da177e4SLinus Torvalds	leal	EXT_PSML,%a1	|answer is positive smallest denorm
5491da177e4SLinus Torvalds	bra	end_unfr
5501da177e4SLinus Torvalds|
5511da177e4SLinus Torvalds|case DEST_FMT = DBL
5521da177e4SLinus Torvalds|
5531da177e4SLinus TorvaldsuDBL_RN:
5541da177e4SLinus Torvalds	leal	DBL_PZRO,%a1	|answer is +/- zero
5551da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5561da177e4SLinus Torvalds	bra	uset_sign
5571da177e4SLinus TorvaldsuDBL_RZ:
5581da177e4SLinus Torvalds	leal	DBL_PZRO,%a1	|answer is +/- zero
5591da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5601da177e4SLinus Torvalds	bra	uset_sign	|now go set the sign
5611da177e4SLinus TorvaldsuDBL_RM:
5621da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
5631da177e4SLinus Torvalds	beqs	ud_rm_pos
5641da177e4SLinus Torvaldsud_rm_neg:
5651da177e4SLinus Torvalds	leal	DBL_PSML,%a1	|answer is smallest denormalized negative
5661da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
5671da177e4SLinus Torvalds	bra	end_unfr
5681da177e4SLinus Torvaldsud_rm_pos:
5691da177e4SLinus Torvalds	leal	DBL_PZRO,%a1	|answer is positive zero
5701da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5711da177e4SLinus Torvalds	bra	end_unfr
5721da177e4SLinus TorvaldsuDBL_RP:
5731da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
5741da177e4SLinus Torvalds	beqs	ud_rp_pos
5751da177e4SLinus Torvaldsud_rp_neg:
5761da177e4SLinus Torvalds	leal	DBL_PZRO,%a1	|answer is negative zero
5771da177e4SLinus Torvalds	oril	#negz_mask,USER_FPSR(%a6)
5781da177e4SLinus Torvalds	bra	end_unfr
5791da177e4SLinus Torvaldsud_rp_pos:
5801da177e4SLinus Torvalds	leal	DBL_PSML,%a1	|answer is smallest denormalized negative
5811da177e4SLinus Torvalds	bra	end_unfr
5821da177e4SLinus Torvalds|
5831da177e4SLinus Torvalds|case DEST_FMT = SGL
5841da177e4SLinus Torvalds|
5851da177e4SLinus TorvaldsuSGL_RN:
5861da177e4SLinus Torvalds	leal	SGL_PZRO,%a1	|answer is +/- zero
5871da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5881da177e4SLinus Torvalds	bras	uset_sign
5891da177e4SLinus TorvaldsuSGL_RZ:
5901da177e4SLinus Torvalds	leal	SGL_PZRO,%a1	|answer is +/- zero
5911da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
5921da177e4SLinus Torvalds	bras	uset_sign
5931da177e4SLinus TorvaldsuSGL_RM:
5941da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
5951da177e4SLinus Torvalds	beqs	us_rm_pos
5961da177e4SLinus Torvaldsus_rm_neg:
5971da177e4SLinus Torvalds	leal	SGL_PSML,%a1	|answer is smallest denormalized negative
5981da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
5991da177e4SLinus Torvalds	bras	end_unfr
6001da177e4SLinus Torvaldsus_rm_pos:
6011da177e4SLinus Torvalds	leal	SGL_PZRO,%a1	|answer is positive zero
6021da177e4SLinus Torvalds	bsetb	#z_bit,FPSR_CC(%a6)
6031da177e4SLinus Torvalds	bras	end_unfr
6041da177e4SLinus TorvaldsuSGL_RP:
6051da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
6061da177e4SLinus Torvalds	beqs	us_rp_pos
6071da177e4SLinus Torvaldsus_rp_neg:
6081da177e4SLinus Torvalds	leal	SGL_PZRO,%a1	|answer is negative zero
6091da177e4SLinus Torvalds	oril	#negz_mask,USER_FPSR(%a6)
6101da177e4SLinus Torvalds	bras	end_unfr
6111da177e4SLinus Torvaldsus_rp_pos:
6121da177e4SLinus Torvalds	leal	SGL_PSML,%a1	|answer is smallest denormalized positive
6131da177e4SLinus Torvalds	bras	end_unfr
6141da177e4SLinus Torvalds
6151da177e4SLinus Torvaldsuset_sign:
6161da177e4SLinus Torvalds	tstb	LOCAL_SGN(%a0)	|if negative overflow
6171da177e4SLinus Torvalds	beqs	end_unfr
6181da177e4SLinus Torvaldsuneg_sign:
6191da177e4SLinus Torvalds	bsetb	#neg_bit,FPSR_CC(%a6)
6201da177e4SLinus Torvalds
6211da177e4SLinus Torvaldsend_unfr:
6221da177e4SLinus Torvalds	movew	LOCAL_EX(%a1),LOCAL_EX(%a0) |be careful not to overwrite sign
6231da177e4SLinus Torvalds	movel	LOCAL_HI(%a1),LOCAL_HI(%a0)
6241da177e4SLinus Torvalds	movel	LOCAL_LO(%a1),LOCAL_LO(%a0)
6251da177e4SLinus Torvalds	rts
6261da177e4SLinus Torvalds|
6271da177e4SLinus Torvalds|	reg_dest --- write byte, word, or long data to Dn
6281da177e4SLinus Torvalds|
6291da177e4SLinus Torvalds|
6301da177e4SLinus Torvalds| Input:
6311da177e4SLinus Torvalds|	L_SCR1: Data
6321da177e4SLinus Torvalds|	d1:     data size and dest register number formatted as:
6331da177e4SLinus Torvalds|
6341da177e4SLinus Torvalds|	32		5    4     3     2     1     0
6351da177e4SLinus Torvalds|       -----------------------------------------------
6361da177e4SLinus Torvalds|       |        0        |    Size   |  Dest Reg #   |
6371da177e4SLinus Torvalds|       -----------------------------------------------
6381da177e4SLinus Torvalds|
6391da177e4SLinus Torvalds|	Size is:
6401da177e4SLinus Torvalds|		0 - Byte
6411da177e4SLinus Torvalds|		1 - Word
6421da177e4SLinus Torvalds|		2 - Long/Single
6431da177e4SLinus Torvalds|
6441da177e4SLinus Torvaldspregdst:
6451da177e4SLinus Torvalds	.long	byte_d0
6461da177e4SLinus Torvalds	.long	byte_d1
6471da177e4SLinus Torvalds	.long	byte_d2
6481da177e4SLinus Torvalds	.long	byte_d3
6491da177e4SLinus Torvalds	.long	byte_d4
6501da177e4SLinus Torvalds	.long	byte_d5
6511da177e4SLinus Torvalds	.long	byte_d6
6521da177e4SLinus Torvalds	.long	byte_d7
6531da177e4SLinus Torvalds	.long	word_d0
6541da177e4SLinus Torvalds	.long	word_d1
6551da177e4SLinus Torvalds	.long	word_d2
6561da177e4SLinus Torvalds	.long	word_d3
6571da177e4SLinus Torvalds	.long	word_d4
6581da177e4SLinus Torvalds	.long	word_d5
6591da177e4SLinus Torvalds	.long	word_d6
6601da177e4SLinus Torvalds	.long	word_d7
6611da177e4SLinus Torvalds	.long	long_d0
6621da177e4SLinus Torvalds	.long	long_d1
6631da177e4SLinus Torvalds	.long	long_d2
6641da177e4SLinus Torvalds	.long	long_d3
6651da177e4SLinus Torvalds	.long	long_d4
6661da177e4SLinus Torvalds	.long	long_d5
6671da177e4SLinus Torvalds	.long	long_d6
6681da177e4SLinus Torvalds	.long	long_d7
6691da177e4SLinus Torvalds
6701da177e4SLinus Torvaldsreg_dest:
6711da177e4SLinus Torvalds	leal	pregdst,%a0
6721da177e4SLinus Torvalds	movel	%a0@(%d1:l:4),%a0
6731da177e4SLinus Torvalds	jmp	(%a0)
6741da177e4SLinus Torvalds
6751da177e4SLinus Torvaldsbyte_d0:
6761da177e4SLinus Torvalds	moveb	L_SCR1(%a6),USER_D0+3(%a6)
6771da177e4SLinus Torvalds	rts
6781da177e4SLinus Torvaldsbyte_d1:
6791da177e4SLinus Torvalds	moveb	L_SCR1(%a6),USER_D1+3(%a6)
6801da177e4SLinus Torvalds	rts
6811da177e4SLinus Torvaldsbyte_d2:
6821da177e4SLinus Torvalds	moveb	L_SCR1(%a6),%d2
6831da177e4SLinus Torvalds	rts
6841da177e4SLinus Torvaldsbyte_d3:
6851da177e4SLinus Torvalds	moveb	L_SCR1(%a6),%d3
6861da177e4SLinus Torvalds	rts
6871da177e4SLinus Torvaldsbyte_d4:
6881da177e4SLinus Torvalds	moveb	L_SCR1(%a6),%d4
6891da177e4SLinus Torvalds	rts
6901da177e4SLinus Torvaldsbyte_d5:
6911da177e4SLinus Torvalds	moveb	L_SCR1(%a6),%d5
6921da177e4SLinus Torvalds	rts
6931da177e4SLinus Torvaldsbyte_d6:
6941da177e4SLinus Torvalds	moveb	L_SCR1(%a6),%d6
6951da177e4SLinus Torvalds	rts
6961da177e4SLinus Torvaldsbyte_d7:
6971da177e4SLinus Torvalds	moveb	L_SCR1(%a6),%d7
6981da177e4SLinus Torvalds	rts
6991da177e4SLinus Torvaldsword_d0:
7001da177e4SLinus Torvalds	movew	L_SCR1(%a6),USER_D0+2(%a6)
7011da177e4SLinus Torvalds	rts
7021da177e4SLinus Torvaldsword_d1:
7031da177e4SLinus Torvalds	movew	L_SCR1(%a6),USER_D1+2(%a6)
7041da177e4SLinus Torvalds	rts
7051da177e4SLinus Torvaldsword_d2:
7061da177e4SLinus Torvalds	movew	L_SCR1(%a6),%d2
7071da177e4SLinus Torvalds	rts
7081da177e4SLinus Torvaldsword_d3:
7091da177e4SLinus Torvalds	movew	L_SCR1(%a6),%d3
7101da177e4SLinus Torvalds	rts
7111da177e4SLinus Torvaldsword_d4:
7121da177e4SLinus Torvalds	movew	L_SCR1(%a6),%d4
7131da177e4SLinus Torvalds	rts
7141da177e4SLinus Torvaldsword_d5:
7151da177e4SLinus Torvalds	movew	L_SCR1(%a6),%d5
7161da177e4SLinus Torvalds	rts
7171da177e4SLinus Torvaldsword_d6:
7181da177e4SLinus Torvalds	movew	L_SCR1(%a6),%d6
7191da177e4SLinus Torvalds	rts
7201da177e4SLinus Torvaldsword_d7:
7211da177e4SLinus Torvalds	movew	L_SCR1(%a6),%d7
7221da177e4SLinus Torvalds	rts
7231da177e4SLinus Torvaldslong_d0:
7241da177e4SLinus Torvalds	movel	L_SCR1(%a6),USER_D0(%a6)
7251da177e4SLinus Torvalds	rts
7261da177e4SLinus Torvaldslong_d1:
7271da177e4SLinus Torvalds	movel	L_SCR1(%a6),USER_D1(%a6)
7281da177e4SLinus Torvalds	rts
7291da177e4SLinus Torvaldslong_d2:
7301da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d2
7311da177e4SLinus Torvalds	rts
7321da177e4SLinus Torvaldslong_d3:
7331da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d3
7341da177e4SLinus Torvalds	rts
7351da177e4SLinus Torvaldslong_d4:
7361da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d4
7371da177e4SLinus Torvalds	rts
7381da177e4SLinus Torvaldslong_d5:
7391da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d5
7401da177e4SLinus Torvalds	rts
7411da177e4SLinus Torvaldslong_d6:
7421da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d6
7431da177e4SLinus Torvalds	rts
7441da177e4SLinus Torvaldslong_d7:
7451da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d7
7461da177e4SLinus Torvalds	rts
7471da177e4SLinus Torvalds	|end
748