summaryrefslogtreecommitdiff
path: root/sys/arch/m68k/fpsp/smovecr.sa
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /sys/arch/m68k/fpsp/smovecr.sa
initial import of NetBSD tree
Diffstat (limited to 'sys/arch/m68k/fpsp/smovecr.sa')
-rw-r--r--sys/arch/m68k/fpsp/smovecr.sa187
1 files changed, 187 insertions, 0 deletions
diff --git a/sys/arch/m68k/fpsp/smovecr.sa b/sys/arch/m68k/fpsp/smovecr.sa
new file mode 100644
index 00000000000..9e13b64b1c4
--- /dev/null
+++ b/sys/arch/m68k/fpsp/smovecr.sa
@@ -0,0 +1,187 @@
+* $NetBSD: smovecr.sa,v 1.2 1994/10/26 07:49:57 cgd Exp $
+
+* MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
+* M68000 Hi-Performance Microprocessor Division
+* M68040 Software Package
+*
+* M68040 Software Package Copyright (c) 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.
+
+*
+* smovecr.sa 3.1 12/10/90
+*
+* The entry point sMOVECR returns the constant at the
+* offset given in the instruction field.
+*
+* Input: An offset in the instruction word.
+*
+* Output: The constant rounded to the user's rounding
+* mode unchecked for overflow.
+*
+* Modified: fp0.
+*
+
+SMOVECR IDNT 2,1 Motorola 040 Floating Point Software Package
+
+ section 8
+
+ include fpsp.h
+
+ xref nrm_set
+ xref round
+ xref PIRN
+ xref PIRZRM
+ xref PIRP
+ xref SMALRN
+ xref SMALRZRM
+ xref SMALRP
+ xref BIGRN
+ xref BIGRZRM
+ xref BIGRP
+
+FZERO dc.l 00000000
+*
+* FMOVECR
+*
+ xdef smovcr
+smovcr:
+ bfextu CMDREG1B(a6){9:7},d0 ;get offset
+ bfextu USER_FPCR(a6){26:2},d1 ;get rmode
+*
+* check range of offset
+*
+ tst.b d0 ;if zero, offset is to pi
+ beq.b PI_TBL ;it is pi
+ cmpi.b #$0a,d0 ;check range $01 - $0a
+ ble.b Z_VAL ;if in this range, return zero
+ cmpi.b #$0e,d0 ;check range $0b - $0e
+ ble.b SM_TBL ;valid constants in this range
+ cmpi.b #$2f,d0 ;check range $10 - $2f
+ ble.b Z_VAL ;if in this range, return zero
+ cmpi.b #$3f,d0 ;check range $30 - $3f
+ ble BG_TBL ;valid constants in this range
+Z_VAL:
+ fmove.s FZERO,fp0
+ rts
+PI_TBL:
+ tst.b d1 ;offset is zero, check for rmode
+ beq.b PI_RN ;if zero, rn mode
+ cmpi.b #$3,d1 ;check for rp
+ beq.b PI_RP ;if 3, rp mode
+PI_RZRM:
+ lea.l PIRZRM,a0 ;rmode is rz or rm, load PIRZRM in a0
+ bra set_finx
+PI_RN:
+ lea.l PIRN,a0 ;rmode is rn, load PIRN in a0
+ bra set_finx
+PI_RP:
+ lea.l PIRP,a0 ;rmode is rp, load PIRP in a0
+ bra set_finx
+SM_TBL:
+ subi.l #$b,d0 ;make offset in 0 - 4 range
+ tst.b d1 ;check for rmode
+ beq.b SM_RN ;if zero, rn mode
+ cmpi.b #$3,d1 ;check for rp
+ beq.b SM_RP ;if 3, rp mode
+SM_RZRM:
+ lea.l SMALRZRM,a0 ;rmode is rz or rm, load SMRZRM in a0
+ cmpi.b #$2,d0 ;check if result is inex
+ ble set_finx ;if 0 - 2, it is inexact
+ bra no_finx ;if 3, it is exact
+SM_RN:
+ lea.l SMALRN,a0 ;rmode is rn, load SMRN in a0
+ cmpi.b #$2,d0 ;check if result is inex
+ ble set_finx ;if 0 - 2, it is inexact
+ bra no_finx ;if 3, it is exact
+SM_RP:
+ lea.l SMALRP,a0 ;rmode is rp, load SMRP in a0
+ cmpi.b #$2,d0 ;check if result is inex
+ ble set_finx ;if 0 - 2, it is inexact
+ bra no_finx ;if 3, it is exact
+BG_TBL:
+ subi.l #$30,d0 ;make offset in 0 - f range
+ tst.b d1 ;check for rmode
+ beq.b BG_RN ;if zero, rn mode
+ cmpi.b #$3,d1 ;check for rp
+ beq.b BG_RP ;if 3, rp mode
+BG_RZRM:
+ lea.l BIGRZRM,a0 ;rmode is rz or rm, load BGRZRM in a0
+ cmpi.b #$1,d0 ;check if result is inex
+ ble set_finx ;if 0 - 1, it is inexact
+ cmpi.b #$7,d0 ;second check
+ ble no_finx ;if 0 - 7, it is exact
+ bra set_finx ;if 8 - f, it is inexact
+BG_RN:
+ lea.l BIGRN,a0 ;rmode is rn, load BGRN in a0
+ cmpi.b #$1,d0 ;check if result is inex
+ ble set_finx ;if 0 - 1, it is inexact
+ cmpi.b #$7,d0 ;second check
+ ble no_finx ;if 0 - 7, it is exact
+ bra set_finx ;if 8 - f, it is inexact
+BG_RP:
+ lea.l BIGRP,a0 ;rmode is rp, load SMRP in a0
+ cmpi.b #$1,d0 ;check if result is inex
+ ble set_finx ;if 0 - 1, it is inexact
+ cmpi.b #$7,d0 ;second check
+ ble no_finx ;if 0 - 7, it is exact
+* bra set_finx ;if 8 - f, it is inexact
+set_finx:
+ or.l #inx2a_mask,USER_FPSR(a6) ;set inex2/ainex
+no_finx:
+ mulu.l #12,d0 ;use offset to point into tables
+ move.l d1,L_SCR1(a6) ;load mode for round call
+ bfextu USER_FPCR(a6){24:2},d1 ;get precision
+ tst.l d1 ;check if extended precision
+*
+* Precision is extended
+*
+ bne.b not_ext ;if extended, do not call round
+ fmovem.x (a0,d0),fp0 ;return result in fp0
+ rts
+*
+* Precision is single or double
+*
+not_ext:
+ swap d1 ;rnd prec in upper word of d1
+ add.l L_SCR1(a6),d1 ;merge rmode in low word of d1
+ move.l (a0,d0),FP_SCR1(a6) ;load first word to temp storage
+ move.l 4(a0,d0),FP_SCR1+4(a6) ;load second word
+ move.l 8(a0,d0),FP_SCR1+8(a6) ;load third word
+ clr.l d0 ;clear g,r,s
+ lea FP_SCR1(a6),a0
+ btst.b #sign_bit,LOCAL_EX(a0)
+ sne LOCAL_SGN(a0) ;convert to internal ext. format
+
+ bsr round ;go round the mantissa
+
+ bfclr LOCAL_SGN(a0){0:8} ;convert back to IEEE ext format
+ beq.b fin_fcr
+ bset.b #sign_bit,LOCAL_EX(a0)
+fin_fcr:
+ fmovem.x (a0),fp0
+ rts
+
+ end