this repo has no description
at fixPythonPipStalling 489 lines 33 kB view raw
1/* 2 * log10f.s 3 * 4 * by Ian Ollmann 5 * 6 * Copyright 2007 Apple Inc. All Rights Reserved. 7 */ 8 9#include <machine/asm.h> 10#include "abi.h" 11 12.const 13.align 4 14 15// 256 entry of Lookup table of values used for log10 calculation, generated as: 16// 17// #include <stdio.h> 18// #include <stdint.h> 19// #include <math.h> 20// 21// int main (void) 22// { 23// 24// int i; 25// 26// for( i = 0; i < 256; i++ ) 27// { 28// double d = (double) i / 256.0 + 1.0; 29// union 30// { 31// double d; 32// uint64_t u; 33// }u, u2; 34// 35// u.d = (double) log10l( (long double) d ); 36// u2.d = 1.0 / d; 37// 38// printf( ".quad\t0x%llx,\t0x%llx\t// log10(%7.5f), 1/%7.5f\n", u.u, u2.u, d, d ); 39// } 40// 41// return 0; 42// } 43 44log10_m_table: .quad 0x0, 0x3ff0000000000000 // log10(1.00000), 1/1.00000 45 .quad 0x3f5bbd9e9482af09, 0x3fefe01fe01fe020 // log10(1.00391), 1/1.00391 46 .quad 0x3f6bafd47221ed26, 0x3fefc07f01fc07f0 // log10(1.00781), 1/1.00781 47 .quad 0x3f74b99563d2a1bd, 0x3fefa11caa01fa12 // log10(1.01172), 1/1.01172 48 .quad 0x3f7b9476a4fcd10f, 0x3fef81f81f81f820 // log10(1.01562), 1/1.01562 49 .quad 0x3f81344daa2d7553, 0x3fef6310aca0dbb5 // log10(1.01953), 1/1.01953 50 .quad 0x3f849b0851443684, 0x3fef44659e4a4271 // log10(1.02344), 1/1.02344 51 .quad 0x3f87fe71ccc4e6b0, 0x3fef25f644230ab5 // log10(1.02734), 1/1.02734 52 .quad 0x3f8b5e908eb13790, 0x3fef07c1f07c1f08 // log10(1.03125), 1/1.03125 53 .quad 0x3f8ebb6af653e2ee, 0x3feee9c7f8458e02 // log10(1.03516), 1/1.03516 54 .quad 0x3f910a83a8446c78, 0x3feecc07b301ecc0 // log10(1.03906), 1/1.03906 55 .quad 0x3f92b5b5ec0209d3, 0x3feeae807aba01eb // log10(1.04297), 1/1.04297 56 .quad 0x3f945f4f5acb8be0, 0x3fee9131abf0b767 // log10(1.04688), 1/1.04688 57 .quad 0x3f960753003a94ef, 0x3fee741aa59750e4 // log10(1.05078), 1/1.05078 58 .quad 0x3f97adc3df3b1ff8, 0x3fee573ac901e574 // log10(1.05469), 1/1.05469 59 .quad 0x3f9952a4f22c5ae9, 0x3fee3a9179dc1a73 // log10(1.05859), 1/1.05859 60 .quad 0x3f9af5f92b00e610, 0x3fee1e1e1e1e1e1e // log10(1.06250), 1/1.06250 61 .quad 0x3f9c97c3735e7c0a, 0x3fee01e01e01e01e // log10(1.06641), 1/1.06641 62 .quad 0x3f9e3806acbd058f, 0x3fede5d6e3f8868a // log10(1.07031), 1/1.07031 63 .quad 0x3f9fd6c5b0851c4c, 0x3fedca01dca01dca // log10(1.07422), 1/1.07422 64 .quad 0x3fa0ba01a8170000, 0x3fedae6076b981db // log10(1.07812), 1/1.07812 65 .quad 0x3fa187e12aad8077, 0x3fed92f2231e7f8a // log10(1.08203), 1/1.08203 66 .quad 0x3fa25502c0fc314c, 0x3fed77b654b82c34 // log10(1.08594), 1/1.08594 67 .quad 0x3fa32167c82bdcda, 0x3fed5cac807572b2 // log10(1.08984), 1/1.08984 68 .quad 0x3fa3ed1199a5e425, 0x3fed41d41d41d41d // log10(1.09375), 1/1.09375 69 .quad 0x3fa4b8018b21ed4f, 0x3fed272ca3fc5b1a // log10(1.09766), 1/1.09766 70 .quad 0x3fa58238eeb353da, 0x3fed0cb58f6ec074 // log10(1.10156), 1/1.10156 71 .quad 0x3fa64bb912d65c07, 0x3fecf26e5c44bfc6 // log10(1.10547), 1/1.10547 72 .quad 0x3fa71483427d2a99, 0x3fecd85689039b0b // log10(1.10938), 1/1.10938 73 .quad 0x3fa7dc98c51c8242, 0x3fecbe6d9601cbe7 // log10(1.11328), 1/1.11328 74 .quad 0x3fa8a3fadeb847f4, 0x3feca4b3055ee191 // log10(1.11719), 1/1.11719 75 .quad 0x3fa96aaacfefcf3c, 0x3fec8b265afb8a42 // log10(1.12109), 1/1.12109 76 .quad 0x3faa30a9d609efea, 0x3fec71c71c71c71c // log10(1.12500), 1/1.12500 77 .quad 0x3faaf5f92b00e610, 0x3fec5894d10d4986 // log10(1.12891), 1/1.12891 78 .quad 0x3fabba9a058dfd84, 0x3fec3f8f01c3f8f0 // log10(1.13281), 1/1.13281 79 .quad 0x3fac7e8d993509f9, 0x3fec26b5392ea01c // log10(1.13672), 1/1.13672 80 .quad 0x3fad41d5164facb4, 0x3fec0e070381c0e0 // log10(1.14062), 1/1.14062 81 .quad 0x3fae0471aa1868f5, 0x3febf583ee868d8b // log10(1.14453), 1/1.14453 82 .quad 0x3faec6647eb58808, 0x3febdd2b899406f7 // log10(1.14844), 1/1.14844 83 .quad 0x3faf87aebb43ce06, 0x3febc4fd65883e7b // log10(1.15234), 1/1.15234 84 .quad 0x3fb02428c1f08016, 0x3febacf914c1bad0 // log10(1.15625), 1/1.15625 85 .quad 0x3fb08426fcdb1ee7, 0x3feb951e2b18ff23 // log10(1.16016), 1/1.16016 86 .quad 0x3fb0e3d29d81165e, 0x3feb7d6c3dda338b // log10(1.16406), 1/1.16406 87 .quad 0x3fb1432c31917d08, 0x3feb65e2e3beee05 // log10(1.16797), 1/1.16797 88 .quad 0x3fb1a23445501816, 0x3feb4e81b4e81b4f // log10(1.17188), 1/1.17188 89 .quad 0x3fb200eb639a3173, 0x3feb37484ad806ce // log10(1.17578), 1/1.17578 90 .quad 0x3fb25f5215eb594a, 0x3feb2036406c80d9 // log10(1.17969), 1/1.17969 91 .quad 0x3fb2bd68e4621371, 0x3feb094b31d922a4 // log10(1.18359), 1/1.18359 92 .quad 0x3fb31b3055c47118, 0x3feaf286bca1af28 // log10(1.18750), 1/1.18750 93 .quad 0x3fb378a8ef84971e, 0x3feadbe87f94905e // log10(1.19141), 1/1.19141 94 .quad 0x3fb3d5d335c53179, 0x3feac5701ac5701b // log10(1.19531), 1/1.19531 95 .quad 0x3fb432afab5dd3ff, 0x3feaaf1d2f87ebfd // log10(1.19922), 1/1.19922 96 .quad 0x3fb48f3ed1df48fb, 0x3fea98ef606a63be // log10(1.20312), 1/1.20312 97 .quad 0x3fb4eb812997cde4, 0x3fea82e65130e159 // log10(1.20703), 1/1.20703 98 .quad 0x3fb5477731973e85, 0x3fea6d01a6d01a6d // log10(1.21094), 1/1.21094 99 .quad 0x3fb5a32167b32f02, 0x3fea574107688a4a // log10(1.21484), 1/1.21484 100 .quad 0x3fb5fe80488af4fd, 0x3fea41a41a41a41a // log10(1.21875), 1/1.21875 101 .quad 0x3fb659944f8ba02d, 0x3fea2c2a87c51ca0 // log10(1.22266), 1/1.22266 102 .quad 0x3fb6b45df6f3e2c9, 0x3fea16d3f97a4b02 // log10(1.22656), 1/1.22656 103 .quad 0x3fb70eddb7d7ea07, 0x3fea01a01a01a01a // log10(1.23047), 1/1.23047 104 .quad 0x3fb769140a2526fd, 0x3fe9ec8e951033d9 // log10(1.23438), 1/1.23438 105 .quad 0x3fb7c30164a60836, 0x3fe9d79f176b682d // log10(1.23828), 1/1.23828 106 .quad 0x3fb81ca63d05a44a, 0x3fe9c2d14ee4a102 // log10(1.24219), 1/1.24219 107 .quad 0x3fb8760307d355ab, 0x3fe9ae24ea5510da // log10(1.24609), 1/1.24609 108 .quad 0x3fb8cf183886480d, 0x3fe999999999999a // log10(1.25000), 1/1.25000 109 .quad 0x3fb927e64180f790, 0x3fe9852f0d8ec0ff // log10(1.25391), 1/1.25391 110 .quad 0x3fb9806d9414a209, 0x3fe970e4f80cb872 // log10(1.25781), 1/1.25781 111 .quad 0x3fb9d8aea084aa9c, 0x3fe95cbb0be377ae // log10(1.26172), 1/1.26172 112 .quad 0x3fba30a9d609efea, 0x3fe948b0fcd6e9e0 // log10(1.26562), 1/1.26562 113 .quad 0x3fba885fa2d6151e, 0x3fe934c67f9b2ce6 // log10(1.26953), 1/1.26953 114 .quad 0x3fbadfd07416be07, 0x3fe920fb49d0e229 // log10(1.27344), 1/1.27344 115 .quad 0x3fbb36fcb5f8be8a, 0x3fe90d4f120190d5 // log10(1.27734), 1/1.27734 116 .quad 0x3fbb8de4d3ab3d98, 0x3fe8f9c18f9c18fa // log10(1.28125), 1/1.28125 117 .quad 0x3fbbe4893762cbf7, 0x3fe8e6527af1373f // log10(1.28516), 1/1.28516 118 .quad 0x3fbc3aea4a5c6eff, 0x3fe8d3018d3018d3 // log10(1.28906), 1/1.28906 119 .quad 0x3fbc910874e09f98, 0x3fe8bfce8062ff3a // log10(1.29297), 1/1.29297 120 .quad 0x3fbce6e41e463da5, 0x3fe8acb90f6bf3aa // log10(1.29688), 1/1.29688 121 .quad 0x3fbd3c7dacf5780b, 0x3fe899c0f601899c // log10(1.30078), 1/1.30078 122 .quad 0x3fbd91d5866aa99c, 0x3fe886e5f0abb04a // log10(1.30469), 1/1.30469 123 .quad 0x3fbde6ec0f392b05, 0x3fe87427bcc092b9 // log10(1.30859), 1/1.30859 124 .quad 0x3fbe3bc1ab0e19fe, 0x3fe8618618618618 // log10(1.31250), 1/1.31250 125 .quad 0x3fbe9056bcb315e8, 0x3fe84f00c2780614 // log10(1.31641), 1/1.31641 126 .quad 0x3fbee4aba610f204, 0x3fe83c977ab2bedd // log10(1.32031), 1/1.32031 127 .quad 0x3fbf38c0c8325d86, 0x3fe82a4a0182a4a0 // log10(1.32422), 1/1.32422 128 .quad 0x3fbf8c9683468191, 0x3fe8181818181818 // log10(1.32812), 1/1.32812 129 .quad 0x3fbfe02d36a3956d, 0x3fe8060180601806 // log10(1.33203), 1/1.33203 130 .quad 0x3fc019c2a064b486, 0x3fe7f405fd017f40 // log10(1.33594), 1/1.33594 131 .quad 0x3fc0434f7fb1f307, 0x3fe7e225515a4f1d // log10(1.33984), 1/1.33984 132 .quad 0x3fc06cbd67a6c3b6, 0x3fe7d05f417d05f4 // log10(1.34375), 1/1.34375 133 .quad 0x3fc0960c8648e406, 0x3fe7beb3922e017c // log10(1.34766), 1/1.34766 134 .quad 0x3fc0bf3d0937c41c, 0x3fe7ad2208e0ecc3 // log10(1.35156), 1/1.35156 135 .quad 0x3fc0e84f1dadb526, 0x3fe79baa6bb6398b // log10(1.35547), 1/1.35547 136 .quad 0x3fc11142f0811357, 0x3fe78a4c8178a4c8 // log10(1.35938), 1/1.35938 137 .quad 0x3fc13a18ae256b99, 0x3fe77908119ac60d // log10(1.36328), 1/1.36328 138 .quad 0x3fc162d082ac9d10, 0x3fe767dce434a9b1 // log10(1.36719), 1/1.36719 139 .quad 0x3fc18b6a99c7f679, 0x3fe756cac201756d // log10(1.37109), 1/1.37109 140 .quad 0x3fc1b3e71ec94f7b, 0x3fe745d1745d1746 // log10(1.37500), 1/1.37500 141 .quad 0x3fc1dc463ca41df8, 0x3fe734f0c541fe8d // log10(1.37891), 1/1.37891 142 .quad 0x3fc204881dee8777, 0x3fe724287f46debc // log10(1.38281), 1/1.38281 143 .quad 0x3fc22cacece26ead, 0x3fe713786d9c7c09 // log10(1.38672), 1/1.38672 144 .quad 0x3fc254b4d35e7d3c, 0x3fe702e05c0b8170 // log10(1.39062), 1/1.39062 145 .quad 0x3fc27c9ffae729c1, 0x3fe6f26016f26017 // log10(1.39453), 1/1.39453 146 .quad 0x3fc2a46e8ca7ba2a, 0x3fe6e1f76b4337c7 // log10(1.39844), 1/1.39844 147 .quad 0x3fc2cc20b1734279, 0x3fe6d1a62681c861 // log10(1.40234), 1/1.40234 148 .quad 0x3fc2f3b691c5a001, 0x3fe6c16c16c16c17 // log10(1.40625), 1/1.40625 149 .quad 0x3fc31b3055c47118, 0x3fe6b1490aa31a3d // log10(1.41016), 1/1.41016 150 .quad 0x3fc3428e2540096d, 0x3fe6a13cd1537290 // log10(1.41406), 1/1.41406 151 .quad 0x3fc369d027b462f4, 0x3fe691473a88d0c0 // log10(1.41797), 1/1.41797 152 .quad 0x3fc390f6844a0b83, 0x3fe6816816816817 // log10(1.42188), 1/1.42188 153 .quad 0x3fc3b80161d70f33, 0x3fe6719f3601671a // log10(1.42578), 1/1.42578 154 .quad 0x3fc3def0e6dfdf85, 0x3fe661ec6a5122f9 // log10(1.42969), 1/1.42969 155 .quad 0x3fc405c539983762, 0x3fe6524f853b4aa3 // log10(1.43359), 1/1.43359 156 .quad 0x3fc42c7e7fe3fc02, 0x3fe642c8590b2164 // log10(1.43750), 1/1.43750 157 .quad 0x3fc4531cdf581ac6, 0x3fe63356b88ac0de // log10(1.44141), 1/1.44141 158 .quad 0x3fc479a07d3b6411, 0x3fe623fa77016240 // log10(1.44531), 1/1.44531 159 .quad 0x3fc4a0097e876329, 0x3fe614b36831ae94 // log10(1.44922), 1/1.44922 160 .quad 0x3fc4c65807e93338, 0x3fe6058160581606 // log10(1.45312), 1/1.45312 161 .quad 0x3fc4ec8c3dc25169, 0x3fe5f66434292dfc // log10(1.45703), 1/1.45703 162 .quad 0x3fc512a644296c3d, 0x3fe5e75bb8d015e7 // log10(1.46094), 1/1.46094 163 .quad 0x3fc538a63eeb3011, 0x3fe5d867c3ece2a5 // log10(1.46484), 1/1.46484 164 .quad 0x3fc55e8c518b10f8, 0x3fe5c9882b931057 // log10(1.46875), 1/1.46875 165 .quad 0x3fc584589f4411db, 0x3fe5babcc647fa91 // log10(1.47266), 1/1.47266 166 .quad 0x3fc5aa0b4b0988fa, 0x3fe5ac056b015ac0 // log10(1.47656), 1/1.47656 167 .quad 0x3fc5cfa47787e1d7, 0x3fe59d61f123ccaa // log10(1.48047), 1/1.48047 168 .quad 0x3fc5f52447255c92, 0x3fe58ed2308158ed // log10(1.48438), 1/1.48438 169 .quad 0x3fc61a8adc02cabd, 0x3fe5805601580560 // log10(1.48828), 1/1.48828 170 .quad 0x3fc63fd857fc49bb, 0x3fe571ed3c506b3a // log10(1.49219), 1/1.49219 171 .quad 0x3fc6650cdca9faad, 0x3fe56397ba7c52e2 // log10(1.49609), 1/1.49609 172 .quad 0x3fc68a288b60b7fc, 0x3fe5555555555555 // log10(1.50000), 1/1.50000 173 .quad 0x3fc6af2b8532c884, 0x3fe54725e6bb82fe // log10(1.50391), 1/1.50391 174 .quad 0x3fc6d415eaf0906b, 0x3fe5390948f40feb // log10(1.50781), 1/1.50781 175 .quad 0x3fc6f8e7dd293fb1, 0x3fe52aff56a8054b // log10(1.51172), 1/1.51172 176 .quad 0x3fc71da17c2b7e80, 0x3fe51d07eae2f815 // log10(1.51562), 1/1.51562 177 .quad 0x3fc74242e8061741, 0x3fe50f22e111c4c5 // log10(1.51953), 1/1.51953 178 .quad 0x3fc766cc40889e85, 0x3fe5015015015015 // log10(1.52344), 1/1.52344 179 .quad 0x3fc78b3da54418c4, 0x3fe4f38f62dd4c9b // log10(1.52734), 1/1.52734 180 .quad 0x3fc7af97358b9e04, 0x3fe4e5e0a72f0539 // log10(1.53125), 1/1.53125 181 .quad 0x3fc7d3d91074fb64, 0x3fe4d843bedc2c4c // log10(1.53516), 1/1.53516 182 .quad 0x3fc7f80354d952a0, 0x3fe4cab88725af6e // log10(1.53906), 1/1.53906 183 .quad 0x3fc81c162155b785, 0x3fe4bd3edda68fe1 // log10(1.54297), 1/1.54297 184 .quad 0x3fc84011944bcb75, 0x3fe4afd6a052bf5b // log10(1.54688), 1/1.54688 185 .quad 0x3fc863f5cbe256ed, 0x3fe4a27fad76014a // log10(1.55078), 1/1.55078 186 .quad 0x3fc887c2e605e119, 0x3fe49539e3b2d067 // log10(1.55469), 1/1.55469 187 .quad 0x3fc8ab790069458b, 0x3fe4880522014880 // log10(1.55859), 1/1.55859 188 .quad 0x3fc8cf183886480d, 0x3fe47ae147ae147b // log10(1.56250), 1/1.56250 189 .quad 0x3fc8f2a0ab9e2696, 0x3fe46dce34596066 // log10(1.56641), 1/1.56641 190 .quad 0x3fc9161276ba2978, 0x3fe460cbc7f5cf9a // log10(1.57031), 1/1.57031 191 .quad 0x3fc9396db6ac31bc, 0x3fe453d9e2c776ca // log10(1.57422), 1/1.57422 192 .quad 0x3fc95cb2880f45ba, 0x3fe446f86562d9fb // log10(1.57812), 1/1.57812 193 .quad 0x3fc97fe107481bfb, 0x3fe43a2730abee4d // log10(1.58203), 1/1.58203 194 .quad 0x3fc9a2f95085a45c, 0x3fe42d6625d51f87 // log10(1.58594), 1/1.58594 195 .quad 0x3fc9c5fb7fc18f86, 0x3fe420b5265e5951 // log10(1.58984), 1/1.58984 196 .quad 0x3fc9e8e7b0c0d4be, 0x3fe4141414141414 // log10(1.59375), 1/1.59375 197 .quad 0x3fca0bbdff14360e, 0x3fe40782d10e6566 // log10(1.59766), 1/1.59766 198 .quad 0x3fca2e7e8618c2d2, 0x3fe3fb013fb013fb // log10(1.60156), 1/1.60156 199 .quad 0x3fca512960f858ae, 0x3fe3ee8f42a5af07 // log10(1.60547), 1/1.60547 200 .quad 0x3fca73beaaaa22f4, 0x3fe3e22cbce4a902 // log10(1.60938), 1/1.60938 201 .quad 0x3fca963e7df3187c, 0x3fe3d5d991aa75c6 // log10(1.61328), 1/1.61328 202 .quad 0x3fcab8a8f56677fc, 0x3fe3c995a47babe7 // log10(1.61719), 1/1.61719 203 .quad 0x3fcadafe2b6642d9, 0x3fe3bd60d9232955 // log10(1.62109), 1/1.62109 204 .quad 0x3fcafd3e3a23b680, 0x3fe3b13b13b13b14 // log10(1.62500), 1/1.62500 205 .quad 0x3fcb1f693b9fc44f, 0x3fe3a524387ac822 // log10(1.62891), 1/1.62891 206 .quad 0x3fcb417f49ab8807, 0x3fe3991c2c187f63 // log10(1.63281), 1/1.63281 207 .quad 0x3fcb63807de8bcd7, 0x3fe38d22d366088e // log10(1.63672), 1/1.63672 208 .quad 0x3fcb856cf1ca3105, 0x3fe3813813813814 // log10(1.64062), 1/1.64062 209 .quad 0x3fcba744be943831, 0x3fe3755bd1c945ee // log10(1.64453), 1/1.64453 210 .quad 0x3fcbc907fd5d1c40, 0x3fe3698df3de0748 // log10(1.64844), 1/1.64844 211 .quad 0x3fcbeab6c70d8cf3, 0x3fe35dce5f9f2af8 // log10(1.65234), 1/1.65234 212 .quad 0x3fcc0c5134610e26, 0x3fe3521cfb2b78c1 // log10(1.65625), 1/1.65625 213 .quad 0x3fcc2dd75de664cf, 0x3fe34679ace01346 // log10(1.66016), 1/1.66016 214 .quad 0x3fcc4f495c0002a2, 0x3fe33ae45b57bcb2 // log10(1.66406), 1/1.66406 215 .quad 0x3fcc70a746e4708a, 0x3fe32f5ced6a1dfa // log10(1.66797), 1/1.66797 216 .quad 0x3fcc91f1369eb7ca, 0x3fe323e34a2b10bf // log10(1.67188), 1/1.67188 217 .quad 0x3fccb327430ec9f9, 0x3fe3187758e9ebb6 // log10(1.67578), 1/1.67578 218 .quad 0x3fccd44983e9e7bd, 0x3fe30d190130d190 // log10(1.67969), 1/1.67969 219 .quad 0x3fccf55810bb0654, 0x3fe301c82ac40260 // log10(1.68359), 1/1.68359 220 .quad 0x3fcd165300e333f7, 0x3fe2f684bda12f68 // log10(1.68750), 1/1.68750 221 .quad 0x3fcd373a6b99fb0d, 0x3fe2eb4ea1fed14b // log10(1.69141), 1/1.69141 222 .quad 0x3fcd580e67edc43d, 0x3fe2e025c04b8097 // log10(1.69531), 1/1.69531 223 .quad 0x3fcd78cf0cc4375d, 0x3fe2d50a012d50a0 // log10(1.69922), 1/1.69922 224 .quad 0x3fcd997c70da9b47, 0x3fe2c9fb4d812ca0 // log10(1.70312), 1/1.70312 225 .quad 0x3fcdba16aac6348e, 0x3fe2bef98e5a3711 // log10(1.70703), 1/1.70703 226 .quad 0x3fcdda9dd0f4a329, 0x3fe2b404ad012b40 // log10(1.71094), 1/1.71094 227 .quad 0x3fcdfb11f9ac3f03, 0x3fe2a91c92f3c105 // log10(1.71484), 1/1.71484 228 .quad 0x3fce1b733b0c7381, 0x3fe29e4129e4129e // log10(1.71875), 1/1.71875 229 .quad 0x3fce3bc1ab0e19fe, 0x3fe293725bb804a5 // log10(1.72266), 1/1.72266 230 .quad 0x3fce5bfd5f83d342, 0x3fe288b01288b013 // log10(1.72656), 1/1.72656 231 .quad 0x3fce7c266e1a5ff2, 0x3fe27dfa38a1ce4d // log10(1.73047), 1/1.73047 232 .quad 0x3fce9c3cec58f807, 0x3fe27350b8812735 // log10(1.73438), 1/1.73438 233 .quad 0x3fcebc40efa1a142, 0x3fe268b37cd60127 // log10(1.73828), 1/1.73828 234 .quad 0x3fcedc328d3184af, 0x3fe25e22708092f1 // log10(1.74219), 1/1.74219 235 .quad 0x3fcefc11da21432b, 0x3fe2539d7e9177b2 // log10(1.74609), 1/1.74609 236 .quad 0x3fcf1bdeeb654901, 0x3fe2492492492492 // log10(1.75000), 1/1.75000 237 .quad 0x3fcf3b99d5ce208f, 0x3fe23eb79717605b // log10(1.75391), 1/1.75391 238 .quad 0x3fcf5b42ae08c407, 0x3fe23456789abcdf // log10(1.75781), 1/1.75781 239 .quad 0x3fcf7ad9889eee47, 0x3fe22a0122a0122a // log10(1.76172), 1/1.76172 240 .quad 0x3fcf9a5e79f76ac5, 0x3fe21fb78121fb78 // log10(1.76562), 1/1.76562 241 .quad 0x3fcfb9d1965664a1, 0x3fe21579804855e6 // log10(1.76953), 1/1.76953 242 .quad 0x3fcfd932f1ddb4d6, 0x3fe20b470c67c0d9 // log10(1.77344), 1/1.77344 243 .quad 0x3fcff882a08d2f89, 0x3fe2012012012012 // log10(1.77734), 1/1.77734 244 .quad 0x3fd00be05b217844, 0x3fe1f7047dc11f70 // log10(1.78125), 1/1.78125 245 .quad 0x3fd01b76a35dd375, 0x3fe1ecf43c7fb84c // log10(1.78516), 1/1.78516 246 .quad 0x3fd02b0432c96ff0, 0x3fe1e2ef3b3fb874 // log10(1.78906), 1/1.78906 247 .quad 0x3fd03a891321a85c, 0x3fe1d8f5672e4abd // log10(1.79297), 1/1.79297 248 .quad 0x3fd04a054e139004, 0x3fe1cf06ada2811d // log10(1.79688), 1/1.79688 249 .quad 0x3fd05978ed3c170b, 0x3fe1c522fc1ce059 // log10(1.80078), 1/1.80078 250 .quad 0x3fd068e3fa282e3d, 0x3fe1bb4a4046ed29 // log10(1.80469), 1/1.80469 251 .quad 0x3fd078467e54ea75, 0x3fe1b17c67f2bae3 // log10(1.80859), 1/1.80859 252 .quad 0x3fd087a0832fa7ac, 0x3fe1a7b9611a7b96 // log10(1.81250), 1/1.81250 253 .quad 0x3fd096f212162b9f, 0x3fe19e0119e0119e // log10(1.81641), 1/1.81641 254 .quad 0x3fd0a63b3456c819, 0x3fe19453808ca29c // log10(1.82031), 1/1.82031 255 .quad 0x3fd0b57bf3307cde, 0x3fe18ab083902bdb // log10(1.82422), 1/1.82422 256 .quad 0x3fd0c4b457d3193d, 0x3fe1811811811812 // log10(1.82812), 1/1.82812 257 .quad 0x3fd0d3e46b5f5d3e, 0x3fe1778a191bd684 // log10(1.83203), 1/1.83203 258 .quad 0x3fd0e30c36e71a7f, 0x3fe16e0689427379 // log10(1.83594), 1/1.83594 259 .quad 0x3fd0f22bc36d54b0, 0x3fe1648d50fc3201 // log10(1.83984), 1/1.83984 260 .quad 0x3fd1014319e661bd, 0x3fe15b1e5f75270d // log10(1.84375), 1/1.84375 261 .quad 0x3fd1105243380999, 0x3fe151b9a3fdd5c9 // log10(1.84766), 1/1.84766 262 .quad 0x3fd11f594839a5bd, 0x3fe1485f0e0acd3b // log10(1.85156), 1/1.85156 263 .quad 0x3fd12e5831b4404c, 0x3fe13f0e8d344724 // log10(1.85547), 1/1.85547 264 .quad 0x3fd13d4f0862b2e1, 0x3fe135c81135c811 // log10(1.85938), 1/1.85938 265 .quad 0x3fd14c3dd4f1c510, 0x3fe12c8b89edc0ac // log10(1.86328), 1/1.86328 266 .quad 0x3fd15b24a0004a92, 0x3fe12358e75d3033 // log10(1.86719), 1/1.86719 267 .quad 0x3fd16a03721f4120, 0x3fe11a3019a74826 // log10(1.87109), 1/1.87109 268 .quad 0x3fd178da53d1ee01, 0x3fe1111111111111 // log10(1.87500), 1/1.87500 269 .quad 0x3fd187a94d8dfb46, 0x3fe107fbbe011080 // log10(1.87891), 1/1.87891 270 .quad 0x3fd1967067bb94b8, 0x3fe0fef010fef011 // log10(1.88281), 1/1.88281 271 .quad 0x3fd1a52faab58480, 0x3fe0f5edfab325a2 // log10(1.88672), 1/1.88672 272 .quad 0x3fd1b3e71ec94f7b, 0x3fe0ecf56be69c90 // log10(1.89062), 1/1.89062 273 .quad 0x3fd1c296cc375143, 0x3fe0e40655826011 // log10(1.89453), 1/1.89453 274 .quad 0x3fd1d13ebb32d7f9, 0x3fe0db20a88f4696 // log10(1.89844), 1/1.89844 275 .quad 0x3fd1dfdef3e23fb6, 0x3fe0d24456359e3a // log10(1.90234), 1/1.90234 276 .quad 0x3fd1ee777e5f0dc3, 0x3fe0c9714fbcda3b // log10(1.90625), 1/1.90625 277 .quad 0x3fd1fd0862b60b80, 0x3fe0c0a7868b4171 // log10(1.91016), 1/1.91016 278 .quad 0x3fd20b91a8e76105, 0x3fe0b7e6ec259dc8 // log10(1.91406), 1/1.91406 279 .quad 0x3fd21a1358e6af85, 0x3fe0af2f722eecb5 // log10(1.91797), 1/1.91797 280 .quad 0x3fd2288d7a9b2b64, 0x3fe0a6810a6810a7 // log10(1.92188), 1/1.92188 281 .quad 0x3fd2370015dfb60d, 0x3fe09ddba6af8360 // log10(1.92578), 1/1.92578 282 .quad 0x3fd2456b3282f786, 0x3fe0953f39010954 // log10(1.92969), 1/1.92969 283 .quad 0x3fd253ced84777be, 0x3fe08cabb37565e2 // log10(1.93359), 1/1.93359 284 .quad 0x3fd2622b0ee3b79d, 0x3fe0842108421084 // log10(1.93750), 1/1.93750 285 .quad 0x3fd2707fde0249d4, 0x3fe07b9f29b8eae2 // log10(1.94141), 1/1.94141 286 .quad 0x3fd27ecd4d41eb67, 0x3fe073260a47f7c6 // log10(1.94531), 1/1.94531 287 .quad 0x3fd28d1364359c03, 0x3fe06ab59c7912fb // log10(1.94922), 1/1.94922 288 .quad 0x3fd29b522a64b609, 0x3fe0624dd2f1a9fc // log10(1.95312), 1/1.95312 289 .quad 0x3fd2a989a74b0665, 0x3fe059eea0727586 // log10(1.95703), 1/1.95703 290 .quad 0x3fd2b7b9e258e422, 0x3fe05197f7d73404 // log10(1.96094), 1/1.96094 291 .quad 0x3fd2c5e2e2f347ca, 0x3fe04949cc1664c5 // log10(1.96484), 1/1.96484 292 .quad 0x3fd2d404b073e27e, 0x3fe0410410410410 // log10(1.96875), 1/1.96875 293 .quad 0x3fd2e21f522934e0, 0x3fe038c6b78247fc // log10(1.97266), 1/1.97266 294 .quad 0x3fd2f032cf56a5be, 0x3fe03091b51f5e1a // log10(1.97656), 1/1.97656 295 .quad 0x3fd2fe3f2f34987f, 0x3fe02864fc7729e9 // log10(1.98047), 1/1.98047 296 .quad 0x3fd30c4478f0835f, 0x3fe0204081020408 // log10(1.98438), 1/1.98438 297 .quad 0x3fd31a42b3ad0570, 0x3fe0182436517a37 // log10(1.98828), 1/1.98828 298 .quad 0x3fd32839e681fc62, 0x3fe0101010101010 // log10(1.99219), 1/1.99219 299 .quad 0x3fd3362a187c9a17, 0x3fe0080402010080 // log10(1.99609), 1/1.99609 300 301 302.literal8 303.align 3 304one: .double 1.0 305onehalf: .double 0.5 306onethird: .quad 0x3fd5555555555555 // 1/3 307onequarter: .double 0.25 308onefifth: .double 0.2 309recip_log10: .quad 0x3fdbcb7b1526e50d // 1.0 / ln(10) 310log10_of_2: .quad 0x3fd34413509f79ff // log10(2) 311 312.text 313 314#if defined( __x86_64__ ) 315 #define RELATIVE_ADDR( _a) (_a)( %rip ) 316 #define RELATIVE_ADDR_B( _a) (_a)( %rip ) 317 #define RELATIVE_ADDR2( _a, _i, _step) ( %r8, _i, _step ) 318#elif defined( __i386__ ) 319 #define RELATIVE_ADDR( _a) (_a)-rel_addr( CX_P ) 320 #define RELATIVE_ADDR_B( _a) (_a)-rel_addr_b( CX_P ) 321 #define RELATIVE_ADDR2( _a, _i, _step) (_a)-rel_addr( CX_P, _i, _step ) 322 323//a short routine to get the local address 324.align 4 325log10f_pic: movl (%esp), %ecx //copy address of local_addr to %ecx 326 ret 327#else 328 #error arch not supported 329#endif 330 331// 332// log10f -- overall approach 333// 334// We break up log10f(x) as follows: 335// 336// x = 2**i * m 1.0 <= m < 2.0 337// log10(x) = log10(2**i) + log10(m) 338// 339// log10(2**i) is simply read from log10_e_table. 340// To obtain log10(m), we further break down m as : 341// 342// m = (1+a/256.0)(1+r) a = high 8 explicit bits of mantissa(m) 343// log10(m) = log10(1+a/256.0) + log10(1+r) 344// 345// We use the high 8 bits of the mantissa to look up log10(1+a/256.0) in log_m_table above 346// We calculate 1+r as: 347// 348// 1+r = m * (1 /(1+a/256.0)) 349// 350// We can lookup (from the same table) the value of 1/(1+a/256.0) based on a too. 351// 352// So the whole calculation is: 353// 354// log10f(x) = log10(2**i) + log10(1+a/256.0) + log10(1+r) = log10_e_table[i+149] + log10_m_table[a][0] + log10( m * log_m_table[a][1] ) 355// 356// The third term is calculated using the Taylor series: 357// 358// log10(x+1) = (x - x**2/2 + x**3/3 - x**4/4 + x**5/5) / ln(10) 359// 360// 361 362ENTRY( log10f ) 363// Load input value 364#if defined( __i386__ ) 365 movl FRAME_SIZE( STACKP ), %eax 366 movss FRAME_SIZE( STACKP ), %xmm0 367#else 368 movd %xmm0, %eax 369#endif 370 371 movl %eax, %ecx //set aside x 372 addl $0x00800000, %eax // push Infs, NaNs negative 373 xorps %xmm1, %xmm1 // 0.0f 374 cmpl $0x00800000, %eax // if( x <= 0 or Inf or NaN ) 375 jle 2f 376 377 movl $(-127), %edx // negative single precision bias 378 cmpl $0x00800000, %ecx // if( isnormal( x )) 379 jae 1f // skip denormal handling 380 381 //denormal whatnot 382 subl $126, %edx // accumulate in -126 as pseudo exponent of denormal 383 movl $0x3f800000, %eax // 1.0 384 orl %eax, %ecx // multiply low bits by 2**126 by oring in 1.0 385 movd %eax, %xmm1 // 1.0 386 movd %ecx, %xmm0 // 1.0 | denorm bits 387 subss %xmm1, %xmm0 // (1.0 | denorm bits) - 1.0 388 movd %xmm0, %ecx 389 390 //find log10_e_table[i] and load into %xmm0 3911: shrl $23, %ecx 392 addl %ecx, %edx 393 394#if defined( __i386__ ) 395 calll log10f_pic // set %ecx to point to local_addr 396rel_addr: 397#endif 398 399 //find a, and load values from log10_m_table 400 movd %xmm0, %eax // x 401 cvtsi2sd %edx, %xmm7 // exponent of x 402 movl %eax, %edx // x 403 andl $0x00007fff, %eax // low bits of x 404 andl $0x007f8000, %edx // a << 15 405 mulsd RELATIVE_ADDR( log10_of_2 ), %xmm7 // log10( 2**exponent of x ) 406 orl $0x3f800000, %eax // 1.0 | low bits of x 407 shrl $11, %edx // a << 4 408 movd %eax, %xmm1 // 1.0 | low bits of x 409 cvtss2sd %xmm1, %xmm1 // 1.0 | low bits of x 410 subsd RELATIVE_ADDR( one ), %xmm1 // (1.0 | low bits of x) - 1.0 411 lea RELATIVE_ADDR( log10_m_table), AX_P 412 mulsd 8( AX_P, DX_P, 1 ), %xmm1 // r = ((1.0 | low bits of x) - 1.0) / (1+a/256) 413 movapd %xmm1, %xmm2 // r 414 mulsd %xmm2, %xmm2 // rr 415 movsd ( AX_P, DX_P, 1 ), %xmm6 // log(1+a/256.0) 416 417 //Taylor series approximation: log(1+r) = r - rr/2 + rrr/3 - rrrr/4 + rrrrr/5 418 movsd RELATIVE_ADDR( onefifth ), %xmm3 // 0.2 419 movsd RELATIVE_ADDR( onequarter ), %xmm4 // 0.25 420 mulsd %xmm2, %xmm3 // 0.2rr 421 mulsd %xmm2, %xmm4 // 0.25rr 422 addsd RELATIVE_ADDR( onethird), %xmm3 // (1./3.) + 0.2rr 423 addsd RELATIVE_ADDR( onehalf), %xmm4 // 0.5 + 0.25rr 424 mulsd %xmm2, %xmm3 // (1./3.)rr + 0.2rrrr 425 mulsd %xmm2, %xmm4 // 0.5rr + 0.25rrrr 426 mulsd %xmm1, %xmm3 // (1./3.)rrr + 0.2rrrrr 427 subsd %xmm4, %xmm1 // r - 0.5rr - 0.25rrrr 428 addsd %xmm3, %xmm1 // r - 0.5rr + (1./3.)rrr - 0.25rrrr + 0.2rrrrr 429 mulsd RELATIVE_ADDR(recip_log10), %xmm1 // (r - 0.5rr + (1./3.)rrr - 0.25rrrr + 0.2rrrrr)/ln(10) 430 431 //add up major terms 432 addsd %xmm6, %xmm1 // log(1+a/256.0) + (r - 0.5rr + (1./3.)rrr - 0.25rrrr + 0.2rrrrr)/ln(10) 433 addsd %xmm7, %xmm1 // log_e_table[i] + log(1+a/256.0) + (r - 0.5rr + (1./3.)rrr - 0.25rrrr + 0.2rrrrr) 434 435 //round to float 436 xorps %xmm0, %xmm0 437 cvtsd2ss %xmm1, %xmm0 // result 438 439#if defined( __i386__ ) 440 movss %xmm0, FRAME_SIZE(STACKP) 441 flds FRAME_SIZE(STACKP) 442#endif 443 ret 444 4452: //special case code for negative, NaN or 0 446#if defined( __i386__ ) 447 movss FRAME_SIZE( STACKP ), %xmm0 448#endif 449 ucomiss %xmm1, %xmm0 //test for x == 0 450 jb 4f //NaN or negative 451 452 //We imagine that 0.0, Inf are the most common cases, so those falls through 453 ja 3f //Infinity, just return inf 454 455 //We need to return -Inf for zero and set div/0 flag 456 pcmpeqb %xmm0, %xmm0 // -1U 457 cvtdq2ps %xmm0, %xmm0 // -1.0f 458 divss %xmm1, %xmm0 // -1.0f / 0 = -Inf + div/0 flag 459#if defined( __i386__ ) 460 movss %xmm0, FRAME_SIZE(STACKP) 461#endif 4623: 463#if defined( __i386__ ) 464 flds FRAME_SIZE(STACKP) 465#endif 466 ret 467 4684: jp 5f // handle NaN elsewhere 469 470 //negative number, return NaN and set invalid 471 pcmpeqb %xmm0, %xmm0 // -1U 472 pslld $23, %xmm0 // 0xff800000, -inf 473 mulss %xmm1, %xmm0 // 0 * -inf = NaN, set invalid 474#if defined( __i386__ ) 475 movss %xmm0, FRAME_SIZE(STACKP) 476 flds FRAME_SIZE(STACKP) 477#endif 478 ret 479 480 //Its a NaN 4815: 482#if defined( __i386__ ) 483 flds FRAME_SIZE(STACKP ) //load the NaN 484 fadd %st(0), %st(0) //quiet it 485#else 486 addss %xmm0, %xmm0 487#endif 488 ret 489