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