1/*
2* Copyright (c) 2016, Intel Corporation.
3* Intel Math Library (LIBM) Source Code
4*
5* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6*
7* This code is free software; you can redistribute it and/or modify it
8* under the terms of the GNU General Public License version 2 only, as
9* published by the Free Software Foundation.
10*
11* This code is distributed in the hope that it will be useful, but WITHOUT
12* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14* version 2 for more details (a copy is included in the LICENSE file that
15* accompanied this code).
16*
17* You should have received a copy of the GNU General Public License version
18* 2 along with this work; if not, write to the Free Software Foundation,
19* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*
21* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22* or visit www.oracle.com if you need additional information or have any
23* questions.
24*
25*/
26
27#include "precompiled.hpp"
28#include "asm/assembler.hpp"
29#include "asm/assembler.inline.hpp"
30#include "macroAssembler_x86.hpp"
31
32#ifdef _MSC_VER
33#define ALIGNED_(x) __declspec(align(x))
34#else
35#define ALIGNED_(x) __attribute__ ((aligned(x)))
36#endif
37
38/******************************************************************************/
39//                     ALGORITHM DESCRIPTION - LOG()
40//                     ---------------------
41//
42//    x=2^k * mx, mx in [1,2)
43//
44//    Get B~1/mx based on the output of rcpss instruction (B0)
45//    B = int((B0*2^7+0.5))/2^7
46//
47//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
48//
49//    Result:  k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6)  and
50//             p(r) is a degree 7 polynomial
51//             -log(B) read from data table (high, low parts)
52//             Result is formed from high and low parts
53//
54// Special cases:
55//  log(NaN) = quiet NaN, and raise invalid exception
56//  log(+INF) = that INF
57//  log(0) = -INF with divide-by-zero exception raised
58//  log(1) = +0
59//  log(x) = NaN with invalid exception raised if x < -0, including -INF
60//
61/******************************************************************************/
62
63#ifdef _LP64
64// The 64 bit code is at most SSE2 compliant
65ALIGNED_(16) juint _L_tbl[] =
66{
67    0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
68    0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
69    0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
70    0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
71    0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
72    0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
73    0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
74    0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
75    0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
76    0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
77    0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
78    0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
79    0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
80    0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
81    0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
82    0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
83    0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
84    0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
85    0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
86    0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
87    0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
88    0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
89    0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
90    0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
91    0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
92    0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
93    0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
94    0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
95    0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
96    0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
97    0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
98    0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
99    0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
100    0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
101    0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
102    0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
103    0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
104    0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
105    0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
106    0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
107    0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
108    0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
109    0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
110    0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
111    0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
112    0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
113    0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
114    0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
115    0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
116    0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
117    0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
118    0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
119    0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
120    0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
121    0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
122    0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
123    0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
124    0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
125    0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
126    0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
127    0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
128    0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
129    0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
130    0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
131    0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
132    0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
133    0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
134    0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
135    0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
136    0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
137    0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
138    0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
139    0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
140    0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
141    0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
142    0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
143    0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
144    0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
145    0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
146    0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
147    0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
148    0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
149    0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
150    0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
151    0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
152    0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
153    0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
154    0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
155    0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
156    0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
157    0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
158    0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
159    0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
160    0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
161    0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
162    0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
163    0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
164    0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
165    0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
166    0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
167    0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
168    0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
169    0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
170    0x80000000UL
171};
172
173ALIGNED_(16) juint _log2[] =
174{
175    0xfefa3800UL, 0x3fa62e42UL, 0x93c76730UL, 0x3ceef357UL
176};
177
178ALIGNED_(16) juint _coeff[] =
179{
180    0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL, 0x3d6fb175UL,
181    0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL, 0x9999999aUL, 0x3fc99999UL,
182    0x00000000UL, 0xbfe00000UL
183};
184
185//registers,
186// input: xmm0
187// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
188//          rax, rdx, rcx, r8, r11
189
190void MacroAssembler::fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp1, Register tmp2) {
191  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;
192  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;
193  Label L_2TAG_PACKET_8_0_2;
194  Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
195
196  assert_different_registers(tmp1, tmp2, eax, ecx, edx);
197  jmp(start);
198  address L_tbl = (address)_L_tbl;
199  address log2 = (address)_log2;
200  address coeff = (address)_coeff;
201
202  bind(start);
203  subq(rsp, 24);
204  movsd(Address(rsp, 0), xmm0);
205  mov64(rax, 0x3ff0000000000000);
206  movdq(xmm2, rax);
207  mov64(rdx, 0x77f0000000000000);
208  movdq(xmm3, rdx);
209  movl(ecx, 32768);
210  movdl(xmm4, rcx);
211  mov64(tmp1, 0xffffe00000000000);
212  movdq(xmm5, tmp1);
213  movdqu(xmm1, xmm0);
214  pextrw(eax, xmm0, 3);
215  por(xmm0, xmm2);
216  movl(ecx, 16352);
217  psrlq(xmm0, 27);
218  lea(tmp2, ExternalAddress(L_tbl));
219  psrld(xmm0, 2);
220  rcpps(xmm0, xmm0);
221  psllq(xmm1, 12);
222  pshufd(xmm6, xmm5, 228);
223  psrlq(xmm1, 12);
224  subl(eax, 16);
225  cmpl(eax, 32736);
226  jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
227
228  bind(L_2TAG_PACKET_1_0_2);
229  paddd(xmm0, xmm4);
230  por(xmm1, xmm3);
231  movdl(edx, xmm0);
232  psllq(xmm0, 29);
233  pand(xmm5, xmm1);
234  pand(xmm0, xmm6);
235  subsd(xmm1, xmm5);
236  mulpd(xmm5, xmm0);
237  andl(eax, 32752);
238  subl(eax, ecx);
239  cvtsi2sdl(xmm7, eax);
240  mulsd(xmm1, xmm0);
241  movq(xmm6, ExternalAddress(log2));       // 0xfefa3800UL, 0x3fa62e42UL
242  movdqu(xmm3, ExternalAddress(coeff));    // 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL
243  subsd(xmm5, xmm2);
244  andl(edx, 16711680);
245  shrl(edx, 12);
246  movdqu(xmm0, Address(tmp2, edx));
247  movdqu(xmm4, ExternalAddress(16 + coeff)); // 0x3d6fb175UL, 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL
248  addsd(xmm1, xmm5);
249  movdqu(xmm2, ExternalAddress(32 + coeff)); // 0x9999999aUL, 0x3fc99999UL, 0x00000000UL, 0xbfe00000UL
250  mulsd(xmm6, xmm7);
251  if (VM_Version::supports_sse3()) {
252    movddup(xmm5, xmm1);
253  }
254  else {
255    movdqu(xmm5, xmm1);
256    movlhps(xmm5, xmm5);
257  }
258  mulsd(xmm7, ExternalAddress(8 + log2));    // 0x93c76730UL, 0x3ceef357UL
259  mulsd(xmm3, xmm1);
260  addsd(xmm0, xmm6);
261  mulpd(xmm4, xmm5);
262  mulpd(xmm5, xmm5);
263  if (VM_Version::supports_sse3()) {
264    movddup(xmm6, xmm0);
265  }
266  else {
267    movdqu(xmm6, xmm0);
268    movlhps(xmm6, xmm6);
269  }
270  addsd(xmm0, xmm1);
271  addpd(xmm4, xmm2);
272  mulpd(xmm3, xmm5);
273  subsd(xmm6, xmm0);
274  mulsd(xmm4, xmm1);
275  pshufd(xmm2, xmm0, 238);
276  addsd(xmm1, xmm6);
277  mulsd(xmm5, xmm5);
278  addsd(xmm7, xmm2);
279  addpd(xmm4, xmm3);
280  addsd(xmm1, xmm7);
281  mulpd(xmm4, xmm5);
282  addsd(xmm1, xmm4);
283  pshufd(xmm5, xmm4, 238);
284  addsd(xmm1, xmm5);
285  addsd(xmm0, xmm1);
286  jmp(B1_5);
287
288  bind(L_2TAG_PACKET_0_0_2);
289  movq(xmm0, Address(rsp, 0));
290  movq(xmm1, Address(rsp, 0));
291  addl(eax, 16);
292  cmpl(eax, 32768);
293  jcc(Assembler::aboveEqual, L_2TAG_PACKET_2_0_2);
294  cmpl(eax, 16);
295  jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
296
297  bind(L_2TAG_PACKET_4_0_2);
298  addsd(xmm0, xmm0);
299  jmp(B1_5);
300
301  bind(L_2TAG_PACKET_5_0_2);
302  jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
303  cmpl(edx, 0);
304  jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
305  jmp(L_2TAG_PACKET_6_0_2);
306
307  bind(L_2TAG_PACKET_3_0_2);
308  xorpd(xmm1, xmm1);
309  addsd(xmm1, xmm0);
310  movdl(edx, xmm1);
311  psrlq(xmm1, 32);
312  movdl(ecx, xmm1);
313  orl(edx, ecx);
314  cmpl(edx, 0);
315  jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
316  xorpd(xmm1, xmm1);
317  movl(eax, 18416);
318  pinsrw(xmm1, eax, 3);
319  mulsd(xmm0, xmm1);
320  movdqu(xmm1, xmm0);
321  pextrw(eax, xmm0, 3);
322  por(xmm0, xmm2);
323  psrlq(xmm0, 27);
324  movl(ecx, 18416);
325  psrld(xmm0, 2);
326  rcpps(xmm0, xmm0);
327  psllq(xmm1, 12);
328  pshufd(xmm6, xmm5, 228);
329  psrlq(xmm1, 12);
330  jmp(L_2TAG_PACKET_1_0_2);
331
332  bind(L_2TAG_PACKET_2_0_2);
333  movdl(edx, xmm1);
334  psrlq(xmm1, 32);
335  movdl(ecx, xmm1);
336  addl(ecx, ecx);
337  cmpl(ecx, -2097152);
338  jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
339  orl(edx, ecx);
340  cmpl(edx, 0);
341  jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
342
343  bind(L_2TAG_PACKET_6_0_2);
344  xorpd(xmm1, xmm1);
345  xorpd(xmm0, xmm0);
346  movl(eax, 32752);
347  pinsrw(xmm1, eax, 3);
348  mulsd(xmm0, xmm1);
349  movl(Address(rsp, 16), 3);
350  jmp(L_2TAG_PACKET_8_0_2);
351  bind(L_2TAG_PACKET_7_0_2);
352  xorpd(xmm1, xmm1);
353  xorpd(xmm0, xmm0);
354  movl(eax, 49136);
355  pinsrw(xmm0, eax, 3);
356  divsd(xmm0, xmm1);
357  movl(Address(rsp, 16), 2);
358
359  bind(L_2TAG_PACKET_8_0_2);
360  movq(Address(rsp, 8), xmm0);
361
362  bind(B1_3);
363  movq(xmm0, Address(rsp, 8));
364
365  bind(B1_5);
366  addq(rsp, 24);
367}
368#else
369// The 32 bit code is at most SSE2 compliant
370ALIGNED_(16) juint _static_const_table_log[] =
371{
372    0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
373    0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
374    0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
375    0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
376    0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
377    0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
378    0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
379    0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
380    0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
381    0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
382    0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
383    0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
384    0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
385    0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
386    0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
387    0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
388    0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
389    0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
390    0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
391    0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
392    0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
393    0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
394    0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
395    0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
396    0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
397    0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
398    0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
399    0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
400    0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
401    0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
402    0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
403    0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
404    0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
405    0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
406    0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
407    0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
408    0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
409    0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
410    0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
411    0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
412    0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
413    0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
414    0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
415    0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
416    0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
417    0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
418    0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
419    0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
420    0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
421    0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
422    0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
423    0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
424    0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
425    0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
426    0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
427    0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
428    0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
429    0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
430    0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
431    0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
432    0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
433    0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
434    0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
435    0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
436    0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
437    0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
438    0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
439    0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
440    0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
441    0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
442    0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
443    0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
444    0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
445    0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
446    0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
447    0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
448    0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
449    0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
450    0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
451    0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
452    0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
453    0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
454    0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
455    0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
456    0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
457    0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
458    0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
459    0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
460    0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
461    0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
462    0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
463    0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
464    0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
465    0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
466    0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
467    0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
468    0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
469    0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
470    0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
471    0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
472    0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
473    0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
474    0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
475    0x80000000UL, 0xfefa3800UL, 0x3fa62e42UL, 0x93c76730UL, 0x3ceef357UL,
476    0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL, 0x3d6fb175UL,
477    0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL, 0x9999999aUL, 0x3fc99999UL,
478    0x00000000UL, 0xbfe00000UL, 0x00000000UL, 0xffffe000UL, 0x00000000UL,
479    0xffffe000UL
480};
481//registers,
482// input: xmm0
483// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
484//          rax, rdx, rcx, rbx (tmp)
485
486void MacroAssembler::fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
487  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;
488  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;
489  Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2;
490  Label L_2TAG_PACKET_10_0_2, start;
491
492  assert_different_registers(tmp, eax, ecx, edx);
493  jmp(start);
494  address static_const_table = (address)_static_const_table_log;
495
496  bind(start);
497  subl(rsp, 104);
498  movl(Address(rsp, 40), tmp);
499  lea(tmp, ExternalAddress(static_const_table));
500  xorpd(xmm2, xmm2);
501  movl(eax, 16368);
502  pinsrw(xmm2, eax, 3);
503  xorpd(xmm3, xmm3);
504  movl(edx, 30704);
505  pinsrw(xmm3, edx, 3);
506  movsd(xmm0, Address(rsp, 112));
507  movapd(xmm1, xmm0);
508  movl(ecx, 32768);
509  movdl(xmm4, ecx);
510  movsd(xmm5, Address(tmp, 2128));         // 0x00000000UL, 0xffffe000UL
511  pextrw(eax, xmm0, 3);
512  por(xmm0, xmm2);
513  psllq(xmm0, 5);
514  movl(ecx, 16352);
515  psrlq(xmm0, 34);
516  rcpss(xmm0, xmm0);
517  psllq(xmm1, 12);
518  pshufd(xmm6, xmm5, 228);
519  psrlq(xmm1, 12);
520  subl(eax, 16);
521  cmpl(eax, 32736);
522  jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
523
524  bind(L_2TAG_PACKET_1_0_2);
525  paddd(xmm0, xmm4);
526  por(xmm1, xmm3);
527  movdl(edx, xmm0);
528  psllq(xmm0, 29);
529  pand(xmm5, xmm1);
530  pand(xmm0, xmm6);
531  subsd(xmm1, xmm5);
532  mulpd(xmm5, xmm0);
533  andl(eax, 32752);
534  subl(eax, ecx);
535  cvtsi2sdl(xmm7, eax);
536  mulsd(xmm1, xmm0);
537  movsd(xmm6, Address(tmp, 2064));         // 0xfefa3800UL, 0x3fa62e42UL
538  movdqu(xmm3, Address(tmp, 2080));        // 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL
539  subsd(xmm5, xmm2);
540  andl(edx, 16711680);
541  shrl(edx, 12);
542  movdqu(xmm0, Address(tmp, edx));
543  movdqu(xmm4, Address(tmp, 2096));        // 0x3d6fb175UL, 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL
544  addsd(xmm1, xmm5);
545  movdqu(xmm2, Address(tmp, 2112));        // 0x9999999aUL, 0x3fc99999UL, 0x00000000UL, 0xbfe00000UL
546  mulsd(xmm6, xmm7);
547  pshufd(xmm5, xmm1, 68);
548  mulsd(xmm7, Address(tmp, 2072));         // 0x93c76730UL, 0x3ceef357UL, 0x92492492UL, 0x3fc24924UL
549  mulsd(xmm3, xmm1);
550  addsd(xmm0, xmm6);
551  mulpd(xmm4, xmm5);
552  mulpd(xmm5, xmm5);
553  pshufd(xmm6, xmm0, 228);
554  addsd(xmm0, xmm1);
555  addpd(xmm4, xmm2);
556  mulpd(xmm3, xmm5);
557  subsd(xmm6, xmm0);
558  mulsd(xmm4, xmm1);
559  pshufd(xmm2, xmm0, 238);
560  addsd(xmm1, xmm6);
561  mulsd(xmm5, xmm5);
562  addsd(xmm7, xmm2);
563  addpd(xmm4, xmm3);
564  addsd(xmm1, xmm7);
565  mulpd(xmm4, xmm5);
566  addsd(xmm1, xmm4);
567  pshufd(xmm5, xmm4, 238);
568  addsd(xmm1, xmm5);
569  addsd(xmm0, xmm1);
570  jmp(L_2TAG_PACKET_2_0_2);
571
572  bind(L_2TAG_PACKET_0_0_2);
573  movsd(xmm0, Address(rsp, 112));
574  movdqu(xmm1, xmm0);
575  addl(eax, 16);
576  cmpl(eax, 32768);
577  jcc(Assembler::aboveEqual, L_2TAG_PACKET_3_0_2);
578  cmpl(eax, 16);
579  jcc(Assembler::below, L_2TAG_PACKET_4_0_2);
580
581  bind(L_2TAG_PACKET_5_0_2);
582  addsd(xmm0, xmm0);
583  jmp(L_2TAG_PACKET_2_0_2);
584
585  bind(L_2TAG_PACKET_6_0_2);
586  jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
587  cmpl(edx, 0);
588  jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
589  jmp(L_2TAG_PACKET_7_0_2);
590
591  bind(L_2TAG_PACKET_3_0_2);
592  movdl(edx, xmm1);
593  psrlq(xmm1, 32);
594  movdl(ecx, xmm1);
595  addl(ecx, ecx);
596  cmpl(ecx, -2097152);
597  jcc(Assembler::aboveEqual, L_2TAG_PACKET_6_0_2);
598  orl(edx, ecx);
599  cmpl(edx, 0);
600  jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
601
602  bind(L_2TAG_PACKET_7_0_2);
603  xorpd(xmm1, xmm1);
604  xorpd(xmm0, xmm0);
605  movl(eax, 32752);
606  pinsrw(xmm1, eax, 3);
607  movl(edx, 3);
608  mulsd(xmm0, xmm1);
609
610  bind(L_2TAG_PACKET_9_0_2);
611  movsd(Address(rsp, 0), xmm0);
612  movsd(xmm0, Address(rsp, 112));
613  fld_d(Address(rsp, 0));
614  jmp(L_2TAG_PACKET_10_0_2);
615
616  bind(L_2TAG_PACKET_8_0_2);
617  xorpd(xmm1, xmm1);
618  xorpd(xmm0, xmm0);
619  movl(eax, 49136);
620  pinsrw(xmm0, eax, 3);
621  divsd(xmm0, xmm1);
622  movl(edx, 2);
623  jmp(L_2TAG_PACKET_9_0_2);
624
625  bind(L_2TAG_PACKET_4_0_2);
626  movdl(edx, xmm1);
627  psrlq(xmm1, 32);
628  movdl(ecx, xmm1);
629  orl(edx, ecx);
630  cmpl(edx, 0);
631  jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
632  xorpd(xmm1, xmm1);
633  movl(eax, 18416);
634  pinsrw(xmm1, eax, 3);
635  mulsd(xmm0, xmm1);
636  movapd(xmm1, xmm0);
637  pextrw(eax, xmm0, 3);
638  por(xmm0, xmm2);
639  psllq(xmm0, 5);
640  movl(ecx, 18416);
641  psrlq(xmm0, 34);
642  rcpss(xmm0, xmm0);
643  psllq(xmm1, 12);
644  pshufd(xmm6, xmm5, 228);
645  psrlq(xmm1, 12);
646  jmp(L_2TAG_PACKET_1_0_2);
647
648  bind(L_2TAG_PACKET_2_0_2);
649  movsd(Address(rsp, 24), xmm0);
650  fld_d(Address(rsp, 24));
651
652  bind(L_2TAG_PACKET_10_0_2);
653  movl(tmp, Address(rsp, 40));
654}
655#endif
656