Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/rts/mat.mac
There is 1 other file named mat.mac in the archive. Click here to see a list.
	SEARCH	SIMMAC,SIMRPA
	SALL
	RTITLE	TAN
	MACINIT
	SUBTTL TAN - SINGLE PRECISION TANGENT ROUTINE

; REWRITE OF ATLAS EXTRACODE 1735

; METHOD:
;
; X = (N+Y)*PI/2, WHERE N IS AN INTEGER, AND -0.5 <= Y < 0.5
;
; IF N IS EVEN, TAN(X) = P(Y)/(1 - Y^2)
;
; IF N IS ODD, TAN(X) = -(1 - Y^2)/P(Y)
;
; WHERE P(Y) IS AN ODD POLYNOMIAL IN Y

; ON ENTRY:
; THE ADDRESS OF THE  ARGUMENT (X) IS IN 0(X16)
; THE LINK IS ON THE STACK
; ON EXIT, THE RESULT IS IN X0

	ENTRY TAN.



TAN.:	PROC
	SAVE	<X3,X4,X5>
	L	X0,@(X16)
	JUMPE	X0,L4		; QUICK EXIT FOR ZERO
	FMPR	X0,[
	XWD	200505,746034]	; MULTIPLY BY 2/PI
	MOVM	X2,X0		; ABS(X)/(PI/2)
	MOVEI	X1,1		; SET FLAG FOR EVEN N
	CAMGE	X2,[
	XWD	200400,000000]	; LESS THAN 0.5?
	JRST	L1		; YES - TAKE SHORT CUT
	FSBRI	X2,200400	; NO - SUBTRACT 0.5
	MULI	X2,400		; SEPARATE EXPONENT AND MANTISSA
	EXCH	X2,X3		; THINGS ARE NOW THE WRONG WAY ROUND
	MOVEI	X1,0
	CAIL	X3,233		; WILL SHIFT CAUSE LOSS OF MANTISSA?
	TDZA	X2,X2		; YES - SAVE A LOT OF WORK
	ASHC	X1,-200(X3)	; SHIFT OUT INTEGER PART
	ANDI	X1,1		; SET ODD/EVEN FLAG FOR N
	LSH	X2,-10
	TLO	X2,200000	; AND FIX UP NEW EXPONENT
	FSBRI	X2,200400	; SUBTRACT 0.5 TO GET Y
L1():	MOVE	X3,X2		; SAVE Y
	FMPR	X2,X2		; SAVE Y^2
	MOVEI	X5,3
	MOVE	X4,TAN7

L2():	FMPR	X4,X2
	FADR	X4,TAN6(X5)
	SOJGE	X5,L2
	FMPR	X4,X3		; FORM -P(Y)
	MOVN	X2,X2
	FADRI	X2,201400	; FORM 1 - Y^2
	JUMPN	X1,L3		; N ODD?
	EXCH	X4,X2		; YES - EXCHANGE OPERANDS
	MOVN	X0,X0		; AND INVERT ARGUMENT SIGN

L3():	FDVR	X4,X2		; FORM FINAL RESULT
	EXCH	X0,X4		; LOAD UP RESULT
	JUMPGE	X4,L4		; SHOULD IT BE NEGATIVE?
	MOVN	X0,X0		; YES - NEGATE IT

L4():	RETURN
	EPROC

TAN6:	XWD	201622,077325	; PI/2
	XWD	600342,340621	; PI/2*((PI/2)^2/3 - 1)
	XWD	604353,774024	; (PI/2)^3*((PI/2)^2*2/15 - 1/3)
	XWD	610120,631722	; (PI/2)^5*((PI/2)^2*17/315 - 2/15)
TAN7:	XWD	613217,113617	; (PI/2)^7*((PI/2)^2*62/2835 - 17/315)

	END