18c2ecf20Sopenharmony_ci|
28c2ecf20Sopenharmony_ci|	slogn.sa 3.1 12/10/90
38c2ecf20Sopenharmony_ci|
48c2ecf20Sopenharmony_ci|	slogn computes the natural logarithm of an
58c2ecf20Sopenharmony_ci|	input value. slognd does the same except the input value is a
68c2ecf20Sopenharmony_ci|	denormalized number. slognp1 computes log(1+X), and slognp1d
78c2ecf20Sopenharmony_ci|	computes log(1+X) for denormalized X.
88c2ecf20Sopenharmony_ci|
98c2ecf20Sopenharmony_ci|	Input: Double-extended value in memory location pointed to by address
108c2ecf20Sopenharmony_ci|		register a0.
118c2ecf20Sopenharmony_ci|
128c2ecf20Sopenharmony_ci|	Output:	log(X) or log(1+X) returned in floating-point register 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 slogn takes approximately 190 cycles for input
208c2ecf20Sopenharmony_ci|		argument X such that |X-1| >= 1/16, which is the usual
218c2ecf20Sopenharmony_ci|		situation. For those arguments, slognp1 takes approximately
228c2ecf20Sopenharmony_ci|		 210 cycles. For the less common arguments, the program will
238c2ecf20Sopenharmony_ci|		 run no worse than 10% slower.
248c2ecf20Sopenharmony_ci|
258c2ecf20Sopenharmony_ci|	Algorithm:
268c2ecf20Sopenharmony_ci|	LOGN:
278c2ecf20Sopenharmony_ci|	Step 1. If |X-1| < 1/16, approximate log(X) by an odd polynomial in
288c2ecf20Sopenharmony_ci|		u, where u = 2(X-1)/(X+1). Otherwise, move on to Step 2.
298c2ecf20Sopenharmony_ci|
308c2ecf20Sopenharmony_ci|	Step 2. X = 2**k * Y where 1 <= Y < 2. Define F to be the first seven
318c2ecf20Sopenharmony_ci|		significant bits of Y plus 2**(-7), i.e. F = 1.xxxxxx1 in base
328c2ecf20Sopenharmony_ci|		2 where the six "x" match those of Y. Note that |Y-F| <= 2**(-7).
338c2ecf20Sopenharmony_ci|
348c2ecf20Sopenharmony_ci|	Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a polynomial in u,
358c2ecf20Sopenharmony_ci|		log(1+u) = poly.
368c2ecf20Sopenharmony_ci|
378c2ecf20Sopenharmony_ci|	Step 4. Reconstruct log(X) = log( 2**k * Y ) = k*log(2) + log(F) + log(1+u)
388c2ecf20Sopenharmony_ci|		by k*log(2) + (log(F) + poly). The values of log(F) are calculated
398c2ecf20Sopenharmony_ci|		beforehand and stored in the program.
408c2ecf20Sopenharmony_ci|
418c2ecf20Sopenharmony_ci|	lognp1:
428c2ecf20Sopenharmony_ci|	Step 1: If |X| < 1/16, approximate log(1+X) by an odd polynomial in
438c2ecf20Sopenharmony_ci|		u where u = 2X/(2+X). Otherwise, move on to Step 2.
448c2ecf20Sopenharmony_ci|
458c2ecf20Sopenharmony_ci|	Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2
468c2ecf20Sopenharmony_ci|		of the algorithm for LOGN and compute log(1+X) as
478c2ecf20Sopenharmony_ci|		k*log(2) + log(F) + poly where poly approximates log(1+u),
488c2ecf20Sopenharmony_ci|		u = (Y-F)/F.
498c2ecf20Sopenharmony_ci|
508c2ecf20Sopenharmony_ci|	Implementation Notes:
518c2ecf20Sopenharmony_ci|	Note 1. There are 64 different possible values for F, thus 64 log(F)'s
528c2ecf20Sopenharmony_ci|		need to be tabulated. Moreover, the values of 1/F are also
538c2ecf20Sopenharmony_ci|		tabulated so that the division in (Y-F)/F can be performed by a
548c2ecf20Sopenharmony_ci|		multiplication.
558c2ecf20Sopenharmony_ci|
568c2ecf20Sopenharmony_ci|	Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value
578c2ecf20Sopenharmony_ci|		Y-F has to be calculated carefully when 1/2 <= X < 3/2.
588c2ecf20Sopenharmony_ci|
598c2ecf20Sopenharmony_ci|	Note 3. To fully exploit the pipeline, polynomials are usually separated
608c2ecf20Sopenharmony_ci|		into two parts evaluated independently before being added up.
618c2ecf20Sopenharmony_ci|
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci|		Copyright (C) Motorola, Inc. 1990
648c2ecf20Sopenharmony_ci|			All Rights Reserved
658c2ecf20Sopenharmony_ci|
668c2ecf20Sopenharmony_ci|       For details on the license for this file, please see the
678c2ecf20Sopenharmony_ci|       file, README, in this same directory.
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci|slogn	idnt	2,1 | Motorola 040 Floating Point Software Package
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	|section	8
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci#include "fpsp.h"
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ciBOUNDS1:  .long 0x3FFEF07D,0x3FFF8841
768c2ecf20Sopenharmony_ciBOUNDS2:  .long 0x3FFE8000,0x3FFFC000
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ciLOGOF2:	.long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cione:	.long 0x3F800000
818c2ecf20Sopenharmony_cizero:	.long 0x00000000
828c2ecf20Sopenharmony_ciinfty:	.long 0x7F800000
838c2ecf20Sopenharmony_cinegone:	.long 0xBF800000
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ciLOGA6:	.long 0x3FC2499A,0xB5E4040B
868c2ecf20Sopenharmony_ciLOGA5:	.long 0xBFC555B5,0x848CB7DB
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ciLOGA4:	.long 0x3FC99999,0x987D8730
898c2ecf20Sopenharmony_ciLOGA3:	.long 0xBFCFFFFF,0xFF6F7E97
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciLOGA2:	.long 0x3FD55555,0x555555a4
928c2ecf20Sopenharmony_ciLOGA1:	.long 0xBFE00000,0x00000008
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ciLOGB5:	.long 0x3F175496,0xADD7DAD6
958c2ecf20Sopenharmony_ciLOGB4:	.long 0x3F3C71C2,0xFE80C7E0
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ciLOGB3:	.long 0x3F624924,0x928BCCFF
988c2ecf20Sopenharmony_ciLOGB2:	.long 0x3F899999,0x999995EC
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciLOGB1:	.long 0x3FB55555,0x55555555
1018c2ecf20Sopenharmony_ciTWO:	.long 0x40000000,0x00000000
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ciLTHOLD:	.long 0x3f990000,0x80000000,0x00000000,0x00000000
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ciLOGTBL:
1068c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xFE03F80F,0xE03F80FE,0x00000000
1078c2ecf20Sopenharmony_ci	.long  0x3FF70000,0xFF015358,0x833C47E2,0x00000000
1088c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xFA232CF2,0x52138AC0,0x00000000
1098c2ecf20Sopenharmony_ci	.long  0x3FF90000,0xBDC8D83E,0xAD88D549,0x00000000
1108c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xF6603D98,0x0F6603DA,0x00000000
1118c2ecf20Sopenharmony_ci	.long  0x3FFA0000,0x9CF43DCF,0xF5EAFD48,0x00000000
1128c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xF2B9D648,0x0F2B9D65,0x00000000
1138c2ecf20Sopenharmony_ci	.long  0x3FFA0000,0xDA16EB88,0xCB8DF614,0x00000000
1148c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xEF2EB71F,0xC4345238,0x00000000
1158c2ecf20Sopenharmony_ci	.long  0x3FFB0000,0x8B29B775,0x1BD70743,0x00000000
1168c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xEBBDB2A5,0xC1619C8C,0x00000000
1178c2ecf20Sopenharmony_ci	.long  0x3FFB0000,0xA8D839F8,0x30C1FB49,0x00000000
1188c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xE865AC7B,0x7603A197,0x00000000
1198c2ecf20Sopenharmony_ci	.long  0x3FFB0000,0xC61A2EB1,0x8CD907AD,0x00000000
1208c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xE525982A,0xF70C880E,0x00000000
1218c2ecf20Sopenharmony_ci	.long  0x3FFB0000,0xE2F2A47A,0xDE3A18AF,0x00000000
1228c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xE1FC780E,0x1FC780E2,0x00000000
1238c2ecf20Sopenharmony_ci	.long  0x3FFB0000,0xFF64898E,0xDF55D551,0x00000000
1248c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xDEE95C4C,0xA037BA57,0x00000000
1258c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0x8DB956A9,0x7B3D0148,0x00000000
1268c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xDBEB61EE,0xD19C5958,0x00000000
1278c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0x9B8FE100,0xF47BA1DE,0x00000000
1288c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xD901B203,0x6406C80E,0x00000000
1298c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xA9372F1D,0x0DA1BD17,0x00000000
1308c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xD62B80D6,0x2B80D62C,0x00000000
1318c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xB6B07F38,0xCE90E46B,0x00000000
1328c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xD3680D36,0x80D3680D,0x00000000
1338c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xC3FD0329,0x06488481,0x00000000
1348c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xD0B69FCB,0xD2580D0B,0x00000000
1358c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xD11DE0FF,0x15AB18CA,0x00000000
1368c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xCE168A77,0x25080CE1,0x00000000
1378c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xDE1433A1,0x6C66B150,0x00000000
1388c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xCB8727C0,0x65C393E0,0x00000000
1398c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xEAE10B5A,0x7DDC8ADD,0x00000000
1408c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xC907DA4E,0x871146AD,0x00000000
1418c2ecf20Sopenharmony_ci	.long  0x3FFC0000,0xF7856E5E,0xE2C9B291,0x00000000
1428c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xC6980C69,0x80C6980C,0x00000000
1438c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0x82012CA5,0xA68206D7,0x00000000
1448c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xC4372F85,0x5D824CA6,0x00000000
1458c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0x882C5FCD,0x7256A8C5,0x00000000
1468c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xC1E4BBD5,0x95F6E947,0x00000000
1478c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0x8E44C60B,0x4CCFD7DE,0x00000000
1488c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xBFA02FE8,0x0BFA02FF,0x00000000
1498c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0x944AD09E,0xF4351AF6,0x00000000
1508c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xBD691047,0x07661AA3,0x00000000
1518c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0x9A3EECD4,0xC3EAA6B2,0x00000000
1528c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xBB3EE721,0xA54D880C,0x00000000
1538c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xA0218434,0x353F1DE8,0x00000000
1548c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xB92143FA,0x36F5E02E,0x00000000
1558c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xA5F2FCAB,0xBBC506DA,0x00000000
1568c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xB70FBB5A,0x19BE3659,0x00000000
1578c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xABB3B8BA,0x2AD362A5,0x00000000
1588c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xB509E68A,0x9B94821F,0x00000000
1598c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xB1641795,0xCE3CA97B,0x00000000
1608c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xB30F6352,0x8917C80B,0x00000000
1618c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xB7047551,0x5D0F1C61,0x00000000
1628c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xB11FD3B8,0x0B11FD3C,0x00000000
1638c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xBC952AFE,0xEA3D13E1,0x00000000
1648c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xAF3ADDC6,0x80AF3ADE,0x00000000
1658c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xC2168ED0,0xF458BA4A,0x00000000
1668c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xAD602B58,0x0AD602B6,0x00000000
1678c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xC788F439,0xB3163BF1,0x00000000
1688c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xAB8F69E2,0x8359CD11,0x00000000
1698c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xCCECAC08,0xBF04565D,0x00000000
1708c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA9C84A47,0xA07F5638,0x00000000
1718c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xD2420487,0x2DD85160,0x00000000
1728c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA80A80A8,0x0A80A80B,0x00000000
1738c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xD7894992,0x3BC3588A,0x00000000
1748c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA655C439,0x2D7B73A8,0x00000000
1758c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xDCC2C4B4,0x9887DACC,0x00000000
1768c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA4A9CF1D,0x96833751,0x00000000
1778c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xE1EEBD3E,0x6D6A6B9E,0x00000000
1788c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA3065E3F,0xAE7CD0E0,0x00000000
1798c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xE70D785C,0x2F9F5BDC,0x00000000
1808c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA16B312E,0xA8FC377D,0x00000000
1818c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xEC1F392C,0x5179F283,0x00000000
1828c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9FD809FD,0x809FD80A,0x00000000
1838c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xF12440D3,0xE36130E6,0x00000000
1848c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9E4CAD23,0xDD5F3A20,0x00000000
1858c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xF61CCE92,0x346600BB,0x00000000
1868c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9CC8E160,0xC3FB19B9,0x00000000
1878c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xFB091FD3,0x8145630A,0x00000000
1888c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9B4C6F9E,0xF03A3CAA,0x00000000
1898c2ecf20Sopenharmony_ci	.long  0x3FFD0000,0xFFE97042,0xBFA4C2AD,0x00000000
1908c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x99D722DA,0xBDE58F06,0x00000000
1918c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x825EFCED,0x49369330,0x00000000
1928c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9868C809,0x868C8098,0x00000000
1938c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x84C37A7A,0xB9A905C9,0x00000000
1948c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x97012E02,0x5C04B809,0x00000000
1958c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x87224C2E,0x8E645FB7,0x00000000
1968c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x95A02568,0x095A0257,0x00000000
1978c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x897B8CAC,0x9F7DE298,0x00000000
1988c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x94458094,0x45809446,0x00000000
1998c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8BCF55DE,0xC4CD05FE,0x00000000
2008c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x92F11384,0x0497889C,0x00000000
2018c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8E1DC0FB,0x89E125E5,0x00000000
2028c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x91A2B3C4,0xD5E6F809,0x00000000
2038c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9066E68C,0x955B6C9B,0x00000000
2048c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x905A3863,0x3E06C43B,0x00000000
2058c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x92AADE74,0xC7BE59E0,0x00000000
2068c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8F1779D9,0xFDC3A219,0x00000000
2078c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x94E9BFF6,0x15845643,0x00000000
2088c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8DDA5202,0x37694809,0x00000000
2098c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9723A1B7,0x20134203,0x00000000
2108c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8CA29C04,0x6514E023,0x00000000
2118c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x995899C8,0x90EB8990,0x00000000
2128c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8B70344A,0x139BC75A,0x00000000
2138c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9B88BDAA,0x3A3DAE2F,0x00000000
2148c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x8A42F870,0x5669DB46,0x00000000
2158c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9DB4224F,0xFFE1157C,0x00000000
2168c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x891AC73A,0xE9819B50,0x00000000
2178c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x9FDADC26,0x8B7A12DA,0x00000000
2188c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x87F78087,0xF78087F8,0x00000000
2198c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA1FCFF17,0xCE733BD4,0x00000000
2208c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x86D90544,0x7A34ACC6,0x00000000
2218c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA41A9E8F,0x5446FB9F,0x00000000
2228c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x85BF3761,0x2CEE3C9B,0x00000000
2238c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA633CD7E,0x6771CD8B,0x00000000
2248c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x84A9F9C8,0x084A9F9D,0x00000000
2258c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xA8489E60,0x0B435A5E,0x00000000
2268c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x83993052,0x3FBE3368,0x00000000
2278c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xAA59233C,0xCCA4BD49,0x00000000
2288c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x828CBFBE,0xB9A020A3,0x00000000
2298c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xAC656DAE,0x6BCC4985,0x00000000
2308c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x81848DA8,0xFAF0D277,0x00000000
2318c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xAE6D8EE3,0x60BB2468,0x00000000
2328c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0x80808080,0x80808081,0x00000000
2338c2ecf20Sopenharmony_ci	.long  0x3FFE0000,0xB07197A2,0x3C46C654,0x00000000
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	.set	ADJK,L_SCR1
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	.set	X,FP_SCR1
2388c2ecf20Sopenharmony_ci	.set	XDCARE,X+2
2398c2ecf20Sopenharmony_ci	.set	XFRAC,X+4
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	.set	F,FP_SCR2
2428c2ecf20Sopenharmony_ci	.set	FFRAC,F+4
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci	.set	KLOG2,FP_SCR3
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	.set	SAVEU,FP_SCR4
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ci	| xref	t_frcinx
2498c2ecf20Sopenharmony_ci	|xref	t_extdnrm
2508c2ecf20Sopenharmony_ci	|xref	t_operr
2518c2ecf20Sopenharmony_ci	|xref	t_dz
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	.global	slognd
2548c2ecf20Sopenharmony_cislognd:
2558c2ecf20Sopenharmony_ci|--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	movel		#-100,ADJK(%a6)	| ...INPUT = 2^(ADJK) * FP0
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci|----normalize the input value by left shifting k bits (k to be determined
2608c2ecf20Sopenharmony_ci|----below), adjusting exponent and storing -k to  ADJK
2618c2ecf20Sopenharmony_ci|----the value TWOTO100 is no longer needed.
2628c2ecf20Sopenharmony_ci|----Note that this code assumes the denormalized input is NON-ZERO.
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci     moveml	%d2-%d7,-(%a7)		| ...save some registers
2658c2ecf20Sopenharmony_ci     movel	#0x00000000,%d3		| ...D3 is exponent of smallest norm. #
2668c2ecf20Sopenharmony_ci     movel	4(%a0),%d4
2678c2ecf20Sopenharmony_ci     movel	8(%a0),%d5		| ...(D4,D5) is (Hi_X,Lo_X)
2688c2ecf20Sopenharmony_ci     clrl	%d2			| ...D2 used for holding K
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci     tstl	%d4
2718c2ecf20Sopenharmony_ci     bnes	HiX_not0
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ciHiX_0:
2748c2ecf20Sopenharmony_ci     movel	%d5,%d4
2758c2ecf20Sopenharmony_ci     clrl	%d5
2768c2ecf20Sopenharmony_ci     movel	#32,%d2
2778c2ecf20Sopenharmony_ci     clrl	%d6
2788c2ecf20Sopenharmony_ci     bfffo      %d4{#0:#32},%d6
2798c2ecf20Sopenharmony_ci     lsll      %d6,%d4
2808c2ecf20Sopenharmony_ci     addl	%d6,%d2			| ...(D3,D4,D5) is normalized
2818c2ecf20Sopenharmony_ci
2828c2ecf20Sopenharmony_ci     movel	%d3,X(%a6)
2838c2ecf20Sopenharmony_ci     movel	%d4,XFRAC(%a6)
2848c2ecf20Sopenharmony_ci     movel	%d5,XFRAC+4(%a6)
2858c2ecf20Sopenharmony_ci     negl	%d2
2868c2ecf20Sopenharmony_ci     movel	%d2,ADJK(%a6)
2878c2ecf20Sopenharmony_ci     fmovex	X(%a6),%fp0
2888c2ecf20Sopenharmony_ci     moveml	(%a7)+,%d2-%d7		| ...restore registers
2898c2ecf20Sopenharmony_ci     lea	X(%a6),%a0
2908c2ecf20Sopenharmony_ci     bras	LOGBGN			| ...begin regular log(X)
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ciHiX_not0:
2948c2ecf20Sopenharmony_ci     clrl	%d6
2958c2ecf20Sopenharmony_ci     bfffo	%d4{#0:#32},%d6		| ...find first 1
2968c2ecf20Sopenharmony_ci     movel	%d6,%d2			| ...get k
2978c2ecf20Sopenharmony_ci     lsll	%d6,%d4
2988c2ecf20Sopenharmony_ci     movel	%d5,%d7			| ...a copy of D5
2998c2ecf20Sopenharmony_ci     lsll	%d6,%d5
3008c2ecf20Sopenharmony_ci     negl	%d6
3018c2ecf20Sopenharmony_ci     addil	#32,%d6
3028c2ecf20Sopenharmony_ci     lsrl	%d6,%d7
3038c2ecf20Sopenharmony_ci     orl	%d7,%d4			| ...(D3,D4,D5) normalized
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci     movel	%d3,X(%a6)
3068c2ecf20Sopenharmony_ci     movel	%d4,XFRAC(%a6)
3078c2ecf20Sopenharmony_ci     movel	%d5,XFRAC+4(%a6)
3088c2ecf20Sopenharmony_ci     negl	%d2
3098c2ecf20Sopenharmony_ci     movel	%d2,ADJK(%a6)
3108c2ecf20Sopenharmony_ci     fmovex	X(%a6),%fp0
3118c2ecf20Sopenharmony_ci     moveml	(%a7)+,%d2-%d7		| ...restore registers
3128c2ecf20Sopenharmony_ci     lea	X(%a6),%a0
3138c2ecf20Sopenharmony_ci     bras	LOGBGN			| ...begin regular log(X)
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci	.global	slogn
3178c2ecf20Sopenharmony_cislogn:
3188c2ecf20Sopenharmony_ci|--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	fmovex		(%a0),%fp0	| ...LOAD INPUT
3218c2ecf20Sopenharmony_ci	movel		#0x00000000,ADJK(%a6)
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ciLOGBGN:
3248c2ecf20Sopenharmony_ci|--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS
3258c2ecf20Sopenharmony_ci|--A FINITE, NON-ZERO, NORMALIZED NUMBER.
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_ci	movel	(%a0),%d0
3288c2ecf20Sopenharmony_ci	movew	4(%a0),%d0
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci	movel	(%a0),X(%a6)
3318c2ecf20Sopenharmony_ci	movel	4(%a0),X+4(%a6)
3328c2ecf20Sopenharmony_ci	movel	8(%a0),X+8(%a6)
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	cmpil	#0,%d0		| ...CHECK IF X IS NEGATIVE
3358c2ecf20Sopenharmony_ci	blt	LOGNEG		| ...LOG OF NEGATIVE ARGUMENT IS INVALID
3368c2ecf20Sopenharmony_ci	cmp2l	BOUNDS1,%d0	| ...X IS POSITIVE, CHECK IF X IS NEAR 1
3378c2ecf20Sopenharmony_ci	bcc	LOGNEAR1	| ...BOUNDS IS ROUGHLY [15/16, 17/16]
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ciLOGMAIN:
3408c2ecf20Sopenharmony_ci|--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci|--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY.
3438c2ecf20Sopenharmony_ci|--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1.
3448c2ecf20Sopenharmony_ci|--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)
3458c2ecf20Sopenharmony_ci|--			 = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F).
3468c2ecf20Sopenharmony_ci|--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
3478c2ecf20Sopenharmony_ci|--LOG(1+U) CAN BE VERY EFFICIENT.
3488c2ecf20Sopenharmony_ci|--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
3498c2ecf20Sopenharmony_ci|--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci|--GET K, Y, F, AND ADDRESS OF 1/F.
3528c2ecf20Sopenharmony_ci	asrl	#8,%d0
3538c2ecf20Sopenharmony_ci	asrl	#8,%d0		| ...SHIFTED 16 BITS, BIASED EXPO. OF X
3548c2ecf20Sopenharmony_ci	subil	#0x3FFF,%d0	| ...THIS IS K
3558c2ecf20Sopenharmony_ci	addl	ADJK(%a6),%d0	| ...ADJUST K, ORIGINAL INPUT MAY BE  DENORM.
3568c2ecf20Sopenharmony_ci	lea	LOGTBL,%a0	| ...BASE ADDRESS OF 1/F AND LOG(F)
3578c2ecf20Sopenharmony_ci	fmovel	%d0,%fp1		| ...CONVERT K TO FLOATING-POINT FORMAT
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci|--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
3608c2ecf20Sopenharmony_ci	movel	#0x3FFF0000,X(%a6)	| ...X IS NOW Y, I.E. 2^(-K)*X
3618c2ecf20Sopenharmony_ci	movel	XFRAC(%a6),FFRAC(%a6)
3628c2ecf20Sopenharmony_ci	andil	#0xFE000000,FFRAC(%a6) | ...FIRST 7 BITS OF Y
3638c2ecf20Sopenharmony_ci	oril	#0x01000000,FFRAC(%a6) | ...GET F: ATTACH A 1 AT THE EIGHTH BIT
3648c2ecf20Sopenharmony_ci	movel	FFRAC(%a6),%d0	| ...READY TO GET ADDRESS OF 1/F
3658c2ecf20Sopenharmony_ci	andil	#0x7E000000,%d0
3668c2ecf20Sopenharmony_ci	asrl	#8,%d0
3678c2ecf20Sopenharmony_ci	asrl	#8,%d0
3688c2ecf20Sopenharmony_ci	asrl	#4,%d0		| ...SHIFTED 20, D0 IS THE DISPLACEMENT
3698c2ecf20Sopenharmony_ci	addal	%d0,%a0		| ...A0 IS THE ADDRESS FOR 1/F
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci	fmovex	X(%a6),%fp0
3728c2ecf20Sopenharmony_ci	movel	#0x3fff0000,F(%a6)
3738c2ecf20Sopenharmony_ci	clrl	F+8(%a6)
3748c2ecf20Sopenharmony_ci	fsubx	F(%a6),%fp0		| ...Y-F
3758c2ecf20Sopenharmony_ci	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...SAVE FP2 WHILE FP0 IS NOT READY
3768c2ecf20Sopenharmony_ci|--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K
3778c2ecf20Sopenharmony_ci|--REGISTERS SAVED: FPCR, FP1, FP2
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ciLP1CONT1:
3808c2ecf20Sopenharmony_ci|--AN RE-ENTRY POINT FOR LOGNP1
3818c2ecf20Sopenharmony_ci	fmulx	(%a0),%fp0	| ...FP0 IS U = (Y-F)/F
3828c2ecf20Sopenharmony_ci	fmulx	LOGOF2,%fp1	| ...GET K*LOG2 WHILE FP0 IS NOT READY
3838c2ecf20Sopenharmony_ci	fmovex	%fp0,%fp2
3848c2ecf20Sopenharmony_ci	fmulx	%fp2,%fp2		| ...FP2 IS V=U*U
3858c2ecf20Sopenharmony_ci	fmovex	%fp1,KLOG2(%a6)	| ...PUT K*LOG2 IN MEMORY, FREE FP1
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci|--LOG(1+U) IS APPROXIMATED BY
3888c2ecf20Sopenharmony_ci|--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS
3898c2ecf20Sopenharmony_ci|--[U + V*(A1+V*(A3+V*A5))]  +  [U*V*(A2+V*(A4+V*A6))]
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci	fmovex	%fp2,%fp3
3928c2ecf20Sopenharmony_ci	fmovex	%fp2,%fp1
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	fmuld	LOGA6,%fp1	| ...V*A6
3958c2ecf20Sopenharmony_ci	fmuld	LOGA5,%fp2	| ...V*A5
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci	faddd	LOGA4,%fp1	| ...A4+V*A6
3988c2ecf20Sopenharmony_ci	faddd	LOGA3,%fp2	| ...A3+V*A5
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	fmulx	%fp3,%fp1		| ...V*(A4+V*A6)
4018c2ecf20Sopenharmony_ci	fmulx	%fp3,%fp2		| ...V*(A3+V*A5)
4028c2ecf20Sopenharmony_ci
4038c2ecf20Sopenharmony_ci	faddd	LOGA2,%fp1	| ...A2+V*(A4+V*A6)
4048c2ecf20Sopenharmony_ci	faddd	LOGA1,%fp2	| ...A1+V*(A3+V*A5)
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci	fmulx	%fp3,%fp1		| ...V*(A2+V*(A4+V*A6))
4078c2ecf20Sopenharmony_ci	addal	#16,%a0		| ...ADDRESS OF LOG(F)
4088c2ecf20Sopenharmony_ci	fmulx	%fp3,%fp2		| ...V*(A1+V*(A3+V*A5)), FP3 RELEASED
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci	fmulx	%fp0,%fp1		| ...U*V*(A2+V*(A4+V*A6))
4118c2ecf20Sopenharmony_ci	faddx	%fp2,%fp0		| ...U+V*(A1+V*(A3+V*A5)), FP2 RELEASED
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci	faddx	(%a0),%fp1	| ...LOG(F)+U*V*(A2+V*(A4+V*A6))
4148c2ecf20Sopenharmony_ci	fmovemx  (%sp)+,%fp2-%fp2/%fp3	| ...RESTORE FP2
4158c2ecf20Sopenharmony_ci	faddx	%fp1,%fp0		| ...FP0 IS LOG(F) + LOG(1+U)
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci	fmovel	%d1,%fpcr
4188c2ecf20Sopenharmony_ci	faddx	KLOG2(%a6),%fp0	| ...FINAL ADD
4198c2ecf20Sopenharmony_ci	bra	t_frcinx
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ciLOGNEAR1:
4238c2ecf20Sopenharmony_ci|--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT.
4248c2ecf20Sopenharmony_ci	fmovex	%fp0,%fp1
4258c2ecf20Sopenharmony_ci	fsubs	one,%fp1		| ...FP1 IS X-1
4268c2ecf20Sopenharmony_ci	fadds	one,%fp0		| ...FP0 IS X+1
4278c2ecf20Sopenharmony_ci	faddx	%fp1,%fp1		| ...FP1 IS 2(X-1)
4288c2ecf20Sopenharmony_ci|--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL
4298c2ecf20Sopenharmony_ci|--IN U, U = 2(X-1)/(X+1) = FP1/FP0
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ciLP1CONT2:
4328c2ecf20Sopenharmony_ci|--THIS IS AN RE-ENTRY POINT FOR LOGNP1
4338c2ecf20Sopenharmony_ci	fdivx	%fp0,%fp1		| ...FP1 IS U
4348c2ecf20Sopenharmony_ci	fmovemx %fp2-%fp2/%fp3,-(%sp)	 | ...SAVE FP2
4358c2ecf20Sopenharmony_ci|--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3
4368c2ecf20Sopenharmony_ci|--LET V=U*U, W=V*V, CALCULATE
4378c2ecf20Sopenharmony_ci|--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY
4388c2ecf20Sopenharmony_ci|--U + U*V*(  [B1 + W*(B3 + W*B5)]  +  [V*(B2 + W*B4)]  )
4398c2ecf20Sopenharmony_ci	fmovex	%fp1,%fp0
4408c2ecf20Sopenharmony_ci	fmulx	%fp0,%fp0	| ...FP0 IS V
4418c2ecf20Sopenharmony_ci	fmovex	%fp1,SAVEU(%a6) | ...STORE U IN MEMORY, FREE FP1
4428c2ecf20Sopenharmony_ci	fmovex	%fp0,%fp1
4438c2ecf20Sopenharmony_ci	fmulx	%fp1,%fp1	| ...FP1 IS W
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci	fmoved	LOGB5,%fp3
4468c2ecf20Sopenharmony_ci	fmoved	LOGB4,%fp2
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci	fmulx	%fp1,%fp3	| ...W*B5
4498c2ecf20Sopenharmony_ci	fmulx	%fp1,%fp2	| ...W*B4
4508c2ecf20Sopenharmony_ci
4518c2ecf20Sopenharmony_ci	faddd	LOGB3,%fp3 | ...B3+W*B5
4528c2ecf20Sopenharmony_ci	faddd	LOGB2,%fp2 | ...B2+W*B4
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	fmulx	%fp3,%fp1	| ...W*(B3+W*B5), FP3 RELEASED
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci	fmulx	%fp0,%fp2	| ...V*(B2+W*B4)
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	faddd	LOGB1,%fp1 | ...B1+W*(B3+W*B5)
4598c2ecf20Sopenharmony_ci	fmulx	SAVEU(%a6),%fp0 | ...FP0 IS U*V
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_ci	faddx	%fp2,%fp1	| ...B1+W*(B3+W*B5) + V*(B2+W*B4), FP2 RELEASED
4628c2ecf20Sopenharmony_ci	fmovemx (%sp)+,%fp2-%fp2/%fp3 | ...FP2 RESTORED
4638c2ecf20Sopenharmony_ci
4648c2ecf20Sopenharmony_ci	fmulx	%fp1,%fp0	| ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] )
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_ci	fmovel	%d1,%fpcr
4678c2ecf20Sopenharmony_ci	faddx	SAVEU(%a6),%fp0
4688c2ecf20Sopenharmony_ci	bra	t_frcinx
4698c2ecf20Sopenharmony_ci	rts
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ciLOGNEG:
4728c2ecf20Sopenharmony_ci|--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID
4738c2ecf20Sopenharmony_ci	bra	t_operr
4748c2ecf20Sopenharmony_ci
4758c2ecf20Sopenharmony_ci	.global	slognp1d
4768c2ecf20Sopenharmony_cislognp1d:
4778c2ecf20Sopenharmony_ci|--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT
4788c2ecf20Sopenharmony_ci| Simply return the denorm
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci	bra	t_extdnrm
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci	.global	slognp1
4838c2ecf20Sopenharmony_cislognp1:
4848c2ecf20Sopenharmony_ci|--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S
4858c2ecf20Sopenharmony_ci
4868c2ecf20Sopenharmony_ci	fmovex	(%a0),%fp0	| ...LOAD INPUT
4878c2ecf20Sopenharmony_ci	fabsx	%fp0		|test magnitude
4888c2ecf20Sopenharmony_ci	fcmpx	LTHOLD,%fp0	|compare with min threshold
4898c2ecf20Sopenharmony_ci	fbgt	LP1REAL		|if greater, continue
4908c2ecf20Sopenharmony_ci	fmovel	#0,%fpsr		|clr N flag from compare
4918c2ecf20Sopenharmony_ci	fmovel	%d1,%fpcr
4928c2ecf20Sopenharmony_ci	fmovex	(%a0),%fp0	|return signed argument
4938c2ecf20Sopenharmony_ci	bra	t_frcinx
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ciLP1REAL:
4968c2ecf20Sopenharmony_ci	fmovex	(%a0),%fp0	| ...LOAD INPUT
4978c2ecf20Sopenharmony_ci	movel	#0x00000000,ADJK(%a6)
4988c2ecf20Sopenharmony_ci	fmovex	%fp0,%fp1	| ...FP1 IS INPUT Z
4998c2ecf20Sopenharmony_ci	fadds	one,%fp0	| ...X := ROUND(1+Z)
5008c2ecf20Sopenharmony_ci	fmovex	%fp0,X(%a6)
5018c2ecf20Sopenharmony_ci	movew	XFRAC(%a6),XDCARE(%a6)
5028c2ecf20Sopenharmony_ci	movel	X(%a6),%d0
5038c2ecf20Sopenharmony_ci	cmpil	#0,%d0
5048c2ecf20Sopenharmony_ci	ble	LP1NEG0	| ...LOG OF ZERO OR -VE
5058c2ecf20Sopenharmony_ci	cmp2l	BOUNDS2,%d0
5068c2ecf20Sopenharmony_ci	bcs	LOGMAIN	| ...BOUNDS2 IS [1/2,3/2]
5078c2ecf20Sopenharmony_ci|--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z,
5088c2ecf20Sopenharmony_ci|--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE,
5098c2ecf20Sopenharmony_ci|--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_ciLP1NEAR1:
5128c2ecf20Sopenharmony_ci|--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)
5138c2ecf20Sopenharmony_ci	cmp2l	BOUNDS1,%d0
5148c2ecf20Sopenharmony_ci	bcss	LP1CARE
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ciLP1ONE16:
5178c2ecf20Sopenharmony_ci|--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2)
5188c2ecf20Sopenharmony_ci|--WHERE U = 2Z/(2+Z) = 2Z/(1+X).
5198c2ecf20Sopenharmony_ci	faddx	%fp1,%fp1	| ...FP1 IS 2Z
5208c2ecf20Sopenharmony_ci	fadds	one,%fp0	| ...FP0 IS 1+X
5218c2ecf20Sopenharmony_ci|--U = FP1/FP0
5228c2ecf20Sopenharmony_ci	bra	LP1CONT2
5238c2ecf20Sopenharmony_ci
5248c2ecf20Sopenharmony_ciLP1CARE:
5258c2ecf20Sopenharmony_ci|--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE
5268c2ecf20Sopenharmony_ci|--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST
5278c2ecf20Sopenharmony_ci|--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2],
5288c2ecf20Sopenharmony_ci|--THERE ARE ONLY TWO CASES.
5298c2ecf20Sopenharmony_ci|--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z
5308c2ecf20Sopenharmony_ci|--CASE 2: 1+Z > 1, THEN K = 0  AND Y-F = (1-F) + Z
5318c2ecf20Sopenharmony_ci|--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF
5328c2ecf20Sopenharmony_ci|--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci	movel	XFRAC(%a6),FFRAC(%a6)
5358c2ecf20Sopenharmony_ci	andil	#0xFE000000,FFRAC(%a6)
5368c2ecf20Sopenharmony_ci	oril	#0x01000000,FFRAC(%a6)	| ...F OBTAINED
5378c2ecf20Sopenharmony_ci	cmpil	#0x3FFF8000,%d0	| ...SEE IF 1+Z > 1
5388c2ecf20Sopenharmony_ci	bges	KISZERO
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ciKISNEG1:
5418c2ecf20Sopenharmony_ci	fmoves	TWO,%fp0
5428c2ecf20Sopenharmony_ci	movel	#0x3fff0000,F(%a6)
5438c2ecf20Sopenharmony_ci	clrl	F+8(%a6)
5448c2ecf20Sopenharmony_ci	fsubx	F(%a6),%fp0	| ...2-F
5458c2ecf20Sopenharmony_ci	movel	FFRAC(%a6),%d0
5468c2ecf20Sopenharmony_ci	andil	#0x7E000000,%d0
5478c2ecf20Sopenharmony_ci	asrl	#8,%d0
5488c2ecf20Sopenharmony_ci	asrl	#8,%d0
5498c2ecf20Sopenharmony_ci	asrl	#4,%d0		| ...D0 CONTAINS DISPLACEMENT FOR 1/F
5508c2ecf20Sopenharmony_ci	faddx	%fp1,%fp1		| ...GET 2Z
5518c2ecf20Sopenharmony_ci	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...SAVE FP2
5528c2ecf20Sopenharmony_ci	faddx	%fp1,%fp0		| ...FP0 IS Y-F = (2-F)+2Z
5538c2ecf20Sopenharmony_ci	lea	LOGTBL,%a0	| ...A0 IS ADDRESS OF 1/F
5548c2ecf20Sopenharmony_ci	addal	%d0,%a0
5558c2ecf20Sopenharmony_ci	fmoves	negone,%fp1	| ...FP1 IS K = -1
5568c2ecf20Sopenharmony_ci	bra	LP1CONT1
5578c2ecf20Sopenharmony_ci
5588c2ecf20Sopenharmony_ciKISZERO:
5598c2ecf20Sopenharmony_ci	fmoves	one,%fp0
5608c2ecf20Sopenharmony_ci	movel	#0x3fff0000,F(%a6)
5618c2ecf20Sopenharmony_ci	clrl	F+8(%a6)
5628c2ecf20Sopenharmony_ci	fsubx	F(%a6),%fp0		| ...1-F
5638c2ecf20Sopenharmony_ci	movel	FFRAC(%a6),%d0
5648c2ecf20Sopenharmony_ci	andil	#0x7E000000,%d0
5658c2ecf20Sopenharmony_ci	asrl	#8,%d0
5668c2ecf20Sopenharmony_ci	asrl	#8,%d0
5678c2ecf20Sopenharmony_ci	asrl	#4,%d0
5688c2ecf20Sopenharmony_ci	faddx	%fp1,%fp0		| ...FP0 IS Y-F
5698c2ecf20Sopenharmony_ci	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...FP2 SAVED
5708c2ecf20Sopenharmony_ci	lea	LOGTBL,%a0
5718c2ecf20Sopenharmony_ci	addal	%d0,%a0		| ...A0 IS ADDRESS OF 1/F
5728c2ecf20Sopenharmony_ci	fmoves	zero,%fp1	| ...FP1 IS K = 0
5738c2ecf20Sopenharmony_ci	bra	LP1CONT1
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ciLP1NEG0:
5768c2ecf20Sopenharmony_ci|--FPCR SAVED. D0 IS X IN COMPACT FORM.
5778c2ecf20Sopenharmony_ci	cmpil	#0,%d0
5788c2ecf20Sopenharmony_ci	blts	LP1NEG
5798c2ecf20Sopenharmony_ciLP1ZERO:
5808c2ecf20Sopenharmony_ci	fmoves	negone,%fp0
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_ci	fmovel	%d1,%fpcr
5838c2ecf20Sopenharmony_ci	bra t_dz
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_ciLP1NEG:
5868c2ecf20Sopenharmony_ci	fmoves	zero,%fp0
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci	fmovel	%d1,%fpcr
5898c2ecf20Sopenharmony_ci	bra	t_operr
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_ci	|end
592