MONADIC.GCC revision 1.2
11.2Scgd*	$NetBSD: MONADIC.GCC,v 1.2 1994/10/26 07:48:40 cgd Exp $
21.2Scgd
31.1Smycroft*	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
41.1Smycroft*	M68000 Hi-Performance Microprocessor Division
51.1Smycroft*	M68040 Software Package 
61.1Smycroft*
71.1Smycroft*	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
81.1Smycroft*	All rights reserved.
91.1Smycroft*
101.1Smycroft*	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
111.1Smycroft*	To the maximum extent permitted by applicable law,
121.1Smycroft*	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
131.1Smycroft*	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
141.1Smycroft*	PARTICULAR PURPOSE and any warranty against infringement with
151.1Smycroft*	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
161.1Smycroft*	and any accompanying written materials. 
171.1Smycroft*
181.1Smycroft*	To the maximum extent permitted by applicable law,
191.1Smycroft*	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
201.1Smycroft*	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
211.1Smycroft*	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
221.1Smycroft*	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
231.1Smycroft*	SOFTWARE.  Motorola assumes no responsibility for the maintenance
241.1Smycroft*	and support of the SOFTWARE.  
251.1Smycroft*
261.1Smycroft*	You are hereby granted a copyright license to use, modify, and
271.1Smycroft*	distribute the SOFTWARE so long as this entire notice is retained
281.1Smycroft*	without alteration in any modified and/or redistributed versions,
291.1Smycroft*	and that such modified versions are clearly identified as such.
301.1Smycroft*	No licenses are granted by implication, estoppel or otherwise
311.1Smycroft*	under any patents or trademarks of Motorola, Inc.
321.1Smycroft
331.1Smycroft*
341.1Smycroft*	MONADIC.GCC --- MONADIC template for GCC compiler
351.1Smycroft*
361.1Smycroft*	This is based on the generic template.  The only difference is that
371.1Smycroft*	GCC does not need the d0-d1/a0-a1 registers saved.
381.1Smycroft*
391.1Smycroft*	Customizations:  
401.1Smycroft*		2. Likewise, don't save FP0/FP1 if they are scratch
411.1Smycroft*		   registers.
421.1Smycroft*		3. Delete handling of the fpsr if you only care about
431.1Smycroft*		   the result.  
441.1Smycroft*		5. Move the result to d0/d1 if the compiler is that old.
451.1Smycroft*
461.1Smycroft
471.1Smycroft	xref	tag
481.1Smycroft	xref	_OPr_
491.1Smycroft	xref	_OPz_
501.1Smycroft	xref	_OPi_
511.1Smycroft	xref	_OPn_
521.1Smycroft	xref	_OPm_
531.1Smycroft
541.1Smycroft	xdef	_OPs_
551.1Smycroft_OPs_:
561.1Smycroft	link	a6,#-LOCAL_SIZE
571.1Smycroft	fmovem.x fp0-fp3,USER_FP0(a6)
581.1Smycroft	fmove.l	fpsr,USER_FPSR(a6)
591.1Smycroft	fmove.l	fpcr,USER_FPCR(a6)
601.1Smycroft	fmove.l	fpcr,d1		; user's rounding mode/precision
611.1Smycroft	fmove.l	#0,fpcr		; force rounding mode/prec to extended,rn
621.1Smycroft*
631.1Smycroft*	copy, convert and tag input argument
641.1Smycroft*
651.1Smycroft	fmove.s	8(a6),fp0
661.1Smycroft	fmove.x	fp0,ETEMP(a6)
671.1Smycroft	lea	ETEMP(a6),a0
681.1Smycroft	bsr	tag
691.1Smycroft	move.b	d0,STAG(a6)
701.1Smycroft	tst.b	d0
711.1Smycroft	bne.b	_TMP_2
721.1Smycroft	bsr	_OPr_		; normalized (regular) number
731.1Smycroft	bra.b	_TMP_6
741.1Smycroft_TMP_2:
751.1Smycroft	cmp.b	#$20,d0		; zero?
761.1Smycroft	bne.b	_TMP_3
771.1Smycroft	bsr	_OPz_
781.1Smycroft	bra.b	_TMP_6
791.1Smycroft_TMP_3:
801.1Smycroft	cmp.b	#$40,d0		; infinity?
811.1Smycroft	bne.b	_TMP_4
821.1Smycroft	bsr	_OPi_
831.1Smycroft	bra.b	_TMP_6
841.1Smycroft_TMP_4:
851.1Smycroft	cmp.b	#$60,d0		; NaN?
861.1Smycroft	bne.b	_TMP_5
871.1Smycroft	bsr	_OPn_
881.1Smycroft	bra.b	_TMP_6
891.1Smycroft_TMP_5:
901.1Smycroft	bsr	_OPm_		; assuming a denorm...
911.1Smycroft
921.1Smycroft_TMP_6:
931.1Smycroft	fmove.l	fpsr,d0		; update status register
941.1Smycroft	or.b	FPSR_AEXCEPT(a6),d0	;add previously accrued exceptions
951.1Smycroft	fmove.l	d0,fpsr
961.1Smycroft*
971.1Smycroft*	Result is now in FP0
981.1Smycroft*
991.1Smycroft	fmovem.x USER_FP1(a6),fp1-fp3	; note: FP0 not restored
1001.1Smycroft	fmove.l USER_FPCR(a6),fpcr	; fpcr restored
1011.1Smycroft	unlk	a6
1021.1Smycroft	rts
1031.1Smycroft
1041.1Smycroft	xdef	_OPd_
1051.1Smycroft_OPd_:
1061.1Smycroft	link	a6,#-LOCAL_SIZE
1071.1Smycroft	fmovem.x fp0-fp3,USER_FP0(a6)
1081.1Smycroft	fmove.l	fpsr,USER_FPSR(a6)
1091.1Smycroft	fmove.l	fpcr,USER_FPCR(a6)
1101.1Smycroft	fmove.l	fpcr,d1		; user's rounding mode/precision
1111.1Smycroft	fmove.l	#0,fpcr		; force rounding mode/prec to extended,rn
1121.1Smycroft*
1131.1Smycroft*	copy, convert and tag input argument
1141.1Smycroft*
1151.1Smycroft	fmove.d	8(a6),fp0
1161.1Smycroft	fmove.x	fp0,ETEMP(a6)
1171.1Smycroft	lea	ETEMP(a6),a0
1181.1Smycroft	bsr	tag
1191.1Smycroft	move.b	d0,STAG(a6)
1201.1Smycroft	tst.b	d0
1211.1Smycroft	bne.b	_TMP_7
1221.1Smycroft	bsr	_OPr_		; normalized (regular) number
1231.1Smycroft	bra.b	_TMP_B
1241.1Smycroft_TMP_7:
1251.1Smycroft	cmp.b	#$20,d0		; zero?
1261.1Smycroft	bne.b	_TMP_8
1271.1Smycroft	bsr	_OPz_
1281.1Smycroft	bra.b	_TMP_B
1291.1Smycroft_TMP_8:
1301.1Smycroft	cmp.b	#$40,d0		; infinity?
1311.1Smycroft	bne.b	_TMP_9
1321.1Smycroft	bsr	_OPi_
1331.1Smycroft	bra.b	_TMP_B
1341.1Smycroft_TMP_9:
1351.1Smycroft	cmp.b	#$60,d0		; NaN?
1361.1Smycroft	bne.b	_TMP_A
1371.1Smycroft	bsr	_OPn_
1381.1Smycroft	bra.b	_TMP_B
1391.1Smycroft_TMP_A:
1401.1Smycroft	bsr	_OPm_		; assuming a denorm...
1411.1Smycroft
1421.1Smycroft_TMP_B:
1431.1Smycroft	fmove.l	fpsr,d0		; update status register
1441.1Smycroft	or.b	FPSR_AEXCEPT(a6),d0	;add previously accrued exceptions
1451.1Smycroft	fmove.l	d0,fpsr
1461.1Smycroft*
1471.1Smycroft*	Result is now in FP0
1481.1Smycroft*
1491.1Smycroft	fmovem.x USER_FP1(a6),fp1-fp3	; note: FP0 not restored
1501.1Smycroft	fmove.l USER_FPCR(a6),fpcr	; fpcr restored
1511.1Smycroft	unlk	a6
1521.1Smycroft	rts
1531.1Smycroft
1541.1Smycroft	xdef	_OPx_
1551.1Smycroft_OPx_:
1561.1Smycroft	link	a6,#-LOCAL_SIZE
1571.1Smycroft	fmovem.x fp0-fp3,USER_FP0(a6)
1581.1Smycroft	fmove.l	fpsr,USER_FPSR(a6)
1591.1Smycroft	fmove.l	fpcr,USER_FPCR(a6)
1601.1Smycroft	fmove.l	fpcr,d1		; user's rounding mode/precision
1611.1Smycroft	fmove.l	#0,fpcr		; force rounding mode/prec to extended,rn
1621.1Smycroft*
1631.1Smycroft*	copy, convert and tag input argument
1641.1Smycroft*
1651.1Smycroft	fmove.x	8(a6),fp0
1661.1Smycroft	fmove.x	fp0,ETEMP(a6)
1671.1Smycroft	lea	ETEMP(a6),a0
1681.1Smycroft	bsr	tag
1691.1Smycroft	move.b	d0,STAG(a6)
1701.1Smycroft	tst.b	d0
1711.1Smycroft	bne.b	_TMP_C
1721.1Smycroft	bsr	_OPr_		; normalized (regular) number
1731.1Smycroft	bra.b	_TMP_G
1741.1Smycroft_TMP_C:
1751.1Smycroft	cmp.b	#$20,d0		; zero?
1761.1Smycroft	bne.b	_TMP_D
1771.1Smycroft	bsr	_OPz_
1781.1Smycroft	bra.b	_TMP_G
1791.1Smycroft_TMP_D:
1801.1Smycroft	cmp.b	#$40,d0		; infinity?
1811.1Smycroft	bne.b	_TMP_E
1821.1Smycroft	bsr	_OPi_
1831.1Smycroft	bra.b	_TMP_G
1841.1Smycroft_TMP_E:
1851.1Smycroft	cmp.b	#$60,d0		; NaN?
1861.1Smycroft	bne.b	_TMP_F
1871.1Smycroft	bsr	_OPn_
1881.1Smycroft	bra.b	_TMP_G
1891.1Smycroft_TMP_F:
1901.1Smycroft	bsr	_OPm_		; assuming a denorm...
1911.1Smycroft
1921.1Smycroft_TMP_G:
1931.1Smycroft	fmove.l	fpsr,d0		; update status register
1941.1Smycroft	or.b	FPSR_AEXCEPT(a6),d0	;add previously accrued exceptions
1951.1Smycroft	fmove.l	d0,fpsr
1961.1Smycroft*
1971.1Smycroft*	Result is now in FP0
1981.1Smycroft*
1991.1Smycroft	fmovem.x USER_FP1(a6),fp1-fp3	; note: FP0 not restored
2001.1Smycroft	fmove.l USER_FPCR(a6),fpcr	; fpcr restored
2011.1Smycroft	unlk	a6
2021.1Smycroft	rts
2031.1Smycroft
204