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