xref: /openbmc/linux/arch/m68k/fpsp040/slogn.S (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
11da177e4SLinus Torvalds|
21da177e4SLinus Torvalds|	slogn.sa 3.1 12/10/90
31da177e4SLinus Torvalds|
41da177e4SLinus Torvalds|	slogn computes the natural logarithm of an
51da177e4SLinus Torvalds|	input value. slognd does the same except the input value is a
61da177e4SLinus Torvalds|	denormalized number. slognp1 computes log(1+X), and slognp1d
71da177e4SLinus Torvalds|	computes log(1+X) for denormalized X.
81da177e4SLinus Torvalds|
91da177e4SLinus Torvalds|	Input: Double-extended value in memory location pointed to by address
101da177e4SLinus Torvalds|		register a0.
111da177e4SLinus Torvalds|
121da177e4SLinus Torvalds|	Output:	log(X) or log(1+X) returned in floating-point register Fp0.
131da177e4SLinus Torvalds|
141da177e4SLinus Torvalds|	Accuracy and Monotonicity: The returned result is within 2 ulps in
151da177e4SLinus Torvalds|		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
161da177e4SLinus Torvalds|		result is subsequently rounded to double precision. The
171da177e4SLinus Torvalds|		result is provably monotonic in double precision.
181da177e4SLinus Torvalds|
191da177e4SLinus Torvalds|	Speed: The program slogn takes approximately 190 cycles for input
201da177e4SLinus Torvalds|		argument X such that |X-1| >= 1/16, which is the usual
211da177e4SLinus Torvalds|		situation. For those arguments, slognp1 takes approximately
221da177e4SLinus Torvalds|		 210 cycles. For the less common arguments, the program will
231da177e4SLinus Torvalds|		 run no worse than 10% slower.
241da177e4SLinus Torvalds|
251da177e4SLinus Torvalds|	Algorithm:
261da177e4SLinus Torvalds|	LOGN:
271da177e4SLinus Torvalds|	Step 1. If |X-1| < 1/16, approximate log(X) by an odd polynomial in
281da177e4SLinus Torvalds|		u, where u = 2(X-1)/(X+1). Otherwise, move on to Step 2.
291da177e4SLinus Torvalds|
301da177e4SLinus Torvalds|	Step 2. X = 2**k * Y where 1 <= Y < 2. Define F to be the first seven
311da177e4SLinus Torvalds|		significant bits of Y plus 2**(-7), i.e. F = 1.xxxxxx1 in base
321da177e4SLinus Torvalds|		2 where the six "x" match those of Y. Note that |Y-F| <= 2**(-7).
331da177e4SLinus Torvalds|
341da177e4SLinus Torvalds|	Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a polynomial in u,
351da177e4SLinus Torvalds|		log(1+u) = poly.
361da177e4SLinus Torvalds|
371da177e4SLinus Torvalds|	Step 4. Reconstruct log(X) = log( 2**k * Y ) = k*log(2) + log(F) + log(1+u)
381da177e4SLinus Torvalds|		by k*log(2) + (log(F) + poly). The values of log(F) are calculated
391da177e4SLinus Torvalds|		beforehand and stored in the program.
401da177e4SLinus Torvalds|
411da177e4SLinus Torvalds|	lognp1:
421da177e4SLinus Torvalds|	Step 1: If |X| < 1/16, approximate log(1+X) by an odd polynomial in
431da177e4SLinus Torvalds|		u where u = 2X/(2+X). Otherwise, move on to Step 2.
441da177e4SLinus Torvalds|
451da177e4SLinus Torvalds|	Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2
461da177e4SLinus Torvalds|		of the algorithm for LOGN and compute log(1+X) as
471da177e4SLinus Torvalds|		k*log(2) + log(F) + poly where poly approximates log(1+u),
481da177e4SLinus Torvalds|		u = (Y-F)/F.
491da177e4SLinus Torvalds|
501da177e4SLinus Torvalds|	Implementation Notes:
511da177e4SLinus Torvalds|	Note 1. There are 64 different possible values for F, thus 64 log(F)'s
521da177e4SLinus Torvalds|		need to be tabulated. Moreover, the values of 1/F are also
531da177e4SLinus Torvalds|		tabulated so that the division in (Y-F)/F can be performed by a
541da177e4SLinus Torvalds|		multiplication.
551da177e4SLinus Torvalds|
561da177e4SLinus Torvalds|	Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value
571da177e4SLinus Torvalds|		Y-F has to be calculated carefully when 1/2 <= X < 3/2.
581da177e4SLinus Torvalds|
591da177e4SLinus Torvalds|	Note 3. To fully exploit the pipeline, polynomials are usually separated
601da177e4SLinus Torvalds|		into two parts evaluated independently before being added up.
611da177e4SLinus Torvalds|
621da177e4SLinus Torvalds
631da177e4SLinus Torvalds|		Copyright (C) Motorola, Inc. 1990
641da177e4SLinus Torvalds|			All Rights Reserved
651da177e4SLinus Torvalds|
66*e00d82d0SMatt Waddel|       For details on the license for this file, please see the
67*e00d82d0SMatt Waddel|       file, README, in this same directory.
681da177e4SLinus Torvalds
691da177e4SLinus Torvalds|slogn	idnt	2,1 | Motorola 040 Floating Point Software Package
701da177e4SLinus Torvalds
711da177e4SLinus Torvalds	|section	8
721da177e4SLinus Torvalds
731da177e4SLinus Torvalds#include "fpsp.h"
741da177e4SLinus Torvalds
751da177e4SLinus TorvaldsBOUNDS1:  .long 0x3FFEF07D,0x3FFF8841
761da177e4SLinus TorvaldsBOUNDS2:  .long 0x3FFE8000,0x3FFFC000
771da177e4SLinus Torvalds
781da177e4SLinus TorvaldsLOGOF2:	.long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
791da177e4SLinus Torvalds
801da177e4SLinus Torvaldsone:	.long 0x3F800000
811da177e4SLinus Torvaldszero:	.long 0x00000000
821da177e4SLinus Torvaldsinfty:	.long 0x7F800000
831da177e4SLinus Torvaldsnegone:	.long 0xBF800000
841da177e4SLinus Torvalds
851da177e4SLinus TorvaldsLOGA6:	.long 0x3FC2499A,0xB5E4040B
861da177e4SLinus TorvaldsLOGA5:	.long 0xBFC555B5,0x848CB7DB
871da177e4SLinus Torvalds
881da177e4SLinus TorvaldsLOGA4:	.long 0x3FC99999,0x987D8730
891da177e4SLinus TorvaldsLOGA3:	.long 0xBFCFFFFF,0xFF6F7E97
901da177e4SLinus Torvalds
911da177e4SLinus TorvaldsLOGA2:	.long 0x3FD55555,0x555555a4
921da177e4SLinus TorvaldsLOGA1:	.long 0xBFE00000,0x00000008
931da177e4SLinus Torvalds
941da177e4SLinus TorvaldsLOGB5:	.long 0x3F175496,0xADD7DAD6
951da177e4SLinus TorvaldsLOGB4:	.long 0x3F3C71C2,0xFE80C7E0
961da177e4SLinus Torvalds
971da177e4SLinus TorvaldsLOGB3:	.long 0x3F624924,0x928BCCFF
981da177e4SLinus TorvaldsLOGB2:	.long 0x3F899999,0x999995EC
991da177e4SLinus Torvalds
1001da177e4SLinus TorvaldsLOGB1:	.long 0x3FB55555,0x55555555
1011da177e4SLinus TorvaldsTWO:	.long 0x40000000,0x00000000
1021da177e4SLinus Torvalds
1031da177e4SLinus TorvaldsLTHOLD:	.long 0x3f990000,0x80000000,0x00000000,0x00000000
1041da177e4SLinus Torvalds
1051da177e4SLinus TorvaldsLOGTBL:
1061da177e4SLinus Torvalds	.long  0x3FFE0000,0xFE03F80F,0xE03F80FE,0x00000000
1071da177e4SLinus Torvalds	.long  0x3FF70000,0xFF015358,0x833C47E2,0x00000000
1081da177e4SLinus Torvalds	.long  0x3FFE0000,0xFA232CF2,0x52138AC0,0x00000000
1091da177e4SLinus Torvalds	.long  0x3FF90000,0xBDC8D83E,0xAD88D549,0x00000000
1101da177e4SLinus Torvalds	.long  0x3FFE0000,0xF6603D98,0x0F6603DA,0x00000000
1111da177e4SLinus Torvalds	.long  0x3FFA0000,0x9CF43DCF,0xF5EAFD48,0x00000000
1121da177e4SLinus Torvalds	.long  0x3FFE0000,0xF2B9D648,0x0F2B9D65,0x00000000
1131da177e4SLinus Torvalds	.long  0x3FFA0000,0xDA16EB88,0xCB8DF614,0x00000000
1141da177e4SLinus Torvalds	.long  0x3FFE0000,0xEF2EB71F,0xC4345238,0x00000000
1151da177e4SLinus Torvalds	.long  0x3FFB0000,0x8B29B775,0x1BD70743,0x00000000
1161da177e4SLinus Torvalds	.long  0x3FFE0000,0xEBBDB2A5,0xC1619C8C,0x00000000
1171da177e4SLinus Torvalds	.long  0x3FFB0000,0xA8D839F8,0x30C1FB49,0x00000000
1181da177e4SLinus Torvalds	.long  0x3FFE0000,0xE865AC7B,0x7603A197,0x00000000
1191da177e4SLinus Torvalds	.long  0x3FFB0000,0xC61A2EB1,0x8CD907AD,0x00000000
1201da177e4SLinus Torvalds	.long  0x3FFE0000,0xE525982A,0xF70C880E,0x00000000
1211da177e4SLinus Torvalds	.long  0x3FFB0000,0xE2F2A47A,0xDE3A18AF,0x00000000
1221da177e4SLinus Torvalds	.long  0x3FFE0000,0xE1FC780E,0x1FC780E2,0x00000000
1231da177e4SLinus Torvalds	.long  0x3FFB0000,0xFF64898E,0xDF55D551,0x00000000
1241da177e4SLinus Torvalds	.long  0x3FFE0000,0xDEE95C4C,0xA037BA57,0x00000000
1251da177e4SLinus Torvalds	.long  0x3FFC0000,0x8DB956A9,0x7B3D0148,0x00000000
1261da177e4SLinus Torvalds	.long  0x3FFE0000,0xDBEB61EE,0xD19C5958,0x00000000
1271da177e4SLinus Torvalds	.long  0x3FFC0000,0x9B8FE100,0xF47BA1DE,0x00000000
1281da177e4SLinus Torvalds	.long  0x3FFE0000,0xD901B203,0x6406C80E,0x00000000
1291da177e4SLinus Torvalds	.long  0x3FFC0000,0xA9372F1D,0x0DA1BD17,0x00000000
1301da177e4SLinus Torvalds	.long  0x3FFE0000,0xD62B80D6,0x2B80D62C,0x00000000
1311da177e4SLinus Torvalds	.long  0x3FFC0000,0xB6B07F38,0xCE90E46B,0x00000000
1321da177e4SLinus Torvalds	.long  0x3FFE0000,0xD3680D36,0x80D3680D,0x00000000
1331da177e4SLinus Torvalds	.long  0x3FFC0000,0xC3FD0329,0x06488481,0x00000000
1341da177e4SLinus Torvalds	.long  0x3FFE0000,0xD0B69FCB,0xD2580D0B,0x00000000
1351da177e4SLinus Torvalds	.long  0x3FFC0000,0xD11DE0FF,0x15AB18CA,0x00000000
1361da177e4SLinus Torvalds	.long  0x3FFE0000,0xCE168A77,0x25080CE1,0x00000000
1371da177e4SLinus Torvalds	.long  0x3FFC0000,0xDE1433A1,0x6C66B150,0x00000000
1381da177e4SLinus Torvalds	.long  0x3FFE0000,0xCB8727C0,0x65C393E0,0x00000000
1391da177e4SLinus Torvalds	.long  0x3FFC0000,0xEAE10B5A,0x7DDC8ADD,0x00000000
1401da177e4SLinus Torvalds	.long  0x3FFE0000,0xC907DA4E,0x871146AD,0x00000000
1411da177e4SLinus Torvalds	.long  0x3FFC0000,0xF7856E5E,0xE2C9B291,0x00000000
1421da177e4SLinus Torvalds	.long  0x3FFE0000,0xC6980C69,0x80C6980C,0x00000000
1431da177e4SLinus Torvalds	.long  0x3FFD0000,0x82012CA5,0xA68206D7,0x00000000
1441da177e4SLinus Torvalds	.long  0x3FFE0000,0xC4372F85,0x5D824CA6,0x00000000
1451da177e4SLinus Torvalds	.long  0x3FFD0000,0x882C5FCD,0x7256A8C5,0x00000000
1461da177e4SLinus Torvalds	.long  0x3FFE0000,0xC1E4BBD5,0x95F6E947,0x00000000
1471da177e4SLinus Torvalds	.long  0x3FFD0000,0x8E44C60B,0x4CCFD7DE,0x00000000
1481da177e4SLinus Torvalds	.long  0x3FFE0000,0xBFA02FE8,0x0BFA02FF,0x00000000
1491da177e4SLinus Torvalds	.long  0x3FFD0000,0x944AD09E,0xF4351AF6,0x00000000
1501da177e4SLinus Torvalds	.long  0x3FFE0000,0xBD691047,0x07661AA3,0x00000000
1511da177e4SLinus Torvalds	.long  0x3FFD0000,0x9A3EECD4,0xC3EAA6B2,0x00000000
1521da177e4SLinus Torvalds	.long  0x3FFE0000,0xBB3EE721,0xA54D880C,0x00000000
1531da177e4SLinus Torvalds	.long  0x3FFD0000,0xA0218434,0x353F1DE8,0x00000000
1541da177e4SLinus Torvalds	.long  0x3FFE0000,0xB92143FA,0x36F5E02E,0x00000000
1551da177e4SLinus Torvalds	.long  0x3FFD0000,0xA5F2FCAB,0xBBC506DA,0x00000000
1561da177e4SLinus Torvalds	.long  0x3FFE0000,0xB70FBB5A,0x19BE3659,0x00000000
1571da177e4SLinus Torvalds	.long  0x3FFD0000,0xABB3B8BA,0x2AD362A5,0x00000000
1581da177e4SLinus Torvalds	.long  0x3FFE0000,0xB509E68A,0x9B94821F,0x00000000
1591da177e4SLinus Torvalds	.long  0x3FFD0000,0xB1641795,0xCE3CA97B,0x00000000
1601da177e4SLinus Torvalds	.long  0x3FFE0000,0xB30F6352,0x8917C80B,0x00000000
1611da177e4SLinus Torvalds	.long  0x3FFD0000,0xB7047551,0x5D0F1C61,0x00000000
1621da177e4SLinus Torvalds	.long  0x3FFE0000,0xB11FD3B8,0x0B11FD3C,0x00000000
1631da177e4SLinus Torvalds	.long  0x3FFD0000,0xBC952AFE,0xEA3D13E1,0x00000000
1641da177e4SLinus Torvalds	.long  0x3FFE0000,0xAF3ADDC6,0x80AF3ADE,0x00000000
1651da177e4SLinus Torvalds	.long  0x3FFD0000,0xC2168ED0,0xF458BA4A,0x00000000
1661da177e4SLinus Torvalds	.long  0x3FFE0000,0xAD602B58,0x0AD602B6,0x00000000
1671da177e4SLinus Torvalds	.long  0x3FFD0000,0xC788F439,0xB3163BF1,0x00000000
1681da177e4SLinus Torvalds	.long  0x3FFE0000,0xAB8F69E2,0x8359CD11,0x00000000
1691da177e4SLinus Torvalds	.long  0x3FFD0000,0xCCECAC08,0xBF04565D,0x00000000
1701da177e4SLinus Torvalds	.long  0x3FFE0000,0xA9C84A47,0xA07F5638,0x00000000
1711da177e4SLinus Torvalds	.long  0x3FFD0000,0xD2420487,0x2DD85160,0x00000000
1721da177e4SLinus Torvalds	.long  0x3FFE0000,0xA80A80A8,0x0A80A80B,0x00000000
1731da177e4SLinus Torvalds	.long  0x3FFD0000,0xD7894992,0x3BC3588A,0x00000000
1741da177e4SLinus Torvalds	.long  0x3FFE0000,0xA655C439,0x2D7B73A8,0x00000000
1751da177e4SLinus Torvalds	.long  0x3FFD0000,0xDCC2C4B4,0x9887DACC,0x00000000
1761da177e4SLinus Torvalds	.long  0x3FFE0000,0xA4A9CF1D,0x96833751,0x00000000
1771da177e4SLinus Torvalds	.long  0x3FFD0000,0xE1EEBD3E,0x6D6A6B9E,0x00000000
1781da177e4SLinus Torvalds	.long  0x3FFE0000,0xA3065E3F,0xAE7CD0E0,0x00000000
1791da177e4SLinus Torvalds	.long  0x3FFD0000,0xE70D785C,0x2F9F5BDC,0x00000000
1801da177e4SLinus Torvalds	.long  0x3FFE0000,0xA16B312E,0xA8FC377D,0x00000000
1811da177e4SLinus Torvalds	.long  0x3FFD0000,0xEC1F392C,0x5179F283,0x00000000
1821da177e4SLinus Torvalds	.long  0x3FFE0000,0x9FD809FD,0x809FD80A,0x00000000
1831da177e4SLinus Torvalds	.long  0x3FFD0000,0xF12440D3,0xE36130E6,0x00000000
1841da177e4SLinus Torvalds	.long  0x3FFE0000,0x9E4CAD23,0xDD5F3A20,0x00000000
1851da177e4SLinus Torvalds	.long  0x3FFD0000,0xF61CCE92,0x346600BB,0x00000000
1861da177e4SLinus Torvalds	.long  0x3FFE0000,0x9CC8E160,0xC3FB19B9,0x00000000
1871da177e4SLinus Torvalds	.long  0x3FFD0000,0xFB091FD3,0x8145630A,0x00000000
1881da177e4SLinus Torvalds	.long  0x3FFE0000,0x9B4C6F9E,0xF03A3CAA,0x00000000
1891da177e4SLinus Torvalds	.long  0x3FFD0000,0xFFE97042,0xBFA4C2AD,0x00000000
1901da177e4SLinus Torvalds	.long  0x3FFE0000,0x99D722DA,0xBDE58F06,0x00000000
1911da177e4SLinus Torvalds	.long  0x3FFE0000,0x825EFCED,0x49369330,0x00000000
1921da177e4SLinus Torvalds	.long  0x3FFE0000,0x9868C809,0x868C8098,0x00000000
1931da177e4SLinus Torvalds	.long  0x3FFE0000,0x84C37A7A,0xB9A905C9,0x00000000
1941da177e4SLinus Torvalds	.long  0x3FFE0000,0x97012E02,0x5C04B809,0x00000000
1951da177e4SLinus Torvalds	.long  0x3FFE0000,0x87224C2E,0x8E645FB7,0x00000000
1961da177e4SLinus Torvalds	.long  0x3FFE0000,0x95A02568,0x095A0257,0x00000000
1971da177e4SLinus Torvalds	.long  0x3FFE0000,0x897B8CAC,0x9F7DE298,0x00000000
1981da177e4SLinus Torvalds	.long  0x3FFE0000,0x94458094,0x45809446,0x00000000
1991da177e4SLinus Torvalds	.long  0x3FFE0000,0x8BCF55DE,0xC4CD05FE,0x00000000
2001da177e4SLinus Torvalds	.long  0x3FFE0000,0x92F11384,0x0497889C,0x00000000
2011da177e4SLinus Torvalds	.long  0x3FFE0000,0x8E1DC0FB,0x89E125E5,0x00000000
2021da177e4SLinus Torvalds	.long  0x3FFE0000,0x91A2B3C4,0xD5E6F809,0x00000000
2031da177e4SLinus Torvalds	.long  0x3FFE0000,0x9066E68C,0x955B6C9B,0x00000000
2041da177e4SLinus Torvalds	.long  0x3FFE0000,0x905A3863,0x3E06C43B,0x00000000
2051da177e4SLinus Torvalds	.long  0x3FFE0000,0x92AADE74,0xC7BE59E0,0x00000000
2061da177e4SLinus Torvalds	.long  0x3FFE0000,0x8F1779D9,0xFDC3A219,0x00000000
2071da177e4SLinus Torvalds	.long  0x3FFE0000,0x94E9BFF6,0x15845643,0x00000000
2081da177e4SLinus Torvalds	.long  0x3FFE0000,0x8DDA5202,0x37694809,0x00000000
2091da177e4SLinus Torvalds	.long  0x3FFE0000,0x9723A1B7,0x20134203,0x00000000
2101da177e4SLinus Torvalds	.long  0x3FFE0000,0x8CA29C04,0x6514E023,0x00000000
2111da177e4SLinus Torvalds	.long  0x3FFE0000,0x995899C8,0x90EB8990,0x00000000
2121da177e4SLinus Torvalds	.long  0x3FFE0000,0x8B70344A,0x139BC75A,0x00000000
2131da177e4SLinus Torvalds	.long  0x3FFE0000,0x9B88BDAA,0x3A3DAE2F,0x00000000
2141da177e4SLinus Torvalds	.long  0x3FFE0000,0x8A42F870,0x5669DB46,0x00000000
2151da177e4SLinus Torvalds	.long  0x3FFE0000,0x9DB4224F,0xFFE1157C,0x00000000
2161da177e4SLinus Torvalds	.long  0x3FFE0000,0x891AC73A,0xE9819B50,0x00000000
2171da177e4SLinus Torvalds	.long  0x3FFE0000,0x9FDADC26,0x8B7A12DA,0x00000000
2181da177e4SLinus Torvalds	.long  0x3FFE0000,0x87F78087,0xF78087F8,0x00000000
2191da177e4SLinus Torvalds	.long  0x3FFE0000,0xA1FCFF17,0xCE733BD4,0x00000000
2201da177e4SLinus Torvalds	.long  0x3FFE0000,0x86D90544,0x7A34ACC6,0x00000000
2211da177e4SLinus Torvalds	.long  0x3FFE0000,0xA41A9E8F,0x5446FB9F,0x00000000
2221da177e4SLinus Torvalds	.long  0x3FFE0000,0x85BF3761,0x2CEE3C9B,0x00000000
2231da177e4SLinus Torvalds	.long  0x3FFE0000,0xA633CD7E,0x6771CD8B,0x00000000
2241da177e4SLinus Torvalds	.long  0x3FFE0000,0x84A9F9C8,0x084A9F9D,0x00000000
2251da177e4SLinus Torvalds	.long  0x3FFE0000,0xA8489E60,0x0B435A5E,0x00000000
2261da177e4SLinus Torvalds	.long  0x3FFE0000,0x83993052,0x3FBE3368,0x00000000
2271da177e4SLinus Torvalds	.long  0x3FFE0000,0xAA59233C,0xCCA4BD49,0x00000000
2281da177e4SLinus Torvalds	.long  0x3FFE0000,0x828CBFBE,0xB9A020A3,0x00000000
2291da177e4SLinus Torvalds	.long  0x3FFE0000,0xAC656DAE,0x6BCC4985,0x00000000
2301da177e4SLinus Torvalds	.long  0x3FFE0000,0x81848DA8,0xFAF0D277,0x00000000
2311da177e4SLinus Torvalds	.long  0x3FFE0000,0xAE6D8EE3,0x60BB2468,0x00000000
2321da177e4SLinus Torvalds	.long  0x3FFE0000,0x80808080,0x80808081,0x00000000
2331da177e4SLinus Torvalds	.long  0x3FFE0000,0xB07197A2,0x3C46C654,0x00000000
2341da177e4SLinus Torvalds
2351da177e4SLinus Torvalds	.set	ADJK,L_SCR1
2361da177e4SLinus Torvalds
2371da177e4SLinus Torvalds	.set	X,FP_SCR1
2381da177e4SLinus Torvalds	.set	XDCARE,X+2
2391da177e4SLinus Torvalds	.set	XFRAC,X+4
2401da177e4SLinus Torvalds
2411da177e4SLinus Torvalds	.set	F,FP_SCR2
2421da177e4SLinus Torvalds	.set	FFRAC,F+4
2431da177e4SLinus Torvalds
2441da177e4SLinus Torvalds	.set	KLOG2,FP_SCR3
2451da177e4SLinus Torvalds
2461da177e4SLinus Torvalds	.set	SAVEU,FP_SCR4
2471da177e4SLinus Torvalds
2481da177e4SLinus Torvalds	| xref	t_frcinx
2491da177e4SLinus Torvalds	|xref	t_extdnrm
2501da177e4SLinus Torvalds	|xref	t_operr
2511da177e4SLinus Torvalds	|xref	t_dz
2521da177e4SLinus Torvalds
2531da177e4SLinus Torvalds	.global	slognd
2541da177e4SLinus Torvaldsslognd:
2551da177e4SLinus Torvalds|--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT
2561da177e4SLinus Torvalds
2571da177e4SLinus Torvalds	movel		#-100,ADJK(%a6)	| ...INPUT = 2^(ADJK) * FP0
2581da177e4SLinus Torvalds
2591da177e4SLinus Torvalds|----normalize the input value by left shifting k bits (k to be determined
2601da177e4SLinus Torvalds|----below), adjusting exponent and storing -k to  ADJK
2611da177e4SLinus Torvalds|----the value TWOTO100 is no longer needed.
2621da177e4SLinus Torvalds|----Note that this code assumes the denormalized input is NON-ZERO.
2631da177e4SLinus Torvalds
2641da177e4SLinus Torvalds     moveml	%d2-%d7,-(%a7)		| ...save some registers
2651da177e4SLinus Torvalds     movel	#0x00000000,%d3		| ...D3 is exponent of smallest norm. #
2661da177e4SLinus Torvalds     movel	4(%a0),%d4
2671da177e4SLinus Torvalds     movel	8(%a0),%d5		| ...(D4,D5) is (Hi_X,Lo_X)
2681da177e4SLinus Torvalds     clrl	%d2			| ...D2 used for holding K
2691da177e4SLinus Torvalds
2701da177e4SLinus Torvalds     tstl	%d4
2711da177e4SLinus Torvalds     bnes	HiX_not0
2721da177e4SLinus Torvalds
2731da177e4SLinus TorvaldsHiX_0:
2741da177e4SLinus Torvalds     movel	%d5,%d4
2751da177e4SLinus Torvalds     clrl	%d5
2761da177e4SLinus Torvalds     movel	#32,%d2
2771da177e4SLinus Torvalds     clrl	%d6
2781da177e4SLinus Torvalds     bfffo      %d4{#0:#32},%d6
2791da177e4SLinus Torvalds     lsll      %d6,%d4
2801da177e4SLinus Torvalds     addl	%d6,%d2			| ...(D3,D4,D5) is normalized
2811da177e4SLinus Torvalds
2821da177e4SLinus Torvalds     movel	%d3,X(%a6)
2831da177e4SLinus Torvalds     movel	%d4,XFRAC(%a6)
2841da177e4SLinus Torvalds     movel	%d5,XFRAC+4(%a6)
2851da177e4SLinus Torvalds     negl	%d2
2861da177e4SLinus Torvalds     movel	%d2,ADJK(%a6)
2871da177e4SLinus Torvalds     fmovex	X(%a6),%fp0
2881da177e4SLinus Torvalds     moveml	(%a7)+,%d2-%d7		| ...restore registers
2891da177e4SLinus Torvalds     lea	X(%a6),%a0
2901da177e4SLinus Torvalds     bras	LOGBGN			| ...begin regular log(X)
2911da177e4SLinus Torvalds
2921da177e4SLinus Torvalds
2931da177e4SLinus TorvaldsHiX_not0:
2941da177e4SLinus Torvalds     clrl	%d6
2951da177e4SLinus Torvalds     bfffo	%d4{#0:#32},%d6		| ...find first 1
2961da177e4SLinus Torvalds     movel	%d6,%d2			| ...get k
2971da177e4SLinus Torvalds     lsll	%d6,%d4
2981da177e4SLinus Torvalds     movel	%d5,%d7			| ...a copy of D5
2991da177e4SLinus Torvalds     lsll	%d6,%d5
3001da177e4SLinus Torvalds     negl	%d6
3011da177e4SLinus Torvalds     addil	#32,%d6
3021da177e4SLinus Torvalds     lsrl	%d6,%d7
3031da177e4SLinus Torvalds     orl	%d7,%d4			| ...(D3,D4,D5) normalized
3041da177e4SLinus Torvalds
3051da177e4SLinus Torvalds     movel	%d3,X(%a6)
3061da177e4SLinus Torvalds     movel	%d4,XFRAC(%a6)
3071da177e4SLinus Torvalds     movel	%d5,XFRAC+4(%a6)
3081da177e4SLinus Torvalds     negl	%d2
3091da177e4SLinus Torvalds     movel	%d2,ADJK(%a6)
3101da177e4SLinus Torvalds     fmovex	X(%a6),%fp0
3111da177e4SLinus Torvalds     moveml	(%a7)+,%d2-%d7		| ...restore registers
3121da177e4SLinus Torvalds     lea	X(%a6),%a0
3131da177e4SLinus Torvalds     bras	LOGBGN			| ...begin regular log(X)
3141da177e4SLinus Torvalds
3151da177e4SLinus Torvalds
3161da177e4SLinus Torvalds	.global	slogn
3171da177e4SLinus Torvaldsslogn:
3181da177e4SLinus Torvalds|--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S
3191da177e4SLinus Torvalds
3201da177e4SLinus Torvalds	fmovex		(%a0),%fp0	| ...LOAD INPUT
3211da177e4SLinus Torvalds	movel		#0x00000000,ADJK(%a6)
3221da177e4SLinus Torvalds
3231da177e4SLinus TorvaldsLOGBGN:
3241da177e4SLinus Torvalds|--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS
3251da177e4SLinus Torvalds|--A FINITE, NON-ZERO, NORMALIZED NUMBER.
3261da177e4SLinus Torvalds
3271da177e4SLinus Torvalds	movel	(%a0),%d0
3281da177e4SLinus Torvalds	movew	4(%a0),%d0
3291da177e4SLinus Torvalds
3301da177e4SLinus Torvalds	movel	(%a0),X(%a6)
3311da177e4SLinus Torvalds	movel	4(%a0),X+4(%a6)
3321da177e4SLinus Torvalds	movel	8(%a0),X+8(%a6)
3331da177e4SLinus Torvalds
3341da177e4SLinus Torvalds	cmpil	#0,%d0		| ...CHECK IF X IS NEGATIVE
3351da177e4SLinus Torvalds	blt	LOGNEG		| ...LOG OF NEGATIVE ARGUMENT IS INVALID
3361da177e4SLinus Torvalds	cmp2l	BOUNDS1,%d0	| ...X IS POSITIVE, CHECK IF X IS NEAR 1
3371da177e4SLinus Torvalds	bcc	LOGNEAR1	| ...BOUNDS IS ROUGHLY [15/16, 17/16]
3381da177e4SLinus Torvalds
3391da177e4SLinus TorvaldsLOGMAIN:
3401da177e4SLinus Torvalds|--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1
3411da177e4SLinus Torvalds
3421da177e4SLinus Torvalds|--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY.
3431da177e4SLinus Torvalds|--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1.
3441da177e4SLinus Torvalds|--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)
3451da177e4SLinus Torvalds|--			 = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F).
3461da177e4SLinus Torvalds|--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
3471da177e4SLinus Torvalds|--LOG(1+U) CAN BE VERY EFFICIENT.
3481da177e4SLinus Torvalds|--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
3491da177e4SLinus Torvalds|--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
3501da177e4SLinus Torvalds
3511da177e4SLinus Torvalds|--GET K, Y, F, AND ADDRESS OF 1/F.
3521da177e4SLinus Torvalds	asrl	#8,%d0
3531da177e4SLinus Torvalds	asrl	#8,%d0		| ...SHIFTED 16 BITS, BIASED EXPO. OF X
3541da177e4SLinus Torvalds	subil	#0x3FFF,%d0	| ...THIS IS K
3551da177e4SLinus Torvalds	addl	ADJK(%a6),%d0	| ...ADJUST K, ORIGINAL INPUT MAY BE  DENORM.
3561da177e4SLinus Torvalds	lea	LOGTBL,%a0	| ...BASE ADDRESS OF 1/F AND LOG(F)
3571da177e4SLinus Torvalds	fmovel	%d0,%fp1		| ...CONVERT K TO FLOATING-POINT FORMAT
3581da177e4SLinus Torvalds
3591da177e4SLinus Torvalds|--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
3601da177e4SLinus Torvalds	movel	#0x3FFF0000,X(%a6)	| ...X IS NOW Y, I.E. 2^(-K)*X
3611da177e4SLinus Torvalds	movel	XFRAC(%a6),FFRAC(%a6)
3621da177e4SLinus Torvalds	andil	#0xFE000000,FFRAC(%a6) | ...FIRST 7 BITS OF Y
3631da177e4SLinus Torvalds	oril	#0x01000000,FFRAC(%a6) | ...GET F: ATTACH A 1 AT THE EIGHTH BIT
3641da177e4SLinus Torvalds	movel	FFRAC(%a6),%d0	| ...READY TO GET ADDRESS OF 1/F
3651da177e4SLinus Torvalds	andil	#0x7E000000,%d0
3661da177e4SLinus Torvalds	asrl	#8,%d0
3671da177e4SLinus Torvalds	asrl	#8,%d0
3681da177e4SLinus Torvalds	asrl	#4,%d0		| ...SHIFTED 20, D0 IS THE DISPLACEMENT
3691da177e4SLinus Torvalds	addal	%d0,%a0		| ...A0 IS THE ADDRESS FOR 1/F
3701da177e4SLinus Torvalds
3711da177e4SLinus Torvalds	fmovex	X(%a6),%fp0
3721da177e4SLinus Torvalds	movel	#0x3fff0000,F(%a6)
3731da177e4SLinus Torvalds	clrl	F+8(%a6)
3741da177e4SLinus Torvalds	fsubx	F(%a6),%fp0		| ...Y-F
3751da177e4SLinus Torvalds	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...SAVE FP2 WHILE FP0 IS NOT READY
3761da177e4SLinus Torvalds|--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K
3771da177e4SLinus Torvalds|--REGISTERS SAVED: FPCR, FP1, FP2
3781da177e4SLinus Torvalds
3791da177e4SLinus TorvaldsLP1CONT1:
3801da177e4SLinus Torvalds|--AN RE-ENTRY POINT FOR LOGNP1
3811da177e4SLinus Torvalds	fmulx	(%a0),%fp0	| ...FP0 IS U = (Y-F)/F
3821da177e4SLinus Torvalds	fmulx	LOGOF2,%fp1	| ...GET K*LOG2 WHILE FP0 IS NOT READY
3831da177e4SLinus Torvalds	fmovex	%fp0,%fp2
3841da177e4SLinus Torvalds	fmulx	%fp2,%fp2		| ...FP2 IS V=U*U
3851da177e4SLinus Torvalds	fmovex	%fp1,KLOG2(%a6)	| ...PUT K*LOG2 IN MEMORY, FREE FP1
3861da177e4SLinus Torvalds
3871da177e4SLinus Torvalds|--LOG(1+U) IS APPROXIMATED BY
3881da177e4SLinus Torvalds|--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS
3891da177e4SLinus Torvalds|--[U + V*(A1+V*(A3+V*A5))]  +  [U*V*(A2+V*(A4+V*A6))]
3901da177e4SLinus Torvalds
3911da177e4SLinus Torvalds	fmovex	%fp2,%fp3
3921da177e4SLinus Torvalds	fmovex	%fp2,%fp1
3931da177e4SLinus Torvalds
3941da177e4SLinus Torvalds	fmuld	LOGA6,%fp1	| ...V*A6
3951da177e4SLinus Torvalds	fmuld	LOGA5,%fp2	| ...V*A5
3961da177e4SLinus Torvalds
3971da177e4SLinus Torvalds	faddd	LOGA4,%fp1	| ...A4+V*A6
3981da177e4SLinus Torvalds	faddd	LOGA3,%fp2	| ...A3+V*A5
3991da177e4SLinus Torvalds
4001da177e4SLinus Torvalds	fmulx	%fp3,%fp1		| ...V*(A4+V*A6)
4011da177e4SLinus Torvalds	fmulx	%fp3,%fp2		| ...V*(A3+V*A5)
4021da177e4SLinus Torvalds
4031da177e4SLinus Torvalds	faddd	LOGA2,%fp1	| ...A2+V*(A4+V*A6)
4041da177e4SLinus Torvalds	faddd	LOGA1,%fp2	| ...A1+V*(A3+V*A5)
4051da177e4SLinus Torvalds
4061da177e4SLinus Torvalds	fmulx	%fp3,%fp1		| ...V*(A2+V*(A4+V*A6))
4071da177e4SLinus Torvalds	addal	#16,%a0		| ...ADDRESS OF LOG(F)
4081da177e4SLinus Torvalds	fmulx	%fp3,%fp2		| ...V*(A1+V*(A3+V*A5)), FP3 RELEASED
4091da177e4SLinus Torvalds
4101da177e4SLinus Torvalds	fmulx	%fp0,%fp1		| ...U*V*(A2+V*(A4+V*A6))
4111da177e4SLinus Torvalds	faddx	%fp2,%fp0		| ...U+V*(A1+V*(A3+V*A5)), FP2 RELEASED
4121da177e4SLinus Torvalds
4131da177e4SLinus Torvalds	faddx	(%a0),%fp1	| ...LOG(F)+U*V*(A2+V*(A4+V*A6))
4141da177e4SLinus Torvalds	fmovemx  (%sp)+,%fp2-%fp2/%fp3	| ...RESTORE FP2
4151da177e4SLinus Torvalds	faddx	%fp1,%fp0		| ...FP0 IS LOG(F) + LOG(1+U)
4161da177e4SLinus Torvalds
4171da177e4SLinus Torvalds	fmovel	%d1,%fpcr
4181da177e4SLinus Torvalds	faddx	KLOG2(%a6),%fp0	| ...FINAL ADD
4191da177e4SLinus Torvalds	bra	t_frcinx
4201da177e4SLinus Torvalds
4211da177e4SLinus Torvalds
4221da177e4SLinus TorvaldsLOGNEAR1:
4231da177e4SLinus Torvalds|--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT.
4241da177e4SLinus Torvalds	fmovex	%fp0,%fp1
4251da177e4SLinus Torvalds	fsubs	one,%fp1		| ...FP1 IS X-1
4261da177e4SLinus Torvalds	fadds	one,%fp0		| ...FP0 IS X+1
4271da177e4SLinus Torvalds	faddx	%fp1,%fp1		| ...FP1 IS 2(X-1)
4281da177e4SLinus Torvalds|--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL
4291da177e4SLinus Torvalds|--IN U, U = 2(X-1)/(X+1) = FP1/FP0
4301da177e4SLinus Torvalds
4311da177e4SLinus TorvaldsLP1CONT2:
4321da177e4SLinus Torvalds|--THIS IS AN RE-ENTRY POINT FOR LOGNP1
4331da177e4SLinus Torvalds	fdivx	%fp0,%fp1		| ...FP1 IS U
4341da177e4SLinus Torvalds	fmovemx %fp2-%fp2/%fp3,-(%sp)	 | ...SAVE FP2
4351da177e4SLinus Torvalds|--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3
4361da177e4SLinus Torvalds|--LET V=U*U, W=V*V, CALCULATE
4371da177e4SLinus Torvalds|--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY
4381da177e4SLinus Torvalds|--U + U*V*(  [B1 + W*(B3 + W*B5)]  +  [V*(B2 + W*B4)]  )
4391da177e4SLinus Torvalds	fmovex	%fp1,%fp0
4401da177e4SLinus Torvalds	fmulx	%fp0,%fp0	| ...FP0 IS V
4411da177e4SLinus Torvalds	fmovex	%fp1,SAVEU(%a6) | ...STORE U IN MEMORY, FREE FP1
4421da177e4SLinus Torvalds	fmovex	%fp0,%fp1
4431da177e4SLinus Torvalds	fmulx	%fp1,%fp1	| ...FP1 IS W
4441da177e4SLinus Torvalds
4451da177e4SLinus Torvalds	fmoved	LOGB5,%fp3
4461da177e4SLinus Torvalds	fmoved	LOGB4,%fp2
4471da177e4SLinus Torvalds
4481da177e4SLinus Torvalds	fmulx	%fp1,%fp3	| ...W*B5
4491da177e4SLinus Torvalds	fmulx	%fp1,%fp2	| ...W*B4
4501da177e4SLinus Torvalds
4511da177e4SLinus Torvalds	faddd	LOGB3,%fp3 | ...B3+W*B5
4521da177e4SLinus Torvalds	faddd	LOGB2,%fp2 | ...B2+W*B4
4531da177e4SLinus Torvalds
4541da177e4SLinus Torvalds	fmulx	%fp3,%fp1	| ...W*(B3+W*B5), FP3 RELEASED
4551da177e4SLinus Torvalds
4561da177e4SLinus Torvalds	fmulx	%fp0,%fp2	| ...V*(B2+W*B4)
4571da177e4SLinus Torvalds
4581da177e4SLinus Torvalds	faddd	LOGB1,%fp1 | ...B1+W*(B3+W*B5)
4591da177e4SLinus Torvalds	fmulx	SAVEU(%a6),%fp0 | ...FP0 IS U*V
4601da177e4SLinus Torvalds
4611da177e4SLinus Torvalds	faddx	%fp2,%fp1	| ...B1+W*(B3+W*B5) + V*(B2+W*B4), FP2 RELEASED
4621da177e4SLinus Torvalds	fmovemx (%sp)+,%fp2-%fp2/%fp3 | ...FP2 RESTORED
4631da177e4SLinus Torvalds
4641da177e4SLinus Torvalds	fmulx	%fp1,%fp0	| ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] )
4651da177e4SLinus Torvalds
4661da177e4SLinus Torvalds	fmovel	%d1,%fpcr
4671da177e4SLinus Torvalds	faddx	SAVEU(%a6),%fp0
4681da177e4SLinus Torvalds	bra	t_frcinx
4691da177e4SLinus Torvalds	rts
4701da177e4SLinus Torvalds
4711da177e4SLinus TorvaldsLOGNEG:
4721da177e4SLinus Torvalds|--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID
4731da177e4SLinus Torvalds	bra	t_operr
4741da177e4SLinus Torvalds
4751da177e4SLinus Torvalds	.global	slognp1d
4761da177e4SLinus Torvaldsslognp1d:
4771da177e4SLinus Torvalds|--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT
4781da177e4SLinus Torvalds| Simply return the denorm
4791da177e4SLinus Torvalds
4801da177e4SLinus Torvalds	bra	t_extdnrm
4811da177e4SLinus Torvalds
4821da177e4SLinus Torvalds	.global	slognp1
4831da177e4SLinus Torvaldsslognp1:
4841da177e4SLinus Torvalds|--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S
4851da177e4SLinus Torvalds
4861da177e4SLinus Torvalds	fmovex	(%a0),%fp0	| ...LOAD INPUT
4871da177e4SLinus Torvalds	fabsx	%fp0		|test magnitude
4881da177e4SLinus Torvalds	fcmpx	LTHOLD,%fp0	|compare with min threshold
4891da177e4SLinus Torvalds	fbgt	LP1REAL		|if greater, continue
4901da177e4SLinus Torvalds	fmovel	#0,%fpsr		|clr N flag from compare
4911da177e4SLinus Torvalds	fmovel	%d1,%fpcr
4921da177e4SLinus Torvalds	fmovex	(%a0),%fp0	|return signed argument
4931da177e4SLinus Torvalds	bra	t_frcinx
4941da177e4SLinus Torvalds
4951da177e4SLinus TorvaldsLP1REAL:
4961da177e4SLinus Torvalds	fmovex	(%a0),%fp0	| ...LOAD INPUT
4971da177e4SLinus Torvalds	movel	#0x00000000,ADJK(%a6)
4981da177e4SLinus Torvalds	fmovex	%fp0,%fp1	| ...FP1 IS INPUT Z
4991da177e4SLinus Torvalds	fadds	one,%fp0	| ...X := ROUND(1+Z)
5001da177e4SLinus Torvalds	fmovex	%fp0,X(%a6)
5011da177e4SLinus Torvalds	movew	XFRAC(%a6),XDCARE(%a6)
5021da177e4SLinus Torvalds	movel	X(%a6),%d0
5031da177e4SLinus Torvalds	cmpil	#0,%d0
5041da177e4SLinus Torvalds	ble	LP1NEG0	| ...LOG OF ZERO OR -VE
5051da177e4SLinus Torvalds	cmp2l	BOUNDS2,%d0
5061da177e4SLinus Torvalds	bcs	LOGMAIN	| ...BOUNDS2 IS [1/2,3/2]
5071da177e4SLinus Torvalds|--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z,
5081da177e4SLinus Torvalds|--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE,
5091da177e4SLinus Torvalds|--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).
5101da177e4SLinus Torvalds
5111da177e4SLinus TorvaldsLP1NEAR1:
5121da177e4SLinus Torvalds|--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)
5131da177e4SLinus Torvalds	cmp2l	BOUNDS1,%d0
5141da177e4SLinus Torvalds	bcss	LP1CARE
5151da177e4SLinus Torvalds
5161da177e4SLinus TorvaldsLP1ONE16:
5171da177e4SLinus Torvalds|--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2)
5181da177e4SLinus Torvalds|--WHERE U = 2Z/(2+Z) = 2Z/(1+X).
5191da177e4SLinus Torvalds	faddx	%fp1,%fp1	| ...FP1 IS 2Z
5201da177e4SLinus Torvalds	fadds	one,%fp0	| ...FP0 IS 1+X
5211da177e4SLinus Torvalds|--U = FP1/FP0
5221da177e4SLinus Torvalds	bra	LP1CONT2
5231da177e4SLinus Torvalds
5241da177e4SLinus TorvaldsLP1CARE:
5251da177e4SLinus Torvalds|--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE
5261da177e4SLinus Torvalds|--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST
5271da177e4SLinus Torvalds|--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2],
5281da177e4SLinus Torvalds|--THERE ARE ONLY TWO CASES.
5291da177e4SLinus Torvalds|--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z
5301da177e4SLinus Torvalds|--CASE 2: 1+Z > 1, THEN K = 0  AND Y-F = (1-F) + Z
5311da177e4SLinus Torvalds|--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF
5321da177e4SLinus Torvalds|--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.
5331da177e4SLinus Torvalds
5341da177e4SLinus Torvalds	movel	XFRAC(%a6),FFRAC(%a6)
5351da177e4SLinus Torvalds	andil	#0xFE000000,FFRAC(%a6)
5361da177e4SLinus Torvalds	oril	#0x01000000,FFRAC(%a6)	| ...F OBTAINED
5371da177e4SLinus Torvalds	cmpil	#0x3FFF8000,%d0	| ...SEE IF 1+Z > 1
5381da177e4SLinus Torvalds	bges	KISZERO
5391da177e4SLinus Torvalds
5401da177e4SLinus TorvaldsKISNEG1:
5411da177e4SLinus Torvalds	fmoves	TWO,%fp0
5421da177e4SLinus Torvalds	movel	#0x3fff0000,F(%a6)
5431da177e4SLinus Torvalds	clrl	F+8(%a6)
5441da177e4SLinus Torvalds	fsubx	F(%a6),%fp0	| ...2-F
5451da177e4SLinus Torvalds	movel	FFRAC(%a6),%d0
5461da177e4SLinus Torvalds	andil	#0x7E000000,%d0
5471da177e4SLinus Torvalds	asrl	#8,%d0
5481da177e4SLinus Torvalds	asrl	#8,%d0
5491da177e4SLinus Torvalds	asrl	#4,%d0		| ...D0 CONTAINS DISPLACEMENT FOR 1/F
5501da177e4SLinus Torvalds	faddx	%fp1,%fp1		| ...GET 2Z
5511da177e4SLinus Torvalds	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...SAVE FP2
5521da177e4SLinus Torvalds	faddx	%fp1,%fp0		| ...FP0 IS Y-F = (2-F)+2Z
5531da177e4SLinus Torvalds	lea	LOGTBL,%a0	| ...A0 IS ADDRESS OF 1/F
5541da177e4SLinus Torvalds	addal	%d0,%a0
5551da177e4SLinus Torvalds	fmoves	negone,%fp1	| ...FP1 IS K = -1
5561da177e4SLinus Torvalds	bra	LP1CONT1
5571da177e4SLinus Torvalds
5581da177e4SLinus TorvaldsKISZERO:
5591da177e4SLinus Torvalds	fmoves	one,%fp0
5601da177e4SLinus Torvalds	movel	#0x3fff0000,F(%a6)
5611da177e4SLinus Torvalds	clrl	F+8(%a6)
5621da177e4SLinus Torvalds	fsubx	F(%a6),%fp0		| ...1-F
5631da177e4SLinus Torvalds	movel	FFRAC(%a6),%d0
5641da177e4SLinus Torvalds	andil	#0x7E000000,%d0
5651da177e4SLinus Torvalds	asrl	#8,%d0
5661da177e4SLinus Torvalds	asrl	#8,%d0
5671da177e4SLinus Torvalds	asrl	#4,%d0
5681da177e4SLinus Torvalds	faddx	%fp1,%fp0		| ...FP0 IS Y-F
5691da177e4SLinus Torvalds	fmovemx %fp2-%fp2/%fp3,-(%sp)	| ...FP2 SAVED
5701da177e4SLinus Torvalds	lea	LOGTBL,%a0
5711da177e4SLinus Torvalds	addal	%d0,%a0		| ...A0 IS ADDRESS OF 1/F
5721da177e4SLinus Torvalds	fmoves	zero,%fp1	| ...FP1 IS K = 0
5731da177e4SLinus Torvalds	bra	LP1CONT1
5741da177e4SLinus Torvalds
5751da177e4SLinus TorvaldsLP1NEG0:
5761da177e4SLinus Torvalds|--FPCR SAVED. D0 IS X IN COMPACT FORM.
5771da177e4SLinus Torvalds	cmpil	#0,%d0
5781da177e4SLinus Torvalds	blts	LP1NEG
5791da177e4SLinus TorvaldsLP1ZERO:
5801da177e4SLinus Torvalds	fmoves	negone,%fp0
5811da177e4SLinus Torvalds
5821da177e4SLinus Torvalds	fmovel	%d1,%fpcr
5831da177e4SLinus Torvalds	bra t_dz
5841da177e4SLinus Torvalds
5851da177e4SLinus TorvaldsLP1NEG:
5861da177e4SLinus Torvalds	fmoves	zero,%fp0
5871da177e4SLinus Torvalds
5881da177e4SLinus Torvalds	fmovel	%d1,%fpcr
5891da177e4SLinus Torvalds	bra	t_operr
5901da177e4SLinus Torvalds
5911da177e4SLinus Torvalds	|end
592