mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 04:31:30 +00:00
1153 lines
37 KiB
Plaintext
1153 lines
37 KiB
Plaintext
;
|
|
; File: DoFunc.a
|
|
;
|
|
; Contains: Code to handle unimplemented instruction execution on 040s
|
|
;
|
|
; Originally Written by: Motorola Inc.
|
|
; Adapted to Apple/MPW: Jon Okada
|
|
;
|
|
; Copyright: © 1990-1993 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; This file is used in these builds: Mac32
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM2> 2/3/93 CSS Update from Horror:
|
|
; <H2> 10/5/92 BG (for Jon Okada) Fixing a bug in the Motorola FPSP found by Jon
|
|
; having to do with accidently clearing the quotient field in the
|
|
; USER_FPSR.
|
|
; <4> 5/24/91 BG Corrected table "pmodt" (5 entries lacked offset entries).
|
|
; <3> 4/13/91 BG Changed a constant NaN format so that the instruction FSINCOS
|
|
; for infinite returns the same quite Nan as the 881.
|
|
; <2> 3/30/91 BG Rolling in Jon Okada's latest changes.
|
|
; <1> 12/14/90 BG First checked into TERROR/BBS.
|
|
|
|
; dofunc.a
|
|
|
|
; Based upon Motorola files 'do_func.sa' and 'tbldo.sa'
|
|
|
|
; CHANGE LOG:
|
|
; 02 Jan 91 JPO Incorporated table 'tblepre' from Motorola file 'tbldo.sa',
|
|
; changing contents to 16-bit addresses relative to table top.
|
|
; Changed tables 'pmodt', 'premt', and 'pscalet' to contain
|
|
; 16-bit addresses relative to respective table tops.
|
|
; Deleted constants MONE, PZERO, PINF, and MINF
|
|
; and imbedded values in instructions. Changed
|
|
; constants MZERO and QNAN to single-precision.
|
|
; 08 Feb 91 JPO Modified routines "smod_fpn" and "srem_fpn" to filter out
|
|
; subnormal dst cases for special handling.
|
|
; 08 Apr 91 JPO Fixed "tbl_pre" entries for FTENTOX with normal or zero
|
|
; input (removed extra space before "-" sign.
|
|
; 09 Apr 91 JPO Changed constant QNAN back to extended precision.
|
|
; 02 May 91 JPO Corrected table "pmodt" (5 entries lacked offset entries).
|
|
; 26 Aug 92 JPO Cleared quotient field in USER_FPSR for FREM and FMOD
|
|
; instructions (see under "prem" and "pmod" below).
|
|
|
|
*
|
|
* do_func.sa 3.1 12/10/90
|
|
*
|
|
* Do_func performs the unimplemented operation. The operation
|
|
* to be performed is determined from the lower 7 bits of the
|
|
* extension word (except in the case of fmovecr and fsincos).
|
|
* The opcode and tag bits form an index into a jump table in
|
|
* tbldo.sa. Cases of zero, infinity and NaN are handled in
|
|
* do_func by forcing the default result. Normalized and
|
|
* denormalized (there are no unnormalized numbers at this
|
|
* point) are passed onto the emulation code.
|
|
*
|
|
* CMDREG1B and STAG are extracted from the fsave frame
|
|
* and combined to form the table index. The function called
|
|
* will start with a0 pointing to the ETEMP operand. Dyadic
|
|
* functions can find FPTEMP at -12(a0).
|
|
*
|
|
* Called functions return their result in fp0. Sincos returns
|
|
* sin(x) in fp0 and cos(x) in fp1.
|
|
*
|
|
|
|
* Copyright (C) Motorola, Inc. 1990
|
|
* All Rights Reserved
|
|
*
|
|
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
|
|
* The copyright notice above does not evidence any
|
|
* actual or intended publication of such source code.
|
|
|
|
* DO_FUNC IDNT 2,1 Motorola 040 Floating Point Software Package
|
|
|
|
ALIGN 16
|
|
|
|
PONE dc.l $3fff0000,$80000000,$00000000 ;+1
|
|
MZERO dc.l $80000000 ; <1/2/91, JPO>
|
|
|
|
MPIBY2 dc.l $BFFF0000,$C90FDAA2,$2168C235 ;-PI/2
|
|
;QNAN dc.l $7FFFFFFF ; <1/2/91, JPO> - deleted <4/9/91, JPO> <T3>
|
|
dc.l $00000000 ; added <4/9/91, JPO> <T3>
|
|
|
|
QNAN dc.l $7fff0000,$ffffffff,$ffffffff,$00000000 ; added <4/9/91, JPO> <T3>
|
|
|
|
|
|
;MONE dc.l $bfff0000,$80000000,$00000000 ;-1
|
|
;PZERO dc.l $00000000,$00000000,$00000000 ;+0
|
|
;MZERO dc.l $80000000,$00000000,$00000000 ;-0
|
|
;PINF dc.l $7fff0000,$00000000,$00000000 ;+inf
|
|
;MINF dc.l $ffff0000,$00000000,$00000000 ;-inf
|
|
;QNAN dc.l $7fff0000,$ffffffff,$ffffffff ;non-signaling nan
|
|
;PPIBY2 dc.l $3FFF0000,$C90FDAA2,$2168C235 ;+PI/2 available at PIBY2 in 'constants.a'
|
|
|
|
|
|
|
|
*
|
|
* tbldo.sa 3.1 12/10/90
|
|
*
|
|
* Modified:
|
|
* 8/16/90 chinds The table was constructed to use only one level
|
|
* of indirection in do_func for monoadic
|
|
* functions. Dyadic functions require two
|
|
* levels, and the tables are still contained
|
|
* in do_func. The table is arranged for
|
|
* index with a 10-bit index, with the first
|
|
* 7 bits the opcode, and the remaining 3
|
|
* the stag. For dyadic functions, all
|
|
* valid addresses are to the generic entry
|
|
* point.
|
|
*
|
|
|
|
* Copyright (C) Motorola, Inc. 1990
|
|
* All Rights Reserved
|
|
*
|
|
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
|
|
* The copyright notice above does not evidence any
|
|
* actual or intended publication of such source code.
|
|
|
|
* TBLDO IDNT 2,1 Motorola 040 Floating Point Software Package
|
|
|
|
|
|
* instruction ;opcode-stag Notes
|
|
|
|
tblpre:
|
|
dc.w smovcr-tblpre ;$00-0 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-1 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-2 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-3 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-4 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-5 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-6 fmovecr all
|
|
dc.w smovcr-tblpre ;$00-7 fmovecr all
|
|
|
|
dc.w sint-tblpre ;$01-0 fint norm
|
|
dc.w szero-tblpre ;$01-1 fint zero
|
|
dc.w sinf-tblpre ;$01-2 fint inf
|
|
dc.w src_nan-tblpre ;$01-3 fint nan
|
|
dc.w sintd-tblpre ;$01-4 fint denorm inx
|
|
dc.w serror-tblpre ;$01-5 fint ERROR
|
|
dc.w serror-tblpre ;$01-6 fint ERROR
|
|
dc.w serror-tblpre ;$01-7 fint ERROR
|
|
|
|
dc.w ssinh-tblpre ;$02-0 fsinh norm
|
|
dc.w szero-tblpre ;$02-1 fsinh zero
|
|
dc.w sinf-tblpre ;$02-2 fsinh inf
|
|
dc.w src_nan-tblpre ;$02-3 fsinh nan
|
|
dc.w ssinhd-tblpre ;$02-4 fsinh denorm
|
|
dc.w serror-tblpre ;$02-5 fsinh ERROR
|
|
dc.w serror-tblpre ;$02-6 fsinh ERROR
|
|
dc.w serror-tblpre ;$02-7 fsinh ERROR
|
|
|
|
dc.w sintrz-tblpre ;$03-0 fintrz norm
|
|
dc.w szero-tblpre ;$03-1 fintrz zero
|
|
dc.w sinf-tblpre ;$03-2 fintrz inf
|
|
dc.w src_nan-tblpre ;$03-3 fintrz nan
|
|
dc.w snzrinx-tblpre ;$03-4 fintrz denorm inx
|
|
dc.w serror-tblpre ;$03-5 fintrz ERROR
|
|
dc.w serror-tblpre ;$03-6 fintrz ERROR
|
|
dc.w serror-tblpre ;$03-7 fintrz ERROR
|
|
|
|
dc.w serror-tblpre ;$04-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$04-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$05-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$05-7 ERROR - illegal extension
|
|
|
|
dc.w sslognp1-tblpre ;$06-0 flognp1 norm
|
|
dc.w szero-tblpre ;$06-1 flognp1 zero
|
|
dc.w sopr_inf-tblpre ;$06-2 flognp1 inf
|
|
dc.w src_nan-tblpre ;$06-3 flognp1 nan
|
|
dc.w slognp1d-tblpre ;$06-4 flognp1 denorm
|
|
dc.w serror-tblpre ;$06-5 flognp1 ERROR
|
|
dc.w serror-tblpre ;$06-6 flognp1 ERROR
|
|
dc.w serror-tblpre ;$06-7 flognp1 ERROR
|
|
|
|
dc.w serror-tblpre ;$07-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$07-7 ERROR - illegal extension
|
|
|
|
dc.w setoxm1-tblpre ;$08-0 fetoxm1 norm
|
|
dc.w szero-tblpre ;$08-1 fetoxm1 zero
|
|
dc.w setoxm1i-tblpre ;$08-2 fetoxm1 inf
|
|
dc.w src_nan-tblpre ;$08-3 fetoxm1 nan
|
|
dc.w setoxm1d-tblpre ;$08-4 fetoxm1 denorm
|
|
dc.w serror-tblpre ;$08-5 fetoxm1 ERROR
|
|
dc.w serror-tblpre ;$08-6 fetoxm1 ERROR
|
|
dc.w serror-tblpre ;$08-7 fetoxm1 ERROR
|
|
|
|
dc.w stanh-tblpre ;$09-0 ftanh norm
|
|
dc.w szero-tblpre ;$09-1 ftanh zero
|
|
dc.w sone-tblpre ;$09-2 ftanh inf
|
|
dc.w src_nan-tblpre ;$09-3 ftanh nan
|
|
dc.w stanhd-tblpre ;$09-4 ftanh denorm
|
|
dc.w serror-tblpre ;$09-5 ftanh ERROR
|
|
dc.w serror-tblpre ;$09-6 ftanh ERROR
|
|
dc.w serror-tblpre ;$09-7 ftanh ERROR
|
|
|
|
dc.w satan-tblpre ;$0a-0 fatan norm
|
|
dc.w szero-tblpre ;$0a-1 fatan zero
|
|
dc.w spi_2-tblpre ;$0a-2 fatan inf
|
|
dc.w src_nan-tblpre ;$0a-3 fatan nan
|
|
dc.w satand-tblpre ;$0a-4 fatan denorm
|
|
dc.w serror-tblpre ;$0a-5 fatan ERROR
|
|
dc.w serror-tblpre ;$0a-6 fatan ERROR
|
|
dc.w serror-tblpre ;$0a-7 fatan ERROR
|
|
|
|
dc.w serror-tblpre ;$0b-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$0b-7 ERROR - illegal extension
|
|
|
|
dc.w sasin-tblpre ;$0c-0 fasin norm
|
|
dc.w szero-tblpre ;$0c-1 fasin zero
|
|
dc.w t_operr-tblpre ;$0c-2 fasin inf
|
|
dc.w src_nan-tblpre ;$0c-3 fasin nan
|
|
dc.w sasind-tblpre ;$0c-4 fasin denorm
|
|
dc.w serror-tblpre ;$0c-5 fasin ERROR
|
|
dc.w serror-tblpre ;$0c-6 fasin ERROR
|
|
dc.w serror-tblpre ;$0c-7 fasin ERROR
|
|
|
|
dc.w satanh-tblpre ;$0d-0 fatanh norm
|
|
dc.w szero-tblpre ;$0d-1 fatanh zero
|
|
dc.w t_operr-tblpre ;$0d-2 fatanh inf
|
|
dc.w src_nan-tblpre ;$0d-3 fatanh nan
|
|
dc.w satanhd-tblpre ;$0d-4 fatanh denorm
|
|
dc.w serror-tblpre ;$0d-5 fatanh ERROR
|
|
dc.w serror-tblpre ;$0d-6 fatanh ERROR
|
|
dc.w serror-tblpre ;$0d-7 fatanh ERROR
|
|
|
|
dc.w ssin-tblpre ;$0e-0 fsin norm
|
|
dc.w szero-tblpre ;$0e-1 fsin zero
|
|
dc.w t_operr-tblpre ;$0e-2 fsin inf
|
|
dc.w src_nan-tblpre ;$0e-3 fsin nan
|
|
dc.w ssind-tblpre ;$0e-4 fsin denorm
|
|
dc.w serror-tblpre ;$0e-5 fsin ERROR
|
|
dc.w serror-tblpre ;$0e-6 fsin ERROR
|
|
dc.w serror-tblpre ;$0e-7 fsin ERROR
|
|
|
|
dc.w stan-tblpre ;$0f-0 ftan norm
|
|
dc.w szero-tblpre ;$0f-1 ftan zero
|
|
dc.w t_operr-tblpre ;$0f-2 ftan inf
|
|
dc.w src_nan-tblpre ;$0f-3 ftan nan
|
|
dc.w stand-tblpre ;$0f-4 ftan denorm
|
|
dc.w serror-tblpre ;$0f-5 ftan ERROR
|
|
dc.w serror-tblpre ;$0f-6 ftan ERROR
|
|
dc.w serror-tblpre ;$0f-7 ftan ERROR
|
|
|
|
dc.w setox-tblpre ;$10-0 fetox norm
|
|
dc.w ld_pone-tblpre ;$10-1 fetox zero
|
|
dc.w szr_inf-tblpre ;$10-2 fetox inf
|
|
dc.w src_nan-tblpre ;$10-3 fetox nan
|
|
dc.w setoxd-tblpre ;$10-4 fetox denorm
|
|
dc.w serror-tblpre ;$10-5 fetox ERROR
|
|
dc.w serror-tblpre ;$10-6 fetox ERROR
|
|
dc.w serror-tblpre ;$10-7 fetox ERROR
|
|
|
|
dc.w stwotox-tblpre ;$11-0 ftwotox norm
|
|
dc.w ld_pone-tblpre ;$11-1 ftwotox zero
|
|
dc.w szr_inf-tblpre ;$11-2 ftwotox inf
|
|
dc.w src_nan-tblpre ;$11-3 ftwotox nan
|
|
dc.w stwotoxd-tblpre ;$11-4 ftwotox denorm
|
|
dc.w serror-tblpre ;$11-5 ftwotox ERROR
|
|
dc.w serror-tblpre ;$11-6 ftwotox ERROR
|
|
dc.w serror-tblpre ;$11-7 ftwotox ERROR
|
|
|
|
dc.w stentox-tblpre ;$12-0 ftentox norm ; removed tab before "-tblpre" <4/8/91, JPO> <T3>
|
|
dc.w ld_pone-tblpre ;$12-1 ftentox zero ; removed tab before "-tblpre" <4/8/91, JPO> <T3>
|
|
dc.w szr_inf-tblpre ;$12-2 ftentox inf
|
|
dc.w src_nan-tblpre ;$12-3 ftentox nan
|
|
dc.w stentoxd-tblpre ;$12-4 ftentox denorm
|
|
dc.w serror-tblpre ;$12-5 ftentox ERROR
|
|
dc.w serror-tblpre ;$12-6 ftentox ERROR
|
|
dc.w serror-tblpre ;$12-7 ftentox ERROR
|
|
|
|
dc.w serror-tblpre ;$13-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$13-7 ERROR - illegal extension
|
|
|
|
dc.w sslogn-tblpre ;$14-0 flogn norm
|
|
dc.w t_dz2-tblpre ;$14-1 flogn zero
|
|
dc.w sopr_inf-tblpre ;$14-2 flogn inf
|
|
dc.w src_nan-tblpre ;$14-3 flogn nan
|
|
dc.w sslognd-tblpre ;$14-4 flogn denorm
|
|
dc.w serror-tblpre ;$14-5 flogn ERROR
|
|
dc.w serror-tblpre ;$14-6 flogn ERROR
|
|
dc.w serror-tblpre ;$14-7 flogn ERROR
|
|
|
|
dc.w sslog10-tblpre ;$15-0 flog10 norm
|
|
dc.w t_dz2-tblpre ;$15-1 flog10 zero
|
|
dc.w sopr_inf-tblpre ;$15-2 flog10 inf
|
|
dc.w src_nan-tblpre ;$15-3 flog10 nan
|
|
dc.w sslog10d-tblpre ;$15-4 flog10 denorm
|
|
dc.w serror-tblpre ;$15-5 flog10 ERROR
|
|
dc.w serror-tblpre ;$15-6 flog10 ERROR
|
|
dc.w serror-tblpre ;$15-7 flog10 ERROR
|
|
|
|
dc.w sslog2-tblpre ;$16-0 flog2 norm
|
|
dc.w t_dz2-tblpre ;$16-1 flog2 zero
|
|
dc.w sopr_inf-tblpre ;$16-2 flog2 inf
|
|
dc.w src_nan-tblpre ;$16-3 flog2 nan
|
|
dc.w sslog2d-tblpre ;$16-4 flog2 denorm
|
|
dc.w serror-tblpre ;$16-5 flog2 ERROR
|
|
dc.w serror-tblpre ;$16-6 flog2 ERROR
|
|
dc.w serror-tblpre ;$16-7 flog2 ERROR
|
|
|
|
dc.w serror-tblpre ;$17-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$17-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$18-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$18-7 ERROR - illegal extension
|
|
|
|
dc.w scosh-tblpre ;$19-0 fcosh norm
|
|
dc.w ld_pone-tblpre ;$19-1 fcosh zero
|
|
dc.w ld_pinf-tblpre ;$19-2 fcosh inf
|
|
dc.w src_nan-tblpre ;$19-3 fcosh nan
|
|
dc.w scoshd-tblpre ;$19-4 fcosh denorm
|
|
dc.w serror-tblpre ;$19-5 fcosh ERROR
|
|
dc.w serror-tblpre ;$19-6 fcosh ERROR
|
|
dc.w serror-tblpre ;$19-7 fcosh ERROR
|
|
|
|
dc.w serror-tblpre ;$1a-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1a-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$1b-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$1b-7 ERROR - illegal extension
|
|
|
|
dc.w sacos-tblpre ;$1c-0 facos norm
|
|
dc.w ld_ppi2-tblpre ;$1c-1 facos zero
|
|
dc.w t_operr-tblpre ;$1c-2 facos inf
|
|
dc.w src_nan-tblpre ;$1c-3 facos nan
|
|
dc.w sacosd-tblpre ;$1c-4 facos denorm
|
|
dc.w serror-tblpre ;$1c-5 facos ERROR
|
|
dc.w serror-tblpre ;$1c-6 facos ERROR
|
|
dc.w serror-tblpre ;$1c-7 facos ERROR
|
|
|
|
dc.w scos-tblpre ;$1d-0 fcos norm
|
|
dc.w ld_pone-tblpre ;$1d-1 fcos zero
|
|
dc.w t_operr-tblpre ;$1d-2 fcos inf
|
|
dc.w src_nan-tblpre ;$1d-3 fcos nan
|
|
dc.w scosd-tblpre ;$1d-4 fcos denorm
|
|
dc.w serror-tblpre ;$1d-5 fcos ERROR
|
|
dc.w serror-tblpre ;$1d-6 fcos ERROR
|
|
dc.w serror-tblpre ;$1d-7 fcos ERROR
|
|
|
|
dc.w sgetexp-tblpre ;$1e-0 fgetexp norm
|
|
dc.w szero-tblpre ;$1e-1 fgetexp zero
|
|
dc.w t_operr-tblpre ;$1e-2 fgetexp inf
|
|
dc.w src_nan-tblpre ;$1e-3 fgetexp nan
|
|
dc.w sgetexpd-tblpre ;$1e-4 fgetexp denorm
|
|
dc.w serror-tblpre ;$1e-5 fgetexp ERROR
|
|
dc.w serror-tblpre ;$1e-6 fgetexp ERROR
|
|
dc.w serror-tblpre ;$1e-7 fgetexp ERROR
|
|
|
|
dc.w sgetman-tblpre ;$1f-0 fgetman norm
|
|
dc.w szero-tblpre ;$1f-1 fgetman zero
|
|
dc.w t_operr-tblpre ;$1f-2 fgetman inf
|
|
dc.w src_nan-tblpre ;$1f-3 fgetman nan
|
|
dc.w sgetmand-tblpre ;$1f-4 fgetman denorm
|
|
dc.w serror-tblpre ;$1f-5 fgetman ERROR
|
|
dc.w serror-tblpre ;$1f-6 fgetman ERROR
|
|
dc.w serror-tblpre ;$1f-7 fgetman ERROR
|
|
|
|
dc.w serror-tblpre ;$20-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$20-7 ERROR - illegal extension
|
|
|
|
dc.w pmod-tblpre ;$21-0 fmod all
|
|
dc.w pmod-tblpre ;$21-1 fmod all
|
|
dc.w pmod-tblpre ;$21-2 fmod all
|
|
dc.w pmod-tblpre ;$21-3 fmod all
|
|
dc.w pmod-tblpre ;$21-4 fmod all
|
|
dc.w serror-tblpre ;$21-5 fmod ERROR
|
|
dc.w serror-tblpre ;$21-6 fmod ERROR
|
|
dc.w serror-tblpre ;$21-7 fmod ERROR
|
|
|
|
dc.w serror-tblpre ;$22-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$22-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$23-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$23-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$24-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$24-7 ERROR - illegal extension
|
|
|
|
dc.w prem-tblpre ;$25-0 frem all
|
|
dc.w prem-tblpre ;$25-1 frem all
|
|
dc.w prem-tblpre ;$25-2 frem all
|
|
dc.w prem-tblpre ;$25-3 frem all
|
|
dc.w prem-tblpre ;$25-4 frem all
|
|
dc.w serror-tblpre ;$25-5 frem ERROR
|
|
dc.w serror-tblpre ;$25-6 frem ERROR
|
|
dc.w serror-tblpre ;$25-7 frem ERROR
|
|
|
|
dc.w pscale-tblpre ;$26-0 fscale all
|
|
dc.w pscale-tblpre ;$26-1 fscale all
|
|
dc.w pscale-tblpre ;$26-2 fscale all
|
|
dc.w pscale-tblpre ;$26-3 fscale all
|
|
dc.w pscale-tblpre ;$26-4 fscale all
|
|
dc.w serror-tblpre ;$26-5 fscale ERROR
|
|
dc.w serror-tblpre ;$26-6 fscale ERROR
|
|
dc.w serror-tblpre ;$26-7 fscale ERROR
|
|
|
|
dc.w serror-tblpre ;$27-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$27-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$28-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$28-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$29-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$29-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$2a-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2a-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$2b-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2b-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$2c-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2c-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$2d-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2d-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$2e-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2e-7 ERROR - illegal extension
|
|
|
|
dc.w serror-tblpre ;$2f-0 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-1 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-2 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-3 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-4 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-5 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-6 ERROR - illegal extension
|
|
dc.w serror-tblpre ;$2f-7 ERROR - illegal extension
|
|
|
|
dc.w ssincos-tblpre ;$30-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$30-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$30-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$30-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$30-4 fsincos denorm
|
|
dc.w serror-tblpre ;$30-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$30-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$30-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$31-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$31-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$31-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$31-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$31-4 fsincos denorm
|
|
dc.w serror-tblpre ;$31-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$31-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$31-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$32-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$32-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$32-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$32-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$32-4 fsincos denorm
|
|
dc.w serror-tblpre ;$32-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$32-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$32-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$33-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$33-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$33-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$33-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$33-4 fsincos denorm
|
|
dc.w serror-tblpre ;$33-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$33-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$33-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$34-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$34-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$34-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$34-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$34-4 fsincos denorm
|
|
dc.w serror-tblpre ;$34-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$34-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$34-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$35-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$35-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$35-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$35-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$35-4 fsincos denorm
|
|
dc.w serror-tblpre ;$35-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$35-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$35-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$36-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$36-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$36-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$36-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$36-4 fsincos denorm
|
|
dc.w serror-tblpre ;$36-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$36-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$36-7 fsincos ERROR
|
|
|
|
dc.w ssincos-tblpre ;$37-0 fsincos norm
|
|
dc.w ssincosz-tblpre ;$37-1 fsincos zero
|
|
dc.w ssincosi-tblpre ;$37-2 fsincos inf
|
|
dc.w ssincosnan-tblpre ;$37-3 fsincos nan
|
|
dc.w ssincosd-tblpre ;$37-4 fsincos denorm
|
|
dc.w serror-tblpre ;$37-5 fsincos ERROR
|
|
dc.w serror-tblpre ;$37-6 fsincos ERROR
|
|
dc.w serror-tblpre ;$37-7 fsincos ERROR
|
|
|
|
|
|
|
|
do_func:
|
|
clr.b CU_ONLY(a6)
|
|
*
|
|
* Check for fmovecr. It does not follow the format of fp gen
|
|
* unimplemented instructions. The test is on the upper 6 bits;
|
|
* if they are $17, the inst is fmovecr. Call entry smovcr
|
|
* directly.
|
|
*
|
|
bfextu CMDREG1B(a6){0:6},d0 ;get opclass and src fields
|
|
cmpi.l #$17,d0 ;if op class and size fields are $17,
|
|
* ;it is FMOVECR; if not, continue
|
|
bne.b not_fmovecr
|
|
; jmp smovcr ;fmovecr; jmp directly to emulation - change to bra <1/2/91, JPO>
|
|
bra smovcr ; <1/2/91, JPO>
|
|
|
|
not_fmovecr:
|
|
move.w CMDREG1B(a6),d0
|
|
and.l #$7F,d0
|
|
cmpi.l #$38,d0 ;if the extension is >= $38,
|
|
bge.b serror ;it is illegal
|
|
bfextu STAG(a6){0:3},d1
|
|
lsl.l #3,d0 ;make room for STAG
|
|
add.l d1,d0 ;combine for final index into table
|
|
lea.l tblpre,a1 ;start of monster jump table
|
|
; move.l (a1,d0.w*4),a1 ;real target address - deleted <1/2/91, JPO>
|
|
adda.w (a1,d0.w*2),a1 ; <1/2/91, JPO>
|
|
lea.l ETEMP(a6),a0 ;a0 is pointer to src op
|
|
move.l USER_FPCR(a6),d1
|
|
and.l #$FF,d1 ; discard all but rounding mode/prec
|
|
fmove.l #0,fpcr
|
|
jmp (a1)
|
|
*
|
|
* ERROR
|
|
*
|
|
|
|
serror:
|
|
st.b STORE_FLG(a6)
|
|
rts
|
|
*
|
|
* These routines load forced values into fp0. They are called
|
|
* by index into tbldo.
|
|
*
|
|
* Load a signed zero to fp0 and set inex2/ainex
|
|
*
|
|
|
|
snzrinx:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;get sign of source operand
|
|
bne.b ld_mzinx ;if negative, branch
|
|
bsr ld_pzero ;bsr so we can return and set inx
|
|
bra t_inx2 ;now, set the inx for the next inst
|
|
ld_mzinx:
|
|
bsr ld_mzero ;if neg, load neg zero, return here
|
|
bra t_inx2 ;now, set the inx for the next inst
|
|
*
|
|
* Load a signed zero to fp0; do not set inex2/ainex
|
|
*
|
|
|
|
szero:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;get sign of source operand
|
|
bne ld_mzero ;if neg, load neg zero
|
|
bra ld_pzero ;load positive zero
|
|
*
|
|
* Load a signed infinity to fp0; do not set inex2/ainex
|
|
*
|
|
|
|
sinf:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;get sign of source operand
|
|
bne ld_minf ;if negative branch
|
|
bra ld_pinf
|
|
*
|
|
* Load a signed one to fp0; do not set inex2/ainex
|
|
*
|
|
|
|
sone:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;check sign of source
|
|
bne ld_mone
|
|
bra ld_pone
|
|
*
|
|
* Load a signed pi/2 to fp0; do not set inex2/ainex
|
|
*
|
|
|
|
spi_2:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;check sign of source
|
|
bne ld_mpi2
|
|
bra ld_ppi2
|
|
*
|
|
* Load either a +0 or +inf for plus/minus operand
|
|
*
|
|
|
|
szr_inf:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;check sign of source
|
|
bne ld_pzero
|
|
bra ld_pinf
|
|
*
|
|
* Result is either an operr or +inf for plus/minus operand
|
|
* [Used by slogn, slognp1, slog10, and slog2]
|
|
*
|
|
|
|
sopr_inf:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;check sign of source
|
|
bne t_operr
|
|
bra ld_pinf
|
|
*
|
|
* FLOGNP1
|
|
*
|
|
|
|
sslognp1:
|
|
fmovem.x (a0),fp0
|
|
fcmp.b #-1,fp0
|
|
fbgt slognp1
|
|
fbeq t_dz2 ;if = -1, divide by zero exception
|
|
fmove.l #0,FPSR ;clr N flag
|
|
bra t_operr ;take care of operands < -1
|
|
*
|
|
* FETOXM1
|
|
*
|
|
|
|
setoxm1i:
|
|
btst.b #sign_bit,LOCAL_EX(a0) ;check sign of source
|
|
bne ld_mone
|
|
bra ld_pinf
|
|
*
|
|
* FLOGN
|
|
*
|
|
* Test for 1.0 as an input argument, returning +zero. Also check
|
|
* the sign and return operr if negative.
|
|
*
|
|
|
|
sslogn:
|
|
btst.b #sign_bit,LOCAL_EX(a0)
|
|
bne t_operr ;take care of operands < 0
|
|
cmpi.w #$3fff,LOCAL_EX(a0) ;test for 1.0 input
|
|
bne slogn
|
|
cmpi.l #$80000000,LOCAL_HI(a0)
|
|
bne slogn
|
|
tst.l LOCAL_LO(a0)
|
|
bne slogn
|
|
; fmove.x PZERO,fp0 ; deleted <1/2/91, JPO>
|
|
fmove.b #0,fp0
|
|
rts
|
|
|
|
|
|
sslognd:
|
|
btst.b #sign_bit,LOCAL_EX(a0)
|
|
beq slognd
|
|
bra t_operr ;take care of operands < 0
|
|
|
|
*
|
|
* FLOG10
|
|
*
|
|
|
|
sslog10:
|
|
btst.b #sign_bit,LOCAL_EX(a0)
|
|
bne t_operr ;take care of operands < 0
|
|
cmpi.w #$3fff,LOCAL_EX(a0) ;test for 1.0 input
|
|
bne slog10
|
|
cmpi.l #$80000000,LOCAL_HI(a0)
|
|
bne slog10
|
|
tst.l LOCAL_LO(a0)
|
|
bne slog10
|
|
; fmove.x PZERO,fp0 ; deleted <1/2/91, JPO>
|
|
fmove.b #0,fp0 ; <1/2/91, JPO>
|
|
rts
|
|
|
|
|
|
sslog10d:
|
|
btst.b #sign_bit,LOCAL_EX(a0)
|
|
beq slog10d
|
|
bra t_operr ;take care of operands < 0
|
|
|
|
*
|
|
* FLOG2
|
|
*
|
|
|
|
sslog2:
|
|
btst.b #sign_bit,LOCAL_EX(a0)
|
|
bne t_operr ;take care of operands < 0
|
|
cmpi.w #$3fff,LOCAL_EX(a0) ;test for 1.0 input
|
|
bne slog2
|
|
cmpi.l #$80000000,LOCAL_HI(a0)
|
|
bne slog2
|
|
tst.l LOCAL_LO(a0)
|
|
bne slog2
|
|
; fmove.x PZERO,fp0 ; deleted <1/2/91, JPO>
|
|
fmove.b #0,fp0 ; <1/2/91, JPO>
|
|
rts
|
|
|
|
|
|
sslog2d:
|
|
btst.b #sign_bit,LOCAL_EX(a0)
|
|
beq slog2d
|
|
bra t_operr ;take care of operands < 0
|
|
|
|
*
|
|
* FMOD
|
|
*
|
|
pmodt:
|
|
* ;$21 fmod
|
|
* ;dtag,stag
|
|
dc.w smod-pmodt ; 00,00 norm,norm = normal
|
|
dc.w smod_oper-pmodt ; 00,01 norm,zero = nan with operr
|
|
dc.w smod_fpn-pmodt ; 00,10 norm,inf = fpn
|
|
dc.w smod_snan-pmodt ; 00,11 norm,nan = nan
|
|
dc.w smod_zro-pmodt ; 01,00 zero,norm = +-zero
|
|
dc.w smod_oper-pmodt ; 01,01 zero,zero = nan with operr
|
|
dc.w smod_zro-pmodt ; 01,10 zero,inf = +-zero
|
|
dc.w smod_snan-pmodt ; 01,11 zero,nan = nan
|
|
dc.w smod_oper-pmodt ; 10,00 inf,norm = nan with operr
|
|
dc.w smod_oper-pmodt ; 10,01 inf,zero = nan with operr
|
|
dc.w smod_oper-pmodt ; 10,10 inf,inf = nan with operr
|
|
dc.w smod_snan-pmodt ; 10,11 inf,nan = nan - added "-pmodt" <5/2/91, JPO> <T4>
|
|
dc.w smod_dnan-pmodt ; 11,00 nan,norm = nan - added "-pmodt" <5/2/91, JPO> <T4>
|
|
dc.w smod_dnan-pmodt ; 11,01 nan,zero = nan - added "-pmodt" <5/2/91, JPO> <T4>
|
|
dc.w smod_dnan-pmodt ; 11,10 nan,inf = nan - added "-pmodt" <5/2/91, JPO> <T4>
|
|
dc.w smod_dnan-pmodt ; 11,11 nan,nan = nan - added "-pmodt" <5/2/91, JPO> <T4>
|
|
|
|
|
|
pmod:
|
|
clr.b FPSR_QBYTE(a6) ; clear quotient bits in FPSR - ADDED <8/26/92, JPO><SM2> CSS
|
|
bfextu STAG(a6){0:3},d0 ;stag = d0
|
|
bfextu DTAG(a6){0:3},d1 ;dtag = d1
|
|
|
|
*
|
|
* Alias extended denorms to norms for the jump table.
|
|
*
|
|
bclr.l #2,d0
|
|
bclr.l #2,d1
|
|
|
|
lsl.b #2,d1
|
|
or.b d0,d1 ;d1{3:2} = dtag, d1{1:0} = stag
|
|
* ;Tag values:
|
|
* ;00 = norm or denorm
|
|
* ;01 = zero
|
|
* ;10 = inf
|
|
* ;11 = nan
|
|
lea pmodt,a1
|
|
; move.l (a1,d1.w*4),a1 ; removed <1/2/91, JPO>
|
|
adda.w (a1,d1.w*2),a1 ; get special routine from table <1/2/91, JPO>
|
|
jmp (a1)
|
|
|
|
smod_snan:
|
|
bra src_nan
|
|
smod_dnan:
|
|
bra dst_nan
|
|
smod_oper:
|
|
bra t_operr
|
|
smod_zro:
|
|
move.b ETEMP(a6),d1 ;get sign of src op
|
|
move.b FPTEMP(a6),d0 ;get sign of dst op
|
|
eor.b d0,d1 ;get exor of sign bits
|
|
btst.l #7,d1 ;test for sign
|
|
beq.b smod_zsn ;if clr, do not set sign big
|
|
bset.b #q_sn_bit,FPSR_QBYTE(a6) ;set q-byte sign bit
|
|
smod_zsn:
|
|
btst.l #7,d0 ;test if + or -
|
|
beq ld_pzero ;if pos then load +0
|
|
bra ld_mzero ;else neg load -0
|
|
|
|
smod_fpn:
|
|
move.b ETEMP(a6),d1 ;get sign of src op
|
|
move.b FPTEMP(a6),d0 ;get sign of dst op
|
|
eor.b d0,d1 ;get exor of sign bits
|
|
btst.l #7,d1 ;test for sign
|
|
beq.b smod_fsn ;if clr, do not set sign big
|
|
bset.b #q_sn_bit,FPSR_QBYTE(a6) ;set q-byte sign bit
|
|
smod_fsn:
|
|
tst.b DTAG(a6) ; filter out subnormal dst case <2/8/91, JPO>
|
|
bpl.b @1 ; normalized dst <2/8/91, JPO>
|
|
|
|
lea.l FPTEMP(a6),a0 ; a0 <- addr(FPTEMP) <2/8/91, JPO>
|
|
bra t_resdnrm ; force unfl result <2/8/91, JPO>
|
|
|
|
@1: ; label added <2/8/91, JPO>
|
|
fmove.l USER_FPCR(a6),fpcr ;use user's rmode and precision
|
|
fmove.x FPTEMP(a6),fp0 ;load dest operand to fp0
|
|
rts
|
|
*
|
|
* FREM
|
|
*
|
|
premt:
|
|
* ;$25 frem
|
|
* ;dtag,stag
|
|
dc.w srem-premt ; 00,00 norm,norm = normal
|
|
dc.w srem_oper-premt ; 00,01 norm,zero = nan with operr
|
|
dc.w srem_fpn-premt ; 00,10 norm,inf = fpn
|
|
dc.w srem_snan-premt ; 00,11 norm,nan = nan
|
|
dc.w srem_zro-premt ; 01,00 zero,norm = +-zero
|
|
dc.w srem_oper-premt ; 01,01 zero,zero = nan with operr
|
|
dc.w srem_zro-premt ; 01,10 zero,inf = +-zero
|
|
dc.w srem_snan-premt ; 01,11 zero,nan = nan
|
|
dc.w srem_oper-premt ; 10,00 inf,norm = nan with operr
|
|
dc.w srem_oper-premt ; 10,01 inf,zero = nan with operr
|
|
dc.w srem_oper-premt ; 10,10 inf,inf = nan with operr
|
|
dc.w srem_snan-premt ; 10,11 inf,nan = nan
|
|
dc.w srem_dnan-premt ; 11,00 nan,norm = nan
|
|
dc.w srem_dnan-premt ; 11,01 nan,zero = nan
|
|
dc.w srem_dnan-premt ; 11,10 nan,inf = nan
|
|
dc.w srem_dnan-premt ; 11,11 nan,nan = nan
|
|
|
|
|
|
prem:
|
|
clr.b FPSR_QBYTE(a6) ; clear quotient bits in FPSR - ADDED <8/26/92, JPO> <SM2> CSS
|
|
bfextu STAG(a6){0:3},d0 ;stag = d0
|
|
bfextu DTAG(a6){0:3},d1 ;dtag = d1
|
|
*
|
|
* Alias extended denorms to norms for the jump table.
|
|
*
|
|
bclr #2,d0
|
|
bclr #2,d1
|
|
|
|
lsl.b #2,d1
|
|
or.b d0,d1 ;d1{3:2} = dtag, d1{1:0} = stag
|
|
* ;Tag values:
|
|
* ;00 = norm or denorm
|
|
* ;01 = zero
|
|
* ;10 = inf
|
|
* ;11 = nan
|
|
lea premt,a1
|
|
; move.l (a1,d1.w*4),a1 ; deleted <1/2/91, JPO>
|
|
adda.w (a1,d1.w*2),a1 ; get special routine from table <1/2/91, JPO>
|
|
jmp (a1)
|
|
|
|
srem_snan:
|
|
bra src_nan
|
|
srem_dnan:
|
|
bra dst_nan
|
|
srem_oper:
|
|
bra t_operr
|
|
srem_zro:
|
|
move.b ETEMP(a6),d1 ;get sign of src op
|
|
move.b FPTEMP(a6),d0 ;get sign of dst op
|
|
eor.b d0,d1 ;get exor of sign bits
|
|
btst.l #7,d1 ;test for sign
|
|
beq.b srem_zsn ;if clr, do not set sign big
|
|
bset.b #q_sn_bit,FPSR_QBYTE(a6) ;set q-byte sign bit
|
|
srem_zsn:
|
|
btst.l #7,d0 ;test if + or -
|
|
beq ld_pzero ;if pos then load +0
|
|
bra ld_mzero ;else neg load -0
|
|
|
|
srem_fpn:
|
|
move.b ETEMP(a6),d1 ;get sign of src op
|
|
move.b FPTEMP(a6),d0 ;get sign of dst op
|
|
eor.b d0,d1 ;get exor of sign bits
|
|
btst.l #7,d1 ;test for sign
|
|
beq.b srem_fsn ;if clr, do not set sign big
|
|
bset.b #q_sn_bit,FPSR_QBYTE(a6) ;set q-byte sign bit
|
|
srem_fsn:
|
|
tst.b DTAG(a6) ; filter out subnormal dst case <2/8/91, JPO>
|
|
bpl.b @1 ; normalized dst <2/8/91, JPO>
|
|
|
|
lea.l FPTEMP(a6),a0 ; a0 <- addr(FPTEMP) <2/8/91, JPO>
|
|
bra t_resdnrm ; force unfl result <2/8/91, JPO>
|
|
|
|
@1: ; label added <2/8/91, JPO>
|
|
fmove.l USER_FPCR(a6),fpcr ;use user's rmode and precision
|
|
fmove.x FPTEMP(a6),fp0 ;return dest to fp0
|
|
rts
|
|
*
|
|
* FSCALE
|
|
*
|
|
pscalet:
|
|
* ;$26 fscale
|
|
* ;dtag,stag
|
|
dc.w sscale-pscalet ; 00,00 norm,norm = result
|
|
dc.w sscale-pscalet ; 00,01 norm,zero = fpn
|
|
dc.w scl_opr-pscalet ; 00,10 norm,inf = nan with operr
|
|
dc.w scl_snan-pscalet ; 00,11 norm,nan = nan
|
|
dc.w scl_zro-pscalet ; 01,00 zero,norm = +-zero
|
|
dc.w scl_zro-pscalet ; 01,01 zero,zero = +-zero
|
|
dc.w scl_opr-pscalet ; 01,10 zero,inf = nan with operr
|
|
dc.w scl_snan-pscalet ; 01,11 zero,nan = nan
|
|
dc.w scl_inf-pscalet ; 10,00 inf,norm = +-inf
|
|
dc.w scl_inf-pscalet ; 10,01 inf,zero = +-inf
|
|
dc.w scl_opr-pscalet ; 10,10 inf,inf = nan with operr
|
|
dc.w scl_snan-pscalet ; 10,11 inf,nan = nan
|
|
dc.w scl_dnan-pscalet ; 11,00 nan,norm = nan
|
|
dc.w scl_dnan-pscalet ; 11,01 nan,zero = nan
|
|
dc.w scl_dnan-pscalet ; 11,10 nan,inf = nan
|
|
dc.w scl_dnan-pscalet ; 11,11 nan,nan = nan
|
|
|
|
|
|
pscale:
|
|
bfextu STAG(a6){0:3},d0 ;stag in d0
|
|
bfextu DTAG(a6){0:3},d1 ;dtag in d1
|
|
bclr.l #2,d0 ;alias denorm into norm
|
|
bclr.l #2,d1 ;alias denorm into norm
|
|
lsl.b #2,d1
|
|
or.b d0,d1 ;d1{4:2} = dtag, d1{1:0} = stag
|
|
* ;dtag values stag values:
|
|
* ;000 = norm 00 = norm
|
|
* ;001 = zero 01 = zero
|
|
* ;010 = inf 10 = inf
|
|
* ;011 = nan 11 = nan
|
|
* ;100 = dnrm
|
|
*
|
|
*
|
|
lea.l pscalet,a1 ;load start of jump table
|
|
; move.l (a1,d1.w*4),a1 ;load a1 with label depending on tag - removed <1/2/91, JPO>
|
|
adda.w (a1,d1.w*2),a1 ; <1/2/91, JPO>
|
|
jmp (a1) ;go to the routine
|
|
|
|
scl_opr:
|
|
bra t_operr
|
|
|
|
scl_dnan:
|
|
bra dst_nan
|
|
|
|
scl_zro:
|
|
btst.b #sign_bit,FPTEMP_EX(a6) ;test if + or -
|
|
beq ld_pzero ;if pos then load +0
|
|
bra ld_mzero ;if neg then load -0
|
|
scl_inf:
|
|
btst.b #sign_bit,FPTEMP_EX(a6) ;test if + or -
|
|
beq.b ld_pinf ;if pos then load +inf
|
|
bra ld_minf ;else neg load -inf
|
|
scl_snan:
|
|
bra src_nan
|
|
*
|
|
* FSINCOS
|
|
*
|
|
|
|
ssincosz:
|
|
btst.b #sign_bit,ETEMP(a6) ;get sign
|
|
beq.b sincosp
|
|
; fmove.x MZERO,fp0 ; removed <1/2/91, JPO>
|
|
fmove.s MZERO,fp0 ; <1/2/91, JPO>
|
|
bra.b sincoscom
|
|
sincosp:
|
|
; fmove.x PZERO,fp0 ; deleted <1/2/91, JPO>
|
|
fmove.b #0,fp0 ; <1/2/91, JPO>
|
|
sincoscom:
|
|
fmovem.x PONE,fp1 ;do not allow FPSR to be affected
|
|
bra sto_cos ;store cosine result
|
|
|
|
|
|
ssincosi:
|
|
; fmove.x QNAN,fp1 ;load NAN - deleted <1/2/91, JPO>
|
|
; fmove.s QNAN,fp1 ; <1/2/91, JPO> - DELETED <4/9/91, JPO> <T3>
|
|
fmove.x QNAN,fp1 ; load extended quiet NaN <4/9/91, JPO> <T3>
|
|
bsr sto_cos ;store cosine result
|
|
; fmove.x QNAN,fp0 ;load NAN - deleted <1/2/91, JPO>
|
|
; fmove.s QNAN,fp1 ; <1/2/91, JPO> - DELETED <4/9/91, JPO> <T3>
|
|
bra t_operr
|
|
|
|
|
|
ssincosnan:
|
|
move.l ETEMP_EX(a6),FP_SCR1(a6)
|
|
move.l ETEMP_HI(a6),FP_SCR1+4(a6)
|
|
move.l ETEMP_LO(a6),FP_SCR1+8(a6)
|
|
bset.b #signan_bit,FP_SCR1+4(a6)
|
|
fmovem.x FP_SCR1(a6),fp1
|
|
bsr sto_cos
|
|
bra src_nan
|
|
*
|
|
* This code forces default values for the zero, inf, and nan cases
|
|
* in the transcendentals code. The CC bits must be set in the
|
|
* stacked FPSR to be correctly reported.
|
|
*
|
|
***Returns +PI/2
|
|
|
|
ld_ppi2:
|
|
; fmove.x PPIBY2,fp0 ;load +pi/2 - deleted <1/2/91, JPO>
|
|
fmove.x PIBY2,fp0 ; <1/2/91, JPO>
|
|
bra t_inx2 ;set inex2 exc
|
|
|
|
***Returns -PI/2
|
|
|
|
ld_mpi2:
|
|
fmove.x MPIBY2,fp0 ;load -pi/2
|
|
or.l #neg_mask,USER_FPSR(a6) ;set N bit
|
|
bra t_inx2 ;set inex2 exc
|
|
|
|
***Returns +inf
|
|
|
|
ld_pinf:
|
|
; fmove.x PINF,fp0 ;load +inf <1/2/91, JPO>
|
|
fmove.s #"$7f800000",fp0 ; <1/2/91, JPO>
|
|
or.l #inf_mask,USER_FPSR(a6) ;set I bit
|
|
rts
|
|
|
|
***Returns -inf
|
|
|
|
ld_minf:
|
|
; fmove.x MINF,fp0 ;load -inf <1/2/91, JPO>
|
|
fmove.s #"$ff800000",fp0 ; <1/2/91, JPO>
|
|
or.l #neg_mask+inf_mask,USER_FPSR(a6) ;set N and I bits
|
|
rts
|
|
|
|
***Returns +1
|
|
|
|
ld_pone:
|
|
fmove.x PONE,fp0 ;load +1
|
|
rts
|
|
|
|
***Returns -1
|
|
|
|
ld_mone:
|
|
; fmove.x MONE,fp0 ;load -1 - deleted <1/2/91, JPO>
|
|
fmove.b #-1,fp0 ; <1/2/91, JPO>
|
|
or.l #neg_mask,USER_FPSR(a6) ;set N bit
|
|
rts
|
|
|
|
***Returns +0
|
|
|
|
ld_pzero:
|
|
; fmove.x PZERO,fp0 ;load +0 - deleted <1/2/91, JPO>
|
|
fmove.b #0,fp0 ; <1/2/91, JPO>
|
|
or.l #z_mask,USER_FPSR(a6) ;set Z bit
|
|
rts
|
|
|
|
***Returns -0
|
|
|
|
ld_mzero:
|
|
; fmove.x MZERO,fp0 ;load -0 - deleted <1/2/91, JPO>
|
|
fmove.s MZERO,fp0 ; <1/2/91, JPO>
|
|
or.l #neg_mask+z_mask,USER_FPSR(a6) ;set N and Z bits
|
|
rts
|
|
|
|
|