[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

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