mac-rom/Toolbox/InSANE/FPHWArith96.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

487 lines
14 KiB
Plaintext

;
; File: FPHWArith96.a
;
; Contains: HW Floating Point 96-bit routines for arithmetic functions of FP68K
;
; Written by: Apple Numerics Group, DSG
;
; Copyright: © 1985-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM2> 2/3/93 CSS Update from Horror:
; <H2> 9/29/92 BG Rolling in Jon Okada's latest fixes.
; <1> 10/24/91 SAM/KSM Rolled in Regatta file.
;
; Regatta Change History:
;
; <2> 5/28/91 SAM Merged from TERROR. [<2> Added Stuart McDonald's latest fixes
; (see below for details)]
; <1> 5/15/91 SAM Split off from TERROR Proj.
;
; Terror Change History:
;
; <1> 01/06/90 BG Added to TERROR/BBS for the time.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; File: FP881arith.a
;; Implementation of FP68K arithmetic functions calling MC68881.
;; Copyright Apple Computer, Inc. 1985,1986,1987,1989,1990
;; All Rights Reserved
;; Confidential and Proprietary to Apple Computer,Inc.
;;
;; Written by Clayton Lewis, begun 8 Feb 85.
;; Debugged by Stuart McDonald.
;;
;; Modification history:
;; Rev2: 16 May 85
;; Rev3: 17 May 85
;; Rev5: 27 May 85
;; Rev9: 17 Jun 85
;; Rev10:19 Dec 85 streamline convert and scalb in concert with FPCtrl
;; Rev11:16 Jun 86 CRL moved to MPW
;; Rev12:29 Sep 86 Made E2{int,long} handle {NaN,Inf,Out-of-range} ala SANE. -S.McD.
;; 29 Sep 86 Fixed spurious inexact in X2C's NanCreated. -S.McD.
;; 26 Dec 86 Comp2X no longer stomps on its input. -S.McD.
;; 27 Dec 86 Changes to ExitArgs routines: -S.McD.
;; 1) Added entry ExitProcExit for ProcExit finale;
;; 2) Now restore FPSR/FPCR before halt check.
;; 3) CompareCtnd now returns CCR in A1 instead of D1.
;; 05 Jan 87 Fixed Classify; now handles DENORMALNUMs properly. -S.McD.
;; 05 Jan 87 Scalb doesn't truncate subnormals to zero anymore. -S.McD.
;; 05 Jan 87 Logb now handles zero and INF properly. -S.McD.
;; 07 Jan 87 Scalb two days ago was buggy. Fixed now. -S.McD.
;; 11 Jan 87 Scalb doesn't truncate huge numbers to INF anymore. -S.McD.
;; 15 Jan 87 Changed status and copyright information. -S.McD.
;; 21 Jan 87 Cleaned up CompareCtnd code. -S.McD.
;; 21 Jan 87 Cleaned up CPXxxx entries. -S.McD.
;; 21 Jan 87 Cleaned up MoveQuot. -S.McD.
;; 21 Jan 87 Cleaned up NaNInput. -S.McD.
;; 23 Jan 87 Sqrt,Add,Div,Mul,Rem now return Apple's NaN codes. -S.McD.
;; 29 Jan 87 Apple NaN logic speeded up. -S.McD.
;; 29 Jan 87 Tossed FSCALE. It prematurely UNFLs/OVFLs on A93N mask. -S.McD.
;; Rev13:18 Dec 89 Complete rewrite begins. -S.McD.
;; 22 May 90 Goes alpha for waimea. Copyrights updated. -S.McD.
;; 7 Sep 90 Goes beta for Tim. Updated version number. -S.McD.
;; 30 Sep 90 Goes final for Terror alpha. -S.McD.
;; 19 May 91 Fixed spurious flag errors for FMOVEs in trap enabled cases.-S.McD.
;; 21 May 91 After first trap, futher traps MUST be disabled fix. -S.McD.
;; 30 Mar 92 Modified LOGB96 front-end code for new algorithm. -JPO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MACRO
FOPSRC96.&SZ &FOP
IF &SZ = 'C' THEN
&FOP..X FP1,FP0
.*
ELSE
.* All others (.W, .L, .S, .D, .X): operate directly into FP0.
&FOP..&SZ ([LKSRC,A6]),FP0
ENDIF
ENDM
MACRO
QOP96.&SZ &FOP,&OPCODE
.* Link required by trap handler to determine arguments.
LINK A6,#-LK2SIZE
.*
.* Popsize and opcode required by trap handler.
MOVE.L #LK2POP+&OPCODE,LKOP(A6)
.*
MOVE.L A0,-(SP)
IF &SZ = 'C' THEN
.* Convert comp sources into FP1.
COMP2FP1
ENDIF
MOVEA.L LKDST(A6),A0
IF &FOP <> 'FMOVE' THEN
.* Skip picking up DST if doing a conversion (FMOVE).
FMOVEM.X (A0),FP0 ;<5/19/91-S.McD.> <T2>
ENDIF
FOPSRC96.&SZ &FOP
FMOVE.X FP0,(A0)
MOVE.L (SP)+,A0
UNLK A6
RTD #8
ENDM
MACRO
QCPX96.&SZ &FOP,&OPCODE
.*
.* Link required by trap handler to determine arguments.
LINK A6,#-LK2SIZE
.*
.* Popsize and opcode required by trap handler.
MOVE.L #LK2POP+&OPCODE,LKOP(A6)
.*
MOVEM.L D0/A0,-(SP) ; MOVEM USED BECAUSE CCR IS UNAFFECTED
IF &SZ = 'C' THEN
.* Convert comp sources into FP1.
COMP2FP1
ENDIF
MOVEA.L LKDST(A6),A0
FMOVEM.X (A0),FP0 ;<5/19/91-S.McD.> <T2>
FOPSRC96.&SZ &FOP
FPSR2CCX
MOVEM.L (SP)+,D0/A0 ; MOVEM USED BECAUSE CCR IS UNAFFECTED
UNLK A6
RTD #8
ENDM
MACRO
QCMP96.&SZ &FOP,&OPCODE
.*
.* Link required by trap handler to determine arguments.
LINK A6,#-LK2SIZE
.*
.* Popsize and opcode required by trap handler.
MOVE.L #LK2POP+&OPCODE,LKOP(A6)
.*
MOVEM.L D0/A0,-(SP) ; MOVEM USED BECAUSE CCR IS UNAFFECTED
IF &SZ = 'C' THEN
.* Convert comp sources into FP1.
COMP2FP1
ENDIF
MOVEA.L LKDST(A6),A0
FMOVEM.X (A0),FP0 ;<5/19/91-S.McD.> <T2>
FOPSRC96.&SZ &FOP
FPSR2CC
MOVEM.L (SP)+,D0/A0 ; MOVEM USED BECAUSE CCR IS UNAFFECTED
UNLK A6
RTD #8
ENDM
MACRO
QREM96.&SZ &FOP,&OPCODE
.*
.* Link required by trap handler to determine arguments.
LINK A6,#-LK2SIZE
.*
.* Popsize and opcode by trap handler.
MOVE.L #LK2POP+&OPCODE,LKOP(A6)
.*
MOVE.L A0,-(SP)
IF &SZ = 'C' THEN
.* Convert comp sources into FP1.
COMP2FP1
ENDIF
MOVEA.L LKDST(A6),A0
FMOVEM.X (A0),FP0 ;<5/19/91-S.McD.> <T2>
FOPSRC96.&SZ &FOP
FMOVE.X FP0,(A0)
BSR MOVEQUOT
MOVE.L (SP)+,A0
UNLK A6
RTD #8
ENDM
MACRO
QX2Z96.&SZ &FOP,&OPCODE
.*
.* Link required by trap handler to determine arguments.
LINK A6,#-LK2SIZE
.*
.* Popsize and opcode required by trap handler.
MOVE.L #LK2POP+&OPCODE,LKOP(A6)
.*
MOVE.L A0,-(SP)
MOVEA.L LKSRC(A6),A0
FMOVEM.X (A0),FP0 ; FP0 := SRC <5/19/91-S.McD.> <T2>
IF &SZ = 'C' THEN
FMOVEM.X FP0,-(SP) ;<5/19/91-S.McD.> <T2>
BRA QX2CENTRY
.*
ELSEIF (&SZ = 'W') OR (&SZ = 'L') THEN
.* ; X-TO-{W OR L}; AVOIDS (INV,INX) RTN
FMOVEM.L FPCR/FPSR,-(SP) ; SAVE ENV. TO AVOID SPURIOUS INX
MOVE.L (SP),-(SP) ; REPLICATE FPCR
CLR.B 2(SP) ; CLEAR ALL TRAP ENABLES <5/21/91-S.McD.> <T2>
FMOVE.L (SP)+,FPCR ; DISABLE TRAPPING FOR NEXT FOP
MOVEA.L LKDST(A6),A0 ; A0 := ADDRESS OF DST
FMOVE.&SZ FP0,(A0) ; SPURIOUS INEXACT DISABLED!
FMOVE.L FPSR,-(SP) ; PICK UP PREVIOUS OP FLAGS
BTST.B #5,2(SP) ; DID IT SIGNAL INVALID?
ADDQ #4,SP ; POP IT (CC NOT EFFECTED)
FMOVEM.L (SP)+,FPCR/FPSR ; RESTORE OLD ENV (CC NOT EFFECTED)
BEQ.S @0 ; IF NOT, BRANCH: TYPICAL CASE
; INVALID CASE:
FMOVE.S #"$7FBFFFFF",FP1 ; SIGNAL INVALID USING FLOAT SNAN
BRA.S @1
@0: ; TYPICAL CASE:
FMOVE.&SZ FP0,(A0) ; RE-EXECUTE TO PICK UP INX SIG.
@1:
FNOP ; (FNOP CATCHES SIG. BEFORE RTS)
ELSE
.*
.* All others {.S OR .D}: move directly into memory.
MOVEA.L LKDST(A6),A0
&FOP..&SZ FP0,(A0)
FNOP ; (FNOP CATCHES SIG. BEFORE RTS)
ENDIF
MOVE.L (SP)+,A0
UNLK A6
RTD #8
ENDM
MACRO
QOP196.&SZ &FOP,&OPCODE
.* This macro is used by the one argument functions: FSQRT, FINT, FINTRZ.
.*
.* Link required by trap handler to determine arguments.
LINK A6,#-LK1SIZE
.*
.* Popsize and opcode required by trap handler.
MOVE.L #LK1POP+&OPCODE,LKOP(A6)
.*
MOVE.L A0,-(SP)
MOVEA.L LKDST(A6),A0
&FOP..X (A0),FP0
FMOVE.X FP0,(A0)
MOVE.L (SP)+,A0
UNLK A6
RTD #4
ENDM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ADDITION96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QADDX96:
QOP96.X FADD, FFEXT+FOADD+FFEXT96
QADDS96:
QOP96.S FADD, FFSGL+FOADD+FFEXT96
QADDD96:
QOP96.D FADD, FFDBL+FOADD+FFEXT96
QADDI96:
QOP96.W FADD, FFINT+FOADD+FFEXT96
QADDL96:
QOP96.L FADD, FFLNG+FOADD+FFEXT96
QADDC96:
QOP96.C FADD, FFCOMP+FOADD+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SUBTRACTION96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QSUBX96:
QOP96.X FSUB, FFEXT+FOSUB+FFEXT96
QSUBS96:
QOP96.S FSUB, FFSGL+FOSUB+FFEXT96
QSUBD96:
QOP96.D FSUB, FFDBL+FOSUB+FFEXT96
QSUBI96:
QOP96.W FSUB, FFINT+FOSUB+FFEXT96
QSUBL96:
QOP96.L FSUB, FFLNG+FOSUB+FFEXT96
QSUBC96:
QOP96.C FSUB, FFCOMP+FOSUB+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MULTIPLICATION96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QMULX96:
QOP96.X FMUL, FFEXT+FOMUL+FFEXT96
QMULS96:
QOP96.S FMUL, FFSGL+FOMUL+FFEXT96
QMULD96:
QOP96.D FMUL, FFDBL+FOMUL+FFEXT96
QMULI96:
QOP96.W FMUL, FFINT+FOMUL+FFEXT96
QMULL96:
QOP96.L FMUL, FFLNG+FOMUL+FFEXT96
QMULC96:
QOP96.C FMUL, FFCOMP+FOMUL+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DIVISION96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QDIVX96:
QOP96.X FDIV, FFEXT+FODIV+FFEXT96
QDIVS96:
QOP96.S FDIV, FFSGL+FODIV+FFEXT96
QDIVD96:
QOP96.D FDIV, FFDBL+FODIV+FFEXT96
QDIVI96:
QOP96.W FDIV, FFINT+FODIV+FFEXT96
QDIVL96:
QOP96.L FDIV, FFLNG+FODIV+FFEXT96
QDIVC96:
QOP96.C FDIV, FFCOMP+FODIV+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; COMPARISON96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QCPXX96:
QCPX96.X FCMP, FFEXT+FOCPX+FFEXT96
QCPXS96:
QCPX96.S FCMP, FFSGL+FOCPX+FFEXT96
QCPXD96:
QCPX96.D FCMP, FFDBL+FOCPX+FFEXT96
QCPXI96:
QCPX96.W FCMP, FFINT+FOCPX+FFEXT96
QCPXL96:
QCPX96.L FCMP, FFLNG+FOCPX+FFEXT96
QCPXC96:
QCPX96.C FCMP, FFCOMP+FOCPX+FFEXT96
QCMPX96:
QCMP96.X FCMP, FFEXT+FOCMP+FFEXT96
QCMPS96:
QCMP96.S FCMP, FFSGL+FOCMP+FFEXT96
QCMPD96:
QCMP96.D FCMP, FFDBL+FOCMP+FFEXT96
QCMPI96:
QCMP96.W FCMP, FFINT+FOCMP+FFEXT96
QCMPL96:
QCMP96.L FCMP, FFLNG+FOCMP+FFEXT96
QCMPC96:
QCMP96.C FCMP, FFCOMP+FOCMP+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; REMAINDER96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QREMX96:
QREM96.X FREM, FFEXT+FOREM+FFEXT96
QREMS96:
QREM96.S FREM, FFSGL+FOREM+FFEXT96
QREMD96:
QREM96.D FREM, FFDBL+FOREM+FFEXT96
QREMI96:
QREM96.W FREM, FFINT+FOREM+FFEXT96
QREML96:
QREM96.L FREM, FFLNG+FOREM+FFEXT96
QREMC96:
QREM96.C FREM, FFCOMP+FOREM+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; CONVERSIONS96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QX2X96:
QOP96.X FMOVE, FFEXT+FOZ2X+FFEXT96
QS2X96:
QOP96.S FMOVE, FFSGL+FOZ2X+FFEXT96
QD2X96:
QOP96.D FMOVE, FFDBL+FOZ2X+FFEXT96
QI2X96:
QOP96.W FMOVE, FFINT+FOZ2X+FFEXT96
QL2X96:
QOP96.L FMOVE, FFLNG+FOZ2X+FFEXT96
QC2X96:
QOP96.C FMOVE, FFCOMP+FOZ2X+FFEXT96
QX2S96:
QX2Z96.S FMOVE, FFSGL+FOX2Z+FFEXT96
QX2D96:
QX2Z96.D FMOVE, FFDBL+FOX2Z+FFEXT96
QX2I96:
QX2Z96.W FMOVE, FFINT+FOX2Z+FFEXT96
QX2L96:
QX2Z96.L FMOVE, FFLNG+FOX2Z+FFEXT96
QX2C96:
QX2Z96.C FMOVE, FFCOMP+FOX2Z+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQUARE ROOT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QSQRTX96:
QOP196.X FSQRT, FOSQRT+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ROUND TO INTEGRAL VALUE96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QRINTX96:
QOP196.X FINT, FORTI+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TRUNCATE TO INTEGRAL VALUE96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QTINTX96:
QOP196.X FINTRZ, FOTTI+FFEXT96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SCALB96 ...THIS CODE WILL FLUSH SUBNORMS TO ZERO ON OLD MASK A93N 881s!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QSCALBX96: ; NOTE: FSCALE.W REQUIRES |D0| < 2^14.
LINK A6,#-LK2SIZE
MOVE.L #LK2POP+FFINT+FOSCALB+FFEXT96,LKOP(A6)
MOVEM.L D0/A0,-(SP)
MOVEA.L LKDST(A6),A0
FMOVEM.X (A0),FP0 ;<5/19/91-S.McD.> <T2>
BRA QSCALBENTRY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LOGB96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QLOGBX96:
LINK A6,#-LK1SIZE
MOVE.L #LK1POP+FOLOGB+FFEXT96,LKOP(A6)
; MOVE.L A0,-(SP) ; DELETED <3/30/92, JPO>
movem.l a0/d0,-(sp) ; new routine uses A0/D0 <3/30/92, JPO>
MOVEA.L LKDST(A6),A0
; FABS.X (A0),FP0 ; DELETED <3/30/92, JPO>
BRA QLOGBXENTRY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; CLASSIFY96
;; CLASS PLACES INTEGER CODE AT DST ADDRESS. THE CODE TIES
;; IN USEFULLY WITH THE PASCAL ENUMERATED TYPES IN SANE.
;; IT IS THE SANE VALUE PLUS ONE, WITH THE SIGN OF THE INPUT
;; OPERAND. IN SANE, THE SIGN IS PLACED IN A SEPARATE INT.
;; THE VALUES ARE THUS:
;; SNAN 1 ...GADZOOKS! WHY ALL THIS CODE FOR CLASSIFY?!!?
;; QNAN 2 ...WELL, WE NOW NORMALIZE UNNORMAL NUMS BEFORE
;; INF 3 ...CLASSIFICATION. ALSO, THIS CODE AVOIDS USING
;; ZERO 4 ...THE FPU AND IS OPTIMIZED FOR THE TYPICAL CASE.
;; NORMAL 5 ...IT'S STILL GROSS, IN RETROSPECT.
;; DENORM 6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QCLASSX96:
FMOVEM.X ([8,SP]),FP0; REGISTERLESSLY PUSH SRC 96 ARGUMENT
FMOVEM.X FP0,-(SP)
MOVE.W (SP)+,(SP) ; POP EXPONENT WORD INTO JUNK WORD LEAVING 80BIT TMP
PEA (SP) ; PUSH NEW TMP SRC ADDRESS
MOVE.L 4+10+4(SP),-(SP); PUSH USER'S DST ADDRESS
BSR QCLASSX ; CLASSIFY IT
LEA 10(SP),SP ; POP 80 BIT TMP
RTD #8 ; RETURN