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