1* $NetBSD: DYADIC.GEN,v 1.2 1994/10/26 07:48:29 cgd Exp $ 2 3* MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP 4* M68000 Hi-Performance Microprocessor Division 5* M68040 Software Package 6* 7* M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc. 8* All rights reserved. 9* 10* THE SOFTWARE is provided on an "AS IS" basis and without warranty. 11* To the maximum extent permitted by applicable law, 12* MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, 13* INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A 14* PARTICULAR PURPOSE and any warranty against infringement with 15* regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) 16* and any accompanying written materials. 17* 18* To the maximum extent permitted by applicable law, 19* IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER 20* (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS 21* PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR 22* OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE 23* SOFTWARE. Motorola assumes no responsibility for the maintenance 24* and support of the SOFTWARE. 25* 26* You are hereby granted a copyright license to use, modify, and 27* distribute the SOFTWARE so long as this entire notice is retained 28* without alteration in any modified and/or redistributed versions, 29* and that such modified versions are clearly identified as such. 30* No licenses are granted by implication, estoppel or otherwise 31* under any patents or trademarks of Motorola, Inc. 32 33* 34* DYADIC.GEN 1.2 4/30/91 35* 36* DYADIC.GEN --- generic DYADIC template 37* 38* This version saves all registers that will be used by the emulation 39* routines and restores all but FP0 on exit. The FPSR is 40* updated to reflect the result of the operation. Return value 41* is placed in FP0 for single, double and extended results. 42* 43* The package subroutines expect the incoming FPCR to be zeroed 44* since they need extended precision to work properly. The 45* 'final' FPCR is expected in USER_FPCR(a6) so that the calculated result 46* can be properly sized and rounded. Also, if the incoming FPCR 47* has enabled any exceptions, the exception will be taken on the 48* final fmovem in this template. 49* 50* Customizations: 51* 1. Remove the movem.l at the entry and exit of 52* each routine if your compiler treats those 53* registers as scratch. 54* 2. Likewise, don't save FP0/FP1 if they are scratch 55* registers. 56* 3. Delete updating of the fpsr if you only care about 57* the result. 58* 4. Remove the _OPs_ and _OPx_ entry points if your compiler 59* treats everything as doubles. 60* 5. Move the result to d0/d1 if the compiler is that old. 61* 62 63 xref _OPa_ 64 xref tag 65 66 xdef _OPs_ 67_OPs_: 68 link a6,#-LOCAL_SIZE 69 movem.l d0-d1/a0-a1,USER_DA(a6) 70 fmovem.x fp0-fp3,USER_FP0(a6) 71 fmovem.l fpsr/fpcr,USER_FPSR(a6) ; user's rounding mode/precision 72 fmove.l #0,fpcr ; force rounding mode/prec to extended,rn 73* 74* copy, convert and tag input arguments 75* 76 fmove.s 8(a6),fp0 77 fmove.x fp0,FPTEMP(a6) 78 lea FPTEMP(a6),a0 79 bsr tag 80 move.b d0,DTAG(a6) 81 82 fmove.s 12(a6),fp0 83 fmove.x fp0,ETEMP(a6) 84 lea ETEMP(a6),a0 85 bsr tag 86 move.b d0,STAG(a6) 87 88 bsr _OPa_ 89 90 fmove.l fpsr,d0 ; update status register 91 or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions 92 swap.w d0 93 or.b FPSR_QBYTE(a6),d0 ; pickup sign of quotient byte 94 swap.w d0 95 fmove.l d0,fpsr 96* 97* Result is now in FP0 98* 99 movem.l USER_DA(a6),d0-d1/a0-a1 100 fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored 101 unlk a6 102 rts 103 104 xdef _OPd_ 105_OPd_: 106 link a6,#-LOCAL_SIZE 107 movem.l d0-d1/a0-a1,USER_DA(a6) 108 fmovem.x fp0-fp3,USER_FP0(a6) 109 fmovem.l fpsr/fpcr,USER_FPSR(a6) ; user's rounding mode/precision 110 fmove.l #0,fpcr ; force rounding mode/prec to extended,rn 111* 112* copy, convert and tag input arguments 113* 114 fmove.d 8(a6),fp0 115 fmove.x fp0,FPTEMP(a6) 116 lea FPTEMP(a6),a0 117 bsr tag 118 move.b d0,DTAG(a6) 119 120 fmove.d 16(a6),fp0 121 fmove.x fp0,ETEMP(a6) 122 lea ETEMP(a6),a0 123 bsr tag 124 move.b d0,STAG(a6) 125 126 bsr _OPa_ 127 128 fmove.l fpsr,d0 ; update status register 129 or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions 130 swap.w d0 131 or.b FPSR_QBYTE(a6),d0 ; pickup sign of quotient byte 132 swap.w d0 133 fmove.l d0,fpsr 134* 135* Result is now in FP0 136* 137 movem.l USER_DA(a6),d0-d1/a0-a1 138 fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored 139 unlk a6 140 rts 141 142 xdef _OPx_ 143_OPx_: 144 link a6,#-LOCAL_SIZE 145 movem.l d0-d1/a0-a1,USER_DA(a6) 146 fmovem.x fp0-fp3,USER_FP0(a6) 147 fmovem.l fpsr/fpcr,USER_FPSR(a6) ; user's rounding mode/precision 148 fmove.l #0,fpcr ; force rounding mode/prec to extended,rn 149* 150* copy, convert and tag input arguments 151* 152 fmove.x 8(a6),fp0 153 fmove.x fp0,FPTEMP(a6) 154 lea FPTEMP(a6),a0 155 bsr tag 156 move.b d0,DTAG(a6) 157 158 fmove.x 20(a6),fp0 159 fmove.x fp0,ETEMP(a6) 160 lea ETEMP(a6),a0 161 bsr tag 162 move.b d0,STAG(a6) 163 164 bsr _OPa_ 165 166 fmove.l fpsr,d0 ; update status register 167 or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions 168 swap.w d0 169 or.b FPSR_QBYTE(a6),d0 ; pickup sign of quotient byte 170 swap.w d0 171 fmove.l d0,fpsr 172* 173* Result is now in FP0 174* 175 movem.l USER_DA(a6),d0-d1/a0-a1 176 fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored 177 unlk a6 178 rts 179 180