1/*
2* Copyright (c) 2016, Intel Corporation.
3* Intel Math Library (LIBM) Source Code
4*
5* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6*
7* This code is free software; you can redistribute it and/or modify it
8* under the terms of the GNU General Public License version 2 only, as
9* published by the Free Software Foundation.
10*
11* This code is distributed in the hope that it will be useful, but WITHOUT
12* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14* version 2 for more details (a copy is included in the LICENSE file that
15* accompanied this code).
16*
17* You should have received a copy of the GNU General Public License version
18* 2 along with this work; if not, write to the Free Software Foundation,
19* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*
21* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22* or visit www.oracle.com if you need additional information or have any
23* questions.
24*
25*/
26
27#include "precompiled.hpp"
28#include "asm/assembler.hpp"
29#include "asm/assembler.inline.hpp"
30#include "runtime/stubRoutines.hpp"
31#include "macroAssembler_x86.hpp"
32
33#ifdef _MSC_VER
34#define ALIGNED_(x) __declspec(align(x))
35#else
36#define ALIGNED_(x) __attribute__ ((aligned(x)))
37#endif
38
39/******************************************************************************/
40//                     ALGORITHM DESCRIPTION - TAN()
41//                     ---------------------
42//
43// Polynomials coefficients and other constants.
44//
45// Note that in this algorithm, there is a different polynomial for
46// each breakpoint, so there are 32 sets of polynomial coefficients
47// as well as 32 instances of the other constants.
48//
49// The polynomial coefficients and constants are offset from the start
50// of the main block as follows:
51//
52//   0:  c8 | c0
53//  16:  c9 | c1
54//  32: c10 | c2
55//  48: c11 | c3
56//  64: c12 | c4
57//  80: c13 | c5
58//  96: c14 | c6
59// 112: c15 | c7
60// 128: T_hi
61// 136: T_lo
62// 144: Sigma
63// 152: T_hl
64// 160: Tau
65// 168: Mask
66// 176: (end of block)
67//
68// The total table size is therefore 5632 bytes.
69//
70// Note that c0 and c1 are always zero. We could try storing
71// other constants here, and just loading the low part of the
72// SIMD register in these cases, after ensuring the high part
73// is zero.
74//
75// The higher terms of the polynomial are computed in the *low*
76// part of the SIMD register. This is so we can overlap the
77// multiplication by r^8 and the unpacking of the other part.
78//
79// The constants are:
80// T_hi + T_lo = accurate constant term in power series
81// Sigma + T_hl = accurate coefficient of r in power series (Sigma=1 bit)
82// Tau = multiplier for the reciprocal, always -1 or 0
83//
84// The basic reconstruction formula using these constants is:
85//
86// High = tau * recip_hi + t_hi
87// Med = (sgn * r + t_hl * r)_hi
88// Low = (sgn * r + t_hl * r)_lo +
89//       tau * recip_lo + T_lo + (T_hl + sigma) * c + pol
90//
91// where pol = c0 + c1 * r + c2 * r^2 + ... + c15 * r^15
92//
93// (c0 = c1 = 0, but using them keeps SIMD regularity)
94//
95// We then do a compensated sum High + Med, add the low parts together
96// and then do the final sum.
97//
98// Here recip_hi + recip_lo is an accurate reciprocal of the remainder
99// modulo pi/2
100//
101// Special cases:
102//  tan(NaN) = quiet NaN, and raise invalid exception
103//  tan(INF) = NaN and raise invalid exception
104//  tan(+/-0) = +/-0
105//
106/******************************************************************************/
107
108#ifdef _LP64
109// The 64 bit code is at most SSE2 compliant
110ALIGNED_(16) juint _ONEHALF_tan[] =
111{
112    0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
113};
114
115ALIGNED_(16) juint _MUL16[] =
116{
117    0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
118};
119
120ALIGNED_(16) juint _sign_mask_tan[] =
121{
122    0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
123};
124
125ALIGNED_(16) juint _PI32INV_tan[] =
126{
127    0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
128};
129
130ALIGNED_(16) juint _P_1_tan[] =
131{
132    0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
133};
134
135ALIGNED_(16) juint _P_2_tan[] =
136{
137    0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
138};
139
140ALIGNED_(16) juint _P_3_tan[] =
141{
142    0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
143};
144
145ALIGNED_(16) juint _Ctable_tan[] =
146{
147    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x882c10faUL,
148    0x3f9664f4UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
149    0x00000000UL, 0x00000000UL, 0x55e6c23dUL, 0x3f8226e3UL, 0x55555555UL,
150    0x3fd55555UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
151    0x0e157de0UL, 0x3f6d6d3dUL, 0x11111111UL, 0x3fc11111UL, 0x00000000UL,
152    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x452b75e3UL, 0x3f57da36UL,
153    0x1ba1ba1cUL, 0x3faba1baUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
154    0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
155    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
156    0x3f953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
157    0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0x3f85ad63UL, 0xdc230b9bUL,
158    0x3fb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
159    0x77bb08baUL, 0x3f757c85UL, 0xb6247521UL, 0x3fb1381eUL, 0x5922170cUL,
160    0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0x3f64e391UL,
161    0x3e666320UL, 0x3fa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
162    0x3fafa8aeUL, 0x8c5b2da2UL, 0x3fb936bbUL, 0x4e88f7a5UL, 0x3c587d05UL,
163    0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
164    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x5a279ea3UL, 0x3faa3407UL,
165    0x00000000UL, 0x00000000UL, 0x432d65faUL, 0x3fa70153UL, 0x00000000UL,
166    0x00000000UL, 0x891a4602UL, 0x3f9d03efUL, 0xd62ca5f8UL, 0x3fca77d9UL,
167    0xb35f4628UL, 0x3f97a265UL, 0x433258faUL, 0x3fd8cf51UL, 0xb58fd909UL,
168    0x3f8f88e3UL, 0x01771ceaUL, 0x3fc2b154UL, 0xf3562f8eUL, 0x3f888f57UL,
169    0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL, 0x3f80f44cUL, 0x214368e9UL,
170    0x3fb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL, 0x172dbbf0UL, 0x3fb6cb8eUL,
171    0xe0553158UL, 0x3fc975f5UL, 0x593fe814UL, 0x3c2ef5d3UL, 0x00000000UL,
172    0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL, 0x00000000UL, 0x00000000UL,
173    0x00000000UL, 0x00000000UL, 0x9314533eUL, 0x3fbb8ec5UL, 0x00000000UL,
174    0x00000000UL, 0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL,
175    0xdcb427fdUL, 0x3fb13950UL, 0xd87ab0bbUL, 0x3fd5335eUL, 0xce0ae8a5UL,
176    0x3fabb382UL, 0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0x3fa552f1UL,
177    0x59f21a6dUL, 0x3fd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL,
178    0x3fd0576cUL, 0x8f2c2950UL, 0x3f9a4898UL, 0xc0b3f22cUL, 0x3fc59462UL,
179    0x1883a4b8UL, 0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL,
180    0x3fd36a08UL, 0x1dce993dUL, 0xbc6d704dUL, 0x00000000UL, 0x3ff00000UL,
181    0x2b82ab63UL, 0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
182    0x00000000UL, 0x56f37042UL, 0x3fccfc56UL, 0x00000000UL, 0x00000000UL,
183    0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL, 0x3d0e7c5dUL,
184    0x3fc50533UL, 0x9bed9b2eUL, 0x3fdf0ed9UL, 0x5fe7c47cUL, 0x3fc1f250UL,
185    0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0x3fbe5c71UL, 0x86362c20UL,
186    0x3fda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL, 0x3fd911bdUL,
187    0xb56658beUL, 0x3fb5e4c7UL, 0x93a2fd76UL, 0x3fd3c092UL, 0xda271794UL,
188    0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL, 0x3fda8279UL,
189    0xb68c1467UL, 0x3c708b2fUL, 0x00000000UL, 0x3ff00000UL, 0x980c4337UL,
190    0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
191    0xcc03e501UL, 0x3fdff10fUL, 0x00000000UL, 0x00000000UL, 0x44a4e845UL,
192    0x3fddb63bUL, 0x00000000UL, 0x00000000UL, 0x3768ad9fUL, 0x3fdb72a4UL,
193    0x3dd01ccaUL, 0x3fe5fdb9UL, 0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL,
194    0x3fe977f9UL, 0xd013b3abUL, 0x3fd78ca3UL, 0xbf0bf914UL, 0x3fe4f192UL,
195    0x4d53e730UL, 0x3fd5d060UL, 0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL,
196    0x3fd4322aUL, 0x5936a835UL, 0x3fe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL,
197    0xef478605UL, 0x3fe1659eUL, 0x190834ecUL, 0x3fe11ab7UL, 0xcdb625eaUL,
198    0xbc8e564bUL, 0x00000000UL, 0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL,
199    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
200    0x3ff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
201    0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0x3ff3972eUL, 0xe93463bdUL,
202    0x3feeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
203    0xa04e8ea3UL, 0x3ff4541aUL, 0x386accd3UL, 0x3ff1369eUL, 0x222a66ddUL,
204    0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0x3ff5178fUL,
205    0xddaa0031UL, 0x3ff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
206    0x3ff29311UL, 0x2ab7f990UL, 0x3fe561b8UL, 0x209c7df1UL, 0x3c87a8c5UL,
207    0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
208    0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc7ab4d5aUL, 0x40085e24UL,
209    0x00000000UL, 0x00000000UL, 0xe93ea75dUL, 0x400b963dUL, 0x00000000UL,
210    0x00000000UL, 0x94a7f25aUL, 0x400f37e2UL, 0x4b6261cbUL, 0x3ff5f984UL,
211    0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL, 0x3ffaf5a5UL, 0x7f2ce8e3UL,
212    0x4013fe8bUL, 0xfe8e54faUL, 0x3ffd7334UL, 0x670d618dUL, 0x4016a10cUL,
213    0x4db97058UL, 0x4000e012UL, 0x24df44ddUL, 0x40199c5fUL, 0x697d6eceUL,
214    0x4003006eUL, 0x83298b82UL, 0x401cfc4dUL, 0x19d490d6UL, 0x40058c19UL,
215    0x2ae42850UL, 0x3fea4300UL, 0x118e20e6UL, 0xbc7a6db8UL, 0x00000000UL,
216    0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL, 0x00000000UL, 0x00000000UL,
217    0x00000000UL, 0x00000000UL, 0x65965966UL, 0x40219659UL, 0x00000000UL,
218    0x00000000UL, 0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL,
219    0x83cd3723UL, 0x402c8342UL, 0x00000000UL, 0x40000000UL, 0x55e6c23dUL,
220    0x403226e3UL, 0x55555555UL, 0x40055555UL, 0x34451939UL, 0x40371c96UL,
221    0xaaaaaaabUL, 0x400aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL,
222    0x40111111UL, 0xa738201fUL, 0x4042bbceUL, 0x05b05b06UL, 0x4015b05bUL,
223    0x452b75e3UL, 0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL,
224    0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL,
225    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
226    0x00000000UL, 0x4f48b8d3UL, 0xbf33eaf9UL, 0x00000000UL, 0x00000000UL,
227    0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL, 0xd0258911UL,
228    0xbf0abaf3UL, 0x23e49fe9UL, 0xbfab5a8cUL, 0x2d53222eUL, 0x3ef60d15UL,
229    0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0xbee1d3b5UL, 0xdbf93b8eUL,
230    0xbf84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL, 0x3f743924UL,
231    0x794a8297UL, 0xbeb7b7b9UL, 0xe015f797UL, 0xbf5d41f5UL, 0xe41a4a56UL,
232    0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL, 0xbfce49ceUL,
233    0x8c743719UL, 0x3d1eb860UL, 0x00000000UL, 0x00000000UL, 0x1b4863cfUL,
234    0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
235    0x535ad890UL, 0xbf2b9320UL, 0x00000000UL, 0x00000000UL, 0x018fdf1fUL,
236    0x3f16d61dUL, 0x00000000UL, 0x00000000UL, 0x0359f1beUL, 0xbf0139e4UL,
237    0xa4317c6dUL, 0xbfa67e17UL, 0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL,
238    0x3f9f455bUL, 0x51ccf238UL, 0xbed55317UL, 0xf437b9acUL, 0xbf804beeUL,
239    0xc791a2b5UL, 0x3ec0e993UL, 0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL,
240    0xbeaa48a2UL, 0x0a268358UL, 0xbf55a443UL, 0xdfd978e4UL, 0x3e94b61fUL,
241    0xd7767a58UL, 0x3f431806UL, 0x2aea0000UL, 0xbfc9bbe8UL, 0x7723ea61UL,
242    0xbd3a2369UL, 0x00000000UL, 0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL,
243    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
244    0xbf231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
245    0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0xbef66191UL, 0x848a46c6UL,
246    0xbfa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
247    0xfdd299efUL, 0xbec9dd1aUL, 0x3f8dbaafUL, 0xbf793363UL, 0x309fc6eaUL,
248    0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0xbe9dae11UL,
249    0x3e5c67b3UL, 0xbf4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
250    0x3f3d1eb1UL, 0x29cfc000UL, 0xbfc549ceUL, 0xbf159358UL, 0xbd397b33UL,
251    0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
252    0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x7d98a556UL, 0xbf1a3958UL,
253    0x00000000UL, 0x00000000UL, 0x9d88dc01UL, 0x3f0704c2UL, 0x00000000UL,
254    0x00000000UL, 0x73742a2bUL, 0xbeed054aUL, 0x58844587UL, 0xbf9c2a13UL,
255    0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL, 0x3f9a48f4UL, 0xa8dc9888UL,
256    0xbebf8939UL, 0xaad4b5b8UL, 0xbf72f746UL, 0x9102efa1UL, 0x3ea88f82UL,
257    0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL, 0xbe90f456UL, 0x741fb4edUL,
258    0xbf46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL, 0xca89ff3fUL, 0x3f36db70UL,
259    0xa8a2a000UL, 0xbfc0ee13UL, 0x3da24be1UL, 0xbd338b9fUL, 0x00000000UL,
260    0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL, 0x00000000UL, 0x3ff00000UL,
261    0x00000000UL, 0xfffffff8UL, 0x1a154b97UL, 0xbf116b01UL, 0x00000000UL,
262    0x00000000UL, 0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL,
263    0xb93820c8UL, 0xbee264d4UL, 0xbb6cbb18UL, 0xbf94ab8cUL, 0x888d4d92UL,
264    0x3ed0568bUL, 0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0xbeb2f950UL,
265    0x22cf9f74UL, 0xbf6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL,
266    0x3f64aad7UL, 0x637b73afUL, 0xbe83487cUL, 0xe522591aUL, 0xbf3fc092UL,
267    0xa158e8bcUL, 0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL,
268    0xbfb9477fUL, 0xc2c2d2bcUL, 0xbd135ef9UL, 0x00000000UL, 0x00000000UL,
269    0xf2fdb123UL, 0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
270    0xfffffff8UL, 0xc41acb64UL, 0xbf05448dUL, 0x00000000UL, 0x00000000UL,
271    0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL, 0x9e42962dUL,
272    0xbed5aea5UL, 0x2579f8efUL, 0xbf8b2398UL, 0x288a1ed9UL, 0x3ec81441UL,
273    0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0xbea57cd3UL, 0x5766336fUL,
274    0xbf617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL, 0x3f62c646UL,
275    0x6b8fb29cUL, 0xbe74e3a3UL, 0xdc4c0409UL, 0xbf33f952UL, 0x9bffe365UL,
276    0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL, 0xbfb0cc62UL,
277    0x016b907fUL, 0xbd119cbcUL, 0x00000000UL, 0x00000000UL, 0xe6b9d8faUL,
278    0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
279    0x5daf22a6UL, 0xbef429d7UL, 0x00000000UL, 0x00000000UL, 0x06bca545UL,
280    0x3ef7a27dUL, 0x00000000UL, 0x00000000UL, 0x7211c19aUL, 0xbec41c3eUL,
281    0x956ed53eUL, 0xbf7ae3f4UL, 0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL,
282    0x3f96f713UL, 0x36661e6cUL, 0xbe936e09UL, 0x506f9381UL, 0xbf5122e8UL,
283    0xcb6dd43fUL, 0x3e9041b9UL, 0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL,
284    0xbe625a8aUL, 0xe5a0e9dcUL, 0xbf23499dUL, 0x110384ddUL, 0x3e5b1c2cUL,
285    0x68d43db6UL, 0x3f2cb899UL, 0x6ecac000UL, 0xbfa0c414UL, 0xcd7dd58cUL,
286    0x3d13500fUL, 0x00000000UL, 0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL,
287    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x00000000UL,
288    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2bf70ebeUL, 0x3ef66a8fUL,
289    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
290    0x00000000UL, 0xd644267fUL, 0x3ec22805UL, 0x16c16c17UL, 0x3f96c16cUL,
291    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc4e09162UL,
292    0x3e8d6db2UL, 0xbc011567UL, 0x3f61566aUL, 0x00000000UL, 0x00000000UL,
293    0x00000000UL, 0x00000000UL, 0x1f79955cUL, 0x3e57da4eUL, 0x9334ef0bUL,
294    0x3f2bbd77UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
295    0x00000000UL, 0x00000000UL, 0x55555555UL, 0x3fd55555UL, 0x00000000UL,
296    0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x5daf22a6UL, 0x3ef429d7UL,
297    0x00000000UL, 0x00000000UL, 0x06bca545UL, 0x3ef7a27dUL, 0x00000000UL,
298    0x00000000UL, 0x7211c19aUL, 0x3ec41c3eUL, 0x956ed53eUL, 0x3f7ae3f4UL,
299    0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL, 0x3f96f713UL, 0x36661e6cUL,
300    0x3e936e09UL, 0x506f9381UL, 0x3f5122e8UL, 0xcb6dd43fUL, 0x3e9041b9UL,
301    0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL, 0x3e625a8aUL, 0xe5a0e9dcUL,
302    0x3f23499dUL, 0x110384ddUL, 0x3e5b1c2cUL, 0x68d43db6UL, 0x3f2cb899UL,
303    0x6ecac000UL, 0x3fa0c414UL, 0xcd7dd58cUL, 0xbd13500fUL, 0x00000000UL,
304    0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL, 0x00000000UL, 0x3ff00000UL,
305    0x00000000UL, 0xfffffff8UL, 0xc41acb64UL, 0x3f05448dUL, 0x00000000UL,
306    0x00000000UL, 0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL,
307    0x9e42962dUL, 0x3ed5aea5UL, 0x2579f8efUL, 0x3f8b2398UL, 0x288a1ed9UL,
308    0x3ec81441UL, 0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0x3ea57cd3UL,
309    0x5766336fUL, 0x3f617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL,
310    0x3f62c646UL, 0x6b8fb29cUL, 0x3e74e3a3UL, 0xdc4c0409UL, 0x3f33f952UL,
311    0x9bffe365UL, 0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL,
312    0x3fb0cc62UL, 0x016b907fUL, 0x3d119cbcUL, 0x00000000UL, 0x00000000UL,
313    0xe6b9d8faUL, 0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
314    0xfffffff8UL, 0x1a154b97UL, 0x3f116b01UL, 0x00000000UL, 0x00000000UL,
315    0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL, 0xb93820c8UL,
316    0x3ee264d4UL, 0xbb6cbb18UL, 0x3f94ab8cUL, 0x888d4d92UL, 0x3ed0568bUL,
317    0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0x3eb2f950UL, 0x22cf9f74UL,
318    0x3f6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL, 0x3f64aad7UL,
319    0x637b73afUL, 0x3e83487cUL, 0xe522591aUL, 0x3f3fc092UL, 0xa158e8bcUL,
320    0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL, 0x3fb9477fUL,
321    0xc2c2d2bcUL, 0x3d135ef9UL, 0x00000000UL, 0x00000000UL, 0xf2fdb123UL,
322    0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
323    0x7d98a556UL, 0x3f1a3958UL, 0x00000000UL, 0x00000000UL, 0x9d88dc01UL,
324    0x3f0704c2UL, 0x00000000UL, 0x00000000UL, 0x73742a2bUL, 0x3eed054aUL,
325    0x58844587UL, 0x3f9c2a13UL, 0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL,
326    0x3f9a48f4UL, 0xa8dc9888UL, 0x3ebf8939UL, 0xaad4b5b8UL, 0x3f72f746UL,
327    0x9102efa1UL, 0x3ea88f82UL, 0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL,
328    0x3e90f456UL, 0x741fb4edUL, 0x3f46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL,
329    0xca89ff3fUL, 0x3f36db70UL, 0xa8a2a000UL, 0x3fc0ee13UL, 0x3da24be1UL,
330    0x3d338b9fUL, 0x00000000UL, 0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL,
331    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
332    0x3f231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
333    0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0x3ef66191UL, 0x848a46c6UL,
334    0x3fa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
335    0xfdd299efUL, 0x3ec9dd1aUL, 0x3f8dbaafUL, 0x3f793363UL, 0x309fc6eaUL,
336    0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0x3e9dae11UL,
337    0x3e5c67b3UL, 0x3f4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
338    0x3f3d1eb1UL, 0x29cfc000UL, 0x3fc549ceUL, 0xbf159358UL, 0x3d397b33UL,
339    0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
340    0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x535ad890UL, 0x3f2b9320UL,
341    0x00000000UL, 0x00000000UL, 0x018fdf1fUL, 0x3f16d61dUL, 0x00000000UL,
342    0x00000000UL, 0x0359f1beUL, 0x3f0139e4UL, 0xa4317c6dUL, 0x3fa67e17UL,
343    0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL, 0x3f9f455bUL, 0x51ccf238UL,
344    0x3ed55317UL, 0xf437b9acUL, 0x3f804beeUL, 0xc791a2b5UL, 0x3ec0e993UL,
345    0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL, 0x3eaa48a2UL, 0x0a268358UL,
346    0x3f55a443UL, 0xdfd978e4UL, 0x3e94b61fUL, 0xd7767a58UL, 0x3f431806UL,
347    0x2aea0000UL, 0x3fc9bbe8UL, 0x7723ea61UL, 0x3d3a2369UL, 0x00000000UL,
348    0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL, 0x00000000UL, 0x3ff00000UL,
349    0x00000000UL, 0xfffffff8UL, 0x4f48b8d3UL, 0x3f33eaf9UL, 0x00000000UL,
350    0x00000000UL, 0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL,
351    0xd0258911UL, 0x3f0abaf3UL, 0x23e49fe9UL, 0x3fab5a8cUL, 0x2d53222eUL,
352    0x3ef60d15UL, 0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0x3ee1d3b5UL,
353    0xdbf93b8eUL, 0x3f84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL,
354    0x3f743924UL, 0x794a8297UL, 0x3eb7b7b9UL, 0xe015f797UL, 0x3f5d41f5UL,
355    0xe41a4a56UL, 0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL,
356    0x3fce49ceUL, 0x8c743719UL, 0xbd1eb860UL, 0x00000000UL, 0x00000000UL,
357    0x1b4863cfUL, 0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
358    0xfffffff8UL, 0x65965966UL, 0xc0219659UL, 0x00000000UL, 0x00000000UL,
359    0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL, 0x83cd3723UL,
360    0xc02c8342UL, 0x00000000UL, 0xc0000000UL, 0x55e6c23dUL, 0x403226e3UL,
361    0x55555555UL, 0x40055555UL, 0x34451939UL, 0xc0371c96UL, 0xaaaaaaabUL,
362    0xc00aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL, 0x40111111UL,
363    0xa738201fUL, 0xc042bbceUL, 0x05b05b06UL, 0xc015b05bUL, 0x452b75e3UL,
364    0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL, 0xbff00000UL,
365    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL, 0x00000000UL,
366    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
367    0xc7ab4d5aUL, 0xc0085e24UL, 0x00000000UL, 0x00000000UL, 0xe93ea75dUL,
368    0x400b963dUL, 0x00000000UL, 0x00000000UL, 0x94a7f25aUL, 0xc00f37e2UL,
369    0x4b6261cbUL, 0xbff5f984UL, 0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL,
370    0x3ffaf5a5UL, 0x7f2ce8e3UL, 0xc013fe8bUL, 0xfe8e54faUL, 0xbffd7334UL,
371    0x670d618dUL, 0x4016a10cUL, 0x4db97058UL, 0x4000e012UL, 0x24df44ddUL,
372    0xc0199c5fUL, 0x697d6eceUL, 0xc003006eUL, 0x83298b82UL, 0x401cfc4dUL,
373    0x19d490d6UL, 0x40058c19UL, 0x2ae42850UL, 0xbfea4300UL, 0x118e20e6UL,
374    0x3c7a6db8UL, 0x00000000UL, 0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL,
375    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
376    0xbff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
377    0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0xbff3972eUL, 0xe93463bdUL,
378    0xbfeeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
379    0xa04e8ea3UL, 0xbff4541aUL, 0x386accd3UL, 0xbff1369eUL, 0x222a66ddUL,
380    0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0xbff5178fUL,
381    0xddaa0031UL, 0xbff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
382    0x3ff29311UL, 0x2ab7f990UL, 0xbfe561b8UL, 0x209c7df1UL, 0xbc87a8c5UL,
383    0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
384    0x00000000UL, 0x00000000UL, 0x00000000UL, 0xcc03e501UL, 0xbfdff10fUL,
385    0x00000000UL, 0x00000000UL, 0x44a4e845UL, 0x3fddb63bUL, 0x00000000UL,
386    0x00000000UL, 0x3768ad9fUL, 0xbfdb72a4UL, 0x3dd01ccaUL, 0xbfe5fdb9UL,
387    0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL, 0x3fe977f9UL, 0xd013b3abUL,
388    0xbfd78ca3UL, 0xbf0bf914UL, 0xbfe4f192UL, 0x4d53e730UL, 0x3fd5d060UL,
389    0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL, 0xbfd4322aUL, 0x5936a835UL,
390    0xbfe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL, 0xef478605UL, 0x3fe1659eUL,
391    0x190834ecUL, 0xbfe11ab7UL, 0xcdb625eaUL, 0x3c8e564bUL, 0x00000000UL,
392    0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL, 0x00000000UL, 0x00000000UL,
393    0x00000000UL, 0x00000000UL, 0x56f37042UL, 0xbfccfc56UL, 0x00000000UL,
394    0x00000000UL, 0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL,
395    0x3d0e7c5dUL, 0xbfc50533UL, 0x9bed9b2eUL, 0xbfdf0ed9UL, 0x5fe7c47cUL,
396    0x3fc1f250UL, 0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0xbfbe5c71UL,
397    0x86362c20UL, 0xbfda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL,
398    0x3fd911bdUL, 0xb56658beUL, 0xbfb5e4c7UL, 0x93a2fd76UL, 0xbfd3c092UL,
399    0xda271794UL, 0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL,
400    0xbfda8279UL, 0xb68c1467UL, 0xbc708b2fUL, 0x00000000UL, 0x3ff00000UL,
401    0x980c4337UL, 0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
402    0x00000000UL, 0x9314533eUL, 0xbfbb8ec5UL, 0x00000000UL, 0x00000000UL,
403    0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL, 0xdcb427fdUL,
404    0xbfb13950UL, 0xd87ab0bbUL, 0xbfd5335eUL, 0xce0ae8a5UL, 0x3fabb382UL,
405    0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0xbfa552f1UL, 0x59f21a6dUL,
406    0xbfd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL, 0x3fd0576cUL,
407    0x8f2c2950UL, 0xbf9a4898UL, 0xc0b3f22cUL, 0xbfc59462UL, 0x1883a4b8UL,
408    0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL, 0xbfd36a08UL,
409    0x1dce993dUL, 0x3c6d704dUL, 0x00000000UL, 0x3ff00000UL, 0x2b82ab63UL,
410    0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
411    0x5a279ea3UL, 0xbfaa3407UL, 0x00000000UL, 0x00000000UL, 0x432d65faUL,
412    0x3fa70153UL, 0x00000000UL, 0x00000000UL, 0x891a4602UL, 0xbf9d03efUL,
413    0xd62ca5f8UL, 0xbfca77d9UL, 0xb35f4628UL, 0x3f97a265UL, 0x433258faUL,
414    0x3fd8cf51UL, 0xb58fd909UL, 0xbf8f88e3UL, 0x01771ceaUL, 0xbfc2b154UL,
415    0xf3562f8eUL, 0x3f888f57UL, 0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL,
416    0xbf80f44cUL, 0x214368e9UL, 0xbfb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL,
417    0x172dbbf0UL, 0x3fb6cb8eUL, 0xe0553158UL, 0xbfc975f5UL, 0x593fe814UL,
418    0xbc2ef5d3UL, 0x00000000UL, 0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL,
419    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
420    0xbf953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
421    0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0xbf85ad63UL, 0xdc230b9bUL,
422    0xbfb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
423    0x77bb08baUL, 0xbf757c85UL, 0xb6247521UL, 0xbfb1381eUL, 0x5922170cUL,
424    0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0xbf64e391UL,
425    0x3e666320UL, 0xbfa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
426    0x3fafa8aeUL, 0x8c5b2da2UL, 0xbfb936bbUL, 0x4e88f7a5UL, 0xbc587d05UL,
427    0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
428    0x00000000UL, 0x00000000UL, 0x00000000UL
429};
430
431ALIGNED_(16) juint _MASK_35_tan[] =
432{
433    0xfffc0000UL, 0xffffffffUL, 0x00000000UL, 0x00000000UL
434};
435
436ALIGNED_(16) juint _Q_11_tan[] =
437{
438    0xb8fe4d77UL, 0x3f82609aUL
439};
440
441ALIGNED_(16) juint _Q_9_tan[] =
442{
443    0xbf847a43UL, 0x3f9664a0UL
444};
445
446ALIGNED_(16) juint _Q_7_tan[] =
447{
448    0x52c4c8abUL, 0x3faba1baUL
449};
450
451ALIGNED_(16) juint _Q_5_tan[] =
452{
453    0x11092746UL, 0x3fc11111UL
454};
455
456ALIGNED_(16) juint _Q_3_tan[] =
457{
458    0x55555612UL, 0x3fd55555UL
459};
460
461ALIGNED_(16) juint _PI_INV_TABLE_tan[] =
462{
463    0x00000000UL, 0x00000000UL, 0xa2f9836eUL, 0x4e441529UL, 0xfc2757d1UL,
464    0xf534ddc0UL, 0xdb629599UL, 0x3c439041UL, 0xfe5163abUL, 0xdebbc561UL,
465    0xb7246e3aUL, 0x424dd2e0UL, 0x06492eeaUL, 0x09d1921cUL, 0xfe1deb1cUL,
466    0xb129a73eUL, 0xe88235f5UL, 0x2ebb4484UL, 0xe99c7026UL, 0xb45f7e41UL,
467    0x3991d639UL, 0x835339f4UL, 0x9c845f8bUL, 0xbdf9283bUL, 0x1ff897ffUL,
468    0xde05980fUL, 0xef2f118bUL, 0x5a0a6d1fUL, 0x6d367ecfUL, 0x27cb09b7UL,
469    0x4f463f66UL, 0x9e5fea2dUL, 0x7527bac7UL, 0xebe5f17bUL, 0x3d0739f7UL,
470    0x8a5292eaUL, 0x6bfb5fb1UL, 0x1f8d5d08UL, 0x56033046UL, 0xfc7b6babUL,
471    0xf0cfbc21UL
472};
473
474ALIGNED_(8) juint _PI_4_tan[] =
475{
476    0x00000000UL, 0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
477};
478
479ALIGNED_(8) juint _QQ_2_tan[] =
480{
481    0x676733afUL, 0x3d32e7b9UL
482};
483
484ALIGNED_(8) juint _ONE_tan[] =
485{
486    0x00000000UL, 0x3ff00000UL
487};
488
489ALIGNED_(8) juint _TWO_POW_55_tan[] =
490{
491    0x00000000UL, 0x43600000UL
492};
493
494ALIGNED_(4) juint _TWO_POW_M55_tan[] =
495{
496    0x00000000UL, 0x3c800000UL
497};
498
499ALIGNED_(4) juint _NEG_ZERO_tan[] =
500{
501    0x00000000UL, 0x80000000UL
502};
503
504void MacroAssembler::fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register r8, Register r9, Register r10, Register r11) {
505
506  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;
507  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;
508  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;
509  Label L_2TAG_PACKET_12_0_1, L_2TAG_PACKET_13_0_1, L_2TAG_PACKET_14_0_1, B1_2, B1_3, B1_4, B1_5, start;
510
511  address ONEHALF = (address)_ONEHALF_tan;
512  address MUL16 = (address)_MUL16;
513  address sign_mask = (address)_sign_mask_tan;
514  address PI32INV = (address)_PI32INV_tan;
515  address P_1 = (address)_P_1_tan;
516  address P_2 = (address)_P_2_tan;
517  address P_3 = (address)_P_3_tan;
518  address Ctable = (address)_Ctable_tan;
519  address MASK_35 = (address)_MASK_35_tan;
520  address Q_11 = (address)_Q_11_tan;
521  address Q_9 = (address)_Q_9_tan;
522  address Q_7 = (address)_Q_7_tan;
523  address Q_5 = (address)_Q_5_tan;
524  address Q_3 = (address)_Q_3_tan;
525  address PI_INV_TABLE = (address)_PI_INV_TABLE_tan;
526  address PI_4 = (address)_PI_4_tan;
527  address QQ_2 = (address)_QQ_2_tan;
528  address ONE = (address)_ONE_tan;
529  address TWO_POW_55 = (address)_TWO_POW_55_tan;
530  address TWO_POW_M55 = (address)_TWO_POW_M55_tan;
531  address NEG_ZERO = (address)_NEG_ZERO_tan;
532
533  bind(start);
534  push(rbx);
535  subq(rsp, 16);
536  movsd(Address(rsp, 8), xmm0);
537
538  bind(B1_2);
539  pextrw(eax, xmm0, 3);
540  andl(eax, 32767);
541  subl(eax, 16314);
542  cmpl(eax, 270);
543  jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
544  movdqu(xmm5, ExternalAddress(ONEHALF));    //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
545  movdqu(xmm6, ExternalAddress(MUL16));    //0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
546  unpcklpd(xmm0, xmm0);
547  movdqu(xmm4, ExternalAddress(sign_mask));    //0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
548  andpd(xmm4, xmm0);
549  movdqu(xmm1, ExternalAddress(PI32INV));    //0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
550  mulpd(xmm1, xmm0);
551  por(xmm5, xmm4);
552  addpd(xmm1, xmm5);
553  movdqu(xmm7, xmm1);
554  unpckhpd(xmm7, xmm7);
555  cvttsd2sil(edx, xmm7);
556  cvttpd2dq(xmm1, xmm1);
557  cvtdq2pd(xmm1, xmm1);
558  mulpd(xmm1, xmm6);
559  movdqu(xmm3, ExternalAddress(P_1));    //0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
560  movq(xmm5, ExternalAddress(QQ_2));    //0x676733afUL, 0x3d32e7b9UL
561  addq(rdx, 469248);
562  movdqu(xmm4, ExternalAddress(P_2));    //0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
563  mulpd(xmm3, xmm1);
564  andq(rdx, 31);
565  mulsd(xmm5, xmm1);
566  movq(rcx, rdx);
567  mulpd(xmm4, xmm1);
568  shlq(rcx, 1);
569  subpd(xmm0, xmm3);
570  mulpd(xmm1, ExternalAddress(P_3));    //0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
571  addq(rdx, rcx);
572  shlq(rcx, 2);
573  addq(rdx, rcx);
574  addsd(xmm5, xmm0);
575  movdqu(xmm2, xmm0);
576  subpd(xmm0, xmm4);
577  movq(xmm6, ExternalAddress(ONE));    //0x00000000UL, 0x3ff00000UL
578  shlq(rdx, 4);
579  lea(rax, ExternalAddress(Ctable));
580  andpd(xmm5, ExternalAddress(MASK_35));    //0xfffc0000UL, 0xffffffffUL, 0x00000000UL, 0x00000000UL
581  movdqu(xmm3, xmm0);
582  addq(rax, rdx);
583  subpd(xmm2, xmm0);
584  unpckhpd(xmm0, xmm0);
585  divsd(xmm6, xmm5);
586  subpd(xmm2, xmm4);
587  movdqu(xmm7, Address(rax, 16));
588  subsd(xmm3, xmm5);
589  mulpd(xmm7, xmm0);
590  subpd(xmm2, xmm1);
591  movdqu(xmm1, Address(rax, 48));
592  mulpd(xmm1, xmm0);
593  movdqu(xmm4, Address(rax, 96));
594  mulpd(xmm4, xmm0);
595  addsd(xmm2, xmm3);
596  movdqu(xmm3, xmm0);
597  mulpd(xmm0, xmm0);
598  addpd(xmm7, Address(rax, 0));
599  addpd(xmm1, Address(rax, 32));
600  mulpd(xmm1, xmm0);
601  addpd(xmm4, Address(rax, 80));
602  addpd(xmm7, xmm1);
603  movdqu(xmm1, Address(rax, 112));
604  mulpd(xmm1, xmm0);
605  mulpd(xmm0, xmm0);
606  addpd(xmm4, xmm1);
607  movdqu(xmm1, Address(rax, 64));
608  mulpd(xmm1, xmm0);
609  addpd(xmm7, xmm1);
610  movdqu(xmm1, xmm3);
611  mulpd(xmm3, xmm0);
612  mulsd(xmm0, xmm0);
613  mulpd(xmm1, Address(rax, 144));
614  mulpd(xmm4, xmm3);
615  movdqu(xmm3, xmm1);
616  addpd(xmm7, xmm4);
617  movdqu(xmm4, xmm1);
618  mulsd(xmm0, xmm7);
619  unpckhpd(xmm7, xmm7);
620  addsd(xmm0, xmm7);
621  unpckhpd(xmm1, xmm1);
622  addsd(xmm3, xmm1);
623  subsd(xmm4, xmm3);
624  addsd(xmm1, xmm4);
625  movdqu(xmm4, xmm2);
626  movq(xmm7, Address(rax, 144));
627  unpckhpd(xmm2, xmm2);
628  addsd(xmm7, Address(rax, 152));
629  mulsd(xmm7, xmm2);
630  addsd(xmm7, Address(rax, 136));
631  addsd(xmm7, xmm1);
632  addsd(xmm0, xmm7);
633  movq(xmm7, ExternalAddress(ONE));    //0x00000000UL, 0x3ff00000UL
634  mulsd(xmm4, xmm6);
635  movq(xmm2, Address(rax, 168));
636  andpd(xmm2, xmm6);
637  mulsd(xmm5, xmm2);
638  mulsd(xmm6, Address(rax, 160));
639  subsd(xmm7, xmm5);
640  subsd(xmm2, Address(rax, 128));
641  subsd(xmm7, xmm4);
642  mulsd(xmm7, xmm6);
643  movdqu(xmm4, xmm3);
644  subsd(xmm3, xmm2);
645  addsd(xmm2, xmm3);
646  subsd(xmm4, xmm2);
647  addsd(xmm0, xmm4);
648  subsd(xmm0, xmm7);
649  addsd(xmm0, xmm3);
650  jmp(B1_4);
651
652  bind(L_2TAG_PACKET_0_0_1);
653  jcc(Assembler::greater, L_2TAG_PACKET_1_0_1);
654  pextrw(eax, xmm0, 3);
655  movl(edx, eax);
656  andl(eax, 32752);
657  jcc(Assembler::equal, L_2TAG_PACKET_2_0_1);
658  andl(edx, 32767);
659  cmpl(edx, 15904);
660  jcc(Assembler::below, L_2TAG_PACKET_3_0_1);
661  movdqu(xmm2, xmm0);
662  movdqu(xmm3, xmm0);
663  movq(xmm1, ExternalAddress(Q_11));    //0xb8fe4d77UL, 0x3f82609aUL
664  mulsd(xmm2, xmm0);
665  mulsd(xmm3, xmm2);
666  mulsd(xmm1, xmm2);
667  addsd(xmm1, ExternalAddress(Q_9));    //0xbf847a43UL, 0x3f9664a0UL
668  mulsd(xmm1, xmm2);
669  addsd(xmm1, ExternalAddress(Q_7));    //0x52c4c8abUL, 0x3faba1baUL
670  mulsd(xmm1, xmm2);
671  addsd(xmm1, ExternalAddress(Q_5));    //0x11092746UL, 0x3fc11111UL
672  mulsd(xmm1, xmm2);
673  addsd(xmm1, ExternalAddress(Q_3));    //0x55555612UL, 0x3fd55555UL
674  mulsd(xmm1, xmm3);
675  addsd(xmm0, xmm1);
676  jmp(B1_4);
677
678  bind(L_2TAG_PACKET_3_0_1);
679  movq(xmm3, ExternalAddress(TWO_POW_55));    //0x00000000UL, 0x43600000UL
680  mulsd(xmm3, xmm0);
681  addsd(xmm0, xmm3);
682  mulsd(xmm0, ExternalAddress(TWO_POW_M55));    //0x00000000UL, 0x3c800000UL
683  jmp(B1_4);
684
685  bind(L_2TAG_PACKET_2_0_1);
686  movdqu(xmm1, xmm0);
687  mulsd(xmm1, xmm1);
688  jmp(B1_4);
689
690  bind(L_2TAG_PACKET_1_0_1);
691  pextrw(eax, xmm0, 3);
692  andl(eax, 32752);
693  cmpl(eax, 32752);
694  jcc(Assembler::equal, L_2TAG_PACKET_4_0_1);
695  pextrw(ecx, xmm0, 3);
696  andl(ecx, 32752);
697  subl(ecx, 16224);
698  shrl(ecx, 7);
699  andl(ecx, 65532);
700  lea(r11, ExternalAddress(PI_INV_TABLE));
701  addq(rcx, r11);
702  movdq(rax, xmm0);
703  movl(r10, Address(rcx, 20));
704  movl(r8, Address(rcx, 24));
705  movl(edx, eax);
706  shrq(rax, 21);
707  orl(eax, INT_MIN);
708  shrl(eax, 11);
709  movl(r9, r10);
710  imulq(r10, rdx);
711  imulq(r9, rax);
712  imulq(r8, rax);
713  movl(rsi, Address(rcx, 16));
714  movl(rdi, Address(rcx, 12));
715  movl(r11, r10);
716  shrq(r10, 32);
717  addq(r9, r10);
718  addq(r11, r8);
719  movl(r8, r11);
720  shrq(r11, 32);
721  addq(r9, r11);
722  movl(r10, rsi);
723  imulq(rsi, rdx);
724  imulq(r10, rax);
725  movl(r11, rdi);
726  imulq(rdi, rdx);
727  movl(rbx, rsi);
728  shrq(rsi, 32);
729  addq(r9, rbx);
730  movl(rbx, r9);
731  shrq(r9, 32);
732  addq(r10, rsi);
733  addq(r10, r9);
734  shlq(rbx, 32);
735  orq(r8, rbx);
736  imulq(r11, rax);
737  movl(r9, Address(rcx, 8));
738  movl(rsi, Address(rcx, 4));
739  movl(rbx, rdi);
740  shrq(rdi, 32);
741  addq(r10, rbx);
742  movl(rbx, r10);
743  shrq(r10, 32);
744  addq(r11, rdi);
745  addq(r11, r10);
746  movq(rdi, r9);
747  imulq(r9, rdx);
748  imulq(rdi, rax);
749  movl(r10, r9);
750  shrq(r9, 32);
751  addq(r11, r10);
752  movl(r10, r11);
753  shrq(r11, 32);
754  addq(rdi, r9);
755  addq(rdi, r11);
756  movq(r9, rsi);
757  imulq(rsi, rdx);
758  imulq(r9, rax);
759  shlq(r10, 32);
760  orq(r10, rbx);
761  movl(eax, Address(rcx, 0));
762  movl(r11, rsi);
763  shrq(rsi, 32);
764  addq(rdi, r11);
765  movl(r11, rdi);
766  shrq(rdi, 32);
767  addq(r9, rsi);
768  addq(r9, rdi);
769  imulq(rdx, rax);
770  pextrw(rbx, xmm0, 3);
771  lea(rdi, ExternalAddress(PI_INV_TABLE));
772  subq(rcx, rdi);
773  addl(ecx, ecx);
774  addl(ecx, ecx);
775  addl(ecx, ecx);
776  addl(ecx, 19);
777  movl(rsi, 32768);
778  andl(rsi, rbx);
779  shrl(rbx, 4);
780  andl(rbx, 2047);
781  subl(rbx, 1023);
782  subl(ecx, rbx);
783  addq(r9, rdx);
784  movl(edx, ecx);
785  addl(edx, 32);
786  cmpl(ecx, 0);
787  jcc(Assembler::less, L_2TAG_PACKET_5_0_1);
788  negl(ecx);
789  addl(ecx, 29);
790  shll(r9);
791  movl(rdi, r9);
792  andl(r9, 1073741823);
793  testl(r9, 536870912);
794  jcc(Assembler::notEqual, L_2TAG_PACKET_6_0_1);
795  shrl(r9);
796  movl(rbx, 0);
797  shlq(r9, 32);
798  orq(r9, r11);
799
800  bind(L_2TAG_PACKET_7_0_1);
801
802  bind(L_2TAG_PACKET_8_0_1);
803  cmpq(r9, 0);
804  jcc(Assembler::equal, L_2TAG_PACKET_9_0_1);
805
806  bind(L_2TAG_PACKET_10_0_1);
807  bsrq(r11, r9);
808  movl(ecx, 29);
809  subl(ecx, r11);
810  jcc(Assembler::lessEqual, L_2TAG_PACKET_11_0_1);
811  shlq(r9);
812  movq(rax, r10);
813  shlq(r10);
814  addl(edx, ecx);
815  negl(ecx);
816  addl(ecx, 64);
817  shrq(rax);
818  shrq(r8);
819  orq(r9, rax);
820  orq(r10, r8);
821
822  bind(L_2TAG_PACKET_12_0_1);
823  cvtsi2sdq(xmm0, r9);
824  shrq(r10, 1);
825  cvtsi2sdq(xmm3, r10);
826  xorpd(xmm4, xmm4);
827  shll(edx, 4);
828  negl(edx);
829  addl(edx, 16368);
830  orl(edx, rsi);
831  xorl(edx, rbx);
832  pinsrw(xmm4, edx, 3);
833  movq(xmm2, ExternalAddress(PI_4));    //0x00000000UL, 0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
834  movq(xmm7, ExternalAddress(8 + PI_4));    //0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
835  xorpd(xmm5, xmm5);
836  subl(edx, 1008);
837  pinsrw(xmm5, edx, 3);
838  mulsd(xmm0, xmm4);
839  shll(rsi, 16);
840  sarl(rsi, 31);
841  mulsd(xmm3, xmm5);
842  movdqu(xmm1, xmm0);
843  mulsd(xmm0, xmm2);
844  shrl(rdi, 30);
845  addsd(xmm1, xmm3);
846  mulsd(xmm3, xmm2);
847  addl(rdi, rsi);
848  xorl(rdi, rsi);
849  mulsd(xmm7, xmm1);
850  movl(eax, rdi);
851  addsd(xmm7, xmm3);
852  movdqu(xmm2, xmm0);
853  addsd(xmm0, xmm7);
854  subsd(xmm2, xmm0);
855  addsd(xmm7, xmm2);
856  movdqu(xmm1, ExternalAddress(PI32INV));    //0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
857  if (VM_Version::supports_sse3()) {
858    movddup(xmm0, xmm0);
859  }
860  else {
861    movlhps(xmm0, xmm0);
862  }
863  movdqu(xmm4, ExternalAddress(sign_mask));    //0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
864  andpd(xmm4, xmm0);
865  mulpd(xmm1, xmm0);
866  if (VM_Version::supports_sse3()) {
867    movddup(xmm7, xmm7);
868  }
869  else {
870    movlhps(xmm7, xmm7);
871  }
872  movdqu(xmm5, ExternalAddress(ONEHALF));    //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
873  movdqu(xmm6, ExternalAddress(MUL16));    //0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
874  por(xmm5, xmm4);
875  addpd(xmm1, xmm5);
876  movdqu(xmm5, xmm1);
877  unpckhpd(xmm5, xmm5);
878  cvttsd2sil(edx, xmm5);
879  cvttpd2dq(xmm1, xmm1);
880  cvtdq2pd(xmm1, xmm1);
881  mulpd(xmm1, xmm6);
882  movdqu(xmm3, ExternalAddress(P_1));    //0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
883  movq(xmm5, ExternalAddress(QQ_2));    //0x676733afUL, 0x3d32e7b9UL
884  shll(eax, 4);
885  addl(edx, 469248);
886  movdqu(xmm4, ExternalAddress(P_2));    //0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
887  mulpd(xmm3, xmm1);
888  addl(edx, eax);
889  andl(edx, 31);
890  mulsd(xmm5, xmm1);
891  movl(ecx, edx);
892  mulpd(xmm4, xmm1);
893  shll(ecx, 1);
894  subpd(xmm0, xmm3);
895  mulpd(xmm1, ExternalAddress(P_3));    //0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
896  addl(edx, ecx);
897  shll(ecx, 2);
898  addl(edx, ecx);
899  addsd(xmm5, xmm0);
900  movdqu(xmm2, xmm0);
901  subpd(xmm0, xmm4);
902  movq(xmm6, ExternalAddress(ONE));    //0x00000000UL, 0x3ff00000UL
903  shll(edx, 4);
904  lea(rax, ExternalAddress(Ctable));
905  andpd(xmm5, ExternalAddress(MASK_35));    //0xfffc0000UL, 0xffffffffUL, 0x00000000UL, 0x00000000UL
906  movdqu(xmm3, xmm0);
907  addq(rax, rdx);
908  subpd(xmm2, xmm0);
909  unpckhpd(xmm0, xmm0);
910  divsd(xmm6, xmm5);
911  subpd(xmm2, xmm4);
912  subsd(xmm3, xmm5);
913  subpd(xmm2, xmm1);
914  movdqu(xmm1, Address(rax, 48));
915  addpd(xmm2, xmm7);
916  movdqu(xmm7, Address(rax, 16));
917  mulpd(xmm7, xmm0);
918  movdqu(xmm4, Address(rax, 96));
919  mulpd(xmm1, xmm0);
920  mulpd(xmm4, xmm0);
921  addsd(xmm2, xmm3);
922  movdqu(xmm3, xmm0);
923  mulpd(xmm0, xmm0);
924  addpd(xmm7, Address(rax, 0));
925  addpd(xmm1, Address(rax, 32));
926  mulpd(xmm1, xmm0);
927  addpd(xmm4, Address(rax, 80));
928  addpd(xmm7, xmm1);
929  movdqu(xmm1, Address(rax, 112));
930  mulpd(xmm1, xmm0);
931  mulpd(xmm0, xmm0);
932  addpd(xmm4, xmm1);
933  movdqu(xmm1, Address(rax, 64));
934  mulpd(xmm1, xmm0);
935  addpd(xmm7, xmm1);
936  movdqu(xmm1, xmm3);
937  mulpd(xmm3, xmm0);
938  mulsd(xmm0, xmm0);
939  mulpd(xmm1, Address(rax, 144));
940  mulpd(xmm4, xmm3);
941  movdqu(xmm3, xmm1);
942  addpd(xmm7, xmm4);
943  movdqu(xmm4, xmm1);
944  mulsd(xmm0, xmm7);
945  unpckhpd(xmm7, xmm7);
946  addsd(xmm0, xmm7);
947  unpckhpd(xmm1, xmm1);
948  addsd(xmm3, xmm1);
949  subsd(xmm4, xmm3);
950  addsd(xmm1, xmm4);
951  movdqu(xmm4, xmm2);
952  movq(xmm7, Address(rax, 144));
953  unpckhpd(xmm2, xmm2);
954  addsd(xmm7, Address(rax, 152));
955  mulsd(xmm7, xmm2);
956  addsd(xmm7, Address(rax, 136));
957  addsd(xmm7, xmm1);
958  addsd(xmm0, xmm7);
959  movq(xmm7, ExternalAddress(ONE));    //0x00000000UL, 0x3ff00000UL
960  mulsd(xmm4, xmm6);
961  movq(xmm2, Address(rax, 168));
962  andpd(xmm2, xmm6);
963  mulsd(xmm5, xmm2);
964  mulsd(xmm6, Address(rax, 160));
965  subsd(xmm7, xmm5);
966  subsd(xmm2, Address(rax, 128));
967  subsd(xmm7, xmm4);
968  mulsd(xmm7, xmm6);
969  movdqu(xmm4, xmm3);
970  subsd(xmm3, xmm2);
971  addsd(xmm2, xmm3);
972  subsd(xmm4, xmm2);
973  addsd(xmm0, xmm4);
974  subsd(xmm0, xmm7);
975  addsd(xmm0, xmm3);
976  jmp(B1_4);
977
978  bind(L_2TAG_PACKET_9_0_1);
979  addl(edx, 64);
980  movq(r9, r10);
981  movq(r10, r8);
982  movl(r8, 0);
983  cmpq(r9, 0);
984  jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_1);
985  addl(edx, 64);
986  movq(r9, r10);
987  movq(r10, r8);
988  cmpq(r9, 0);
989  jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_1);
990  jmp(L_2TAG_PACKET_12_0_1);
991
992  bind(L_2TAG_PACKET_11_0_1);
993  jcc(Assembler::equal, L_2TAG_PACKET_12_0_1);
994  negl(ecx);
995  shrq(r10);
996  movq(rax, r9);
997  shrq(r9);
998  subl(edx, ecx);
999  negl(ecx);
1000  addl(ecx, 64);
1001  shlq(rax);
1002  orq(r10, rax);
1003  jmp(L_2TAG_PACKET_12_0_1);
1004
1005  bind(L_2TAG_PACKET_5_0_1);
1006  notl(ecx);
1007  shlq(r9, 32);
1008  orq(r9, r11);
1009  shlq(r9);
1010  movq(rdi, r9);
1011  testl(r9, INT_MIN);
1012  jcc(Assembler::notEqual, L_2TAG_PACKET_13_0_1);
1013  shrl(r9);
1014  movl(rbx, 0);
1015  shrq(rdi, 2);
1016  jmp(L_2TAG_PACKET_8_0_1);
1017
1018  bind(L_2TAG_PACKET_6_0_1);
1019  shrl(r9);
1020  movl(rbx, 1073741824);
1021  shrl(rbx);
1022  shlq(r9, 32);
1023  orq(r9, r11);
1024  shlq(rbx, 32);
1025  addl(rdi, 1073741824);
1026  movl(rcx, 0);
1027  movl(r11, 0);
1028  subq(rcx, r8);
1029  sbbq(r11, r10);
1030  sbbq(rbx, r9);
1031  movq(r8, rcx);
1032  movq(r10, r11);
1033  movq(r9, rbx);
1034  movl(rbx, 32768);
1035  jmp(L_2TAG_PACKET_7_0_1);
1036
1037  bind(L_2TAG_PACKET_13_0_1);
1038  shrl(r9);
1039  mov64(rbx, 0x100000000);
1040  shrq(rbx);
1041  movl(rcx, 0);
1042  movl(r11, 0);
1043  subq(rcx, r8);
1044  sbbq(r11, r10);
1045  sbbq(rbx, r9);
1046  movq(r8, rcx);
1047  movq(r10, r11);
1048  movq(r9, rbx);
1049  movl(rbx, 32768);
1050  shrq(rdi, 2);
1051  addl(rdi, 1073741824);
1052  jmp(L_2TAG_PACKET_8_0_1);
1053
1054  bind(L_2TAG_PACKET_4_0_1);
1055  movq(xmm0, Address(rsp, 8));
1056  mulsd(xmm0, ExternalAddress(NEG_ZERO));    //0x00000000UL, 0x80000000UL
1057  movq(Address(rsp, 0), xmm0);
1058
1059  bind(L_2TAG_PACKET_14_0_1);
1060
1061  bind(B1_4);
1062  addq(rsp, 16);
1063  pop(rbx);
1064}
1065#else
1066// The 32 bit code is at most SSE2 compliant
1067ALIGNED_(16) jushort _TP[] =
1068{
1069    0x4cd6, 0xaf6c, 0xc710, 0xc662, 0xbffd, 0x0000, 0x4b06, 0xb0ac, 0xd3b2, 0xcc2c,
1070    0x3ff9, 0x0000, 0x00e3, 0xc850, 0xaa28, 0x9533, 0xbff3, 0x0000, 0x2ff0, 0x466d,
1071    0x1a3b, 0xb266, 0x3fe5, 0x0000
1072};
1073
1074ALIGNED_(16) jushort _TQ[] =
1075{
1076    0x399c, 0x8391, 0x154c, 0x94ca, 0xbfff, 0x0000, 0xb6a3, 0xc36a, 0x44e2, 0x8a2c,
1077    0x3ffe, 0x0000, 0xb70f, 0xd068, 0xa6ce, 0xe9dd, 0xbff9, 0x0000, 0x820f, 0x51ce,
1078    0x7d76, 0x9bff, 0x3ff3, 0x0000
1079};
1080
1081ALIGNED_(16) jushort _GP[] =
1082{
1083    0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffd, 0x0000, 0xb62f, 0x0b60, 0x60b6, 0xb60b,
1084    0xbff9, 0x0000, 0xdfa7, 0x08aa, 0x55e0, 0x8ab3, 0xbff6, 0x0000, 0x85a0, 0xa819,
1085    0xbc99, 0xddeb, 0xbff2, 0x0000, 0x7065, 0x6a37, 0x795f, 0xb354, 0xbfef, 0x0000,
1086    0xa8f9, 0x83f1, 0x2ec8, 0x9140, 0xbfec, 0x0000, 0xf3ca, 0x8c96, 0x8e0b, 0xeb6d,
1087    0xbfe8, 0x0000, 0x355b, 0xd910, 0x67c9, 0xbed3, 0xbfe5, 0x0000, 0x286b, 0xb49e,
1088    0xb854, 0x9a98, 0xbfe2, 0x0000, 0x0871, 0x1a2f, 0x6477, 0xfcc4, 0xbfde, 0x0000,
1089    0xa559, 0x1da9, 0xaed2, 0xba76, 0xbfdb, 0x0000, 0x00a3, 0x7fea, 0x9bc3, 0xf205,
1090    0xbfd8, 0x0000
1091};
1092
1093void MacroAssembler::libm_tancot_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) {
1094  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;
1095  Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23;
1096  Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34;
1097  Label B1_35, B1_36, B1_37, B1_38, B1_39, B1_40, B1_41, B1_42, B1_43, B1_44, B1_45, B1_46;
1098
1099  assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
1100
1101  address L_2il0floatpacket_0 = StubRoutines::x86::_L_2il0floatpacket_0_addr();
1102  address Pi4Inv = StubRoutines::x86::_Pi4Inv_addr();
1103  address Pi4x3 = StubRoutines::x86::_Pi4x3_addr();
1104  address Pi4x4 = StubRoutines::x86::_Pi4x4_addr();
1105  address ones = StubRoutines::x86::_ones_addr();
1106  address TP = (address)_TP;
1107  address TQ = (address)_TQ;
1108  address GP = (address)_GP;
1109
1110  bind(B1_1);
1111  push(ebp);
1112  movl(ebp, esp);
1113  andl(esp, -64);
1114  push(esi);
1115  push(edi);
1116  push(ebx);
1117  subl(esp, 52);
1118  movl(eax, Address(ebp, 16));
1119  movl(ebx, Address(ebp, 20));
1120  movl(Address(esp, 40), eax);
1121
1122  bind(B1_2);
1123  fnstcw(Address(esp, 38));
1124
1125  bind(B1_3);
1126  movl(edx, Address(ebp, 12));
1127  movl(eax, edx);
1128  andl(eax, 2147483647);
1129  shrl(edx, 31);
1130  movl(Address(esp, 44), edx);
1131  cmpl(eax, 1104150528);
1132  jcc(Assembler::aboveEqual, B1_11);
1133
1134  bind(B1_4);
1135  movsd(xmm1, Address(ebp, 8));
1136  movzwl(ecx, Address(esp, 38));
1137  movl(edx, ecx);
1138  andl(edx, 768);
1139  andps(xmm1, ExternalAddress(L_2il0floatpacket_0));    //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
1140  cmpl(edx, 768);
1141  movsd(xmm0, ExternalAddress(Pi4Inv));    ////0x6dc9c883UL, 0x3ff45f30UL
1142  mulsd(xmm0, xmm1);
1143  movsd(Address(ebp, 8), xmm1);
1144  movsd(Address(esp, 0), xmm0);
1145  jcc(Assembler::equal, B1_39);
1146
1147  bind(B1_5);
1148  orl(ecx, -64768);
1149  movw(Address(esp, 36), ecx);
1150
1151  bind(B1_6);
1152  fldcw(Address(esp, 36));
1153
1154  bind(B1_7);
1155  movsd(xmm1, Address(ebp, 8));
1156  movl(edi, 1);
1157
1158  bind(B1_8);
1159  movl(Address(esp, 12), esi);
1160  movl(esi, Address(esp, 4));
1161  movl(edx, esi);
1162  movl(Address(esp, 24), edi);
1163  movl(edi, esi);
1164  shrl(edi, 20);
1165  andl(edx, 1048575);
1166  movl(ecx, edi);
1167  orl(edx, 1048576);
1168  negl(ecx);
1169  addl(edi, 13);
1170  movl(Address(esp, 8), ebx);
1171  addl(ecx, 19);
1172  movl(ebx, edx);
1173  movl(Address(esp, 28), ecx);
1174  shrl(ebx);
1175  movl(ecx, edi);
1176  shll(edx);
1177  movl(ecx, Address(esp, 28));
1178  movl(edi, Address(esp, 0));
1179  shrl(edi);
1180  orl(edx, edi);
1181  cmpl(esi, 1094713344);
1182  movsd(Address(esp, 16), xmm1);
1183  fld_d(Address(esp, 16));
1184  cmov32(Assembler::below, edx, ebx);
1185  movl(edi, Address(esp, 24));
1186  movl(esi, Address(esp, 12));
1187  lea(ebx, Address(edx, 1));
1188  andl(ebx, -2);
1189  movl(Address(esp, 16), ebx);
1190  cmpl(eax, 1094713344);
1191  fild_s(Address(esp, 16));
1192  movl(ebx, Address(esp, 8));
1193  jcc(Assembler::aboveEqual, B1_10);
1194
1195  bind(B1_9);
1196  fld_d(ExternalAddress(Pi4x3));    //0x54443000UL, 0xbfe921fbUL
1197  fmul(1);
1198  faddp(2);
1199  fld_d(ExternalAddress(8 + Pi4x3));    //0x3b39a000UL, 0x3d373dcbUL
1200  fmul(1);
1201  faddp(2);
1202  fld_d(ExternalAddress(16 + Pi4x3));    //0xe0e68948UL, 0xba845c06UL
1203  fmulp(1);
1204  faddp(1);
1205  jmp(B1_17);
1206
1207  bind(B1_10);
1208  fld_d(ExternalAddress(Pi4x4));    //0x54400000UL, 0xbfe921fbUL
1209  fmul(1);
1210  faddp(2);
1211  fld_d(ExternalAddress(8 + Pi4x4));    //0x1a600000UL, 0xbdc0b461UL
1212  fmul(1);
1213  faddp(2);
1214  fld_d(ExternalAddress(16 + Pi4x4));    //0x2e000000UL, 0xbb93198aUL
1215  fmul(1);
1216  faddp(2);
1217  fld_d(ExternalAddress(24 + Pi4x4));    //0x252049c1UL, 0xb96b839aUL
1218  fmulp(1);
1219  faddp(1);
1220  jmp(B1_17);
1221
1222  bind(B1_11);
1223  movzwl(edx, Address(esp, 38));
1224  movl(eax, edx);
1225  andl(eax, 768);
1226  cmpl(eax, 768);
1227  jcc(Assembler::equal, B1_40);
1228
1229  bind(B1_12);
1230  orl(edx, -64768);
1231  movw(Address(esp, 36), edx);
1232
1233  bind(B1_13);
1234  fldcw(Address(esp, 36));
1235
1236  bind(B1_14);
1237  movl(edi, 1);
1238
1239  bind(B1_15);
1240  movsd(xmm0, Address(ebp, 8));
1241  addl(esp, -32);
1242  andps(xmm0, ExternalAddress(L_2il0floatpacket_0));    //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
1243  lea(eax, Address(esp, 32));
1244  movsd(Address(eax, 16), xmm0);
1245  fld_d(Address(eax, 16));
1246  fstp_x(Address(esp, 0));
1247  movl(Address(esp, 12), 0);
1248  movl(Address(esp, 16), eax);
1249  call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_reduce_pi04l())));
1250
1251  bind(B1_43);
1252  movl(edx, eax);
1253  addl(esp, 32);
1254
1255  bind(B1_16);
1256  fld_d(Address(esp, 0));
1257  fld_d(Address(esp, 8));
1258  faddp(1);
1259
1260  bind(B1_17);
1261  movl(eax, ebx);
1262  andl(eax, 3);
1263  cmpl(eax, 3);
1264  jcc(Assembler::notEqual, B1_24);
1265
1266  bind(B1_18);
1267  fld_d(ExternalAddress(ones));
1268  incl(edx);
1269  fdiv(1);
1270  testb(edx, 2);
1271  fstp_x(Address(esp, 24));
1272  fld_s(0);
1273  fmul(1);
1274  fld_s(0);
1275  fmul(1);
1276  fld_x(ExternalAddress(36 + TP));    //0x2ff0, 0x466d, 0x1a
1277  fmul(2);
1278  fld_x(ExternalAddress(24 + TP));    //0x00e3, 0xc850, 0xaa
1279  faddp(1);
1280  fmul(2);
1281  fld_x(ExternalAddress(12 + TP));    //0x4b06, 0xb0ac, 0xd3
1282  faddp(1);
1283  fmul(2);
1284  fld_x(ExternalAddress(36 + TQ));    //0x820f, 0x51ce, 0x7d
1285  fmul(3);
1286  fld_x(ExternalAddress(24 + TQ));    //0xb70f, 0xd068, 0xa6
1287  faddp(1);
1288  fmul(3);
1289  fld_x(ExternalAddress(12 + TQ));    //0xb6a3, 0xc36a, 0x44
1290  faddp(1);
1291  fmul(3);
1292  fld_x(ExternalAddress(TQ));    //0x399c, 0x8391, 0x15
1293  faddp(1);
1294  fld_x(ExternalAddress(TP));    //0x4cd6, 0xaf6c, 0xc7
1295  faddp(2);
1296  fld_x(ExternalAddress(132 + GP));    //0x00a3, 0x7fea, 0x9b
1297  fmul(3);
1298  fld_x(ExternalAddress(120 + GP));    //0xa559, 0x1da9, 0xae
1299  fmul(4);
1300  fld_x(ExternalAddress(108 + GP));    //0x0871, 0x1a2f, 0x64
1301  faddp(2);
1302  fxch(1);
1303  fmul(4);
1304  fld_x(ExternalAddress(96 + GP));    //0x286b, 0xb49e, 0xb8
1305  faddp(2);
1306  fxch(1);
1307  fmul(4);
1308  fld_x(ExternalAddress(84 + GP));    //0x355b, 0xd910, 0x67
1309  faddp(2);
1310  fxch(1);
1311  fmul(4);
1312  fld_x(ExternalAddress(72 + GP));    //0x8c96, 0x8e0b, 0xeb
1313  faddp(2);
1314  fxch(1);
1315  fmul(4);
1316  fld_x(ExternalAddress(60 + GP));    //0xa8f9, 0x83f1, 0x2e
1317  faddp(2);
1318  fxch(1);
1319  fmul(4);
1320  fld_x(ExternalAddress(48 + GP));    //0x7065, 0x6a37, 0x79
1321  faddp(2);
1322  fxch(1);
1323  fmul(4);
1324  fld_x(ExternalAddress(36 + GP));    //0x85a0, 0xa819, 0xbc
1325  faddp(2);
1326  fxch(1);
1327  fmul(4);
1328  fld_x(ExternalAddress(24 + GP));    //0xdfa7, 0x08aa, 0x55
1329  faddp(2);
1330  fxch(1);
1331  fmulp(4);
1332  fld_x(ExternalAddress(12 + GP));    //0xb62f, 0x0b60, 0x60
1333  faddp(1);
1334  fmul(4);
1335  fmul(5);
1336  fld_x(ExternalAddress(GP));    //0xaaab, 0xaaaa, 0xaa
1337  faddp(4);
1338  fxch(3);
1339  fmul(5);
1340  faddp(3);
1341  jcc(Assembler::equal, B1_20);
1342
1343  bind(B1_19);
1344  fld_x(Address(esp, 24));
1345  fxch(1);
1346  fdivrp(2);
1347  fxch(1);
1348  fmulp(3);
1349  movl(eax, Address(esp, 44));
1350  xorl(eax, 1);
1351  fxch(2);
1352  fmul(3);
1353  fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
1354  fmula(2);
1355  fmula(3);
1356  fxch(3);
1357  faddp(2);
1358  fxch(1);
1359  fstp_d(Address(esp, 16));
1360  fmul(1);
1361  fxch(1);
1362  fmulp(2);
1363  movsd(xmm0, Address(esp, 16));
1364  faddp(1);
1365  fstp_d(Address(esp, 16));
1366  movsd(xmm1, Address(esp, 16));
1367  jmp(B1_21);
1368
1369  bind(B1_20);
1370  fdivrp(1);
1371  fmulp(2);
1372  fxch(1);
1373  fmul(2);
1374  movl(eax, Address(esp, 44));
1375  fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
1376  fmula(1);
1377  fmula(3);
1378  fxch(3);
1379  faddp(1);
1380  fstp_d(Address(esp, 16));
1381  fmul(1);
1382  fld_x(Address(esp, 24));
1383  fmulp(2);
1384  movsd(xmm0, Address(esp, 16));
1385  faddp(1);
1386  fstp_d(Address(esp, 16));
1387  movsd(xmm1, Address(esp, 16));
1388
1389  bind(B1_21);
1390  testl(edi, edi);
1391  jcc(Assembler::equal, B1_23);
1392
1393  bind(B1_22);
1394  fldcw(Address(esp, 38));
1395
1396  bind(B1_23);
1397  movl(eax, Address(esp, 40));
1398  movsd(Address(eax, 0), xmm0);
1399  movsd(Address(eax, 8), xmm1);
1400  addl(esp, 52);
1401  pop(ebx);
1402  pop(edi);
1403  pop(esi);
1404  movl(esp, ebp);
1405  pop(ebp);
1406  ret(0);
1407
1408  bind(B1_24);
1409  testb(ebx, 2);
1410  jcc(Assembler::equal, B1_31);
1411
1412  bind(B1_25);
1413  incl(edx);
1414  fld_s(0);
1415  fmul(1);
1416  testb(edx, 2);
1417  jcc(Assembler::equal, B1_27);
1418
1419  bind(B1_26);
1420  fld_d(ExternalAddress(ones));
1421  fdiv(2);
1422  fld_s(1);
1423  fmul(2);
1424  fld_x(ExternalAddress(132 + GP));    //0x00a3, 0x7fea, 0x9b
1425  fmul(1);
1426  fld_x(ExternalAddress(120 + GP));    //0xa559, 0x1da9, 0xae
1427  fmul(2);
1428  fld_x(ExternalAddress(108 + GP));    //0x67c9, 0xbed3, 0xbf
1429  movl(eax, Address(esp, 44));
1430  faddp(2);
1431  fxch(1);
1432  fmul(2);
1433  xorl(eax, 1);
1434  fld_x(ExternalAddress(96 + GP));    //0x286b, 0xb49e, 0xb8
1435  faddp(2);
1436  fxch(1);
1437  fmul(2);
1438  fld_x(ExternalAddress(84 + GP));    //0x355b, 0xd910, 0x67
1439  faddp(2);
1440  fxch(1);
1441  fmul(2);
1442  fld_x(ExternalAddress(72 + GP));    //0xf3ca, 0x8c96, 0x8e
1443  faddp(2);
1444  fxch(1);
1445  fmul(2);
1446  fld_x(ExternalAddress(60 + GP));    //0xa8f9, 0x83f1, 0x2e
1447  faddp(2);
1448  fxch(1);
1449  fmul(2);
1450  fld_x(ExternalAddress(48 + GP));    //0x7065, 0x6a37, 0x79
1451  faddp(2);
1452  fxch(1);
1453  fmul(2);
1454  fld_x(ExternalAddress(36 + GP));    //0x85a0, 0xa819, 0xbc
1455  faddp(2);
1456  fxch(1);
1457  fmul(2);
1458  fld_x(ExternalAddress(24 + GP));    //0xdfa7, 0x08aa, 0x55
1459  faddp(2);
1460  fxch(1);
1461  fmulp(2);
1462  fld_x(ExternalAddress(12 + GP));    //0xb62f, 0x0b60, 0x60
1463  faddp(1);
1464  fmulp(3);
1465  fld_x(ExternalAddress(GP));    //0xaaab, 0xaaaa, 0xaa
1466  faddp(1);
1467  fmul(3);
1468  fxch(2);
1469  fmulp(3);
1470  fxch(1);
1471  faddp(2);
1472  fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
1473  fmula(2);
1474  fmulp(1);
1475  faddp(1);
1476  fstp_d(Address(esp, 16));
1477  movsd(xmm0, Address(esp, 16));
1478  jmp(B1_28);
1479
1480  bind(B1_27);
1481  fld_x(ExternalAddress(36 + TP));    //0x2ff0, 0x466d, 0x1a
1482  fmul(1);
1483  fld_x(ExternalAddress(24 + TP));    //0x00e3, 0xc850, 0xaa
1484  movl(eax, Address(esp, 44));
1485  faddp(1);
1486  fmul(1);
1487  fld_x(ExternalAddress(36 + TQ));    //0x820f, 0x51ce, 0x7d
1488  fmul(2);
1489  fld_x(ExternalAddress(24 + TQ));    //0xb70f, 0xd068, 0xa6
1490  faddp(1);
1491  fmul(2);
1492  fld_x(ExternalAddress(12 + TQ));    //0xb6a3, 0xc36a, 0x44
1493  faddp(1);
1494  fmul(2);
1495  fld_x(ExternalAddress(TQ));    //0x399c, 0x8391, 0x15
1496  faddp(1);
1497  fld_x(ExternalAddress(12 + TP));    //0x4b06, 0xb0ac, 0xd3
1498  faddp(2);
1499  fxch(1);
1500  fmul(2);
1501  fld_x(ExternalAddress(TP));    //0x4cd6, 0xaf6c, 0xc7
1502  faddp(1);
1503  fdivrp(1);
1504  fmulp(1);
1505  fmul(1);
1506  fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
1507  fmula(1);
1508  fmulp(2);
1509  faddp(1);
1510  fstp_d(Address(esp, 16));
1511  movsd(xmm0, Address(esp, 16));
1512
1513  bind(B1_28);
1514  testl(edi, edi);
1515  jcc(Assembler::equal, B1_30);
1516
1517  bind(B1_29);
1518  fldcw(Address(esp, 38));
1519
1520  bind(B1_30);
1521  movl(eax, Address(esp, 40));
1522  movsd(Address(eax, 0), xmm0);
1523  addl(esp, 52);
1524  pop(ebx);
1525  pop(edi);
1526  pop(esi);
1527  movl(esp, ebp);
1528  pop(ebp);
1529  ret(0);
1530
1531  bind(B1_31);
1532  testb(ebx, 1);
1533  jcc(Assembler::equal, B1_38);
1534
1535  bind(B1_32);
1536  incl(edx);
1537  fld_s(0);
1538  fmul(1);
1539  testb(edx, 2);
1540  jcc(Assembler::equal, B1_34);
1541
1542  bind(B1_33);
1543  fld_x(ExternalAddress(36 + TP));    //0x2ff0, 0x466d, 0x1a
1544  fmul(1);
1545  fld_x(ExternalAddress(24 + TP));    //0x00e3, 0xc850, 0xaa
1546  movl(eax, Address(esp, 44));
1547  faddp(1);
1548  fmul(1);
1549  xorl(eax, 1);
1550  fld_x(ExternalAddress(36 + TQ));    //0x820f, 0x51ce, 0x7d
1551  fmul(2);
1552  fld_x(ExternalAddress(24 + TQ));    //0xb70f, 0xd068, 0xa6
1553  faddp(1);
1554  fmul(2);
1555  fld_x(ExternalAddress(12 + TQ));    //0xb6a3, 0xc36a, 0x44
1556  faddp(1);
1557  fmul(2);
1558  fld_x(ExternalAddress(TQ));    //0x399c, 0x8391, 0x15
1559  faddp(1);
1560  fld_x(ExternalAddress(12 + TP));    //0x4b06, 0xb0ac, 0xd3
1561  faddp(2);
1562  fxch(1);
1563  fmul(2);
1564  fld_x(ExternalAddress(TP));    //0x4cd6, 0xaf6c, 0xc7
1565  faddp(1);
1566  fdivrp(1);
1567  fmulp(1);
1568  fmul(1);
1569  fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
1570  fmula(1);
1571  fmulp(2);
1572  faddp(1);
1573  fstp_d(Address(esp, 16));
1574  movsd(xmm0, Address(esp, 16));
1575  jmp(B1_35);
1576
1577  bind(B1_34);
1578  fld_d(ExternalAddress(ones));
1579  fdiv(2);
1580  fld_s(1);
1581  fmul(2);
1582  fld_x(ExternalAddress(132 + GP));    //0x00a3, 0x7fea, 0x9b
1583  fmul(1);
1584  fld_x(ExternalAddress(120 + GP));    //0xa559, 0x1da9, 0xae
1585  fmul(2);
1586  fld_x(ExternalAddress(108 + GP));    //0x67c9, 0xbed3, 0xbf
1587  movl(eax, Address(esp, 44));
1588  faddp(2);
1589  fxch(1);
1590  fmul(2);
1591  fld_x(ExternalAddress(96 + GP));    //0x286b, 0xb49e, 0xb8
1592  faddp(2);
1593  fxch(1);
1594  fmul(2);
1595  fld_x(ExternalAddress(84 + GP));    //0x355b, 0xd910, 0x67
1596  faddp(2);
1597  fxch(1);
1598  fmul(2);
1599  fld_x(ExternalAddress(72 + GP));    //0xf3ca, 0x8c96, 0x8e
1600  faddp(2);
1601  fxch(1);
1602  fmul(2);
1603  fld_x(ExternalAddress(60 + GP));    //0xa8f9, 0x83f1, 0x2e
1604  faddp(2);
1605  fxch(1);
1606  fmul(2);
1607  fld_x(ExternalAddress(48 + GP));    //0x7065, 0x6a37, 0x79
1608  faddp(2);
1609  fxch(1);
1610  fmul(2);
1611  fld_x(ExternalAddress(36 + GP));    //0x85a0, 0xa819, 0xbc
1612  faddp(2);
1613  fxch(1);
1614  fmul(2);
1615  fld_x(ExternalAddress(24 + GP));    //0xdfa7, 0x08aa, 0x55
1616  faddp(2);
1617  fxch(1);
1618  fmulp(2);
1619  fld_x(ExternalAddress(12 + GP));    //0xb62f, 0x0b60, 0x60
1620  faddp(1);
1621  fmulp(3);
1622  fld_x(ExternalAddress(GP));    //0xaaab, 0xaaaa, 0xaa
1623  faddp(1);
1624  fmul(3);
1625  fxch(2);
1626  fmulp(3);
1627  fxch(1);
1628  faddp(2);
1629  fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
1630  fmula(2);
1631  fmulp(1);
1632  faddp(1);
1633  fstp_d(Address(esp, 16));
1634  movsd(xmm0, Address(esp, 16));
1635
1636  bind(B1_35);
1637  testl(edi, edi);
1638  jcc(Assembler::equal, B1_37);
1639
1640  bind(B1_36);
1641  fldcw(Address(esp, 38));
1642
1643  bind(B1_37);
1644  movl(eax, Address(esp, 40));
1645  movsd(Address(eax, 8), xmm0);
1646  addl(esp, 52);
1647  pop(ebx);
1648  pop(edi);
1649  pop(esi);
1650  mov(esp, ebp);
1651  pop(ebp);
1652  ret(0);
1653
1654  bind(B1_38);
1655  fstp_d(0);
1656  addl(esp, 52);
1657  pop(ebx);
1658  pop(edi);
1659  pop(esi);
1660  mov(esp, ebp);
1661  pop(ebp);
1662  ret(0);
1663
1664  bind(B1_39);
1665  xorl(edi, edi);
1666  jmp(B1_8);
1667
1668  bind(B1_40);
1669  xorl(edi, edi);
1670  jmp(B1_15);
1671}
1672
1673ALIGNED_(16) juint _static_const_table_tan[] =
1674{
1675    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x882c10faUL,
1676    0x3f9664f4UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1677    0x00000000UL, 0x00000000UL, 0x55e6c23dUL, 0x3f8226e3UL, 0x55555555UL,
1678    0x3fd55555UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1679    0x0e157de0UL, 0x3f6d6d3dUL, 0x11111111UL, 0x3fc11111UL, 0x00000000UL,
1680    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x452b75e3UL, 0x3f57da36UL,
1681    0x1ba1ba1cUL, 0x3faba1baUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1682    0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
1683    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
1684    0x3f953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
1685    0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0x3f85ad63UL, 0xdc230b9bUL,
1686    0x3fb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
1687    0x77bb08baUL, 0x3f757c85UL, 0xb6247521UL, 0x3fb1381eUL, 0x5922170cUL,
1688    0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0x3f64e391UL,
1689    0x3e666320UL, 0x3fa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
1690    0x3fafa8aeUL, 0x8c5b2da2UL, 0x3fb936bbUL, 0x4e88f7a5UL, 0x3c587d05UL,
1691    0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
1692    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x5a279ea3UL, 0x3faa3407UL,
1693    0x00000000UL, 0x00000000UL, 0x432d65faUL, 0x3fa70153UL, 0x00000000UL,
1694    0x00000000UL, 0x891a4602UL, 0x3f9d03efUL, 0xd62ca5f8UL, 0x3fca77d9UL,
1695    0xb35f4628UL, 0x3f97a265UL, 0x433258faUL, 0x3fd8cf51UL, 0xb58fd909UL,
1696    0x3f8f88e3UL, 0x01771ceaUL, 0x3fc2b154UL, 0xf3562f8eUL, 0x3f888f57UL,
1697    0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL, 0x3f80f44cUL, 0x214368e9UL,
1698    0x3fb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL, 0x172dbbf0UL, 0x3fb6cb8eUL,
1699    0xe0553158UL, 0x3fc975f5UL, 0x593fe814UL, 0x3c2ef5d3UL, 0x00000000UL,
1700    0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL, 0x00000000UL, 0x00000000UL,
1701    0x00000000UL, 0x00000000UL, 0x9314533eUL, 0x3fbb8ec5UL, 0x00000000UL,
1702    0x00000000UL, 0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL,
1703    0xdcb427fdUL, 0x3fb13950UL, 0xd87ab0bbUL, 0x3fd5335eUL, 0xce0ae8a5UL,
1704    0x3fabb382UL, 0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0x3fa552f1UL,
1705    0x59f21a6dUL, 0x3fd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL,
1706    0x3fd0576cUL, 0x8f2c2950UL, 0x3f9a4898UL, 0xc0b3f22cUL, 0x3fc59462UL,
1707    0x1883a4b8UL, 0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL,
1708    0x3fd36a08UL, 0x1dce993dUL, 0xbc6d704dUL, 0x00000000UL, 0x3ff00000UL,
1709    0x2b82ab63UL, 0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1710    0x00000000UL, 0x56f37042UL, 0x3fccfc56UL, 0x00000000UL, 0x00000000UL,
1711    0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL, 0x3d0e7c5dUL,
1712    0x3fc50533UL, 0x9bed9b2eUL, 0x3fdf0ed9UL, 0x5fe7c47cUL, 0x3fc1f250UL,
1713    0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0x3fbe5c71UL, 0x86362c20UL,
1714    0x3fda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL, 0x3fd911bdUL,
1715    0xb56658beUL, 0x3fb5e4c7UL, 0x93a2fd76UL, 0x3fd3c092UL, 0xda271794UL,
1716    0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL, 0x3fda8279UL,
1717    0xb68c1467UL, 0x3c708b2fUL, 0x00000000UL, 0x3ff00000UL, 0x980c4337UL,
1718    0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1719    0xcc03e501UL, 0x3fdff10fUL, 0x00000000UL, 0x00000000UL, 0x44a4e845UL,
1720    0x3fddb63bUL, 0x00000000UL, 0x00000000UL, 0x3768ad9fUL, 0x3fdb72a4UL,
1721    0x3dd01ccaUL, 0x3fe5fdb9UL, 0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL,
1722    0x3fe977f9UL, 0xd013b3abUL, 0x3fd78ca3UL, 0xbf0bf914UL, 0x3fe4f192UL,
1723    0x4d53e730UL, 0x3fd5d060UL, 0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL,
1724    0x3fd4322aUL, 0x5936a835UL, 0x3fe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL,
1725    0xef478605UL, 0x3fe1659eUL, 0x190834ecUL, 0x3fe11ab7UL, 0xcdb625eaUL,
1726    0xbc8e564bUL, 0x00000000UL, 0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL,
1727    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
1728    0x3ff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
1729    0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0x3ff3972eUL, 0xe93463bdUL,
1730    0x3feeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
1731    0xa04e8ea3UL, 0x3ff4541aUL, 0x386accd3UL, 0x3ff1369eUL, 0x222a66ddUL,
1732    0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0x3ff5178fUL,
1733    0xddaa0031UL, 0x3ff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
1734    0x3ff29311UL, 0x2ab7f990UL, 0x3fe561b8UL, 0x209c7df1UL, 0x3c87a8c5UL,
1735    0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
1736    0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc7ab4d5aUL, 0x40085e24UL,
1737    0x00000000UL, 0x00000000UL, 0xe93ea75dUL, 0x400b963dUL, 0x00000000UL,
1738    0x00000000UL, 0x94a7f25aUL, 0x400f37e2UL, 0x4b6261cbUL, 0x3ff5f984UL,
1739    0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL, 0x3ffaf5a5UL, 0x7f2ce8e3UL,
1740    0x4013fe8bUL, 0xfe8e54faUL, 0x3ffd7334UL, 0x670d618dUL, 0x4016a10cUL,
1741    0x4db97058UL, 0x4000e012UL, 0x24df44ddUL, 0x40199c5fUL, 0x697d6eceUL,
1742    0x4003006eUL, 0x83298b82UL, 0x401cfc4dUL, 0x19d490d6UL, 0x40058c19UL,
1743    0x2ae42850UL, 0x3fea4300UL, 0x118e20e6UL, 0xbc7a6db8UL, 0x00000000UL,
1744    0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL, 0x00000000UL, 0x00000000UL,
1745    0x00000000UL, 0x00000000UL, 0x65965966UL, 0x40219659UL, 0x00000000UL,
1746    0x00000000UL, 0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL,
1747    0x83cd3723UL, 0x402c8342UL, 0x00000000UL, 0x40000000UL, 0x55e6c23dUL,
1748    0x403226e3UL, 0x55555555UL, 0x40055555UL, 0x34451939UL, 0x40371c96UL,
1749    0xaaaaaaabUL, 0x400aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL,
1750    0x40111111UL, 0xa738201fUL, 0x4042bbceUL, 0x05b05b06UL, 0x4015b05bUL,
1751    0x452b75e3UL, 0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL,
1752    0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL,
1753    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1754    0x00000000UL, 0x4f48b8d3UL, 0xbf33eaf9UL, 0x00000000UL, 0x00000000UL,
1755    0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL, 0xd0258911UL,
1756    0xbf0abaf3UL, 0x23e49fe9UL, 0xbfab5a8cUL, 0x2d53222eUL, 0x3ef60d15UL,
1757    0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0xbee1d3b5UL, 0xdbf93b8eUL,
1758    0xbf84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL, 0x3f743924UL,
1759    0x794a8297UL, 0xbeb7b7b9UL, 0xe015f797UL, 0xbf5d41f5UL, 0xe41a4a56UL,
1760    0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL, 0xbfce49ceUL,
1761    0x8c743719UL, 0x3d1eb860UL, 0x00000000UL, 0x00000000UL, 0x1b4863cfUL,
1762    0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
1763    0x535ad890UL, 0xbf2b9320UL, 0x00000000UL, 0x00000000UL, 0x018fdf1fUL,
1764    0x3f16d61dUL, 0x00000000UL, 0x00000000UL, 0x0359f1beUL, 0xbf0139e4UL,
1765    0xa4317c6dUL, 0xbfa67e17UL, 0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL,
1766    0x3f9f455bUL, 0x51ccf238UL, 0xbed55317UL, 0xf437b9acUL, 0xbf804beeUL,
1767    0xc791a2b5UL, 0x3ec0e993UL, 0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL,
1768    0xbeaa48a2UL, 0x0a268358UL, 0xbf55a443UL, 0xdfd978e4UL, 0x3e94b61fUL,
1769    0xd7767a58UL, 0x3f431806UL, 0x2aea0000UL, 0xbfc9bbe8UL, 0x7723ea61UL,
1770    0xbd3a2369UL, 0x00000000UL, 0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL,
1771    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
1772    0xbf231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
1773    0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0xbef66191UL, 0x848a46c6UL,
1774    0xbfa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
1775    0xfdd299efUL, 0xbec9dd1aUL, 0x3f8dbaafUL, 0xbf793363UL, 0x309fc6eaUL,
1776    0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0xbe9dae11UL,
1777    0x3e5c67b3UL, 0xbf4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
1778    0x3f3d1eb1UL, 0x29cfc000UL, 0xbfc549ceUL, 0xbf159358UL, 0xbd397b33UL,
1779    0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
1780    0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x7d98a556UL, 0xbf1a3958UL,
1781    0x00000000UL, 0x00000000UL, 0x9d88dc01UL, 0x3f0704c2UL, 0x00000000UL,
1782    0x00000000UL, 0x73742a2bUL, 0xbeed054aUL, 0x58844587UL, 0xbf9c2a13UL,
1783    0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL, 0x3f9a48f4UL, 0xa8dc9888UL,
1784    0xbebf8939UL, 0xaad4b5b8UL, 0xbf72f746UL, 0x9102efa1UL, 0x3ea88f82UL,
1785    0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL, 0xbe90f456UL, 0x741fb4edUL,
1786    0xbf46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL, 0xca89ff3fUL, 0x3f36db70UL,
1787    0xa8a2a000UL, 0xbfc0ee13UL, 0x3da24be1UL, 0xbd338b9fUL, 0x00000000UL,
1788    0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL, 0x00000000UL, 0x3ff00000UL,
1789    0x00000000UL, 0xfffffff8UL, 0x1a154b97UL, 0xbf116b01UL, 0x00000000UL,
1790    0x00000000UL, 0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL,
1791    0xb93820c8UL, 0xbee264d4UL, 0xbb6cbb18UL, 0xbf94ab8cUL, 0x888d4d92UL,
1792    0x3ed0568bUL, 0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0xbeb2f950UL,
1793    0x22cf9f74UL, 0xbf6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL,
1794    0x3f64aad7UL, 0x637b73afUL, 0xbe83487cUL, 0xe522591aUL, 0xbf3fc092UL,
1795    0xa158e8bcUL, 0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL,
1796    0xbfb9477fUL, 0xc2c2d2bcUL, 0xbd135ef9UL, 0x00000000UL, 0x00000000UL,
1797    0xf2fdb123UL, 0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
1798    0xfffffff8UL, 0xc41acb64UL, 0xbf05448dUL, 0x00000000UL, 0x00000000UL,
1799    0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL, 0x9e42962dUL,
1800    0xbed5aea5UL, 0x2579f8efUL, 0xbf8b2398UL, 0x288a1ed9UL, 0x3ec81441UL,
1801    0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0xbea57cd3UL, 0x5766336fUL,
1802    0xbf617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL, 0x3f62c646UL,
1803    0x6b8fb29cUL, 0xbe74e3a3UL, 0xdc4c0409UL, 0xbf33f952UL, 0x9bffe365UL,
1804    0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL, 0xbfb0cc62UL,
1805    0x016b907fUL, 0xbd119cbcUL, 0x00000000UL, 0x00000000UL, 0xe6b9d8faUL,
1806    0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
1807    0x5daf22a6UL, 0xbef429d7UL, 0x00000000UL, 0x00000000UL, 0x06bca545UL,
1808    0x3ef7a27dUL, 0x00000000UL, 0x00000000UL, 0x7211c19aUL, 0xbec41c3eUL,
1809    0x956ed53eUL, 0xbf7ae3f4UL, 0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL,
1810    0x3f96f713UL, 0x36661e6cUL, 0xbe936e09UL, 0x506f9381UL, 0xbf5122e8UL,
1811    0xcb6dd43fUL, 0x3e9041b9UL, 0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL,
1812    0xbe625a8aUL, 0xe5a0e9dcUL, 0xbf23499dUL, 0x110384ddUL, 0x3e5b1c2cUL,
1813    0x68d43db6UL, 0x3f2cb899UL, 0x6ecac000UL, 0xbfa0c414UL, 0xcd7dd58cUL,
1814    0x3d13500fUL, 0x00000000UL, 0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL,
1815    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x00000000UL,
1816    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2bf70ebeUL, 0x3ef66a8fUL,
1817    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1818    0x00000000UL, 0xd644267fUL, 0x3ec22805UL, 0x16c16c17UL, 0x3f96c16cUL,
1819    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc4e09162UL,
1820    0x3e8d6db2UL, 0xbc011567UL, 0x3f61566aUL, 0x00000000UL, 0x00000000UL,
1821    0x00000000UL, 0x00000000UL, 0x1f79955cUL, 0x3e57da4eUL, 0x9334ef0bUL,
1822    0x3f2bbd77UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1823    0x00000000UL, 0x00000000UL, 0x55555555UL, 0x3fd55555UL, 0x00000000UL,
1824    0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x5daf22a6UL, 0x3ef429d7UL,
1825    0x00000000UL, 0x00000000UL, 0x06bca545UL, 0x3ef7a27dUL, 0x00000000UL,
1826    0x00000000UL, 0x7211c19aUL, 0x3ec41c3eUL, 0x956ed53eUL, 0x3f7ae3f4UL,
1827    0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL, 0x3f96f713UL, 0x36661e6cUL,
1828    0x3e936e09UL, 0x506f9381UL, 0x3f5122e8UL, 0xcb6dd43fUL, 0x3e9041b9UL,
1829    0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL, 0x3e625a8aUL, 0xe5a0e9dcUL,
1830    0x3f23499dUL, 0x110384ddUL, 0x3e5b1c2cUL, 0x68d43db6UL, 0x3f2cb899UL,
1831    0x6ecac000UL, 0x3fa0c414UL, 0xcd7dd58cUL, 0xbd13500fUL, 0x00000000UL,
1832    0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL, 0x00000000UL, 0x3ff00000UL,
1833    0x00000000UL, 0xfffffff8UL, 0xc41acb64UL, 0x3f05448dUL, 0x00000000UL,
1834    0x00000000UL, 0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL,
1835    0x9e42962dUL, 0x3ed5aea5UL, 0x2579f8efUL, 0x3f8b2398UL, 0x288a1ed9UL,
1836    0x3ec81441UL, 0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0x3ea57cd3UL,
1837    0x5766336fUL, 0x3f617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL,
1838    0x3f62c646UL, 0x6b8fb29cUL, 0x3e74e3a3UL, 0xdc4c0409UL, 0x3f33f952UL,
1839    0x9bffe365UL, 0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL,
1840    0x3fb0cc62UL, 0x016b907fUL, 0x3d119cbcUL, 0x00000000UL, 0x00000000UL,
1841    0xe6b9d8faUL, 0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
1842    0xfffffff8UL, 0x1a154b97UL, 0x3f116b01UL, 0x00000000UL, 0x00000000UL,
1843    0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL, 0xb93820c8UL,
1844    0x3ee264d4UL, 0xbb6cbb18UL, 0x3f94ab8cUL, 0x888d4d92UL, 0x3ed0568bUL,
1845    0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0x3eb2f950UL, 0x22cf9f74UL,
1846    0x3f6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL, 0x3f64aad7UL,
1847    0x637b73afUL, 0x3e83487cUL, 0xe522591aUL, 0x3f3fc092UL, 0xa158e8bcUL,
1848    0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL, 0x3fb9477fUL,
1849    0xc2c2d2bcUL, 0x3d135ef9UL, 0x00000000UL, 0x00000000UL, 0xf2fdb123UL,
1850    0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
1851    0x7d98a556UL, 0x3f1a3958UL, 0x00000000UL, 0x00000000UL, 0x9d88dc01UL,
1852    0x3f0704c2UL, 0x00000000UL, 0x00000000UL, 0x73742a2bUL, 0x3eed054aUL,
1853    0x58844587UL, 0x3f9c2a13UL, 0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL,
1854    0x3f9a48f4UL, 0xa8dc9888UL, 0x3ebf8939UL, 0xaad4b5b8UL, 0x3f72f746UL,
1855    0x9102efa1UL, 0x3ea88f82UL, 0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL,
1856    0x3e90f456UL, 0x741fb4edUL, 0x3f46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL,
1857    0xca89ff3fUL, 0x3f36db70UL, 0xa8a2a000UL, 0x3fc0ee13UL, 0x3da24be1UL,
1858    0x3d338b9fUL, 0x00000000UL, 0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL,
1859    0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
1860    0x3f231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
1861    0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0x3ef66191UL, 0x848a46c6UL,
1862    0x3fa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
1863    0xfdd299efUL, 0x3ec9dd1aUL, 0x3f8dbaafUL, 0x3f793363UL, 0x309fc6eaUL,
1864    0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0x3e9dae11UL,
1865    0x3e5c67b3UL, 0x3f4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
1866    0x3f3d1eb1UL, 0x29cfc000UL, 0x3fc549ceUL, 0xbf159358UL, 0x3d397b33UL,
1867    0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
1868    0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x535ad890UL, 0x3f2b9320UL,
1869    0x00000000UL, 0x00000000UL, 0x018fdf1fUL, 0x3f16d61dUL, 0x00000000UL,
1870    0x00000000UL, 0x0359f1beUL, 0x3f0139e4UL, 0xa4317c6dUL, 0x3fa67e17UL,
1871    0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL, 0x3f9f455bUL, 0x51ccf238UL,
1872    0x3ed55317UL, 0xf437b9acUL, 0x3f804beeUL, 0xc791a2b5UL, 0x3ec0e993UL,
1873    0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL, 0x3eaa48a2UL, 0x0a268358UL,
1874    0x3f55a443UL, 0xdfd978e4UL, 0x3e94b61fUL, 0xd7767a58UL, 0x3f431806UL,
1875    0x2aea0000UL, 0x3fc9bbe8UL, 0x7723ea61UL, 0x3d3a2369UL, 0x00000000UL,
1876    0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL, 0x00000000UL, 0x3ff00000UL,
1877    0x00000000UL, 0xfffffff8UL, 0x4f48b8d3UL, 0x3f33eaf9UL, 0x00000000UL,
1878    0x00000000UL, 0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL,
1879    0xd0258911UL, 0x3f0abaf3UL, 0x23e49fe9UL, 0x3fab5a8cUL, 0x2d53222eUL,
1880    0x3ef60d15UL, 0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0x3ee1d3b5UL,
1881    0xdbf93b8eUL, 0x3f84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL,
1882    0x3f743924UL, 0x794a8297UL, 0x3eb7b7b9UL, 0xe015f797UL, 0x3f5d41f5UL,
1883    0xe41a4a56UL, 0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL,
1884    0x3fce49ceUL, 0x8c743719UL, 0xbd1eb860UL, 0x00000000UL, 0x00000000UL,
1885    0x1b4863cfUL, 0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
1886    0xfffffff8UL, 0x65965966UL, 0xc0219659UL, 0x00000000UL, 0x00000000UL,
1887    0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL, 0x83cd3723UL,
1888    0xc02c8342UL, 0x00000000UL, 0xc0000000UL, 0x55e6c23dUL, 0x403226e3UL,
1889    0x55555555UL, 0x40055555UL, 0x34451939UL, 0xc0371c96UL, 0xaaaaaaabUL,
1890    0xc00aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL, 0x40111111UL,
1891    0xa738201fUL, 0xc042bbceUL, 0x05b05b06UL, 0xc015b05bUL, 0x452b75e3UL,
1892    0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL, 0xbff00000UL,
1893    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL, 0x00000000UL,
1894    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1895    0xc7ab4d5aUL, 0xc0085e24UL, 0x00000000UL, 0x00000000UL, 0xe93ea75dUL,
1896    0x400b963dUL, 0x00000000UL, 0x00000000UL, 0x94a7f25aUL, 0xc00f37e2UL,
1897    0x4b6261cbUL, 0xbff5f984UL, 0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL,
1898    0x3ffaf5a5UL, 0x7f2ce8e3UL, 0xc013fe8bUL, 0xfe8e54faUL, 0xbffd7334UL,
1899    0x670d618dUL, 0x4016a10cUL, 0x4db97058UL, 0x4000e012UL, 0x24df44ddUL,
1900    0xc0199c5fUL, 0x697d6eceUL, 0xc003006eUL, 0x83298b82UL, 0x401cfc4dUL,
1901    0x19d490d6UL, 0x40058c19UL, 0x2ae42850UL, 0xbfea4300UL, 0x118e20e6UL,
1902    0x3c7a6db8UL, 0x00000000UL, 0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL,
1903    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
1904    0xbff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
1905    0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0xbff3972eUL, 0xe93463bdUL,
1906    0xbfeeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
1907    0xa04e8ea3UL, 0xbff4541aUL, 0x386accd3UL, 0xbff1369eUL, 0x222a66ddUL,
1908    0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0xbff5178fUL,
1909    0xddaa0031UL, 0xbff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
1910    0x3ff29311UL, 0x2ab7f990UL, 0xbfe561b8UL, 0x209c7df1UL, 0xbc87a8c5UL,
1911    0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
1912    0x00000000UL, 0x00000000UL, 0x00000000UL, 0xcc03e501UL, 0xbfdff10fUL,
1913    0x00000000UL, 0x00000000UL, 0x44a4e845UL, 0x3fddb63bUL, 0x00000000UL,
1914    0x00000000UL, 0x3768ad9fUL, 0xbfdb72a4UL, 0x3dd01ccaUL, 0xbfe5fdb9UL,
1915    0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL, 0x3fe977f9UL, 0xd013b3abUL,
1916    0xbfd78ca3UL, 0xbf0bf914UL, 0xbfe4f192UL, 0x4d53e730UL, 0x3fd5d060UL,
1917    0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL, 0xbfd4322aUL, 0x5936a835UL,
1918    0xbfe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL, 0xef478605UL, 0x3fe1659eUL,
1919    0x190834ecUL, 0xbfe11ab7UL, 0xcdb625eaUL, 0x3c8e564bUL, 0x00000000UL,
1920    0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL, 0x00000000UL, 0x00000000UL,
1921    0x00000000UL, 0x00000000UL, 0x56f37042UL, 0xbfccfc56UL, 0x00000000UL,
1922    0x00000000UL, 0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL,
1923    0x3d0e7c5dUL, 0xbfc50533UL, 0x9bed9b2eUL, 0xbfdf0ed9UL, 0x5fe7c47cUL,
1924    0x3fc1f250UL, 0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0xbfbe5c71UL,
1925    0x86362c20UL, 0xbfda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL,
1926    0x3fd911bdUL, 0xb56658beUL, 0xbfb5e4c7UL, 0x93a2fd76UL, 0xbfd3c092UL,
1927    0xda271794UL, 0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL,
1928    0xbfda8279UL, 0xb68c1467UL, 0xbc708b2fUL, 0x00000000UL, 0x3ff00000UL,
1929    0x980c4337UL, 0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1930    0x00000000UL, 0x9314533eUL, 0xbfbb8ec5UL, 0x00000000UL, 0x00000000UL,
1931    0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL, 0xdcb427fdUL,
1932    0xbfb13950UL, 0xd87ab0bbUL, 0xbfd5335eUL, 0xce0ae8a5UL, 0x3fabb382UL,
1933    0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0xbfa552f1UL, 0x59f21a6dUL,
1934    0xbfd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL, 0x3fd0576cUL,
1935    0x8f2c2950UL, 0xbf9a4898UL, 0xc0b3f22cUL, 0xbfc59462UL, 0x1883a4b8UL,
1936    0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL, 0xbfd36a08UL,
1937    0x1dce993dUL, 0x3c6d704dUL, 0x00000000UL, 0x3ff00000UL, 0x2b82ab63UL,
1938    0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
1939    0x5a279ea3UL, 0xbfaa3407UL, 0x00000000UL, 0x00000000UL, 0x432d65faUL,
1940    0x3fa70153UL, 0x00000000UL, 0x00000000UL, 0x891a4602UL, 0xbf9d03efUL,
1941    0xd62ca5f8UL, 0xbfca77d9UL, 0xb35f4628UL, 0x3f97a265UL, 0x433258faUL,
1942    0x3fd8cf51UL, 0xb58fd909UL, 0xbf8f88e3UL, 0x01771ceaUL, 0xbfc2b154UL,
1943    0xf3562f8eUL, 0x3f888f57UL, 0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL,
1944    0xbf80f44cUL, 0x214368e9UL, 0xbfb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL,
1945    0x172dbbf0UL, 0x3fb6cb8eUL, 0xe0553158UL, 0xbfc975f5UL, 0x593fe814UL,
1946    0xbc2ef5d3UL, 0x00000000UL, 0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL,
1947    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
1948    0xbf953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
1949    0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0xbf85ad63UL, 0xdc230b9bUL,
1950    0xbfb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
1951    0x77bb08baUL, 0xbf757c85UL, 0xb6247521UL, 0xbfb1381eUL, 0x5922170cUL,
1952    0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0xbf64e391UL,
1953    0x3e666320UL, 0xbfa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
1954    0x3fafa8aeUL, 0x8c5b2da2UL, 0xbfb936bbUL, 0x4e88f7a5UL, 0xbc587d05UL,
1955    0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
1956    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x6dc9c883UL, 0x3fe45f30UL,
1957    0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x43780000UL, 0x00000000UL,
1958    0x43380000UL, 0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL,
1959    0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL, 0x3707344aUL,
1960    0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL, 0x00000000UL, 0x80000000UL,
1961    0x00000000UL, 0x80000000UL, 0x676733afUL, 0x3d32e7b9UL, 0x00000000UL,
1962    0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
1963    0x00000000UL, 0x7ff00000UL, 0x00000000UL, 0x00000000UL, 0xfffc0000UL,
1964    0xffffffffUL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL,
1965    0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL,
1966    0x00000000UL, 0x00000000UL, 0x3ca00000UL, 0x00000000UL, 0x00000000UL,
1967    0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL, 0x00000000UL,
1968    0x40300000UL, 0x00000000UL, 0x3ff00000UL
1969};
1970
1971void MacroAssembler::fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
1972
1973  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;
1974  Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
1975  Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
1976  Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
1977
1978  assert_different_registers(tmp, eax, ecx, edx);
1979
1980  address static_const_table_tan = (address)_static_const_table_tan;
1981
1982  bind(start);
1983  subl(rsp, 120);
1984  movl(Address(rsp, 56), tmp);
1985  lea(tmp, ExternalAddress(static_const_table_tan));
1986  movsd(xmm0, Address(rsp, 128));
1987  pextrw(eax, xmm0, 3);
1988  andl(eax, 32767);
1989  subl(eax, 14368);
1990  cmpl(eax, 2216);
1991  jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
1992  movdqu(xmm5, Address(tmp, 5840));
1993  movdqu(xmm6, Address(tmp, 5856));
1994  unpcklpd(xmm0, xmm0);
1995  movdqu(xmm4, Address(tmp, 5712));
1996  andpd(xmm4, xmm0);
1997  movdqu(xmm1, Address(tmp, 5632));
1998  mulpd(xmm1, xmm0);
1999  por(xmm5, xmm4);
2000  addpd(xmm1, xmm5);
2001  movdqu(xmm7, xmm1);
2002  unpckhpd(xmm7, xmm7);
2003  cvttsd2sil(edx, xmm7);
2004  cvttpd2dq(xmm1, xmm1);
2005  cvtdq2pd(xmm1, xmm1);
2006  mulpd(xmm1, xmm6);
2007  movdqu(xmm3, Address(tmp, 5664));
2008  movsd(xmm5, Address(tmp, 5728));
2009  addl(edx, 469248);
2010  movdqu(xmm4, Address(tmp, 5680));
2011  mulpd(xmm3, xmm1);
2012  andl(edx, 31);
2013  mulsd(xmm5, xmm1);
2014  movl(ecx, edx);
2015  mulpd(xmm4, xmm1);
2016  shll(ecx, 1);
2017  subpd(xmm0, xmm3);
2018  mulpd(xmm1, Address(tmp, 5696));
2019  addl(edx, ecx);
2020  shll(ecx, 2);
2021  addl(edx, ecx);
2022  addsd(xmm5, xmm0);
2023  movdqu(xmm2, xmm0);
2024  subpd(xmm0, xmm4);
2025  movsd(xmm6, Address(tmp, 5744));
2026  shll(edx, 4);
2027  lea(eax, Address(tmp, 0));
2028  andpd(xmm5, Address(tmp, 5776));
2029  movdqu(xmm3, xmm0);
2030  addl(eax, edx);
2031  subpd(xmm2, xmm0);
2032  unpckhpd(xmm0, xmm0);
2033  divsd(xmm6, xmm5);
2034  subpd(xmm2, xmm4);
2035  movdqu(xmm7, Address(eax, 16));
2036  subsd(xmm3, xmm5);
2037  mulpd(xmm7, xmm0);
2038  subpd(xmm2, xmm1);
2039  movdqu(xmm1, Address(eax, 48));
2040  mulpd(xmm1, xmm0);
2041  movdqu(xmm4, Address(eax, 96));
2042  mulpd(xmm4, xmm0);
2043  addsd(xmm2, xmm3);
2044  movdqu(xmm3, xmm0);
2045  mulpd(xmm0, xmm0);
2046  addpd(xmm7, Address(eax, 0));
2047  addpd(xmm1, Address(eax, 32));
2048  mulpd(xmm1, xmm0);
2049  addpd(xmm4, Address(eax, 80));
2050  addpd(xmm7, xmm1);
2051  movdqu(xmm1, Address(eax, 112));
2052  mulpd(xmm1, xmm0);
2053  mulpd(xmm0, xmm0);
2054  addpd(xmm4, xmm1);
2055  movdqu(xmm1, Address(eax, 64));
2056  mulpd(xmm1, xmm0);
2057  addpd(xmm7, xmm1);
2058  movdqu(xmm1, xmm3);
2059  mulpd(xmm3, xmm0);
2060  mulsd(xmm0, xmm0);
2061  mulpd(xmm1, Address(eax, 144));
2062  mulpd(xmm4, xmm3);
2063  movdqu(xmm3, xmm1);
2064  addpd(xmm7, xmm4);
2065  movdqu(xmm4, xmm1);
2066  mulsd(xmm0, xmm7);
2067  unpckhpd(xmm7, xmm7);
2068  addsd(xmm0, xmm7);
2069  unpckhpd(xmm1, xmm1);
2070  addsd(xmm3, xmm1);
2071  subsd(xmm4, xmm3);
2072  addsd(xmm1, xmm4);
2073  movdqu(xmm4, xmm2);
2074  movsd(xmm7, Address(eax, 144));
2075  unpckhpd(xmm2, xmm2);
2076  addsd(xmm7, Address(eax, 152));
2077  mulsd(xmm7, xmm2);
2078  addsd(xmm7, Address(eax, 136));
2079  addsd(xmm7, xmm1);
2080  addsd(xmm0, xmm7);
2081  movsd(xmm7, Address(tmp, 5744));
2082  mulsd(xmm4, xmm6);
2083  movsd(xmm2, Address(eax, 168));
2084  andpd(xmm2, xmm6);
2085  mulsd(xmm5, xmm2);
2086  mulsd(xmm6, Address(eax, 160));
2087  subsd(xmm7, xmm5);
2088  subsd(xmm2, Address(eax, 128));
2089  subsd(xmm7, xmm4);
2090  mulsd(xmm7, xmm6);
2091  movdqu(xmm4, xmm3);
2092  subsd(xmm3, xmm2);
2093  addsd(xmm2, xmm3);
2094  subsd(xmm4, xmm2);
2095  addsd(xmm0, xmm4);
2096  subsd(xmm0, xmm7);
2097  addsd(xmm0, xmm3);
2098  movsd(Address(rsp, 0), xmm0);
2099  fld_d(Address(rsp, 0));
2100  jmp(L_2TAG_PACKET_1_0_2);
2101
2102  bind(L_2TAG_PACKET_0_0_2);
2103  jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
2104  shrl(eax, 4);
2105  cmpl(eax, 268434558);
2106  jcc(Assembler::notEqual, L_2TAG_PACKET_3_0_2);
2107  movdqu(xmm3, xmm0);
2108  mulsd(xmm3, Address(tmp, 5808));
2109
2110  bind(L_2TAG_PACKET_3_0_2);
2111  movsd(xmm3, Address(tmp, 5792));
2112  mulsd(xmm3, xmm0);
2113  addsd(xmm3, xmm0);
2114  mulsd(xmm3, Address(tmp, 5808));
2115  movsd(Address(rsp, 0), xmm3);
2116  fld_d(Address(rsp, 0));
2117  jmp(L_2TAG_PACKET_1_0_2);
2118
2119  bind(L_2TAG_PACKET_2_0_2);
2120  movq(xmm7, Address(tmp, 5712));
2121  andpd(xmm7, xmm0);
2122  xorpd(xmm7, xmm0);
2123  ucomisd(xmm7, Address(tmp, 5760));
2124  jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
2125  subl(rsp, 32);
2126  movsd(Address(rsp, 0), xmm0);
2127  lea(eax, Address(rsp, 40));
2128  movl(Address(rsp, 8), eax);
2129  movl(eax, 2);
2130  movl(Address(rsp, 12), eax);
2131  call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_tan_cot_huge())));
2132  addl(rsp, 32);
2133  fld_d(Address(rsp, 8));
2134  jmp(L_2TAG_PACKET_1_0_2);
2135
2136  bind(L_2TAG_PACKET_4_0_2);
2137  movq(Address(rsp, 0), xmm0);
2138  fld_d(Address(rsp, 0));
2139  fsub_d(Address(rsp, 0));
2140
2141  bind(L_2TAG_PACKET_1_0_2);
2142  movl(tmp, Address(rsp, 56));
2143}
2144#endif
2145