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
186ALIGNED_(16) juint StubRoutines::x86::_ONEHALF[] =
187{
188    0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
189};
190
191ALIGNED_(16) juint StubRoutines::x86::_P_2[] =
192{
193    0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
194};
195
196ALIGNED_(16) juint StubRoutines::x86::_SC_4[] =
197{
198    0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
199};
200
201ALIGNED_(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
308ALIGNED_(16) juint StubRoutines::x86::_SC_2[] =
309{
310    0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
311};
312
313ALIGNED_(16) juint StubRoutines::x86::_SC_3[] =
314{
315    0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
316};
317
318ALIGNED_(16) juint StubRoutines::x86::_SC_1[] =
319{
320    0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
321};
322
323ALIGNED_(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
336ALIGNED_(8) juint StubRoutines::x86::_PI_4[] =
337{
338    0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
339};
340
341ALIGNED_(8) juint StubRoutines::x86::_PI32INV[] =
342{
343    0x6dc9c883UL, 0x40245f30UL
344};
345
346ALIGNED_(8) juint _SHIFTER[] =
347{
348    0x00000000UL, 0x43380000UL
349};
350
351ALIGNED_(8) juint StubRoutines::x86::_SIGN_MASK[] =
352{
353    0x00000000UL, 0x80000000UL
354};
355
356ALIGNED_(8) juint StubRoutines::x86::_P_3[] =
357{
358    0x2e037073UL, 0x3b63198aUL
359};
360
361ALIGNED_(8) juint _ALL_ONES[] =
362{
363    0xffffffffUL, 0x3fefffffUL
364};
365
366ALIGNED_(8) juint _TWO_POW_55[] =
367{
368    0x00000000UL, 0x43600000UL
369};
370
371ALIGNED_(8) juint _TWO_POW_M55[] =
372{
373    0x00000000UL, 0x3c800000UL
374};
375
376ALIGNED_(8) juint StubRoutines::x86::_P_1[] =
377{
378    0x54400000UL, 0x3fb921fbUL
379};
380
381ALIGNED_(8) juint StubRoutines::x86::_NEG_ZERO[] =
382{
383    0x00000000UL, 0x80000000UL
384};
385
386void 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
856ALIGNED_(8) juint _zero_none[] =
857{
858    0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL
859};
860
861ALIGNED_(4) juint __4onpi_d[] =
862{
863    0x6dc9c883UL, 0x3ff45f30UL
864};
865
866ALIGNED_(4) juint _TWO_32H[] =
867{
868    0x00000000UL, 0x41f80000UL
869};
870
871ALIGNED_(4) juint _pi04_3d[] =
872{
873    0x54442d00UL, 0x3fe921fbUL, 0x98cc5180UL, 0x3ce84698UL, 0xcbb5bf6cUL,
874    0xb9dfc8f8UL
875};
876
877ALIGNED_(4) juint _pi04_5d[] =
878{
879    0x54400000UL, 0x3fe921fbUL, 0x1a600000UL, 0x3dc0b461UL, 0x2e000000UL,
880    0x3b93198aUL, 0x25200000UL, 0x396b839aUL, 0x533e63a0UL, 0x37027044UL
881};
882
883ALIGNED_(4) juint _SCALE[] =
884{
885    0x00000000UL, 0x32600000UL
886};
887
888ALIGNED_(4) juint _zeros[] =
889{
890    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL
891};
892
893ALIGNED_(4) juint _pi04_2d[] =
894{
895    0x54400000UL, 0x3fe921fbUL, 0x1a626331UL, 0x3dc0b461UL
896};
897
898ALIGNED_(4) juint _TWO_12H[] =
899{
900    0x00000000UL, 0x40b80000UL
901};
902
903ALIGNED_(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
1230void 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
1632ALIGNED_(16) juint StubRoutines::x86::_L_2il0floatpacket_0[] =
1633{
1634    0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
1635};
1636
1637ALIGNED_(16) juint StubRoutines::x86::_Pi4Inv[] =
1638{
1639    0x6dc9c883UL, 0x3ff45f30UL
1640};
1641
1642ALIGNED_(16) juint StubRoutines::x86::_Pi4x3[] =
1643{
1644    0x54443000UL, 0xbfe921fbUL, 0x3b39a000UL, 0x3d373dcbUL, 0xe0e68948UL,
1645    0xba845c06UL
1646};
1647
1648ALIGNED_(16) juint StubRoutines::x86::_Pi4x4[] =
1649{
1650    0x54400000UL, 0xbfe921fbUL, 0x1a600000UL, 0xbdc0b461UL, 0x2e000000UL,
1651    0xbb93198aUL, 0x252049c1UL, 0xb96b839aUL
1652};
1653
1654ALIGNED_(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
1663ALIGNED_(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
1672ALIGNED_(16) juint StubRoutines::x86::_ones[] =
1673{
1674    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xbff00000UL
1675};
1676
1677void 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
2200ALIGNED_(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
2319void 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
2449