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 - LOG10()
41//                     ---------------------
42//
43//    Let x=2^k * mx, mx in [1,2)
44//
45//    Get B~1/mx based on the output of rcpss instruction (B0)
46//    B = int((B0*LH*2^7+0.5))/2^7
47//    LH is a short approximation for log10(e)
48//
49//    Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
50//
51//    Result:  k*log10(2) - log(B) + p(r)
52//             p(r) is a degree 7 polynomial
53//             -log(B) read from data table (high, low parts)
54//             Result is formed from high and low parts
55//
56// Special cases:
57//  log10(0) = -INF with divide-by-zero exception raised
58//  log10(1) = +0
59//  log10(x) = NaN with invalid exception raised if x < -0, including -INF
60//  log10(+INF) = +INF
61//
62/******************************************************************************/
63
64#ifdef _LP64
65// The 64 bit code is at most SSE2 compliant
66ALIGNED_(16) juint _HIGHSIGMASK_log10[] =
67{
68    0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xffffe000UL
69};
70
71ALIGNED_(16) juint _LOG10_E[] =
72{
73    0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
74};
75
76ALIGNED_(16) juint _L_tbl_log10[] =
77{
78    0x509f7800UL, 0x3fd34413UL, 0x1f12b358UL, 0x3d1fef31UL, 0x80333400UL,
79    0x3fd32418UL, 0xc671d9d0UL, 0xbcf542bfUL, 0x51195000UL, 0x3fd30442UL,
80    0x78a4b0c3UL, 0x3d18216aUL, 0x6fc79400UL, 0x3fd2e490UL, 0x80fa389dUL,
81    0xbc902869UL, 0x89d04000UL, 0x3fd2c502UL, 0x75c2f564UL, 0x3d040754UL,
82    0x4ddd1c00UL, 0x3fd2a598UL, 0xd219b2c3UL, 0xbcfa1d84UL, 0x6baa7c00UL,
83    0x3fd28651UL, 0xfd9abec1UL, 0x3d1be6d3UL, 0x94028800UL, 0x3fd2672dUL,
84    0xe289a455UL, 0xbd1ede5eUL, 0x78b86400UL, 0x3fd2482cUL, 0x6734d179UL,
85    0x3d1fe79bUL, 0xcca3c800UL, 0x3fd2294dUL, 0x981a40b8UL, 0xbced34eaUL,
86    0x439c5000UL, 0x3fd20a91UL, 0xcc392737UL, 0xbd1a9cc3UL, 0x92752c00UL,
87    0x3fd1ebf6UL, 0x03c9afe7UL, 0x3d1e98f8UL, 0x6ef8dc00UL, 0x3fd1cd7dUL,
88    0x71dae7f4UL, 0x3d08a86cUL, 0x8fe4dc00UL, 0x3fd1af25UL, 0xee9185a1UL,
89    0xbcff3412UL, 0xace59400UL, 0x3fd190eeUL, 0xc2cab353UL, 0x3cf17ed9UL,
90    0x7e925000UL, 0x3fd172d8UL, 0x6952c1b2UL, 0x3cf1521cUL, 0xbe694400UL,
91    0x3fd154e2UL, 0xcacb79caUL, 0xbd0bdc78UL, 0x26cbac00UL, 0x3fd1370dUL,
92    0xf71f4de1UL, 0xbd01f8beUL, 0x72fa0800UL, 0x3fd11957UL, 0x55bf910bUL,
93    0x3c946e2bUL, 0x5f106000UL, 0x3fd0fbc1UL, 0x39e639c1UL, 0x3d14a84bUL,
94    0xa802a800UL, 0x3fd0de4aUL, 0xd3f31d5dUL, 0xbd178385UL, 0x0b992000UL,
95    0x3fd0c0f3UL, 0x3843106fUL, 0xbd1f602fUL, 0x486ce800UL, 0x3fd0a3baUL,
96    0x8819497cUL, 0x3cef987aUL, 0x1de49400UL, 0x3fd086a0UL, 0x1caa0467UL,
97    0x3d0faec7UL, 0x4c30cc00UL, 0x3fd069a4UL, 0xa4424372UL, 0xbd1618fcUL,
98    0x94490000UL, 0x3fd04cc6UL, 0x946517d2UL, 0xbd18384bUL, 0xb7e84000UL,
99    0x3fd03006UL, 0xe0109c37UL, 0xbd19a6acUL, 0x798a0c00UL, 0x3fd01364UL,
100    0x5121e864UL, 0xbd164cf7UL, 0x38ce8000UL, 0x3fcfedbfUL, 0x46214d1aUL,
101    0xbcbbc402UL, 0xc8e62000UL, 0x3fcfb4efUL, 0xdab93203UL, 0x3d1e0176UL,
102    0x2cb02800UL, 0x3fcf7c5aUL, 0x2a2ea8e4UL, 0xbcfec86aUL, 0xeeeaa000UL,
103    0x3fcf43fdUL, 0xc18e49a4UL, 0x3cf110a8UL, 0x9bb6e800UL, 0x3fcf0bdaUL,
104    0x923cc9c0UL, 0xbd15ce99UL, 0xc093f000UL, 0x3fced3efUL, 0x4d4b51e9UL,
105    0x3d1a04c7UL, 0xec58f800UL, 0x3fce9c3cUL, 0x163cad59UL, 0x3cac8260UL,
106    0x9a907000UL, 0x3fce2d7dUL, 0x3fa93646UL, 0x3ce4a1c0UL, 0x37311000UL,
107    0x3fcdbf99UL, 0x32abd1fdUL, 0x3d07ea9dUL, 0x6744b800UL, 0x3fcd528cUL,
108    0x4dcbdfd4UL, 0xbd1b08e2UL, 0xe36de800UL, 0x3fcce653UL, 0x0b7b7f7fUL,
109    0xbd1b8f03UL, 0x77506800UL, 0x3fcc7aecUL, 0xa821c9fbUL, 0x3d13c163UL,
110    0x00ff8800UL, 0x3fcc1053UL, 0x536bca76UL, 0xbd074ee5UL, 0x70719800UL,
111    0x3fcba684UL, 0xd7da9b6bUL, 0xbd1fbf16UL, 0xc6f8d800UL, 0x3fcb3d7dUL,
112    0xe2220bb3UL, 0x3d1a295dUL, 0x16c15800UL, 0x3fcad53cUL, 0xe724911eUL,
113    0xbcf55822UL, 0x82533800UL, 0x3fca6dbcUL, 0x6d982371UL, 0x3cac567cUL,
114    0x3c19e800UL, 0x3fca06fcUL, 0x84d17d80UL, 0x3d1da204UL, 0x85ef8000UL,
115    0x3fc9a0f8UL, 0x54466a6aUL, 0xbd002204UL, 0xb0ac2000UL, 0x3fc93baeUL,
116    0xd601fd65UL, 0x3d18840cUL, 0x1bb9b000UL, 0x3fc8d71cUL, 0x7bf58766UL,
117    0xbd14f897UL, 0x34aae800UL, 0x3fc8733eUL, 0x3af6ac24UL, 0xbd0f5c45UL,
118    0x76d68000UL, 0x3fc81012UL, 0x4303e1a1UL, 0xbd1f9a80UL, 0x6af57800UL,
119    0x3fc7ad96UL, 0x43fbcb46UL, 0x3cf4c33eUL, 0xa6c51000UL, 0x3fc74bc7UL,
120    0x70f0eac5UL, 0xbd192e3bUL, 0xccab9800UL, 0x3fc6eaa3UL, 0xc0093dfeUL,
121    0xbd0faf15UL, 0x8b60b800UL, 0x3fc68a28UL, 0xde78d5fdUL, 0xbc9ea4eeUL,
122    0x9d987000UL, 0x3fc62a53UL, 0x962bea6eUL, 0xbd194084UL, 0xc9b0e800UL,
123    0x3fc5cb22UL, 0x888dd999UL, 0x3d1fe201UL, 0xe1634800UL, 0x3fc56c93UL,
124    0x16ada7adUL, 0x3d1b1188UL, 0xc176c000UL, 0x3fc50ea4UL, 0x4159b5b5UL,
125    0xbcf09c08UL, 0x51766000UL, 0x3fc4b153UL, 0x84393d23UL, 0xbcf6a89cUL,
126    0x83695000UL, 0x3fc4549dUL, 0x9f0b8bbbUL, 0x3d1c4b8cUL, 0x538d5800UL,
127    0x3fc3f881UL, 0xf49df747UL, 0x3cf89b99UL, 0xc8138000UL, 0x3fc39cfcUL,
128    0xd503b834UL, 0xbd13b99fUL, 0xf0df0800UL, 0x3fc3420dUL, 0xf011b386UL,
129    0xbd05d8beUL, 0xe7466800UL, 0x3fc2e7b2UL, 0xf39c7bc2UL, 0xbd1bb94eUL,
130    0xcdd62800UL, 0x3fc28de9UL, 0x05e6d69bUL, 0xbd10ed05UL, 0xd015d800UL,
131    0x3fc234b0UL, 0xe29b6c9dUL, 0xbd1ff967UL, 0x224ea800UL, 0x3fc1dc06UL,
132    0x727711fcUL, 0xbcffb30dUL, 0x01540000UL, 0x3fc183e8UL, 0x39786c5aUL,
133    0x3cc23f57UL, 0xb24d9800UL, 0x3fc12c54UL, 0xc905a342UL, 0x3d003a1dUL,
134    0x82835800UL, 0x3fc0d54aUL, 0x9b9920c0UL, 0x3d03b25aUL, 0xc72ac000UL,
135    0x3fc07ec7UL, 0x46f26a24UL, 0x3cf0fa41UL, 0xdd35d800UL, 0x3fc028caUL,
136    0x41d9d6dcUL, 0x3d034a65UL, 0x52474000UL, 0x3fbfa6a4UL, 0x44f66449UL,
137    0x3d19cad3UL, 0x2da3d000UL, 0x3fbefcb8UL, 0x67832999UL, 0x3d18400fUL,
138    0x32a10000UL, 0x3fbe53ceUL, 0x9c0e3b1aUL, 0xbcff62fdUL, 0x556b7000UL,
139    0x3fbdabe3UL, 0x02976913UL, 0xbcf8243bUL, 0x97e88000UL, 0x3fbd04f4UL,
140    0xec793797UL, 0x3d1c0578UL, 0x09647000UL, 0x3fbc5effUL, 0x05fc0565UL,
141    0xbd1d799eUL, 0xc6426000UL, 0x3fbbb9ffUL, 0x4625f5edUL, 0x3d1f5723UL,
142    0xf7afd000UL, 0x3fbb15f3UL, 0xdd5aae61UL, 0xbd1a7e1eUL, 0xd358b000UL,
143    0x3fba72d8UL, 0x3314e4d3UL, 0x3d17bc91UL, 0x9b1f5000UL, 0x3fb9d0abUL,
144    0x9a4d514bUL, 0x3cf18c9bUL, 0x9cd4e000UL, 0x3fb92f69UL, 0x7e4496abUL,
145    0x3cf1f96dUL, 0x31f4f000UL, 0x3fb88f10UL, 0xf56479e7UL, 0x3d165818UL,
146    0xbf628000UL, 0x3fb7ef9cUL, 0x26bf486dUL, 0xbd1113a6UL, 0xb526b000UL,
147    0x3fb7510cUL, 0x1a1c3384UL, 0x3ca9898dUL, 0x8e31e000UL, 0x3fb6b35dUL,
148    0xb3875361UL, 0xbd0661acUL, 0xd01de000UL, 0x3fb6168cUL, 0x2a7cacfaUL,
149    0xbd1bdf10UL, 0x0af23000UL, 0x3fb57a98UL, 0xff868816UL, 0x3cf046d0UL,
150    0xd8ea0000UL, 0x3fb4df7cUL, 0x1515fbe7UL, 0xbd1fd529UL, 0xde3b2000UL,
151    0x3fb44538UL, 0x6e59a132UL, 0x3d1faeeeUL, 0xc8df9000UL, 0x3fb3abc9UL,
152    0xf1322361UL, 0xbd198807UL, 0x505f1000UL, 0x3fb3132dUL, 0x0888e6abUL,
153    0x3d1e5380UL, 0x359bd000UL, 0x3fb27b61UL, 0xdfbcbb22UL, 0xbcfe2724UL,
154    0x429ee000UL, 0x3fb1e463UL, 0x6eb4c58cUL, 0xbcfe4dd6UL, 0x4a673000UL,
155    0x3fb14e31UL, 0x4ce1ac9bUL, 0x3d1ba691UL, 0x28b96000UL, 0x3fb0b8c9UL,
156    0x8c7813b8UL, 0xbd0b3872UL, 0xc1f08000UL, 0x3fb02428UL, 0xc2bc8c2cUL,
157    0x3cb5ea6bUL, 0x05a1a000UL, 0x3faf209cUL, 0x72e8f18eUL, 0xbce8df84UL,
158    0xc0b5e000UL, 0x3fadfa6dUL, 0x9fdef436UL, 0x3d087364UL, 0xaf416000UL,
159    0x3facd5c2UL, 0x1068c3a9UL, 0x3d0827e7UL, 0xdb356000UL, 0x3fabb296UL,
160    0x120a34d3UL, 0x3d101a9fUL, 0x5dfea000UL, 0x3faa90e6UL, 0xdaded264UL,
161    0xbd14c392UL, 0x6034c000UL, 0x3fa970adUL, 0x1c9d06a9UL, 0xbd1b705eUL,
162    0x194c6000UL, 0x3fa851e8UL, 0x83996ad9UL, 0xbd0117bcUL, 0xcf4ac000UL,
163    0x3fa73492UL, 0xb1a94a62UL, 0xbca5ea42UL, 0xd67b4000UL, 0x3fa618a9UL,
164    0x75aed8caUL, 0xbd07119bUL, 0x9126c000UL, 0x3fa4fe29UL, 0x5291d533UL,
165    0x3d12658fUL, 0x6f4d4000UL, 0x3fa3e50eUL, 0xcd2c5cd9UL, 0x3d1d5c70UL,
166    0xee608000UL, 0x3fa2cd54UL, 0xd1008489UL, 0x3d1a4802UL, 0x9900e000UL,
167    0x3fa1b6f9UL, 0x54fb5598UL, 0xbd16593fUL, 0x06bb6000UL, 0x3fa0a1f9UL,
168    0x64ef57b4UL, 0xbd17636bUL, 0xb7940000UL, 0x3f9f1c9fUL, 0xee6a4737UL,
169    0x3cb5d479UL, 0x91aa0000UL, 0x3f9cf7f5UL, 0x3a16373cUL, 0x3d087114UL,
170    0x156b8000UL, 0x3f9ad5edUL, 0x836c554aUL, 0x3c6900b0UL, 0xd4764000UL,
171    0x3f98b67fUL, 0xed12f17bUL, 0xbcffc974UL, 0x77dec000UL, 0x3f9699a7UL,
172    0x232ce7eaUL, 0x3d1e35bbUL, 0xbfbf4000UL, 0x3f947f5dUL, 0xd84ffa6eUL,
173    0x3d0e0a49UL, 0x82c7c000UL, 0x3f92679cUL, 0x8d170e90UL, 0xbd14d9f2UL,
174    0xadd20000UL, 0x3f90525dUL, 0x86d9f88eUL, 0x3cdeb986UL, 0x86f10000UL,
175    0x3f8c7f36UL, 0xb9e0a517UL, 0x3ce29faaUL, 0xb75c8000UL, 0x3f885e9eUL,
176    0x542568cbUL, 0xbd1f7bdbUL, 0x46b30000UL, 0x3f8442e8UL, 0xb954e7d9UL,
177    0x3d1e5287UL, 0xb7e60000UL, 0x3f802c07UL, 0x22da0b17UL, 0xbd19fb27UL,
178    0x6c8b0000UL, 0x3f7833e3UL, 0x821271efUL, 0xbd190f96UL, 0x29910000UL,
179    0x3f701936UL, 0xbc3491a5UL, 0xbd1bcf45UL, 0x354a0000UL, 0x3f600fe3UL,
180    0xc0ff520aUL, 0xbd19d71cUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
181    0x00000000UL
182};
183
184ALIGNED_(16) juint _log2_log10[] =
185{
186    0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL
187};
188
189ALIGNED_(16) juint _coeff_log10[] =
190{
191    0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL, 0xc0089309UL, 0x385593b1UL,
192    0xc025c917UL, 0xdc963467UL, 0x3ffc6a02UL, 0x7f9d3aa1UL, 0x4016ab9fUL,
193    0xdc77b115UL, 0xbff27af2UL
194};
195
196// Registers:
197// input: xmm0
198// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
199//          rax, rdx, rcx, tmp - r11
200
201// Code generated by Intel C compiler for LIBM library
202
203void MacroAssembler::fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register r11) {
204  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;
205  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;
206  Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, B1_2, B1_3, B1_4, B1_5, start;
207
208  assert_different_registers(r11, eax, ecx, edx);
209
210  address HIGHSIGMASK = (address)_HIGHSIGMASK_log10;
211  address LOG10_E = (address)_LOG10_E;
212  address L_tbl = (address)_L_tbl_log10;
213  address log2 = (address)_log2_log10;
214  address coeff = (address)_coeff_log10;
215
216  bind(start);
217  subq(rsp, 24);
218  movsd(Address(rsp, 0), xmm0);
219
220  bind(B1_2);
221  xorpd(xmm2, xmm2);
222  movl(eax, 16368);
223  pinsrw(xmm2, eax, 3);
224  movl(ecx, 1054736384);
225  movdl(xmm7, ecx);
226  xorpd(xmm3, xmm3);
227  movl(edx, 30704);
228  pinsrw(xmm3, edx, 3);
229  movdqu(xmm1, xmm0);
230  movl(edx, 32768);
231  movdl(xmm4, edx);
232  movdqu(xmm5, ExternalAddress(HIGHSIGMASK));    //0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xffffe000UL
233  pextrw(eax, xmm0, 3);
234  por(xmm0, xmm2);
235  movl(ecx, 16352);
236  psrlq(xmm0, 27);
237  movdqu(xmm2, ExternalAddress(LOG10_E));    //0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
238  psrld(xmm0, 2);
239  rcpps(xmm0, xmm0);
240  psllq(xmm1, 12);
241  pshufd(xmm6, xmm5, 78);
242  psrlq(xmm1, 12);
243  subl(eax, 16);
244  cmpl(eax, 32736);
245  jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
246
247  bind(L_2TAG_PACKET_1_0_2);
248  mulss(xmm0, xmm7);
249  por(xmm1, xmm3);
250  lea(r11, ExternalAddress(L_tbl));
251  andpd(xmm5, xmm1);
252  paddd(xmm0, xmm4);
253  subsd(xmm1, xmm5);
254  movdl(edx, xmm0);
255  psllq(xmm0, 29);
256  andpd(xmm0, xmm6);
257  andl(eax, 32752);
258  subl(eax, ecx);
259  cvtsi2sdl(xmm7, eax);
260  mulpd(xmm5, xmm0);
261  mulsd(xmm1, xmm0);
262  movq(xmm6, ExternalAddress(log2));    //0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL
263  movdqu(xmm3, ExternalAddress(coeff));    //0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL, 0xc0089309UL
264  subsd(xmm5, xmm2);
265  andl(edx, 16711680);
266  shrl(edx, 12);
267  movdqu(xmm0, Address(r11, rdx, Address::times_1, -1504));
268  movdqu(xmm4, ExternalAddress(16 + coeff));    //0x385593b1UL, 0xc025c917UL, 0xdc963467UL, 0x3ffc6a02UL
269  addsd(xmm1, xmm5);
270  movdqu(xmm2, ExternalAddress(32 + coeff));    //0x7f9d3aa1UL, 0x4016ab9fUL, 0xdc77b115UL, 0xbff27af2UL
271  mulsd(xmm6, xmm7);
272  pshufd(xmm5, xmm1, 68);
273  mulsd(xmm7, ExternalAddress(8 + log2));    //0x1f12b358UL, 0x3cdfef31UL
274  mulsd(xmm3, xmm1);
275  addsd(xmm0, xmm6);
276  mulpd(xmm4, xmm5);
277  movq(xmm6, ExternalAddress(8 + LOG10_E));    //0xbf2e4108UL, 0x3f5a7a6cUL
278  mulpd(xmm5, xmm5);
279  addpd(xmm4, xmm2);
280  mulpd(xmm3, xmm5);
281  pshufd(xmm2, xmm0, 228);
282  addsd(xmm0, xmm1);
283  mulsd(xmm4, xmm1);
284  subsd(xmm2, xmm0);
285  mulsd(xmm6, xmm1);
286  addsd(xmm1, xmm2);
287  pshufd(xmm2, xmm0, 238);
288  mulsd(xmm5, xmm5);
289  addsd(xmm7, xmm2);
290  addsd(xmm1, xmm6);
291  addpd(xmm4, xmm3);
292  addsd(xmm1, xmm7);
293  mulpd(xmm4, xmm5);
294  addsd(xmm1, xmm4);
295  pshufd(xmm5, xmm4, 238);
296  addsd(xmm1, xmm5);
297  addsd(xmm0, xmm1);
298  jmp(B1_5);
299
300  bind(L_2TAG_PACKET_0_0_2);
301  movq(xmm0, Address(rsp, 0));
302  movq(xmm1, Address(rsp, 0));
303  addl(eax, 16);
304  cmpl(eax, 32768);
305  jcc(Assembler::aboveEqual, L_2TAG_PACKET_2_0_2);
306  cmpl(eax, 16);
307  jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
308
309  bind(L_2TAG_PACKET_4_0_2);
310  addsd(xmm0, xmm0);
311  jmp(B1_5);
312
313  bind(L_2TAG_PACKET_5_0_2);
314  jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
315  cmpl(edx, 0);
316  jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
317  jmp(L_2TAG_PACKET_6_0_2);
318
319  bind(L_2TAG_PACKET_3_0_2);
320  xorpd(xmm1, xmm1);
321  addsd(xmm1, xmm0);
322  movdl(edx, xmm1);
323  psrlq(xmm1, 32);
324  movdl(ecx, xmm1);
325  orl(edx, ecx);
326  cmpl(edx, 0);
327  jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
328  xorpd(xmm1, xmm1);
329  movl(eax, 18416);
330  pinsrw(xmm1, eax, 3);
331  mulsd(xmm0, xmm1);
332  xorpd(xmm2, xmm2);
333  movl(eax, 16368);
334  pinsrw(xmm2, eax, 3);
335  movdqu(xmm1, xmm0);
336  pextrw(eax, xmm0, 3);
337  por(xmm0, xmm2);
338  movl(ecx, 18416);
339  psrlq(xmm0, 27);
340  movdqu(xmm2, ExternalAddress(LOG10_E));    //0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
341  psrld(xmm0, 2);
342  rcpps(xmm0, xmm0);
343  psllq(xmm1, 12);
344  pshufd(xmm6, xmm5, 78);
345  psrlq(xmm1, 12);
346  jmp(L_2TAG_PACKET_1_0_2);
347
348  bind(L_2TAG_PACKET_2_0_2);
349  movdl(edx, xmm1);
350  psrlq(xmm1, 32);
351  movdl(ecx, xmm1);
352  addl(ecx, ecx);
353  cmpl(ecx, -2097152);
354  jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
355  orl(edx, ecx);
356  cmpl(edx, 0);
357  jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
358
359  bind(L_2TAG_PACKET_6_0_2);
360  xorpd(xmm1, xmm1);
361  xorpd(xmm0, xmm0);
362  movl(eax, 32752);
363  pinsrw(xmm1, eax, 3);
364  mulsd(xmm0, xmm1);
365  movl(Address(rsp, 16), 9);
366  jmp(L_2TAG_PACKET_8_0_2);
367
368  bind(L_2TAG_PACKET_7_0_2);
369  xorpd(xmm1, xmm1);
370  xorpd(xmm0, xmm0);
371  movl(eax, 49136);
372  pinsrw(xmm0, eax, 3);
373  divsd(xmm0, xmm1);
374  movl(Address(rsp, 16), 8);
375
376  bind(L_2TAG_PACKET_8_0_2);
377  movq(Address(rsp, 8), xmm0);
378
379  bind(B1_3);
380  movq(xmm0, Address(rsp, 8));
381
382  bind(L_2TAG_PACKET_9_0_2);
383
384  bind(B1_5);
385  addq(rsp, 24);
386
387}
388#else
389// The 32 bit code is at most SSE2 compliant
390ALIGNED_(16) juint _static_const_table_log10[] =
391{
392    0x509f7800UL, 0x3fd34413UL, 0x1f12b358UL, 0x3d1fef31UL, 0x80333400UL,
393    0x3fd32418UL, 0xc671d9d0UL, 0xbcf542bfUL, 0x51195000UL, 0x3fd30442UL,
394    0x78a4b0c3UL, 0x3d18216aUL, 0x6fc79400UL, 0x3fd2e490UL, 0x80fa389dUL,
395    0xbc902869UL, 0x89d04000UL, 0x3fd2c502UL, 0x75c2f564UL, 0x3d040754UL,
396    0x4ddd1c00UL, 0x3fd2a598UL, 0xd219b2c3UL, 0xbcfa1d84UL, 0x6baa7c00UL,
397    0x3fd28651UL, 0xfd9abec1UL, 0x3d1be6d3UL, 0x94028800UL, 0x3fd2672dUL,
398    0xe289a455UL, 0xbd1ede5eUL, 0x78b86400UL, 0x3fd2482cUL, 0x6734d179UL,
399    0x3d1fe79bUL, 0xcca3c800UL, 0x3fd2294dUL, 0x981a40b8UL, 0xbced34eaUL,
400    0x439c5000UL, 0x3fd20a91UL, 0xcc392737UL, 0xbd1a9cc3UL, 0x92752c00UL,
401    0x3fd1ebf6UL, 0x03c9afe7UL, 0x3d1e98f8UL, 0x6ef8dc00UL, 0x3fd1cd7dUL,
402    0x71dae7f4UL, 0x3d08a86cUL, 0x8fe4dc00UL, 0x3fd1af25UL, 0xee9185a1UL,
403    0xbcff3412UL, 0xace59400UL, 0x3fd190eeUL, 0xc2cab353UL, 0x3cf17ed9UL,
404    0x7e925000UL, 0x3fd172d8UL, 0x6952c1b2UL, 0x3cf1521cUL, 0xbe694400UL,
405    0x3fd154e2UL, 0xcacb79caUL, 0xbd0bdc78UL, 0x26cbac00UL, 0x3fd1370dUL,
406    0xf71f4de1UL, 0xbd01f8beUL, 0x72fa0800UL, 0x3fd11957UL, 0x55bf910bUL,
407    0x3c946e2bUL, 0x5f106000UL, 0x3fd0fbc1UL, 0x39e639c1UL, 0x3d14a84bUL,
408    0xa802a800UL, 0x3fd0de4aUL, 0xd3f31d5dUL, 0xbd178385UL, 0x0b992000UL,
409    0x3fd0c0f3UL, 0x3843106fUL, 0xbd1f602fUL, 0x486ce800UL, 0x3fd0a3baUL,
410    0x8819497cUL, 0x3cef987aUL, 0x1de49400UL, 0x3fd086a0UL, 0x1caa0467UL,
411    0x3d0faec7UL, 0x4c30cc00UL, 0x3fd069a4UL, 0xa4424372UL, 0xbd1618fcUL,
412    0x94490000UL, 0x3fd04cc6UL, 0x946517d2UL, 0xbd18384bUL, 0xb7e84000UL,
413    0x3fd03006UL, 0xe0109c37UL, 0xbd19a6acUL, 0x798a0c00UL, 0x3fd01364UL,
414    0x5121e864UL, 0xbd164cf7UL, 0x38ce8000UL, 0x3fcfedbfUL, 0x46214d1aUL,
415    0xbcbbc402UL, 0xc8e62000UL, 0x3fcfb4efUL, 0xdab93203UL, 0x3d1e0176UL,
416    0x2cb02800UL, 0x3fcf7c5aUL, 0x2a2ea8e4UL, 0xbcfec86aUL, 0xeeeaa000UL,
417    0x3fcf43fdUL, 0xc18e49a4UL, 0x3cf110a8UL, 0x9bb6e800UL, 0x3fcf0bdaUL,
418    0x923cc9c0UL, 0xbd15ce99UL, 0xc093f000UL, 0x3fced3efUL, 0x4d4b51e9UL,
419    0x3d1a04c7UL, 0xec58f800UL, 0x3fce9c3cUL, 0x163cad59UL, 0x3cac8260UL,
420    0x9a907000UL, 0x3fce2d7dUL, 0x3fa93646UL, 0x3ce4a1c0UL, 0x37311000UL,
421    0x3fcdbf99UL, 0x32abd1fdUL, 0x3d07ea9dUL, 0x6744b800UL, 0x3fcd528cUL,
422    0x4dcbdfd4UL, 0xbd1b08e2UL, 0xe36de800UL, 0x3fcce653UL, 0x0b7b7f7fUL,
423    0xbd1b8f03UL, 0x77506800UL, 0x3fcc7aecUL, 0xa821c9fbUL, 0x3d13c163UL,
424    0x00ff8800UL, 0x3fcc1053UL, 0x536bca76UL, 0xbd074ee5UL, 0x70719800UL,
425    0x3fcba684UL, 0xd7da9b6bUL, 0xbd1fbf16UL, 0xc6f8d800UL, 0x3fcb3d7dUL,
426    0xe2220bb3UL, 0x3d1a295dUL, 0x16c15800UL, 0x3fcad53cUL, 0xe724911eUL,
427    0xbcf55822UL, 0x82533800UL, 0x3fca6dbcUL, 0x6d982371UL, 0x3cac567cUL,
428    0x3c19e800UL, 0x3fca06fcUL, 0x84d17d80UL, 0x3d1da204UL, 0x85ef8000UL,
429    0x3fc9a0f8UL, 0x54466a6aUL, 0xbd002204UL, 0xb0ac2000UL, 0x3fc93baeUL,
430    0xd601fd65UL, 0x3d18840cUL, 0x1bb9b000UL, 0x3fc8d71cUL, 0x7bf58766UL,
431    0xbd14f897UL, 0x34aae800UL, 0x3fc8733eUL, 0x3af6ac24UL, 0xbd0f5c45UL,
432    0x76d68000UL, 0x3fc81012UL, 0x4303e1a1UL, 0xbd1f9a80UL, 0x6af57800UL,
433    0x3fc7ad96UL, 0x43fbcb46UL, 0x3cf4c33eUL, 0xa6c51000UL, 0x3fc74bc7UL,
434    0x70f0eac5UL, 0xbd192e3bUL, 0xccab9800UL, 0x3fc6eaa3UL, 0xc0093dfeUL,
435    0xbd0faf15UL, 0x8b60b800UL, 0x3fc68a28UL, 0xde78d5fdUL, 0xbc9ea4eeUL,
436    0x9d987000UL, 0x3fc62a53UL, 0x962bea6eUL, 0xbd194084UL, 0xc9b0e800UL,
437    0x3fc5cb22UL, 0x888dd999UL, 0x3d1fe201UL, 0xe1634800UL, 0x3fc56c93UL,
438    0x16ada7adUL, 0x3d1b1188UL, 0xc176c000UL, 0x3fc50ea4UL, 0x4159b5b5UL,
439    0xbcf09c08UL, 0x51766000UL, 0x3fc4b153UL, 0x84393d23UL, 0xbcf6a89cUL,
440    0x83695000UL, 0x3fc4549dUL, 0x9f0b8bbbUL, 0x3d1c4b8cUL, 0x538d5800UL,
441    0x3fc3f881UL, 0xf49df747UL, 0x3cf89b99UL, 0xc8138000UL, 0x3fc39cfcUL,
442    0xd503b834UL, 0xbd13b99fUL, 0xf0df0800UL, 0x3fc3420dUL, 0xf011b386UL,
443    0xbd05d8beUL, 0xe7466800UL, 0x3fc2e7b2UL, 0xf39c7bc2UL, 0xbd1bb94eUL,
444    0xcdd62800UL, 0x3fc28de9UL, 0x05e6d69bUL, 0xbd10ed05UL, 0xd015d800UL,
445    0x3fc234b0UL, 0xe29b6c9dUL, 0xbd1ff967UL, 0x224ea800UL, 0x3fc1dc06UL,
446    0x727711fcUL, 0xbcffb30dUL, 0x01540000UL, 0x3fc183e8UL, 0x39786c5aUL,
447    0x3cc23f57UL, 0xb24d9800UL, 0x3fc12c54UL, 0xc905a342UL, 0x3d003a1dUL,
448    0x82835800UL, 0x3fc0d54aUL, 0x9b9920c0UL, 0x3d03b25aUL, 0xc72ac000UL,
449    0x3fc07ec7UL, 0x46f26a24UL, 0x3cf0fa41UL, 0xdd35d800UL, 0x3fc028caUL,
450    0x41d9d6dcUL, 0x3d034a65UL, 0x52474000UL, 0x3fbfa6a4UL, 0x44f66449UL,
451    0x3d19cad3UL, 0x2da3d000UL, 0x3fbefcb8UL, 0x67832999UL, 0x3d18400fUL,
452    0x32a10000UL, 0x3fbe53ceUL, 0x9c0e3b1aUL, 0xbcff62fdUL, 0x556b7000UL,
453    0x3fbdabe3UL, 0x02976913UL, 0xbcf8243bUL, 0x97e88000UL, 0x3fbd04f4UL,
454    0xec793797UL, 0x3d1c0578UL, 0x09647000UL, 0x3fbc5effUL, 0x05fc0565UL,
455    0xbd1d799eUL, 0xc6426000UL, 0x3fbbb9ffUL, 0x4625f5edUL, 0x3d1f5723UL,
456    0xf7afd000UL, 0x3fbb15f3UL, 0xdd5aae61UL, 0xbd1a7e1eUL, 0xd358b000UL,
457    0x3fba72d8UL, 0x3314e4d3UL, 0x3d17bc91UL, 0x9b1f5000UL, 0x3fb9d0abUL,
458    0x9a4d514bUL, 0x3cf18c9bUL, 0x9cd4e000UL, 0x3fb92f69UL, 0x7e4496abUL,
459    0x3cf1f96dUL, 0x31f4f000UL, 0x3fb88f10UL, 0xf56479e7UL, 0x3d165818UL,
460    0xbf628000UL, 0x3fb7ef9cUL, 0x26bf486dUL, 0xbd1113a6UL, 0xb526b000UL,
461    0x3fb7510cUL, 0x1a1c3384UL, 0x3ca9898dUL, 0x8e31e000UL, 0x3fb6b35dUL,
462    0xb3875361UL, 0xbd0661acUL, 0xd01de000UL, 0x3fb6168cUL, 0x2a7cacfaUL,
463    0xbd1bdf10UL, 0x0af23000UL, 0x3fb57a98UL, 0xff868816UL, 0x3cf046d0UL,
464    0xd8ea0000UL, 0x3fb4df7cUL, 0x1515fbe7UL, 0xbd1fd529UL, 0xde3b2000UL,
465    0x3fb44538UL, 0x6e59a132UL, 0x3d1faeeeUL, 0xc8df9000UL, 0x3fb3abc9UL,
466    0xf1322361UL, 0xbd198807UL, 0x505f1000UL, 0x3fb3132dUL, 0x0888e6abUL,
467    0x3d1e5380UL, 0x359bd000UL, 0x3fb27b61UL, 0xdfbcbb22UL, 0xbcfe2724UL,
468    0x429ee000UL, 0x3fb1e463UL, 0x6eb4c58cUL, 0xbcfe4dd6UL, 0x4a673000UL,
469    0x3fb14e31UL, 0x4ce1ac9bUL, 0x3d1ba691UL, 0x28b96000UL, 0x3fb0b8c9UL,
470    0x8c7813b8UL, 0xbd0b3872UL, 0xc1f08000UL, 0x3fb02428UL, 0xc2bc8c2cUL,
471    0x3cb5ea6bUL, 0x05a1a000UL, 0x3faf209cUL, 0x72e8f18eUL, 0xbce8df84UL,
472    0xc0b5e000UL, 0x3fadfa6dUL, 0x9fdef436UL, 0x3d087364UL, 0xaf416000UL,
473    0x3facd5c2UL, 0x1068c3a9UL, 0x3d0827e7UL, 0xdb356000UL, 0x3fabb296UL,
474    0x120a34d3UL, 0x3d101a9fUL, 0x5dfea000UL, 0x3faa90e6UL, 0xdaded264UL,
475    0xbd14c392UL, 0x6034c000UL, 0x3fa970adUL, 0x1c9d06a9UL, 0xbd1b705eUL,
476    0x194c6000UL, 0x3fa851e8UL, 0x83996ad9UL, 0xbd0117bcUL, 0xcf4ac000UL,
477    0x3fa73492UL, 0xb1a94a62UL, 0xbca5ea42UL, 0xd67b4000UL, 0x3fa618a9UL,
478    0x75aed8caUL, 0xbd07119bUL, 0x9126c000UL, 0x3fa4fe29UL, 0x5291d533UL,
479    0x3d12658fUL, 0x6f4d4000UL, 0x3fa3e50eUL, 0xcd2c5cd9UL, 0x3d1d5c70UL,
480    0xee608000UL, 0x3fa2cd54UL, 0xd1008489UL, 0x3d1a4802UL, 0x9900e000UL,
481    0x3fa1b6f9UL, 0x54fb5598UL, 0xbd16593fUL, 0x06bb6000UL, 0x3fa0a1f9UL,
482    0x64ef57b4UL, 0xbd17636bUL, 0xb7940000UL, 0x3f9f1c9fUL, 0xee6a4737UL,
483    0x3cb5d479UL, 0x91aa0000UL, 0x3f9cf7f5UL, 0x3a16373cUL, 0x3d087114UL,
484    0x156b8000UL, 0x3f9ad5edUL, 0x836c554aUL, 0x3c6900b0UL, 0xd4764000UL,
485    0x3f98b67fUL, 0xed12f17bUL, 0xbcffc974UL, 0x77dec000UL, 0x3f9699a7UL,
486    0x232ce7eaUL, 0x3d1e35bbUL, 0xbfbf4000UL, 0x3f947f5dUL, 0xd84ffa6eUL,
487    0x3d0e0a49UL, 0x82c7c000UL, 0x3f92679cUL, 0x8d170e90UL, 0xbd14d9f2UL,
488    0xadd20000UL, 0x3f90525dUL, 0x86d9f88eUL, 0x3cdeb986UL, 0x86f10000UL,
489    0x3f8c7f36UL, 0xb9e0a517UL, 0x3ce29faaUL, 0xb75c8000UL, 0x3f885e9eUL,
490    0x542568cbUL, 0xbd1f7bdbUL, 0x46b30000UL, 0x3f8442e8UL, 0xb954e7d9UL,
491    0x3d1e5287UL, 0xb7e60000UL, 0x3f802c07UL, 0x22da0b17UL, 0xbd19fb27UL,
492    0x6c8b0000UL, 0x3f7833e3UL, 0x821271efUL, 0xbd190f96UL, 0x29910000UL,
493    0x3f701936UL, 0xbc3491a5UL, 0xbd1bcf45UL, 0x354a0000UL, 0x3f600fe3UL,
494    0xc0ff520aUL, 0xbd19d71cUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
495    0x00000000UL, 0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL,
496    0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL, 0xc0089309UL, 0x385593b1UL,
497    0xc025c917UL, 0xdc963467UL, 0x3ffc6a02UL, 0x7f9d3aa1UL, 0x4016ab9fUL,
498    0xdc77b115UL, 0xbff27af2UL, 0xf8000000UL, 0xffffffffUL, 0x00000000UL,
499    0xffffe000UL, 0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
500};
501//registers,
502// input: xmm0
503// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
504//          rax, rdx, rcx, rbx (tmp)
505
506void MacroAssembler::fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
507
508  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;
509  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;
510  Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, start;
511
512  assert_different_registers(tmp, eax, ecx, edx);
513
514  address static_const_table_log10 = (address)_static_const_table_log10;
515
516  bind(start);
517  subl(rsp, 104);
518  movl(Address(rsp, 40), tmp);
519  lea(tmp, ExternalAddress(static_const_table_log10));
520  xorpd(xmm2, xmm2);
521  movl(eax, 16368);
522  pinsrw(xmm2, eax, 3);
523  movl(ecx, 1054736384);
524  movdl(xmm7, ecx);
525  xorpd(xmm3, xmm3);
526  movl(edx, 30704);
527  pinsrw(xmm3, edx, 3);
528  movsd(xmm0, Address(rsp, 112));
529  movdqu(xmm1, xmm0);
530  movl(edx, 32768);
531  movdl(xmm4, edx);
532  movdqu(xmm5, Address(tmp, 2128));    //0x3ffc6a02UL, 0x7f9d3aa1UL, 0x4016ab9fUL, 0xdc77b115UL
533  pextrw(eax, xmm0, 3);
534  por(xmm0, xmm2);
535  movl(ecx, 16352);
536  psllq(xmm0, 5);
537  movsd(xmm2, Address(tmp, 2144));    //0xbff27af2UL, 0xf8000000UL, 0xffffffffUL, 0x00000000UL
538  psrlq(xmm0, 34);
539  rcpss(xmm0, xmm0);
540  psllq(xmm1, 12);
541  pshufd(xmm6, xmm5, 78);
542  psrlq(xmm1, 12);
543  subl(eax, 16);
544  cmpl(eax, 32736);
545  jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
546
547  bind(L_2TAG_PACKET_1_0_2);
548  mulss(xmm0, xmm7);
549  por(xmm1, xmm3);
550  andpd(xmm5, xmm1);
551  paddd(xmm0, xmm4);
552  subsd(xmm1, xmm5);
553  movdl(edx, xmm0);
554  psllq(xmm0, 29);
555  andpd(xmm0, xmm6);
556  andl(eax, 32752);
557  subl(eax, ecx);
558  cvtsi2sdl(xmm7, eax);
559  mulpd(xmm5, xmm0);
560  mulsd(xmm1, xmm0);
561  movsd(xmm6, Address(tmp, 2064));    //0xbd19d71cUL, 0x00000000UL, 0x00000000UL, 0x00000000UL
562  movdqu(xmm3, Address(tmp, 2080));    //0x00000000UL, 0x509f7800UL, 0x3f934413UL, 0x1f12b358UL
563  subsd(xmm5, xmm2);
564  andl(edx, 16711680);
565  shrl(edx, 12);
566  movdqu(xmm0, Address(tmp, edx, Address::times_1, -1504));
567  movdqu(xmm4, Address(tmp, 2096));    //0x3cdfef31UL, 0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL
568  addsd(xmm1, xmm5);
569  movdqu(xmm2, Address(tmp, 2112));    //0xc0089309UL, 0x385593b1UL, 0xc025c917UL, 0xdc963467UL
570  mulsd(xmm6, xmm7);
571  pshufd(xmm5, xmm1, 68);
572  mulsd(xmm7, Address(tmp, 2072));    //0x00000000UL, 0x00000000UL, 0x00000000UL, 0x509f7800UL
573  mulsd(xmm3, xmm1);
574  addsd(xmm0, xmm6);
575  mulpd(xmm4, xmm5);
576  movsd(xmm6, Address(tmp, 2152));    //0xffffffffUL, 0x00000000UL, 0xffffe000UL, 0x00000000UL
577  mulpd(xmm5, xmm5);
578  addpd(xmm4, xmm2);
579  mulpd(xmm3, xmm5);
580  pshufd(xmm2, xmm0, 228);
581  addsd(xmm0, xmm1);
582  mulsd(xmm4, xmm1);
583  subsd(xmm2, xmm0);
584  mulsd(xmm6, xmm1);
585  addsd(xmm1, xmm2);
586  pshufd(xmm2, xmm0, 238);
587  mulsd(xmm5, xmm5);
588  addsd(xmm7, xmm2);
589  addsd(xmm1, xmm6);
590  addpd(xmm4, xmm3);
591  addsd(xmm1, xmm7);
592  mulpd(xmm4, xmm5);
593  addsd(xmm1, xmm4);
594  pshufd(xmm5, xmm4, 238);
595  addsd(xmm1, xmm5);
596  addsd(xmm0, xmm1);
597  jmp(L_2TAG_PACKET_2_0_2);
598
599  bind(L_2TAG_PACKET_0_0_2);
600  movsd(xmm0, Address(rsp, 112));    //0xbcfa1d84UL, 0x6baa7c00UL, 0x3fd28651UL, 0xfd9abec1UL
601  movdqu(xmm1, xmm0);
602  addl(eax, 16);
603  cmpl(eax, 32768);
604  jcc(Assembler::aboveEqual, L_2TAG_PACKET_3_0_2);
605  cmpl(eax, 16);
606  jcc(Assembler::below, L_2TAG_PACKET_4_0_2);
607
608  bind(L_2TAG_PACKET_5_0_2);
609  addsd(xmm0, xmm0);
610  jmp(L_2TAG_PACKET_2_0_2);
611
612  bind(L_2TAG_PACKET_6_0_2);
613  jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
614  cmpl(edx, 0);
615  jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
616  jmp(L_2TAG_PACKET_7_0_2);
617
618  bind(L_2TAG_PACKET_3_0_2);
619  movdl(edx, xmm1);
620  psrlq(xmm1, 32);
621  movdl(ecx, xmm1);
622  addl(ecx, ecx);
623  cmpl(ecx, -2097152);
624  jcc(Assembler::aboveEqual, L_2TAG_PACKET_6_0_2);
625  orl(edx, ecx);
626  cmpl(edx, 0);
627  jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
628
629  bind(L_2TAG_PACKET_7_0_2);
630  xorpd(xmm1, xmm1);
631  xorpd(xmm0, xmm0);
632  movl(eax, 32752);
633  pinsrw(xmm1, eax, 3);
634  movl(edx, 9);
635  mulsd(xmm0, xmm1);
636
637  bind(L_2TAG_PACKET_9_0_2);
638  movsd(Address(rsp, 0), xmm0);
639  movsd(xmm0, Address(rsp, 112));    //0xbcfa1d84UL, 0x6baa7c00UL, 0x3fd28651UL, 0xfd9abec1UL
640  fld_d(Address(rsp, 0));
641  jmp(L_2TAG_PACKET_10_0_2);
642
643  bind(L_2TAG_PACKET_8_0_2);
644  xorpd(xmm1, xmm1);
645  xorpd(xmm0, xmm0);
646  movl(eax, 49136);
647  pinsrw(xmm0, eax, 3);
648  divsd(xmm0, xmm1);
649  movl(edx, 8);
650  jmp(L_2TAG_PACKET_9_0_2);
651
652  bind(L_2TAG_PACKET_4_0_2);
653  movdl(edx, xmm1);
654  psrlq(xmm1, 32);
655  movdl(ecx, xmm1);
656  orl(edx, ecx);
657  cmpl(edx, 0);
658  jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
659  xorpd(xmm1, xmm1);
660  movl(eax, 18416);
661  pinsrw(xmm1, eax, 3);
662  mulsd(xmm0, xmm1);
663  xorpd(xmm2, xmm2);
664  movl(eax, 16368);
665  pinsrw(xmm2, eax, 3);
666  movdqu(xmm1, xmm0);
667  pextrw(eax, xmm0, 3);
668  por(xmm0, xmm2);
669  movl(ecx, 18416);
670  psllq(xmm0, 5);
671  movsd(xmm2, Address(tmp, 2144));    //0xbff27af2UL, 0xf8000000UL, 0xffffffffUL, 0x00000000UL
672  psrlq(xmm0, 34);
673  rcpss(xmm0, xmm0);
674  psllq(xmm1, 12);
675  pshufd(xmm6, xmm5, 78);
676  psrlq(xmm1, 12);
677  jmp(L_2TAG_PACKET_1_0_2);
678
679  bind(L_2TAG_PACKET_2_0_2);
680  movsd(Address(rsp, 24), xmm0);
681  fld_d(Address(rsp, 24));
682
683  bind(L_2TAG_PACKET_10_0_2);
684  movl(tmp, Address(rsp, 40));
685
686}
687#endif
688