18c2ecf20Sopenharmony_ci|
28c2ecf20Sopenharmony_ci|	stwotox.sa 3.1 12/10/90
38c2ecf20Sopenharmony_ci|
48c2ecf20Sopenharmony_ci|	stwotox  --- 2**X
58c2ecf20Sopenharmony_ci|	stwotoxd --- 2**X for denormalized X
68c2ecf20Sopenharmony_ci|	stentox  --- 10**X
78c2ecf20Sopenharmony_ci|	stentoxd --- 10**X for denormalized X
88c2ecf20Sopenharmony_ci|
98c2ecf20Sopenharmony_ci|	Input: Double-extended number X in location pointed to
108c2ecf20Sopenharmony_ci|		by address register a0.
118c2ecf20Sopenharmony_ci|
128c2ecf20Sopenharmony_ci|	Output: The function values are returned in Fp0.
138c2ecf20Sopenharmony_ci|
148c2ecf20Sopenharmony_ci|	Accuracy and Monotonicity: The returned result is within 2 ulps in
158c2ecf20Sopenharmony_ci|		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
168c2ecf20Sopenharmony_ci|		result is subsequently rounded to double precision. The
178c2ecf20Sopenharmony_ci|		result is provably monotonic in double precision.
188c2ecf20Sopenharmony_ci|
198c2ecf20Sopenharmony_ci|	Speed: The program stwotox takes approximately 190 cycles and the
208c2ecf20Sopenharmony_ci|		program stentox takes approximately 200 cycles.
218c2ecf20Sopenharmony_ci|
228c2ecf20Sopenharmony_ci|	Algorithm:
238c2ecf20Sopenharmony_ci|
248c2ecf20Sopenharmony_ci|	twotox
258c2ecf20Sopenharmony_ci|	1. If |X| > 16480, go to ExpBig.
268c2ecf20Sopenharmony_ci|
278c2ecf20Sopenharmony_ci|	2. If |X| < 2**(-70), go to ExpSm.
288c2ecf20Sopenharmony_ci|
298c2ecf20Sopenharmony_ci|	3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
308c2ecf20Sopenharmony_ci|		decompose N as
318c2ecf20Sopenharmony_ci|		 N = 64(M + M') + j,  j = 0,1,2,...,63.
328c2ecf20Sopenharmony_ci|
338c2ecf20Sopenharmony_ci|	4. Overwrite r := r * log2. Then
348c2ecf20Sopenharmony_ci|		2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
358c2ecf20Sopenharmony_ci|		Go to expr to compute that expression.
368c2ecf20Sopenharmony_ci|
378c2ecf20Sopenharmony_ci|	tentox
388c2ecf20Sopenharmony_ci|	1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
398c2ecf20Sopenharmony_ci|
408c2ecf20Sopenharmony_ci|	2. If |X| < 2**(-70), go to ExpSm.
418c2ecf20Sopenharmony_ci|
428c2ecf20Sopenharmony_ci|	3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
438c2ecf20Sopenharmony_ci|		N := round-to-int(y). Decompose N as
448c2ecf20Sopenharmony_ci|		 N = 64(M + M') + j,  j = 0,1,2,...,63.
458c2ecf20Sopenharmony_ci|
468c2ecf20Sopenharmony_ci|	4. Define r as
478c2ecf20Sopenharmony_ci|		r := ((X - N*L1)-N*L2) * L10
488c2ecf20Sopenharmony_ci|		where L1, L2 are the leading and trailing parts of log_10(2)/64
498c2ecf20Sopenharmony_ci|		and L10 is the natural log of 10. Then
508c2ecf20Sopenharmony_ci|		10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
518c2ecf20Sopenharmony_ci|		Go to expr to compute that expression.
528c2ecf20Sopenharmony_ci|
538c2ecf20Sopenharmony_ci|	expr
548c2ecf20Sopenharmony_ci|	1. Fetch 2**(j/64) from table as Fact1 and Fact2.
558c2ecf20Sopenharmony_ci|
568c2ecf20Sopenharmony_ci|	2. Overwrite Fact1 and Fact2 by
578c2ecf20Sopenharmony_ci|		Fact1 := 2**(M) * Fact1
588c2ecf20Sopenharmony_ci|		Fact2 := 2**(M) * Fact2
598c2ecf20Sopenharmony_ci|		Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
608c2ecf20Sopenharmony_ci|
618c2ecf20Sopenharmony_ci|	3. Calculate P where 1 + P approximates exp(r):
628c2ecf20Sopenharmony_ci|		P = r + r*r*(A1+r*(A2+...+r*A5)).
638c2ecf20Sopenharmony_ci|
648c2ecf20Sopenharmony_ci|	4. Let AdjFact := 2**(M'). Return
658c2ecf20Sopenharmony_ci|		AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
668c2ecf20Sopenharmony_ci|		Exit.
678c2ecf20Sopenharmony_ci|
688c2ecf20Sopenharmony_ci|	ExpBig
698c2ecf20Sopenharmony_ci|	1. Generate overflow by Huge * Huge if X > 0; otherwise, generate
708c2ecf20Sopenharmony_ci|		underflow by Tiny * Tiny.
718c2ecf20Sopenharmony_ci|
728c2ecf20Sopenharmony_ci|	ExpSm
738c2ecf20Sopenharmony_ci|	1. Return 1 + X.
748c2ecf20Sopenharmony_ci|
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci|		Copyright (C) Motorola, Inc. 1990
778c2ecf20Sopenharmony_ci|			All Rights Reserved
788c2ecf20Sopenharmony_ci|
798c2ecf20Sopenharmony_ci|       For details on the license for this file, please see the
808c2ecf20Sopenharmony_ci|       file, README, in this same directory.
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci|STWOTOX	idnt	2,1 | Motorola 040 Floating Point Software Package
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	|section	8
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci#include "fpsp.h"
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ciBOUNDS1:	.long 0x3FB98000,0x400D80C0 | ... 2^(-70),16480
898c2ecf20Sopenharmony_ciBOUNDS2:	.long 0x3FB98000,0x400B9B07 | ... 2^(-70),16480 LOG2/LOG10
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciL2TEN64:	.long 0x406A934F,0x0979A371 | ... 64LOG10/LOG2
928c2ecf20Sopenharmony_ciL10TWO1:	.long 0x3F734413,0x509F8000 | ... LOG2/64LOG10
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ciL10TWO2:	.long 0xBFCD0000,0xC0219DC1,0xDA994FD2,0x00000000
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ciLOG10:	.long 0x40000000,0x935D8DDD,0xAAA8AC17,0x00000000
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ciLOG2:	.long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciEXPA5:	.long 0x3F56C16D,0x6F7BD0B2
1018c2ecf20Sopenharmony_ciEXPA4:	.long 0x3F811112,0x302C712C
1028c2ecf20Sopenharmony_ciEXPA3:	.long 0x3FA55555,0x55554CC1
1038c2ecf20Sopenharmony_ciEXPA2:	.long 0x3FC55555,0x55554A54
1048c2ecf20Sopenharmony_ciEXPA1:	.long 0x3FE00000,0x00000000,0x00000000,0x00000000
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ciHUGE:	.long 0x7FFE0000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
1078c2ecf20Sopenharmony_ciTINY:	.long 0x00010000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ciEXPTBL:
1108c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x80000000,0x00000000,0x3F738000
1118c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x8164D1F3,0xBC030773,0x3FBEF7CA
1128c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x82CD8698,0xAC2BA1D7,0x3FBDF8A9
1138c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x843A28C3,0xACDE4046,0x3FBCD7C9
1148c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x85AAC367,0xCC487B15,0xBFBDE8DA
1158c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x871F6196,0x9E8D1010,0x3FBDE85C
1168c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x88980E80,0x92DA8527,0x3FBEBBF1
1178c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x8A14D575,0x496EFD9A,0x3FBB80CA
1188c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x8B95C1E3,0xEA8BD6E7,0xBFBA8373
1198c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x8D1ADF5B,0x7E5BA9E6,0xBFBE9670
1208c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x8EA4398B,0x45CD53C0,0x3FBDB700
1218c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x9031DC43,0x1466B1DC,0x3FBEEEB0
1228c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x91C3D373,0xAB11C336,0x3FBBFD6D
1238c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x935A2B2F,0x13E6E92C,0xBFBDB319
1248c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x94F4EFA8,0xFEF70961,0x3FBDBA2B
1258c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x96942D37,0x20185A00,0x3FBE91D5
1268c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x9837F051,0x8DB8A96F,0x3FBE8D5A
1278c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x99E04593,0x20B7FA65,0xBFBCDE7B
1288c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x9B8D39B9,0xD54E5539,0xBFBEBAAF
1298c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x9D3ED9A7,0x2CFFB751,0xBFBD86DA
1308c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0x9EF53260,0x91A111AE,0xBFBEBEDD
1318c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xA0B0510F,0xB9714FC2,0x3FBCC96E
1328c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xA2704303,0x0C496819,0xBFBEC90B
1338c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xA43515AE,0x09E6809E,0x3FBBD1DB
1348c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xA5FED6A9,0xB15138EA,0x3FBCE5EB
1358c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xA7CD93B4,0xE965356A,0xBFBEC274
1368c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x3FBEA83C
1378c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xAB7A39B5,0xA93ED337,0x3FBECB00
1388c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xAD583EEA,0x42A14AC6,0x3FBE9301
1398c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xAF3B78AD,0x690A4375,0xBFBD8367
1408c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xB123F581,0xD2AC2590,0xBFBEF05F
1418c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xB311C412,0xA9112489,0x3FBDFB3C
1428c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xB504F333,0xF9DE6484,0x3FBEB2FB
1438c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xB6FD91E3,0x28D17791,0x3FBAE2CB
1448c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xB8FBAF47,0x62FB9EE9,0x3FBCDC3C
1458c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xBAFF5AB2,0x133E45FB,0x3FBEE9AA
1468c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xBD08A39F,0x580C36BF,0xBFBEAEFD
1478c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xBF1799B6,0x7A731083,0xBFBCBF51
1488c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xC12C4CCA,0x66709456,0x3FBEF88A
1498c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xC346CCDA,0x24976407,0x3FBD83B2
1508c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xC5672A11,0x5506DADD,0x3FBDF8AB
1518c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xC78D74C8,0xABB9B15D,0xBFBDFB17
1528c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xC9B9BD86,0x6E2F27A3,0xBFBEFE3C
1538c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xCBEC14FE,0xF2727C5D,0xBFBBB6F8
1548c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xCE248C15,0x1F8480E4,0xBFBCEE53
1558c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xD06333DA,0xEF2B2595,0xBFBDA4AE
1568c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xD2A81D91,0xF12AE45A,0x3FBC9124
1578c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xD4F35AAB,0xCFEDFA1F,0x3FBEB243
1588c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x3FBDE69A
1598c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xD99D15C2,0x78AFD7B6,0xBFB8BC61
1608c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xDBFBB797,0xDAF23755,0x3FBDF610
1618c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xDE60F482,0x5E0E9124,0xBFBD8BE1
1628c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xE0CCDEEC,0x2A94E111,0x3FBACB12
1638c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xE33F8972,0xBE8A5A51,0x3FBB9BFE
1648c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xE5B906E7,0x7C8348A8,0x3FBCF2F4
1658c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xE8396A50,0x3C4BDC68,0x3FBEF22F
1668c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xEAC0C6E7,0xDD24392F,0xBFBDBF4A
1678c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xED4F301E,0xD9942B84,0x3FBEC01A
1688c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xEFE4B99B,0xDCDAF5CB,0x3FBE8CAC
1698c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xF281773C,0x59FFB13A,0xBFBCBB3F
1708c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xF5257D15,0x2486CC2C,0x3FBEF73A
1718c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xF7D0DF73,0x0AD13BB9,0xBFB8B795
1728c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xFA83B2DB,0x722A033A,0x3FBEF84B
1738c2ecf20Sopenharmony_ci	.long  0x3FFF0000,0xFD3E0C0C,0xF486C175,0xBFBEF581
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	.set	N,L_SCR1
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci	.set	X,FP_SCR1
1788c2ecf20Sopenharmony_ci	.set	XDCARE,X+2
1798c2ecf20Sopenharmony_ci	.set	XFRAC,X+4
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci	.set	ADJFACT,FP_SCR2
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci	.set	FACT1,FP_SCR3
1848c2ecf20Sopenharmony_ci	.set	FACT1HI,FACT1+4
1858c2ecf20Sopenharmony_ci	.set	FACT1LOW,FACT1+8
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	.set	FACT2,FP_SCR4
1888c2ecf20Sopenharmony_ci	.set	FACT2HI,FACT2+4
1898c2ecf20Sopenharmony_ci	.set	FACT2LOW,FACT2+8
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	| xref	t_unfl
1928c2ecf20Sopenharmony_ci	|xref	t_ovfl
1938c2ecf20Sopenharmony_ci	|xref	t_frcinx
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci	.global	stwotoxd
1968c2ecf20Sopenharmony_cistwotoxd:
1978c2ecf20Sopenharmony_ci|--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci	fmovel		%d1,%fpcr		| ...set user's rounding mode/precision
2008c2ecf20Sopenharmony_ci	fmoves		#0x3F800000,%fp0  | ...RETURN 1 + X
2018c2ecf20Sopenharmony_ci	movel		(%a0),%d0
2028c2ecf20Sopenharmony_ci	orl		#0x00800001,%d0
2038c2ecf20Sopenharmony_ci	fadds		%d0,%fp0
2048c2ecf20Sopenharmony_ci	bra		t_frcinx
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci	.global	stwotox
2078c2ecf20Sopenharmony_cistwotox:
2088c2ecf20Sopenharmony_ci|--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
2098c2ecf20Sopenharmony_ci	fmovemx	(%a0),%fp0-%fp0	| ...LOAD INPUT, do not set cc's
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci	movel		(%a0),%d0
2128c2ecf20Sopenharmony_ci	movew		4(%a0),%d0
2138c2ecf20Sopenharmony_ci	fmovex		%fp0,X(%a6)
2148c2ecf20Sopenharmony_ci	andil		#0x7FFFFFFF,%d0
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci	cmpil		#0x3FB98000,%d0		| ...|X| >= 2**(-70)?
2178c2ecf20Sopenharmony_ci	bges		TWOOK1
2188c2ecf20Sopenharmony_ci	bra		EXPBORS
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ciTWOOK1:
2218c2ecf20Sopenharmony_ci	cmpil		#0x400D80C0,%d0		| ...|X| > 16480?
2228c2ecf20Sopenharmony_ci	bles		TWOMAIN
2238c2ecf20Sopenharmony_ci	bra		EXPBORS
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ciTWOMAIN:
2278c2ecf20Sopenharmony_ci|--USUAL CASE, 2^(-70) <= |X| <= 16480
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci	fmovex		%fp0,%fp1
2308c2ecf20Sopenharmony_ci	fmuls		#0x42800000,%fp1  | ...64 * X
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	fmovel		%fp1,N(%a6)		| ...N = ROUND-TO-INT(64 X)
2338c2ecf20Sopenharmony_ci	movel		%d2,-(%sp)
2348c2ecf20Sopenharmony_ci	lea		EXPTBL,%a1	| ...LOAD ADDRESS OF TABLE OF 2^(J/64)
2358c2ecf20Sopenharmony_ci	fmovel		N(%a6),%fp1		| ...N --> FLOATING FMT
2368c2ecf20Sopenharmony_ci	movel		N(%a6),%d0
2378c2ecf20Sopenharmony_ci	movel		%d0,%d2
2388c2ecf20Sopenharmony_ci	andil		#0x3F,%d0		| ...D0 IS J
2398c2ecf20Sopenharmony_ci	asll		#4,%d0		| ...DISPLACEMENT FOR 2^(J/64)
2408c2ecf20Sopenharmony_ci	addal		%d0,%a1		| ...ADDRESS FOR 2^(J/64)
2418c2ecf20Sopenharmony_ci	asrl		#6,%d2		| ...d2 IS L, N = 64L + J
2428c2ecf20Sopenharmony_ci	movel		%d2,%d0
2438c2ecf20Sopenharmony_ci	asrl		#1,%d0		| ...D0 IS M
2448c2ecf20Sopenharmony_ci	subl		%d0,%d2		| ...d2 IS M', N = 64(M+M') + J
2458c2ecf20Sopenharmony_ci	addil		#0x3FFF,%d2
2468c2ecf20Sopenharmony_ci	movew		%d2,ADJFACT(%a6)	| ...ADJFACT IS 2^(M')
2478c2ecf20Sopenharmony_ci	movel		(%sp)+,%d2
2488c2ecf20Sopenharmony_ci|--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
2498c2ecf20Sopenharmony_ci|--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
2508c2ecf20Sopenharmony_ci|--ADJFACT = 2^(M').
2518c2ecf20Sopenharmony_ci|--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	fmuls		#0x3C800000,%fp1  | ...(1/64)*N
2548c2ecf20Sopenharmony_ci	movel		(%a1)+,FACT1(%a6)
2558c2ecf20Sopenharmony_ci	movel		(%a1)+,FACT1HI(%a6)
2568c2ecf20Sopenharmony_ci	movel		(%a1)+,FACT1LOW(%a6)
2578c2ecf20Sopenharmony_ci	movew		(%a1)+,FACT2(%a6)
2588c2ecf20Sopenharmony_ci	clrw		FACT2+2(%a6)
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	fsubx		%fp1,%fp0		| ...X - (1/64)*INT(64 X)
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	movew		(%a1)+,FACT2HI(%a6)
2638c2ecf20Sopenharmony_ci	clrw		FACT2HI+2(%a6)
2648c2ecf20Sopenharmony_ci	clrl		FACT2LOW(%a6)
2658c2ecf20Sopenharmony_ci	addw		%d0,FACT1(%a6)
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	fmulx		LOG2,%fp0	| ...FP0 IS R
2688c2ecf20Sopenharmony_ci	addw		%d0,FACT2(%a6)
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci	bra		expr
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ciEXPBORS:
2738c2ecf20Sopenharmony_ci|--FPCR, D0 SAVED
2748c2ecf20Sopenharmony_ci	cmpil		#0x3FFF8000,%d0
2758c2ecf20Sopenharmony_ci	bgts		EXPBIG
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ciEXPSM:
2788c2ecf20Sopenharmony_ci|--|X| IS SMALL, RETURN 1 + X
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci	fmovel		%d1,%FPCR		|restore users exceptions
2818c2ecf20Sopenharmony_ci	fadds		#0x3F800000,%fp0  | ...RETURN 1 + X
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ci	bra		t_frcinx
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ciEXPBIG:
2868c2ecf20Sopenharmony_ci|--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
2878c2ecf20Sopenharmony_ci|--REGISTERS SAVE SO FAR ARE FPCR AND  D0
2888c2ecf20Sopenharmony_ci	movel		X(%a6),%d0
2898c2ecf20Sopenharmony_ci	cmpil		#0,%d0
2908c2ecf20Sopenharmony_ci	blts		EXPNEG
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci	bclrb		#7,(%a0)		|t_ovfl expects positive value
2938c2ecf20Sopenharmony_ci	bra		t_ovfl
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ciEXPNEG:
2968c2ecf20Sopenharmony_ci	bclrb		#7,(%a0)		|t_unfl expects positive value
2978c2ecf20Sopenharmony_ci	bra		t_unfl
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci	.global	stentoxd
3008c2ecf20Sopenharmony_cistentoxd:
3018c2ecf20Sopenharmony_ci|--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_ci	fmovel		%d1,%fpcr		| ...set user's rounding mode/precision
3048c2ecf20Sopenharmony_ci	fmoves		#0x3F800000,%fp0  | ...RETURN 1 + X
3058c2ecf20Sopenharmony_ci	movel		(%a0),%d0
3068c2ecf20Sopenharmony_ci	orl		#0x00800001,%d0
3078c2ecf20Sopenharmony_ci	fadds		%d0,%fp0
3088c2ecf20Sopenharmony_ci	bra		t_frcinx
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci	.global	stentox
3118c2ecf20Sopenharmony_cistentox:
3128c2ecf20Sopenharmony_ci|--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
3138c2ecf20Sopenharmony_ci	fmovemx	(%a0),%fp0-%fp0	| ...LOAD INPUT, do not set cc's
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci	movel		(%a0),%d0
3168c2ecf20Sopenharmony_ci	movew		4(%a0),%d0
3178c2ecf20Sopenharmony_ci	fmovex		%fp0,X(%a6)
3188c2ecf20Sopenharmony_ci	andil		#0x7FFFFFFF,%d0
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	cmpil		#0x3FB98000,%d0		| ...|X| >= 2**(-70)?
3218c2ecf20Sopenharmony_ci	bges		TENOK1
3228c2ecf20Sopenharmony_ci	bra		EXPBORS
3238c2ecf20Sopenharmony_ci
3248c2ecf20Sopenharmony_ciTENOK1:
3258c2ecf20Sopenharmony_ci	cmpil		#0x400B9B07,%d0		| ...|X| <= 16480*log2/log10 ?
3268c2ecf20Sopenharmony_ci	bles		TENMAIN
3278c2ecf20Sopenharmony_ci	bra		EXPBORS
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ciTENMAIN:
3308c2ecf20Sopenharmony_ci|--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	fmovex		%fp0,%fp1
3338c2ecf20Sopenharmony_ci	fmuld		L2TEN64,%fp1	| ...X*64*LOG10/LOG2
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_ci	fmovel		%fp1,N(%a6)		| ...N=INT(X*64*LOG10/LOG2)
3368c2ecf20Sopenharmony_ci	movel		%d2,-(%sp)
3378c2ecf20Sopenharmony_ci	lea		EXPTBL,%a1	| ...LOAD ADDRESS OF TABLE OF 2^(J/64)
3388c2ecf20Sopenharmony_ci	fmovel		N(%a6),%fp1		| ...N --> FLOATING FMT
3398c2ecf20Sopenharmony_ci	movel		N(%a6),%d0
3408c2ecf20Sopenharmony_ci	movel		%d0,%d2
3418c2ecf20Sopenharmony_ci	andil		#0x3F,%d0		| ...D0 IS J
3428c2ecf20Sopenharmony_ci	asll		#4,%d0		| ...DISPLACEMENT FOR 2^(J/64)
3438c2ecf20Sopenharmony_ci	addal		%d0,%a1		| ...ADDRESS FOR 2^(J/64)
3448c2ecf20Sopenharmony_ci	asrl		#6,%d2		| ...d2 IS L, N = 64L + J
3458c2ecf20Sopenharmony_ci	movel		%d2,%d0
3468c2ecf20Sopenharmony_ci	asrl		#1,%d0		| ...D0 IS M
3478c2ecf20Sopenharmony_ci	subl		%d0,%d2		| ...d2 IS M', N = 64(M+M') + J
3488c2ecf20Sopenharmony_ci	addil		#0x3FFF,%d2
3498c2ecf20Sopenharmony_ci	movew		%d2,ADJFACT(%a6)	| ...ADJFACT IS 2^(M')
3508c2ecf20Sopenharmony_ci	movel		(%sp)+,%d2
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ci|--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
3538c2ecf20Sopenharmony_ci|--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
3548c2ecf20Sopenharmony_ci|--ADJFACT = 2^(M').
3558c2ecf20Sopenharmony_ci|--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ci	fmovex		%fp1,%fp2
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	fmuld		L10TWO1,%fp1	| ...N*(LOG2/64LOG10)_LEAD
3608c2ecf20Sopenharmony_ci	movel		(%a1)+,FACT1(%a6)
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci	fmulx		L10TWO2,%fp2	| ...N*(LOG2/64LOG10)_TRAIL
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ci	movel		(%a1)+,FACT1HI(%a6)
3658c2ecf20Sopenharmony_ci	movel		(%a1)+,FACT1LOW(%a6)
3668c2ecf20Sopenharmony_ci	fsubx		%fp1,%fp0		| ...X - N L_LEAD
3678c2ecf20Sopenharmony_ci	movew		(%a1)+,FACT2(%a6)
3688c2ecf20Sopenharmony_ci
3698c2ecf20Sopenharmony_ci	fsubx		%fp2,%fp0		| ...X - N L_TRAIL
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci	clrw		FACT2+2(%a6)
3728c2ecf20Sopenharmony_ci	movew		(%a1)+,FACT2HI(%a6)
3738c2ecf20Sopenharmony_ci	clrw		FACT2HI+2(%a6)
3748c2ecf20Sopenharmony_ci	clrl		FACT2LOW(%a6)
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	fmulx		LOG10,%fp0	| ...FP0 IS R
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ci	addw		%d0,FACT1(%a6)
3798c2ecf20Sopenharmony_ci	addw		%d0,FACT2(%a6)
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ciexpr:
3828c2ecf20Sopenharmony_ci|--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
3838c2ecf20Sopenharmony_ci|--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
3848c2ecf20Sopenharmony_ci|--FP0 IS R. THE FOLLOWING CODE COMPUTES
3858c2ecf20Sopenharmony_ci|--	2**(M'+M) * 2**(J/64) * EXP(R)
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci	fmovex		%fp0,%fp1
3888c2ecf20Sopenharmony_ci	fmulx		%fp1,%fp1		| ...FP1 IS S = R*R
3898c2ecf20Sopenharmony_ci
3908c2ecf20Sopenharmony_ci	fmoved		EXPA5,%fp2	| ...FP2 IS A5
3918c2ecf20Sopenharmony_ci	fmoved		EXPA4,%fp3	| ...FP3 IS A4
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_ci	fmulx		%fp1,%fp2		| ...FP2 IS S*A5
3948c2ecf20Sopenharmony_ci	fmulx		%fp1,%fp3		| ...FP3 IS S*A4
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ci	faddd		EXPA3,%fp2	| ...FP2 IS A3+S*A5
3978c2ecf20Sopenharmony_ci	faddd		EXPA2,%fp3	| ...FP3 IS A2+S*A4
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci	fmulx		%fp1,%fp2		| ...FP2 IS S*(A3+S*A5)
4008c2ecf20Sopenharmony_ci	fmulx		%fp1,%fp3		| ...FP3 IS S*(A2+S*A4)
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ci	faddd		EXPA1,%fp2	| ...FP2 IS A1+S*(A3+S*A5)
4038c2ecf20Sopenharmony_ci	fmulx		%fp0,%fp3		| ...FP3 IS R*S*(A2+S*A4)
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci	fmulx		%fp1,%fp2		| ...FP2 IS S*(A1+S*(A3+S*A5))
4068c2ecf20Sopenharmony_ci	faddx		%fp3,%fp0		| ...FP0 IS R+R*S*(A2+S*A4)
4078c2ecf20Sopenharmony_ci
4088c2ecf20Sopenharmony_ci	faddx		%fp2,%fp0		| ...FP0 IS EXP(R) - 1
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci|--FINAL RECONSTRUCTION PROCESS
4128c2ecf20Sopenharmony_ci|--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1)  -  (1 OR 0)
4138c2ecf20Sopenharmony_ci
4148c2ecf20Sopenharmony_ci	fmulx		FACT1(%a6),%fp0
4158c2ecf20Sopenharmony_ci	faddx		FACT2(%a6),%fp0
4168c2ecf20Sopenharmony_ci	faddx		FACT1(%a6),%fp0
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci	fmovel		%d1,%FPCR		|restore users exceptions
4198c2ecf20Sopenharmony_ci	clrw		ADJFACT+2(%a6)
4208c2ecf20Sopenharmony_ci	movel		#0x80000000,ADJFACT+4(%a6)
4218c2ecf20Sopenharmony_ci	clrl		ADJFACT+8(%a6)
4228c2ecf20Sopenharmony_ci	fmulx		ADJFACT(%a6),%fp0	| ...FINAL ADJUSTMENT
4238c2ecf20Sopenharmony_ci
4248c2ecf20Sopenharmony_ci	bra		t_frcinx
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	|end
427