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

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

1.1     ! nbrk        1: *      $OpenBSD: smovecr.sa,v 1.2 1996/05/29 21:05:40 niklas Exp $
        !             2: *      $NetBSD: smovecr.sa,v 1.2 1994/10/26 07:49:57 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: *      smovecr.sa 3.1 12/10/90
        !            36: *
        !            37: *      The entry point sMOVECR returns the constant at the
        !            38: *      offset given in the instruction field.
        !            39: *
        !            40: *      Input: An offset in the instruction word.
        !            41: *
        !            42: *      Output: The constant rounded to the user's rounding
        !            43: *              mode unchecked for overflow.
        !            44: *
        !            45: *      Modified: fp0.
        !            46: *
        !            47:
        !            48: SMOVECR        IDNT    2,1 Motorola 040 Floating Point Software Package
        !            49:
        !            50:        section 8
        !            51:
        !            52:        include fpsp.h
        !            53:
        !            54:        xref    nrm_set
        !            55:        xref    round
        !            56:        xref    PIRN
        !            57:        xref    PIRZRM
        !            58:        xref    PIRP
        !            59:        xref    SMALRN
        !            60:        xref    SMALRZRM
        !            61:        xref    SMALRP
        !            62:        xref    BIGRN
        !            63:        xref    BIGRZRM
        !            64:        xref    BIGRP
        !            65:
        !            66: FZERO  dc.l    00000000
        !            67: *
        !            68: *      FMOVECR
        !            69: *
        !            70:        xdef    smovcr
        !            71: smovcr:
        !            72:        bfextu  CMDREG1B(a6){9:7},d0 ;get offset
        !            73:        bfextu  USER_FPCR(a6){26:2},d1 ;get rmode
        !            74: *
        !            75: * check range of offset
        !            76: *
        !            77:        tst.b   d0              ;if zero, offset is to pi
        !            78:        beq.b   PI_TBL          ;it is pi
        !            79:        cmpi.b  #$0a,d0         ;check range $01 - $0a
        !            80:        ble.b   Z_VAL           ;if in this range, return zero
        !            81:        cmpi.b  #$0e,d0         ;check range $0b - $0e
        !            82:        ble.b   SM_TBL          ;valid constants in this range
        !            83:        cmpi.b  #$2f,d0         ;check range $10 - $2f
        !            84:        ble.b   Z_VAL           ;if in this range, return zero
        !            85:        cmpi.b  #$3f,d0         ;check range $30 - $3f
        !            86:        ble     BG_TBL          ;valid constants in this range
        !            87: Z_VAL:
        !            88:        fmove.s FZERO,fp0
        !            89:        rts
        !            90: PI_TBL:
        !            91:        tst.b   d1              ;offset is zero, check for rmode
        !            92:        beq.b   PI_RN           ;if zero, rn mode
        !            93:        cmpi.b  #$3,d1          ;check for rp
        !            94:        beq.b   PI_RP           ;if 3, rp mode
        !            95: PI_RZRM:
        !            96:        lea.l   PIRZRM,a0       ;rmode is rz or rm, load PIRZRM in a0
        !            97:        bra     set_finx
        !            98: PI_RN:
        !            99:        lea.l   PIRN,a0         ;rmode is rn, load PIRN in a0
        !           100:        bra     set_finx
        !           101: PI_RP:
        !           102:        lea.l   PIRP,a0         ;rmode is rp, load PIRP in a0
        !           103:        bra     set_finx
        !           104: SM_TBL:
        !           105:        subi.l  #$b,d0          ;make offset in 0 - 4 range
        !           106:        tst.b   d1              ;check for rmode
        !           107:        beq.b   SM_RN           ;if zero, rn mode
        !           108:        cmpi.b  #$3,d1          ;check for rp
        !           109:        beq.b   SM_RP           ;if 3, rp mode
        !           110: SM_RZRM:
        !           111:        lea.l   SMALRZRM,a0     ;rmode is rz or rm, load SMRZRM in a0
        !           112:        cmpi.b  #$2,d0          ;check if result is inex
        !           113:        ble     set_finx        ;if 0 - 2, it is inexact
        !           114:        bra     no_finx         ;if 3, it is exact
        !           115: SM_RN:
        !           116:        lea.l   SMALRN,a0       ;rmode is rn, load SMRN in a0
        !           117:        cmpi.b  #$2,d0          ;check if result is inex
        !           118:        ble     set_finx        ;if 0 - 2, it is inexact
        !           119:        bra     no_finx         ;if 3, it is exact
        !           120: SM_RP:
        !           121:        lea.l   SMALRP,a0       ;rmode is rp, load SMRP in a0
        !           122:        cmpi.b  #$2,d0          ;check if result is inex
        !           123:        ble     set_finx        ;if 0 - 2, it is inexact
        !           124:        bra     no_finx         ;if 3, it is exact
        !           125: BG_TBL:
        !           126:        subi.l  #$30,d0         ;make offset in 0 - f range
        !           127:        tst.b   d1              ;check for rmode
        !           128:        beq.b   BG_RN           ;if zero, rn mode
        !           129:        cmpi.b  #$3,d1          ;check for rp
        !           130:        beq.b   BG_RP           ;if 3, rp mode
        !           131: BG_RZRM:
        !           132:        lea.l   BIGRZRM,a0      ;rmode is rz or rm, load BGRZRM in a0
        !           133:        cmpi.b  #$1,d0          ;check if result is inex
        !           134:        ble     set_finx        ;if 0 - 1, it is inexact
        !           135:        cmpi.b  #$7,d0          ;second check
        !           136:        ble     no_finx         ;if 0 - 7, it is exact
        !           137:        bra     set_finx        ;if 8 - f, it is inexact
        !           138: BG_RN:
        !           139:        lea.l   BIGRN,a0        ;rmode is rn, load BGRN in a0
        !           140:        cmpi.b  #$1,d0          ;check if result is inex
        !           141:        ble     set_finx        ;if 0 - 1, it is inexact
        !           142:        cmpi.b  #$7,d0          ;second check
        !           143:        ble     no_finx         ;if 0 - 7, it is exact
        !           144:        bra     set_finx        ;if 8 - f, it is inexact
        !           145: BG_RP:
        !           146:        lea.l   BIGRP,a0        ;rmode is rp, load SMRP in a0
        !           147:        cmpi.b  #$1,d0          ;check if result is inex
        !           148:        ble     set_finx        ;if 0 - 1, it is inexact
        !           149:        cmpi.b  #$7,d0          ;second check
        !           150:        ble     no_finx         ;if 0 - 7, it is exact
        !           151: *      bra     set_finx        ;if 8 - f, it is inexact
        !           152: set_finx:
        !           153:        or.l    #inx2a_mask,USER_FPSR(a6) ;set inex2/ainex
        !           154: no_finx:
        !           155:        mulu.l  #12,d0                  ;use offset to point into tables
        !           156:        move.l  d1,L_SCR1(a6)           ;load mode for round call
        !           157:        bfextu  USER_FPCR(a6){24:2},d1  ;get precision
        !           158:        tst.l   d1                      ;check if extended precision
        !           159: *
        !           160: * Precision is extended
        !           161: *
        !           162:        bne.b   not_ext                 ;if extended, do not call round
        !           163:        fmovem.x (a0,d0),fp0            ;return result in fp0
        !           164:        rts
        !           165: *
        !           166: * Precision is single or double
        !           167: *
        !           168: not_ext:
        !           169:        swap    d1                      ;rnd prec in upper word of d1
        !           170:        add.l   L_SCR1(a6),d1           ;merge rmode in low word of d1
        !           171:        move.l  (a0,d0),FP_SCR1(a6)     ;load first word to temp storage
        !           172:        move.l  4(a0,d0),FP_SCR1+4(a6)  ;load second word
        !           173:        move.l  8(a0,d0),FP_SCR1+8(a6)  ;load third word
        !           174:        clr.l   d0                      ;clear g,r,s
        !           175:        lea     FP_SCR1(a6),a0
        !           176:        btst.b  #sign_bit,LOCAL_EX(a0)
        !           177:        sne     LOCAL_SGN(a0)           ;convert to internal ext. format
        !           178:
        !           179:        bsr     round                   ;go round the mantissa
        !           180:
        !           181:        bfclr   LOCAL_SGN(a0){0:8}      ;convert back to IEEE ext format
        !           182:        beq.b   fin_fcr
        !           183:        bset.b  #sign_bit,LOCAL_EX(a0)
        !           184: fin_fcr:
        !           185:        fmovem.x (a0),fp0
        !           186:        rts
        !           187:
        !           188:        end

CVSweb