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