Home | History | Annotate | Line # | Download | only in fpsp
stwotox.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 *	stwotox.sa 3.1 12/10/90
     33  1.1  mycroft *
     34  1.1  mycroft *	stwotox  --- 2**X
     35  1.1  mycroft *	stwotoxd --- 2**X for denormalized X
     36  1.1  mycroft *	stentox  --- 10**X
     37  1.1  mycroft *	stentoxd --- 10**X for denormalized X
     38  1.1  mycroft *
     39  1.1  mycroft *	Input: Double-extended number X in location pointed to
     40  1.1  mycroft *		by address register a0.
     41  1.1  mycroft *
     42  1.1  mycroft *	Output: The function values are returned in Fp0.
     43  1.1  mycroft *
     44  1.1  mycroft *	Accuracy and Monotonicity: The returned result is within 2 ulps in
     45  1.1  mycroft *		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
     46  1.1  mycroft *		result is subsequently rounded to double precision. The
     47  1.1  mycroft *		result is provably monotonic in double precision.
     48  1.1  mycroft *
     49  1.1  mycroft *	Speed: The program stwotox takes approximately 190 cycles and the
     50  1.1  mycroft *		program stentox takes approximately 200 cycles.
     51  1.1  mycroft *
     52  1.1  mycroft *	Algorithm:
     53  1.1  mycroft *
     54  1.1  mycroft *	twotox
     55  1.1  mycroft *	1. If |X| > 16480, go to ExpBig.
     56  1.1  mycroft *
     57  1.1  mycroft *	2. If |X| < 2**(-70), go to ExpSm.
     58  1.1  mycroft *
     59  1.1  mycroft *	3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
     60  1.1  mycroft *		decompose N as
     61  1.1  mycroft *		 N = 64(M + M') + j,  j = 0,1,2,...,63.
     62  1.1  mycroft *
     63  1.1  mycroft *	4. Overwrite r := r * log2. Then
     64  1.1  mycroft *		2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
     65  1.1  mycroft *		Go to expr to compute that expression.
     66  1.1  mycroft *
     67  1.1  mycroft *	tentox
     68  1.1  mycroft *	1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
     69  1.1  mycroft *
     70  1.1  mycroft *	2. If |X| < 2**(-70), go to ExpSm.
     71  1.1  mycroft *
     72  1.1  mycroft *	3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
     73  1.1  mycroft *		N := round-to-int(y). Decompose N as
     74  1.1  mycroft *		 N = 64(M + M') + j,  j = 0,1,2,...,63.
     75  1.1  mycroft *
     76  1.1  mycroft *	4. Define r as
     77  1.1  mycroft *		r := ((X - N*L1)-N*L2) * L10
     78  1.1  mycroft *		where L1, L2 are the leading and trailing parts of log_10(2)/64
     79  1.1  mycroft *		and L10 is the natural log of 10. Then
     80  1.1  mycroft *		10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
     81  1.1  mycroft *		Go to expr to compute that expression.
     82  1.1  mycroft *
     83  1.1  mycroft *	expr
     84  1.1  mycroft *	1. Fetch 2**(j/64) from table as Fact1 and Fact2.
     85  1.1  mycroft *
     86  1.1  mycroft *	2. Overwrite Fact1 and Fact2 by
     87  1.1  mycroft *		Fact1 := 2**(M) * Fact1
     88  1.1  mycroft *		Fact2 := 2**(M) * Fact2
     89  1.1  mycroft *		Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
     90  1.1  mycroft *
     91  1.1  mycroft *	3. Calculate P where 1 + P approximates exp(r):
     92  1.1  mycroft *		P = r + r*r*(A1+r*(A2+...+r*A5)).
     93  1.1  mycroft *
     94  1.1  mycroft *	4. Let AdjFact := 2**(M'). Return
     95  1.1  mycroft *		AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
     96  1.1  mycroft *		Exit.
     97  1.1  mycroft *
     98  1.1  mycroft *	ExpBig
     99  1.1  mycroft *	1. Generate overflow by Huge * Huge if X > 0; otherwise, generate
    100  1.1  mycroft *		underflow by Tiny * Tiny.
    101  1.1  mycroft *
    102  1.1  mycroft *	ExpSm
    103  1.1  mycroft *	1. Return 1 + X.
    104  1.1  mycroft *
    105  1.1  mycroft 
    106  1.1  mycroft STWOTOX	IDNT	2,1 Motorola 040 Floating Point Software Package
    107  1.1  mycroft 
    108  1.1  mycroft 	section	8
    109  1.1  mycroft 
    110  1.1  mycroft 	include	fpsp.h
    111  1.1  mycroft 
    112  1.1  mycroft BOUNDS1	DC.L $3FB98000,$400D80C0 ... 2^(-70),16480
    113  1.1  mycroft BOUNDS2	DC.L $3FB98000,$400B9B07 ... 2^(-70),16480 LOG2/LOG10
    114  1.1  mycroft 
    115  1.1  mycroft L2TEN64	DC.L $406A934F,$0979A371 ... 64LOG10/LOG2
    116  1.1  mycroft L10TWO1	DC.L $3F734413,$509F8000 ... LOG2/64LOG10
    117  1.1  mycroft 
    118  1.1  mycroft L10TWO2	DC.L $BFCD0000,$C0219DC1,$DA994FD2,$00000000
    119  1.1  mycroft 
    120  1.1  mycroft LOG10	DC.L $40000000,$935D8DDD,$AAA8AC17,$00000000
    121  1.1  mycroft 
    122  1.1  mycroft LOG2	DC.L $3FFE0000,$B17217F7,$D1CF79AC,$00000000
    123  1.1  mycroft 
    124  1.1  mycroft EXPA5	DC.L $3F56C16D,$6F7BD0B2
    125  1.1  mycroft EXPA4	DC.L $3F811112,$302C712C
    126  1.1  mycroft EXPA3	DC.L $3FA55555,$55554CC1
    127  1.1  mycroft EXPA2	DC.L $3FC55555,$55554A54
    128  1.1  mycroft EXPA1	DC.L $3FE00000,$00000000,$00000000,$00000000
    129  1.1  mycroft 
    130  1.1  mycroft HUGE	DC.L $7FFE0000,$FFFFFFFF,$FFFFFFFF,$00000000
    131  1.1  mycroft TINY	DC.L $00010000,$FFFFFFFF,$FFFFFFFF,$00000000
    132  1.1  mycroft 
    133  1.1  mycroft EXPTBL
    134  1.1  mycroft 	DC.L  $3FFF0000,$80000000,$00000000,$3F738000
    135  1.1  mycroft 	DC.L  $3FFF0000,$8164D1F3,$BC030773,$3FBEF7CA
    136  1.1  mycroft 	DC.L  $3FFF0000,$82CD8698,$AC2BA1D7,$3FBDF8A9
    137  1.1  mycroft 	DC.L  $3FFF0000,$843A28C3,$ACDE4046,$3FBCD7C9
    138  1.1  mycroft 	DC.L  $3FFF0000,$85AAC367,$CC487B15,$BFBDE8DA
    139  1.1  mycroft 	DC.L  $3FFF0000,$871F6196,$9E8D1010,$3FBDE85C
    140  1.1  mycroft 	DC.L  $3FFF0000,$88980E80,$92DA8527,$3FBEBBF1
    141  1.1  mycroft 	DC.L  $3FFF0000,$8A14D575,$496EFD9A,$3FBB80CA
    142  1.1  mycroft 	DC.L  $3FFF0000,$8B95C1E3,$EA8BD6E7,$BFBA8373
    143  1.1  mycroft 	DC.L  $3FFF0000,$8D1ADF5B,$7E5BA9E6,$BFBE9670
    144  1.1  mycroft 	DC.L  $3FFF0000,$8EA4398B,$45CD53C0,$3FBDB700
    145  1.1  mycroft 	DC.L  $3FFF0000,$9031DC43,$1466B1DC,$3FBEEEB0
    146  1.1  mycroft 	DC.L  $3FFF0000,$91C3D373,$AB11C336,$3FBBFD6D
    147  1.1  mycroft 	DC.L  $3FFF0000,$935A2B2F,$13E6E92C,$BFBDB319
    148  1.1  mycroft 	DC.L  $3FFF0000,$94F4EFA8,$FEF70961,$3FBDBA2B
    149  1.1  mycroft 	DC.L  $3FFF0000,$96942D37,$20185A00,$3FBE91D5
    150  1.1  mycroft 	DC.L  $3FFF0000,$9837F051,$8DB8A96F,$3FBE8D5A
    151  1.1  mycroft 	DC.L  $3FFF0000,$99E04593,$20B7FA65,$BFBCDE7B
    152  1.1  mycroft 	DC.L  $3FFF0000,$9B8D39B9,$D54E5539,$BFBEBAAF
    153  1.1  mycroft 	DC.L  $3FFF0000,$9D3ED9A7,$2CFFB751,$BFBD86DA
    154  1.1  mycroft 	DC.L  $3FFF0000,$9EF53260,$91A111AE,$BFBEBEDD
    155  1.1  mycroft 	DC.L  $3FFF0000,$A0B0510F,$B9714FC2,$3FBCC96E
    156  1.1  mycroft 	DC.L  $3FFF0000,$A2704303,$0C496819,$BFBEC90B
    157  1.1  mycroft 	DC.L  $3FFF0000,$A43515AE,$09E6809E,$3FBBD1DB
    158  1.1  mycroft 	DC.L  $3FFF0000,$A5FED6A9,$B15138EA,$3FBCE5EB
    159  1.1  mycroft 	DC.L  $3FFF0000,$A7CD93B4,$E965356A,$BFBEC274
    160  1.1  mycroft 	DC.L  $3FFF0000,$A9A15AB4,$EA7C0EF8,$3FBEA83C
    161  1.1  mycroft 	DC.L  $3FFF0000,$AB7A39B5,$A93ED337,$3FBECB00
    162  1.1  mycroft 	DC.L  $3FFF0000,$AD583EEA,$42A14AC6,$3FBE9301
    163  1.1  mycroft 	DC.L  $3FFF0000,$AF3B78AD,$690A4375,$BFBD8367
    164  1.1  mycroft 	DC.L  $3FFF0000,$B123F581,$D2AC2590,$BFBEF05F
    165  1.1  mycroft 	DC.L  $3FFF0000,$B311C412,$A9112489,$3FBDFB3C
    166  1.1  mycroft 	DC.L  $3FFF0000,$B504F333,$F9DE6484,$3FBEB2FB
    167  1.1  mycroft 	DC.L  $3FFF0000,$B6FD91E3,$28D17791,$3FBAE2CB
    168  1.1  mycroft 	DC.L  $3FFF0000,$B8FBAF47,$62FB9EE9,$3FBCDC3C
    169  1.1  mycroft 	DC.L  $3FFF0000,$BAFF5AB2,$133E45FB,$3FBEE9AA
    170  1.1  mycroft 	DC.L  $3FFF0000,$BD08A39F,$580C36BF,$BFBEAEFD
    171  1.1  mycroft 	DC.L  $3FFF0000,$BF1799B6,$7A731083,$BFBCBF51
    172  1.1  mycroft 	DC.L  $3FFF0000,$C12C4CCA,$66709456,$3FBEF88A
    173  1.1  mycroft 	DC.L  $3FFF0000,$C346CCDA,$24976407,$3FBD83B2
    174  1.1  mycroft 	DC.L  $3FFF0000,$C5672A11,$5506DADD,$3FBDF8AB
    175  1.1  mycroft 	DC.L  $3FFF0000,$C78D74C8,$ABB9B15D,$BFBDFB17
    176  1.1  mycroft 	DC.L  $3FFF0000,$C9B9BD86,$6E2F27A3,$BFBEFE3C
    177  1.1  mycroft 	DC.L  $3FFF0000,$CBEC14FE,$F2727C5D,$BFBBB6F8
    178  1.1  mycroft 	DC.L  $3FFF0000,$CE248C15,$1F8480E4,$BFBCEE53
    179  1.1  mycroft 	DC.L  $3FFF0000,$D06333DA,$EF2B2595,$BFBDA4AE
    180  1.1  mycroft 	DC.L  $3FFF0000,$D2A81D91,$F12AE45A,$3FBC9124
    181  1.1  mycroft 	DC.L  $3FFF0000,$D4F35AAB,$CFEDFA1F,$3FBEB243
    182  1.1  mycroft 	DC.L  $3FFF0000,$D744FCCA,$D69D6AF4,$3FBDE69A
    183  1.1  mycroft 	DC.L  $3FFF0000,$D99D15C2,$78AFD7B6,$BFB8BC61
    184  1.1  mycroft 	DC.L  $3FFF0000,$DBFBB797,$DAF23755,$3FBDF610
    185  1.1  mycroft 	DC.L  $3FFF0000,$DE60F482,$5E0E9124,$BFBD8BE1
    186  1.1  mycroft 	DC.L  $3FFF0000,$E0CCDEEC,$2A94E111,$3FBACB12
    187  1.1  mycroft 	DC.L  $3FFF0000,$E33F8972,$BE8A5A51,$3FBB9BFE
    188  1.1  mycroft 	DC.L  $3FFF0000,$E5B906E7,$7C8348A8,$3FBCF2F4
    189  1.1  mycroft 	DC.L  $3FFF0000,$E8396A50,$3C4BDC68,$3FBEF22F
    190  1.1  mycroft 	DC.L  $3FFF0000,$EAC0C6E7,$DD24392F,$BFBDBF4A
    191  1.1  mycroft 	DC.L  $3FFF0000,$ED4F301E,$D9942B84,$3FBEC01A
    192  1.1  mycroft 	DC.L  $3FFF0000,$EFE4B99B,$DCDAF5CB,$3FBE8CAC
    193  1.1  mycroft 	DC.L  $3FFF0000,$F281773C,$59FFB13A,$BFBCBB3F
    194  1.1  mycroft 	DC.L  $3FFF0000,$F5257D15,$2486CC2C,$3FBEF73A
    195  1.1  mycroft 	DC.L  $3FFF0000,$F7D0DF73,$0AD13BB9,$BFB8B795
    196  1.1  mycroft 	DC.L  $3FFF0000,$FA83B2DB,$722A033A,$3FBEF84B
    197  1.1  mycroft 	DC.L  $3FFF0000,$FD3E0C0C,$F486C175,$BFBEF581
    198  1.1  mycroft 
    199  1.1  mycroft N	equ	L_SCR1
    200  1.1  mycroft 
    201  1.1  mycroft X	equ	FP_SCR1
    202  1.1  mycroft XDCARE	equ	X+2
    203  1.1  mycroft XFRAC	equ	X+4
    204  1.1  mycroft 
    205  1.1  mycroft ADJFACT	equ	FP_SCR2
    206  1.1  mycroft 
    207  1.1  mycroft FACT1	equ	FP_SCR3
    208  1.1  mycroft FACT1HI	equ	FACT1+4
    209  1.1  mycroft FACT1LOW equ	FACT1+8
    210  1.1  mycroft 
    211  1.1  mycroft FACT2	equ	FP_SCR4
    212  1.1  mycroft FACT2HI	equ	FACT2+4
    213  1.1  mycroft FACT2LOW equ	FACT2+8
    214  1.1  mycroft 
    215  1.1  mycroft 	xref	t_unfl
    216  1.1  mycroft 	xref	t_ovfl
    217  1.1  mycroft 	xref	t_frcinx
    218  1.1  mycroft 
    219  1.1  mycroft 	xdef	stwotoxd
    220  1.1  mycroft stwotoxd:
    221  1.1  mycroft *--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
    222  1.1  mycroft 
    223  1.1  mycroft 	fmove.l		d1,fpcr		...set user's rounding mode/precision
    224  1.1  mycroft 	Fmove.S		#:3F800000,FP0  ...RETURN 1 + X
    225  1.1  mycroft 	move.l		(a0),d0
    226  1.1  mycroft 	or.l		#$00800001,d0
    227  1.1  mycroft 	fadd.s		d0,fp0
    228  1.1  mycroft 	bra		t_frcinx
    229  1.1  mycroft 
    230  1.1  mycroft 	xdef	stwotox
    231  1.1  mycroft stwotox:
    232  1.1  mycroft *--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
    233  1.1  mycroft 	FMOVEM.X	(a0),FP0	...LOAD INPUT, do not set cc's
    234  1.1  mycroft 
    235  1.1  mycroft 	MOVE.L		(A0),D0
    236  1.1  mycroft 	MOVE.W		4(A0),D0
    237  1.1  mycroft 	FMOVE.X		FP0,X(a6)
    238  1.1  mycroft 	ANDI.L		#$7FFFFFFF,D0
    239  1.1  mycroft 
    240  1.1  mycroft 	CMPI.L		#$3FB98000,D0		...|X| >= 2**(-70)?
    241  1.1  mycroft 	BGE.B		TWOOK1
    242  1.1  mycroft 	BRA.W		EXPBORS
    243  1.1  mycroft 
    244  1.1  mycroft TWOOK1:
    245  1.1  mycroft 	CMPI.L		#$400D80C0,D0		...|X| > 16480?
    246  1.1  mycroft 	BLE.B		TWOMAIN
    247  1.1  mycroft 	BRA.W		EXPBORS
    248  1.1  mycroft 	
    249  1.1  mycroft 
    250  1.1  mycroft TWOMAIN:
    251  1.1  mycroft *--USUAL CASE, 2^(-70) <= |X| <= 16480
    252  1.1  mycroft 
    253  1.1  mycroft 	FMOVE.X		FP0,FP1
    254  1.1  mycroft 	FMUL.S		#:42800000,FP1  ...64 * X
    255  1.1  mycroft 	
    256  1.1  mycroft 	FMOVE.L		FP1,N(a6)		...N = ROUND-TO-INT(64 X)
    257  1.1  mycroft 	MOVE.L		d2,-(sp)
    258  1.1  mycroft 	LEA		EXPTBL,a1 	...LOAD ADDRESS OF TABLE OF 2^(J/64)
    259  1.1  mycroft 	FMOVE.L		N(a6),FP1		...N --> FLOATING FMT
    260  1.1  mycroft 	MOVE.L		N(a6),D0
    261  1.1  mycroft 	MOVE.L		D0,d2
    262  1.1  mycroft 	ANDI.L		#$3F,D0		...D0 IS J
    263  1.1  mycroft 	ASL.L		#4,D0		...DISPLACEMENT FOR 2^(J/64)
    264  1.1  mycroft 	ADDA.L		D0,a1		...ADDRESS FOR 2^(J/64)
    265  1.1  mycroft 	ASR.L		#6,d2		...d2 IS L, N = 64L + J
    266  1.1  mycroft 	MOVE.L		d2,D0
    267  1.1  mycroft 	ASR.L		#1,D0		...D0 IS M
    268  1.1  mycroft 	SUB.L		D0,d2		...d2 IS M', N = 64(M+M') + J
    269  1.1  mycroft 	ADDI.L		#$3FFF,d2
    270  1.1  mycroft 	MOVE.W		d2,ADJFACT(a6) 	...ADJFACT IS 2^(M')
    271  1.1  mycroft 	MOVE.L		(sp)+,d2
    272  1.1  mycroft *--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
    273  1.1  mycroft *--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
    274  1.1  mycroft *--ADJFACT = 2^(M').
    275  1.1  mycroft *--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
    276  1.1  mycroft 
    277  1.1  mycroft 	FMUL.S		#:3C800000,FP1  ...(1/64)*N
    278  1.1  mycroft 	MOVE.L		(a1)+,FACT1(a6)
    279  1.1  mycroft 	MOVE.L		(a1)+,FACT1HI(a6)
    280  1.1  mycroft 	MOVE.L		(a1)+,FACT1LOW(a6)
    281  1.1  mycroft 	MOVE.W		(a1)+,FACT2(a6)
    282  1.1  mycroft 	clr.w		FACT2+2(a6)
    283  1.1  mycroft 
    284  1.1  mycroft 	FSUB.X		FP1,FP0	 	...X - (1/64)*INT(64 X)
    285  1.1  mycroft 
    286  1.1  mycroft 	MOVE.W		(a1)+,FACT2HI(a6)
    287  1.1  mycroft 	clr.w		FACT2HI+2(a6)
    288  1.1  mycroft 	clr.l		FACT2LOW(a6)
    289  1.1  mycroft 	ADD.W		D0,FACT1(a6)
    290  1.1  mycroft 	
    291  1.1  mycroft 	FMUL.X		LOG2,FP0	...FP0 IS R
    292  1.1  mycroft 	ADD.W		D0,FACT2(a6)
    293  1.1  mycroft 
    294  1.1  mycroft 	BRA.W		expr
    295  1.1  mycroft 
    296  1.1  mycroft EXPBORS:
    297  1.1  mycroft *--FPCR, D0 SAVED
    298  1.1  mycroft 	CMPI.L		#$3FFF8000,D0
    299  1.1  mycroft 	BGT.B		EXPBIG
    300  1.1  mycroft 
    301  1.1  mycroft EXPSM:
    302  1.1  mycroft *--|X| IS SMALL, RETURN 1 + X
    303  1.1  mycroft 
    304  1.1  mycroft 	FMOVE.L		d1,FPCR		;restore users exceptions
    305  1.1  mycroft 	FADD.S		#:3F800000,FP0  ...RETURN 1 + X
    306  1.1  mycroft 
    307  1.1  mycroft 	bra		t_frcinx
    308  1.1  mycroft 
    309  1.1  mycroft EXPBIG:
    310  1.1  mycroft *--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
    311  1.1  mycroft *--REGISTERS SAVE SO FAR ARE FPCR AND  D0
    312  1.1  mycroft 	MOVE.L		X(a6),D0
    313  1.1  mycroft 	CMPI.L		#0,D0
    314  1.1  mycroft 	BLT.B		EXPNEG
    315  1.1  mycroft 
    316  1.1  mycroft 	bclr.b		#7,(a0)		;t_ovfl expects positive value
    317  1.1  mycroft 	bra		t_ovfl
    318  1.1  mycroft 
    319  1.1  mycroft EXPNEG:
    320  1.1  mycroft 	bclr.b		#7,(a0)		;t_unfl expects positive value
    321  1.1  mycroft 	bra		t_unfl
    322  1.1  mycroft 
    323  1.1  mycroft 	xdef	stentoxd
    324  1.1  mycroft stentoxd:
    325  1.1  mycroft *--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
    326  1.1  mycroft 
    327  1.1  mycroft 	fmove.l		d1,fpcr		...set user's rounding mode/precision
    328  1.1  mycroft 	Fmove.S		#:3F800000,FP0  ...RETURN 1 + X
    329  1.1  mycroft 	move.l		(a0),d0
    330  1.1  mycroft 	or.l		#$00800001,d0
    331  1.1  mycroft 	fadd.s		d0,fp0
    332  1.1  mycroft 	bra		t_frcinx
    333  1.1  mycroft 
    334  1.1  mycroft 	xdef	stentox
    335  1.1  mycroft stentox:
    336  1.1  mycroft *--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
    337  1.1  mycroft 	FMOVEM.X	(a0),FP0	...LOAD INPUT, do not set cc's
    338  1.1  mycroft 
    339  1.1  mycroft 	MOVE.L		(A0),D0
    340  1.1  mycroft 	MOVE.W		4(A0),D0
    341  1.1  mycroft 	FMOVE.X		FP0,X(a6)
    342  1.1  mycroft 	ANDI.L		#$7FFFFFFF,D0
    343  1.1  mycroft 
    344  1.1  mycroft 	CMPI.L		#$3FB98000,D0		...|X| >= 2**(-70)?
    345  1.1  mycroft 	BGE.B		TENOK1
    346  1.1  mycroft 	BRA.W		EXPBORS
    347  1.1  mycroft 
    348  1.1  mycroft TENOK1:
    349  1.1  mycroft 	CMPI.L		#$400B9B07,D0		...|X| <= 16480*log2/log10 ?
    350  1.1  mycroft 	BLE.B		TENMAIN
    351  1.1  mycroft 	BRA.W		EXPBORS
    352  1.1  mycroft 
    353  1.1  mycroft TENMAIN:
    354  1.1  mycroft *--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
    355  1.1  mycroft 
    356  1.1  mycroft 	FMOVE.X		FP0,FP1
    357  1.1  mycroft 	FMUL.D		L2TEN64,FP1	...X*64*LOG10/LOG2
    358  1.1  mycroft 	
    359  1.1  mycroft 	FMOVE.L		FP1,N(a6)		...N=INT(X*64*LOG10/LOG2)
    360  1.1  mycroft 	MOVE.L		d2,-(sp)
    361  1.1  mycroft 	LEA		EXPTBL,a1 	...LOAD ADDRESS OF TABLE OF 2^(J/64)
    362  1.1  mycroft 	FMOVE.L		N(a6),FP1		...N --> FLOATING FMT
    363  1.1  mycroft 	MOVE.L		N(a6),D0
    364  1.1  mycroft 	MOVE.L		D0,d2
    365  1.1  mycroft 	ANDI.L		#$3F,D0		...D0 IS J
    366  1.1  mycroft 	ASL.L		#4,D0		...DISPLACEMENT FOR 2^(J/64)
    367  1.1  mycroft 	ADDA.L		D0,a1		...ADDRESS FOR 2^(J/64)
    368  1.1  mycroft 	ASR.L		#6,d2		...d2 IS L, N = 64L + J
    369  1.1  mycroft 	MOVE.L		d2,D0
    370  1.1  mycroft 	ASR.L		#1,D0		...D0 IS M
    371  1.1  mycroft 	SUB.L		D0,d2		...d2 IS M', N = 64(M+M') + J
    372  1.1  mycroft 	ADDI.L		#$3FFF,d2
    373  1.1  mycroft 	MOVE.W		d2,ADJFACT(a6) 	...ADJFACT IS 2^(M')
    374  1.1  mycroft 	MOVE.L		(sp)+,d2
    375  1.1  mycroft 
    376  1.1  mycroft *--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
    377  1.1  mycroft *--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
    378  1.1  mycroft *--ADJFACT = 2^(M').
    379  1.1  mycroft *--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
    380  1.1  mycroft 
    381  1.1  mycroft 	FMOVE.X		FP1,FP2
    382  1.1  mycroft 
    383  1.1  mycroft 	FMUL.D		L10TWO1,FP1	...N*(LOG2/64LOG10)_LEAD
    384  1.1  mycroft 	MOVE.L		(a1)+,FACT1(a6)
    385  1.1  mycroft 
    386  1.1  mycroft 	FMUL.X		L10TWO2,FP2	...N*(LOG2/64LOG10)_TRAIL
    387  1.1  mycroft 
    388  1.1  mycroft 	MOVE.L		(a1)+,FACT1HI(a6)
    389  1.1  mycroft 	MOVE.L		(a1)+,FACT1LOW(a6)
    390  1.1  mycroft 	FSUB.X		FP1,FP0		...X - N L_LEAD
    391  1.1  mycroft 	MOVE.W		(a1)+,FACT2(a6)
    392  1.1  mycroft 
    393  1.1  mycroft 	FSUB.X		FP2,FP0		...X - N L_TRAIL
    394  1.1  mycroft 
    395  1.1  mycroft 	clr.w		FACT2+2(a6)
    396  1.1  mycroft 	MOVE.W		(a1)+,FACT2HI(a6)
    397  1.1  mycroft 	clr.w		FACT2HI+2(a6)
    398  1.1  mycroft 	clr.l		FACT2LOW(a6)
    399  1.1  mycroft 
    400  1.1  mycroft 	FMUL.X		LOG10,FP0	...FP0 IS R
    401  1.1  mycroft 	
    402  1.1  mycroft 	ADD.W		D0,FACT1(a6)
    403  1.1  mycroft 	ADD.W		D0,FACT2(a6)
    404  1.1  mycroft 
    405  1.1  mycroft expr:
    406  1.1  mycroft *--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
    407  1.1  mycroft *--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
    408  1.1  mycroft *--FP0 IS R. THE FOLLOWING CODE COMPUTES
    409  1.1  mycroft *--	2**(M'+M) * 2**(J/64) * EXP(R)
    410  1.1  mycroft 
    411  1.1  mycroft 	FMOVE.X		FP0,FP1
    412  1.1  mycroft 	FMUL.X		FP1,FP1		...FP1 IS S = R*R
    413  1.1  mycroft 
    414  1.1  mycroft 	FMOVE.D		EXPA5,FP2	...FP2 IS A5
    415  1.1  mycroft 	FMOVE.D		EXPA4,FP3	...FP3 IS A4
    416  1.1  mycroft 
    417  1.1  mycroft 	FMUL.X		FP1,FP2		...FP2 IS S*A5
    418  1.1  mycroft 	FMUL.X		FP1,FP3		...FP3 IS S*A4
    419  1.1  mycroft 
    420  1.1  mycroft 	FADD.D		EXPA3,FP2	...FP2 IS A3+S*A5
    421  1.1  mycroft 	FADD.D		EXPA2,FP3	...FP3 IS A2+S*A4
    422  1.1  mycroft 
    423  1.1  mycroft 	FMUL.X		FP1,FP2		...FP2 IS S*(A3+S*A5)
    424  1.1  mycroft 	FMUL.X		FP1,FP3		...FP3 IS S*(A2+S*A4)
    425  1.1  mycroft 
    426  1.1  mycroft 	FADD.D		EXPA1,FP2	...FP2 IS A1+S*(A3+S*A5)
    427  1.1  mycroft 	FMUL.X		FP0,FP3		...FP3 IS R*S*(A2+S*A4)
    428  1.1  mycroft 
    429  1.1  mycroft 	FMUL.X		FP1,FP2		...FP2 IS S*(A1+S*(A3+S*A5))
    430  1.1  mycroft 	FADD.X		FP3,FP0		...FP0 IS R+R*S*(A2+S*A4)
    431  1.1  mycroft 	
    432  1.1  mycroft 	FADD.X		FP2,FP0		...FP0 IS EXP(R) - 1
    433  1.1  mycroft 	
    434  1.1  mycroft 
    435  1.1  mycroft *--FINAL RECONSTRUCTION PROCESS
    436  1.1  mycroft *--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1)  -  (1 OR 0)
    437  1.1  mycroft 
    438  1.1  mycroft 	FMUL.X		FACT1(a6),FP0
    439  1.1  mycroft 	FADD.X		FACT2(a6),FP0
    440  1.1  mycroft 	FADD.X		FACT1(a6),FP0
    441  1.1  mycroft 
    442  1.1  mycroft 	FMOVE.L		d1,FPCR		;restore users exceptions
    443  1.1  mycroft 	clr.w		ADJFACT+2(a6)
    444  1.1  mycroft 	move.l		#$80000000,ADJFACT+4(a6)
    445  1.1  mycroft 	clr.l		ADJFACT+8(a6)
    446  1.1  mycroft 	FMUL.X		ADJFACT(a6),FP0	...FINAL ADJUSTMENT
    447  1.1  mycroft 
    448  1.1  mycroft 	bra		t_frcinx
    449  1.1  mycroft 
    450  1.1  mycroft 	end
    451