/arch/m68k/ifpsp060/src/fplsp.S
Assembly | 10980 lines | 9796 code | 1184 blank | 0 comment | 71 complexity | c8c88f2e1c605f8e83e2ae51cdf83207 MD5 | raw file
Possible License(s): LGPL-2.0, AGPL-1.0, GPL-2.0
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
- M68000 Hi-Performance Microprocessor Division
- M68060 Software Package
- Production Release P1.00 -- October 10, 1994
- M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved.
- THE SOFTWARE is provided on an "AS IS" basis and without warranty.
- To the maximum extent permitted by applicable law,
- MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
- INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- and any warranty against infringement with regard to the SOFTWARE
- (INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials.
- To the maximum extent permitted by applicable law,
- IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
- (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
- BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
- ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
- Motorola assumes no responsibility for the maintenance and support of the SOFTWARE.
- You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE
- so long as this entire notice is retained without alteration in any modified and/or
- redistributed versions, and that such modified versions are clearly identified as such.
- No licenses are granted by implication, estoppel or otherwise under any patents
- or trademarks of Motorola, Inc.
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #
- # lfptop.s:
- # This file is appended to the top of the 060ILSP package
- # and contains the entry points into the package. The user, in
- # effect, branches to one of the branch table entries located here.
- #
- bra.l _facoss_
- short 0x0000
- bra.l _facosd_
- short 0x0000
- bra.l _facosx_
- short 0x0000
- bra.l _fasins_
- short 0x0000
- bra.l _fasind_
- short 0x0000
- bra.l _fasinx_
- short 0x0000
- bra.l _fatans_
- short 0x0000
- bra.l _fatand_
- short 0x0000
- bra.l _fatanx_
- short 0x0000
- bra.l _fatanhs_
- short 0x0000
- bra.l _fatanhd_
- short 0x0000
- bra.l _fatanhx_
- short 0x0000
- bra.l _fcoss_
- short 0x0000
- bra.l _fcosd_
- short 0x0000
- bra.l _fcosx_
- short 0x0000
- bra.l _fcoshs_
- short 0x0000
- bra.l _fcoshd_
- short 0x0000
- bra.l _fcoshx_
- short 0x0000
- bra.l _fetoxs_
- short 0x0000
- bra.l _fetoxd_
- short 0x0000
- bra.l _fetoxx_
- short 0x0000
- bra.l _fetoxm1s_
- short 0x0000
- bra.l _fetoxm1d_
- short 0x0000
- bra.l _fetoxm1x_
- short 0x0000
- bra.l _fgetexps_
- short 0x0000
- bra.l _fgetexpd_
- short 0x0000
- bra.l _fgetexpx_
- short 0x0000
- bra.l _fgetmans_
- short 0x0000
- bra.l _fgetmand_
- short 0x0000
- bra.l _fgetmanx_
- short 0x0000
- bra.l _flog10s_
- short 0x0000
- bra.l _flog10d_
- short 0x0000
- bra.l _flog10x_
- short 0x0000
- bra.l _flog2s_
- short 0x0000
- bra.l _flog2d_
- short 0x0000
- bra.l _flog2x_
- short 0x0000
- bra.l _flogns_
- short 0x0000
- bra.l _flognd_
- short 0x0000
- bra.l _flognx_
- short 0x0000
- bra.l _flognp1s_
- short 0x0000
- bra.l _flognp1d_
- short 0x0000
- bra.l _flognp1x_
- short 0x0000
- bra.l _fmods_
- short 0x0000
- bra.l _fmodd_
- short 0x0000
- bra.l _fmodx_
- short 0x0000
- bra.l _frems_
- short 0x0000
- bra.l _fremd_
- short 0x0000
- bra.l _fremx_
- short 0x0000
- bra.l _fscales_
- short 0x0000
- bra.l _fscaled_
- short 0x0000
- bra.l _fscalex_
- short 0x0000
- bra.l _fsins_
- short 0x0000
- bra.l _fsind_
- short 0x0000
- bra.l _fsinx_
- short 0x0000
- bra.l _fsincoss_
- short 0x0000
- bra.l _fsincosd_
- short 0x0000
- bra.l _fsincosx_
- short 0x0000
- bra.l _fsinhs_
- short 0x0000
- bra.l _fsinhd_
- short 0x0000
- bra.l _fsinhx_
- short 0x0000
- bra.l _ftans_
- short 0x0000
- bra.l _ftand_
- short 0x0000
- bra.l _ftanx_
- short 0x0000
- bra.l _ftanhs_
- short 0x0000
- bra.l _ftanhd_
- short 0x0000
- bra.l _ftanhx_
- short 0x0000
- bra.l _ftentoxs_
- short 0x0000
- bra.l _ftentoxd_
- short 0x0000
- bra.l _ftentoxx_
- short 0x0000
- bra.l _ftwotoxs_
- short 0x0000
- bra.l _ftwotoxd_
- short 0x0000
- bra.l _ftwotoxx_
- short 0x0000
- bra.l _fabss_
- short 0x0000
- bra.l _fabsd_
- short 0x0000
- bra.l _fabsx_
- short 0x0000
- bra.l _fadds_
- short 0x0000
- bra.l _faddd_
- short 0x0000
- bra.l _faddx_
- short 0x0000
- bra.l _fdivs_
- short 0x0000
- bra.l _fdivd_
- short 0x0000
- bra.l _fdivx_
- short 0x0000
- bra.l _fints_
- short 0x0000
- bra.l _fintd_
- short 0x0000
- bra.l _fintx_
- short 0x0000
- bra.l _fintrzs_
- short 0x0000
- bra.l _fintrzd_
- short 0x0000
- bra.l _fintrzx_
- short 0x0000
- bra.l _fmuls_
- short 0x0000
- bra.l _fmuld_
- short 0x0000
- bra.l _fmulx_
- short 0x0000
- bra.l _fnegs_
- short 0x0000
- bra.l _fnegd_
- short 0x0000
- bra.l _fnegx_
- short 0x0000
- bra.l _fsqrts_
- short 0x0000
- bra.l _fsqrtd_
- short 0x0000
- bra.l _fsqrtx_
- short 0x0000
- bra.l _fsubs_
- short 0x0000
- bra.l _fsubd_
- short 0x0000
- bra.l _fsubx_
- short 0x0000
- # leave room for future possible additions
- align 0x400
- #
- # This file contains a set of define statements for constants
- # in order to promote readability within the corecode itself.
- #
- set LOCAL_SIZE, 192 # stack frame size(bytes)
- set LV, -LOCAL_SIZE # stack offset
- set EXC_SR, 0x4 # stack status register
- set EXC_PC, 0x6 # stack pc
- set EXC_VOFF, 0xa # stacked vector offset
- set EXC_EA, 0xc # stacked <ea>
- set EXC_FP, 0x0 # frame pointer
- set EXC_AREGS, -68 # offset of all address regs
- set EXC_DREGS, -100 # offset of all data regs
- set EXC_FPREGS, -36 # offset of all fp regs
- set EXC_A7, EXC_AREGS+(7*4) # offset of saved a7
- set OLD_A7, EXC_AREGS+(6*4) # extra copy of saved a7
- set EXC_A6, EXC_AREGS+(6*4) # offset of saved a6
- set EXC_A5, EXC_AREGS+(5*4)
- set EXC_A4, EXC_AREGS+(4*4)
- set EXC_A3, EXC_AREGS+(3*4)
- set EXC_A2, EXC_AREGS+(2*4)
- set EXC_A1, EXC_AREGS+(1*4)
- set EXC_A0, EXC_AREGS+(0*4)
- set EXC_D7, EXC_DREGS+(7*4)
- set EXC_D6, EXC_DREGS+(6*4)
- set EXC_D5, EXC_DREGS+(5*4)
- set EXC_D4, EXC_DREGS+(4*4)
- set EXC_D3, EXC_DREGS+(3*4)
- set EXC_D2, EXC_DREGS+(2*4)
- set EXC_D1, EXC_DREGS+(1*4)
- set EXC_D0, EXC_DREGS+(0*4)
- set EXC_FP0, EXC_FPREGS+(0*12) # offset of saved fp0
- set EXC_FP1, EXC_FPREGS+(1*12) # offset of saved fp1
- set EXC_FP2, EXC_FPREGS+(2*12) # offset of saved fp2 (not used)
- set FP_SCR1, LV+80 # fp scratch 1
- set FP_SCR1_EX, FP_SCR1+0
- set FP_SCR1_SGN, FP_SCR1+2
- set FP_SCR1_HI, FP_SCR1+4
- set FP_SCR1_LO, FP_SCR1+8
- set FP_SCR0, LV+68 # fp scratch 0
- set FP_SCR0_EX, FP_SCR0+0
- set FP_SCR0_SGN, FP_SCR0+2
- set FP_SCR0_HI, FP_SCR0+4
- set FP_SCR0_LO, FP_SCR0+8
- set FP_DST, LV+56 # fp destination operand
- set FP_DST_EX, FP_DST+0
- set FP_DST_SGN, FP_DST+2
- set FP_DST_HI, FP_DST+4
- set FP_DST_LO, FP_DST+8
- set FP_SRC, LV+44 # fp source operand
- set FP_SRC_EX, FP_SRC+0
- set FP_SRC_SGN, FP_SRC+2
- set FP_SRC_HI, FP_SRC+4
- set FP_SRC_LO, FP_SRC+8
- set USER_FPIAR, LV+40 # FP instr address register
- set USER_FPSR, LV+36 # FP status register
- set FPSR_CC, USER_FPSR+0 # FPSR condition codes
- set FPSR_QBYTE, USER_FPSR+1 # FPSR qoutient byte
- set FPSR_EXCEPT, USER_FPSR+2 # FPSR exception status byte
- set FPSR_AEXCEPT, USER_FPSR+3 # FPSR accrued exception byte
- set USER_FPCR, LV+32 # FP control register
- set FPCR_ENABLE, USER_FPCR+2 # FPCR exception enable
- set FPCR_MODE, USER_FPCR+3 # FPCR rounding mode control
- set L_SCR3, LV+28 # integer scratch 3
- set L_SCR2, LV+24 # integer scratch 2
- set L_SCR1, LV+20 # integer scratch 1
- set STORE_FLG, LV+19 # flag: operand store (ie. not fcmp/ftst)
- set EXC_TEMP2, LV+24 # temporary space
- set EXC_TEMP, LV+16 # temporary space
- set DTAG, LV+15 # destination operand type
- set STAG, LV+14 # source operand type
- set SPCOND_FLG, LV+10 # flag: special case (see below)
- set EXC_CC, LV+8 # saved condition codes
- set EXC_EXTWPTR, LV+4 # saved current PC (active)
- set EXC_EXTWORD, LV+2 # saved extension word
- set EXC_CMDREG, LV+2 # saved extension word
- set EXC_OPWORD, LV+0 # saved operation word
- ################################
- # Helpful macros
- set FTEMP, 0 # offsets within an
- set FTEMP_EX, 0 # extended precision
- set FTEMP_SGN, 2 # value saved in memory.
- set FTEMP_HI, 4
- set FTEMP_LO, 8
- set FTEMP_GRS, 12
- set LOCAL, 0 # offsets within an
- set LOCAL_EX, 0 # extended precision
- set LOCAL_SGN, 2 # value saved in memory.
- set LOCAL_HI, 4
- set LOCAL_LO, 8
- set LOCAL_GRS, 12
- set DST, 0 # offsets within an
- set DST_EX, 0 # extended precision
- set DST_HI, 4 # value saved in memory.
- set DST_LO, 8
- set SRC, 0 # offsets within an
- set SRC_EX, 0 # extended precision
- set SRC_HI, 4 # value saved in memory.
- set SRC_LO, 8
- set SGL_LO, 0x3f81 # min sgl prec exponent
- set SGL_HI, 0x407e # max sgl prec exponent
- set DBL_LO, 0x3c01 # min dbl prec exponent
- set DBL_HI, 0x43fe # max dbl prec exponent
- set EXT_LO, 0x0 # min ext prec exponent
- set EXT_HI, 0x7ffe # max ext prec exponent
- set EXT_BIAS, 0x3fff # extended precision bias
- set SGL_BIAS, 0x007f # single precision bias
- set DBL_BIAS, 0x03ff # double precision bias
- set NORM, 0x00 # operand type for STAG/DTAG
- set ZERO, 0x01 # operand type for STAG/DTAG
- set INF, 0x02 # operand type for STAG/DTAG
- set QNAN, 0x03 # operand type for STAG/DTAG
- set DENORM, 0x04 # operand type for STAG/DTAG
- set SNAN, 0x05 # operand type for STAG/DTAG
- set UNNORM, 0x06 # operand type for STAG/DTAG
- ##################
- # FPSR/FPCR bits #
- ##################
- set neg_bit, 0x3 # negative result
- set z_bit, 0x2 # zero result
- set inf_bit, 0x1 # infinite result
- set nan_bit, 0x0 # NAN result
- set q_sn_bit, 0x7 # sign bit of quotient byte
- set bsun_bit, 7 # branch on unordered
- set snan_bit, 6 # signalling NAN
- set operr_bit, 5 # operand error
- set ovfl_bit, 4 # overflow
- set unfl_bit, 3 # underflow
- set dz_bit, 2 # divide by zero
- set inex2_bit, 1 # inexact result 2
- set inex1_bit, 0 # inexact result 1
- set aiop_bit, 7 # accrued inexact operation bit
- set aovfl_bit, 6 # accrued overflow bit
- set aunfl_bit, 5 # accrued underflow bit
- set adz_bit, 4 # accrued dz bit
- set ainex_bit, 3 # accrued inexact bit
- #############################
- # FPSR individual bit masks #
- #############################
- set neg_mask, 0x08000000 # negative bit mask (lw)
- set inf_mask, 0x02000000 # infinity bit mask (lw)
- set z_mask, 0x04000000 # zero bit mask (lw)
- set nan_mask, 0x01000000 # nan bit mask (lw)
- set neg_bmask, 0x08 # negative bit mask (byte)
- set inf_bmask, 0x02 # infinity bit mask (byte)
- set z_bmask, 0x04 # zero bit mask (byte)
- set nan_bmask, 0x01 # nan bit mask (byte)
- set bsun_mask, 0x00008000 # bsun exception mask
- set snan_mask, 0x00004000 # snan exception mask
- set operr_mask, 0x00002000 # operr exception mask
- set ovfl_mask, 0x00001000 # overflow exception mask
- set unfl_mask, 0x00000800 # underflow exception mask
- set dz_mask, 0x00000400 # dz exception mask
- set inex2_mask, 0x00000200 # inex2 exception mask
- set inex1_mask, 0x00000100 # inex1 exception mask
- set aiop_mask, 0x00000080 # accrued illegal operation
- set aovfl_mask, 0x00000040 # accrued overflow
- set aunfl_mask, 0x00000020 # accrued underflow
- set adz_mask, 0x00000010 # accrued divide by zero
- set ainex_mask, 0x00000008 # accrued inexact
- ######################################
- # FPSR combinations used in the FPSP #
- ######################################
- set dzinf_mask, inf_mask+dz_mask+adz_mask
- set opnan_mask, nan_mask+operr_mask+aiop_mask
- set nzi_mask, 0x01ffffff #clears N, Z, and I
- set unfinx_mask, unfl_mask+inex2_mask+aunfl_mask+ainex_mask
- set unf2inx_mask, unfl_mask+inex2_mask+ainex_mask
- set ovfinx_mask, ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
- set inx1a_mask, inex1_mask+ainex_mask
- set inx2a_mask, inex2_mask+ainex_mask
- set snaniop_mask, nan_mask+snan_mask+aiop_mask
- set snaniop2_mask, snan_mask+aiop_mask
- set naniop_mask, nan_mask+aiop_mask
- set neginf_mask, neg_mask+inf_mask
- set infaiop_mask, inf_mask+aiop_mask
- set negz_mask, neg_mask+z_mask
- set opaop_mask, operr_mask+aiop_mask
- set unfl_inx_mask, unfl_mask+aunfl_mask+ainex_mask
- set ovfl_inx_mask, ovfl_mask+aovfl_mask+ainex_mask
- #########
- # misc. #
- #########
- set rnd_stky_bit, 29 # stky bit pos in longword
- set sign_bit, 0x7 # sign bit
- set signan_bit, 0x6 # signalling nan bit
- set sgl_thresh, 0x3f81 # minimum sgl exponent
- set dbl_thresh, 0x3c01 # minimum dbl exponent
- set x_mode, 0x0 # extended precision
- set s_mode, 0x4 # single precision
- set d_mode, 0x8 # double precision
- set rn_mode, 0x0 # round-to-nearest
- set rz_mode, 0x1 # round-to-zero
- set rm_mode, 0x2 # round-tp-minus-infinity
- set rp_mode, 0x3 # round-to-plus-infinity
- set mantissalen, 64 # length of mantissa in bits
- set BYTE, 1 # len(byte) == 1 byte
- set WORD, 2 # len(word) == 2 bytes
- set LONG, 4 # len(longword) == 2 bytes
- set BSUN_VEC, 0xc0 # bsun vector offset
- set INEX_VEC, 0xc4 # inexact vector offset
- set DZ_VEC, 0xc8 # dz vector offset
- set UNFL_VEC, 0xcc # unfl vector offset
- set OPERR_VEC, 0xd0 # operr vector offset
- set OVFL_VEC, 0xd4 # ovfl vector offset
- set SNAN_VEC, 0xd8 # snan vector offset
- ###########################
- # SPecial CONDition FLaGs #
- ###########################
- set ftrapcc_flg, 0x01 # flag bit: ftrapcc exception
- set fbsun_flg, 0x02 # flag bit: bsun exception
- set mia7_flg, 0x04 # flag bit: (a7)+ <ea>
- set mda7_flg, 0x08 # flag bit: -(a7) <ea>
- set fmovm_flg, 0x40 # flag bit: fmovm instruction
- set immed_flg, 0x80 # flag bit: &<data> <ea>
- set ftrapcc_bit, 0x0
- set fbsun_bit, 0x1
- set mia7_bit, 0x2
- set mda7_bit, 0x3
- set immed_bit, 0x7
- ##################################
- # TRANSCENDENTAL "LAST-OP" FLAGS #
- ##################################
- set FMUL_OP, 0x0 # fmul instr performed last
- set FDIV_OP, 0x1 # fdiv performed last
- set FADD_OP, 0x2 # fadd performed last
- set FMOV_OP, 0x3 # fmov performed last
- #############
- # CONSTANTS #
- #############
- T1: long 0x40C62D38,0xD3D64634 # 16381 LOG2 LEAD
- T2: long 0x3D6F90AE,0xB1E75CC7 # 16381 LOG2 TRAIL
- PI: long 0x40000000,0xC90FDAA2,0x2168C235,0x00000000
- PIBY2: long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
- TWOBYPI:
- long 0x3FE45F30,0x6DC9C883
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fsins_
- _fsins_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L0_2s
- bsr.l ssin # operand is a NORM
- bra.b _L0_6s
- _L0_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L0_3s # no
- bsr.l src_zero # yes
- bra.b _L0_6s
- _L0_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L0_4s # no
- bsr.l t_operr # yes
- bra.b _L0_6s
- _L0_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L0_5s # no
- bsr.l src_qnan # yes
- bra.b _L0_6s
- _L0_5s:
- bsr.l ssind # operand is a DENORM
- _L0_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fsind_
- _fsind_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L0_2d
- bsr.l ssin # operand is a NORM
- bra.b _L0_6d
- _L0_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L0_3d # no
- bsr.l src_zero # yes
- bra.b _L0_6d
- _L0_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L0_4d # no
- bsr.l t_operr # yes
- bra.b _L0_6d
- _L0_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L0_5d # no
- bsr.l src_qnan # yes
- bra.b _L0_6d
- _L0_5d:
- bsr.l ssind # operand is a DENORM
- _L0_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fsinx_
- _fsinx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L0_2x
- bsr.l ssin # operand is a NORM
- bra.b _L0_6x
- _L0_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L0_3x # no
- bsr.l src_zero # yes
- bra.b _L0_6x
- _L0_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L0_4x # no
- bsr.l t_operr # yes
- bra.b _L0_6x
- _L0_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L0_5x # no
- bsr.l src_qnan # yes
- bra.b _L0_6x
- _L0_5x:
- bsr.l ssind # operand is a DENORM
- _L0_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fcoss_
- _fcoss_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L1_2s
- bsr.l scos # operand is a NORM
- bra.b _L1_6s
- _L1_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L1_3s # no
- bsr.l ld_pone # yes
- bra.b _L1_6s
- _L1_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L1_4s # no
- bsr.l t_operr # yes
- bra.b _L1_6s
- _L1_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L1_5s # no
- bsr.l src_qnan # yes
- bra.b _L1_6s
- _L1_5s:
- bsr.l scosd # operand is a DENORM
- _L1_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fcosd_
- _fcosd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L1_2d
- bsr.l scos # operand is a NORM
- bra.b _L1_6d
- _L1_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L1_3d # no
- bsr.l ld_pone # yes
- bra.b _L1_6d
- _L1_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L1_4d # no
- bsr.l t_operr # yes
- bra.b _L1_6d
- _L1_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L1_5d # no
- bsr.l src_qnan # yes
- bra.b _L1_6d
- _L1_5d:
- bsr.l scosd # operand is a DENORM
- _L1_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fcosx_
- _fcosx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L1_2x
- bsr.l scos # operand is a NORM
- bra.b _L1_6x
- _L1_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L1_3x # no
- bsr.l ld_pone # yes
- bra.b _L1_6x
- _L1_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L1_4x # no
- bsr.l t_operr # yes
- bra.b _L1_6x
- _L1_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L1_5x # no
- bsr.l src_qnan # yes
- bra.b _L1_6x
- _L1_5x:
- bsr.l scosd # operand is a DENORM
- _L1_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fsinhs_
- _fsinhs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L2_2s
- bsr.l ssinh # operand is a NORM
- bra.b _L2_6s
- _L2_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L2_3s # no
- bsr.l src_zero # yes
- bra.b _L2_6s
- _L2_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L2_4s # no
- bsr.l src_inf # yes
- bra.b _L2_6s
- _L2_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L2_5s # no
- bsr.l src_qnan # yes
- bra.b _L2_6s
- _L2_5s:
- bsr.l ssinhd # operand is a DENORM
- _L2_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fsinhd_
- _fsinhd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L2_2d
- bsr.l ssinh # operand is a NORM
- bra.b _L2_6d
- _L2_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L2_3d # no
- bsr.l src_zero # yes
- bra.b _L2_6d
- _L2_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L2_4d # no
- bsr.l src_inf # yes
- bra.b _L2_6d
- _L2_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L2_5d # no
- bsr.l src_qnan # yes
- bra.b _L2_6d
- _L2_5d:
- bsr.l ssinhd # operand is a DENORM
- _L2_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fsinhx_
- _fsinhx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L2_2x
- bsr.l ssinh # operand is a NORM
- bra.b _L2_6x
- _L2_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L2_3x # no
- bsr.l src_zero # yes
- bra.b _L2_6x
- _L2_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L2_4x # no
- bsr.l src_inf # yes
- bra.b _L2_6x
- _L2_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L2_5x # no
- bsr.l src_qnan # yes
- bra.b _L2_6x
- _L2_5x:
- bsr.l ssinhd # operand is a DENORM
- _L2_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _flognp1s_
- _flognp1s_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L3_2s
- bsr.l slognp1 # operand is a NORM
- bra.b _L3_6s
- _L3_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L3_3s # no
- bsr.l src_zero # yes
- bra.b _L3_6s
- _L3_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L3_4s # no
- bsr.l sopr_inf # yes
- bra.b _L3_6s
- _L3_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L3_5s # no
- bsr.l src_qnan # yes
- bra.b _L3_6s
- _L3_5s:
- bsr.l slognp1d # operand is a DENORM
- _L3_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flognp1d_
- _flognp1d_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L3_2d
- bsr.l slognp1 # operand is a NORM
- bra.b _L3_6d
- _L3_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L3_3d # no
- bsr.l src_zero # yes
- bra.b _L3_6d
- _L3_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L3_4d # no
- bsr.l sopr_inf # yes
- bra.b _L3_6d
- _L3_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L3_5d # no
- bsr.l src_qnan # yes
- bra.b _L3_6d
- _L3_5d:
- bsr.l slognp1d # operand is a DENORM
- _L3_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flognp1x_
- _flognp1x_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L3_2x
- bsr.l slognp1 # operand is a NORM
- bra.b _L3_6x
- _L3_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L3_3x # no
- bsr.l src_zero # yes
- bra.b _L3_6x
- _L3_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L3_4x # no
- bsr.l sopr_inf # yes
- bra.b _L3_6x
- _L3_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L3_5x # no
- bsr.l src_qnan # yes
- bra.b _L3_6x
- _L3_5x:
- bsr.l slognp1d # operand is a DENORM
- _L3_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fetoxm1s_
- _fetoxm1s_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L4_2s
- bsr.l setoxm1 # operand is a NORM
- bra.b _L4_6s
- _L4_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L4_3s # no
- bsr.l src_zero # yes
- bra.b _L4_6s
- _L4_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L4_4s # no
- bsr.l setoxm1i # yes
- bra.b _L4_6s
- _L4_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L4_5s # no
- bsr.l src_qnan # yes
- bra.b _L4_6s
- _L4_5s:
- bsr.l setoxm1d # operand is a DENORM
- _L4_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fetoxm1d_
- _fetoxm1d_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L4_2d
- bsr.l setoxm1 # operand is a NORM
- bra.b _L4_6d
- _L4_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L4_3d # no
- bsr.l src_zero # yes
- bra.b _L4_6d
- _L4_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L4_4d # no
- bsr.l setoxm1i # yes
- bra.b _L4_6d
- _L4_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L4_5d # no
- bsr.l src_qnan # yes
- bra.b _L4_6d
- _L4_5d:
- bsr.l setoxm1d # operand is a DENORM
- _L4_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fetoxm1x_
- _fetoxm1x_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L4_2x
- bsr.l setoxm1 # operand is a NORM
- bra.b _L4_6x
- _L4_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L4_3x # no
- bsr.l src_zero # yes
- bra.b _L4_6x
- _L4_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L4_4x # no
- bsr.l setoxm1i # yes
- bra.b _L4_6x
- _L4_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L4_5x # no
- bsr.l src_qnan # yes
- bra.b _L4_6x
- _L4_5x:
- bsr.l setoxm1d # operand is a DENORM
- _L4_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _ftanhs_
- _ftanhs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L5_2s
- bsr.l stanh # operand is a NORM
- bra.b _L5_6s
- _L5_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L5_3s # no
- bsr.l src_zero # yes
- bra.b _L5_6s
- _L5_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L5_4s # no
- bsr.l src_one # yes
- bra.b _L5_6s
- _L5_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L5_5s # no
- bsr.l src_qnan # yes
- bra.b _L5_6s
- _L5_5s:
- bsr.l stanhd # operand is a DENORM
- _L5_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftanhd_
- _ftanhd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L5_2d
- bsr.l stanh # operand is a NORM
- bra.b _L5_6d
- _L5_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L5_3d # no
- bsr.l src_zero # yes
- bra.b _L5_6d
- _L5_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L5_4d # no
- bsr.l src_one # yes
- bra.b _L5_6d
- _L5_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L5_5d # no
- bsr.l src_qnan # yes
- bra.b _L5_6d
- _L5_5d:
- bsr.l stanhd # operand is a DENORM
- _L5_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftanhx_
- _ftanhx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L5_2x
- bsr.l stanh # operand is a NORM
- bra.b _L5_6x
- _L5_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L5_3x # no
- bsr.l src_zero # yes
- bra.b _L5_6x
- _L5_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L5_4x # no
- bsr.l src_one # yes
- bra.b _L5_6x
- _L5_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L5_5x # no
- bsr.l src_qnan # yes
- bra.b _L5_6x
- _L5_5x:
- bsr.l stanhd # operand is a DENORM
- _L5_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fatans_
- _fatans_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L6_2s
- bsr.l satan # operand is a NORM
- bra.b _L6_6s
- _L6_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L6_3s # no
- bsr.l src_zero # yes
- bra.b _L6_6s
- _L6_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L6_4s # no
- bsr.l spi_2 # yes
- bra.b _L6_6s
- _L6_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L6_5s # no
- bsr.l src_qnan # yes
- bra.b _L6_6s
- _L6_5s:
- bsr.l satand # operand is a DENORM
- _L6_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fatand_
- _fatand_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L6_2d
- bsr.l satan # operand is a NORM
- bra.b _L6_6d
- _L6_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L6_3d # no
- bsr.l src_zero # yes
- bra.b _L6_6d
- _L6_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L6_4d # no
- bsr.l spi_2 # yes
- bra.b _L6_6d
- _L6_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L6_5d # no
- bsr.l src_qnan # yes
- bra.b _L6_6d
- _L6_5d:
- bsr.l satand # operand is a DENORM
- _L6_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fatanx_
- _fatanx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L6_2x
- bsr.l satan # operand is a NORM
- bra.b _L6_6x
- _L6_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L6_3x # no
- bsr.l src_zero # yes
- bra.b _L6_6x
- _L6_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L6_4x # no
- bsr.l spi_2 # yes
- bra.b _L6_6x
- _L6_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L6_5x # no
- bsr.l src_qnan # yes
- bra.b _L6_6x
- _L6_5x:
- bsr.l satand # operand is a DENORM
- _L6_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fasins_
- _fasins_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L7_2s
- bsr.l sasin # operand is a NORM
- bra.b _L7_6s
- _L7_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L7_3s # no
- bsr.l src_zero # yes
- bra.b _L7_6s
- _L7_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L7_4s # no
- bsr.l t_operr # yes
- bra.b _L7_6s
- _L7_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L7_5s # no
- bsr.l src_qnan # yes
- bra.b _L7_6s
- _L7_5s:
- bsr.l sasind # operand is a DENORM
- _L7_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fasind_
- _fasind_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L7_2d
- bsr.l sasin # operand is a NORM
- bra.b _L7_6d
- _L7_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L7_3d # no
- bsr.l src_zero # yes
- bra.b _L7_6d
- _L7_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L7_4d # no
- bsr.l t_operr # yes
- bra.b _L7_6d
- _L7_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L7_5d # no
- bsr.l src_qnan # yes
- bra.b _L7_6d
- _L7_5d:
- bsr.l sasind # operand is a DENORM
- _L7_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fasinx_
- _fasinx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L7_2x
- bsr.l sasin # operand is a NORM
- bra.b _L7_6x
- _L7_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L7_3x # no
- bsr.l src_zero # yes
- bra.b _L7_6x
- _L7_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L7_4x # no
- bsr.l t_operr # yes
- bra.b _L7_6x
- _L7_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L7_5x # no
- bsr.l src_qnan # yes
- bra.b _L7_6x
- _L7_5x:
- bsr.l sasind # operand is a DENORM
- _L7_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fatanhs_
- _fatanhs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L8_2s
- bsr.l satanh # operand is a NORM
- bra.b _L8_6s
- _L8_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L8_3s # no
- bsr.l src_zero # yes
- bra.b _L8_6s
- _L8_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L8_4s # no
- bsr.l t_operr # yes
- bra.b _L8_6s
- _L8_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L8_5s # no
- bsr.l src_qnan # yes
- bra.b _L8_6s
- _L8_5s:
- bsr.l satanhd # operand is a DENORM
- _L8_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fatanhd_
- _fatanhd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L8_2d
- bsr.l satanh # operand is a NORM
- bra.b _L8_6d
- _L8_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L8_3d # no
- bsr.l src_zero # yes
- bra.b _L8_6d
- _L8_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L8_4d # no
- bsr.l t_operr # yes
- bra.b _L8_6d
- _L8_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L8_5d # no
- bsr.l src_qnan # yes
- bra.b _L8_6d
- _L8_5d:
- bsr.l satanhd # operand is a DENORM
- _L8_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fatanhx_
- _fatanhx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L8_2x
- bsr.l satanh # operand is a NORM
- bra.b _L8_6x
- _L8_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L8_3x # no
- bsr.l src_zero # yes
- bra.b _L8_6x
- _L8_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L8_4x # no
- bsr.l t_operr # yes
- bra.b _L8_6x
- _L8_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L8_5x # no
- bsr.l src_qnan # yes
- bra.b _L8_6x
- _L8_5x:
- bsr.l satanhd # operand is a DENORM
- _L8_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _ftans_
- _ftans_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L9_2s
- bsr.l stan # operand is a NORM
- bra.b _L9_6s
- _L9_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L9_3s # no
- bsr.l src_zero # yes
- bra.b _L9_6s
- _L9_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L9_4s # no
- bsr.l t_operr # yes
- bra.b _L9_6s
- _L9_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L9_5s # no
- bsr.l src_qnan # yes
- bra.b _L9_6s
- _L9_5s:
- bsr.l stand # operand is a DENORM
- _L9_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftand_
- _ftand_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L9_2d
- bsr.l stan # operand is a NORM
- bra.b _L9_6d
- _L9_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L9_3d # no
- bsr.l src_zero # yes
- bra.b _L9_6d
- _L9_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L9_4d # no
- bsr.l t_operr # yes
- bra.b _L9_6d
- _L9_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L9_5d # no
- bsr.l src_qnan # yes
- bra.b _L9_6d
- _L9_5d:
- bsr.l stand # operand is a DENORM
- _L9_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftanx_
- _ftanx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L9_2x
- bsr.l stan # operand is a NORM
- bra.b _L9_6x
- _L9_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L9_3x # no
- bsr.l src_zero # yes
- bra.b _L9_6x
- _L9_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L9_4x # no
- bsr.l t_operr # yes
- bra.b _L9_6x
- _L9_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L9_5x # no
- bsr.l src_qnan # yes
- bra.b _L9_6x
- _L9_5x:
- bsr.l stand # operand is a DENORM
- _L9_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fetoxs_
- _fetoxs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L10_2s
- bsr.l setox # operand is a NORM
- bra.b _L10_6s
- _L10_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L10_3s # no
- bsr.l ld_pone # yes
- bra.b _L10_6s
- _L10_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L10_4s # no
- bsr.l szr_inf # yes
- bra.b _L10_6s
- _L10_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L10_5s # no
- bsr.l src_qnan # yes
- bra.b _L10_6s
- _L10_5s:
- bsr.l setoxd # operand is a DENORM
- _L10_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fetoxd_
- _fetoxd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L10_2d
- bsr.l setox # operand is a NORM
- bra.b _L10_6d
- _L10_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L10_3d # no
- bsr.l ld_pone # yes
- bra.b _L10_6d
- _L10_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L10_4d # no
- bsr.l szr_inf # yes
- bra.b _L10_6d
- _L10_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L10_5d # no
- bsr.l src_qnan # yes
- bra.b _L10_6d
- _L10_5d:
- bsr.l setoxd # operand is a DENORM
- _L10_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fetoxx_
- _fetoxx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L10_2x
- bsr.l setox # operand is a NORM
- bra.b _L10_6x
- _L10_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L10_3x # no
- bsr.l ld_pone # yes
- bra.b _L10_6x
- _L10_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L10_4x # no
- bsr.l szr_inf # yes
- bra.b _L10_6x
- _L10_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L10_5x # no
- bsr.l src_qnan # yes
- bra.b _L10_6x
- _L10_5x:
- bsr.l setoxd # operand is a DENORM
- _L10_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _ftwotoxs_
- _ftwotoxs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L11_2s
- bsr.l stwotox # operand is a NORM
- bra.b _L11_6s
- _L11_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L11_3s # no
- bsr.l ld_pone # yes
- bra.b _L11_6s
- _L11_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L11_4s # no
- bsr.l szr_inf # yes
- bra.b _L11_6s
- _L11_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L11_5s # no
- bsr.l src_qnan # yes
- bra.b _L11_6s
- _L11_5s:
- bsr.l stwotoxd # operand is a DENORM
- _L11_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftwotoxd_
- _ftwotoxd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L11_2d
- bsr.l stwotox # operand is a NORM
- bra.b _L11_6d
- _L11_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L11_3d # no
- bsr.l ld_pone # yes
- bra.b _L11_6d
- _L11_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L11_4d # no
- bsr.l szr_inf # yes
- bra.b _L11_6d
- _L11_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L11_5d # no
- bsr.l src_qnan # yes
- bra.b _L11_6d
- _L11_5d:
- bsr.l stwotoxd # operand is a DENORM
- _L11_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftwotoxx_
- _ftwotoxx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L11_2x
- bsr.l stwotox # operand is a NORM
- bra.b _L11_6x
- _L11_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L11_3x # no
- bsr.l ld_pone # yes
- bra.b _L11_6x
- _L11_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L11_4x # no
- bsr.l szr_inf # yes
- bra.b _L11_6x
- _L11_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L11_5x # no
- bsr.l src_qnan # yes
- bra.b _L11_6x
- _L11_5x:
- bsr.l stwotoxd # operand is a DENORM
- _L11_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _ftentoxs_
- _ftentoxs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L12_2s
- bsr.l stentox # operand is a NORM
- bra.b _L12_6s
- _L12_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L12_3s # no
- bsr.l ld_pone # yes
- bra.b _L12_6s
- _L12_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L12_4s # no
- bsr.l szr_inf # yes
- bra.b _L12_6s
- _L12_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L12_5s # no
- bsr.l src_qnan # yes
- bra.b _L12_6s
- _L12_5s:
- bsr.l stentoxd # operand is a DENORM
- _L12_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftentoxd_
- _ftentoxd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L12_2d
- bsr.l stentox # operand is a NORM
- bra.b _L12_6d
- _L12_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L12_3d # no
- bsr.l ld_pone # yes
- bra.b _L12_6d
- _L12_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L12_4d # no
- bsr.l szr_inf # yes
- bra.b _L12_6d
- _L12_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L12_5d # no
- bsr.l src_qnan # yes
- bra.b _L12_6d
- _L12_5d:
- bsr.l stentoxd # operand is a DENORM
- _L12_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _ftentoxx_
- _ftentoxx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L12_2x
- bsr.l stentox # operand is a NORM
- bra.b _L12_6x
- _L12_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L12_3x # no
- bsr.l ld_pone # yes
- bra.b _L12_6x
- _L12_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L12_4x # no
- bsr.l szr_inf # yes
- bra.b _L12_6x
- _L12_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L12_5x # no
- bsr.l src_qnan # yes
- bra.b _L12_6x
- _L12_5x:
- bsr.l stentoxd # operand is a DENORM
- _L12_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _flogns_
- _flogns_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L13_2s
- bsr.l slogn # operand is a NORM
- bra.b _L13_6s
- _L13_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L13_3s # no
- bsr.l t_dz2 # yes
- bra.b _L13_6s
- _L13_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L13_4s # no
- bsr.l sopr_inf # yes
- bra.b _L13_6s
- _L13_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L13_5s # no
- bsr.l src_qnan # yes
- bra.b _L13_6s
- _L13_5s:
- bsr.l slognd # operand is a DENORM
- _L13_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flognd_
- _flognd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L13_2d
- bsr.l slogn # operand is a NORM
- bra.b _L13_6d
- _L13_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L13_3d # no
- bsr.l t_dz2 # yes
- bra.b _L13_6d
- _L13_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L13_4d # no
- bsr.l sopr_inf # yes
- bra.b _L13_6d
- _L13_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L13_5d # no
- bsr.l src_qnan # yes
- bra.b _L13_6d
- _L13_5d:
- bsr.l slognd # operand is a DENORM
- _L13_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flognx_
- _flognx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L13_2x
- bsr.l slogn # operand is a NORM
- bra.b _L13_6x
- _L13_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L13_3x # no
- bsr.l t_dz2 # yes
- bra.b _L13_6x
- _L13_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L13_4x # no
- bsr.l sopr_inf # yes
- bra.b _L13_6x
- _L13_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L13_5x # no
- bsr.l src_qnan # yes
- bra.b _L13_6x
- _L13_5x:
- bsr.l slognd # operand is a DENORM
- _L13_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _flog10s_
- _flog10s_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L14_2s
- bsr.l slog10 # operand is a NORM
- bra.b _L14_6s
- _L14_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L14_3s # no
- bsr.l t_dz2 # yes
- bra.b _L14_6s
- _L14_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L14_4s # no
- bsr.l sopr_inf # yes
- bra.b _L14_6s
- _L14_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L14_5s # no
- bsr.l src_qnan # yes
- bra.b _L14_6s
- _L14_5s:
- bsr.l slog10d # operand is a DENORM
- _L14_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flog10d_
- _flog10d_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L14_2d
- bsr.l slog10 # operand is a NORM
- bra.b _L14_6d
- _L14_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L14_3d # no
- bsr.l t_dz2 # yes
- bra.b _L14_6d
- _L14_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L14_4d # no
- bsr.l sopr_inf # yes
- bra.b _L14_6d
- _L14_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L14_5d # no
- bsr.l src_qnan # yes
- bra.b _L14_6d
- _L14_5d:
- bsr.l slog10d # operand is a DENORM
- _L14_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flog10x_
- _flog10x_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L14_2x
- bsr.l slog10 # operand is a NORM
- bra.b _L14_6x
- _L14_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L14_3x # no
- bsr.l t_dz2 # yes
- bra.b _L14_6x
- _L14_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L14_4x # no
- bsr.l sopr_inf # yes
- bra.b _L14_6x
- _L14_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L14_5x # no
- bsr.l src_qnan # yes
- bra.b _L14_6x
- _L14_5x:
- bsr.l slog10d # operand is a DENORM
- _L14_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _flog2s_
- _flog2s_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L15_2s
- bsr.l slog2 # operand is a NORM
- bra.b _L15_6s
- _L15_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L15_3s # no
- bsr.l t_dz2 # yes
- bra.b _L15_6s
- _L15_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L15_4s # no
- bsr.l sopr_inf # yes
- bra.b _L15_6s
- _L15_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L15_5s # no
- bsr.l src_qnan # yes
- bra.b _L15_6s
- _L15_5s:
- bsr.l slog2d # operand is a DENORM
- _L15_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flog2d_
- _flog2d_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L15_2d
- bsr.l slog2 # operand is a NORM
- bra.b _L15_6d
- _L15_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L15_3d # no
- bsr.l t_dz2 # yes
- bra.b _L15_6d
- _L15_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L15_4d # no
- bsr.l sopr_inf # yes
- bra.b _L15_6d
- _L15_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L15_5d # no
- bsr.l src_qnan # yes
- bra.b _L15_6d
- _L15_5d:
- bsr.l slog2d # operand is a DENORM
- _L15_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _flog2x_
- _flog2x_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L15_2x
- bsr.l slog2 # operand is a NORM
- bra.b _L15_6x
- _L15_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L15_3x # no
- bsr.l t_dz2 # yes
- bra.b _L15_6x
- _L15_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L15_4x # no
- bsr.l sopr_inf # yes
- bra.b _L15_6x
- _L15_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L15_5x # no
- bsr.l src_qnan # yes
- bra.b _L15_6x
- _L15_5x:
- bsr.l slog2d # operand is a DENORM
- _L15_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fcoshs_
- _fcoshs_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L16_2s
- bsr.l scosh # operand is a NORM
- bra.b _L16_6s
- _L16_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L16_3s # no
- bsr.l ld_pone # yes
- bra.b _L16_6s
- _L16_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L16_4s # no
- bsr.l ld_pinf # yes
- bra.b _L16_6s
- _L16_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L16_5s # no
- bsr.l src_qnan # yes
- bra.b _L16_6s
- _L16_5s:
- bsr.l scoshd # operand is a DENORM
- _L16_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fcoshd_
- _fcoshd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L16_2d
- bsr.l scosh # operand is a NORM
- bra.b _L16_6d
- _L16_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L16_3d # no
- bsr.l ld_pone # yes
- bra.b _L16_6d
- _L16_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L16_4d # no
- bsr.l ld_pinf # yes
- bra.b _L16_6d
- _L16_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L16_5d # no
- bsr.l src_qnan # yes
- bra.b _L16_6d
- _L16_5d:
- bsr.l scoshd # operand is a DENORM
- _L16_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fcoshx_
- _fcoshx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L16_2x
- bsr.l scosh # operand is a NORM
- bra.b _L16_6x
- _L16_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L16_3x # no
- bsr.l ld_pone # yes
- bra.b _L16_6x
- _L16_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L16_4x # no
- bsr.l ld_pinf # yes
- bra.b _L16_6x
- _L16_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L16_5x # no
- bsr.l src_qnan # yes
- bra.b _L16_6x
- _L16_5x:
- bsr.l scoshd # operand is a DENORM
- _L16_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _facoss_
- _facoss_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L17_2s
- bsr.l sacos # operand is a NORM
- bra.b _L17_6s
- _L17_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L17_3s # no
- bsr.l ld_ppi2 # yes
- bra.b _L17_6s
- _L17_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L17_4s # no
- bsr.l t_operr # yes
- bra.b _L17_6s
- _L17_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L17_5s # no
- bsr.l src_qnan # yes
- bra.b _L17_6s
- _L17_5s:
- bsr.l sacosd # operand is a DENORM
- _L17_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _facosd_
- _facosd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L17_2d
- bsr.l sacos # operand is a NORM
- bra.b _L17_6d
- _L17_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L17_3d # no
- bsr.l ld_ppi2 # yes
- bra.b _L17_6d
- _L17_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L17_4d # no
- bsr.l t_operr # yes
- bra.b _L17_6d
- _L17_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L17_5d # no
- bsr.l src_qnan # yes
- bra.b _L17_6d
- _L17_5d:
- bsr.l sacosd # operand is a DENORM
- _L17_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _facosx_
- _facosx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L17_2x
- bsr.l sacos # operand is a NORM
- bra.b _L17_6x
- _L17_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L17_3x # no
- bsr.l ld_ppi2 # yes
- bra.b _L17_6x
- _L17_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L17_4x # no
- bsr.l t_operr # yes
- bra.b _L17_6x
- _L17_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L17_5x # no
- bsr.l src_qnan # yes
- bra.b _L17_6x
- _L17_5x:
- bsr.l sacosd # operand is a DENORM
- _L17_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fgetexps_
- _fgetexps_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L18_2s
- bsr.l sgetexp # operand is a NORM
- bra.b _L18_6s
- _L18_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L18_3s # no
- bsr.l src_zero # yes
- bra.b _L18_6s
- _L18_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L18_4s # no
- bsr.l t_operr # yes
- bra.b _L18_6s
- _L18_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L18_5s # no
- bsr.l src_qnan # yes
- bra.b _L18_6s
- _L18_5s:
- bsr.l sgetexpd # operand is a DENORM
- _L18_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fgetexpd_
- _fgetexpd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L18_2d
- bsr.l sgetexp # operand is a NORM
- bra.b _L18_6d
- _L18_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L18_3d # no
- bsr.l src_zero # yes
- bra.b _L18_6d
- _L18_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L18_4d # no
- bsr.l t_operr # yes
- bra.b _L18_6d
- _L18_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L18_5d # no
- bsr.l src_qnan # yes
- bra.b _L18_6d
- _L18_5d:
- bsr.l sgetexpd # operand is a DENORM
- _L18_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fgetexpx_
- _fgetexpx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L18_2x
- bsr.l sgetexp # operand is a NORM
- bra.b _L18_6x
- _L18_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L18_3x # no
- bsr.l src_zero # yes
- bra.b _L18_6x
- _L18_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L18_4x # no
- bsr.l t_operr # yes
- bra.b _L18_6x
- _L18_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L18_5x # no
- bsr.l src_qnan # yes
- bra.b _L18_6x
- _L18_5x:
- bsr.l sgetexpd # operand is a DENORM
- _L18_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fgetmans_
- _fgetmans_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L19_2s
- bsr.l sgetman # operand is a NORM
- bra.b _L19_6s
- _L19_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L19_3s # no
- bsr.l src_zero # yes
- bra.b _L19_6s
- _L19_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L19_4s # no
- bsr.l t_operr # yes
- bra.b _L19_6s
- _L19_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L19_5s # no
- bsr.l src_qnan # yes
- bra.b _L19_6s
- _L19_5s:
- bsr.l sgetmand # operand is a DENORM
- _L19_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fgetmand_
- _fgetmand_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L19_2d
- bsr.l sgetman # operand is a NORM
- bra.b _L19_6d
- _L19_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L19_3d # no
- bsr.l src_zero # yes
- bra.b _L19_6d
- _L19_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L19_4d # no
- bsr.l t_operr # yes
- bra.b _L19_6d
- _L19_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L19_5d # no
- bsr.l src_qnan # yes
- bra.b _L19_6d
- _L19_5d:
- bsr.l sgetmand # operand is a DENORM
- _L19_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fgetmanx_
- _fgetmanx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L19_2x
- bsr.l sgetman # operand is a NORM
- bra.b _L19_6x
- _L19_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L19_3x # no
- bsr.l src_zero # yes
- bra.b _L19_6x
- _L19_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L19_4x # no
- bsr.l t_operr # yes
- bra.b _L19_6x
- _L19_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L19_5x # no
- bsr.l src_qnan # yes
- bra.b _L19_6x
- _L19_5x:
- bsr.l sgetmand # operand is a DENORM
- _L19_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # MONADIC TEMPLATE #
- #########################################################################
- global _fsincoss_
- _fsincoss_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L20_2s
- bsr.l ssincos # operand is a NORM
- bra.b _L20_6s
- _L20_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L20_3s # no
- bsr.l ssincosz # yes
- bra.b _L20_6s
- _L20_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L20_4s # no
- bsr.l ssincosi # yes
- bra.b _L20_6s
- _L20_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L20_5s # no
- bsr.l ssincosqnan # yes
- bra.b _L20_6s
- _L20_5s:
- bsr.l ssincosd # operand is a DENORM
- _L20_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x &0x03,-(%sp) # store off fp0/fp1
- fmovm.x (%sp)+,&0x40 # fp0 now in fp1
- fmovm.x (%sp)+,&0x80 # fp1 now in fp0
- unlk %a6
- rts
- global _fsincosd_
- _fsincosd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl input
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- mov.b %d1,STAG(%a6)
- tst.b %d1
- bne.b _L20_2d
- bsr.l ssincos # operand is a NORM
- bra.b _L20_6d
- _L20_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L20_3d # no
- bsr.l ssincosz # yes
- bra.b _L20_6d
- _L20_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L20_4d # no
- bsr.l ssincosi # yes
- bra.b _L20_6d
- _L20_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L20_5d # no
- bsr.l ssincosqnan # yes
- bra.b _L20_6d
- _L20_5d:
- bsr.l ssincosd # operand is a DENORM
- _L20_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x &0x03,-(%sp) # store off fp0/fp1
- fmovm.x (%sp)+,&0x40 # fp0 now in fp1
- fmovm.x (%sp)+,&0x80 # fp1 now in fp0
- unlk %a6
- rts
- global _fsincosx_
- _fsincosx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_SRC(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext input
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.b %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- tst.b %d1
- bne.b _L20_2x
- bsr.l ssincos # operand is a NORM
- bra.b _L20_6x
- _L20_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L20_3x # no
- bsr.l ssincosz # yes
- bra.b _L20_6x
- _L20_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L20_4x # no
- bsr.l ssincosi # yes
- bra.b _L20_6x
- _L20_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L20_5x # no
- bsr.l ssincosqnan # yes
- bra.b _L20_6x
- _L20_5x:
- bsr.l ssincosd # operand is a DENORM
- _L20_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x &0x03,-(%sp) # store off fp0/fp1
- fmovm.x (%sp)+,&0x40 # fp0 now in fp1
- fmovm.x (%sp)+,&0x80 # fp1 now in fp0
- unlk %a6
- rts
- #########################################################################
- # DYADIC TEMPLATE #
- #########################################################################
- global _frems_
- _frems_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl dst
- fmov.x %fp0,FP_DST(%a6)
- lea FP_DST(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,DTAG(%a6)
- fmov.s 0xc(%a6),%fp0 # load sgl src
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.l %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- lea FP_SRC(%a6),%a0 # pass ptr to src
- lea FP_DST(%a6),%a1 # pass ptr to dst
- tst.b %d1
- bne.b _L21_2s
- bsr.l srem_snorm # operand is a NORM
- bra.b _L21_6s
- _L21_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L21_3s # no
- bsr.l srem_szero # yes
- bra.b _L21_6s
- _L21_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L21_4s # no
- bsr.l srem_sinf # yes
- bra.b _L21_6s
- _L21_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L21_5s # no
- bsr.l sop_sqnan # yes
- bra.b _L21_6s
- _L21_5s:
- bsr.l srem_sdnrm # operand is a DENORM
- _L21_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fremd_
- _fremd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl dst
- fmov.x %fp0,FP_DST(%a6)
- lea FP_DST(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,DTAG(%a6)
- fmov.d 0x10(%a6),%fp0 # load dbl src
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.l %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- lea FP_SRC(%a6),%a0 # pass ptr to src
- lea FP_DST(%a6),%a1 # pass ptr to dst
- tst.b %d1
- bne.b _L21_2d
- bsr.l srem_snorm # operand is a NORM
- bra.b _L21_6d
- _L21_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L21_3d # no
- bsr.l srem_szero # yes
- bra.b _L21_6d
- _L21_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L21_4d # no
- bsr.l srem_sinf # yes
- bra.b _L21_6d
- _L21_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L21_5d # no
- bsr.l sop_sqnan # yes
- bra.b _L21_6d
- _L21_5d:
- bsr.l srem_sdnrm # operand is a DENORM
- _L21_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fremx_
- _fremx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- lea FP_DST(%a6),%a0
- mov.l 0x8+0x0(%a6),0x0(%a0) # load ext dst
- mov.l 0x8+0x4(%a6),0x4(%a0)
- mov.l 0x8+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,DTAG(%a6)
- lea FP_SRC(%a6),%a0
- mov.l 0x14+0x0(%a6),0x0(%a0) # load ext src
- mov.l 0x14+0x4(%a6),0x4(%a0)
- mov.l 0x14+0x8(%a6),0x8(%a0)
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.l %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- lea FP_SRC(%a6),%a0 # pass ptr to src
- lea FP_DST(%a6),%a1 # pass ptr to dst
- tst.b %d1
- bne.b _L21_2x
- bsr.l srem_snorm # operand is a NORM
- bra.b _L21_6x
- _L21_2x:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L21_3x # no
- bsr.l srem_szero # yes
- bra.b _L21_6x
- _L21_3x:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L21_4x # no
- bsr.l srem_sinf # yes
- bra.b _L21_6x
- _L21_4x:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L21_5x # no
- bsr.l sop_sqnan # yes
- bra.b _L21_6x
- _L21_5x:
- bsr.l srem_sdnrm # operand is a DENORM
- _L21_6x:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- #########################################################################
- # DYADIC TEMPLATE #
- #########################################################################
- global _fmods_
- _fmods_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.s 0x8(%a6),%fp0 # load sgl dst
- fmov.x %fp0,FP_DST(%a6)
- lea FP_DST(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,DTAG(%a6)
- fmov.s 0xc(%a6),%fp0 # load sgl src
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.l %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- lea FP_SRC(%a6),%a0 # pass ptr to src
- lea FP_DST(%a6),%a1 # pass ptr to dst
- tst.b %d1
- bne.b _L22_2s
- bsr.l smod_snorm # operand is a NORM
- bra.b _L22_6s
- _L22_2s:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L22_3s # no
- bsr.l smod_szero # yes
- bra.b _L22_6s
- _L22_3s:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L22_4s # no
- bsr.l smod_sinf # yes
- bra.b _L22_6s
- _L22_4s:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L22_5s # no
- bsr.l sop_sqnan # yes
- bra.b _L22_6s
- _L22_5s:
- bsr.l smod_sdnrm # operand is a DENORM
- _L22_6s:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fmodd_
- _fmodd_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
- fmovm.x &0xc0,EXC_FP0(%a6) # save fp0/fp1
- fmov.l &0x0,%fpcr # zero FPCR
- #
- # copy, convert, and tag input argument
- #
- fmov.d 0x8(%a6),%fp0 # load dbl dst
- fmov.x %fp0,FP_DST(%a6)
- lea FP_DST(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,DTAG(%a6)
- fmov.d 0x10(%a6),%fp0 # load dbl src
- fmov.x %fp0,FP_SRC(%a6)
- lea FP_SRC(%a6),%a0
- bsr.l tag # fetch operand type
- mov.b %d0,STAG(%a6)
- mov.l %d0,%d1
- andi.l &0x00ff00ff,USER_FPSR(%a6)
- clr.l %d0
- mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
- lea FP_SRC(%a6),%a0 # pass ptr to src
- lea FP_DST(%a6),%a1 # pass ptr to dst
- tst.b %d1
- bne.b _L22_2d
- bsr.l smod_snorm # operand is a NORM
- bra.b _L22_6d
- _L22_2d:
- cmpi.b %d1,&ZERO # is operand a ZERO?
- bne.b _L22_3d # no
- bsr.l smod_szero # yes
- bra.b _L22_6d
- _L22_3d:
- cmpi.b %d1,&INF # is operand an INF?
- bne.b _L22_4d # no
- bsr.l smod_sinf # yes
- bra.b _L22_6d
- _L22_4d:
- cmpi.b %d1,&QNAN # is operand a QNAN?
- bne.b _L22_5d # no
- bsr.l sop_sqnan # yes
- bra.b _L22_6d
- _L22_5d:
- bsr.l smod_sdnrm # operand is a DENORM
- _L22_6d:
- #
- # Result is now in FP0
- #
- movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
- fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
- fmovm.x EXC_FP1(%a6),&0x40 # restore fp1
- unlk %a6
- rts
- global _fmodx_
- _fmodx_:
- link %a6,&-LOCAL_SIZE
- movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
- fmovm.l