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