Annotation of sys/arch/m68k/fpsp/MONADIC.GEN, Revision 1.1
1.1 ! nbrk 1: * $OpenBSD: MONADIC.GEN,v 1.2 1996/05/29 21:05:22 niklas Exp $
! 2: * $NetBSD: MONADIC.GEN,v 1.3 1994/10/26 07:48:42 cgd Exp $
! 3:
! 4: * MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
! 5: * M68000 Hi-Performance Microprocessor Division
! 6: * M68040 Software Package
! 7: *
! 8: * M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
! 9: * All rights reserved.
! 10: *
! 11: * THE SOFTWARE is provided on an "AS IS" basis and without warranty.
! 12: * To the maximum extent permitted by applicable law,
! 13: * MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
! 14: * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
! 15: * PARTICULAR PURPOSE and any warranty against infringement with
! 16: * regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
! 17: * and any accompanying written materials.
! 18: *
! 19: * To the maximum extent permitted by applicable law,
! 20: * IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
! 21: * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
! 22: * PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
! 23: * OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
! 24: * SOFTWARE. Motorola assumes no responsibility for the maintenance
! 25: * and support of the SOFTWARE.
! 26: *
! 27: * You are hereby granted a copyright license to use, modify, and
! 28: * distribute the SOFTWARE so long as this entire notice is retained
! 29: * without alteration in any modified and/or redistributed versions,
! 30: * and that such modified versions are clearly identified as such.
! 31: * No licenses are granted by implication, estoppel or otherwise
! 32: * under any patents or trademarks of Motorola, Inc.
! 33:
! 34: *
! 35: * MONADIC.GEN 1.5 5/18/92
! 36: *
! 37: * MONADIC.GEN 1.4 1/16/92
! 38: *
! 39: * MONADIC.GEN 1.3 4/30/91
! 40: *
! 41: * MONADIC.GEN --- generic MONADIC template
! 42: *
! 43: * This version saves all registers that will be used by the emulation
! 44: * routines and restores all but FP0 on exit. The FPSR is
! 45: * updated to reflect the result of the operation. Return value
! 46: * is placed in FP0 for single, double and extended results.
! 47: *
! 48: * The package subroutines expect the incoming FPCR to be zeroed
! 49: * since they need extended precision to work properly. The
! 50: * 'final' FPCR is expected in d1 so that the calculated result
! 51: * can be properly sized and rounded. Also, if the incoming FPCR
! 52: * has enabled any exceptions, the exception will be taken on the
! 53: * final fmovem in this template.
! 54: *
! 55: * Customizations:
! 56: * 1. Remove the movem.l at the entry and exit of
! 57: * each routine if your compiler treats those
! 58: * registers as scratch.
! 59: * 2. Likewise, don't save FP0/FP1 if they are scratch
! 60: * registers.
! 61: * 3. Delete handling of the fpsr if you only care about
! 62: * the result.
! 63: * 4. Some (most?) C compilers convert all float arguments
! 64: * to double, and provide no support at all for extended
! 65: * precision so remove the _OPs_ and _OPx_ entry points.
! 66: * 5. Move the result to d0/d1 if the compiler is that old.
! 67: *
! 68:
! 69: xref tag
! 70: xref _OPr_
! 71: xref _OPz_
! 72: xref _OPi_
! 73: xref _OPn_
! 74: xref _OPm_
! 75:
! 76: xdef _OPs_
! 77: _OPs_:
! 78: link a6,#-LOCAL_SIZE
! 79: movem.l d0-d1/a0-a1,USER_DA(a6)
! 80: fmovem.x fp0-fp3,USER_FP0(a6)
! 81: fmove.l fpsr,USER_FPSR(a6)
! 82: fmove.l fpcr,USER_FPCR(a6)
! 83: fmove.l fpcr,d1 ; user's rounding mode/precision
! 84: fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
! 85: *
! 86: * copy, convert and tag input argument
! 87: *
! 88: fmove.s 8(a6),fp0
! 89: fmove.x fp0,ETEMP(a6)
! 90: lea ETEMP(a6),a0
! 91: bsr tag
! 92: move.b d0,STAG(a6)
! 93: tst.b d0
! 94: bne.b _TMP_2
! 95: bsr _OPr_ ; normalized (regular) number
! 96: bra.b _TMP_6
! 97: _TMP_2:
! 98: cmp.b #$20,d0 ; zero?
! 99: bne.b _TMP_3
! 100: bsr _OPz_
! 101: bra.b _TMP_6
! 102: _TMP_3:
! 103: cmp.b #$40,d0 ; infinity?
! 104: bne.b _TMP_4
! 105: bsr _OPi_
! 106: bra.b _TMP_6
! 107: _TMP_4:
! 108: cmp.b #$60,d0 ; NaN?
! 109: bne.b _TMP_5
! 110: bsr _OPn_
! 111: bra.b _TMP_6
! 112: _TMP_5:
! 113: bsr _OPm_ ; assuming a denorm...
! 114:
! 115: _TMP_6:
! 116: fmove.l fpsr,d0 ; update status register
! 117: or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
! 118: fmove.l d0,fpsr
! 119: *
! 120: * Result is now in FP0
! 121: *
! 122: movem.l USER_DA(a6),d0-d1/a0-a1
! 123: fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
! 124: fmove.l USER_FPCR(a6),fpcr ; fpcr restored
! 125: unlk a6
! 126: rts
! 127:
! 128: xdef _OPd_
! 129: _OPd_:
! 130: link a6,#-LOCAL_SIZE
! 131: movem.l d0-d1/a0-a1,USER_DA(a6)
! 132: fmovem.x fp0-fp3,USER_FP0(a6)
! 133: fmove.l fpsr,USER_FPSR(a6)
! 134: fmove.l fpcr,USER_FPCR(a6)
! 135: fmove.l fpcr,d1 ; user's rounding mode/precision
! 136: fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
! 137: *
! 138: * copy, convert and tag input argument
! 139: *
! 140: fmove.d 8(a6),fp0
! 141: fmove.x fp0,ETEMP(a6)
! 142: lea ETEMP(a6),a0
! 143: bsr tag
! 144: move.b d0,STAG(a6)
! 145: tst.b d0
! 146: bne.b _TMP_7
! 147: bsr _OPr_ ; normalized (regular) number
! 148: bra.b _TMP_B
! 149: _TMP_7:
! 150: cmp.b #$20,d0 ; zero?
! 151: bne.b _TMP_8
! 152: bsr _OPz_
! 153: bra.b _TMP_B
! 154: _TMP_8:
! 155: cmp.b #$40,d0 ; infinity?
! 156: bne.b _TMP_9
! 157: bsr _OPi_
! 158: bra.b _TMP_B
! 159: _TMP_9:
! 160: cmp.b #$60,d0 ; NaN?
! 161: bne.b _TMP_A
! 162: bsr _OPn_
! 163: bra.b _TMP_B
! 164: _TMP_A:
! 165: bsr _OPm_ ; assuming a denorm...
! 166:
! 167: _TMP_B:
! 168: fmove.l fpsr,d0 ; update status register
! 169: or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
! 170: fmove.l d0,fpsr
! 171: *
! 172: * Result is now in FP0
! 173: *
! 174: movem.l USER_DA(a6),d0-d1/a0-a1
! 175: fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
! 176: fmove.l USER_FPCR(a6),fpcr ; fpcr restored
! 177: unlk a6
! 178: rts
! 179:
! 180: xdef _OPx_
! 181: _OPx_:
! 182: link a6,#-LOCAL_SIZE
! 183: movem.l d0-d1/a0-a1,USER_DA(a6)
! 184: fmovem.x fp0-fp3,USER_FP0(a6)
! 185: fmove.l fpsr,USER_FPSR(a6)
! 186: fmove.l fpcr,USER_FPCR(a6)
! 187: fmove.l fpcr,d1 ; user's rounding mode/precision
! 188: fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
! 189: *
! 190: * copy, convert and tag input argument
! 191: *
! 192: fmove.x 8(a6),fp0
! 193: fmove.x fp0,ETEMP(a6)
! 194: lea ETEMP(a6),a0
! 195: bsr tag
! 196: move.b d0,STAG(a6)
! 197: tst.b d0
! 198: bne.b _TMP_C
! 199: bsr _OPr_ ; normalized (regular) number
! 200: bra.b _TMP_G
! 201: _TMP_C:
! 202: cmp.b #$20,d0 ; zero?
! 203: bne.b _TMP_D
! 204: bsr _OPz_
! 205: bra.b _TMP_G
! 206: _TMP_D:
! 207: cmp.b #$40,d0 ; infinity?
! 208: bne.b _TMP_E
! 209: bsr _OPi_
! 210: bra.b _TMP_G
! 211: _TMP_E:
! 212: cmp.b #$60,d0 ; NaN?
! 213: bne.b _TMP_F
! 214: bsr _OPn_
! 215: bra.b _TMP_G
! 216: _TMP_F:
! 217: bsr _OPm_ ; assuming a denorm...
! 218:
! 219: _TMP_G:
! 220: fmove.l fpsr,d0 ; update status register
! 221: or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
! 222: fmove.l d0,fpsr
! 223: *
! 224: * Result is now in FP0
! 225: *
! 226: movem.l USER_DA(a6),d0-d1/a0-a1
! 227: fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
! 228: fmove.l USER_FPCR(a6),fpcr ; fpcr restored
! 229: unlk a6
! 230: rts
! 231:
CVSweb