1 /* 2 * Shared data between exp, exp2 and pow. 3 * 4 * Copyright (c) 2018, Arm Limited. 5 * SPDX-License-Identifier: MIT 6 */ 7 8 #include "exp_data.h" 9 10 #define N (1 << EXP_TABLE_BITS) 11 12 const struct exp_data __exp_data = { 13 // N/ln2 14 .invln2N = 0x1.71547652b82fep0 * N, 15 // -ln2/N 16 .negln2hiN = -0x1.62e42fefa0000p-8, 17 .negln2loN = -0x1.cf79abc9e3b3ap-47, 18 // Used for rounding when !TOINT_INTRINSICS 19 #if EXP_USE_TOINT_NARROW 20 .shift = 0x1800000000.8p0, 21 #else 22 .shift = 0x1.8p52, 23 #endif 24 // exp polynomial coefficients. 25 .poly = { 26 // abs error: 1.555*2^-66 27 // ulp error: 0.509 (0.511 without fma) 28 // if |x| < ln2/256+eps 29 // abs error if |x| < ln2/256+0x1p-15: 1.09*2^-65 30 // abs error if |x| < ln2/128: 1.7145*2^-56 31 0x1.ffffffffffdbdp-2, 32 0x1.555555555543cp-3, 33 0x1.55555cf172b91p-5, 34 0x1.1111167a4d017p-7, 35 }, 36 .exp2_shift = 0x1.8p52 / N, 37 // exp2 polynomial coefficients. 38 .exp2_poly = { 39 // abs error: 1.2195*2^-65 40 // ulp error: 0.507 (0.511 without fma) 41 // if |x| < 1/256 42 // abs error if |x| < 1/128: 1.9941*2^-56 43 0x1.62e42fefa39efp-1, 44 0x1.ebfbdff82c424p-3, 45 0x1.c6b08d70cf4b5p-5, 46 0x1.3b2abd24650ccp-7, 47 0x1.5d7e09b4e3a84p-10, 48 }, 49 // 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N) 50 // tab[2*k] = asuint64(T[k]) 51 // tab[2*k+1] = asuint64(H[k]) - (k << 52)/N 52 .tab = { 53 0x0, 0x3ff0000000000000, 54 0x3c9b3b4f1a88bf6e, 0x3feff63da9fb3335, 55 0xbc7160139cd8dc5d, 0x3fefec9a3e778061, 56 0xbc905e7a108766d1, 0x3fefe315e86e7f85, 57 0x3c8cd2523567f613, 0x3fefd9b0d3158574, 58 0xbc8bce8023f98efa, 0x3fefd06b29ddf6de, 59 0x3c60f74e61e6c861, 0x3fefc74518759bc8, 60 0x3c90a3e45b33d399, 0x3fefbe3ecac6f383, 61 0x3c979aa65d837b6d, 0x3fefb5586cf9890f, 62 0x3c8eb51a92fdeffc, 0x3fefac922b7247f7, 63 0x3c3ebe3d702f9cd1, 0x3fefa3ec32d3d1a2, 64 0xbc6a033489906e0b, 0x3fef9b66affed31b, 65 0xbc9556522a2fbd0e, 0x3fef9301d0125b51, 66 0xbc5080ef8c4eea55, 0x3fef8abdc06c31cc, 67 0xbc91c923b9d5f416, 0x3fef829aaea92de0, 68 0x3c80d3e3e95c55af, 0x3fef7a98c8a58e51, 69 0xbc801b15eaa59348, 0x3fef72b83c7d517b, 70 0xbc8f1ff055de323d, 0x3fef6af9388c8dea, 71 0x3c8b898c3f1353bf, 0x3fef635beb6fcb75, 72 0xbc96d99c7611eb26, 0x3fef5be084045cd4, 73 0x3c9aecf73e3a2f60, 0x3fef54873168b9aa, 74 0xbc8fe782cb86389d, 0x3fef4d5022fcd91d, 75 0x3c8a6f4144a6c38d, 0x3fef463b88628cd6, 76 0x3c807a05b0e4047d, 0x3fef3f49917ddc96, 77 0x3c968efde3a8a894, 0x3fef387a6e756238, 78 0x3c875e18f274487d, 0x3fef31ce4fb2a63f, 79 0x3c80472b981fe7f2, 0x3fef2b4565e27cdd, 80 0xbc96b87b3f71085e, 0x3fef24dfe1f56381, 81 0x3c82f7e16d09ab31, 0x3fef1e9df51fdee1, 82 0xbc3d219b1a6fbffa, 0x3fef187fd0dad990, 83 0x3c8b3782720c0ab4, 0x3fef1285a6e4030b, 84 0x3c6e149289cecb8f, 0x3fef0cafa93e2f56, 85 0x3c834d754db0abb6, 0x3fef06fe0a31b715, 86 0x3c864201e2ac744c, 0x3fef0170fc4cd831, 87 0x3c8fdd395dd3f84a, 0x3feefc08b26416ff, 88 0xbc86a3803b8e5b04, 0x3feef6c55f929ff1, 89 0xbc924aedcc4b5068, 0x3feef1a7373aa9cb, 90 0xbc9907f81b512d8e, 0x3feeecae6d05d866, 91 0xbc71d1e83e9436d2, 0x3feee7db34e59ff7, 92 0xbc991919b3ce1b15, 0x3feee32dc313a8e5, 93 0x3c859f48a72a4c6d, 0x3feedea64c123422, 94 0xbc9312607a28698a, 0x3feeda4504ac801c, 95 0xbc58a78f4817895b, 0x3feed60a21f72e2a, 96 0xbc7c2c9b67499a1b, 0x3feed1f5d950a897, 97 0x3c4363ed60c2ac11, 0x3feece086061892d, 98 0x3c9666093b0664ef, 0x3feeca41ed1d0057, 99 0x3c6ecce1daa10379, 0x3feec6a2b5c13cd0, 100 0x3c93ff8e3f0f1230, 0x3feec32af0d7d3de, 101 0x3c7690cebb7aafb0, 0x3feebfdad5362a27, 102 0x3c931dbdeb54e077, 0x3feebcb299fddd0d, 103 0xbc8f94340071a38e, 0x3feeb9b2769d2ca7, 104 0xbc87deccdc93a349, 0x3feeb6daa2cf6642, 105 0xbc78dec6bd0f385f, 0x3feeb42b569d4f82, 106 0xbc861246ec7b5cf6, 0x3feeb1a4ca5d920f, 107 0x3c93350518fdd78e, 0x3feeaf4736b527da, 108 0x3c7b98b72f8a9b05, 0x3feead12d497c7fd, 109 0x3c9063e1e21c5409, 0x3feeab07dd485429, 110 0x3c34c7855019c6ea, 0x3feea9268a5946b7, 111 0x3c9432e62b64c035, 0x3feea76f15ad2148, 112 0xbc8ce44a6199769f, 0x3feea5e1b976dc09, 113 0xbc8c33c53bef4da8, 0x3feea47eb03a5585, 114 0xbc845378892be9ae, 0x3feea34634ccc320, 115 0xbc93cedd78565858, 0x3feea23882552225, 116 0x3c5710aa807e1964, 0x3feea155d44ca973, 117 0xbc93b3efbf5e2228, 0x3feea09e667f3bcd, 118 0xbc6a12ad8734b982, 0x3feea012750bdabf, 119 0xbc6367efb86da9ee, 0x3fee9fb23c651a2f, 120 0xbc80dc3d54e08851, 0x3fee9f7df9519484, 121 0xbc781f647e5a3ecf, 0x3fee9f75e8ec5f74, 122 0xbc86ee4ac08b7db0, 0x3fee9f9a48a58174, 123 0xbc8619321e55e68a, 0x3fee9feb564267c9, 124 0x3c909ccb5e09d4d3, 0x3feea0694fde5d3f, 125 0xbc7b32dcb94da51d, 0x3feea11473eb0187, 126 0x3c94ecfd5467c06b, 0x3feea1ed0130c132, 127 0x3c65ebe1abd66c55, 0x3feea2f336cf4e62, 128 0xbc88a1c52fb3cf42, 0x3feea427543e1a12, 129 0xbc9369b6f13b3734, 0x3feea589994cce13, 130 0xbc805e843a19ff1e, 0x3feea71a4623c7ad, 131 0xbc94d450d872576e, 0x3feea8d99b4492ed, 132 0x3c90ad675b0e8a00, 0x3feeaac7d98a6699, 133 0x3c8db72fc1f0eab4, 0x3feeace5422aa0db, 134 0xbc65b6609cc5e7ff, 0x3feeaf3216b5448c, 135 0x3c7bf68359f35f44, 0x3feeb1ae99157736, 136 0xbc93091fa71e3d83, 0x3feeb45b0b91ffc6, 137 0xbc5da9b88b6c1e29, 0x3feeb737b0cdc5e5, 138 0xbc6c23f97c90b959, 0x3feeba44cbc8520f, 139 0xbc92434322f4f9aa, 0x3feebd829fde4e50, 140 0xbc85ca6cd7668e4b, 0x3feec0f170ca07ba, 141 0x3c71affc2b91ce27, 0x3feec49182a3f090, 142 0x3c6dd235e10a73bb, 0x3feec86319e32323, 143 0xbc87c50422622263, 0x3feecc667b5de565, 144 0x3c8b1c86e3e231d5, 0x3feed09bec4a2d33, 145 0xbc91bbd1d3bcbb15, 0x3feed503b23e255d, 146 0x3c90cc319cee31d2, 0x3feed99e1330b358, 147 0x3c8469846e735ab3, 0x3feede6b5579fdbf, 148 0xbc82dfcd978e9db4, 0x3feee36bbfd3f37a, 149 0x3c8c1a7792cb3387, 0x3feee89f995ad3ad, 150 0xbc907b8f4ad1d9fa, 0x3feeee07298db666, 151 0xbc55c3d956dcaeba, 0x3feef3a2b84f15fb, 152 0xbc90a40e3da6f640, 0x3feef9728de5593a, 153 0xbc68d6f438ad9334, 0x3feeff76f2fb5e47, 154 0xbc91eee26b588a35, 0x3fef05b030a1064a, 155 0x3c74ffd70a5fddcd, 0x3fef0c1e904bc1d2, 156 0xbc91bdfbfa9298ac, 0x3fef12c25bd71e09, 157 0x3c736eae30af0cb3, 0x3fef199bdd85529c, 158 0x3c8ee3325c9ffd94, 0x3fef20ab5fffd07a, 159 0x3c84e08fd10959ac, 0x3fef27f12e57d14b, 160 0x3c63cdaf384e1a67, 0x3fef2f6d9406e7b5, 161 0x3c676b2c6c921968, 0x3fef3720dcef9069, 162 0xbc808a1883ccb5d2, 0x3fef3f0b555dc3fa, 163 0xbc8fad5d3ffffa6f, 0x3fef472d4a07897c, 164 0xbc900dae3875a949, 0x3fef4f87080d89f2, 165 0x3c74a385a63d07a7, 0x3fef5818dcfba487, 166 0xbc82919e2040220f, 0x3fef60e316c98398, 167 0x3c8e5a50d5c192ac, 0x3fef69e603db3285, 168 0x3c843a59ac016b4b, 0x3fef7321f301b460, 169 0xbc82d52107b43e1f, 0x3fef7c97337b9b5f, 170 0xbc892ab93b470dc9, 0x3fef864614f5a129, 171 0x3c74b604603a88d3, 0x3fef902ee78b3ff6, 172 0x3c83c5ec519d7271, 0x3fef9a51fbc74c83, 173 0xbc8ff7128fd391f0, 0x3fefa4afa2a490da, 174 0xbc8dae98e223747d, 0x3fefaf482d8e67f1, 175 0x3c8ec3bc41aa2008, 0x3fefba1bee615a27, 176 0x3c842b94c3a9eb32, 0x3fefc52b376bba97, 177 0x3c8a64a931d185ee, 0x3fefd0765b6e4540, 178 0xbc8e37bae43be3ed, 0x3fefdbfdad9cbe14, 179 0x3c77893b4d91cd9d, 0x3fefe7c1819e90d8, 180 0x3c5305c14160cc89, 0x3feff3c22b8f71f1, 181 }, 182 }; 183