[BACK]Return to l_support.sa CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / fpsp

Annotation of sys/arch/m68k/fpsp/l_support.sa, Revision 1.1

1.1     ! nbrk        1: *      $OpenBSD: l_support.sa,v 1.2 1996/05/29 21:05:31 niklas Exp $
        !             2: *      $NetBSD: l_support.sa,v 1.3 1994/10/26 07:49:16 cgd Exp $
        !             3:
        !             4: *      MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
        !             5: *      M68000 Hi-Performance Microprocessor Division
        !             6: *      M68040 Software Package
        !             7: *
        !             8: *      M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
        !             9: *      All rights reserved.
        !            10: *
        !            11: *      THE SOFTWARE is provided on an "AS IS" basis and without warranty.
        !            12: *      To the maximum extent permitted by applicable law,
        !            13: *      MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
        !            14: *      INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
        !            15: *      PARTICULAR PURPOSE and any warranty against infringement with
        !            16: *      regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
        !            17: *      and any accompanying written materials.
        !            18: *
        !            19: *      To the maximum extent permitted by applicable law,
        !            20: *      IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
        !            21: *      (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
        !            22: *      PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
        !            23: *      OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
        !            24: *      SOFTWARE.  Motorola assumes no responsibility for the maintenance
        !            25: *      and support of the SOFTWARE.
        !            26: *
        !            27: *      You are hereby granted a copyright license to use, modify, and
        !            28: *      distribute the SOFTWARE so long as this entire notice is retained
        !            29: *      without alteration in any modified and/or redistributed versions,
        !            30: *      and that such modified versions are clearly identified as such.
        !            31: *      No licenses are granted by implication, estoppel or otherwise
        !            32: *      under any patents or trademarks of Motorola, Inc.
        !            33:
        !            34: *
        !            35: *      l_support.sa 1.2 5/1/91
        !            36: *
        !            37:
        !            38: L_SUPPORT    IDNT    2,1 Motorola 040 Floating Point Software Package
        !            39:
        !            40:        section    8
        !            41:
        !            42: mns_one  dc.l $bfff0000,$80000000,$00000000
        !            43: pls_one  dc.l $3fff0000,$80000000,$00000000
        !            44: pls_inf  dc.l $7fff0000,$00000000,$00000000
        !            45: pls_huge dc.l $7ffe0000,$ffffffff,$ffffffff
        !            46: mns_huge dc.l $fffe0000,$ffffffff,$ffffffff
        !            47: pls_tiny dc.l $00000000,$80000000,$00000000
        !            48: mns_tiny dc.l $80000000,$80000000,$00000000
        !            49: small    dc.l $20000000,$80000000,$00000000
        !            50: pls_zero dc.l $00000000,$00000000,$00000000
        !            51:
        !            52:        include l_fpsp.h
        !            53:
        !            54: *
        !            55: *      tag --- determine the type of an extended precision operand
        !            56: *
        !            57: *      The tag values returned match the way the 68040 would have
        !            58: *      tagged them.
        !            59: *
        !            60: *      Input:  a0 points to operand
        !            61: *
        !            62: *      Output  d0.b    = $00 norm
        !            63: *                        $20 zero
        !            64: *                        $40 inf
        !            65: *                        $60 nan
        !            66: *                        $80 denorm
        !            67: *              All other registers are unchanged
        !            68: *
        !            69:        xdef    tag
        !            70: tag:
        !            71:        move.w  LOCAL_EX(a0),d0
        !            72:        andi.w  #$7fff,d0
        !            73:        beq.b   chk_zro
        !            74:        cmpi.w  #$7fff,d0
        !            75:        beq.b   chk_inf
        !            76: tag_nrm:
        !            77:        clr.b   d0
        !            78:        rts
        !            79: tag_nan:
        !            80:        move.b  #$60,d0
        !            81:        rts
        !            82: tag_dnrm:
        !            83:        move.b  #$80,d0
        !            84:        rts
        !            85: chk_zro:
        !            86:        btst.b  #7,LOCAL_HI(a0) # check if J-bit is set
        !            87:        bne.b   tag_nrm
        !            88:        tst.l   LOCAL_HI(a0)
        !            89:        bne.b   tag_dnrm
        !            90:        tst.l   LOCAL_LO(a0)
        !            91:        bne.b   tag_dnrm
        !            92: tag_zero:
        !            93:        move.b  #$20,d0
        !            94:        rts
        !            95: chk_inf:
        !            96:        tst.l   LOCAL_HI(a0)
        !            97:        bne.b   tag_nan
        !            98:        tst.l   LOCAL_LO(a0)
        !            99:        bne.b   tag_nan
        !           100: tag_inf:
        !           101:        move.b  #$40,d0
        !           102:        rts
        !           103:
        !           104: *
        !           105: *      t_dz, t_dz2 --- divide by zero exception
        !           106: *
        !           107: * t_dz2 is used by monadic functions such as flogn (from do_func).
        !           108: * t_dz is used by monadic functions such as satanh (from the
        !           109: * transcendental function).
        !           110: *
        !           111:        xdef    t_dz2
        !           112: t_dz2:
        !           113:        fmovem.x        mns_one,fp0
        !           114:        fmove.l d1,fpcr
        !           115:        fdiv.x          pls_zero,fp0
        !           116:        rts
        !           117:
        !           118:        xdef    t_dz
        !           119: t_dz:
        !           120:        btst.b  #sign_bit,ETEMP_EX(a6)  ;check sign for neg or pos
        !           121:        beq.b   p_inf                   ;branch if pos sign
        !           122: m_inf:
        !           123:        fmovem.x mns_one,fp0
        !           124:        fmove.l d1,fpcr
        !           125:        fdiv.x          pls_zero,fp0
        !           126:        rts
        !           127: p_inf:
        !           128:        fmovem.x pls_one,fp0
        !           129:        fmove.l d1,fpcr
        !           130:        fdiv.x          pls_zero,fp0
        !           131:        rts
        !           132: *
        !           133: *      t_operr --- Operand Error exception
        !           134: *
        !           135:        xdef    t_operr
        !           136: t_operr:
        !           137:        fmovem.x        pls_inf,fp0
        !           138:        fmove.l d1,fpcr
        !           139:        fmul.x          pls_zero,fp0
        !           140:        rts
        !           141:
        !           142: *
        !           143: *      t_unfl --- UNFL exception
        !           144: *
        !           145:        xdef    t_unfl
        !           146: t_unfl:
        !           147:        btst.b  #sign_bit,ETEMP(a6)
        !           148:        beq.b   unf_pos
        !           149: unf_neg:
        !           150:        fmovem.x        mns_tiny,fp0
        !           151:        fmove.l d1,fpcr
        !           152:        fmul.x  pls_tiny,fp0
        !           153:        rts
        !           154:
        !           155: unf_pos:
        !           156:        fmovem.x        pls_tiny,fp0
        !           157:        fmove.l d1,fpcr
        !           158:        fmul.x  fp0,fp0
        !           159:        rts
        !           160: *
        !           161: *      t_ovfl --- OVFL exception
        !           162: *
        !           163: *      t_ovfl is called as an exit for monadic functions.  t_ovfl2
        !           164: *      is for dyadic exits.
        !           165: *
        !           166:        xdef            t_ovfl
        !           167: t_ovfl:
        !           168:        xdef            t_ovfl2
        !           169:        move.l          d1,USER_FPCR(a6)        user's control register
        !           170:        move.l          #ovfinx_mask,d0
        !           171:        bra.b           t_work
        !           172: t_ovfl2:
        !           173:        move.l          #ovfl_inx_mask,d0
        !           174: t_work:
        !           175:        btst.b          #sign_bit,ETEMP(a6)
        !           176:        beq.b           ovf_pos
        !           177: ovf_neg:
        !           178:        fmovem.x        mns_huge,fp0
        !           179:        fmove.l         USER_FPCR(a6),fpcr
        !           180:        fmul.x          pls_huge,fp0
        !           181:        fmove.l         fpsr,d1
        !           182:        or.l            d1,d0
        !           183:        fmove.l         d0,fpsr
        !           184:        rts
        !           185: ovf_pos:
        !           186:        fmovem.x        pls_huge,fp0
        !           187:        fmove.l         USER_FPCR(a6),fpcr
        !           188:        fmul.x          pls_huge,fp0
        !           189:        fmove.l         fpsr,d1
        !           190:        or.l            d1,d0
        !           191:        fmove.l         d0,fpsr
        !           192:        rts
        !           193: *
        !           194: *      t_inx2 --- INEX2 exception (correct fpcr is in USER_FPCR(a6))
        !           195: *
        !           196:        xdef    t_inx2
        !           197: t_inx2:
        !           198:        fmove.l         fpsr,USER_FPSR(a6)      capture incoming fpsr
        !           199:        fmove.l         USER_FPCR(a6),fpcr
        !           200: *
        !           201: * create an inex2 exception by adding two numbers with very different exponents
        !           202: * do the add in fp1 so as to not disturb the result sitting in fp0
        !           203: *
        !           204:        fmove.x         pls_one,fp1
        !           205:        fadd.x          small,fp1
        !           206: *
        !           207:        or.l    #inx2a_mask,USER_FPSR(a6) ;set INEX2, AINEX
        !           208:        fmove.l USER_FPSR(a6),fpsr
        !           209:        rts
        !           210: *
        !           211: *      t_frcinx --- Force Inex2 (for monadic functions)
        !           212: *
        !           213:        xdef    t_frcinx
        !           214: t_frcinx:
        !           215:        fmove.l         fpsr,USER_FPSR(a6)      capture incoming fpsr
        !           216:        fmove.l         d1,fpcr
        !           217: *
        !           218: * create an inex2 exception by adding two numbers with very different exponents
        !           219: * do the add in fp1 so as to not disturb the result sitting in fp0
        !           220: *
        !           221:        fmove.x         pls_one,fp1
        !           222:        fadd.x          small,fp1
        !           223: *
        !           224:        or.l    #inx2a_mask,USER_FPSR(a6) ;set INEX2, AINEX
        !           225:        btst.b  #unfl_bit,FPSR_EXCEPT(a6) ;test for unfl bit set
        !           226:        beq.b   no_uacc1                ;if clear, do not set aunfl
        !           227:        bset.b  #aunfl_bit,FPSR_AEXCEPT(a6)
        !           228: no_uacc1:
        !           229:        fmove.l USER_FPSR(a6),fpsr
        !           230:        rts
        !           231: *
        !           232: *      dst_nan --- force result when destination is a NaN
        !           233: *
        !           234:        xdef    dst_nan
        !           235: dst_nan:
        !           236:        fmove.l USER_FPCR(a6),fpcr
        !           237:        fmove.x FPTEMP(a6),fp0
        !           238:        rts
        !           239:
        !           240: *
        !           241: *      src_nan --- force result when source is a NaN
        !           242: *
        !           243:        xdef    src_nan
        !           244: src_nan:
        !           245:        fmove.l USER_FPCR(a6),fpcr
        !           246:        fmove.x ETEMP(a6),fp0
        !           247:        rts
        !           248: *
        !           249: *      mon_nan --- force result when source is a NaN (monadic version)
        !           250: *
        !           251: *      This is the same as src_nan except that the user's fpcr comes
        !           252: *      in via d1, not USER_FPCR(a6).
        !           253: *
        !           254:        xdef    mon_nan
        !           255: mon_nan:
        !           256:        fmove.l d1,fpcr
        !           257:        fmove.x ETEMP(a6),fp0
        !           258:        rts
        !           259: *
        !           260: *      t_extdnrm, t_resdnrm --- generate results for denorm inputs
        !           261: *
        !           262: *      For all functions that have a denormalized input and that f(x)=x,
        !           263: *      this is the entry point.
        !           264: *
        !           265:        xdef    t_extdnrm
        !           266: t_extdnrm:
        !           267:        fmove.l d1,fpcr
        !           268:        fmove.x LOCAL_EX(a0),fp0
        !           269:        fmove.l         fpsr,d0
        !           270:        or.l            #unfinx_mask,d0
        !           271:        fmove.l         d0,fpsr
        !           272:        rts
        !           273:
        !           274:        xdef    t_resdnrm
        !           275: t_resdnrm:
        !           276:        fmove.l USER_FPCR(a6),fpcr
        !           277:        fmove.x LOCAL_EX(a0),fp0
        !           278:        fmove.l         fpsr,d0
        !           279:        or.l            #unfl_mask,d0
        !           280:        fmove.l         d0,fpsr
        !           281:        rts
        !           282: *
        !           283: *
        !           284: *
        !           285:        xdef    t_avoid_unsupp
        !           286: t_avoid_unsupp:
        !           287:        fmove.x fp0,fp0
        !           288:        rts
        !           289:
        !           290:        xdef    sto_cos
        !           291: sto_cos:
        !           292:        fmovem.x LOCAL_EX(a0),fp1
        !           293:        rts
        !           294: *
        !           295: *      Native instruction support
        !           296: *
        !           297: *      Some systems may need entry points even for 68040 native
        !           298: *      instructions.  These routines are provided for
        !           299: *      convenience.
        !           300: *
        !           301:        xdef    sadd
        !           302: sadd:
        !           303:        fmovem.x        FPTEMP(a6),fp0
        !           304:        fmove.l USER_FPCR(a6),fpcr
        !           305:        fadd.x  ETEMP(a6),fp0
        !           306:        rts
        !           307:
        !           308:        xdef    ssub
        !           309: ssub:
        !           310:        fmovem.x        FPTEMP(a6),fp0
        !           311:        fmove.l USER_FPCR(a6),fpcr
        !           312:        fsub.x  ETEMP(a6),fp0
        !           313:        rts
        !           314:
        !           315:        xdef    smul
        !           316: smul:
        !           317:        fmovem.x        FPTEMP(a6),fp0
        !           318:        fmove.l USER_FPCR(a6),fpcr
        !           319:        fmul.x  ETEMP(a6),fp0
        !           320:        rts
        !           321:
        !           322:        xdef    sdiv
        !           323: sdiv:
        !           324:        fmovem.x        FPTEMP(a6),fp0
        !           325:        fmove.l USER_FPCR(a6),fpcr
        !           326:        fdiv.x  ETEMP(a6),fp0
        !           327:        rts
        !           328:
        !           329:        xdef    sabs
        !           330: sabs:
        !           331:        fmovem.x        ETEMP(a6),fp0
        !           332:        fmove.l d1,fpcr
        !           333:        fabs.x  fp0
        !           334:        rts
        !           335:
        !           336:        xdef    sneg
        !           337: sneg:
        !           338:        fmovem.x        ETEMP(a6),fp0
        !           339:        fmove.l d1,fpcr
        !           340:        fneg.x  fp0
        !           341:        rts
        !           342:
        !           343:        xdef    ssqrt
        !           344: ssqrt:
        !           345:        fmovem.x        ETEMP(a6),fp0
        !           346:        fmove.l d1,fpcr
        !           347:        fsqrt.x fp0
        !           348:        rts
        !           349:
        !           350: *
        !           351: *      l_sint,l_sintrz,l_sintd --- special wrapper for fint and fintrz
        !           352: *
        !           353: *      On entry, move the user's FPCR to USER_FPCR.
        !           354: *
        !           355: *      On return from, we need to pickup the INEX2/AINEX bits
        !           356: *      that are in USER_FPSR.
        !           357: *
        !           358:        xref    sint
        !           359:        xref    sintrz
        !           360:        xref    sintd
        !           361:
        !           362:        xdef    l_sint
        !           363: l_sint:
        !           364:        move.l  d1,USER_FPCR(a6)
        !           365:        jsr     sint
        !           366:        fmove.l fpsr,d0
        !           367:        or.l    USER_FPSR(a6),d0
        !           368:        fmove.l d0,fpsr
        !           369:        rts
        !           370:
        !           371:        xdef    l_sintrz
        !           372: l_sintrz:
        !           373:        move.l  d1,USER_FPCR(a6)
        !           374:        jsr     sintrz
        !           375:        fmove.l fpsr,d0
        !           376:        or.l    USER_FPSR(a6),d0
        !           377:        fmove.l d0,fpsr
        !           378:        rts
        !           379:
        !           380:        xdef    l_sintd
        !           381: l_sintd:
        !           382:        move.l  d1,USER_FPCR(a6)
        !           383:        jsr     sintd
        !           384:        fmove.l fpsr,d0
        !           385:        or.l    USER_FPSR(a6),d0
        !           386:        fmove.l d0,fpsr
        !           387:        rts
        !           388:
        !           389:        end

CVSweb