1*4882a593Smuzhiyun| 2*4882a593Smuzhiyun| slogn.sa 3.1 12/10/90 3*4882a593Smuzhiyun| 4*4882a593Smuzhiyun| slogn computes the natural logarithm of an 5*4882a593Smuzhiyun| input value. slognd does the same except the input value is a 6*4882a593Smuzhiyun| denormalized number. slognp1 computes log(1+X), and slognp1d 7*4882a593Smuzhiyun| computes log(1+X) for denormalized X. 8*4882a593Smuzhiyun| 9*4882a593Smuzhiyun| Input: Double-extended value in memory location pointed to by address 10*4882a593Smuzhiyun| register a0. 11*4882a593Smuzhiyun| 12*4882a593Smuzhiyun| Output: log(X) or log(1+X) returned in floating-point register Fp0. 13*4882a593Smuzhiyun| 14*4882a593Smuzhiyun| Accuracy and Monotonicity: The returned result is within 2 ulps in 15*4882a593Smuzhiyun| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the 16*4882a593Smuzhiyun| result is subsequently rounded to double precision. The 17*4882a593Smuzhiyun| result is provably monotonic in double precision. 18*4882a593Smuzhiyun| 19*4882a593Smuzhiyun| Speed: The program slogn takes approximately 190 cycles for input 20*4882a593Smuzhiyun| argument X such that |X-1| >= 1/16, which is the usual 21*4882a593Smuzhiyun| situation. For those arguments, slognp1 takes approximately 22*4882a593Smuzhiyun| 210 cycles. For the less common arguments, the program will 23*4882a593Smuzhiyun| run no worse than 10% slower. 24*4882a593Smuzhiyun| 25*4882a593Smuzhiyun| Algorithm: 26*4882a593Smuzhiyun| LOGN: 27*4882a593Smuzhiyun| Step 1. If |X-1| < 1/16, approximate log(X) by an odd polynomial in 28*4882a593Smuzhiyun| u, where u = 2(X-1)/(X+1). Otherwise, move on to Step 2. 29*4882a593Smuzhiyun| 30*4882a593Smuzhiyun| Step 2. X = 2**k * Y where 1 <= Y < 2. Define F to be the first seven 31*4882a593Smuzhiyun| significant bits of Y plus 2**(-7), i.e. F = 1.xxxxxx1 in base 32*4882a593Smuzhiyun| 2 where the six "x" match those of Y. Note that |Y-F| <= 2**(-7). 33*4882a593Smuzhiyun| 34*4882a593Smuzhiyun| Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a polynomial in u, 35*4882a593Smuzhiyun| log(1+u) = poly. 36*4882a593Smuzhiyun| 37*4882a593Smuzhiyun| Step 4. Reconstruct log(X) = log( 2**k * Y ) = k*log(2) + log(F) + log(1+u) 38*4882a593Smuzhiyun| by k*log(2) + (log(F) + poly). The values of log(F) are calculated 39*4882a593Smuzhiyun| beforehand and stored in the program. 40*4882a593Smuzhiyun| 41*4882a593Smuzhiyun| lognp1: 42*4882a593Smuzhiyun| Step 1: If |X| < 1/16, approximate log(1+X) by an odd polynomial in 43*4882a593Smuzhiyun| u where u = 2X/(2+X). Otherwise, move on to Step 2. 44*4882a593Smuzhiyun| 45*4882a593Smuzhiyun| Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2 46*4882a593Smuzhiyun| of the algorithm for LOGN and compute log(1+X) as 47*4882a593Smuzhiyun| k*log(2) + log(F) + poly where poly approximates log(1+u), 48*4882a593Smuzhiyun| u = (Y-F)/F. 49*4882a593Smuzhiyun| 50*4882a593Smuzhiyun| Implementation Notes: 51*4882a593Smuzhiyun| Note 1. There are 64 different possible values for F, thus 64 log(F)'s 52*4882a593Smuzhiyun| need to be tabulated. Moreover, the values of 1/F are also 53*4882a593Smuzhiyun| tabulated so that the division in (Y-F)/F can be performed by a 54*4882a593Smuzhiyun| multiplication. 55*4882a593Smuzhiyun| 56*4882a593Smuzhiyun| Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value 57*4882a593Smuzhiyun| Y-F has to be calculated carefully when 1/2 <= X < 3/2. 58*4882a593Smuzhiyun| 59*4882a593Smuzhiyun| Note 3. To fully exploit the pipeline, polynomials are usually separated 60*4882a593Smuzhiyun| into two parts evaluated independently before being added up. 61*4882a593Smuzhiyun| 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun| Copyright (C) Motorola, Inc. 1990 64*4882a593Smuzhiyun| All Rights Reserved 65*4882a593Smuzhiyun| 66*4882a593Smuzhiyun| For details on the license for this file, please see the 67*4882a593Smuzhiyun| file, README, in this same directory. 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun|slogn idnt 2,1 | Motorola 040 Floating Point Software Package 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun |section 8 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun#include "fpsp.h" 74*4882a593Smuzhiyun 75*4882a593SmuzhiyunBOUNDS1: .long 0x3FFEF07D,0x3FFF8841 76*4882a593SmuzhiyunBOUNDS2: .long 0x3FFE8000,0x3FFFC000 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunLOGOF2: .long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000 79*4882a593Smuzhiyun 80*4882a593Smuzhiyunone: .long 0x3F800000 81*4882a593Smuzhiyunzero: .long 0x00000000 82*4882a593Smuzhiyuninfty: .long 0x7F800000 83*4882a593Smuzhiyunnegone: .long 0xBF800000 84*4882a593Smuzhiyun 85*4882a593SmuzhiyunLOGA6: .long 0x3FC2499A,0xB5E4040B 86*4882a593SmuzhiyunLOGA5: .long 0xBFC555B5,0x848CB7DB 87*4882a593Smuzhiyun 88*4882a593SmuzhiyunLOGA4: .long 0x3FC99999,0x987D8730 89*4882a593SmuzhiyunLOGA3: .long 0xBFCFFFFF,0xFF6F7E97 90*4882a593Smuzhiyun 91*4882a593SmuzhiyunLOGA2: .long 0x3FD55555,0x555555a4 92*4882a593SmuzhiyunLOGA1: .long 0xBFE00000,0x00000008 93*4882a593Smuzhiyun 94*4882a593SmuzhiyunLOGB5: .long 0x3F175496,0xADD7DAD6 95*4882a593SmuzhiyunLOGB4: .long 0x3F3C71C2,0xFE80C7E0 96*4882a593Smuzhiyun 97*4882a593SmuzhiyunLOGB3: .long 0x3F624924,0x928BCCFF 98*4882a593SmuzhiyunLOGB2: .long 0x3F899999,0x999995EC 99*4882a593Smuzhiyun 100*4882a593SmuzhiyunLOGB1: .long 0x3FB55555,0x55555555 101*4882a593SmuzhiyunTWO: .long 0x40000000,0x00000000 102*4882a593Smuzhiyun 103*4882a593SmuzhiyunLTHOLD: .long 0x3f990000,0x80000000,0x00000000,0x00000000 104*4882a593Smuzhiyun 105*4882a593SmuzhiyunLOGTBL: 106*4882a593Smuzhiyun .long 0x3FFE0000,0xFE03F80F,0xE03F80FE,0x00000000 107*4882a593Smuzhiyun .long 0x3FF70000,0xFF015358,0x833C47E2,0x00000000 108*4882a593Smuzhiyun .long 0x3FFE0000,0xFA232CF2,0x52138AC0,0x00000000 109*4882a593Smuzhiyun .long 0x3FF90000,0xBDC8D83E,0xAD88D549,0x00000000 110*4882a593Smuzhiyun .long 0x3FFE0000,0xF6603D98,0x0F6603DA,0x00000000 111*4882a593Smuzhiyun .long 0x3FFA0000,0x9CF43DCF,0xF5EAFD48,0x00000000 112*4882a593Smuzhiyun .long 0x3FFE0000,0xF2B9D648,0x0F2B9D65,0x00000000 113*4882a593Smuzhiyun .long 0x3FFA0000,0xDA16EB88,0xCB8DF614,0x00000000 114*4882a593Smuzhiyun .long 0x3FFE0000,0xEF2EB71F,0xC4345238,0x00000000 115*4882a593Smuzhiyun .long 0x3FFB0000,0x8B29B775,0x1BD70743,0x00000000 116*4882a593Smuzhiyun .long 0x3FFE0000,0xEBBDB2A5,0xC1619C8C,0x00000000 117*4882a593Smuzhiyun .long 0x3FFB0000,0xA8D839F8,0x30C1FB49,0x00000000 118*4882a593Smuzhiyun .long 0x3FFE0000,0xE865AC7B,0x7603A197,0x00000000 119*4882a593Smuzhiyun .long 0x3FFB0000,0xC61A2EB1,0x8CD907AD,0x00000000 120*4882a593Smuzhiyun .long 0x3FFE0000,0xE525982A,0xF70C880E,0x00000000 121*4882a593Smuzhiyun .long 0x3FFB0000,0xE2F2A47A,0xDE3A18AF,0x00000000 122*4882a593Smuzhiyun .long 0x3FFE0000,0xE1FC780E,0x1FC780E2,0x00000000 123*4882a593Smuzhiyun .long 0x3FFB0000,0xFF64898E,0xDF55D551,0x00000000 124*4882a593Smuzhiyun .long 0x3FFE0000,0xDEE95C4C,0xA037BA57,0x00000000 125*4882a593Smuzhiyun .long 0x3FFC0000,0x8DB956A9,0x7B3D0148,0x00000000 126*4882a593Smuzhiyun .long 0x3FFE0000,0xDBEB61EE,0xD19C5958,0x00000000 127*4882a593Smuzhiyun .long 0x3FFC0000,0x9B8FE100,0xF47BA1DE,0x00000000 128*4882a593Smuzhiyun .long 0x3FFE0000,0xD901B203,0x6406C80E,0x00000000 129*4882a593Smuzhiyun .long 0x3FFC0000,0xA9372F1D,0x0DA1BD17,0x00000000 130*4882a593Smuzhiyun .long 0x3FFE0000,0xD62B80D6,0x2B80D62C,0x00000000 131*4882a593Smuzhiyun .long 0x3FFC0000,0xB6B07F38,0xCE90E46B,0x00000000 132*4882a593Smuzhiyun .long 0x3FFE0000,0xD3680D36,0x80D3680D,0x00000000 133*4882a593Smuzhiyun .long 0x3FFC0000,0xC3FD0329,0x06488481,0x00000000 134*4882a593Smuzhiyun .long 0x3FFE0000,0xD0B69FCB,0xD2580D0B,0x00000000 135*4882a593Smuzhiyun .long 0x3FFC0000,0xD11DE0FF,0x15AB18CA,0x00000000 136*4882a593Smuzhiyun .long 0x3FFE0000,0xCE168A77,0x25080CE1,0x00000000 137*4882a593Smuzhiyun .long 0x3FFC0000,0xDE1433A1,0x6C66B150,0x00000000 138*4882a593Smuzhiyun .long 0x3FFE0000,0xCB8727C0,0x65C393E0,0x00000000 139*4882a593Smuzhiyun .long 0x3FFC0000,0xEAE10B5A,0x7DDC8ADD,0x00000000 140*4882a593Smuzhiyun .long 0x3FFE0000,0xC907DA4E,0x871146AD,0x00000000 141*4882a593Smuzhiyun .long 0x3FFC0000,0xF7856E5E,0xE2C9B291,0x00000000 142*4882a593Smuzhiyun .long 0x3FFE0000,0xC6980C69,0x80C6980C,0x00000000 143*4882a593Smuzhiyun .long 0x3FFD0000,0x82012CA5,0xA68206D7,0x00000000 144*4882a593Smuzhiyun .long 0x3FFE0000,0xC4372F85,0x5D824CA6,0x00000000 145*4882a593Smuzhiyun .long 0x3FFD0000,0x882C5FCD,0x7256A8C5,0x00000000 146*4882a593Smuzhiyun .long 0x3FFE0000,0xC1E4BBD5,0x95F6E947,0x00000000 147*4882a593Smuzhiyun .long 0x3FFD0000,0x8E44C60B,0x4CCFD7DE,0x00000000 148*4882a593Smuzhiyun .long 0x3FFE0000,0xBFA02FE8,0x0BFA02FF,0x00000000 149*4882a593Smuzhiyun .long 0x3FFD0000,0x944AD09E,0xF4351AF6,0x00000000 150*4882a593Smuzhiyun .long 0x3FFE0000,0xBD691047,0x07661AA3,0x00000000 151*4882a593Smuzhiyun .long 0x3FFD0000,0x9A3EECD4,0xC3EAA6B2,0x00000000 152*4882a593Smuzhiyun .long 0x3FFE0000,0xBB3EE721,0xA54D880C,0x00000000 153*4882a593Smuzhiyun .long 0x3FFD0000,0xA0218434,0x353F1DE8,0x00000000 154*4882a593Smuzhiyun .long 0x3FFE0000,0xB92143FA,0x36F5E02E,0x00000000 155*4882a593Smuzhiyun .long 0x3FFD0000,0xA5F2FCAB,0xBBC506DA,0x00000000 156*4882a593Smuzhiyun .long 0x3FFE0000,0xB70FBB5A,0x19BE3659,0x00000000 157*4882a593Smuzhiyun .long 0x3FFD0000,0xABB3B8BA,0x2AD362A5,0x00000000 158*4882a593Smuzhiyun .long 0x3FFE0000,0xB509E68A,0x9B94821F,0x00000000 159*4882a593Smuzhiyun .long 0x3FFD0000,0xB1641795,0xCE3CA97B,0x00000000 160*4882a593Smuzhiyun .long 0x3FFE0000,0xB30F6352,0x8917C80B,0x00000000 161*4882a593Smuzhiyun .long 0x3FFD0000,0xB7047551,0x5D0F1C61,0x00000000 162*4882a593Smuzhiyun .long 0x3FFE0000,0xB11FD3B8,0x0B11FD3C,0x00000000 163*4882a593Smuzhiyun .long 0x3FFD0000,0xBC952AFE,0xEA3D13E1,0x00000000 164*4882a593Smuzhiyun .long 0x3FFE0000,0xAF3ADDC6,0x80AF3ADE,0x00000000 165*4882a593Smuzhiyun .long 0x3FFD0000,0xC2168ED0,0xF458BA4A,0x00000000 166*4882a593Smuzhiyun .long 0x3FFE0000,0xAD602B58,0x0AD602B6,0x00000000 167*4882a593Smuzhiyun .long 0x3FFD0000,0xC788F439,0xB3163BF1,0x00000000 168*4882a593Smuzhiyun .long 0x3FFE0000,0xAB8F69E2,0x8359CD11,0x00000000 169*4882a593Smuzhiyun .long 0x3FFD0000,0xCCECAC08,0xBF04565D,0x00000000 170*4882a593Smuzhiyun .long 0x3FFE0000,0xA9C84A47,0xA07F5638,0x00000000 171*4882a593Smuzhiyun .long 0x3FFD0000,0xD2420487,0x2DD85160,0x00000000 172*4882a593Smuzhiyun .long 0x3FFE0000,0xA80A80A8,0x0A80A80B,0x00000000 173*4882a593Smuzhiyun .long 0x3FFD0000,0xD7894992,0x3BC3588A,0x00000000 174*4882a593Smuzhiyun .long 0x3FFE0000,0xA655C439,0x2D7B73A8,0x00000000 175*4882a593Smuzhiyun .long 0x3FFD0000,0xDCC2C4B4,0x9887DACC,0x00000000 176*4882a593Smuzhiyun .long 0x3FFE0000,0xA4A9CF1D,0x96833751,0x00000000 177*4882a593Smuzhiyun .long 0x3FFD0000,0xE1EEBD3E,0x6D6A6B9E,0x00000000 178*4882a593Smuzhiyun .long 0x3FFE0000,0xA3065E3F,0xAE7CD0E0,0x00000000 179*4882a593Smuzhiyun .long 0x3FFD0000,0xE70D785C,0x2F9F5BDC,0x00000000 180*4882a593Smuzhiyun .long 0x3FFE0000,0xA16B312E,0xA8FC377D,0x00000000 181*4882a593Smuzhiyun .long 0x3FFD0000,0xEC1F392C,0x5179F283,0x00000000 182*4882a593Smuzhiyun .long 0x3FFE0000,0x9FD809FD,0x809FD80A,0x00000000 183*4882a593Smuzhiyun .long 0x3FFD0000,0xF12440D3,0xE36130E6,0x00000000 184*4882a593Smuzhiyun .long 0x3FFE0000,0x9E4CAD23,0xDD5F3A20,0x00000000 185*4882a593Smuzhiyun .long 0x3FFD0000,0xF61CCE92,0x346600BB,0x00000000 186*4882a593Smuzhiyun .long 0x3FFE0000,0x9CC8E160,0xC3FB19B9,0x00000000 187*4882a593Smuzhiyun .long 0x3FFD0000,0xFB091FD3,0x8145630A,0x00000000 188*4882a593Smuzhiyun .long 0x3FFE0000,0x9B4C6F9E,0xF03A3CAA,0x00000000 189*4882a593Smuzhiyun .long 0x3FFD0000,0xFFE97042,0xBFA4C2AD,0x00000000 190*4882a593Smuzhiyun .long 0x3FFE0000,0x99D722DA,0xBDE58F06,0x00000000 191*4882a593Smuzhiyun .long 0x3FFE0000,0x825EFCED,0x49369330,0x00000000 192*4882a593Smuzhiyun .long 0x3FFE0000,0x9868C809,0x868C8098,0x00000000 193*4882a593Smuzhiyun .long 0x3FFE0000,0x84C37A7A,0xB9A905C9,0x00000000 194*4882a593Smuzhiyun .long 0x3FFE0000,0x97012E02,0x5C04B809,0x00000000 195*4882a593Smuzhiyun .long 0x3FFE0000,0x87224C2E,0x8E645FB7,0x00000000 196*4882a593Smuzhiyun .long 0x3FFE0000,0x95A02568,0x095A0257,0x00000000 197*4882a593Smuzhiyun .long 0x3FFE0000,0x897B8CAC,0x9F7DE298,0x00000000 198*4882a593Smuzhiyun .long 0x3FFE0000,0x94458094,0x45809446,0x00000000 199*4882a593Smuzhiyun .long 0x3FFE0000,0x8BCF55DE,0xC4CD05FE,0x00000000 200*4882a593Smuzhiyun .long 0x3FFE0000,0x92F11384,0x0497889C,0x00000000 201*4882a593Smuzhiyun .long 0x3FFE0000,0x8E1DC0FB,0x89E125E5,0x00000000 202*4882a593Smuzhiyun .long 0x3FFE0000,0x91A2B3C4,0xD5E6F809,0x00000000 203*4882a593Smuzhiyun .long 0x3FFE0000,0x9066E68C,0x955B6C9B,0x00000000 204*4882a593Smuzhiyun .long 0x3FFE0000,0x905A3863,0x3E06C43B,0x00000000 205*4882a593Smuzhiyun .long 0x3FFE0000,0x92AADE74,0xC7BE59E0,0x00000000 206*4882a593Smuzhiyun .long 0x3FFE0000,0x8F1779D9,0xFDC3A219,0x00000000 207*4882a593Smuzhiyun .long 0x3FFE0000,0x94E9BFF6,0x15845643,0x00000000 208*4882a593Smuzhiyun .long 0x3FFE0000,0x8DDA5202,0x37694809,0x00000000 209*4882a593Smuzhiyun .long 0x3FFE0000,0x9723A1B7,0x20134203,0x00000000 210*4882a593Smuzhiyun .long 0x3FFE0000,0x8CA29C04,0x6514E023,0x00000000 211*4882a593Smuzhiyun .long 0x3FFE0000,0x995899C8,0x90EB8990,0x00000000 212*4882a593Smuzhiyun .long 0x3FFE0000,0x8B70344A,0x139BC75A,0x00000000 213*4882a593Smuzhiyun .long 0x3FFE0000,0x9B88BDAA,0x3A3DAE2F,0x00000000 214*4882a593Smuzhiyun .long 0x3FFE0000,0x8A42F870,0x5669DB46,0x00000000 215*4882a593Smuzhiyun .long 0x3FFE0000,0x9DB4224F,0xFFE1157C,0x00000000 216*4882a593Smuzhiyun .long 0x3FFE0000,0x891AC73A,0xE9819B50,0x00000000 217*4882a593Smuzhiyun .long 0x3FFE0000,0x9FDADC26,0x8B7A12DA,0x00000000 218*4882a593Smuzhiyun .long 0x3FFE0000,0x87F78087,0xF78087F8,0x00000000 219*4882a593Smuzhiyun .long 0x3FFE0000,0xA1FCFF17,0xCE733BD4,0x00000000 220*4882a593Smuzhiyun .long 0x3FFE0000,0x86D90544,0x7A34ACC6,0x00000000 221*4882a593Smuzhiyun .long 0x3FFE0000,0xA41A9E8F,0x5446FB9F,0x00000000 222*4882a593Smuzhiyun .long 0x3FFE0000,0x85BF3761,0x2CEE3C9B,0x00000000 223*4882a593Smuzhiyun .long 0x3FFE0000,0xA633CD7E,0x6771CD8B,0x00000000 224*4882a593Smuzhiyun .long 0x3FFE0000,0x84A9F9C8,0x084A9F9D,0x00000000 225*4882a593Smuzhiyun .long 0x3FFE0000,0xA8489E60,0x0B435A5E,0x00000000 226*4882a593Smuzhiyun .long 0x3FFE0000,0x83993052,0x3FBE3368,0x00000000 227*4882a593Smuzhiyun .long 0x3FFE0000,0xAA59233C,0xCCA4BD49,0x00000000 228*4882a593Smuzhiyun .long 0x3FFE0000,0x828CBFBE,0xB9A020A3,0x00000000 229*4882a593Smuzhiyun .long 0x3FFE0000,0xAC656DAE,0x6BCC4985,0x00000000 230*4882a593Smuzhiyun .long 0x3FFE0000,0x81848DA8,0xFAF0D277,0x00000000 231*4882a593Smuzhiyun .long 0x3FFE0000,0xAE6D8EE3,0x60BB2468,0x00000000 232*4882a593Smuzhiyun .long 0x3FFE0000,0x80808080,0x80808081,0x00000000 233*4882a593Smuzhiyun .long 0x3FFE0000,0xB07197A2,0x3C46C654,0x00000000 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun .set ADJK,L_SCR1 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun .set X,FP_SCR1 238*4882a593Smuzhiyun .set XDCARE,X+2 239*4882a593Smuzhiyun .set XFRAC,X+4 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun .set F,FP_SCR2 242*4882a593Smuzhiyun .set FFRAC,F+4 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun .set KLOG2,FP_SCR3 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun .set SAVEU,FP_SCR4 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun | xref t_frcinx 249*4882a593Smuzhiyun |xref t_extdnrm 250*4882a593Smuzhiyun |xref t_operr 251*4882a593Smuzhiyun |xref t_dz 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun .global slognd 254*4882a593Smuzhiyunslognd: 255*4882a593Smuzhiyun|--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun movel #-100,ADJK(%a6) | ...INPUT = 2^(ADJK) * FP0 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun|----normalize the input value by left shifting k bits (k to be determined 260*4882a593Smuzhiyun|----below), adjusting exponent and storing -k to ADJK 261*4882a593Smuzhiyun|----the value TWOTO100 is no longer needed. 262*4882a593Smuzhiyun|----Note that this code assumes the denormalized input is NON-ZERO. 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun moveml %d2-%d7,-(%a7) | ...save some registers 265*4882a593Smuzhiyun movel #0x00000000,%d3 | ...D3 is exponent of smallest norm. # 266*4882a593Smuzhiyun movel 4(%a0),%d4 267*4882a593Smuzhiyun movel 8(%a0),%d5 | ...(D4,D5) is (Hi_X,Lo_X) 268*4882a593Smuzhiyun clrl %d2 | ...D2 used for holding K 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun tstl %d4 271*4882a593Smuzhiyun bnes HiX_not0 272*4882a593Smuzhiyun 273*4882a593SmuzhiyunHiX_0: 274*4882a593Smuzhiyun movel %d5,%d4 275*4882a593Smuzhiyun clrl %d5 276*4882a593Smuzhiyun movel #32,%d2 277*4882a593Smuzhiyun clrl %d6 278*4882a593Smuzhiyun bfffo %d4{#0:#32},%d6 279*4882a593Smuzhiyun lsll %d6,%d4 280*4882a593Smuzhiyun addl %d6,%d2 | ...(D3,D4,D5) is normalized 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun movel %d3,X(%a6) 283*4882a593Smuzhiyun movel %d4,XFRAC(%a6) 284*4882a593Smuzhiyun movel %d5,XFRAC+4(%a6) 285*4882a593Smuzhiyun negl %d2 286*4882a593Smuzhiyun movel %d2,ADJK(%a6) 287*4882a593Smuzhiyun fmovex X(%a6),%fp0 288*4882a593Smuzhiyun moveml (%a7)+,%d2-%d7 | ...restore registers 289*4882a593Smuzhiyun lea X(%a6),%a0 290*4882a593Smuzhiyun bras LOGBGN | ...begin regular log(X) 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun 293*4882a593SmuzhiyunHiX_not0: 294*4882a593Smuzhiyun clrl %d6 295*4882a593Smuzhiyun bfffo %d4{#0:#32},%d6 | ...find first 1 296*4882a593Smuzhiyun movel %d6,%d2 | ...get k 297*4882a593Smuzhiyun lsll %d6,%d4 298*4882a593Smuzhiyun movel %d5,%d7 | ...a copy of D5 299*4882a593Smuzhiyun lsll %d6,%d5 300*4882a593Smuzhiyun negl %d6 301*4882a593Smuzhiyun addil #32,%d6 302*4882a593Smuzhiyun lsrl %d6,%d7 303*4882a593Smuzhiyun orl %d7,%d4 | ...(D3,D4,D5) normalized 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun movel %d3,X(%a6) 306*4882a593Smuzhiyun movel %d4,XFRAC(%a6) 307*4882a593Smuzhiyun movel %d5,XFRAC+4(%a6) 308*4882a593Smuzhiyun negl %d2 309*4882a593Smuzhiyun movel %d2,ADJK(%a6) 310*4882a593Smuzhiyun fmovex X(%a6),%fp0 311*4882a593Smuzhiyun moveml (%a7)+,%d2-%d7 | ...restore registers 312*4882a593Smuzhiyun lea X(%a6),%a0 313*4882a593Smuzhiyun bras LOGBGN | ...begin regular log(X) 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun .global slogn 317*4882a593Smuzhiyunslogn: 318*4882a593Smuzhiyun|--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun fmovex (%a0),%fp0 | ...LOAD INPUT 321*4882a593Smuzhiyun movel #0x00000000,ADJK(%a6) 322*4882a593Smuzhiyun 323*4882a593SmuzhiyunLOGBGN: 324*4882a593Smuzhiyun|--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS 325*4882a593Smuzhiyun|--A FINITE, NON-ZERO, NORMALIZED NUMBER. 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun movel (%a0),%d0 328*4882a593Smuzhiyun movew 4(%a0),%d0 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun movel (%a0),X(%a6) 331*4882a593Smuzhiyun movel 4(%a0),X+4(%a6) 332*4882a593Smuzhiyun movel 8(%a0),X+8(%a6) 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun cmpil #0,%d0 | ...CHECK IF X IS NEGATIVE 335*4882a593Smuzhiyun blt LOGNEG | ...LOG OF NEGATIVE ARGUMENT IS INVALID 336*4882a593Smuzhiyun cmp2l BOUNDS1,%d0 | ...X IS POSITIVE, CHECK IF X IS NEAR 1 337*4882a593Smuzhiyun bcc LOGNEAR1 | ...BOUNDS IS ROUGHLY [15/16, 17/16] 338*4882a593Smuzhiyun 339*4882a593SmuzhiyunLOGMAIN: 340*4882a593Smuzhiyun|--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun|--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY. 343*4882a593Smuzhiyun|--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1. 344*4882a593Smuzhiyun|--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y) 345*4882a593Smuzhiyun|-- = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F). 346*4882a593Smuzhiyun|--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING 347*4882a593Smuzhiyun|--LOG(1+U) CAN BE VERY EFFICIENT. 348*4882a593Smuzhiyun|--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO 349*4882a593Smuzhiyun|--DIVISION IS NEEDED TO CALCULATE (Y-F)/F. 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun|--GET K, Y, F, AND ADDRESS OF 1/F. 352*4882a593Smuzhiyun asrl #8,%d0 353*4882a593Smuzhiyun asrl #8,%d0 | ...SHIFTED 16 BITS, BIASED EXPO. OF X 354*4882a593Smuzhiyun subil #0x3FFF,%d0 | ...THIS IS K 355*4882a593Smuzhiyun addl ADJK(%a6),%d0 | ...ADJUST K, ORIGINAL INPUT MAY BE DENORM. 356*4882a593Smuzhiyun lea LOGTBL,%a0 | ...BASE ADDRESS OF 1/F AND LOG(F) 357*4882a593Smuzhiyun fmovel %d0,%fp1 | ...CONVERT K TO FLOATING-POINT FORMAT 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun|--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F 360*4882a593Smuzhiyun movel #0x3FFF0000,X(%a6) | ...X IS NOW Y, I.E. 2^(-K)*X 361*4882a593Smuzhiyun movel XFRAC(%a6),FFRAC(%a6) 362*4882a593Smuzhiyun andil #0xFE000000,FFRAC(%a6) | ...FIRST 7 BITS OF Y 363*4882a593Smuzhiyun oril #0x01000000,FFRAC(%a6) | ...GET F: ATTACH A 1 AT THE EIGHTH BIT 364*4882a593Smuzhiyun movel FFRAC(%a6),%d0 | ...READY TO GET ADDRESS OF 1/F 365*4882a593Smuzhiyun andil #0x7E000000,%d0 366*4882a593Smuzhiyun asrl #8,%d0 367*4882a593Smuzhiyun asrl #8,%d0 368*4882a593Smuzhiyun asrl #4,%d0 | ...SHIFTED 20, D0 IS THE DISPLACEMENT 369*4882a593Smuzhiyun addal %d0,%a0 | ...A0 IS THE ADDRESS FOR 1/F 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun fmovex X(%a6),%fp0 372*4882a593Smuzhiyun movel #0x3fff0000,F(%a6) 373*4882a593Smuzhiyun clrl F+8(%a6) 374*4882a593Smuzhiyun fsubx F(%a6),%fp0 | ...Y-F 375*4882a593Smuzhiyun fmovemx %fp2-%fp2/%fp3,-(%sp) | ...SAVE FP2 WHILE FP0 IS NOT READY 376*4882a593Smuzhiyun|--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K 377*4882a593Smuzhiyun|--REGISTERS SAVED: FPCR, FP1, FP2 378*4882a593Smuzhiyun 379*4882a593SmuzhiyunLP1CONT1: 380*4882a593Smuzhiyun|--AN RE-ENTRY POINT FOR LOGNP1 381*4882a593Smuzhiyun fmulx (%a0),%fp0 | ...FP0 IS U = (Y-F)/F 382*4882a593Smuzhiyun fmulx LOGOF2,%fp1 | ...GET K*LOG2 WHILE FP0 IS NOT READY 383*4882a593Smuzhiyun fmovex %fp0,%fp2 384*4882a593Smuzhiyun fmulx %fp2,%fp2 | ...FP2 IS V=U*U 385*4882a593Smuzhiyun fmovex %fp1,KLOG2(%a6) | ...PUT K*LOG2 IN MEMORY, FREE FP1 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun|--LOG(1+U) IS APPROXIMATED BY 388*4882a593Smuzhiyun|--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS 389*4882a593Smuzhiyun|--[U + V*(A1+V*(A3+V*A5))] + [U*V*(A2+V*(A4+V*A6))] 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun fmovex %fp2,%fp3 392*4882a593Smuzhiyun fmovex %fp2,%fp1 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun fmuld LOGA6,%fp1 | ...V*A6 395*4882a593Smuzhiyun fmuld LOGA5,%fp2 | ...V*A5 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun faddd LOGA4,%fp1 | ...A4+V*A6 398*4882a593Smuzhiyun faddd LOGA3,%fp2 | ...A3+V*A5 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun fmulx %fp3,%fp1 | ...V*(A4+V*A6) 401*4882a593Smuzhiyun fmulx %fp3,%fp2 | ...V*(A3+V*A5) 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun faddd LOGA2,%fp1 | ...A2+V*(A4+V*A6) 404*4882a593Smuzhiyun faddd LOGA1,%fp2 | ...A1+V*(A3+V*A5) 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun fmulx %fp3,%fp1 | ...V*(A2+V*(A4+V*A6)) 407*4882a593Smuzhiyun addal #16,%a0 | ...ADDRESS OF LOG(F) 408*4882a593Smuzhiyun fmulx %fp3,%fp2 | ...V*(A1+V*(A3+V*A5)), FP3 RELEASED 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun fmulx %fp0,%fp1 | ...U*V*(A2+V*(A4+V*A6)) 411*4882a593Smuzhiyun faddx %fp2,%fp0 | ...U+V*(A1+V*(A3+V*A5)), FP2 RELEASED 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun faddx (%a0),%fp1 | ...LOG(F)+U*V*(A2+V*(A4+V*A6)) 414*4882a593Smuzhiyun fmovemx (%sp)+,%fp2-%fp2/%fp3 | ...RESTORE FP2 415*4882a593Smuzhiyun faddx %fp1,%fp0 | ...FP0 IS LOG(F) + LOG(1+U) 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun fmovel %d1,%fpcr 418*4882a593Smuzhiyun faddx KLOG2(%a6),%fp0 | ...FINAL ADD 419*4882a593Smuzhiyun bra t_frcinx 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun 422*4882a593SmuzhiyunLOGNEAR1: 423*4882a593Smuzhiyun|--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT. 424*4882a593Smuzhiyun fmovex %fp0,%fp1 425*4882a593Smuzhiyun fsubs one,%fp1 | ...FP1 IS X-1 426*4882a593Smuzhiyun fadds one,%fp0 | ...FP0 IS X+1 427*4882a593Smuzhiyun faddx %fp1,%fp1 | ...FP1 IS 2(X-1) 428*4882a593Smuzhiyun|--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL 429*4882a593Smuzhiyun|--IN U, U = 2(X-1)/(X+1) = FP1/FP0 430*4882a593Smuzhiyun 431*4882a593SmuzhiyunLP1CONT2: 432*4882a593Smuzhiyun|--THIS IS AN RE-ENTRY POINT FOR LOGNP1 433*4882a593Smuzhiyun fdivx %fp0,%fp1 | ...FP1 IS U 434*4882a593Smuzhiyun fmovemx %fp2-%fp2/%fp3,-(%sp) | ...SAVE FP2 435*4882a593Smuzhiyun|--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3 436*4882a593Smuzhiyun|--LET V=U*U, W=V*V, CALCULATE 437*4882a593Smuzhiyun|--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY 438*4882a593Smuzhiyun|--U + U*V*( [B1 + W*(B3 + W*B5)] + [V*(B2 + W*B4)] ) 439*4882a593Smuzhiyun fmovex %fp1,%fp0 440*4882a593Smuzhiyun fmulx %fp0,%fp0 | ...FP0 IS V 441*4882a593Smuzhiyun fmovex %fp1,SAVEU(%a6) | ...STORE U IN MEMORY, FREE FP1 442*4882a593Smuzhiyun fmovex %fp0,%fp1 443*4882a593Smuzhiyun fmulx %fp1,%fp1 | ...FP1 IS W 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun fmoved LOGB5,%fp3 446*4882a593Smuzhiyun fmoved LOGB4,%fp2 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun fmulx %fp1,%fp3 | ...W*B5 449*4882a593Smuzhiyun fmulx %fp1,%fp2 | ...W*B4 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun faddd LOGB3,%fp3 | ...B3+W*B5 452*4882a593Smuzhiyun faddd LOGB2,%fp2 | ...B2+W*B4 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun fmulx %fp3,%fp1 | ...W*(B3+W*B5), FP3 RELEASED 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun fmulx %fp0,%fp2 | ...V*(B2+W*B4) 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun faddd LOGB1,%fp1 | ...B1+W*(B3+W*B5) 459*4882a593Smuzhiyun fmulx SAVEU(%a6),%fp0 | ...FP0 IS U*V 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun faddx %fp2,%fp1 | ...B1+W*(B3+W*B5) + V*(B2+W*B4), FP2 RELEASED 462*4882a593Smuzhiyun fmovemx (%sp)+,%fp2-%fp2/%fp3 | ...FP2 RESTORED 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun fmulx %fp1,%fp0 | ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] ) 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun fmovel %d1,%fpcr 467*4882a593Smuzhiyun faddx SAVEU(%a6),%fp0 468*4882a593Smuzhiyun bra t_frcinx 469*4882a593Smuzhiyun rts 470*4882a593Smuzhiyun 471*4882a593SmuzhiyunLOGNEG: 472*4882a593Smuzhiyun|--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID 473*4882a593Smuzhiyun bra t_operr 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun .global slognp1d 476*4882a593Smuzhiyunslognp1d: 477*4882a593Smuzhiyun|--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT 478*4882a593Smuzhiyun| Simply return the denorm 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun bra t_extdnrm 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun .global slognp1 483*4882a593Smuzhiyunslognp1: 484*4882a593Smuzhiyun|--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun fmovex (%a0),%fp0 | ...LOAD INPUT 487*4882a593Smuzhiyun fabsx %fp0 |test magnitude 488*4882a593Smuzhiyun fcmpx LTHOLD,%fp0 |compare with min threshold 489*4882a593Smuzhiyun fbgt LP1REAL |if greater, continue 490*4882a593Smuzhiyun fmovel #0,%fpsr |clr N flag from compare 491*4882a593Smuzhiyun fmovel %d1,%fpcr 492*4882a593Smuzhiyun fmovex (%a0),%fp0 |return signed argument 493*4882a593Smuzhiyun bra t_frcinx 494*4882a593Smuzhiyun 495*4882a593SmuzhiyunLP1REAL: 496*4882a593Smuzhiyun fmovex (%a0),%fp0 | ...LOAD INPUT 497*4882a593Smuzhiyun movel #0x00000000,ADJK(%a6) 498*4882a593Smuzhiyun fmovex %fp0,%fp1 | ...FP1 IS INPUT Z 499*4882a593Smuzhiyun fadds one,%fp0 | ...X := ROUND(1+Z) 500*4882a593Smuzhiyun fmovex %fp0,X(%a6) 501*4882a593Smuzhiyun movew XFRAC(%a6),XDCARE(%a6) 502*4882a593Smuzhiyun movel X(%a6),%d0 503*4882a593Smuzhiyun cmpil #0,%d0 504*4882a593Smuzhiyun ble LP1NEG0 | ...LOG OF ZERO OR -VE 505*4882a593Smuzhiyun cmp2l BOUNDS2,%d0 506*4882a593Smuzhiyun bcs LOGMAIN | ...BOUNDS2 IS [1/2,3/2] 507*4882a593Smuzhiyun|--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z, 508*4882a593Smuzhiyun|--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE, 509*4882a593Smuzhiyun|--SIMPLY INVOKE LOG(X) FOR LOG(1+Z). 510*4882a593Smuzhiyun 511*4882a593SmuzhiyunLP1NEAR1: 512*4882a593Smuzhiyun|--NEXT SEE IF EXP(-1/16) < X < EXP(1/16) 513*4882a593Smuzhiyun cmp2l BOUNDS1,%d0 514*4882a593Smuzhiyun bcss LP1CARE 515*4882a593Smuzhiyun 516*4882a593SmuzhiyunLP1ONE16: 517*4882a593Smuzhiyun|--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2) 518*4882a593Smuzhiyun|--WHERE U = 2Z/(2+Z) = 2Z/(1+X). 519*4882a593Smuzhiyun faddx %fp1,%fp1 | ...FP1 IS 2Z 520*4882a593Smuzhiyun fadds one,%fp0 | ...FP0 IS 1+X 521*4882a593Smuzhiyun|--U = FP1/FP0 522*4882a593Smuzhiyun bra LP1CONT2 523*4882a593Smuzhiyun 524*4882a593SmuzhiyunLP1CARE: 525*4882a593Smuzhiyun|--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE 526*4882a593Smuzhiyun|--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST 527*4882a593Smuzhiyun|--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2], 528*4882a593Smuzhiyun|--THERE ARE ONLY TWO CASES. 529*4882a593Smuzhiyun|--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z 530*4882a593Smuzhiyun|--CASE 2: 1+Z > 1, THEN K = 0 AND Y-F = (1-F) + Z 531*4882a593Smuzhiyun|--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF 532*4882a593Smuzhiyun|--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED. 533*4882a593Smuzhiyun 534*4882a593Smuzhiyun movel XFRAC(%a6),FFRAC(%a6) 535*4882a593Smuzhiyun andil #0xFE000000,FFRAC(%a6) 536*4882a593Smuzhiyun oril #0x01000000,FFRAC(%a6) | ...F OBTAINED 537*4882a593Smuzhiyun cmpil #0x3FFF8000,%d0 | ...SEE IF 1+Z > 1 538*4882a593Smuzhiyun bges KISZERO 539*4882a593Smuzhiyun 540*4882a593SmuzhiyunKISNEG1: 541*4882a593Smuzhiyun fmoves TWO,%fp0 542*4882a593Smuzhiyun movel #0x3fff0000,F(%a6) 543*4882a593Smuzhiyun clrl F+8(%a6) 544*4882a593Smuzhiyun fsubx F(%a6),%fp0 | ...2-F 545*4882a593Smuzhiyun movel FFRAC(%a6),%d0 546*4882a593Smuzhiyun andil #0x7E000000,%d0 547*4882a593Smuzhiyun asrl #8,%d0 548*4882a593Smuzhiyun asrl #8,%d0 549*4882a593Smuzhiyun asrl #4,%d0 | ...D0 CONTAINS DISPLACEMENT FOR 1/F 550*4882a593Smuzhiyun faddx %fp1,%fp1 | ...GET 2Z 551*4882a593Smuzhiyun fmovemx %fp2-%fp2/%fp3,-(%sp) | ...SAVE FP2 552*4882a593Smuzhiyun faddx %fp1,%fp0 | ...FP0 IS Y-F = (2-F)+2Z 553*4882a593Smuzhiyun lea LOGTBL,%a0 | ...A0 IS ADDRESS OF 1/F 554*4882a593Smuzhiyun addal %d0,%a0 555*4882a593Smuzhiyun fmoves negone,%fp1 | ...FP1 IS K = -1 556*4882a593Smuzhiyun bra LP1CONT1 557*4882a593Smuzhiyun 558*4882a593SmuzhiyunKISZERO: 559*4882a593Smuzhiyun fmoves one,%fp0 560*4882a593Smuzhiyun movel #0x3fff0000,F(%a6) 561*4882a593Smuzhiyun clrl F+8(%a6) 562*4882a593Smuzhiyun fsubx F(%a6),%fp0 | ...1-F 563*4882a593Smuzhiyun movel FFRAC(%a6),%d0 564*4882a593Smuzhiyun andil #0x7E000000,%d0 565*4882a593Smuzhiyun asrl #8,%d0 566*4882a593Smuzhiyun asrl #8,%d0 567*4882a593Smuzhiyun asrl #4,%d0 568*4882a593Smuzhiyun faddx %fp1,%fp0 | ...FP0 IS Y-F 569*4882a593Smuzhiyun fmovemx %fp2-%fp2/%fp3,-(%sp) | ...FP2 SAVED 570*4882a593Smuzhiyun lea LOGTBL,%a0 571*4882a593Smuzhiyun addal %d0,%a0 | ...A0 IS ADDRESS OF 1/F 572*4882a593Smuzhiyun fmoves zero,%fp1 | ...FP1 IS K = 0 573*4882a593Smuzhiyun bra LP1CONT1 574*4882a593Smuzhiyun 575*4882a593SmuzhiyunLP1NEG0: 576*4882a593Smuzhiyun|--FPCR SAVED. D0 IS X IN COMPACT FORM. 577*4882a593Smuzhiyun cmpil #0,%d0 578*4882a593Smuzhiyun blts LP1NEG 579*4882a593SmuzhiyunLP1ZERO: 580*4882a593Smuzhiyun fmoves negone,%fp0 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun fmovel %d1,%fpcr 583*4882a593Smuzhiyun bra t_dz 584*4882a593Smuzhiyun 585*4882a593SmuzhiyunLP1NEG: 586*4882a593Smuzhiyun fmoves zero,%fp0 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun fmovel %d1,%fpcr 589*4882a593Smuzhiyun bra t_operr 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun |end 592