.TITLE P$EXP - EXP .IDENT /831004/ .MCALL .PRINT ; USAGE: ; Y := EXP(X) ; LONGREAL PARAMETER X ON TOP OF STACK ; LONGREAL RESULT RETURNED ON TOP OF STACK ; REGISTER USAGE: ; R0 - SCRATCH ; R3,R4 - SCRATCH (SAVED/RESTORED) ; F0,F1,F2,F3 - SCRATCH (SAVED/RESTORED) ; F0=%0 F1=%1 F2=%2 F3=%3 OFFSET=38. ;PARAMETER/RETURNED VALUE OFFSET $$$103:: P$EXP:: MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4 STD F0,-(SP) STD F1,-(SP) ;SAVE F0-F3 STD F2,-(SP) STD F3,-(SP) MOV OFFSET(SP),R0 ;HIGH ORDER ARG BGT POS ;JUMP IF + CMP R0,#141660 ;ARG IS - BHI ZERO ;JUMP IF ARG <88.7 BR SMTST ;JUMP TO TEST SMALL MAGNITUDE ARG POS: CMP R0,#041660 BHI OVER ;JUMP IF ARG >87 SMTST: ASL R0 ;DUMP SIGN CMP R0,#063000 BLO ONE ;JUMP IF ARG MAGNITUDE <2**-60 MOV #FCONST,R0 ;POINTER TO CONSTANTS LDD OFFSET(SP),F2 ;GET ARGUMENT MODD (R0)+,F2 ;F2=FRACT(X*LOG2(E)) STCDI F3,R4 ;Z=INT(X*LOG2(E)) TSTD F2 CFCC BGE M16 ;TEST F2 ADDD #^O040200,F2 ;MAKE F2 POSITIVE DEC R4 ;AND ADJUST Z=Z-1 M16: MODD #^O041200,F2 ;F2=FRACT(16*(X*LOG2(E)-FLOAT(Z))) STCDI F3,R3 ;D=INT (16*(... DIVD #^O041200,F2 ;E=F2 / 16 LDD F2,F3 MULD F3,F3 ;E*E LDD F3,F1 ADDD (R0)+,F1 ;A=E*E+Q0 MULD (R0)+,F3 ADDD (R0)+,F3 MULD F2,F3 ;B=(E*E*P1 + P0)*E LDD F1,F0 ADDD F3,F0 ;A+B SUBD F3,F1 ;A-B DIVD F1,F0 ;(A+B)/(A-B) SCALE: ASR R3 ;SHIFT D BCC NOMULT MULD (R0)+,F0 ;MULTIPLY BY ROOT OF 2 BR SCALE NOMULT: BEQ SCALE1 ADD #8.,R0 ;POINT TO NEXT ROOT OF 2 BR SCALE SCALE1: STD F0,OFFSET(SP) ;MOVE RESULT TO STACK MOV OFFSET(SP),R0 ;GET HIGH ORDER PART SWAB R4 ;CONVERT Z TO EXPONENT MODIFIER CLRB R4 ASR R4 ADD R4,R0 ;APPLY TO RESULT BMI OVER ;JUMP IF OVERFLOW MOV R0,OFFSET(SP) ;REPLACE EXPONENT OF RESULT BR RET ;EXIT ONE: LDD #^O040200,F0 ;RESULT IS 1.0 BR ENDEXP OVER: .PRINT #OVRFLW ;FLOATING OVERFLOW BR ERROR ZERO: .PRINT #UNDFLW ;FLOATING UNDERFLOW ERROR: CLRD F0 ;RESULT IS 0.0 ; ENDEXP: STD F0,OFFSET(SP) ;PUT RESULT ON STACK RET: LDD (SP)+,F3 LDD (SP)+,F2 LDD (SP)+,F1 LDD (SP)+,F0 MOV (SP)+,R4 MOV (SP)+,R3 RTS PC ; ; ORDER-DEPENDENT CONSTANTS ; R0 POINTS TO NEXT CONSTANT. ; FCONST: .WORD 40270,125073,024534,013761 ;LOG2(E) .WORD 041246,101232,074433,171042 ;Q0 .WORD 037154,113360,153011,153703 ;P1 .WORD 040746,152405,015345,033343 ;P0 .WORD 040205,125303,063714,044173 ;2**1/16 .WORD 040213,112701,161752,105727 ;2**1/8 .WORD 040230,033760,050615,134251 ;2**1/4 .WORD 040265,002363,031771,157145 ;2**1/2 OVRFLW: .ASCIZ /? EXP FLOATING OVERFLOW/ UNDFLW: .ASCIZ /? EXP FLOATING UNDERFLOW/ .EVEN .END