Home | History | Annotate | Line # | Download | only in fpsp
satan.sa revision 1.1
      1  1.1  mycroft *	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
      2  1.1  mycroft *	M68000 Hi-Performance Microprocessor Division
      3  1.1  mycroft *	M68040 Software Package 
      4  1.1  mycroft *
      5  1.1  mycroft *	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
      6  1.1  mycroft *	All rights reserved.
      7  1.1  mycroft *
      8  1.1  mycroft *	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
      9  1.1  mycroft *	To the maximum extent permitted by applicable law,
     10  1.1  mycroft *	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
     11  1.1  mycroft *	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
     12  1.1  mycroft *	PARTICULAR PURPOSE and any warranty against infringement with
     13  1.1  mycroft *	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
     14  1.1  mycroft *	and any accompanying written materials. 
     15  1.1  mycroft *
     16  1.1  mycroft *	To the maximum extent permitted by applicable law,
     17  1.1  mycroft *	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
     18  1.1  mycroft *	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
     19  1.1  mycroft *	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
     20  1.1  mycroft *	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
     21  1.1  mycroft *	SOFTWARE.  Motorola assumes no responsibility for the maintenance
     22  1.1  mycroft *	and support of the SOFTWARE.  
     23  1.1  mycroft *
     24  1.1  mycroft *	You are hereby granted a copyright license to use, modify, and
     25  1.1  mycroft *	distribute the SOFTWARE so long as this entire notice is retained
     26  1.1  mycroft *	without alteration in any modified and/or redistributed versions,
     27  1.1  mycroft *	and that such modified versions are clearly identified as such.
     28  1.1  mycroft *	No licenses are granted by implication, estoppel or otherwise
     29  1.1  mycroft *	under any patents or trademarks of Motorola, Inc.
     30  1.1  mycroft 
     31  1.1  mycroft *
     32  1.1  mycroft *	satan.sa 3.3 12/19/90
     33  1.1  mycroft *
     34  1.1  mycroft *	The entry point satan computes the arctagent of an
     35  1.1  mycroft *	input value. satand does the same except the input value is a
     36  1.1  mycroft *	denormalized number.
     37  1.1  mycroft *
     38  1.1  mycroft *	Input: Double-extended value in memory location pointed to by address
     39  1.1  mycroft *		register a0.
     40  1.1  mycroft *
     41  1.1  mycroft *	Output:	Arctan(X) returned in floating-point register Fp0.
     42  1.1  mycroft *
     43  1.1  mycroft *	Accuracy and Monotonicity: The returned result is within 2 ulps in
     44  1.1  mycroft *		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
     45  1.1  mycroft *		result is subsequently rounded to double precision. The
     46  1.1  mycroft *		result is provably monotonic in double precision.
     47  1.1  mycroft *
     48  1.1  mycroft *	Speed: The program satan takes approximately 160 cycles for input
     49  1.1  mycroft *		argument X such that 1/16 < |X| < 16. For the other arguments,
     50  1.1  mycroft *		the program will run no worse than 10% slower.
     51  1.1  mycroft *
     52  1.1  mycroft *	Algorithm:
     53  1.1  mycroft *	Step 1. If |X| >= 16 or |X| < 1/16, go to Step 5.
     54  1.1  mycroft *
     55  1.1  mycroft *	Step 2. Let X = sgn * 2**k * 1.xxxxxxxx...x. Note that k = -4, -3,..., or 3.
     56  1.1  mycroft *		Define F = sgn * 2**k * 1.xxxx1, i.e. the first 5 significant bits
     57  1.1  mycroft *		of X with a bit-1 attached at the 6-th bit position. Define u
     58  1.1  mycroft *		to be u = (X-F) / (1 + X*F).
     59  1.1  mycroft *
     60  1.1  mycroft *	Step 3. Approximate arctan(u) by a polynomial poly.
     61  1.1  mycroft *
     62  1.1  mycroft *	Step 4. Return arctan(F) + poly, arctan(F) is fetched from a table of values
     63  1.1  mycroft *		calculated beforehand. Exit.
     64  1.1  mycroft *
     65  1.1  mycroft *	Step 5. If |X| >= 16, go to Step 7.
     66  1.1  mycroft *
     67  1.1  mycroft *	Step 6. Approximate arctan(X) by an odd polynomial in X. Exit.
     68  1.1  mycroft *
     69  1.1  mycroft *	Step 7. Define X' = -1/X. Approximate arctan(X') by an odd polynomial in X'.
     70  1.1  mycroft *		Arctan(X) = sign(X)*Pi/2 + arctan(X'). Exit.
     71  1.1  mycroft *
     72  1.1  mycroft 
     73  1.1  mycroft satan	IDNT	2,1 Motorola 040 Floating Point Software Package
     74  1.1  mycroft 
     75  1.1  mycroft 	section	8
     76  1.1  mycroft 
     77  1.1  mycroft 	include fpsp.h
     78  1.1  mycroft 	
     79  1.1  mycroft BOUNDS1	DC.L $3FFB8000,$4002FFFF
     80  1.1  mycroft 
     81  1.1  mycroft ONE	DC.L $3F800000
     82  1.1  mycroft 
     83  1.1  mycroft 	DC.L $00000000
     84  1.1  mycroft 
     85  1.1  mycroft ATANA3	DC.L $BFF6687E,$314987D8
     86  1.1  mycroft ATANA2	DC.L $4002AC69,$34A26DB3
     87  1.1  mycroft 
     88  1.1  mycroft ATANA1	DC.L $BFC2476F,$4E1DA28E
     89  1.1  mycroft ATANB6	DC.L $3FB34444,$7F876989
     90  1.1  mycroft 
     91  1.1  mycroft ATANB5	DC.L $BFB744EE,$7FAF45DB
     92  1.1  mycroft ATANB4	DC.L $3FBC71C6,$46940220
     93  1.1  mycroft 
     94  1.1  mycroft ATANB3	DC.L $BFC24924,$921872F9
     95  1.1  mycroft ATANB2	DC.L $3FC99999,$99998FA9
     96  1.1  mycroft 
     97  1.1  mycroft ATANB1	DC.L $BFD55555,$55555555
     98  1.1  mycroft ATANC5	DC.L $BFB70BF3,$98539E6A
     99  1.1  mycroft 
    100  1.1  mycroft ATANC4	DC.L $3FBC7187,$962D1D7D
    101  1.1  mycroft ATANC3	DC.L $BFC24924,$827107B8
    102  1.1  mycroft 
    103  1.1  mycroft ATANC2	DC.L $3FC99999,$9996263E
    104  1.1  mycroft ATANC1	DC.L $BFD55555,$55555536
    105  1.1  mycroft 
    106  1.1  mycroft PPIBY2	DC.L $3FFF0000,$C90FDAA2,$2168C235,$00000000
    107  1.1  mycroft NPIBY2	DC.L $BFFF0000,$C90FDAA2,$2168C235,$00000000
    108  1.1  mycroft PTINY	DC.L $00010000,$80000000,$00000000,$00000000
    109  1.1  mycroft NTINY	DC.L $80010000,$80000000,$00000000,$00000000
    110  1.1  mycroft 
    111  1.1  mycroft ATANTBL:
    112  1.1  mycroft 	DC.L	$3FFB0000,$83D152C5,$060B7A51,$00000000
    113  1.1  mycroft 	DC.L	$3FFB0000,$8BC85445,$65498B8B,$00000000
    114  1.1  mycroft 	DC.L	$3FFB0000,$93BE4060,$17626B0D,$00000000
    115  1.1  mycroft 	DC.L	$3FFB0000,$9BB3078D,$35AEC202,$00000000
    116  1.1  mycroft 	DC.L	$3FFB0000,$A3A69A52,$5DDCE7DE,$00000000
    117  1.1  mycroft 	DC.L	$3FFB0000,$AB98E943,$62765619,$00000000
    118  1.1  mycroft 	DC.L	$3FFB0000,$B389E502,$F9C59862,$00000000
    119  1.1  mycroft 	DC.L	$3FFB0000,$BB797E43,$6B09E6FB,$00000000
    120  1.1  mycroft 	DC.L	$3FFB0000,$C367A5C7,$39E5F446,$00000000
    121  1.1  mycroft 	DC.L	$3FFB0000,$CB544C61,$CFF7D5C6,$00000000
    122  1.1  mycroft 	DC.L	$3FFB0000,$D33F62F8,$2488533E,$00000000
    123  1.1  mycroft 	DC.L	$3FFB0000,$DB28DA81,$62404C77,$00000000
    124  1.1  mycroft 	DC.L	$3FFB0000,$E310A407,$8AD34F18,$00000000
    125  1.1  mycroft 	DC.L	$3FFB0000,$EAF6B0A8,$188EE1EB,$00000000
    126  1.1  mycroft 	DC.L	$3FFB0000,$F2DAF194,$9DBE79D5,$00000000
    127  1.1  mycroft 	DC.L	$3FFB0000,$FABD5813,$61D47E3E,$00000000
    128  1.1  mycroft 	DC.L	$3FFC0000,$8346AC21,$0959ECC4,$00000000
    129  1.1  mycroft 	DC.L	$3FFC0000,$8B232A08,$304282D8,$00000000
    130  1.1  mycroft 	DC.L	$3FFC0000,$92FB70B8,$D29AE2F9,$00000000
    131  1.1  mycroft 	DC.L	$3FFC0000,$9ACF476F,$5CCD1CB4,$00000000
    132  1.1  mycroft 	DC.L	$3FFC0000,$A29E7630,$4954F23F,$00000000
    133  1.1  mycroft 	DC.L	$3FFC0000,$AA68C5D0,$8AB85230,$00000000
    134  1.1  mycroft 	DC.L	$3FFC0000,$B22DFFFD,$9D539F83,$00000000
    135  1.1  mycroft 	DC.L	$3FFC0000,$B9EDEF45,$3E900EA5,$00000000
    136  1.1  mycroft 	DC.L	$3FFC0000,$C1A85F1C,$C75E3EA5,$00000000
    137  1.1  mycroft 	DC.L	$3FFC0000,$C95D1BE8,$28138DE6,$00000000
    138  1.1  mycroft 	DC.L	$3FFC0000,$D10BF300,$840D2DE4,$00000000
    139  1.1  mycroft 	DC.L	$3FFC0000,$D8B4B2BA,$6BC05E7A,$00000000
    140  1.1  mycroft 	DC.L	$3FFC0000,$E0572A6B,$B42335F6,$00000000
    141  1.1  mycroft 	DC.L	$3FFC0000,$E7F32A70,$EA9CAA8F,$00000000
    142  1.1  mycroft 	DC.L	$3FFC0000,$EF888432,$64ECEFAA,$00000000
    143  1.1  mycroft 	DC.L	$3FFC0000,$F7170A28,$ECC06666,$00000000
    144  1.1  mycroft 	DC.L	$3FFD0000,$812FD288,$332DAD32,$00000000
    145  1.1  mycroft 	DC.L	$3FFD0000,$88A8D1B1,$218E4D64,$00000000
    146  1.1  mycroft 	DC.L	$3FFD0000,$9012AB3F,$23E4AEE8,$00000000
    147  1.1  mycroft 	DC.L	$3FFD0000,$976CC3D4,$11E7F1B9,$00000000
    148  1.1  mycroft 	DC.L	$3FFD0000,$9EB68949,$3889A227,$00000000
    149  1.1  mycroft 	DC.L	$3FFD0000,$A5EF72C3,$4487361B,$00000000
    150  1.1  mycroft 	DC.L	$3FFD0000,$AD1700BA,$F07A7227,$00000000
    151  1.1  mycroft 	DC.L	$3FFD0000,$B42CBCFA,$FD37EFB7,$00000000
    152  1.1  mycroft 	DC.L	$3FFD0000,$BB303A94,$0BA80F89,$00000000
    153  1.1  mycroft 	DC.L	$3FFD0000,$C22115C6,$FCAEBBAF,$00000000
    154  1.1  mycroft 	DC.L	$3FFD0000,$C8FEF3E6,$86331221,$00000000
    155  1.1  mycroft 	DC.L	$3FFD0000,$CFC98330,$B4000C70,$00000000
    156  1.1  mycroft 	DC.L	$3FFD0000,$D6807AA1,$102C5BF9,$00000000
    157  1.1  mycroft 	DC.L	$3FFD0000,$DD2399BC,$31252AA3,$00000000
    158  1.1  mycroft 	DC.L	$3FFD0000,$E3B2A855,$6B8FC517,$00000000
    159  1.1  mycroft 	DC.L	$3FFD0000,$EA2D764F,$64315989,$00000000
    160  1.1  mycroft 	DC.L	$3FFD0000,$F3BF5BF8,$BAD1A21D,$00000000
    161  1.1  mycroft 	DC.L	$3FFE0000,$801CE39E,$0D205C9A,$00000000
    162  1.1  mycroft 	DC.L	$3FFE0000,$8630A2DA,$DA1ED066,$00000000
    163  1.1  mycroft 	DC.L	$3FFE0000,$8C1AD445,$F3E09B8C,$00000000
    164  1.1  mycroft 	DC.L	$3FFE0000,$91DB8F16,$64F350E2,$00000000
    165  1.1  mycroft 	DC.L	$3FFE0000,$97731420,$365E538C,$00000000
    166  1.1  mycroft 	DC.L	$3FFE0000,$9CE1C8E6,$A0B8CDBA,$00000000
    167  1.1  mycroft 	DC.L	$3FFE0000,$A22832DB,$CADAAE09,$00000000
    168  1.1  mycroft 	DC.L	$3FFE0000,$A746F2DD,$B7602294,$00000000
    169  1.1  mycroft 	DC.L	$3FFE0000,$AC3EC0FB,$997DD6A2,$00000000
    170  1.1  mycroft 	DC.L	$3FFE0000,$B110688A,$EBDC6F6A,$00000000
    171  1.1  mycroft 	DC.L	$3FFE0000,$B5BCC490,$59ECC4B0,$00000000
    172  1.1  mycroft 	DC.L	$3FFE0000,$BA44BC7D,$D470782F,$00000000
    173  1.1  mycroft 	DC.L	$3FFE0000,$BEA94144,$FD049AAC,$00000000
    174  1.1  mycroft 	DC.L	$3FFE0000,$C2EB4ABB,$661628B6,$00000000
    175  1.1  mycroft 	DC.L	$3FFE0000,$C70BD54C,$E602EE14,$00000000
    176  1.1  mycroft 	DC.L	$3FFE0000,$CD000549,$ADEC7159,$00000000
    177  1.1  mycroft 	DC.L	$3FFE0000,$D48457D2,$D8EA4EA3,$00000000
    178  1.1  mycroft 	DC.L	$3FFE0000,$DB948DA7,$12DECE3B,$00000000
    179  1.1  mycroft 	DC.L	$3FFE0000,$E23855F9,$69E8096A,$00000000
    180  1.1  mycroft 	DC.L	$3FFE0000,$E8771129,$C4353259,$00000000
    181  1.1  mycroft 	DC.L	$3FFE0000,$EE57C16E,$0D379C0D,$00000000
    182  1.1  mycroft 	DC.L	$3FFE0000,$F3E10211,$A87C3779,$00000000
    183  1.1  mycroft 	DC.L	$3FFE0000,$F919039D,$758B8D41,$00000000
    184  1.1  mycroft 	DC.L	$3FFE0000,$FE058B8F,$64935FB3,$00000000
    185  1.1  mycroft 	DC.L	$3FFF0000,$8155FB49,$7B685D04,$00000000
    186  1.1  mycroft 	DC.L	$3FFF0000,$83889E35,$49D108E1,$00000000
    187  1.1  mycroft 	DC.L	$3FFF0000,$859CFA76,$511D724B,$00000000
    188  1.1  mycroft 	DC.L	$3FFF0000,$87952ECF,$FF8131E7,$00000000
    189  1.1  mycroft 	DC.L	$3FFF0000,$89732FD1,$9557641B,$00000000
    190  1.1  mycroft 	DC.L	$3FFF0000,$8B38CAD1,$01932A35,$00000000
    191  1.1  mycroft 	DC.L	$3FFF0000,$8CE7A8D8,$301EE6B5,$00000000
    192  1.1  mycroft 	DC.L	$3FFF0000,$8F46A39E,$2EAE5281,$00000000
    193  1.1  mycroft 	DC.L	$3FFF0000,$922DA7D7,$91888487,$00000000
    194  1.1  mycroft 	DC.L	$3FFF0000,$94D19FCB,$DEDF5241,$00000000
    195  1.1  mycroft 	DC.L	$3FFF0000,$973AB944,$19D2A08B,$00000000
    196  1.1  mycroft 	DC.L	$3FFF0000,$996FF00E,$08E10B96,$00000000
    197  1.1  mycroft 	DC.L	$3FFF0000,$9B773F95,$12321DA7,$00000000
    198  1.1  mycroft 	DC.L	$3FFF0000,$9D55CC32,$0F935624,$00000000
    199  1.1  mycroft 	DC.L	$3FFF0000,$9F100575,$006CC571,$00000000
    200  1.1  mycroft 	DC.L	$3FFF0000,$A0A9C290,$D97CC06C,$00000000
    201  1.1  mycroft 	DC.L	$3FFF0000,$A22659EB,$EBC0630A,$00000000
    202  1.1  mycroft 	DC.L	$3FFF0000,$A388B4AF,$F6EF0EC9,$00000000
    203  1.1  mycroft 	DC.L	$3FFF0000,$A4D35F10,$61D292C4,$00000000
    204  1.1  mycroft 	DC.L	$3FFF0000,$A60895DC,$FBE3187E,$00000000
    205  1.1  mycroft 	DC.L	$3FFF0000,$A72A51DC,$7367BEAC,$00000000
    206  1.1  mycroft 	DC.L	$3FFF0000,$A83A5153,$0956168F,$00000000
    207  1.1  mycroft 	DC.L	$3FFF0000,$A93A2007,$7539546E,$00000000
    208  1.1  mycroft 	DC.L	$3FFF0000,$AA9E7245,$023B2605,$00000000
    209  1.1  mycroft 	DC.L	$3FFF0000,$AC4C84BA,$6FE4D58F,$00000000
    210  1.1  mycroft 	DC.L	$3FFF0000,$ADCE4A4A,$606B9712,$00000000
    211  1.1  mycroft 	DC.L	$3FFF0000,$AF2A2DCD,$8D263C9C,$00000000
    212  1.1  mycroft 	DC.L	$3FFF0000,$B0656F81,$F22265C7,$00000000
    213  1.1  mycroft 	DC.L	$3FFF0000,$B1846515,$0F71496A,$00000000
    214  1.1  mycroft 	DC.L	$3FFF0000,$B28AAA15,$6F9ADA35,$00000000
    215  1.1  mycroft 	DC.L	$3FFF0000,$B37B44FF,$3766B895,$00000000
    216  1.1  mycroft 	DC.L	$3FFF0000,$B458C3DC,$E9630433,$00000000
    217  1.1  mycroft 	DC.L	$3FFF0000,$B525529D,$562246BD,$00000000
    218  1.1  mycroft 	DC.L	$3FFF0000,$B5E2CCA9,$5F9D88CC,$00000000
    219  1.1  mycroft 	DC.L	$3FFF0000,$B692CADA,$7ACA1ADA,$00000000
    220  1.1  mycroft 	DC.L	$3FFF0000,$B736AEA7,$A6925838,$00000000
    221  1.1  mycroft 	DC.L	$3FFF0000,$B7CFAB28,$7E9F7B36,$00000000
    222  1.1  mycroft 	DC.L	$3FFF0000,$B85ECC66,$CB219835,$00000000
    223  1.1  mycroft 	DC.L	$3FFF0000,$B8E4FD5A,$20A593DA,$00000000
    224  1.1  mycroft 	DC.L	$3FFF0000,$B99F41F6,$4AFF9BB5,$00000000
    225  1.1  mycroft 	DC.L	$3FFF0000,$BA7F1E17,$842BBE7B,$00000000
    226  1.1  mycroft 	DC.L	$3FFF0000,$BB471285,$7637E17D,$00000000
    227  1.1  mycroft 	DC.L	$3FFF0000,$BBFABE8A,$4788DF6F,$00000000
    228  1.1  mycroft 	DC.L	$3FFF0000,$BC9D0FAD,$2B689D79,$00000000
    229  1.1  mycroft 	DC.L	$3FFF0000,$BD306A39,$471ECD86,$00000000
    230  1.1  mycroft 	DC.L	$3FFF0000,$BDB6C731,$856AF18A,$00000000
    231  1.1  mycroft 	DC.L	$3FFF0000,$BE31CAC5,$02E80D70,$00000000
    232  1.1  mycroft 	DC.L	$3FFF0000,$BEA2D55C,$E33194E2,$00000000
    233  1.1  mycroft 	DC.L	$3FFF0000,$BF0B10B7,$C03128F0,$00000000
    234  1.1  mycroft 	DC.L	$3FFF0000,$BF6B7A18,$DACB778D,$00000000
    235  1.1  mycroft 	DC.L	$3FFF0000,$BFC4EA46,$63FA18F6,$00000000
    236  1.1  mycroft 	DC.L	$3FFF0000,$C0181BDE,$8B89A454,$00000000
    237  1.1  mycroft 	DC.L	$3FFF0000,$C065B066,$CFBF6439,$00000000
    238  1.1  mycroft 	DC.L	$3FFF0000,$C0AE345F,$56340AE6,$00000000
    239  1.1  mycroft 	DC.L	$3FFF0000,$C0F22291,$9CB9E6A7,$00000000
    240  1.1  mycroft 
    241  1.1  mycroft X	equ	FP_SCR1
    242  1.1  mycroft XDCARE	equ	X+2
    243  1.1  mycroft XFRAC	equ	X+4
    244  1.1  mycroft XFRACLO	equ	X+8
    245  1.1  mycroft 
    246  1.1  mycroft ATANF	equ	FP_SCR2
    247  1.1  mycroft ATANFHI	equ	ATANF+4
    248  1.1  mycroft ATANFLO	equ	ATANF+8
    249  1.1  mycroft 
    250  1.1  mycroft 
    251  1.1  mycroft 	xref	t_frcinx
    252  1.1  mycroft 	xref	t_extdnrm
    253  1.1  mycroft 
    254  1.1  mycroft 	xdef	satand
    255  1.1  mycroft satand:
    256  1.1  mycroft *--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED ARGUMENT
    257  1.1  mycroft 
    258  1.1  mycroft 	bra		t_extdnrm
    259  1.1  mycroft 
    260  1.1  mycroft 	xdef	satan
    261  1.1  mycroft satan:
    262  1.1  mycroft *--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
    263  1.1  mycroft 
    264  1.1  mycroft 	FMOVE.X		(A0),FP0	...LOAD INPUT
    265  1.1  mycroft 
    266  1.1  mycroft 	MOVE.L		(A0),D0
    267  1.1  mycroft 	MOVE.W		4(A0),D0
    268  1.1  mycroft 	FMOVE.X		FP0,X(a6)
    269  1.1  mycroft 	ANDI.L		#$7FFFFFFF,D0
    270  1.1  mycroft 
    271  1.1  mycroft 	CMPI.L		#$3FFB8000,D0		...|X| >= 1/16?
    272  1.1  mycroft 	BGE.B		ATANOK1
    273  1.1  mycroft 	BRA.W		ATANSM
    274  1.1  mycroft 
    275  1.1  mycroft ATANOK1:
    276  1.1  mycroft 	CMPI.L		#$4002FFFF,D0		...|X| < 16 ?
    277  1.1  mycroft 	BLE.B		ATANMAIN
    278  1.1  mycroft 	BRA.W		ATANBIG
    279  1.1  mycroft 
    280  1.1  mycroft 
    281  1.1  mycroft *--THE MOST LIKELY CASE, |X| IN [1/16, 16). WE USE TABLE TECHNIQUE
    282  1.1  mycroft *--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F] / [1+XF] ).
    283  1.1  mycroft *--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATAN(F) IS STORED IN
    284  1.1  mycroft *--A TABLE, ALL WE NEED IS TO APPROXIMATE ATAN(U) WHERE
    285  1.1  mycroft *--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS CLOSE TO X). IT IS
    286  1.1  mycroft *--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE APPROXIMATION FOR
    287  1.1  mycroft *--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE INDEXING TO
    288  1.1  mycroft *--FETCH F AND SAVING OF REGISTERS CAN BE ALL HIDED UNDER THE
    289  1.1  mycroft *--DIVIDE. IN THE END THIS METHOD IS MUCH FASTER THAN A TRADITIONAL
    290  1.1  mycroft *--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME THAT APPROXIMATE
    291  1.1  mycroft *--ATAN(X) DIRECTLY WILL NEED TO USE A RATIONAL APPROXIMATION
    292  1.1  mycroft *--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOMIAL APPROXIMATION
    293  1.1  mycroft *--WILL INVOLVE A VERY LONG POLYNOMIAL.
    294  1.1  mycroft 
    295  1.1  mycroft *--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 1. + 63 BITS
    296  1.1  mycroft *--WE CHOSE F TO BE +-2^K * 1.BBBB1
    297  1.1  mycroft *--THAT IS IT MATCHES THE EXPONENT AND FIRST 5 BITS OF X, THE
    298  1.1  mycroft *--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -3, ..., 3, THERE
    299  1.1  mycroft *--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SINCE ATAN(-|F|) IS
    300  1.1  mycroft *-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F|).
    301  1.1  mycroft 
    302  1.1  mycroft ATANMAIN:
    303  1.1  mycroft 
    304  1.1  mycroft 	MOVE.W		#$0000,XDCARE(a6)	...CLEAN UP X JUST IN CASE
    305  1.1  mycroft 	ANDI.L		#$F8000000,XFRAC(a6)	...FIRST 5 BITS
    306  1.1  mycroft 	ORI.L		#$04000000,XFRAC(a6)	...SET 6-TH BIT TO 1
    307  1.1  mycroft 	MOVE.L		#$00000000,XFRACLO(a6)	...LOCATION OF X IS NOW F
    308  1.1  mycroft 
    309  1.1  mycroft 	FMOVE.X		FP0,FP1			...FP1 IS X
    310  1.1  mycroft 	FMUL.X		X(a6),FP1		...FP1 IS X*F, NOTE THAT X*F > 0
    311  1.1  mycroft 	FSUB.X		X(a6),FP0		...FP0 IS X-F
    312  1.1  mycroft 	FADD.S		#:3F800000,FP1		...FP1 IS 1 + X*F
    313  1.1  mycroft 	FDIV.X		FP1,FP0			...FP0 IS U = (X-F)/(1+X*F)
    314  1.1  mycroft 
    315  1.1  mycroft *--WHILE THE DIVISION IS TAKING ITS TIME, WE FETCH ATAN(|F|)
    316  1.1  mycroft *--CREATE ATAN(F) AND STORE IT IN ATANF, AND
    317  1.1  mycroft *--SAVE REGISTERS FP2.
    318  1.1  mycroft 
    319  1.1  mycroft 	MOVE.L		d2,-(a7)	...SAVE d2 TEMPORARILY
    320  1.1  mycroft 	MOVE.L		d0,d2		...THE EXPO AND 16 BITS OF X
    321  1.1  mycroft 	ANDI.L		#$00007800,d0	...4 VARYING BITS OF F'S FRACTION
    322  1.1  mycroft 	ANDI.L		#$7FFF0000,d2	...EXPONENT OF F
    323  1.1  mycroft 	SUBI.L		#$3FFB0000,d2	...K+4
    324  1.1  mycroft 	ASR.L		#1,d2
    325  1.1  mycroft 	ADD.L		d2,d0		...THE 7 BITS IDENTIFYING F
    326  1.1  mycroft 	ASR.L		#7,d0		...INDEX INTO TBL OF ATAN(|F|)
    327  1.1  mycroft 	LEA		ATANTBL,a1
    328  1.1  mycroft 	ADDA.L		d0,a1		...ADDRESS OF ATAN(|F|)
    329  1.1  mycroft 	MOVE.L		(a1)+,ATANF(a6)
    330  1.1  mycroft 	MOVE.L		(a1)+,ATANFHI(a6)
    331  1.1  mycroft 	MOVE.L		(a1)+,ATANFLO(a6)	...ATANF IS NOW ATAN(|F|)
    332  1.1  mycroft 	MOVE.L		X(a6),d0		...LOAD SIGN AND EXPO. AGAIN
    333  1.1  mycroft 	ANDI.L		#$80000000,d0	...SIGN(F)
    334  1.1  mycroft 	OR.L		d0,ATANF(a6)	...ATANF IS NOW SIGN(F)*ATAN(|F|)
    335  1.1  mycroft 	MOVE.L		(a7)+,d2	...RESTORE d2
    336  1.1  mycroft 
    337  1.1  mycroft *--THAT'S ALL I HAVE TO DO FOR NOW,
    338  1.1  mycroft *--BUT ALAS, THE DIVIDE IS STILL CRANKING!
    339  1.1  mycroft 
    340  1.1  mycroft *--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN(U) AS
    341  1.1  mycroft *--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U
    342  1.1  mycroft *--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NEVERTHELESS CORRECT.
    343  1.1  mycroft *--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + V*A3))
    344  1.1  mycroft *--WHAT WE HAVE HERE IS MERELY	A1 = A3, A2 = A1/A3, A3 = A2/A3.
    345  1.1  mycroft *--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
    346  1.1  mycroft *--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED
    347  1.1  mycroft 
    348  1.1  mycroft 	
    349  1.1  mycroft 	FMOVE.X		FP0,FP1
    350  1.1  mycroft 	FMUL.X		FP1,FP1
    351  1.1  mycroft 	FMOVE.D		ATANA3,FP2
    352  1.1  mycroft 	FADD.X		FP1,FP2		...A3+V
    353  1.1  mycroft 	FMUL.X		FP1,FP2		...V*(A3+V)
    354  1.1  mycroft 	FMUL.X		FP0,FP1		...U*V
    355  1.1  mycroft 	FADD.D		ATANA2,FP2	...A2+V*(A3+V)
    356  1.1  mycroft 	FMUL.D		ATANA1,FP1	...A1*U*V
    357  1.1  mycroft 	FMUL.X		FP2,FP1		...A1*U*V*(A2+V*(A3+V))
    358  1.1  mycroft 	
    359  1.1  mycroft 	FADD.X		FP1,FP0		...ATAN(U), FP1 RELEASED
    360  1.1  mycroft 	FMOVE.L		d1,FPCR		;restore users exceptions
    361  1.1  mycroft 	FADD.X		ATANF(a6),FP0	...ATAN(X)
    362  1.1  mycroft 	bra		t_frcinx
    363  1.1  mycroft 
    364  1.1  mycroft ATANBORS:
    365  1.1  mycroft *--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVED.
    366  1.1  mycroft *--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.
    367  1.1  mycroft 	CMPI.L		#$3FFF8000,d0
    368  1.1  mycroft 	BGT.W		ATANBIG	...I.E. |X| >= 16
    369  1.1  mycroft 
    370  1.1  mycroft ATANSM:
    371  1.1  mycroft *--|X| <= 1/16
    372  1.1  mycroft *--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHERWISE, APPROXIMATE
    373  1.1  mycroft *--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y*(B5+Y*B6)))))
    374  1.1  mycroft *--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(B2+Z*(B4+Z*B6)] )
    375  1.1  mycroft *--WHERE Y = X*X, AND Z = Y*Y.
    376  1.1  mycroft 
    377  1.1  mycroft 	CMPI.L		#$3FD78000,d0
    378  1.1  mycroft 	BLT.W		ATANTINY
    379  1.1  mycroft *--COMPUTE POLYNOMIAL
    380  1.1  mycroft 	FMUL.X		FP0,FP0	...FP0 IS Y = X*X
    381  1.1  mycroft 
    382  1.1  mycroft 	
    383  1.1  mycroft 	MOVE.W		#$0000,XDCARE(a6)
    384  1.1  mycroft 
    385  1.1  mycroft 	FMOVE.X		FP0,FP1
    386  1.1  mycroft 	FMUL.X		FP1,FP1		...FP1 IS Z = Y*Y
    387  1.1  mycroft 
    388  1.1  mycroft 	FMOVE.D		ATANB6,FP2
    389  1.1  mycroft 	FMOVE.D		ATANB5,FP3
    390  1.1  mycroft 
    391  1.1  mycroft 	FMUL.X		FP1,FP2		...Z*B6
    392  1.1  mycroft 	FMUL.X		FP1,FP3		...Z*B5
    393  1.1  mycroft 
    394  1.1  mycroft 	FADD.D		ATANB4,FP2	...B4+Z*B6
    395  1.1  mycroft 	FADD.D		ATANB3,FP3	...B3+Z*B5
    396  1.1  mycroft 
    397  1.1  mycroft 	FMUL.X		FP1,FP2		...Z*(B4+Z*B6)
    398  1.1  mycroft 	FMUL.X		FP3,FP1		...Z*(B3+Z*B5)
    399  1.1  mycroft 
    400  1.1  mycroft 	FADD.D		ATANB2,FP2	...B2+Z*(B4+Z*B6)
    401  1.1  mycroft 	FADD.D		ATANB1,FP1	...B1+Z*(B3+Z*B5)
    402  1.1  mycroft 
    403  1.1  mycroft 	FMUL.X		FP0,FP2		...Y*(B2+Z*(B4+Z*B6))
    404  1.1  mycroft 	FMUL.X		X(a6),FP0		...X*Y
    405  1.1  mycroft 
    406  1.1  mycroft 	FADD.X		FP2,FP1		...[B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]
    407  1.1  mycroft 	
    408  1.1  mycroft 
    409  1.1  mycroft 	FMUL.X		FP1,FP0	...X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))])
    410  1.1  mycroft 
    411  1.1  mycroft 	FMOVE.L		d1,FPCR		;restore users exceptions
    412  1.1  mycroft 	FADD.X		X(a6),FP0
    413  1.1  mycroft 
    414  1.1  mycroft 	bra		t_frcinx
    415  1.1  mycroft 
    416  1.1  mycroft ATANTINY:
    417  1.1  mycroft *--|X| < 2^(-40), ATAN(X) = X
    418  1.1  mycroft 	MOVE.W		#$0000,XDCARE(a6)
    419  1.1  mycroft 
    420  1.1  mycroft 	FMOVE.L		d1,FPCR		;restore users exceptions
    421  1.1  mycroft 	FMOVE.X		X(a6),FP0	;last inst - possible exception set
    422  1.1  mycroft 
    423  1.1  mycroft 	bra		t_frcinx
    424  1.1  mycroft 
    425  1.1  mycroft ATANBIG:
    426  1.1  mycroft *--IF |X| > 2^(100), RETURN	SIGN(X)*(PI/2 - TINY). OTHERWISE,
    427  1.1  mycroft *--RETURN SIGN(X)*PI/2 + ATAN(-1/X).
    428  1.1  mycroft 	CMPI.L		#$40638000,d0
    429  1.1  mycroft 	BGT.W		ATANHUGE
    430  1.1  mycroft 
    431  1.1  mycroft *--APPROXIMATE ATAN(-1/X) BY
    432  1.1  mycroft *--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' = -1/X, Y = X'*X'
    433  1.1  mycroft *--THIS CAN BE RE-WRITTEN AS
    434  1.1  mycroft *--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] ), Z = Y*Y.
    435  1.1  mycroft 
    436  1.1  mycroft 	FMOVE.S		#:BF800000,FP1	...LOAD -1
    437  1.1  mycroft 	FDIV.X		FP0,FP1		...FP1 IS -1/X
    438  1.1  mycroft 
    439  1.1  mycroft 	
    440  1.1  mycroft *--DIVIDE IS STILL CRANKING
    441  1.1  mycroft 
    442  1.1  mycroft 	FMOVE.X		FP1,FP0		...FP0 IS X'
    443  1.1  mycroft 	FMUL.X		FP0,FP0		...FP0 IS Y = X'*X'
    444  1.1  mycroft 	FMOVE.X		FP1,X(a6)		...X IS REALLY X'
    445  1.1  mycroft 
    446  1.1  mycroft 	FMOVE.X		FP0,FP1
    447  1.1  mycroft 	FMUL.X		FP1,FP1		...FP1 IS Z = Y*Y
    448  1.1  mycroft 
    449  1.1  mycroft 	FMOVE.D		ATANC5,FP3
    450  1.1  mycroft 	FMOVE.D		ATANC4,FP2
    451  1.1  mycroft 
    452  1.1  mycroft 	FMUL.X		FP1,FP3		...Z*C5
    453  1.1  mycroft 	FMUL.X		FP1,FP2		...Z*B4
    454  1.1  mycroft 
    455  1.1  mycroft 	FADD.D		ATANC3,FP3	...C3+Z*C5
    456  1.1  mycroft 	FADD.D		ATANC2,FP2	...C2+Z*C4
    457  1.1  mycroft 
    458  1.1  mycroft 	FMUL.X		FP3,FP1		...Z*(C3+Z*C5), FP3 RELEASED
    459  1.1  mycroft 	FMUL.X		FP0,FP2		...Y*(C2+Z*C4)
    460  1.1  mycroft 
    461  1.1  mycroft 	FADD.D		ATANC1,FP1	...C1+Z*(C3+Z*C5)
    462  1.1  mycroft 	FMUL.X		X(a6),FP0		...X'*Y
    463  1.1  mycroft 
    464  1.1  mycroft 	FADD.X		FP2,FP1		...[Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)]
    465  1.1  mycroft 	
    466  1.1  mycroft 
    467  1.1  mycroft 	FMUL.X		FP1,FP0		...X'*Y*([B1+Z*(B3+Z*B5)]
    468  1.1  mycroft *					...	+[Y*(B2+Z*(B4+Z*B6))])
    469  1.1  mycroft 	FADD.X		X(a6),FP0
    470  1.1  mycroft 
    471  1.1  mycroft 	FMOVE.L		d1,FPCR		;restore users exceptions
    472  1.1  mycroft 	
    473  1.1  mycroft 	btst.b		#7,(a0)
    474  1.1  mycroft 	beq.b		pos_big
    475  1.1  mycroft 
    476  1.1  mycroft neg_big:
    477  1.1  mycroft 	FADD.X		NPIBY2,FP0
    478  1.1  mycroft 	bra		t_frcinx
    479  1.1  mycroft 
    480  1.1  mycroft pos_big:
    481  1.1  mycroft 	FADD.X		PPIBY2,FP0
    482  1.1  mycroft 	bra		t_frcinx
    483  1.1  mycroft 
    484  1.1  mycroft ATANHUGE:
    485  1.1  mycroft *--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PIBY2 - SIGN(X)*TINY
    486  1.1  mycroft 	btst.b		#7,(a0)
    487  1.1  mycroft 	beq.b		pos_huge
    488  1.1  mycroft 
    489  1.1  mycroft neg_huge:
    490  1.1  mycroft 	FMOVE.X		NPIBY2,fp0
    491  1.1  mycroft 	fmove.l		d1,fpcr
    492  1.1  mycroft 	fsub.x		NTINY,fp0
    493  1.1  mycroft 	bra		t_frcinx
    494  1.1  mycroft 
    495  1.1  mycroft pos_huge:
    496  1.1  mycroft 	FMOVE.X		PPIBY2,fp0
    497  1.1  mycroft 	fmove.l		d1,fpcr
    498  1.1  mycroft 	fsub.x		PTINY,fp0
    499  1.1  mycroft 	bra		t_frcinx
    500  1.1  mycroft 	
    501  1.1  mycroft 	end
    502