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