mirror of
https://github.com/elliotnunn/sys7.1-doc-wip.git
synced 2024-11-19 06:30:59 +00:00
487 lines
14 KiB
Plaintext
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
|