1 /* 2 * Copyright (c) 2016, Intel Corporation. 3 * Intel Math Library (LIBM) Source Code 4 * 5 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 6 * 7 * This code is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 only, as 9 * published by the Free Software Foundation. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 * 25 */ 26 27 #include "precompiled.hpp" 28 #include "asm/assembler.hpp" 29 #include "asm/assembler.inline.hpp" 30 #include "runtime/stubRoutines.hpp" 31 #include "stubRoutines_x86.hpp" 32 #include "macroAssembler_x86.hpp" 33 34 #ifdef _MSC_VER 35 #define ALIGNED_(x) __declspec(align(x)) 36 #else 37 #define ALIGNED_(x) __attribute__ ((aligned(x))) 38 #endif 39 40 /******************************************************************************/ 41 // ALGORITHM DESCRIPTION - SIN() 42 // --------------------- 43 // 44 // 1. RANGE REDUCTION 45 // 46 // We perform an initial range reduction from X to r with 47 // 48 // X =~= N * pi/32 + r 49 // 50 // so that |r| <= pi/64 + epsilon. We restrict inputs to those 51 // where |N| <= 932560. Beyond this, the range reduction is 52 // insufficiently accurate. For extremely small inputs, 53 // denormalization can occur internally, impacting performance. 54 // This means that the main path is actually only taken for 55 // 2^-252 <= |X| < 90112. 56 // 57 // To avoid branches, we perform the range reduction to full 58 // accuracy each time. 59 // 60 // X - N * (P_1 + P_2 + P_3) 61 // 62 // where P_1 and P_2 are 32-bit numbers (so multiplication by N 63 // is exact) and P_3 is a 53-bit number. Together, these 64 // approximate pi well enough for all cases in the restricted 65 // range. 66 // 67 // The main reduction sequence is: 68 // 69 // y = 32/pi * x 70 // N = integer(y) 71 // (computed by adding and subtracting off SHIFTER) 72 // 73 // m_1 = N * P_1 74 // m_2 = N * P_2 75 // r_1 = x - m_1 76 // r = r_1 - m_2 77 // (this r can be used for most of the calculation) 78 // 79 // c_1 = r_1 - r 80 // m_3 = N * P_3 81 // c_2 = c_1 - m_2 82 // c = c_2 - m_3 83 // 84 // 2. MAIN ALGORITHM 85 // 86 // The algorithm uses a table lookup based on B = M * pi / 32 87 // where M = N mod 64. The stored values are: 88 // sigma closest power of 2 to cos(B) 89 // C_hl 53-bit cos(B) - sigma 90 // S_hi + S_lo 2 * 53-bit sin(B) 91 // 92 // The computation is organized as follows: 93 // 94 // sin(B + r + c) = [sin(B) + sigma * r] + 95 // r * (cos(B) - sigma) + 96 // sin(B) * [cos(r + c) - 1] + 97 // cos(B) * [sin(r + c) - r] 98 // 99 // which is approximately: 100 // 101 // [S_hi + sigma * r] + 102 // C_hl * r + 103 // S_lo + S_hi * [(cos(r) - 1) - r * c] + 104 // (C_hl + sigma) * [(sin(r) - r) + c] 105 // 106 // and this is what is actually computed. We separate this sum 107 // into four parts: 108 // 109 // hi + med + pols + corr 110 // 111 // where 112 // 113 // hi = S_hi + sigma r 114 // med = C_hl * r 115 // pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r) 116 // corr = S_lo + c * ((C_hl + sigma) - S_hi * r) 117 // 118 // 3. POLYNOMIAL 119 // 120 // The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) * 121 // (sin(r) - r) can be rearranged freely, since it is quite 122 // small, so we exploit parallelism to the fullest. 123 // 124 // psc4 = SC_4 * r_1 125 // msc4 = psc4 * r 126 // r2 = r * r 127 // msc2 = SC_2 * r2 128 // r4 = r2 * r2 129 // psc3 = SC_3 + msc4 130 // psc1 = SC_1 + msc2 131 // msc3 = r4 * psc3 132 // sincospols = psc1 + msc3 133 // pols = sincospols * 134 // <S_hi * r^2 | (C_hl + sigma) * r^3> 135 // 136 // 4. CORRECTION TERM 137 // 138 // This is where the "c" component of the range reduction is 139 // taken into account; recall that just "r" is used for most of 140 // the calculation. 141 // 142 // -c = m_3 - c_2 143 // -d = S_hi * r - (C_hl + sigma) 144 // corr = -c * -d + S_lo 145 // 146 // 5. COMPENSATED SUMMATIONS 147 // 148 // The two successive compensated summations add up the high 149 // and medium parts, leaving just the low parts to add up at 150 // the end. 151 // 152 // rs = sigma * r 153 // res_int = S_hi + rs 154 // k_0 = S_hi - res_int 155 // k_2 = k_0 + rs 156 // med = C_hl * r 157 // res_hi = res_int + med 158 // k_1 = res_int - res_hi 159 // k_3 = k_1 + med 160 // 161 // 6. FINAL SUMMATION 162 // 163 // We now add up all the small parts: 164 // 165 // res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3 166 // 167 // Now the overall result is just: 168 // 169 // res_hi + res_lo 170 // 171 // 7. SMALL ARGUMENTS 172 // 173 // If |x| < SNN (SNN meaning the smallest normal number), we 174 // simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we 175 // do 2^-55 * (2^55 * x - x). 176 // 177 // Special cases: 178 // sin(NaN) = quiet NaN, and raise invalid exception 179 // sin(INF) = NaN and raise invalid exception 180 // sin(+/-0) = +/-0 181 // 182 /******************************************************************************/ 183 184 #ifdef _LP64 185 // The 64 bit code is at most SSE2 compliant 186 ALIGNED_(16) juint StubRoutines::x86::_ONEHALF[] = 187 { 188 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL 189 }; 190 191 ALIGNED_(16) juint StubRoutines::x86::_P_2[] = 192 { 193 0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL 194 }; 195 196 ALIGNED_(16) juint StubRoutines::x86::_SC_4[] = 197 { 198 0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL 199 }; 200 201 ALIGNED_(16) juint StubRoutines::x86::_Ctable[] = 202 { 203 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 204 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL, 205 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL, 206 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 207 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 208 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 209 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 210 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL, 211 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL, 212 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL, 213 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL, 214 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 215 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL, 216 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 217 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 218 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL, 219 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL, 220 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL, 221 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL, 222 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 223 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL, 224 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 225 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 226 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL, 227 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL, 228 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL, 229 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 230 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 231 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL, 232 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 233 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 234 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL, 235 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL, 236 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL, 237 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL, 238 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 239 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 240 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 241 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 242 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL, 243 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL, 244 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL, 245 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL, 246 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 247 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 248 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 249 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 250 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL, 251 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL, 252 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL, 253 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL, 254 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 255 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 256 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL, 257 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 258 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL, 259 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 260 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL, 261 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL, 262 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL, 263 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 264 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL, 265 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 266 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL, 267 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 268 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL, 269 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL, 270 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL, 271 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 272 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL, 273 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 274 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL, 275 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 276 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL, 277 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL, 278 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL, 279 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL, 280 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL, 281 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 282 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL, 283 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 284 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL, 285 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL, 286 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL, 287 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 288 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL, 289 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 290 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL, 291 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 292 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL, 293 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL, 294 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL, 295 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 296 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL, 297 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 298 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL, 299 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 300 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL, 301 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL, 302 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL, 303 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 304 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL, 305 0x00000000UL, 0x3ff00000UL 306 }; 307 308 ALIGNED_(16) juint StubRoutines::x86::_SC_2[] = 309 { 310 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL 311 }; 312 313 ALIGNED_(16) juint StubRoutines::x86::_SC_3[] = 314 { 315 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL 316 }; 317 318 ALIGNED_(16) juint StubRoutines::x86::_SC_1[] = 319 { 320 0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL 321 }; 322 323 ALIGNED_(16) juint StubRoutines::x86::_PI_INV_TABLE[] = 324 { 325 0x00000000UL, 0x00000000UL, 0xa2f9836eUL, 0x4e441529UL, 0xfc2757d1UL, 326 0xf534ddc0UL, 0xdb629599UL, 0x3c439041UL, 0xfe5163abUL, 0xdebbc561UL, 327 0xb7246e3aUL, 0x424dd2e0UL, 0x06492eeaUL, 0x09d1921cUL, 0xfe1deb1cUL, 328 0xb129a73eUL, 0xe88235f5UL, 0x2ebb4484UL, 0xe99c7026UL, 0xb45f7e41UL, 329 0x3991d639UL, 0x835339f4UL, 0x9c845f8bUL, 0xbdf9283bUL, 0x1ff897ffUL, 330 0xde05980fUL, 0xef2f118bUL, 0x5a0a6d1fUL, 0x6d367ecfUL, 0x27cb09b7UL, 331 0x4f463f66UL, 0x9e5fea2dUL, 0x7527bac7UL, 0xebe5f17bUL, 0x3d0739f7UL, 332 0x8a5292eaUL, 0x6bfb5fb1UL, 0x1f8d5d08UL, 0x56033046UL, 0xfc7b6babUL, 333 0xf0cfbc21UL 334 }; 335 336 ALIGNED_(8) juint StubRoutines::x86::_PI_4[] = 337 { 338 0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL 339 }; 340 341 ALIGNED_(8) juint StubRoutines::x86::_PI32INV[] = 342 { 343 0x6dc9c883UL, 0x40245f30UL 344 }; 345 346 ALIGNED_(8) juint _SHIFTER[] = 347 { 348 0x00000000UL, 0x43380000UL 349 }; 350 351 ALIGNED_(8) juint StubRoutines::x86::_SIGN_MASK[] = 352 { 353 0x00000000UL, 0x80000000UL 354 }; 355 356 ALIGNED_(8) juint StubRoutines::x86::_P_3[] = 357 { 358 0x2e037073UL, 0x3b63198aUL 359 }; 360 361 ALIGNED_(8) juint _ALL_ONES[] = 362 { 363 0xffffffffUL, 0x3fefffffUL 364 }; 365 366 ALIGNED_(8) juint _TWO_POW_55[] = 367 { 368 0x00000000UL, 0x43600000UL 369 }; 370 371 ALIGNED_(8) juint _TWO_POW_M55[] = 372 { 373 0x00000000UL, 0x3c800000UL 374 }; 375 376 ALIGNED_(8) juint StubRoutines::x86::_P_1[] = 377 { 378 0x54400000UL, 0x3fb921fbUL 379 }; 380 381 ALIGNED_(8) juint StubRoutines::x86::_NEG_ZERO[] = 382 { 383 0x00000000UL, 0x80000000UL 384 }; 385 386 void MacroAssembler::fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ebx, Register ecx, Register edx, Register tmp1, Register tmp2, Register tmp3, Register tmp4) { 387 Label L_2TAG_PACKET_0_0_1, L_2TAG_PACKET_1_0_1, L_2TAG_PACKET_2_0_1, L_2TAG_PACKET_3_0_1; 388 Label L_2TAG_PACKET_4_0_1, L_2TAG_PACKET_5_0_1, L_2TAG_PACKET_6_0_1, L_2TAG_PACKET_7_0_1; 389 Label L_2TAG_PACKET_8_0_1, L_2TAG_PACKET_9_0_1, L_2TAG_PACKET_10_0_1, L_2TAG_PACKET_11_0_1; 390 Label L_2TAG_PACKET_13_0_1, L_2TAG_PACKET_14_0_1; 391 Label L_2TAG_PACKET_12_0_1, B1_1, B1_2, B1_4, start; 392 393 assert_different_registers(tmp1, tmp2, tmp3, tmp4, eax, ebx, ecx, edx); 394 address ONEHALF = StubRoutines::x86::_ONEHALF_addr(); 395 address P_2 = StubRoutines::x86::_P_2_addr(); 396 address SC_4 = StubRoutines::x86::_SC_4_addr(); 397 address Ctable = StubRoutines::x86::_Ctable_addr(); 398 address SC_2 = StubRoutines::x86::_SC_2_addr(); 399 address SC_3 = StubRoutines::x86::_SC_3_addr(); 400 address SC_1 = StubRoutines::x86::_SC_1_addr(); 401 address PI_INV_TABLE = StubRoutines::x86::_PI_INV_TABLE_addr(); 402 address PI_4 = (address)StubRoutines::x86::_PI_4_addr(); 403 address PI32INV = (address)StubRoutines::x86::_PI32INV_addr(); 404 address SHIFTER = (address)_SHIFTER; 405 address SIGN_MASK = (address)StubRoutines::x86::_SIGN_MASK_addr(); 406 address P_3 = (address)StubRoutines::x86::_P_3_addr(); 407 address ALL_ONES = (address)_ALL_ONES; 408 address TWO_POW_55 = (address)_TWO_POW_55; 409 address TWO_POW_M55 = (address)_TWO_POW_M55; 410 address P_1 = (address)StubRoutines::x86::_P_1_addr(); 411 address NEG_ZERO = (address)StubRoutines::x86::_NEG_ZERO_addr(); 412 413 bind(start); 414 push(rbx); 415 subq(rsp, 16); 416 movsd(Address(rsp, 8), xmm0); 417 movl(eax, Address(rsp, 12)); 418 movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL 419 movq(xmm2, ExternalAddress(SHIFTER)); //0x00000000UL, 0x43380000UL 420 andl(eax, 2147418112); 421 subl(eax, 808452096); 422 cmpl(eax, 281346048); 423 jcc(Assembler::above, L_2TAG_PACKET_0_0_1); 424 mulsd(xmm1, xmm0); 425 movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL 426 movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL 427 pand(xmm4, xmm0); 428 por(xmm5, xmm4); 429 addpd(xmm1, xmm5); 430 cvttsd2sil(edx, xmm1); 431 cvtsi2sdl(xmm1, edx); 432 movdqu(xmm6, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL 433 mov64(r8, 0x3fb921fb54400000); 434 movdq(xmm3, r8); 435 movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL 436 pshufd(xmm4, xmm0, 68); 437 mulsd(xmm3, xmm1); 438 if (VM_Version::supports_sse3()) { 439 movddup(xmm1, xmm1); 440 } 441 else { 442 movlhps(xmm1, xmm1); 443 } 444 andl(edx, 63); 445 shll(edx, 5); 446 lea(rax, ExternalAddress(Ctable)); 447 addq(rax, rdx); 448 mulpd(xmm6, xmm1); 449 mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL 450 subsd(xmm4, xmm3); 451 movq(xmm7, Address(rax, 8)); 452 subsd(xmm0, xmm3); 453 if (VM_Version::supports_sse3()) { 454 movddup(xmm3, xmm4); 455 } 456 else { 457 movdqu(xmm3, xmm4); 458 movlhps(xmm3, xmm3); 459 } 460 subsd(xmm4, xmm6); 461 pshufd(xmm0, xmm0, 68); 462 movdqu(xmm2, Address(rax, 0)); 463 mulpd(xmm5, xmm0); 464 subpd(xmm0, xmm6); 465 mulsd(xmm7, xmm4); 466 subsd(xmm3, xmm4); 467 mulpd(xmm5, xmm0); 468 mulpd(xmm0, xmm0); 469 subsd(xmm3, xmm6); 470 movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL 471 subsd(xmm1, xmm3); 472 movq(xmm3, Address(rax, 24)); 473 addsd(xmm2, xmm3); 474 subsd(xmm7, xmm2); 475 mulsd(xmm2, xmm4); 476 mulpd(xmm6, xmm0); 477 mulsd(xmm3, xmm4); 478 mulpd(xmm2, xmm0); 479 mulpd(xmm0, xmm0); 480 addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL 481 mulsd(xmm4, Address(rax, 0)); 482 addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL 483 mulpd(xmm5, xmm0); 484 movdqu(xmm0, xmm3); 485 addsd(xmm3, Address(rax, 8)); 486 mulpd(xmm1, xmm7); 487 movdqu(xmm7, xmm4); 488 addsd(xmm4, xmm3); 489 addpd(xmm6, xmm5); 490 movq(xmm5, Address(rax, 8)); 491 subsd(xmm5, xmm3); 492 subsd(xmm3, xmm4); 493 addsd(xmm1, Address(rax, 16)); 494 mulpd(xmm6, xmm2); 495 addsd(xmm5, xmm0); 496 addsd(xmm3, xmm7); 497 addsd(xmm1, xmm5); 498 addsd(xmm1, xmm3); 499 addsd(xmm1, xmm6); 500 unpckhpd(xmm6, xmm6); 501 movdqu(xmm0, xmm4); 502 addsd(xmm1, xmm6); 503 addsd(xmm0, xmm1); 504 jmp(B1_4); 505 506 bind(L_2TAG_PACKET_0_0_1); 507 jcc(Assembler::greater, L_2TAG_PACKET_1_0_1); 508 shrl(eax, 20); 509 cmpl(eax, 3325); 510 jcc(Assembler::notEqual, L_2TAG_PACKET_2_0_1); 511 mulsd(xmm0, ExternalAddress(ALL_ONES)); //0xffffffffUL, 0x3fefffffUL 512 jmp(B1_4); 513 514 bind(L_2TAG_PACKET_2_0_1); 515 movq(xmm3, ExternalAddress(TWO_POW_55)); //0x00000000UL, 0x43600000UL 516 mulsd(xmm3, xmm0); 517 subsd(xmm3, xmm0); 518 mulsd(xmm3, ExternalAddress(TWO_POW_M55)); //0x00000000UL, 0x3c800000UL 519 jmp(B1_4); 520 521 bind(L_2TAG_PACKET_1_0_1); 522 pextrw(eax, xmm0, 3); 523 andl(eax, 32752); 524 cmpl(eax, 32752); 525 jcc(Assembler::equal, L_2TAG_PACKET_3_0_1); 526 pextrw(ecx, xmm0, 3); 527 andl(ecx, 32752); 528 subl(ecx, 16224); 529 shrl(ecx, 7); 530 andl(ecx, 65532); 531 lea(r11, ExternalAddress(PI_INV_TABLE)); 532 addq(rcx, r11); 533 movdq(rax, xmm0); 534 movl(r10, Address(rcx, 20)); 535 movl(r8, Address(rcx, 24)); 536 movl(edx, eax); 537 shrq(rax, 21); 538 orl(eax, INT_MIN); 539 shrl(eax, 11); 540 movl(r9, r10); 541 imulq(r10, rdx); 542 imulq(r9, rax); 543 imulq(r8, rax); 544 movl(rsi, Address(rcx, 16)); 545 movl(rdi, Address(rcx, 12)); 546 movl(r11, r10); 547 shrq(r10, 32); 548 addq(r9, r10); 549 addq(r11, r8); 550 movl(r8, r11); 551 shrq(r11, 32); 552 addq(r9, r11); 553 movl(r10, rsi); 554 imulq(rsi, rdx); 555 imulq(r10, rax); 556 movl(r11, rdi); 557 imulq(rdi, rdx); 558 movl(ebx, rsi); 559 shrq(rsi, 32); 560 addq(r9, rbx); 561 movl(ebx, r9); 562 shrq(r9, 32); 563 addq(r10, rsi); 564 addq(r10, r9); 565 shlq(rbx, 32); 566 orq(r8, rbx); 567 imulq(r11, rax); 568 movl(r9, Address(rcx, 8)); 569 movl(rsi, Address(rcx, 4)); 570 movl(ebx, rdi); 571 shrq(rdi, 32); 572 addq(r10, rbx); 573 movl(ebx, r10); 574 shrq(r10, 32); 575 addq(r11, rdi); 576 addq(r11, r10); 577 movq(rdi, r9); 578 imulq(r9, rdx); 579 imulq(rdi, rax); 580 movl(r10, r9); 581 shrq(r9, 32); 582 addq(r11, r10); 583 movl(r10, r11); 584 shrq(r11, 32); 585 addq(rdi, r9); 586 addq(rdi, r11); 587 movq(r9, rsi); 588 imulq(rsi, rdx); 589 imulq(r9, rax); 590 shlq(r10, 32); 591 orq(r10, rbx); 592 movl(eax, Address(rcx, 0)); 593 movl(r11, rsi); 594 shrq(rsi, 32); 595 addq(rdi, r11); 596 movl(r11, rdi); 597 shrq(rdi, 32); 598 addq(r9, rsi); 599 addq(r9, rdi); 600 imulq(rdx, rax); 601 pextrw(ebx, xmm0, 3); 602 lea(rdi, ExternalAddress(PI_INV_TABLE)); 603 subq(rcx, rdi); 604 addl(ecx, ecx); 605 addl(ecx, ecx); 606 addl(ecx, ecx); 607 addl(ecx, 19); 608 movl(rsi, 32768); 609 andl(rsi, ebx); 610 shrl(ebx, 4); 611 andl(ebx, 2047); 612 subl(ebx, 1023); 613 subl(ecx, ebx); 614 addq(r9, rdx); 615 movl(edx, ecx); 616 addl(edx, 32); 617 cmpl(ecx, 1); 618 jcc(Assembler::less, L_2TAG_PACKET_4_0_1); 619 negl(ecx); 620 addl(ecx, 29); 621 shll(r9); 622 movl(rdi, r9); 623 andl(r9, 536870911); 624 testl(r9, 268435456); 625 jcc(Assembler::notEqual, L_2TAG_PACKET_5_0_1); 626 shrl(r9); 627 movl(ebx, 0); 628 shlq(r9, 32); 629 orq(r9, r11); 630 631 bind(L_2TAG_PACKET_6_0_1); 632 633 bind(L_2TAG_PACKET_7_0_1); 634 635 cmpq(r9, 0); 636 jcc(Assembler::equal, L_2TAG_PACKET_8_0_1); 637 638 bind(L_2TAG_PACKET_9_0_1); 639 bsrq(r11, r9); 640 movl(ecx, 29); 641 subl(ecx, r11); 642 jcc(Assembler::lessEqual, L_2TAG_PACKET_10_0_1); 643 shlq(r9); 644 movq(rax, r10); 645 shlq(r10); 646 addl(edx, ecx); 647 negl(ecx); 648 addl(ecx, 64); 649 shrq(rax); 650 shrq(r8); 651 orq(r9, rax); 652 orq(r10, r8); 653 654 bind(L_2TAG_PACKET_11_0_1); 655 cvtsi2sdq(xmm0, r9); 656 shrq(r10, 1); 657 cvtsi2sdq(xmm3, r10); 658 xorpd(xmm4, xmm4); 659 shll(edx, 4); 660 negl(edx); 661 addl(edx, 16368); 662 orl(edx, rsi); 663 xorl(edx, ebx); 664 pinsrw(xmm4, edx, 3); 665 movq(xmm2, ExternalAddress(PI_4)); //0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL 666 movq(xmm6, ExternalAddress(8 + PI_4)); //0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL 667 xorpd(xmm5, xmm5); 668 subl(edx, 1008); 669 pinsrw(xmm5, edx, 3); 670 mulsd(xmm0, xmm4); 671 shll(rsi, 16); 672 sarl(rsi, 31); 673 mulsd(xmm3, xmm5); 674 movdqu(xmm1, xmm0); 675 mulsd(xmm0, xmm2); 676 shrl(rdi, 29); 677 addsd(xmm1, xmm3); 678 mulsd(xmm3, xmm2); 679 addl(rdi, rsi); 680 xorl(rdi, rsi); 681 mulsd(xmm6, xmm1); 682 movl(eax, rdi); 683 addsd(xmm6, xmm3); 684 movdqu(xmm2, xmm0); 685 addsd(xmm0, xmm6); 686 subsd(xmm2, xmm0); 687 addsd(xmm6, xmm2); 688 689 bind(L_2TAG_PACKET_12_0_1); 690 movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL 691 mulsd(xmm1, xmm0); 692 movq(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL 693 movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL 694 pand(xmm4, xmm0); 695 por(xmm5, xmm4); 696 addpd(xmm1, xmm5); 697 cvttsd2sil(edx, xmm1); 698 cvtsi2sdl(xmm1, edx); 699 movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL 700 movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL 701 mulsd(xmm3, xmm1); 702 unpcklpd(xmm1, xmm1); 703 shll(eax, 3); 704 addl(edx, 1865216); 705 movdqu(xmm4, xmm0); 706 addl(edx, eax); 707 andl(edx, 63); 708 movdqu(xmm5, ExternalAddress(SC_4)); //0x54400000UL, 0x3fb921fbUL 709 lea(rax, ExternalAddress(Ctable)); 710 shll(edx, 5); 711 addq(rax, rdx); 712 mulpd(xmm2, xmm1); 713 subsd(xmm0, xmm3); 714 mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL 715 subsd(xmm4, xmm3); 716 movq(xmm7, Address(rax, 8)); 717 unpcklpd(xmm0, xmm0); 718 movdqu(xmm3, xmm4); 719 subsd(xmm4, xmm2); 720 mulpd(xmm5, xmm0); 721 subpd(xmm0, xmm2); 722 mulsd(xmm7, xmm4); 723 subsd(xmm3, xmm4); 724 mulpd(xmm5, xmm0); 725 mulpd(xmm0, xmm0); 726 subsd(xmm3, xmm2); 727 movdqu(xmm2, Address(rax, 0)); 728 subsd(xmm1, xmm3); 729 movq(xmm3, Address(rax, 24)); 730 addsd(xmm2, xmm3); 731 subsd(xmm7, xmm2); 732 subsd(xmm1, xmm6); 733 movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL 734 mulsd(xmm2, xmm4); 735 mulpd(xmm6, xmm0); 736 mulsd(xmm3, xmm4); 737 mulpd(xmm2, xmm0); 738 mulpd(xmm0, xmm0); 739 addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL 740 mulsd(xmm4, Address(rax, 0)); 741 addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL 742 mulpd(xmm5, xmm0); 743 movdqu(xmm0, xmm3); 744 addsd(xmm3, Address(rax, 8)); 745 mulpd(xmm1, xmm7); 746 movdqu(xmm7, xmm4); 747 addsd(xmm4, xmm3); 748 addpd(xmm6, xmm5); 749 movq(xmm5, Address(rax, 8)); 750 subsd(xmm5, xmm3); 751 subsd(xmm3, xmm4); 752 addsd(xmm1, Address(rax, 16)); 753 mulpd(xmm6, xmm2); 754 addsd(xmm5, xmm0); 755 addsd(xmm3, xmm7); 756 addsd(xmm1, xmm5); 757 addsd(xmm1, xmm3); 758 addsd(xmm1, xmm6); 759 unpckhpd(xmm6, xmm6); 760 movdqu(xmm0, xmm4); 761 addsd(xmm1, xmm6); 762 addsd(xmm0, xmm1); 763 jmp(B1_4); 764 765 bind(L_2TAG_PACKET_8_0_1); 766 addl(edx, 64); 767 movq(r9, r10); 768 movq(r10, r8); 769 movl(r8, 0); 770 cmpq(r9, 0); 771 jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_1); 772 addl(edx, 64); 773 movq(r9, r10); 774 movq(r10, r8); 775 cmpq(r9, 0); 776 jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_1); 777 xorpd(xmm0, xmm0); 778 xorpd(xmm6, xmm6); 779 jmp(L_2TAG_PACKET_12_0_1); 780 781 bind(L_2TAG_PACKET_10_0_1); 782 jcc(Assembler::equal, L_2TAG_PACKET_11_0_1); 783 negl(ecx); 784 shrq(r10); 785 movq(rax, r9); 786 shrq(r9); 787 subl(edx, ecx); 788 negl(ecx); 789 addl(ecx, 64); 790 shlq(rax); 791 orq(r10, rax); 792 jmp(L_2TAG_PACKET_11_0_1); 793 794 bind(L_2TAG_PACKET_4_0_1); 795 negl(ecx); 796 shlq(r9, 32); 797 orq(r9, r11); 798 shlq(r9); 799 movq(rdi, r9); 800 testl(r9, INT_MIN); 801 jcc(Assembler::notEqual, L_2TAG_PACKET_13_0_1); 802 shrl(r9); 803 movl(ebx, 0); 804 shrq(rdi, 3); 805 jmp(L_2TAG_PACKET_7_0_1); 806 807 bind(L_2TAG_PACKET_5_0_1); 808 shrl(r9); 809 movl(ebx, 536870912); 810 shrl(ebx); 811 shlq(r9, 32); 812 orq(r9, r11); 813 shlq(rbx, 32); 814 addl(rdi, 536870912); 815 movl(rcx, 0); 816 movl(r11, 0); 817 subq(rcx, r8); 818 sbbq(r11, r10); 819 sbbq(rbx, r9); 820 movq(r8, rcx); 821 movq(r10, r11); 822 movq(r9, rbx); 823 movl(ebx, 32768); 824 jmp(L_2TAG_PACKET_6_0_1); 825 826 bind(L_2TAG_PACKET_13_0_1); 827 shrl(r9); 828 mov64(rbx, 0x100000000); 829 shrq(rbx); 830 movl(rcx, 0); 831 movl(r11, 0); 832 subq(rcx, r8); 833 sbbq(r11, r10); 834 sbbq(rbx, r9); 835 movq(r8, rcx); 836 movq(r10, r11); 837 movq(r9, rbx); 838 movl(ebx, 32768); 839 shrq(rdi, 3); 840 addl(rdi, 536870912); 841 jmp(L_2TAG_PACKET_7_0_1); 842 843 bind(L_2TAG_PACKET_3_0_1); 844 movq(xmm0, Address(rsp, 8)); 845 mulsd(xmm0, ExternalAddress(NEG_ZERO)); //0x00000000UL, 0x80000000UL 846 movq(Address(rsp, 0), xmm0); 847 848 bind(L_2TAG_PACKET_14_0_1); 849 850 bind(B1_4); 851 addq(rsp, 16); 852 pop(rbx); 853 } 854 #else 855 // The 32 bit code is at most SSE2 compliant 856 ALIGNED_(8) juint _zero_none[] = 857 { 858 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL 859 }; 860 861 ALIGNED_(4) juint __4onpi_d[] = 862 { 863 0x6dc9c883UL, 0x3ff45f30UL 864 }; 865 866 ALIGNED_(4) juint _TWO_32H[] = 867 { 868 0x00000000UL, 0x41f80000UL 869 }; 870 871 ALIGNED_(4) juint _pi04_3d[] = 872 { 873 0x54442d00UL, 0x3fe921fbUL, 0x98cc5180UL, 0x3ce84698UL, 0xcbb5bf6cUL, 874 0xb9dfc8f8UL 875 }; 876 877 ALIGNED_(4) juint _pi04_5d[] = 878 { 879 0x54400000UL, 0x3fe921fbUL, 0x1a600000UL, 0x3dc0b461UL, 0x2e000000UL, 880 0x3b93198aUL, 0x25200000UL, 0x396b839aUL, 0x533e63a0UL, 0x37027044UL 881 }; 882 883 ALIGNED_(4) juint _SCALE[] = 884 { 885 0x00000000UL, 0x32600000UL 886 }; 887 888 ALIGNED_(4) juint _zeros[] = 889 { 890 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL 891 }; 892 893 ALIGNED_(4) juint _pi04_2d[] = 894 { 895 0x54400000UL, 0x3fe921fbUL, 0x1a626331UL, 0x3dc0b461UL 896 }; 897 898 ALIGNED_(4) juint _TWO_12H[] = 899 { 900 0x00000000UL, 0x40b80000UL 901 }; 902 903 ALIGNED_(2) jushort __4onpi_31l[] = 904 { 905 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x836e, 0xa2f9, 906 0x40d8, 0x0000, 0x0000, 0x0000, 0x2a50, 0x9c88, 0x40b7, 0x0000, 0x0000, 0x0000, 907 0xabe8, 0xfe13, 0x4099, 0x0000, 0x0000, 0x0000, 0x6ee0, 0xfa9a, 0x4079, 0x0000, 908 0x0000, 0x0000, 0x9580, 0xdb62, 0x4058, 0x0000, 0x0000, 0x0000, 0x1c82, 0xc9e2, 909 0x403d, 0x0000, 0x0000, 0x0000, 0xb1c0, 0xff28, 0x4019, 0x0000, 0x0000, 0x0000, 910 0xef14, 0xaf7a, 0x3ffe, 0x0000, 0x0000, 0x0000, 0x48dc, 0xc36e, 0x3fdf, 0x0000, 911 0x0000, 0x0000, 0x3740, 0xe909, 0x3fbe, 0x0000, 0x0000, 0x0000, 0x924a, 0xb801, 912 0x3fa2, 0x0000, 0x0000, 0x0000, 0x3a32, 0xdd41, 0x3f83, 0x0000, 0x0000, 0x0000, 913 0x8778, 0x873f, 0x3f62, 0x0000, 0x0000, 0x0000, 0x1298, 0xb1cb, 0x3f44, 0x0000, 914 0x0000, 0x0000, 0xa208, 0x9cfb, 0x3f26, 0x0000, 0x0000, 0x0000, 0xbaec, 0xd7d4, 915 0x3f06, 0x0000, 0x0000, 0x0000, 0xd338, 0x8909, 0x3ee7, 0x0000, 0x0000, 0x0000, 916 0x68b8, 0xe04d, 0x3ec7, 0x0000, 0x0000, 0x0000, 0x4e64, 0xdf90, 0x3eaa, 0x0000, 917 0x0000, 0x0000, 0xc1a8, 0xeb1c, 0x3e89, 0x0000, 0x0000, 0x0000, 0x2720, 0xce7d, 918 0x3e6a, 0x0000, 0x0000, 0x0000, 0x77b8, 0x8bf1, 0x3e4b, 0x0000, 0x0000, 0x0000, 919 0xec7e, 0xe4a0, 0x3e2e, 0x0000, 0x0000, 0x0000, 0xffbc, 0xf12f, 0x3e0f, 0x0000, 920 0x0000, 0x0000, 0xfdc0, 0xb301, 0x3deb, 0x0000, 0x0000, 0x0000, 0xc5ac, 0x9788, 921 0x3dd1, 0x0000, 0x0000, 0x0000, 0x47da, 0x829b, 0x3db2, 0x0000, 0x0000, 0x0000, 922 0xd9e4, 0xa6cf, 0x3d93, 0x0000, 0x0000, 0x0000, 0x36e8, 0xf961, 0x3d73, 0x0000, 923 0x0000, 0x0000, 0xf668, 0xf463, 0x3d54, 0x0000, 0x0000, 0x0000, 0x5168, 0xf2ff, 924 0x3d35, 0x0000, 0x0000, 0x0000, 0x758e, 0xea4f, 0x3d17, 0x0000, 0x0000, 0x0000, 925 0xf17a, 0xebe5, 0x3cf8, 0x0000, 0x0000, 0x0000, 0x9cfa, 0x9e83, 0x3cd9, 0x0000, 926 0x0000, 0x0000, 0xa4ba, 0xe294, 0x3cba, 0x0000, 0x0000, 0x0000, 0xd7ec, 0x9afe, 927 0x3c9a, 0x0000, 0x0000, 0x0000, 0xae80, 0x8fc6, 0x3c79, 0x0000, 0x0000, 0x0000, 928 0x3304, 0x8560, 0x3c5c, 0x0000, 0x0000, 0x0000, 0x6d70, 0xdf8f, 0x3c3b, 0x0000, 929 0x0000, 0x0000, 0x3ef0, 0xafc3, 0x3c1e, 0x0000, 0x0000, 0x0000, 0xd0d8, 0x826b, 930 0x3bfe, 0x0000, 0x0000, 0x0000, 0x1c80, 0xed4f, 0x3bdd, 0x0000, 0x0000, 0x0000, 931 0x730c, 0xb0af, 0x3bc1, 0x0000, 0x0000, 0x0000, 0x6660, 0xc219, 0x3ba2, 0x0000, 932 0x0000, 0x0000, 0x940c, 0xabe2, 0x3b83, 0x0000, 0x0000, 0x0000, 0xdffc, 0x8408, 933 0x3b64, 0x0000, 0x0000, 0x0000, 0x6b98, 0xc402, 0x3b45, 0x0000, 0x0000, 0x0000, 934 0x1818, 0x9cc4, 0x3b26, 0x0000, 0x0000, 0x0000, 0x5390, 0xaab6, 0x3b05, 0x0000, 935 0x0000, 0x0000, 0xb070, 0xd464, 0x3ae9, 0x0000, 0x0000, 0x0000, 0x231a, 0x9ef0, 936 0x3aca, 0x0000, 0x0000, 0x0000, 0x0670, 0xd1f1, 0x3aaa, 0x0000, 0x0000, 0x0000, 937 0x7738, 0xd9f3, 0x3a8a, 0x0000, 0x0000, 0x0000, 0xa834, 0x8092, 0x3a6c, 0x0000, 938 0x0000, 0x0000, 0xb45c, 0xce23, 0x3a4d, 0x0000, 0x0000, 0x0000, 0x36e8, 0xb0e5, 939 0x3a2d, 0x0000, 0x0000, 0x0000, 0xd156, 0xaf44, 0x3a10, 0x0000, 0x0000, 0x0000, 940 0x9f52, 0x8c82, 0x39f1, 0x0000, 0x0000, 0x0000, 0x829c, 0xff83, 0x39d1, 0x0000, 941 0x0000, 0x0000, 0x7d06, 0xefc6, 0x39b3, 0x0000, 0x0000, 0x0000, 0x93e0, 0xb0b7, 942 0x3992, 0x0000, 0x0000, 0x0000, 0xedde, 0xc193, 0x3975, 0x0000, 0x0000, 0x0000, 943 0xbbc0, 0xcf49, 0x3952, 0x0000, 0x0000, 0x0000, 0xbdf0, 0xd63c, 0x3937, 0x0000, 944 0x0000, 0x0000, 0x1f34, 0x9f3a, 0x3918, 0x0000, 0x0000, 0x0000, 0x3f8e, 0xe579, 945 0x38f9, 0x0000, 0x0000, 0x0000, 0x90c8, 0xc3f8, 0x38d9, 0x0000, 0x0000, 0x0000, 946 0x48c0, 0xf8f8, 0x38b7, 0x0000, 0x0000, 0x0000, 0xed56, 0xafa6, 0x389c, 0x0000, 947 0x0000, 0x0000, 0x8218, 0xb969, 0x387d, 0x0000, 0x0000, 0x0000, 0x1852, 0xec57, 948 0x385e, 0x0000, 0x0000, 0x0000, 0x670c, 0xd674, 0x383e, 0x0000, 0x0000, 0x0000, 949 0xad40, 0xc2c4, 0x3820, 0x0000, 0x0000, 0x0000, 0x2e80, 0xa696, 0x3801, 0x0000, 950 0x0000, 0x0000, 0xd800, 0xc467, 0x37dc, 0x0000, 0x0000, 0x0000, 0x3c72, 0xc5ae, 951 0x37c3, 0x0000, 0x0000, 0x0000, 0xb006, 0xac69, 0x37a4, 0x0000, 0x0000, 0x0000, 952 0x34a0, 0x8cdf, 0x3782, 0x0000, 0x0000, 0x0000, 0x9ed2, 0xd25e, 0x3766, 0x0000, 953 0x0000, 0x0000, 0x6fec, 0xaaaa, 0x3747, 0x0000, 0x0000, 0x0000, 0x6040, 0xfb5c, 954 0x3726, 0x0000, 0x0000, 0x0000, 0x764c, 0xa3fc, 0x3708, 0x0000, 0x0000, 0x0000, 955 0xb254, 0x954e, 0x36e9, 0x0000, 0x0000, 0x0000, 0x3e1c, 0xf5dc, 0x36ca, 0x0000, 956 0x0000, 0x0000, 0x7b06, 0xc635, 0x36ac, 0x0000, 0x0000, 0x0000, 0xa8ba, 0xd738, 957 0x368d, 0x0000, 0x0000, 0x0000, 0x06cc, 0xb24e, 0x366d, 0x0000, 0x0000, 0x0000, 958 0x7108, 0xac76, 0x364f, 0x0000, 0x0000, 0x0000, 0x2324, 0xa7cb, 0x3630, 0x0000, 959 0x0000, 0x0000, 0xac40, 0xef15, 0x360f, 0x0000, 0x0000, 0x0000, 0xae46, 0xd516, 960 0x35f2, 0x0000, 0x0000, 0x0000, 0x615e, 0xe003, 0x35d3, 0x0000, 0x0000, 0x0000, 961 0x0cf0, 0xefe7, 0x35b1, 0x0000, 0x0000, 0x0000, 0xfb50, 0xf98c, 0x3595, 0x0000, 962 0x0000, 0x0000, 0x0abc, 0xf333, 0x3575, 0x0000, 0x0000, 0x0000, 0xdd60, 0xca3f, 963 0x3555, 0x0000, 0x0000, 0x0000, 0x7eb6, 0xd87f, 0x3538, 0x0000, 0x0000, 0x0000, 964 0x44f4, 0xb291, 0x3519, 0x0000, 0x0000, 0x0000, 0xff80, 0xc982, 0x34f6, 0x0000, 965 0x0000, 0x0000, 0x9de0, 0xd9b8, 0x34db, 0x0000, 0x0000, 0x0000, 0xcd42, 0x9366, 966 0x34bc, 0x0000, 0x0000, 0x0000, 0xbef0, 0xfaee, 0x349d, 0x0000, 0x0000, 0x0000, 967 0xdac4, 0xb6f1, 0x347d, 0x0000, 0x0000, 0x0000, 0xf140, 0x94de, 0x345d, 0x0000, 968 0x0000, 0x0000, 0xa218, 0x8b4b, 0x343e, 0x0000, 0x0000, 0x0000, 0x6380, 0xa135, 969 0x341e, 0x0000, 0x0000, 0x0000, 0xb184, 0x8cb2, 0x3402, 0x0000, 0x0000, 0x0000, 970 0x196e, 0xdc61, 0x33e3, 0x0000, 0x0000, 0x0000, 0x0c00, 0xde05, 0x33c4, 0x0000, 971 0x0000, 0x0000, 0xef9a, 0xbd38, 0x33a5, 0x0000, 0x0000, 0x0000, 0xc1a0, 0xdf00, 972 0x3385, 0x0000, 0x0000, 0x0000, 0x1090, 0x9973, 0x3365, 0x0000, 0x0000, 0x0000, 973 0x4882, 0x8301, 0x3348, 0x0000, 0x0000, 0x0000, 0x7abe, 0xadc7, 0x3329, 0x0000, 974 0x0000, 0x0000, 0x7cba, 0xec2b, 0x330a, 0x0000, 0x0000, 0x0000, 0xa520, 0x8f21, 975 0x32e9, 0x0000, 0x0000, 0x0000, 0x710c, 0x8d36, 0x32cc, 0x0000, 0x0000, 0x0000, 976 0x5212, 0xc6ed, 0x32ad, 0x0000, 0x0000, 0x0000, 0x7308, 0xfd76, 0x328d, 0x0000, 977 0x0000, 0x0000, 0x5014, 0xd548, 0x326f, 0x0000, 0x0000, 0x0000, 0xd3f2, 0xb499, 978 0x3250, 0x0000, 0x0000, 0x0000, 0x7f74, 0xa606, 0x3230, 0x0000, 0x0000, 0x0000, 979 0xf0a8, 0xd720, 0x3212, 0x0000, 0x0000, 0x0000, 0x185c, 0xe20f, 0x31f2, 0x0000, 980 0x0000, 0x0000, 0xa5a8, 0x8738, 0x31d4, 0x0000, 0x0000, 0x0000, 0xdd74, 0xcafb, 981 0x31b4, 0x0000, 0x0000, 0x0000, 0x98b6, 0xbd8e, 0x3196, 0x0000, 0x0000, 0x0000, 982 0xe9de, 0x977f, 0x3177, 0x0000, 0x0000, 0x0000, 0x67c0, 0x818d, 0x3158, 0x0000, 983 0x0000, 0x0000, 0xe52a, 0x9322, 0x3139, 0x0000, 0x0000, 0x0000, 0xe568, 0x9b6c, 984 0x3119, 0x0000, 0x0000, 0x0000, 0x2358, 0xaa0a, 0x30fa, 0x0000, 0x0000, 0x0000, 985 0xe480, 0xe13b, 0x30d9, 0x0000, 0x0000, 0x0000, 0x3024, 0x90a1, 0x30bd, 0x0000, 986 0x0000, 0x0000, 0x9620, 0xda30, 0x309d, 0x0000, 0x0000, 0x0000, 0x898a, 0xb388, 987 0x307f, 0x0000, 0x0000, 0x0000, 0xb24c, 0xc891, 0x3060, 0x0000, 0x0000, 0x0000, 988 0x8056, 0xf98b, 0x3041, 0x0000, 0x0000, 0x0000, 0x72a4, 0xa1ea, 0x3021, 0x0000, 989 0x0000, 0x0000, 0x6af8, 0x9488, 0x3001, 0x0000, 0x0000, 0x0000, 0xe00c, 0xdfcb, 990 0x2fe4, 0x0000, 0x0000, 0x0000, 0xeeec, 0xc941, 0x2fc4, 0x0000, 0x0000, 0x0000, 991 0x53e0, 0xe70f, 0x2fa4, 0x0000, 0x0000, 0x0000, 0x8f60, 0x9c07, 0x2f85, 0x0000, 992 0x0000, 0x0000, 0xb328, 0xc3e7, 0x2f68, 0x0000, 0x0000, 0x0000, 0x9404, 0xf8c7, 993 0x2f48, 0x0000, 0x0000, 0x0000, 0x38e0, 0xc99f, 0x2f29, 0x0000, 0x0000, 0x0000, 994 0x9778, 0xd984, 0x2f09, 0x0000, 0x0000, 0x0000, 0xe700, 0xd142, 0x2eea, 0x0000, 995 0x0000, 0x0000, 0xd904, 0x9443, 0x2ecd, 0x0000, 0x0000, 0x0000, 0xd4ba, 0xae7e, 996 0x2eae, 0x0000, 0x0000, 0x0000, 0x8e5e, 0x8524, 0x2e8f, 0x0000, 0x0000, 0x0000, 997 0xb550, 0xc9ed, 0x2e6e, 0x0000, 0x0000, 0x0000, 0x53b8, 0x8648, 0x2e51, 0x0000, 998 0x0000, 0x0000, 0xdae4, 0x87f9, 0x2e32, 0x0000, 0x0000, 0x0000, 0x2942, 0xd966, 999 0x2e13, 0x0000, 0x0000, 0x0000, 0x4f28, 0xcf3c, 0x2df3, 0x0000, 0x0000, 0x0000, 1000 0xfa40, 0xc4ef, 0x2dd1, 0x0000, 0x0000, 0x0000, 0x4424, 0xbca7, 0x2db5, 0x0000, 1001 0x0000, 0x0000, 0x2e62, 0xcdc5, 0x2d97, 0x0000, 0x0000, 0x0000, 0xed88, 0x996b, 1002 0x2d78, 0x0000, 0x0000, 0x0000, 0x7c30, 0xd97d, 0x2d56, 0x0000, 0x0000, 0x0000, 1003 0xed26, 0xbf6e, 0x2d3a, 0x0000, 0x0000, 0x0000, 0x2918, 0x921b, 0x2d1a, 0x0000, 1004 0x0000, 0x0000, 0x4e24, 0xe84e, 0x2cfb, 0x0000, 0x0000, 0x0000, 0x6dc0, 0x92ec, 1005 0x2cdd, 0x0000, 0x0000, 0x0000, 0x4f2c, 0xacf8, 0x2cbd, 0x0000, 0x0000, 0x0000, 1006 0xc634, 0xf094, 0x2c9e, 0x0000, 0x0000, 0x0000, 0xdc70, 0xe5d3, 0x2c7e, 0x0000, 1007 0x0000, 0x0000, 0x2180, 0xa600, 0x2c5b, 0x0000, 0x0000, 0x0000, 0x8480, 0xd680, 1008 0x2c3c, 0x0000, 0x0000, 0x0000, 0x8b24, 0xd63b, 0x2c22, 0x0000, 0x0000, 0x0000, 1009 0x02e0, 0xaa47, 0x2c00, 0x0000, 0x0000, 0x0000, 0x9ad0, 0xee84, 0x2be3, 0x0000, 1010 0x0000, 0x0000, 0xf7dc, 0xf699, 0x2bc6, 0x0000, 0x0000, 0x0000, 0xddde, 0xe490, 1011 0x2ba7, 0x0000, 0x0000, 0x0000, 0x34a0, 0xb4fd, 0x2b85, 0x0000, 0x0000, 0x0000, 1012 0x91b4, 0x8ef6, 0x2b68, 0x0000, 0x0000, 0x0000, 0xa3e0, 0xa2a7, 0x2b47, 0x0000, 1013 0x0000, 0x0000, 0xcce4, 0x82b3, 0x2b2a, 0x0000, 0x0000, 0x0000, 0xe4be, 0x8207, 1014 0x2b0c, 0x0000, 0x0000, 0x0000, 0x1d92, 0xab43, 0x2aed, 0x0000, 0x0000, 0x0000, 1015 0xe818, 0xf9f6, 0x2acd, 0x0000, 0x0000, 0x0000, 0xff12, 0xba80, 0x2aaf, 0x0000, 1016 0x0000, 0x0000, 0x5254, 0x8529, 0x2a90, 0x0000, 0x0000, 0x0000, 0x1b88, 0xe032, 1017 0x2a71, 0x0000, 0x0000, 0x0000, 0x3248, 0xd86d, 0x2a50, 0x0000, 0x0000, 0x0000, 1018 0x3140, 0xc9d5, 0x2a2e, 0x0000, 0x0000, 0x0000, 0x14e6, 0xbd47, 0x2a14, 0x0000, 1019 0x0000, 0x0000, 0x5c10, 0xe544, 0x29f4, 0x0000, 0x0000, 0x0000, 0x9f50, 0x90b6, 1020 0x29d4, 0x0000, 0x0000, 0x0000, 0x9850, 0xab55, 0x29b6, 0x0000, 0x0000, 0x0000, 1021 0x2750, 0x9d07, 0x2998, 0x0000, 0x0000, 0x0000, 0x6700, 0x8bbb, 0x2973, 0x0000, 1022 0x0000, 0x0000, 0x5dba, 0xed31, 0x295a, 0x0000, 0x0000, 0x0000, 0x61dc, 0x85fe, 1023 0x293a, 0x0000, 0x0000, 0x0000, 0x9ba2, 0xd6b4, 0x291c, 0x0000, 0x0000, 0x0000, 1024 0x2d30, 0xe3a5, 0x28fb, 0x0000, 0x0000, 0x0000, 0x6630, 0xb566, 0x28dd, 0x0000, 1025 0x0000, 0x0000, 0x5ad4, 0xa829, 0x28bf, 0x0000, 0x0000, 0x0000, 0x89d8, 0xe290, 1026 0x28a0, 0x0000, 0x0000, 0x0000, 0x3916, 0xc428, 0x2881, 0x0000, 0x0000, 0x0000, 1027 0x0490, 0xbea4, 0x2860, 0x0000, 0x0000, 0x0000, 0xee06, 0x80ee, 0x2843, 0x0000, 1028 0x0000, 0x0000, 0xfc00, 0xf327, 0x2820, 0x0000, 0x0000, 0x0000, 0xea40, 0xa871, 1029 0x2800, 0x0000, 0x0000, 0x0000, 0x63d8, 0x9c26, 0x27e4, 0x0000, 0x0000, 0x0000, 1030 0x07ba, 0xc0c9, 0x27c7, 0x0000, 0x0000, 0x0000, 0x3fa2, 0x9797, 0x27a8, 0x0000, 1031 0x0000, 0x0000, 0x21c6, 0xfeca, 0x2789, 0x0000, 0x0000, 0x0000, 0xde40, 0x860d, 1032 0x2768, 0x0000, 0x0000, 0x0000, 0x9cc8, 0x98ce, 0x2749, 0x0000, 0x0000, 0x0000, 1033 0x3778, 0xa31c, 0x272a, 0x0000, 0x0000, 0x0000, 0xe778, 0xf6e2, 0x270b, 0x0000, 1034 0x0000, 0x0000, 0x59b8, 0xf841, 0x26ed, 0x0000, 0x0000, 0x0000, 0x02e0, 0xad04, 1035 0x26cd, 0x0000, 0x0000, 0x0000, 0x5a92, 0x9380, 0x26b0, 0x0000, 0x0000, 0x0000, 1036 0xc740, 0x8886, 0x268d, 0x0000, 0x0000, 0x0000, 0x0680, 0xfaf8, 0x266c, 0x0000, 1037 0x0000, 0x0000, 0xfb60, 0x897f, 0x2653, 0x0000, 0x0000, 0x0000, 0x8760, 0xf903, 1038 0x2634, 0x0000, 0x0000, 0x0000, 0xad2a, 0xc2c8, 0x2615, 0x0000, 0x0000, 0x0000, 1039 0x2d86, 0x8aef, 0x25f6, 0x0000, 0x0000, 0x0000, 0x1ef4, 0xe627, 0x25d6, 0x0000, 1040 0x0000, 0x0000, 0x09e4, 0x8020, 0x25b7, 0x0000, 0x0000, 0x0000, 0x7548, 0xd227, 1041 0x2598, 0x0000, 0x0000, 0x0000, 0x75dc, 0xfb5b, 0x2579, 0x0000, 0x0000, 0x0000, 1042 0xea84, 0xc8b6, 0x255a, 0x0000, 0x0000, 0x0000, 0xe4d0, 0x8145, 0x253b, 0x0000, 1043 0x0000, 0x0000, 0x3640, 0x9768, 0x251c, 0x0000, 0x0000, 0x0000, 0x246a, 0xccec, 1044 0x24fe, 0x0000, 0x0000, 0x0000, 0x51d0, 0xa075, 0x24dd, 0x0000, 0x0000, 0x0000, 1045 0x4638, 0xa385, 0x24bf, 0x0000, 0x0000, 0x0000, 0xd788, 0xd776, 0x24a1, 0x0000, 1046 0x0000, 0x0000, 0x1370, 0x8997, 0x2482, 0x0000, 0x0000, 0x0000, 0x1e88, 0x9b67, 1047 0x2462, 0x0000, 0x0000, 0x0000, 0x6c08, 0xd975, 0x2444, 0x0000, 0x0000, 0x0000, 1048 0xfdb0, 0xcfc0, 0x2422, 0x0000, 0x0000, 0x0000, 0x3100, 0xc026, 0x2406, 0x0000, 1049 0x0000, 0x0000, 0xc5b4, 0xae64, 0x23e6, 0x0000, 0x0000, 0x0000, 0x2280, 0xf687, 1050 0x23c3, 0x0000, 0x0000, 0x0000, 0x2de0, 0x9006, 0x23a9, 0x0000, 0x0000, 0x0000, 1051 0x24bc, 0xf631, 0x238a, 0x0000, 0x0000, 0x0000, 0xb8d4, 0xa975, 0x236b, 0x0000, 1052 0x0000, 0x0000, 0xd9a4, 0xb949, 0x234b, 0x0000, 0x0000, 0x0000, 0xb54e, 0xbd39, 1053 0x232d, 0x0000, 0x0000, 0x0000, 0x4aac, 0x9a52, 0x230e, 0x0000, 0x0000, 0x0000, 1054 0xbbbc, 0xd085, 0x22ef, 0x0000, 0x0000, 0x0000, 0xdf18, 0xc633, 0x22cf, 0x0000, 1055 0x0000, 0x0000, 0x16d0, 0xeca5, 0x22af, 0x0000, 0x0000, 0x0000, 0xf2a0, 0xdf6f, 1056 0x228e, 0x0000, 0x0000, 0x0000, 0x8c44, 0xe86b, 0x2272, 0x0000, 0x0000, 0x0000, 1057 0x35c0, 0xbbf4, 0x2253, 0x0000, 0x0000, 0x0000, 0x0c40, 0xdafb, 0x2230, 0x0000, 1058 0x0000, 0x0000, 0x92dc, 0x9935, 0x2216, 0x0000, 0x0000, 0x0000, 0x0ca0, 0xbda6, 1059 0x21f3, 0x0000, 0x0000, 0x0000, 0x5958, 0xa6fd, 0x21d6, 0x0000, 0x0000, 0x0000, 1060 0xa3dc, 0x9d7f, 0x21b9, 0x0000, 0x0000, 0x0000, 0x79dc, 0xfcb5, 0x2199, 0x0000, 1061 0x0000, 0x0000, 0xf264, 0xcebb, 0x217b, 0x0000, 0x0000, 0x0000, 0x0abe, 0x8308, 1062 0x215c, 0x0000, 0x0000, 0x0000, 0x30ae, 0xb463, 0x213d, 0x0000, 0x0000, 0x0000, 1063 0x6228, 0xb040, 0x211c, 0x0000, 0x0000, 0x0000, 0xc9b2, 0xf43b, 0x20ff, 0x0000, 1064 0x0000, 0x0000, 0x3d8e, 0xa4b3, 0x20e0, 0x0000, 0x0000, 0x0000, 0x84e6, 0x8dab, 1065 0x20c1, 0x0000, 0x0000, 0x0000, 0xa124, 0x9b74, 0x20a1, 0x0000, 0x0000, 0x0000, 1066 0xc276, 0xd497, 0x2083, 0x0000, 0x0000, 0x0000, 0x6354, 0xa466, 0x2063, 0x0000, 1067 0x0000, 0x0000, 0x8654, 0xaf0a, 0x2044, 0x0000, 0x0000, 0x0000, 0x1d20, 0xfa5c, 1068 0x2024, 0x0000, 0x0000, 0x0000, 0xbcd0, 0xf3f0, 0x2004, 0x0000, 0x0000, 0x0000, 1069 0xedf0, 0xf0b6, 0x1fe7, 0x0000, 0x0000, 0x0000, 0x45bc, 0x9182, 0x1fc9, 0x0000, 1070 0x0000, 0x0000, 0xe254, 0xdc85, 0x1faa, 0x0000, 0x0000, 0x0000, 0xb898, 0xe9b1, 1071 0x1f8a, 0x0000, 0x0000, 0x0000, 0x0ebe, 0xe6f0, 0x1f6c, 0x0000, 0x0000, 0x0000, 1072 0xa9b8, 0xf584, 0x1f4c, 0x0000, 0x0000, 0x0000, 0x12e8, 0xdf6b, 0x1f2e, 0x0000, 1073 0x0000, 0x0000, 0x9f9e, 0xcd55, 0x1f0f, 0x0000, 0x0000, 0x0000, 0x05a0, 0xec3a, 1074 0x1eef, 0x0000, 0x0000, 0x0000, 0xd8e0, 0x96f8, 0x1ed1, 0x0000, 0x0000, 0x0000, 1075 0x3bd4, 0xccc6, 0x1eb1, 0x0000, 0x0000, 0x0000, 0x4910, 0xb87b, 0x1e93, 0x0000, 1076 0x0000, 0x0000, 0xbefc, 0xd40b, 0x1e73, 0x0000, 0x0000, 0x0000, 0x317e, 0xa406, 1077 0x1e55, 0x0000, 0x0000, 0x0000, 0x6bb2, 0xc2b2, 0x1e36, 0x0000, 0x0000, 0x0000, 1078 0xb87e, 0xbb78, 0x1e17, 0x0000, 0x0000, 0x0000, 0xa03c, 0xdbbd, 0x1df7, 0x0000, 1079 0x0000, 0x0000, 0x5b6c, 0xe3c8, 0x1dd9, 0x0000, 0x0000, 0x0000, 0x8968, 0xca8e, 1080 0x1dba, 0x0000, 0x0000, 0x0000, 0xc024, 0xe6ab, 0x1d9a, 0x0000, 0x0000, 0x0000, 1081 0x4110, 0xd4eb, 0x1d7a, 0x0000, 0x0000, 0x0000, 0xa168, 0xbdb5, 0x1d5d, 0x0000, 1082 0x0000, 0x0000, 0x012e, 0xa5fa, 0x1d3e, 0x0000, 0x0000, 0x0000, 0x6838, 0x9c1f, 1083 0x1d1e, 0x0000, 0x0000, 0x0000, 0xa158, 0xaa76, 0x1d00, 0x0000, 0x0000, 0x0000, 1084 0x090a, 0xbd95, 0x1ce1, 0x0000, 0x0000, 0x0000, 0xf73e, 0x8b6d, 0x1cc2, 0x0000, 1085 0x0000, 0x0000, 0x5fda, 0xbcbf, 0x1ca3, 0x0000, 0x0000, 0x0000, 0xdbe8, 0xb89f, 1086 0x1c84, 0x0000, 0x0000, 0x0000, 0x6e4c, 0x96c7, 0x1c64, 0x0000, 0x0000, 0x0000, 1087 0x19c2, 0xf2a4, 0x1c46, 0x0000, 0x0000, 0x0000, 0xb800, 0xf855, 0x1c1e, 0x0000, 1088 0x0000, 0x0000, 0x87fc, 0x85ff, 0x1c08, 0x0000, 0x0000, 0x0000, 0x1418, 0x839f, 1089 0x1be9, 0x0000, 0x0000, 0x0000, 0x6186, 0xd9d8, 0x1bca, 0x0000, 0x0000, 0x0000, 1090 0xf500, 0xabaa, 0x1ba6, 0x0000, 0x0000, 0x0000, 0x7b36, 0xdafe, 0x1b8c, 0x0000, 1091 0x0000, 0x0000, 0xf394, 0xe6d8, 0x1b6c, 0x0000, 0x0000, 0x0000, 0x6efc, 0x9e55, 1092 0x1b4e, 0x0000, 0x0000, 0x0000, 0x5e10, 0xc523, 0x1b2e, 0x0000, 0x0000, 0x0000, 1093 0x8210, 0xb6f9, 0x1b0d, 0x0000, 0x0000, 0x0000, 0x9ab0, 0x96e3, 0x1af1, 0x0000, 1094 0x0000, 0x0000, 0x3864, 0x92e7, 0x1ad1, 0x0000, 0x0000, 0x0000, 0x9878, 0xdc65, 1095 0x1ab1, 0x0000, 0x0000, 0x0000, 0xfa20, 0xd6cb, 0x1a94, 0x0000, 0x0000, 0x0000, 1096 0x6c00, 0xa4e4, 0x1a70, 0x0000, 0x0000, 0x0000, 0xab40, 0xb41b, 0x1a53, 0x0000, 1097 0x0000, 0x0000, 0x43a4, 0x8ede, 0x1a37, 0x0000, 0x0000, 0x0000, 0x22e0, 0x9314, 1098 0x1a15, 0x0000, 0x0000, 0x0000, 0x6170, 0xb949, 0x19f8, 0x0000, 0x0000, 0x0000, 1099 0x6b00, 0xe056, 0x19d8, 0x0000, 0x0000, 0x0000, 0x9ba8, 0xa94c, 0x19b9, 0x0000, 1100 0x0000, 0x0000, 0xfaa0, 0xaa16, 0x199b, 0x0000, 0x0000, 0x0000, 0x899a, 0xf627, 1101 0x197d, 0x0000, 0x0000, 0x0000, 0x9f20, 0xfb70, 0x195d, 0x0000, 0x0000, 0x0000, 1102 0xa4b8, 0xc176, 0x193e, 0x0000, 0x0000, 0x0000, 0xb21c, 0x85c3, 0x1920, 0x0000, 1103 0x0000, 0x0000, 0x50d2, 0x9b19, 0x1901, 0x0000, 0x0000, 0x0000, 0xd4b0, 0xb708, 1104 0x18e0, 0x0000, 0x0000, 0x0000, 0xfb88, 0xf510, 0x18c1, 0x0000, 0x0000, 0x0000, 1105 0x31ec, 0xdc8d, 0x18a3, 0x0000, 0x0000, 0x0000, 0x3c00, 0xbff9, 0x1885, 0x0000, 1106 0x0000, 0x0000, 0x5020, 0xc30b, 0x1862, 0x0000, 0x0000, 0x0000, 0xd4f0, 0xda0c, 1107 0x1844, 0x0000, 0x0000, 0x0000, 0x20d2, 0x99a5, 0x1828, 0x0000, 0x0000, 0x0000, 1108 0x852e, 0xd159, 0x1809, 0x0000, 0x0000, 0x0000, 0x7cd8, 0x97a1, 0x17e9, 0x0000, 1109 0x0000, 0x0000, 0x423a, 0x997b, 0x17cb, 0x0000, 0x0000, 0x0000, 0xc1c0, 0xbe7d, 1110 0x17a8, 0x0000, 0x0000, 0x0000, 0xe8bc, 0xdcdd, 0x178d, 0x0000, 0x0000, 0x0000, 1111 0x8b28, 0xae06, 0x176e, 0x0000, 0x0000, 0x0000, 0x102e, 0xb8d4, 0x174f, 0x0000, 1112 0x0000, 0x0000, 0xaa00, 0xaa5c, 0x172f, 0x0000, 0x0000, 0x0000, 0x51f0, 0x9fc0, 1113 0x170e, 0x0000, 0x0000, 0x0000, 0xf858, 0xe181, 0x16f2, 0x0000, 0x0000, 0x0000, 1114 0x91a8, 0x8162, 0x16d3, 0x0000, 0x0000, 0x0000, 0x5f40, 0xcb6f, 0x16b1, 0x0000, 1115 0x0000, 0x0000, 0xbb50, 0xe55f, 0x1693, 0x0000, 0x0000, 0x0000, 0xacd2, 0xd895, 1116 0x1676, 0x0000, 0x0000, 0x0000, 0xef30, 0x97bf, 0x1654, 0x0000, 0x0000, 0x0000, 1117 0xf700, 0xb3d7, 0x1633, 0x0000, 0x0000, 0x0000, 0x3454, 0xa7b5, 0x1619, 0x0000, 1118 0x0000, 0x0000, 0x6b00, 0xa929, 0x15f6, 0x0000, 0x0000, 0x0000, 0x9f04, 0x89f7, 1119 0x15db, 0x0000, 0x0000, 0x0000, 0xad78, 0xd985, 0x15bc, 0x0000, 0x0000, 0x0000, 1120 0xa46a, 0xae3f, 0x159d, 0x0000, 0x0000, 0x0000, 0x63a0, 0xd0da, 0x157c, 0x0000, 1121 0x0000, 0x0000, 0x5e90, 0x817d, 0x155e, 0x0000, 0x0000, 0x0000, 0x1494, 0xb13f, 1122 0x1540, 0x0000, 0x0000, 0x0000, 0x0090, 0x9c40, 0x1521, 0x0000, 0x0000, 0x0000, 1123 0xdd70, 0xcc86, 0x1500, 0x0000, 0x0000, 0x0000, 0x64f8, 0xdb6f, 0x14e1, 0x0000, 1124 0x0000, 0x0000, 0xe22c, 0xac17, 0x14c3, 0x0000, 0x0000, 0x0000, 0x60e0, 0xa9ad, 1125 0x14a3, 0x0000, 0x0000, 0x0000, 0x4640, 0xd658, 0x1481, 0x0000, 0x0000, 0x0000, 1126 0x6490, 0xa181, 0x1467, 0x0000, 0x0000, 0x0000, 0x1df4, 0xaaa2, 0x1447, 0x0000, 1127 0x0000, 0x0000, 0xb94a, 0x8f61, 0x1429, 0x0000, 0x0000, 0x0000, 0x5198, 0x9d83, 1128 0x1409, 0x0000, 0x0000, 0x0000, 0x0f7a, 0xa818, 0x13eb, 0x0000, 0x0000, 0x0000, 1129 0xc45e, 0xc06c, 0x13cc, 0x0000, 0x0000, 0x0000, 0x4ec0, 0xfa29, 0x13a8, 0x0000, 1130 0x0000, 0x0000, 0x6418, 0x8cad, 0x138c, 0x0000, 0x0000, 0x0000, 0xbcc8, 0xe7d1, 1131 0x136f, 0x0000, 0x0000, 0x0000, 0xc934, 0xf9b0, 0x134f, 0x0000, 0x0000, 0x0000, 1132 0x6ce0, 0x98df, 0x1331, 0x0000, 0x0000, 0x0000, 0x3516, 0xe5e9, 0x1312, 0x0000, 1133 0x0000, 0x0000, 0xc6c0, 0xef8b, 0x12ef, 0x0000, 0x0000, 0x0000, 0xaf02, 0x913d, 1134 0x12d4, 0x0000, 0x0000, 0x0000, 0xd230, 0xe1d5, 0x12b5, 0x0000, 0x0000, 0x0000, 1135 0xfba8, 0xc232, 0x1295, 0x0000, 0x0000, 0x0000, 0x7ba4, 0xabeb, 0x1277, 0x0000, 1136 0x0000, 0x0000, 0x6e5c, 0xc692, 0x1258, 0x0000, 0x0000, 0x0000, 0x76a2, 0x9756, 1137 0x1239, 0x0000, 0x0000, 0x0000, 0xe180, 0xe423, 0x1214, 0x0000, 0x0000, 0x0000, 1138 0x8c3c, 0x90f8, 0x11fb, 0x0000, 0x0000, 0x0000, 0x9f3c, 0x9fd2, 0x11dc, 0x0000, 1139 0x0000, 0x0000, 0x53e0, 0xb73e, 0x11bd, 0x0000, 0x0000, 0x0000, 0x45be, 0x88d6, 1140 0x119e, 0x0000, 0x0000, 0x0000, 0x111a, 0x8bc0, 0x117f, 0x0000, 0x0000, 0x0000, 1141 0xe26a, 0xd7ff, 0x1160, 0x0000, 0x0000, 0x0000, 0xfb60, 0xdd8d, 0x113f, 0x0000, 1142 0x0000, 0x0000, 0x9370, 0xc108, 0x1120, 0x0000, 0x0000, 0x0000, 0x9654, 0x8baf, 1143 0x1103, 0x0000, 0x0000, 0x0000, 0xd6ec, 0xd6b9, 0x10e4, 0x0000, 0x0000, 0x0000, 1144 0x23e4, 0xd7b7, 0x10c4, 0x0000, 0x0000, 0x0000, 0x1aa6, 0xa847, 0x10a6, 0x0000, 1145 0x0000, 0x0000, 0xbee6, 0x9fef, 0x1087, 0x0000, 0x0000, 0x0000, 0x26d0, 0xa6eb, 1146 0x1066, 0x0000, 0x0000, 0x0000, 0x5b86, 0xa880, 0x1049, 0x0000, 0x0000, 0x0000, 1147 0x125c, 0xd971, 0x1029, 0x0000, 0x0000, 0x0000, 0x1f78, 0x9d18, 0x100a, 0x0000, 1148 0x0000, 0x0000, 0x0e84, 0xb15b, 0x0feb, 0x0000, 0x0000, 0x0000, 0xd0c0, 0xc150, 1149 0x0fcc, 0x0000, 0x0000, 0x0000, 0xa330, 0xc40c, 0x0fad, 0x0000, 0x0000, 0x0000, 1150 0x5202, 0xfc2c, 0x0f8f, 0x0000, 0x0000, 0x0000, 0x3f7c, 0xecf5, 0x0f6f, 0x0000, 1151 0x0000, 0x0000, 0xef44, 0xfdfd, 0x0f50, 0x0000, 0x0000, 0x0000, 0x3f6c, 0xab1b, 1152 0x0f31, 0x0000, 0x0000, 0x0000, 0xf658, 0x89ec, 0x0f11, 0x0000, 0x0000, 0x0000, 1153 0xbfc8, 0x9ba8, 0x0ef4, 0x0000, 0x0000, 0x0000, 0x3d40, 0xbe21, 0x0ed5, 0x0000, 1154 0x0000, 0x0000, 0xbbc4, 0xc70d, 0x0eb6, 0x0000, 0x0000, 0x0000, 0x5158, 0xdb16, 1155 0x0e96, 0x0000, 0x0000, 0x0000, 0xb5a8, 0xa8d8, 0x0e78, 0x0000, 0x0000, 0x0000, 1156 0xcccc, 0xb40e, 0x0e58, 0x0000, 0x0000, 0x0000, 0x448c, 0xcb62, 0x0e3a, 0x0000, 1157 0x0000, 0x0000, 0xf12a, 0x8aed, 0x0e1b, 0x0000, 0x0000, 0x0000, 0x79d0, 0xc59c, 1158 0x0dfb, 0x0000, 0x0000, 0x0000, 0x06b4, 0xcdc9, 0x0ddd, 0x0000, 0x0000, 0x0000, 1159 0xae70, 0xa979, 0x0dbe, 0x0000, 0x0000, 0x0000, 0x317c, 0xa8fb, 0x0d9e, 0x0000, 1160 0x0000, 0x0000, 0x5fe0, 0x8a50, 0x0d7d, 0x0000, 0x0000, 0x0000, 0x70b6, 0xfdfa, 1161 0x0d61, 0x0000, 0x0000, 0x0000, 0x1640, 0x9dc7, 0x0d41, 0x0000, 0x0000, 0x0000, 1162 0x9a9c, 0xdc50, 0x0d23, 0x0000, 0x0000, 0x0000, 0x4fcc, 0x9a9b, 0x0d04, 0x0000, 1163 0x0000, 0x0000, 0x7e48, 0x8f77, 0x0ce5, 0x0000, 0x0000, 0x0000, 0x84e4, 0xd4b9, 1164 0x0cc6, 0x0000, 0x0000, 0x0000, 0x84e0, 0xbd10, 0x0ca6, 0x0000, 0x0000, 0x0000, 1165 0x1b0a, 0xc8d9, 0x0c88, 0x0000, 0x0000, 0x0000, 0x6a48, 0xfc81, 0x0c68, 0x0000, 1166 0x0000, 0x0000, 0x070a, 0xbef6, 0x0c4a, 0x0000, 0x0000, 0x0000, 0x8a70, 0xf096, 1167 0x0c2b, 0x0000, 0x0000, 0x0000, 0xecc2, 0xc994, 0x0c0c, 0x0000, 0x0000, 0x0000, 1168 0x1540, 0x9537, 0x0bea, 0x0000, 0x0000, 0x0000, 0x1b02, 0xab5b, 0x0bce, 0x0000, 1169 0x0000, 0x0000, 0x5dc0, 0xb0c8, 0x0bad, 0x0000, 0x0000, 0x0000, 0xc928, 0xe034, 1170 0x0b8f, 0x0000, 0x0000, 0x0000, 0x2d12, 0xb4b0, 0x0b71, 0x0000, 0x0000, 0x0000, 1171 0x8fc2, 0xbb94, 0x0b52, 0x0000, 0x0000, 0x0000, 0xe236, 0xe22f, 0x0b33, 0x0000, 1172 0x0000, 0x0000, 0xb97c, 0xbe9e, 0x0b13, 0x0000, 0x0000, 0x0000, 0xe1a6, 0xe16d, 1173 0x0af5, 0x0000, 0x0000, 0x0000, 0xd330, 0xbaf0, 0x0ad6, 0x0000, 0x0000, 0x0000, 1174 0xc0bc, 0xbbd0, 0x0ab7, 0x0000, 0x0000, 0x0000, 0x8e66, 0xdd9b, 0x0a98, 0x0000, 1175 0x0000, 0x0000, 0xc95c, 0xf799, 0x0a79, 0x0000, 0x0000, 0x0000, 0xdac0, 0xbe4c, 1176 0x0a55, 0x0000, 0x0000, 0x0000, 0xafc0, 0xc378, 0x0a37, 0x0000, 0x0000, 0x0000, 1177 0xa880, 0xe341, 0x0a19, 0x0000, 0x0000, 0x0000, 0xc242, 0x81f6, 0x09fd, 0x0000, 1178 0x0000, 0x0000, 0x7470, 0xc777, 0x09de, 0x0000, 0x0000, 0x0000, 0x62bc, 0xb684, 1179 0x09be, 0x0000, 0x0000, 0x0000, 0x43ac, 0x8c58, 0x099f, 0x0000, 0x0000, 0x0000, 1180 0xcc3c, 0xf9ac, 0x0981, 0x0000, 0x0000, 0x0000, 0x1526, 0xb670, 0x0962, 0x0000, 1181 0x0000, 0x0000, 0xc9fe, 0xdf50, 0x0943, 0x0000, 0x0000, 0x0000, 0x6ae6, 0xc065, 1182 0x0924, 0x0000, 0x0000, 0x0000, 0xb114, 0xcf29, 0x0905, 0x0000, 0x0000, 0x0000, 1183 0xd388, 0x922a, 0x08e4, 0x0000, 0x0000, 0x0000, 0xcf54, 0xb926, 0x08c7, 0x0000, 1184 0x0000, 0x0000, 0x3826, 0xe855, 0x08a8, 0x0000, 0x0000, 0x0000, 0xe7c8, 0x829b, 1185 0x0888, 0x0000, 0x0000, 0x0000, 0x546c, 0xa903, 0x086a, 0x0000, 0x0000, 0x0000, 1186 0x8768, 0x99cc, 0x0849, 0x0000, 0x0000, 0x0000, 0x00ac, 0xf529, 0x082b, 0x0000, 1187 0x0000, 0x0000, 0x2658, 0x9f0b, 0x080c, 0x0000, 0x0000, 0x0000, 0xfe5c, 0x9e21, 1188 0x07ee, 0x0000, 0x0000, 0x0000, 0x6da2, 0x9910, 0x07cf, 0x0000, 0x0000, 0x0000, 1189 0x9220, 0xf9b3, 0x07b0, 0x0000, 0x0000, 0x0000, 0x3d90, 0xa541, 0x0791, 0x0000, 1190 0x0000, 0x0000, 0x6e4c, 0xe7cc, 0x0771, 0x0000, 0x0000, 0x0000, 0xa8fa, 0xe80a, 1191 0x0753, 0x0000, 0x0000, 0x0000, 0x4e14, 0xc3a7, 0x0734, 0x0000, 0x0000, 0x0000, 1192 0xf7e0, 0xbad9, 0x0712, 0x0000, 0x0000, 0x0000, 0xfea0, 0xeff2, 0x06f5, 0x0000, 1193 0x0000, 0x0000, 0xcef6, 0xbd48, 0x06d7, 0x0000, 0x0000, 0x0000, 0x7544, 0xf559, 1194 0x06b7, 0x0000, 0x0000, 0x0000, 0x2388, 0xf655, 0x0698, 0x0000, 0x0000, 0x0000, 1195 0xe900, 0xad56, 0x0676, 0x0000, 0x0000, 0x0000, 0x2cc0, 0x8437, 0x0659, 0x0000, 1196 0x0000, 0x0000, 0x3068, 0xc544, 0x063b, 0x0000, 0x0000, 0x0000, 0xdc70, 0xe73c, 1197 0x061b, 0x0000, 0x0000, 0x0000, 0xee50, 0x9d49, 0x05fc, 0x0000, 0x0000, 0x0000, 1198 0x93d2, 0x81f6, 0x05df, 0x0000, 0x0000, 0x0000, 0x941c, 0xadff, 0x05bf, 0x0000, 1199 0x0000, 0x0000, 0x2ce2, 0x8e45, 0x05a1, 0x0000, 0x0000, 0x0000, 0x4a60, 0x95fd, 1200 0x0581, 0x0000, 0x0000, 0x0000, 0x79f8, 0xb83a, 0x0563, 0x0000, 0x0000, 0x0000, 1201 0xcb58, 0xa1f5, 0x0543, 0x0000, 0x0000, 0x0000, 0x2a3a, 0xdc36, 0x0525, 0x0000, 1202 0x0000, 0x0000, 0x14ee, 0x890e, 0x0506, 0x0000, 0x0000, 0x0000, 0x8f20, 0xc432, 1203 0x04e3, 0x0000, 0x0000, 0x0000, 0x8440, 0xb21d, 0x04c6, 0x0000, 0x0000, 0x0000, 1204 0x5430, 0xf698, 0x04a7, 0x0000, 0x0000, 0x0000, 0x04ae, 0x8b20, 0x048a, 0x0000, 1205 0x0000, 0x0000, 0x04d0, 0xe872, 0x046b, 0x0000, 0x0000, 0x0000, 0xc78e, 0x8893, 1206 0x044c, 0x0000, 0x0000, 0x0000, 0x0f78, 0x9895, 0x042b, 0x0000, 0x0000, 0x0000, 1207 0x11d4, 0xdf2e, 0x040d, 0x0000, 0x0000, 0x0000, 0xe84c, 0x89d5, 0x03ef, 0x0000, 1208 0x0000, 0x0000, 0xf7be, 0x8a67, 0x03d0, 0x0000, 0x0000, 0x0000, 0x95d0, 0xc906, 1209 0x03b1, 0x0000, 0x0000, 0x0000, 0x64ce, 0xd96c, 0x0392, 0x0000, 0x0000, 0x0000, 1210 0x97ba, 0xa16f, 0x0373, 0x0000, 0x0000, 0x0000, 0x463c, 0xc51a, 0x0354, 0x0000, 1211 0x0000, 0x0000, 0xef0a, 0xe93e, 0x0335, 0x0000, 0x0000, 0x0000, 0x526a, 0xa466, 1212 0x0316, 0x0000, 0x0000, 0x0000, 0x4140, 0xa94d, 0x02f5, 0x0000, 0x0000, 0x0000, 1213 0xb4ec, 0xce68, 0x02d8, 0x0000, 0x0000, 0x0000, 0x4fa2, 0x8490, 0x02b9, 0x0000, 1214 0x0000, 0x0000, 0x4e60, 0xca98, 0x0298, 0x0000, 0x0000, 0x0000, 0x08dc, 0xe09c, 1215 0x027a, 0x0000, 0x0000, 0x0000, 0x2b90, 0xc7e3, 0x025c, 0x0000, 0x0000, 0x0000, 1216 0x5a7c, 0xf8ef, 0x023c, 0x0000, 0x0000, 0x0000, 0x5022, 0x9d58, 0x021e, 0x0000, 1217 0x0000, 0x0000, 0x553a, 0xe242, 0x01ff, 0x0000, 0x0000, 0x0000, 0x7e6e, 0xb54d, 1218 0x01e0, 0x0000, 0x0000, 0x0000, 0xd2d4, 0xa88c, 0x01c1, 0x0000, 0x0000, 0x0000, 1219 0x75b6, 0xfe6d, 0x01a2, 0x0000, 0x0000, 0x0000, 0x3bb2, 0xf04c, 0x0183, 0x0000, 1220 0x0000, 0x0000, 0xc2d0, 0xc046, 0x0163, 0x0000, 0x0000, 0x0000, 0x250c, 0xf9d6, 1221 0x0145, 0x0000, 0x0000, 0x0000, 0xb7b4, 0x8a0d, 0x0126, 0x0000, 0x0000, 0x0000, 1222 0x1a72, 0xe4f5, 0x0107, 0x0000, 0x0000, 0x0000, 0x825c, 0xa9b8, 0x00e8, 0x0000, 1223 0x0000, 0x0000, 0x6c90, 0xc9ad, 0x00c6, 0x0000, 0x0000, 0x0000, 0x4d00, 0xd1bb, 1224 0x00aa, 0x0000, 0x0000, 0x0000, 0xa4a0, 0xee01, 0x0087, 0x0000, 0x0000, 0x0000, 1225 0x89a8, 0xbe9f, 0x006b, 0x0000, 0x0000, 0x0000, 0x038e, 0xc80c, 0x004d, 0x0000, 1226 0x0000, 0x0000, 0xfe26, 0x8384, 0x002e, 0x0000, 0x0000, 0x0000, 0xcd90, 0xca57, 1227 0x000e, 0x0000 1228 }; 1229 1230 void MacroAssembler::libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) { 1231 Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12; 1232 Label B1_13, B1_14, B1_15; 1233 1234 assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp); 1235 1236 address zero_none = (address)_zero_none; 1237 address _4onpi_d = (address)__4onpi_d; 1238 address TWO_32H = (address)_TWO_32H; 1239 address pi04_3d = (address)_pi04_3d; 1240 address pi04_5d = (address)_pi04_5d; 1241 address SCALE = (address)_SCALE; 1242 address zeros = (address)_zeros; 1243 address pi04_2d = (address)_pi04_2d; 1244 address TWO_12H = (address)_TWO_12H; 1245 address _4onpi_31l = (address)__4onpi_31l; 1246 1247 bind(B1_1); 1248 push(ebp); 1249 movl(ebp, esp); 1250 andl(esp, -16); 1251 push(esi); 1252 push(edi); 1253 push(ebx); 1254 subl(esp, 20); 1255 movzwl(ebx, Address(ebp, 16)); 1256 andl(ebx, 32767); 1257 movl(eax, Address(ebp, 20)); 1258 cmpl(ebx, 16413); 1259 movl(esi, Address(ebp, 24)); 1260 movl(Address(esp, 4), eax); 1261 jcc(Assembler::greaterEqual, B1_8); 1262 1263 bind(B1_2); 1264 fld_x(Address(ebp, 8)); 1265 fld_d(ExternalAddress(_4onpi_d)); //0x6dc9c883UL, 0x3ff45f30UL 1266 fmul(1); 1267 fstp_x(Address(esp, 8)); 1268 movzwl(ecx, Address(esp, 16)); 1269 negl(ecx); 1270 addl(ecx, 30); 1271 movl(eax, Address(esp, 12)); 1272 shrl(eax); 1273 cmpl(Address(esp, 4), 0); 1274 jcc(Assembler::notEqual, B1_4); 1275 1276 bind(B1_3); 1277 lea(ecx, Address(eax, 1)); 1278 andl(ecx, -2); 1279 jmp(B1_5); 1280 1281 bind(B1_4); 1282 movl(ecx, eax); 1283 addl(eax, Address(esp, 4)); 1284 movl(edx, eax); 1285 andl(edx, 1); 1286 addl(ecx, edx); 1287 1288 bind(B1_5); 1289 fld_d(ExternalAddress(TWO_32H)); //0x00000000UL, 0x41f80000UL 1290 cmpl(ebx, 16400); 1291 movl(Address(esp, 0), ecx); 1292 fild_s(Address(esp, 0)); 1293 jcc(Assembler::greaterEqual, B1_7); 1294 1295 bind(B1_6); 1296 fld_d(ExternalAddress(pi04_3d)); //0x54442d00UL, 0x3fe921fbUL 1297 fmul(1); 1298 fsubp(3); 1299 fxch(1); 1300 fmul(2); 1301 fld_s(2); 1302 fadd(1); 1303 fsubrp(1); 1304 fld_s(0); 1305 fxch(1); 1306 fsuba(3); 1307 fld_d(ExternalAddress(8 + pi04_3d)); //0x98cc5180UL, 0x3ce84698UL 1308 fmul(3); 1309 fsuba(2); 1310 fxch(1); 1311 fsub(2); 1312 fsubrp(1); 1313 faddp(3); 1314 fld_d(ExternalAddress(16 + pi04_3d)); //0xcbb5bf6cUL, 0xb9dfc8f8UL 1315 fmulp(2); 1316 fld_s(1); 1317 fsubr(1); 1318 fsuba(1); 1319 fxch(2); 1320 fsubp(1); 1321 faddp(2); 1322 fxch(1); 1323 jmp(B1_15); 1324 1325 bind(B1_7); 1326 fld_d(ExternalAddress(pi04_5d)); //0x54400000UL, 0x3fe921fbUL 1327 fmul(1); 1328 fsubp(3); 1329 fxch(1); 1330 fmul(2); 1331 fld_s(2); 1332 fadd(1); 1333 fsubrp(1); 1334 fld_s(0); 1335 fxch(1); 1336 fsuba(3); 1337 fld_d(ExternalAddress(8 + pi04_5d)); //0x1a600000UL, 0x3dc0b461UL 1338 fmul(3); 1339 fsuba(2); 1340 fxch(1); 1341 fsub(2); 1342 fsubrp(1); 1343 faddp(3); 1344 fld_d(ExternalAddress(16 + pi04_5d)); //0x2e000000UL, 0x3b93198aUL 1345 fmul(2); 1346 fld_s(0); 1347 fsubr(2); 1348 fsuba(2); 1349 fxch(1); 1350 fsubp(2); 1351 fxch(1); 1352 faddp(3); 1353 fld_d(ExternalAddress(24 + pi04_5d)); //0x25200000UL, 0x396b839aUL 1354 fmul(2); 1355 fld_s(0); 1356 fsubr(2); 1357 fsuba(2); 1358 fxch(1); 1359 fsubp(2); 1360 fxch(1); 1361 faddp(3); 1362 fld_d(ExternalAddress(32 + pi04_5d)); //0x533e63a0UL, 0x37027044UL 1363 fmulp(2); 1364 fld_s(1); 1365 fsubr(1); 1366 fsuba(1); 1367 fxch(2); 1368 fsubp(1); 1369 faddp(2); 1370 fxch(1); 1371 jmp(B1_15); 1372 1373 bind(B1_8); 1374 fld_x(Address(ebp, 8)); 1375 addl(ebx, -16417); 1376 fmul_d(as_Address(ExternalAddress(SCALE))); //0x00000000UL, 0x32600000UL 1377 movl(eax, -2078209981); 1378 imull(ebx); 1379 addl(edx, ebx); 1380 movl(ecx, ebx); 1381 sarl(edx, 4); 1382 sarl(ecx, 31); 1383 subl(edx, ecx); 1384 movl(eax, edx); 1385 shll(eax, 5); 1386 fstp_x(Address(ebp, 8)); 1387 fld_x(Address(ebp, 8)); 1388 subl(eax, edx); 1389 movl(Address(ebp, 8), 0); 1390 subl(ebx, eax); 1391 fld_x(Address(ebp, 8)); 1392 cmpl(ebx, 17); 1393 fsuba(1); 1394 jcc(Assembler::less, B1_10); 1395 1396 bind(B1_9); 1397 lea(eax, Address(noreg, edx, Address::times_8)); 1398 lea(ecx, Address(eax, edx, Address::times_4)); 1399 incl(edx); 1400 fld_x(Address(_4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1401 fmul(2); 1402 fld_x(Address(12 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1403 fmul(2); 1404 fld_s(0); 1405 fadd(2); 1406 fsuba(2); 1407 fxch(1); 1408 faddp(2); 1409 fld_s(1); 1410 fadd(1); 1411 fstp_x(Address(esp, 8)); 1412 andl(Address(esp, 8), -16777216); 1413 fld_x(Address(esp, 8)); 1414 fsubp(1); 1415 jmp(B1_11); 1416 1417 bind(B1_10); 1418 fld_d(ExternalAddress(zeros)); //0x00000000UL, 0x00000000UL 1419 fld_s(0); 1420 1421 bind(B1_11); 1422 fld_s(0); 1423 lea(eax, Address(noreg, edx, Address::times_8)); 1424 fld_s(3); 1425 lea(edx, Address(eax, edx, Address::times_4)); 1426 fld_x(Address(_4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1)); 1427 fmul(6); 1428 movl(Address(esp, 0), edx); 1429 fadda(2); 1430 fxch(2); 1431 fsuba(3); 1432 fxch(2); 1433 faddp(3); 1434 fxch(2); 1435 faddp(3); 1436 fld_x(Address(12 + _4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1)); 1437 fmula(2); 1438 fld_s(2); 1439 fadd(2); 1440 fld_s(0); 1441 fxch(1); 1442 fsubra(3); 1443 fxch(3); 1444 fchs(); 1445 faddp(4); 1446 fxch(3); 1447 faddp(4); 1448 fxch(2); 1449 fadd(3); 1450 fxch(2); 1451 fmul(5); 1452 fadda(2); 1453 fld_s(4); 1454 fld_x(Address(24 + _4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1)); 1455 fmula(1); 1456 fxch(1); 1457 fadda(4); 1458 fxch(4); 1459 fstp_x(Address(esp, 8)); 1460 movzwl(ebx, Address(esp, 16)); 1461 andl(ebx, 32767); 1462 cmpl(ebx, 16415); 1463 jcc(Assembler::greaterEqual, B1_13); 1464 1465 bind(B1_12); 1466 negl(ebx); 1467 addl(ebx, 30); 1468 movl(ecx, ebx); 1469 movl(eax, Address(esp, 12)); 1470 shrl(eax); 1471 shll(eax); 1472 movl(Address(esp, 12), eax); 1473 movl(Address(esp, 8), 0); 1474 shrl(eax); 1475 jmp(B1_14); 1476 1477 bind(B1_13); 1478 negl(ebx); 1479 addl(ebx, 30); 1480 movl(ecx, ebx); 1481 movl(edx, Address(esp, 8)); 1482 shrl(edx); 1483 shll(edx); 1484 negl(ecx); 1485 movl(eax, Address(esp, 12)); 1486 shll(eax); 1487 movl(ecx, ebx); 1488 movl(Address(esp, 8), edx); 1489 shrl(edx); 1490 orl(eax, edx); 1491 1492 bind(B1_14); 1493 fld_x(Address(esp, 8)); 1494 addl(eax, Address(esp, 4)); 1495 fsubp(3); 1496 fmul(6); 1497 fld_s(4); 1498 movl(edx, eax); 1499 andl(edx, 1); 1500 fadd(3); 1501 movl(ecx, Address(esp, 0)); 1502 fsuba(3); 1503 fxch(3); 1504 faddp(5); 1505 fld_s(1); 1506 fxch(3); 1507 fadd_d(Address(zero_none, RelocationHolder::none).plus_disp(edx, Address::times_8)); 1508 fadda(3); 1509 fsub(3); 1510 faddp(2); 1511 fxch(1); 1512 faddp(4); 1513 fld_s(2); 1514 fadd(2); 1515 fsuba(2); 1516 fxch(3); 1517 faddp(2); 1518 fxch(1); 1519 faddp(3); 1520 fld_s(0); 1521 fadd(2); 1522 fsuba(2); 1523 fxch(1); 1524 faddp(2); 1525 fxch(1); 1526 faddp(2); 1527 fld_s(2); 1528 fld_x(Address(36 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1529 fmula(1); 1530 fld_s(1); 1531 fadd(3); 1532 fsuba(3); 1533 fxch(2); 1534 faddp(3); 1535 fxch(2); 1536 faddp(3); 1537 fxch(1); 1538 fmul(4); 1539 fld_s(0); 1540 fadd(2); 1541 fsuba(2); 1542 fxch(1); 1543 faddp(2); 1544 fxch(1); 1545 faddp(2); 1546 fld_s(2); 1547 fld_x(Address(48 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1548 fmula(1); 1549 fld_s(1); 1550 fadd(3); 1551 fsuba(3); 1552 fxch(2); 1553 faddp(3); 1554 fxch(2); 1555 faddp(3); 1556 fld_s(3); 1557 fxch(2); 1558 fmul(5); 1559 fld_x(Address(60 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1560 fmula(3); 1561 fxch(3); 1562 faddp(1); 1563 fld_s(0); 1564 fadd(2); 1565 fsuba(2); 1566 fxch(1); 1567 faddp(2); 1568 fxch(1); 1569 faddp(3); 1570 fld_s(3); 1571 fxch(2); 1572 fmul(5); 1573 fld_x(Address(72 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1574 fmula(3); 1575 fxch(3); 1576 faddp(1); 1577 fld_s(0); 1578 fadd(2); 1579 fsuba(2); 1580 fxch(1); 1581 faddp(2); 1582 fxch(1); 1583 faddp(3); 1584 fxch(1); 1585 fmulp(4); 1586 fld_x(Address(84 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1)); 1587 fmulp(3); 1588 fxch(2); 1589 faddp(3); 1590 fld_s(2); 1591 fadd(2); 1592 fld_d(ExternalAddress(TWO_32H)); //0x00000000UL, 0x41f80000UL 1593 fmul(1); 1594 fadda(1); 1595 fsubp(1); 1596 fsuba(2); 1597 fxch(3); 1598 faddp(2); 1599 faddp(1); 1600 fld_d(ExternalAddress(pi04_2d)); //0x54400000UL, 0x3fe921fbUL 1601 fld_s(0); 1602 fmul(2); 1603 fxch(2); 1604 fadd(3); 1605 fxch(1); 1606 fmulp(3); 1607 fmul_d(as_Address(ExternalAddress(8 + pi04_2d))); //0x1a626331UL, 0x3dc0b461UL 1608 faddp(1); 1609 1610 bind(B1_15); 1611 fld_d(ExternalAddress(TWO_12H)); //0x00000000UL, 0x40b80000UL 1612 fld_s(2); 1613 fadd(2); 1614 fmula(1); 1615 fstp_x(Address(esp, 8)); 1616 fld_x(Address(esp, 8)); 1617 fadd(1); 1618 fsubrp(1); 1619 fst_d(Address(esi, 0)); 1620 fsubp(2); 1621 faddp(1); 1622 fstp_d(Address(esi, 8)); 1623 addl(esp, 20); 1624 pop(ebx); 1625 pop(edi); 1626 pop(esi); 1627 movl(esp, ebp); 1628 pop(ebp); 1629 ret(0); 1630 } 1631 1632 ALIGNED_(16) juint StubRoutines::x86::_L_2il0floatpacket_0[] = 1633 { 1634 0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL 1635 }; 1636 1637 ALIGNED_(16) juint StubRoutines::x86::_Pi4Inv[] = 1638 { 1639 0x6dc9c883UL, 0x3ff45f30UL 1640 }; 1641 1642 ALIGNED_(16) juint StubRoutines::x86::_Pi4x3[] = 1643 { 1644 0x54443000UL, 0xbfe921fbUL, 0x3b39a000UL, 0x3d373dcbUL, 0xe0e68948UL, 1645 0xba845c06UL 1646 }; 1647 1648 ALIGNED_(16) juint StubRoutines::x86::_Pi4x4[] = 1649 { 1650 0x54400000UL, 0xbfe921fbUL, 0x1a600000UL, 0xbdc0b461UL, 0x2e000000UL, 1651 0xbb93198aUL, 0x252049c1UL, 0xb96b839aUL 1652 }; 1653 1654 ALIGNED_(16) jushort _SP[] = 1655 { 1656 0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffc, 0x0000, 0x8887, 0x8888, 0x8888, 0x8888, 1657 0x3ff8, 0x0000, 0xc527, 0x0d00, 0x00d0, 0xd00d, 0xbff2, 0x0000, 0x45f6, 0xb616, 1658 0x1d2a, 0xb8ef, 0x3fec, 0x0000, 0x825b, 0x3997, 0x2b3f, 0xd732, 0xbfe5, 0x0000, 1659 0xbf33, 0x8bb4, 0x2fda, 0xb092, 0x3fde, 0x0000, 0x44a6, 0xed1a, 0x29ef, 0xd73e, 1660 0xbfd6, 0x0000, 0x8610, 0x307f, 0x62a1, 0xc921, 0x3fce, 0x0000 1661 }; 1662 1663 ALIGNED_(16) jushort _CP[] = 1664 { 1665 0x0000, 0x0000, 0x0000, 0x8000, 0xbffe, 0x0000, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 1666 0x3ffa, 0x0000, 0x9c2f, 0x0b60, 0x60b6, 0xb60b, 0xbff5, 0x0000, 0xf024, 0x0cac, 1667 0x00d0, 0xd00d, 0x3fef, 0x0000, 0x03fe, 0x3f65, 0x7dbb, 0x93f2, 0xbfe9, 0x0000, 1668 0xd84d, 0xadee, 0xc698, 0x8f76, 0x3fe2, 0x0000, 0xdaba, 0xfe79, 0xea36, 0xc9c9, 1669 0xbfda, 0x0000, 0x3ac6, 0x0ba0, 0x07ce, 0xd585, 0x3fd2, 0x0000 1670 }; 1671 1672 ALIGNED_(16) juint StubRoutines::x86::_ones[] = 1673 { 1674 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xbff00000UL 1675 }; 1676 1677 void MacroAssembler::libm_sincos_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) { 1678 Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12; 1679 Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23; 1680 Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34; 1681 Label B1_35, B1_36, B1_37, B1_38, B1_39, B1_40, B1_41, B1_42, B1_43, B1_44, B1_45, B1_46; 1682 1683 assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp); 1684 1685 address L_2il0floatpacket_0 = StubRoutines::x86::_L_2il0floatpacket_0_addr(); 1686 address Pi4Inv = StubRoutines::x86::_Pi4Inv_addr(); 1687 address Pi4x3 = StubRoutines::x86::_Pi4x3_addr(); 1688 address Pi4x4 = StubRoutines::x86::_Pi4x4_addr(); 1689 address ones = StubRoutines::x86::_ones_addr(); 1690 address CP = (address)_CP; 1691 address SP = (address)_SP; 1692 1693 bind(B1_1); 1694 push(ebp); 1695 movl(ebp, esp); 1696 andl(esp, -64); 1697 push(esi); 1698 push(edi); 1699 push(ebx); 1700 subl(esp, 52); 1701 movl(eax, Address(ebp, 16)); 1702 movl(edx, Address(ebp, 20)); 1703 movl(Address(esp, 32), eax); 1704 movl(Address(esp, 36), edx); 1705 1706 bind(B1_2); 1707 fnstcw(Address(esp, 30)); 1708 1709 bind(B1_3); 1710 movsd(xmm1, Address(ebp, 8)); 1711 movl(esi, Address(ebp, 12)); 1712 movl(eax, esi); 1713 andl(eax, 2147483647); 1714 andps(xmm1, ExternalAddress(L_2il0floatpacket_0)); //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL 1715 shrl(esi, 31); 1716 movl(Address(esp, 40), eax); 1717 cmpl(eax, 1104150528); 1718 movsd(Address(ebp, 8), xmm1); 1719 jcc(Assembler::aboveEqual, B1_11); 1720 1721 bind(B1_4); 1722 movsd(xmm0, ExternalAddress(Pi4Inv)); //0x6dc9c883UL, 0x3ff45f30UL 1723 mulsd(xmm0, xmm1); 1724 movzwl(edx, Address(esp, 30)); 1725 movl(eax, edx); 1726 andl(eax, 768); 1727 movsd(Address(esp, 0), xmm0); 1728 cmpl(eax, 768); 1729 jcc(Assembler::equal, B1_42); 1730 1731 bind(B1_5); 1732 orl(edx, -64768); 1733 movw(Address(esp, 28), edx); 1734 1735 bind(B1_6); 1736 fldcw(Address(esp, 28)); 1737 1738 bind(B1_7); 1739 movsd(xmm1, Address(ebp, 8)); 1740 movl(ebx, 1); 1741 1742 bind(B1_8); 1743 movl(Address(esp, 12), ebx); 1744 movl(ebx, Address(esp, 4)); 1745 movl(eax, ebx); 1746 movl(Address(esp, 8), esi); 1747 movl(esi, ebx); 1748 shrl(esi, 20); 1749 andl(eax, 1048575); 1750 movl(ecx, esi); 1751 orl(eax, 1048576); 1752 negl(ecx); 1753 movl(edx, eax); 1754 addl(ecx, 19); 1755 addl(esi, 13); 1756 movl(Address(esp, 24), ecx); 1757 shrl(edx); 1758 movl(ecx, esi); 1759 shll(eax); 1760 movl(ecx, Address(esp, 24)); 1761 movl(esi, Address(esp, 0)); 1762 shrl(esi); 1763 orl(eax, esi); 1764 cmpl(ebx, 1094713344); 1765 movsd(Address(esp, 16), xmm1); 1766 fld_d(Address(esp, 16)); 1767 cmov32(Assembler::below, eax, edx); 1768 movl(esi, Address(esp, 8)); 1769 lea(edx, Address(eax, 1)); 1770 movl(ebx, edx); 1771 andl(ebx, -2); 1772 movl(Address(esp, 16), ebx); 1773 fild_s(Address(esp, 16)); 1774 movl(ebx, Address(esp, 12)); 1775 cmpl(Address(esp, 40), 1094713344); 1776 jcc(Assembler::aboveEqual, B1_10); 1777 1778 bind(B1_9); 1779 fld_d(ExternalAddress(Pi4x3)); //0x54443000UL, 0xbfe921fbUL 1780 fmul(1); 1781 faddp(2); 1782 fld_d(ExternalAddress(8 + Pi4x3)); //0x3b39a000UL, 0x3d373dcbUL 1783 fmul(1); 1784 faddp(2); 1785 fld_d(ExternalAddress(16 + Pi4x3)); //0xe0e68948UL, 0xba845c06UL 1786 fmulp(1); 1787 faddp(1); 1788 jmp(B1_17); 1789 1790 bind(B1_10); 1791 fld_d(ExternalAddress(Pi4x4)); //0x54400000UL, 0xbfe921fbUL 1792 fmul(1); 1793 faddp(2); 1794 fld_d(ExternalAddress(8 + Pi4x4)); //0x1a600000UL, 0xbdc0b461UL 1795 fmul(1); 1796 faddp(2); 1797 fld_d(ExternalAddress(16 + Pi4x4)); //0x2e000000UL, 0xbb93198aUL 1798 fmul(1); 1799 faddp(2); 1800 fld_d(ExternalAddress(24 + Pi4x4)); //0x252049c1UL, 0xb96b839aUL 1801 fmulp(1); 1802 faddp(1); 1803 jmp(B1_17); 1804 1805 bind(B1_11); 1806 movzwl(edx, Address(esp, 30)); 1807 movl(eax, edx); 1808 andl(eax, 768); 1809 cmpl(eax, 768); 1810 jcc(Assembler::equal, B1_43); 1811 bind(B1_12); 1812 orl(edx, -64768); 1813 movw(Address(esp, 28), edx); 1814 1815 bind(B1_13); 1816 fldcw(Address(esp, 28)); 1817 1818 bind(B1_14); 1819 movsd(xmm1, Address(ebp, 8)); 1820 movl(ebx, 1); 1821 1822 bind(B1_15); 1823 movsd(Address(esp, 16), xmm1); 1824 fld_d(Address(esp, 16)); 1825 addl(esp, -32); 1826 lea(eax, Address(esp, 32)); 1827 fstp_x(Address(esp, 0)); 1828 movl(Address(esp, 12), 0); 1829 movl(Address(esp, 16), eax); 1830 call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_reduce_pi04l()))); 1831 1832 bind(B1_46); 1833 addl(esp, 32); 1834 1835 bind(B1_16); 1836 fld_d(Address(esp, 0)); 1837 lea(edx, Address(eax, 1)); 1838 fld_d(Address(esp, 8)); 1839 faddp(1); 1840 1841 bind(B1_17); 1842 movl(ecx, edx); 1843 addl(eax, 3); 1844 shrl(ecx, 2); 1845 andl(ecx, 1); 1846 shrl(eax, 2); 1847 xorl(esi, ecx); 1848 movl(ecx, Address(esp, 36)); 1849 andl(eax, 1); 1850 andl(ecx, 3); 1851 cmpl(ecx, 3); 1852 jcc(Assembler::notEqual, B1_25); 1853 1854 bind(B1_18); 1855 fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62 1856 fld_s(1); 1857 fmul((2)); 1858 testb(edx, 2); 1859 fmula((1)); 1860 fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29 1861 faddp(2); 1862 fmula(1); 1863 fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f 1864 faddp(2); 1865 fmula(1); 1866 fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b 1867 faddp(2); 1868 fmula(1); 1869 fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d 1870 faddp(2); 1871 fmula(1); 1872 fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00 1873 faddp(2); 1874 fmula(1); 1875 fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88 1876 faddp(2); 1877 fmula(1); 1878 fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa 1879 faddp(2); 1880 fmula(1); 1881 fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07 1882 fmul(1); 1883 fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea 1884 faddp(1); 1885 fmul(1); 1886 fld_x(ExternalAddress(62 + CP)); //0xd84d, 0xadee, 0xc6 1887 faddp(1); 1888 fmul(1); 1889 fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d 1890 faddp(1); 1891 fmul(1); 1892 fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00 1893 faddp(1); 1894 fmul(1); 1895 fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60 1896 faddp(1); 1897 fmul(1); 1898 fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa 1899 faddp(1); 1900 fmul(1); 1901 fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00 1902 faddp(1); 1903 fmulp(1); 1904 fld_d(Address(ones, RelocationHolder::none).plus_disp(esi, Address::times_8)); 1905 fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8)); 1906 jcc(Assembler::equal, B1_22); 1907 1908 bind(B1_19); 1909 fmulp(4); 1910 testl(ebx, ebx); 1911 fxch(2); 1912 fmul(3); 1913 movl(eax, Address(esp, 2)); 1914 faddp(3); 1915 fxch(2); 1916 fstp_d(Address(eax, 0)); 1917 fmula(1); 1918 faddp(1); 1919 fstp_d(Address(eax, 8)); 1920 jcc(Assembler::equal, B1_21); 1921 1922 bind(B1_20); 1923 fldcw(Address(esp, 30)); 1924 1925 bind(B1_21); 1926 addl(esp, 52); 1927 pop(ebx); 1928 pop(edi); 1929 pop(esi); 1930 movl(esp, ebp); 1931 pop(ebp); 1932 ret(0); 1933 1934 bind(B1_22); 1935 fxch(1); 1936 fmulp(4); 1937 testl(ebx, ebx); 1938 fxch(2); 1939 fmul(3); 1940 movl(eax, Address(esp, 32)); 1941 faddp(3); 1942 fxch(2); 1943 fstp_d(Address(eax, 8)); 1944 fmula(1); 1945 faddp(1); 1946 fstp_d(Address(eax, 0)); 1947 jcc(Assembler::equal, B1_24); 1948 1949 bind(B1_23); 1950 fldcw(Address(esp, 30)); 1951 1952 bind(B1_24); 1953 addl(esp, 52); 1954 pop(ebx); 1955 pop(edi); 1956 pop(esi); 1957 movl(esp, ebp); 1958 pop(ebp); 1959 ret(0); 1960 1961 bind(B1_25); 1962 testb(Address(esp, 36), 2); 1963 jcc(Assembler::equal, B1_33); 1964 1965 bind(B1_26); 1966 fld_s(0); 1967 testb(edx, 2); 1968 fmul(1); 1969 fld_s(0); 1970 fmul(1); 1971 jcc(Assembler::equal, B1_30); 1972 1973 bind(B1_27); 1974 fstp_d(2); 1975 fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07 1976 testl(ebx, ebx); 1977 fmul(2); 1978 fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea 1979 fmul(3); 1980 fld_x(ExternalAddress(60 + CP)); //0xd84d, 0xadee, 0xc6 1981 movl(eax, Address(rsp, 32)); 1982 faddp(2); 1983 fxch(1); 1984 fmul(3); 1985 fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d 1986 faddp(2); 1987 fxch(1); 1988 fmul(3); 1989 fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00 1990 faddp(2); 1991 fxch(1); 1992 fmul(3); 1993 fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60 1994 faddp(2); 1995 fxch(1); 1996 fmul(3); 1997 fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa 1998 faddp(2); 1999 fxch(1); 2000 fmulp(3); 2001 fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00 2002 faddp(1); 2003 fmulp(1); 2004 faddp(1); 2005 fld_d(Address(ones, RelocationHolder::none).plus_disp(rsi, Address::times_8)); 2006 fmula(1); 2007 faddp(1); 2008 fstp_d(Address(eax, 8)); 2009 jcc(Assembler::equal, B1_29); 2010 2011 bind(B1_28); 2012 fldcw(Address(esp, 30)); 2013 2014 bind(B1_29); 2015 addl(esp, 52); 2016 pop(ebx); 2017 pop(edi); 2018 pop(esi); 2019 movl(esp, ebp); 2020 pop(ebp); 2021 ret(0); 2022 2023 bind(B1_30); 2024 fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62 2025 testl(ebx, ebx); 2026 fmul(1); 2027 fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29 2028 fmul(2); 2029 fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f 2030 movl(eax, Address(rsp, 32)); 2031 faddp(2); 2032 fxch(1); 2033 fmul(2); 2034 fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b 2035 faddp(2); 2036 fxch(1); 2037 fmul(2); 2038 fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d 2039 faddp(2); 2040 fxch(1); 2041 fmul(2); 2042 fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00 2043 faddp(2); 2044 fxch(1); 2045 fmul(2); 2046 fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88 2047 faddp(2); 2048 fxch(1); 2049 fmulp(2); 2050 fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa 2051 faddp(1); 2052 fmulp(2); 2053 faddp(1); 2054 fld_d(Address(ones, RelocationHolder::none).plus_disp(rsi, Address::times_8)); 2055 fmulp(2); 2056 fmul(1); 2057 faddp(1); 2058 fstp_d(Address(eax, 8)); 2059 jcc(Assembler::equal, B1_32); 2060 2061 bind(B1_31); 2062 fldcw(Address(esp, 30)); 2063 2064 bind(B1_32); 2065 addl(esp, 52); 2066 pop(ebx); 2067 pop(edi); 2068 pop(esi); 2069 movl(esp, ebp); 2070 pop(ebp); 2071 ret(0); 2072 2073 bind(B1_33); 2074 testb(Address(esp, 36), 1); 2075 jcc(Assembler::equal, B1_41); 2076 2077 bind(B1_34); 2078 fld_s(0); 2079 testb(edx, 2); 2080 fmul(1); 2081 fld_s(0); 2082 fmul(1); 2083 jcc(Assembler::equal, B1_38); 2084 2085 bind(B1_35); 2086 fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62 2087 testl(ebx, ebx); 2088 fmul(1); 2089 fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29 2090 fmul(2); 2091 fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f 2092 faddp(2); 2093 fxch(1); 2094 fmul(2); 2095 fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b 2096 faddp(2); 2097 fxch(1); 2098 fmul(2); 2099 fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d 2100 faddp(2); 2101 fxch(1); 2102 fmul(2); 2103 fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00 2104 faddp(2); 2105 fxch(1); 2106 fmul(2); 2107 fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88 2108 faddp(2); 2109 fxch(1); 2110 fmulp(2); 2111 fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa 2112 faddp(1); 2113 fmulp(2); 2114 faddp(1); 2115 fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8)); 2116 fmulp(2); 2117 fmul(1); 2118 movl(eax, Address(esp, 32)); 2119 faddp(1); 2120 fstp_d(Address(eax, 0)); 2121 jcc(Assembler::equal, B1_37); 2122 2123 bind(B1_36); 2124 fldcw(Address(esp, 30)); 2125 2126 bind(B1_37); 2127 addl(esp, 52); 2128 pop(ebx); 2129 pop(edi); 2130 pop(esi); 2131 movl(esp, ebp); 2132 pop(ebp); 2133 ret(0); 2134 2135 bind(B1_38); 2136 fstp_d(2); 2137 fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07 2138 testl(ebx, ebx); 2139 fmul(2); 2140 fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea 2141 fmul(3); 2142 fld_x(ExternalAddress(60 + CP)); //0xd84d, 0xadee, 0xc6 2143 faddp(2); 2144 fxch(1); 2145 fmul(3); 2146 fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d 2147 faddp(2); 2148 fxch(1); 2149 fmul(3); 2150 fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00 2151 faddp(2); 2152 fxch(1); 2153 fmul(3); 2154 fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60 2155 faddp(2); 2156 fxch(1); 2157 fmul(3); 2158 fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa 2159 faddp(2); 2160 fxch(1); 2161 fmulp(3); 2162 fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00 2163 faddp(1); 2164 fmulp(1); 2165 faddp(1); 2166 fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8)); 2167 fmula(1); 2168 movl(eax, Address(esp, 32)); 2169 faddp(1); 2170 fstp_d(Address(eax, 0)); 2171 jcc(Assembler::equal, B1_40); 2172 2173 bind(B1_39); 2174 fldcw(Address(esp, 30)); 2175 bind(B1_40); 2176 addl(esp, 52); 2177 pop(ebx); 2178 pop(edi); 2179 pop(esi); 2180 movl(esp, ebp); 2181 pop(ebp); 2182 ret(0); 2183 bind(B1_41); 2184 fstp_d(0); 2185 addl(esp, 52); 2186 pop(ebx); 2187 pop(edi); 2188 pop(esi); 2189 movl(esp, ebp); 2190 pop(ebp); 2191 ret(0); 2192 bind(B1_42); 2193 xorl(ebx, ebx); 2194 jmp(B1_8); 2195 bind(B1_43); 2196 xorl(ebx, ebx); 2197 jmp(B1_15); 2198 } 2199 2200 ALIGNED_(16) juint _static_const_table_sin[] = 2201 { 2202 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 2203 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL, 2204 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL, 2205 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 2206 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 2207 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 2208 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 2209 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL, 2210 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL, 2211 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL, 2212 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL, 2213 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 2214 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL, 2215 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 2216 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 2217 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL, 2218 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL, 2219 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL, 2220 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL, 2221 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 2222 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL, 2223 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 2224 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 2225 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL, 2226 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL, 2227 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL, 2228 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 2229 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 2230 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL, 2231 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 2232 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 2233 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL, 2234 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL, 2235 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL, 2236 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL, 2237 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 2238 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 2239 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 2240 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 2241 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL, 2242 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL, 2243 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL, 2244 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL, 2245 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 2246 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 2247 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 2248 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 2249 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL, 2250 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL, 2251 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL, 2252 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL, 2253 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 2254 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 2255 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL, 2256 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 2257 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL, 2258 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 2259 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL, 2260 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL, 2261 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL, 2262 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 2263 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL, 2264 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 2265 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL, 2266 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 2267 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL, 2268 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL, 2269 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL, 2270 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 2271 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL, 2272 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 2273 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL, 2274 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 2275 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL, 2276 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL, 2277 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL, 2278 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL, 2279 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL, 2280 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 2281 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL, 2282 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 2283 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL, 2284 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL, 2285 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL, 2286 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 2287 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL, 2288 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 2289 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL, 2290 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 2291 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL, 2292 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL, 2293 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL, 2294 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 2295 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL, 2296 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 2297 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL, 2298 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 2299 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL, 2300 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL, 2301 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL, 2302 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 2303 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL, 2304 0x00000000UL, 0x3ff00000UL, 0x55555555UL, 0xbfc55555UL, 0x00000000UL, 2305 0xbfe00000UL, 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL, 2306 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL, 0xa556c734UL, 2307 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL, 0x1a600000UL, 0x3d90b461UL, 2308 0x1a600000UL, 0x3d90b461UL, 0x54400000UL, 0x3fb921fbUL, 0x00000000UL, 2309 0x00000000UL, 0x2e037073UL, 0x3b63198aUL, 0x00000000UL, 0x00000000UL, 2310 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 2311 0x43380000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL, 2312 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL, 2313 0x00000000UL, 0xffffffffUL, 0x3fefffffUL, 0x00000000UL, 0x00000000UL, 2314 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 2315 0x80000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x3fe00000UL, 2316 0x00000000UL, 0x3fe00000UL 2317 }; 2318 2319 void MacroAssembler::fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ebx, Register edx) { 2320 2321 Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2; 2322 Label L_2TAG_PACKET_4_0_2, start; 2323 assert_different_registers(eax, ebx, edx); 2324 address static_const_table_sin = (address)_static_const_table_sin; 2325 2326 bind(start); 2327 subl(rsp, 120); 2328 movl(Address(rsp, 56), ebx); 2329 lea(ebx, ExternalAddress(static_const_table_sin)); 2330 movsd(xmm0, Address(rsp, 128)); 2331 pextrw(eax, xmm0, 3); 2332 andl(eax, 32767); 2333 subl(eax, 12336); 2334 cmpl(eax, 4293); 2335 jcc(Assembler::above, L_2TAG_PACKET_0_0_2); 2336 movsd(xmm1, Address(ebx, 2160)); 2337 mulsd(xmm1, xmm0); 2338 movsd(xmm5, Address(ebx, 2272)); 2339 movdqu(xmm4, Address(ebx, 2256)); 2340 pand(xmm4, xmm0); 2341 por(xmm5, xmm4); 2342 movsd(xmm3, Address(ebx, 2128)); 2343 movdqu(xmm2, Address(ebx, 2112)); 2344 addpd(xmm1, xmm5); 2345 cvttsd2sil(edx, xmm1); 2346 cvtsi2sdl(xmm1, edx); 2347 mulsd(xmm3, xmm1); 2348 unpcklpd(xmm1, xmm1); 2349 addl(edx, 1865216); 2350 movdqu(xmm4, xmm0); 2351 andl(edx, 63); 2352 movdqu(xmm5, Address(ebx, 2096)); 2353 lea(eax, Address(ebx, 0)); 2354 shll(edx, 5); 2355 addl(eax, edx); 2356 mulpd(xmm2, xmm1); 2357 subsd(xmm0, xmm3); 2358 mulsd(xmm1, Address(ebx, 2144)); 2359 subsd(xmm4, xmm3); 2360 movsd(xmm7, Address(eax, 8)); 2361 unpcklpd(xmm0, xmm0); 2362 movapd(xmm3, xmm4); 2363 subsd(xmm4, xmm2); 2364 mulpd(xmm5, xmm0); 2365 subpd(xmm0, xmm2); 2366 movdqu(xmm6, Address(ebx, 2064)); 2367 mulsd(xmm7, xmm4); 2368 subsd(xmm3, xmm4); 2369 mulpd(xmm5, xmm0); 2370 mulpd(xmm0, xmm0); 2371 subsd(xmm3, xmm2); 2372 movdqu(xmm2, Address(eax, 0)); 2373 subsd(xmm1, xmm3); 2374 movsd(xmm3, Address(eax, 24)); 2375 addsd(xmm2, xmm3); 2376 subsd(xmm7, xmm2); 2377 mulsd(xmm2, xmm4); 2378 mulpd(xmm6, xmm0); 2379 mulsd(xmm3, xmm4); 2380 mulpd(xmm2, xmm0); 2381 mulpd(xmm0, xmm0); 2382 addpd(xmm5, Address(ebx, 2080)); 2383 mulsd(xmm4, Address(eax, 0)); 2384 addpd(xmm6, Address(ebx, 2048)); 2385 mulpd(xmm5, xmm0); 2386 movapd(xmm0, xmm3); 2387 addsd(xmm3, Address(eax, 8)); 2388 mulpd(xmm1, xmm7); 2389 movapd(xmm7, xmm4); 2390 addsd(xmm4, xmm3); 2391 addpd(xmm6, xmm5); 2392 movsd(xmm5, Address(eax, 8)); 2393 subsd(xmm5, xmm3); 2394 subsd(xmm3, xmm4); 2395 addsd(xmm1, Address(eax, 16)); 2396 mulpd(xmm6, xmm2); 2397 addsd(xmm5, xmm0); 2398 addsd(xmm3, xmm7); 2399 addsd(xmm1, xmm5); 2400 addsd(xmm1, xmm3); 2401 addsd(xmm1, xmm6); 2402 unpckhpd(xmm6, xmm6); 2403 addsd(xmm1, xmm6); 2404 addsd(xmm4, xmm1); 2405 movsd(Address(rsp, 0), xmm4); 2406 fld_d(Address(rsp, 0)); 2407 jmp(L_2TAG_PACKET_1_0_2); 2408 2409 bind(L_2TAG_PACKET_0_0_2); 2410 jcc(Assembler::greater, L_2TAG_PACKET_2_0_2); 2411 shrl(eax, 4); 2412 cmpl(eax, 268434685); 2413 jcc(Assembler::notEqual, L_2TAG_PACKET_3_0_2); 2414 movsd(Address(rsp, 0), xmm0); 2415 fld_d(Address(rsp, 0)); 2416 jmp(L_2TAG_PACKET_1_0_2); 2417 2418 bind(L_2TAG_PACKET_3_0_2); 2419 movsd(xmm3, Address(ebx, 2192)); 2420 mulsd(xmm3, xmm0); 2421 subsd(xmm3, xmm0); 2422 mulsd(xmm3, Address(ebx, 2208)); 2423 movsd(Address(rsp, 0), xmm0); 2424 fld_d(Address(rsp, 0)); 2425 jmp(L_2TAG_PACKET_1_0_2); 2426 2427 bind(L_2TAG_PACKET_2_0_2); 2428 movl(eax, Address(rsp, 132)); 2429 andl(eax, 2146435072); 2430 cmpl(eax, 2146435072); 2431 jcc(Assembler::equal, L_2TAG_PACKET_4_0_2); 2432 subl(rsp, 32); 2433 movsd(Address(rsp, 0), xmm0); 2434 lea(eax, Address(rsp, 40)); 2435 movl(Address(rsp, 8), eax); 2436 movl(eax, 2); 2437 movl(Address(rsp, 12), eax); 2438 call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_sin_cos_huge()))); 2439 addl(rsp, 32); 2440 fld_d(Address(rsp, 16)); 2441 jmp(L_2TAG_PACKET_1_0_2); 2442 bind(L_2TAG_PACKET_4_0_2); 2443 fld_d(Address(rsp, 128)); 2444 fmul_d(Address(ebx, 2240)); 2445 bind(L_2TAG_PACKET_1_0_2); 2446 movl(ebx, Address(rsp, 56)); 2447 } 2448 #endif