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