mac-rom/OS/FPUEmulation/DoFunc.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

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