hotspot/src/cpu/x86/vm/macroAssembler_x86_log10.cpp
changeset 38018 1dc6c6f21231
equal deleted inserted replaced
38017:55047d16f141 38018:1dc6c6f21231
       
     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
       
    66 ALIGNED_(16) juint _HIGHSIGMASK_log10[] =
       
    67 {
       
    68     0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xffffe000UL
       
    69 };
       
    70 
       
    71 ALIGNED_(16) juint _LOG10_E[] =
       
    72 {
       
    73     0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
       
    74 };
       
    75 
       
    76 ALIGNED_(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 
       
   184 ALIGNED_(16) juint _log2_log10[] =
       
   185 {
       
   186     0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL
       
   187 };
       
   188 
       
   189 ALIGNED_(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 
       
   203 void 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
       
   390 ALIGNED_(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 
       
   506 void 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