Home | History | Annotate | Line # | Download | only in fpsp
stan.sa revision 1.3.32.1
      1  1.3.32.1   bouyer *	$NetBSD: stan.sa,v 1.3.32.1 2000/11/20 20:11:37 bouyer Exp $
      2       1.3      cgd 
      3       1.1  mycroft *	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
      4       1.1  mycroft *	M68000 Hi-Performance Microprocessor Division
      5       1.1  mycroft *	M68040 Software Package 
      6       1.1  mycroft *
      7       1.1  mycroft *	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
      8       1.1  mycroft *	All rights reserved.
      9       1.1  mycroft *
     10       1.1  mycroft *	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
     11       1.1  mycroft *	To the maximum extent permitted by applicable law,
     12       1.1  mycroft *	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
     13       1.1  mycroft *	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
     14       1.1  mycroft *	PARTICULAR PURPOSE and any warranty against infringement with
     15       1.1  mycroft *	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
     16       1.1  mycroft *	and any accompanying written materials. 
     17       1.1  mycroft *
     18       1.1  mycroft *	To the maximum extent permitted by applicable law,
     19       1.1  mycroft *	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
     20       1.1  mycroft *	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
     21       1.1  mycroft *	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
     22       1.1  mycroft *	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
     23       1.1  mycroft *	SOFTWARE.  Motorola assumes no responsibility for the maintenance
     24       1.1  mycroft *	and support of the SOFTWARE.  
     25       1.1  mycroft *
     26       1.1  mycroft *	You are hereby granted a copyright license to use, modify, and
     27       1.1  mycroft *	distribute the SOFTWARE so long as this entire notice is retained
     28       1.1  mycroft *	without alteration in any modified and/or redistributed versions,
     29       1.1  mycroft *	and that such modified versions are clearly identified as such.
     30       1.1  mycroft *	No licenses are granted by implication, estoppel or otherwise
     31       1.1  mycroft *	under any patents or trademarks of Motorola, Inc.
     32       1.1  mycroft 
     33       1.1  mycroft *
     34       1.1  mycroft *	stan.sa 3.3 7/29/91
     35       1.1  mycroft *
     36       1.1  mycroft *	The entry point stan computes the tangent of
     37       1.1  mycroft *	an input argument;
     38       1.1  mycroft *	stand does the same except for denormalized input.
     39       1.1  mycroft *
     40       1.1  mycroft *	Input: Double-extended number X in location pointed to
     41       1.1  mycroft *		by address register a0.
     42       1.1  mycroft *
     43       1.1  mycroft *	Output: The value tan(X) returned in floating-point register Fp0.
     44       1.1  mycroft *
     45       1.1  mycroft *	Accuracy and Monotonicity: The returned result is within 3 ulp in
     46       1.1  mycroft *		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
     47       1.1  mycroft *		result is subsequently rounded to double precision. The
     48       1.1  mycroft *		result is provably monotonic in double precision.
     49       1.1  mycroft *
     50       1.1  mycroft *	Speed: The program sTAN takes approximately 170 cycles for
     51  1.3.32.1   bouyer *		input argument X such that |X| < 15Pi, which is the usual
     52       1.1  mycroft *		situation.
     53       1.1  mycroft *
     54       1.1  mycroft *	Algorithm:
     55       1.1  mycroft *
     56       1.1  mycroft *	1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.
     57       1.1  mycroft *
     58       1.1  mycroft *	2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
     59       1.1  mycroft *		k = N mod 2, so in particular, k = 0 or 1.
     60       1.1  mycroft *
     61       1.1  mycroft *	3. If k is odd, go to 5.
     62       1.1  mycroft *
     63       1.1  mycroft *	4. (k is even) Tan(X) = tan(r) and tan(r) is approximated by a
     64       1.1  mycroft *		rational function U/V where
     65       1.1  mycroft *		U = r + r*s*(P1 + s*(P2 + s*P3)), and
     66       1.1  mycroft *		V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))),  s = r*r.
     67       1.1  mycroft *		Exit.
     68       1.1  mycroft *
     69       1.1  mycroft *	4. (k is odd) Tan(X) = -cot(r). Since tan(r) is approximated by a
     70       1.1  mycroft *		rational function U/V where
     71       1.1  mycroft *		U = r + r*s*(P1 + s*(P2 + s*P3)), and
     72       1.1  mycroft *		V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))), s = r*r,
     73       1.1  mycroft *		-Cot(r) = -V/U. Exit.
     74       1.1  mycroft *
     75       1.1  mycroft *	6. If |X| > 1, go to 8.
     76       1.1  mycroft *
     77       1.1  mycroft *	7. (|X|<2**(-40)) Tan(X) = X. Exit.
     78       1.1  mycroft *
     79       1.1  mycroft *	8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 2.
     80       1.1  mycroft *
     81       1.1  mycroft 
     82       1.1  mycroft STAN	IDNT	2,1 Motorola 040 Floating Point Software Package
     83       1.1  mycroft 
     84       1.1  mycroft 	section	8
     85       1.1  mycroft 
     86       1.1  mycroft 	include fpsp.h
     87       1.1  mycroft 
     88       1.1  mycroft BOUNDS1	DC.L $3FD78000,$4004BC7E
     89       1.1  mycroft TWOBYPI	DC.L $3FE45F30,$6DC9C883
     90       1.1  mycroft 
     91       1.1  mycroft TANQ4	DC.L $3EA0B759,$F50F8688
     92       1.1  mycroft TANP3	DC.L $BEF2BAA5,$A8924F04
     93       1.1  mycroft 
     94       1.1  mycroft TANQ3	DC.L $BF346F59,$B39BA65F,$00000000,$00000000
     95       1.1  mycroft 
     96       1.1  mycroft TANP2	DC.L $3FF60000,$E073D3FC,$199C4A00,$00000000
     97       1.1  mycroft 
     98       1.1  mycroft TANQ2	DC.L $3FF90000,$D23CD684,$15D95FA1,$00000000
     99       1.1  mycroft 
    100       1.1  mycroft TANP1	DC.L $BFFC0000,$8895A6C5,$FB423BCA,$00000000
    101       1.1  mycroft 
    102       1.1  mycroft TANQ1	DC.L $BFFD0000,$EEF57E0D,$A84BC8CE,$00000000
    103       1.1  mycroft 
    104       1.1  mycroft INVTWOPI DC.L $3FFC0000,$A2F9836E,$4E44152A,$00000000
    105       1.1  mycroft 
    106       1.1  mycroft TWOPI1	DC.L $40010000,$C90FDAA2,$00000000,$00000000
    107       1.1  mycroft TWOPI2	DC.L $3FDF0000,$85A308D4,$00000000,$00000000
    108       1.1  mycroft 
    109       1.1  mycroft *--N*PI/2, -32 <= N <= 32, IN A LEADING TERM IN EXT. AND TRAILING
    110       1.1  mycroft *--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG, THUS N*PI/2 IS AT
    111       1.1  mycroft *--MOST 69 BITS LONG.
    112       1.1  mycroft 	xdef	PITBL
    113       1.1  mycroft PITBL:
    114       1.1  mycroft   DC.L  $C0040000,$C90FDAA2,$2168C235,$21800000
    115       1.1  mycroft   DC.L  $C0040000,$C2C75BCD,$105D7C23,$A0D00000
    116       1.1  mycroft   DC.L  $C0040000,$BC7EDCF7,$FF523611,$A1E80000
    117       1.1  mycroft   DC.L  $C0040000,$B6365E22,$EE46F000,$21480000
    118       1.1  mycroft   DC.L  $C0040000,$AFEDDF4D,$DD3BA9EE,$A1200000
    119       1.1  mycroft   DC.L  $C0040000,$A9A56078,$CC3063DD,$21FC0000
    120       1.1  mycroft   DC.L  $C0040000,$A35CE1A3,$BB251DCB,$21100000
    121       1.1  mycroft   DC.L  $C0040000,$9D1462CE,$AA19D7B9,$A1580000
    122       1.1  mycroft   DC.L  $C0040000,$96CBE3F9,$990E91A8,$21E00000
    123       1.1  mycroft   DC.L  $C0040000,$90836524,$88034B96,$20B00000
    124       1.1  mycroft   DC.L  $C0040000,$8A3AE64F,$76F80584,$A1880000
    125       1.1  mycroft   DC.L  $C0040000,$83F2677A,$65ECBF73,$21C40000
    126       1.1  mycroft   DC.L  $C0030000,$FB53D14A,$A9C2F2C2,$20000000
    127       1.1  mycroft   DC.L  $C0030000,$EEC2D3A0,$87AC669F,$21380000
    128       1.1  mycroft   DC.L  $C0030000,$E231D5F6,$6595DA7B,$A1300000
    129       1.1  mycroft   DC.L  $C0030000,$D5A0D84C,$437F4E58,$9FC00000
    130       1.1  mycroft   DC.L  $C0030000,$C90FDAA2,$2168C235,$21000000
    131       1.1  mycroft   DC.L  $C0030000,$BC7EDCF7,$FF523611,$A1680000
    132       1.1  mycroft   DC.L  $C0030000,$AFEDDF4D,$DD3BA9EE,$A0A00000
    133       1.1  mycroft   DC.L  $C0030000,$A35CE1A3,$BB251DCB,$20900000
    134       1.1  mycroft   DC.L  $C0030000,$96CBE3F9,$990E91A8,$21600000
    135       1.1  mycroft   DC.L  $C0030000,$8A3AE64F,$76F80584,$A1080000
    136       1.1  mycroft   DC.L  $C0020000,$FB53D14A,$A9C2F2C2,$1F800000
    137       1.1  mycroft   DC.L  $C0020000,$E231D5F6,$6595DA7B,$A0B00000
    138       1.1  mycroft   DC.L  $C0020000,$C90FDAA2,$2168C235,$20800000
    139       1.1  mycroft   DC.L  $C0020000,$AFEDDF4D,$DD3BA9EE,$A0200000
    140       1.1  mycroft   DC.L  $C0020000,$96CBE3F9,$990E91A8,$20E00000
    141       1.1  mycroft   DC.L  $C0010000,$FB53D14A,$A9C2F2C2,$1F000000
    142       1.1  mycroft   DC.L  $C0010000,$C90FDAA2,$2168C235,$20000000
    143       1.1  mycroft   DC.L  $C0010000,$96CBE3F9,$990E91A8,$20600000
    144       1.1  mycroft   DC.L  $C0000000,$C90FDAA2,$2168C235,$1F800000
    145       1.1  mycroft   DC.L  $BFFF0000,$C90FDAA2,$2168C235,$1F000000
    146       1.1  mycroft   DC.L  $00000000,$00000000,$00000000,$00000000
    147       1.1  mycroft   DC.L  $3FFF0000,$C90FDAA2,$2168C235,$9F000000
    148       1.1  mycroft   DC.L  $40000000,$C90FDAA2,$2168C235,$9F800000
    149       1.1  mycroft   DC.L  $40010000,$96CBE3F9,$990E91A8,$A0600000
    150       1.1  mycroft   DC.L  $40010000,$C90FDAA2,$2168C235,$A0000000
    151       1.1  mycroft   DC.L  $40010000,$FB53D14A,$A9C2F2C2,$9F000000
    152       1.1  mycroft   DC.L  $40020000,$96CBE3F9,$990E91A8,$A0E00000
    153       1.1  mycroft   DC.L  $40020000,$AFEDDF4D,$DD3BA9EE,$20200000
    154       1.1  mycroft   DC.L  $40020000,$C90FDAA2,$2168C235,$A0800000
    155       1.1  mycroft   DC.L  $40020000,$E231D5F6,$6595DA7B,$20B00000
    156       1.1  mycroft   DC.L  $40020000,$FB53D14A,$A9C2F2C2,$9F800000
    157       1.1  mycroft   DC.L  $40030000,$8A3AE64F,$76F80584,$21080000
    158       1.1  mycroft   DC.L  $40030000,$96CBE3F9,$990E91A8,$A1600000
    159       1.1  mycroft   DC.L  $40030000,$A35CE1A3,$BB251DCB,$A0900000
    160       1.1  mycroft   DC.L  $40030000,$AFEDDF4D,$DD3BA9EE,$20A00000
    161       1.1  mycroft   DC.L  $40030000,$BC7EDCF7,$FF523611,$21680000
    162       1.1  mycroft   DC.L  $40030000,$C90FDAA2,$2168C235,$A1000000
    163       1.1  mycroft   DC.L  $40030000,$D5A0D84C,$437F4E58,$1FC00000
    164       1.1  mycroft   DC.L  $40030000,$E231D5F6,$6595DA7B,$21300000
    165       1.1  mycroft   DC.L  $40030000,$EEC2D3A0,$87AC669F,$A1380000
    166       1.1  mycroft   DC.L  $40030000,$FB53D14A,$A9C2F2C2,$A0000000
    167       1.1  mycroft   DC.L  $40040000,$83F2677A,$65ECBF73,$A1C40000
    168       1.1  mycroft   DC.L  $40040000,$8A3AE64F,$76F80584,$21880000
    169       1.1  mycroft   DC.L  $40040000,$90836524,$88034B96,$A0B00000
    170       1.1  mycroft   DC.L  $40040000,$96CBE3F9,$990E91A8,$A1E00000
    171       1.1  mycroft   DC.L  $40040000,$9D1462CE,$AA19D7B9,$21580000
    172       1.1  mycroft   DC.L  $40040000,$A35CE1A3,$BB251DCB,$A1100000
    173       1.1  mycroft   DC.L  $40040000,$A9A56078,$CC3063DD,$A1FC0000
    174       1.1  mycroft   DC.L  $40040000,$AFEDDF4D,$DD3BA9EE,$21200000
    175       1.1  mycroft   DC.L  $40040000,$B6365E22,$EE46F000,$A1480000
    176       1.1  mycroft   DC.L  $40040000,$BC7EDCF7,$FF523611,$21E80000
    177       1.1  mycroft   DC.L  $40040000,$C2C75BCD,$105D7C23,$20D00000
    178       1.1  mycroft   DC.L  $40040000,$C90FDAA2,$2168C235,$A1800000
    179       1.1  mycroft 
    180       1.1  mycroft INARG	equ	FP_SCR4
    181       1.1  mycroft 
    182       1.1  mycroft TWOTO63 equ     L_SCR1
    183       1.1  mycroft ENDFLAG	equ	L_SCR2
    184       1.1  mycroft N       equ     L_SCR3
    185       1.1  mycroft 
    186       1.1  mycroft 	xref	t_frcinx
    187       1.1  mycroft 	xref	t_extdnrm
    188       1.1  mycroft 
    189       1.1  mycroft 	xdef	stand
    190       1.1  mycroft stand:
    191       1.1  mycroft *--TAN(X) = X FOR DENORMALIZED X
    192       1.1  mycroft 
    193       1.1  mycroft 	bra		t_extdnrm
    194       1.1  mycroft 
    195       1.1  mycroft 	xdef	stan
    196       1.1  mycroft stan:
    197       1.1  mycroft 	FMOVE.X		(a0),FP0	...LOAD INPUT
    198       1.1  mycroft 
    199       1.1  mycroft 	MOVE.L		(A0),D0
    200       1.1  mycroft 	MOVE.W		4(A0),D0
    201       1.1  mycroft 	ANDI.L		#$7FFFFFFF,D0
    202       1.1  mycroft 
    203       1.1  mycroft 	CMPI.L		#$3FD78000,D0		...|X| >= 2**(-40)?
    204       1.1  mycroft 	BGE.B		TANOK1
    205       1.1  mycroft 	BRA.W		TANSM
    206       1.1  mycroft TANOK1:
    207       1.1  mycroft 	CMPI.L		#$4004BC7E,D0		...|X| < 15 PI?
    208       1.1  mycroft 	BLT.B		TANMAIN
    209       1.1  mycroft 	BRA.W		REDUCEX
    210       1.1  mycroft 
    211       1.1  mycroft 
    212       1.1  mycroft TANMAIN:
    213       1.1  mycroft *--THIS IS THE USUAL CASE, |X| <= 15 PI.
    214       1.1  mycroft *--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
    215       1.1  mycroft 	FMOVE.X		FP0,FP1
    216       1.1  mycroft 	FMUL.D		TWOBYPI,FP1	...X*2/PI
    217       1.1  mycroft 
    218       1.1  mycroft *--HIDE THE NEXT TWO INSTRUCTIONS
    219       1.1  mycroft 	lea.l		PITBL+$200,a1 ...TABLE OF N*PI/2, N = -32,...,32
    220       1.1  mycroft 
    221       1.1  mycroft *--FP1 IS NOW READY
    222       1.1  mycroft 	FMOVE.L		FP1,D0		...CONVERT TO INTEGER
    223       1.1  mycroft 
    224       1.1  mycroft 	ASL.L		#4,D0
    225       1.1  mycroft 	ADDA.L		D0,a1		...ADDRESS N*PIBY2 IN Y1, Y2
    226       1.1  mycroft 
    227       1.1  mycroft 	FSUB.X		(a1)+,FP0	...X-Y1
    228       1.1  mycroft *--HIDE THE NEXT ONE
    229       1.1  mycroft 
    230       1.1  mycroft 	FSUB.S		(a1),FP0	...FP0 IS R = (X-Y1)-Y2
    231       1.1  mycroft 
    232       1.1  mycroft 	ROR.L		#5,D0
    233       1.1  mycroft 	ANDI.L		#$80000000,D0	...D0 WAS ODD IFF D0 < 0
    234       1.1  mycroft 
    235       1.1  mycroft TANCONT:
    236       1.1  mycroft 
    237       1.2  mycroft 	TST.L		D0
    238       1.1  mycroft 	BLT.W		NODD
    239       1.1  mycroft 
    240       1.1  mycroft 	FMOVE.X		FP0,FP1
    241       1.1  mycroft 	FMUL.X		FP1,FP1	 	...S = R*R
    242       1.1  mycroft 
    243       1.1  mycroft 	FMOVE.D		TANQ4,FP3
    244       1.1  mycroft 	FMOVE.D		TANP3,FP2
    245       1.1  mycroft 
    246       1.1  mycroft 	FMUL.X		FP1,FP3	 	...SQ4
    247       1.1  mycroft 	FMUL.X		FP1,FP2	 	...SP3
    248       1.1  mycroft 
    249       1.1  mycroft 	FADD.D		TANQ3,FP3	...Q3+SQ4
    250       1.1  mycroft 	FADD.X		TANP2,FP2	...P2+SP3
    251       1.1  mycroft 
    252       1.1  mycroft 	FMUL.X		FP1,FP3	 	...S(Q3+SQ4)
    253       1.1  mycroft 	FMUL.X		FP1,FP2	 	...S(P2+SP3)
    254       1.1  mycroft 
    255       1.1  mycroft 	FADD.X		TANQ2,FP3	...Q2+S(Q3+SQ4)
    256       1.1  mycroft 	FADD.X		TANP1,FP2	...P1+S(P2+SP3)
    257       1.1  mycroft 
    258       1.1  mycroft 	FMUL.X		FP1,FP3	 	...S(Q2+S(Q3+SQ4))
    259       1.1  mycroft 	FMUL.X		FP1,FP2	 	...S(P1+S(P2+SP3))
    260       1.1  mycroft 
    261       1.1  mycroft 	FADD.X		TANQ1,FP3	...Q1+S(Q2+S(Q3+SQ4))
    262       1.1  mycroft 	FMUL.X		FP0,FP2	 	...RS(P1+S(P2+SP3))
    263       1.1  mycroft 
    264       1.1  mycroft 	FMUL.X		FP3,FP1	 	...S(Q1+S(Q2+S(Q3+SQ4)))
    265       1.1  mycroft 	
    266       1.1  mycroft 
    267       1.1  mycroft 	FADD.X		FP2,FP0	 	...R+RS(P1+S(P2+SP3))
    268       1.1  mycroft 	
    269       1.1  mycroft 
    270       1.1  mycroft 	FADD.S		#:3F800000,FP1	...1+S(Q1+...)
    271       1.1  mycroft 
    272       1.1  mycroft 	FMOVE.L		d1,fpcr		;restore users exceptions
    273       1.1  mycroft 	FDIV.X		FP1,FP0		;last inst - possible exception set
    274       1.1  mycroft 
    275       1.1  mycroft 	bra		t_frcinx
    276       1.1  mycroft 
    277       1.1  mycroft NODD:
    278       1.1  mycroft 	FMOVE.X		FP0,FP1
    279       1.1  mycroft 	FMUL.X		FP0,FP0	 	...S = R*R
    280       1.1  mycroft 
    281       1.1  mycroft 	FMOVE.D		TANQ4,FP3
    282       1.1  mycroft 	FMOVE.D		TANP3,FP2
    283       1.1  mycroft 
    284       1.1  mycroft 	FMUL.X		FP0,FP3	 	...SQ4
    285       1.1  mycroft 	FMUL.X		FP0,FP2	 	...SP3
    286       1.1  mycroft 
    287       1.1  mycroft 	FADD.D		TANQ3,FP3	...Q3+SQ4
    288       1.1  mycroft 	FADD.X		TANP2,FP2	...P2+SP3
    289       1.1  mycroft 
    290       1.1  mycroft 	FMUL.X		FP0,FP3	 	...S(Q3+SQ4)
    291       1.1  mycroft 	FMUL.X		FP0,FP2	 	...S(P2+SP3)
    292       1.1  mycroft 
    293       1.1  mycroft 	FADD.X		TANQ2,FP3	...Q2+S(Q3+SQ4)
    294       1.1  mycroft 	FADD.X		TANP1,FP2	...P1+S(P2+SP3)
    295       1.1  mycroft 
    296       1.1  mycroft 	FMUL.X		FP0,FP3	 	...S(Q2+S(Q3+SQ4))
    297       1.1  mycroft 	FMUL.X		FP0,FP2	 	...S(P1+S(P2+SP3))
    298       1.1  mycroft 
    299       1.1  mycroft 	FADD.X		TANQ1,FP3	...Q1+S(Q2+S(Q3+SQ4))
    300       1.1  mycroft 	FMUL.X		FP1,FP2	 	...RS(P1+S(P2+SP3))
    301       1.1  mycroft 
    302       1.1  mycroft 	FMUL.X		FP3,FP0	 	...S(Q1+S(Q2+S(Q3+SQ4)))
    303       1.1  mycroft 	
    304       1.1  mycroft 
    305       1.1  mycroft 	FADD.X		FP2,FP1	 	...R+RS(P1+S(P2+SP3))
    306       1.1  mycroft 	FADD.S		#:3F800000,FP0	...1+S(Q1+...)
    307       1.1  mycroft 	
    308       1.1  mycroft 
    309       1.1  mycroft 	FMOVE.X		FP1,-(sp)
    310       1.1  mycroft 	EORI.L		#$80000000,(sp)
    311       1.1  mycroft 
    312       1.1  mycroft 	FMOVE.L		d1,fpcr	 	;restore users exceptions
    313       1.1  mycroft 	FDIV.X		(sp)+,FP0	;last inst - possible exception set
    314       1.1  mycroft 
    315       1.1  mycroft 	bra		t_frcinx
    316       1.1  mycroft 
    317       1.1  mycroft TANBORS:
    318       1.1  mycroft *--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
    319       1.1  mycroft *--IF |X| < 2**(-40), RETURN X OR 1.
    320       1.1  mycroft 	CMPI.L		#$3FFF8000,D0
    321       1.1  mycroft 	BGT.B		REDUCEX
    322       1.1  mycroft 
    323       1.1  mycroft TANSM:
    324       1.1  mycroft 
    325       1.1  mycroft 	FMOVE.X		FP0,-(sp)
    326       1.1  mycroft 	FMOVE.L		d1,fpcr		 ;restore users exceptions
    327       1.1  mycroft 	FMOVE.X		(sp)+,FP0	;last inst - posibble exception set
    328       1.1  mycroft 
    329       1.1  mycroft 	bra		t_frcinx
    330       1.1  mycroft 
    331       1.1  mycroft 
    332       1.1  mycroft REDUCEX:
    333       1.1  mycroft *--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
    334       1.1  mycroft *--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
    335       1.1  mycroft *--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
    336       1.1  mycroft 
    337       1.1  mycroft 	FMOVEM.X	FP2-FP5,-(A7)	...save FP2 through FP5
    338       1.1  mycroft 	MOVE.L		D2,-(A7)
    339       1.1  mycroft         FMOVE.S         #:00000000,FP1
    340       1.1  mycroft 
    341       1.1  mycroft *--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
    342       1.1  mycroft *--there is a danger of unwanted overflow in first LOOP iteration.  In this
    343       1.1  mycroft *--case, reduce argument by one remainder step to make subsequent reduction
    344       1.1  mycroft *--safe.
    345       1.1  mycroft 	cmpi.l	#$7ffeffff,d0		;is argument dangerously large?
    346       1.1  mycroft 	bne.b	LOOP
    347       1.1  mycroft 	move.l	#$7ffe0000,FP_SCR2(a6)	;yes
    348       1.1  mycroft *					;create 2**16383*PI/2
    349       1.1  mycroft 	move.l	#$c90fdaa2,FP_SCR2+4(a6)
    350       1.1  mycroft 	clr.l	FP_SCR2+8(a6)
    351       1.1  mycroft 	ftst.x	fp0			;test sign of argument
    352       1.1  mycroft 	move.l	#$7fdc0000,FP_SCR3(a6)	;create low half of 2**16383*
    353       1.1  mycroft *					;PI/2 at FP_SCR3
    354       1.1  mycroft 	move.l	#$85a308d3,FP_SCR3+4(a6)
    355       1.1  mycroft 	clr.l   FP_SCR3+8(a6)
    356       1.1  mycroft 	fblt.w	red_neg
    357       1.1  mycroft 	or.w	#$8000,FP_SCR2(a6)	;positive arg
    358       1.1  mycroft 	or.w	#$8000,FP_SCR3(a6)
    359       1.1  mycroft red_neg:
    360       1.1  mycroft 	fadd.x  FP_SCR2(a6),fp0		;high part of reduction is exact
    361       1.1  mycroft 	fmove.x  fp0,fp1		;save high result in fp1
    362       1.1  mycroft 	fadd.x  FP_SCR3(a6),fp0		;low part of reduction
    363       1.1  mycroft 	fsub.x  fp0,fp1			;determine low component of result
    364       1.1  mycroft 	fadd.x  FP_SCR3(a6),fp1		;fp0/fp1 are reduced argument.
    365       1.1  mycroft 
    366       1.1  mycroft *--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
    367       1.1  mycroft *--integer quotient will be stored in N
    368       1.1  mycroft *--Intermeditate remainder is 66-bit long; (R,r) in (FP0,FP1)
    369       1.1  mycroft 
    370       1.1  mycroft LOOP:
    371       1.1  mycroft 	FMOVE.X		FP0,INARG(a6)	...+-2**K * F, 1 <= F < 2
    372       1.1  mycroft 	MOVE.W		INARG(a6),D0
    373       1.1  mycroft         MOVE.L          D0,A1		...save a copy of D0
    374       1.1  mycroft 	ANDI.L		#$00007FFF,D0
    375       1.1  mycroft 	SUBI.L		#$00003FFF,D0	...D0 IS K
    376       1.1  mycroft 	CMPI.L		#28,D0
    377       1.1  mycroft 	BLE.B		LASTLOOP
    378       1.1  mycroft CONTLOOP:
    379       1.1  mycroft 	SUBI.L		#27,D0	 ...D0 IS L := K-27
    380       1.2  mycroft 	CLR.L		ENDFLAG(a6)
    381       1.1  mycroft 	BRA.B		WORK
    382       1.1  mycroft LASTLOOP:
    383       1.1  mycroft 	CLR.L		D0		...D0 IS L := 0
    384       1.1  mycroft 	MOVE.L		#1,ENDFLAG(a6)
    385       1.1  mycroft 
    386       1.1  mycroft WORK:
    387       1.1  mycroft *--FIND THE REMAINDER OF (R,r) W.R.T.	2**L * (PI/2). L IS SO CHOSEN
    388       1.1  mycroft *--THAT	INT( X * (2/PI) / 2**(L) ) < 2**29.
    389       1.1  mycroft 
    390       1.1  mycroft *--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
    391       1.1  mycroft *--2**L * (PIby2_1), 2**L * (PIby2_2)
    392       1.1  mycroft 
    393       1.1  mycroft 	MOVE.L		#$00003FFE,D2	...BIASED EXPO OF 2/PI
    394       1.1  mycroft 	SUB.L		D0,D2		...BIASED EXPO OF 2**(-L)*(2/PI)
    395       1.1  mycroft 
    396       1.1  mycroft 	MOVE.L		#$A2F9836E,FP_SCR1+4(a6)
    397       1.1  mycroft 	MOVE.L		#$4E44152A,FP_SCR1+8(a6)
    398       1.1  mycroft 	MOVE.W		D2,FP_SCR1(a6)	...FP_SCR1 is 2**(-L)*(2/PI)
    399       1.1  mycroft 
    400       1.1  mycroft 	FMOVE.X		FP0,FP2
    401       1.1  mycroft 	FMUL.X		FP_SCR1(a6),FP2
    402       1.1  mycroft *--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
    403       1.1  mycroft *--FLOATING POINT FORMAT, THE TWO FMOVE'S	FMOVE.L FP <--> N
    404       1.1  mycroft *--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
    405       1.1  mycroft *--(SIGN(INARG)*2**63	+	FP2) - SIGN(INARG)*2**63 WILL GIVE
    406       1.1  mycroft *--US THE DESIRED VALUE IN FLOATING POINT.
    407       1.1  mycroft 
    408       1.1  mycroft *--HIDE SIX CYCLES OF INSTRUCTION
    409       1.1  mycroft         MOVE.L		A1,D2
    410       1.1  mycroft         SWAP		D2
    411       1.1  mycroft 	ANDI.L		#$80000000,D2
    412       1.1  mycroft 	ORI.L		#$5F000000,D2	...D2 IS SIGN(INARG)*2**63 IN SGL
    413       1.1  mycroft 	MOVE.L		D2,TWOTO63(a6)
    414       1.1  mycroft 
    415       1.1  mycroft 	MOVE.L		D0,D2
    416       1.1  mycroft 	ADDI.L		#$00003FFF,D2	...BIASED EXPO OF 2**L * (PI/2)
    417       1.1  mycroft 
    418       1.1  mycroft *--FP2 IS READY
    419       1.1  mycroft 	FADD.S		TWOTO63(a6),FP2	...THE FRACTIONAL PART OF FP1 IS ROUNDED
    420       1.1  mycroft 
    421       1.1  mycroft *--HIDE 4 CYCLES OF INSTRUCTION; creating 2**(L)*Piby2_1  and  2**(L)*Piby2_2
    422       1.1  mycroft         MOVE.W		D2,FP_SCR2(a6)
    423       1.1  mycroft 	CLR.W           FP_SCR2+2(a6)
    424       1.1  mycroft 	MOVE.L		#$C90FDAA2,FP_SCR2+4(a6)
    425       1.1  mycroft 	CLR.L		FP_SCR2+8(a6)		...FP_SCR2 is  2**(L) * Piby2_1	
    426       1.1  mycroft 
    427       1.1  mycroft *--FP2 IS READY
    428       1.1  mycroft 	FSUB.S		TWOTO63(a6),FP2		...FP2 is N
    429       1.1  mycroft 
    430       1.1  mycroft 	ADDI.L		#$00003FDD,D0
    431       1.1  mycroft         MOVE.W		D0,FP_SCR3(a6)
    432       1.1  mycroft 	CLR.W           FP_SCR3+2(a6)
    433       1.1  mycroft 	MOVE.L		#$85A308D3,FP_SCR3+4(a6)
    434       1.1  mycroft 	CLR.L		FP_SCR3+8(a6)		...FP_SCR3 is 2**(L) * Piby2_2
    435       1.1  mycroft 
    436       1.1  mycroft 	MOVE.L		ENDFLAG(a6),D0
    437       1.1  mycroft 
    438       1.1  mycroft *--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
    439       1.1  mycroft *--P2 = 2**(L) * Piby2_2
    440       1.1  mycroft 	FMOVE.X		FP2,FP4
    441       1.1  mycroft 	FMul.X		FP_SCR2(a6),FP4		...W = N*P1
    442       1.1  mycroft 	FMove.X		FP2,FP5
    443       1.1  mycroft 	FMul.X		FP_SCR3(a6),FP5		...w = N*P2
    444       1.1  mycroft 	FMove.X		FP4,FP3
    445       1.1  mycroft *--we want P+p = W+w  but  |p| <= half ulp of P
    446       1.1  mycroft *--Then, we need to compute  A := R-P   and  a := r-p
    447       1.1  mycroft 	FAdd.X		FP5,FP3			...FP3 is P
    448       1.1  mycroft 	FSub.X		FP3,FP4			...W-P
    449       1.1  mycroft 
    450       1.1  mycroft 	FSub.X		FP3,FP0			...FP0 is A := R - P
    451       1.1  mycroft         FAdd.X		FP5,FP4			...FP4 is p = (W-P)+w
    452       1.1  mycroft 
    453       1.1  mycroft 	FMove.X		FP0,FP3			...FP3 A
    454       1.1  mycroft 	FSub.X		FP4,FP1			...FP1 is a := r - p
    455       1.1  mycroft 
    456       1.1  mycroft *--Now we need to normalize (A,a) to  "new (R,r)" where R+r = A+a but
    457       1.1  mycroft *--|r| <= half ulp of R.
    458       1.1  mycroft 	FAdd.X		FP1,FP0			...FP0 is R := A+a
    459       1.1  mycroft *--No need to calculate r if this is the last loop
    460       1.2  mycroft 	TST.L		D0
    461       1.1  mycroft 	BGT.W		RESTORE
    462       1.1  mycroft 
    463       1.1  mycroft *--Need to calculate r
    464       1.1  mycroft 	FSub.X		FP0,FP3			...A-R
    465       1.1  mycroft 	FAdd.X		FP3,FP1			...FP1 is r := (A-R)+a
    466       1.1  mycroft 	BRA.W		LOOP
    467       1.1  mycroft 
    468       1.1  mycroft RESTORE:
    469       1.1  mycroft         FMOVE.L		FP2,N(a6)
    470       1.1  mycroft 	MOVE.L		(A7)+,D2
    471       1.1  mycroft 	FMOVEM.X	(A7)+,FP2-FP5
    472       1.1  mycroft 
    473       1.1  mycroft 	
    474       1.1  mycroft 	MOVE.L		N(a6),D0
    475       1.1  mycroft         ROR.L		#1,D0
    476       1.1  mycroft 
    477       1.1  mycroft 
    478       1.1  mycroft 	BRA.W		TANCONT
    479       1.1  mycroft 
    480       1.1  mycroft 	end
    481