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