1 /*
  2  * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #include "precompiled.hpp"
 26 #include "runtime/deoptimization.hpp"
 27 #include "runtime/frame.inline.hpp"
 28 #include "runtime/stubRoutines.hpp"
 29 #include "runtime/thread.inline.hpp"
 30 #include "utilities/globalDefinitions.hpp"
 31 #include "crc32c.h"
 32 
 33 // Implementation of the platform-specific part of StubRoutines - for
 34 // a description of how to extend it, see the stubRoutines.hpp file.
 35 
 36 address StubRoutines::x86::_verify_mxcsr_entry = NULL;
 37 address StubRoutines::x86::_key_shuffle_mask_addr = NULL;
 38 address StubRoutines::x86::_counter_shuffle_mask_addr = NULL;
 39 address StubRoutines::x86::_ghash_long_swap_mask_addr = NULL;
 40 address StubRoutines::x86::_ghash_byte_swap_mask_addr = NULL;
 41 address StubRoutines::x86::_ghash_poly_addr = NULL;
 42 address StubRoutines::x86::_ghash_shuffmask_addr = NULL;
 43 address StubRoutines::x86::_upper_word_mask_addr = NULL;
 44 address StubRoutines::x86::_shuffle_byte_flip_mask_addr = NULL;
 45 address StubRoutines::x86::_k256_adr = NULL;
 46 address StubRoutines::x86::_vector_short_to_byte_mask = NULL;
 47 address StubRoutines::x86::_vector_int_to_byte_mask = NULL;
 48 address StubRoutines::x86::_vector_int_to_short_mask = NULL;
 49 address StubRoutines::x86::_vector_all_bits_set = NULL;
 50 address StubRoutines::x86::_vector_byte_shuffle_mask = NULL;
 51 address StubRoutines::x86::_vector_int_mask_cmp_bits = NULL;
 52 address StubRoutines::x86::_vector_short_shuffle_mask = NULL;
 53 address StubRoutines::x86::_vector_int_shuffle_mask = NULL;
 54 address StubRoutines::x86::_vector_long_shuffle_mask = NULL;
 55 address StubRoutines::x86::_vector_float_sign_mask = NULL;
 56 address StubRoutines::x86::_vector_float_sign_flip = NULL;
 57 address StubRoutines::x86::_vector_double_sign_mask = NULL;
 58 address StubRoutines::x86::_vector_double_sign_flip = NULL;
 59 address StubRoutines::x86::_vector_byte_perm_mask = NULL;
 60 address StubRoutines::x86::_vector_long_sign_mask = NULL;
 61 address StubRoutines::x86::_vector_iota_indices = NULL;
 62 address StubRoutines::x86::_vector_reverse_bit_lut = NULL;
 63 address StubRoutines::x86::_vector_reverse_byte_perm_mask_long = NULL;
 64 address StubRoutines::x86::_vector_reverse_byte_perm_mask_int = NULL;
 65 address StubRoutines::x86::_vector_reverse_byte_perm_mask_short = NULL;
 66 address StubRoutines::x86::_vector_popcount_lut = NULL;
 67 address StubRoutines::x86::_vector_count_leading_zeros_lut = NULL;
 68 address StubRoutines::x86::_vector_32_bit_mask = NULL;
 69 address StubRoutines::x86::_vector_64_bit_mask = NULL;
 70 #ifdef _LP64
 71 address StubRoutines::x86::_k256_W_adr = NULL;
 72 address StubRoutines::x86::_k512_W_addr = NULL;
 73 address StubRoutines::x86::_pshuffle_byte_flip_mask_addr_sha512 = NULL;
 74 // Base64 masks
 75 address StubRoutines::x86::_encoding_table_base64 = NULL;
 76 address StubRoutines::x86::_shuffle_base64 = NULL;
 77 address StubRoutines::x86::_avx2_shuffle_base64 = NULL;
 78 address StubRoutines::x86::_avx2_input_mask_base64 = NULL;
 79 address StubRoutines::x86::_avx2_lut_base64 = NULL;
 80 address StubRoutines::x86::_counter_mask_addr = NULL;
 81 address StubRoutines::x86::_lookup_lo_base64 = NULL;
 82 address StubRoutines::x86::_lookup_hi_base64 = NULL;
 83 address StubRoutines::x86::_lookup_lo_base64url = NULL;
 84 address StubRoutines::x86::_lookup_hi_base64url = NULL;
 85 address StubRoutines::x86::_pack_vec_base64 = NULL;
 86 address StubRoutines::x86::_join_0_1_base64 = NULL;
 87 address StubRoutines::x86::_join_1_2_base64 = NULL;
 88 address StubRoutines::x86::_join_2_3_base64 = NULL;
 89 address StubRoutines::x86::_decoding_table_base64 = NULL;
 90 address StubRoutines::x86::_ghash_poly512_addr = NULL;
 91 #endif
 92 address StubRoutines::x86::_pshuffle_byte_flip_mask_addr = NULL;
 93 
 94 //tables common for sin and cos
 95 address StubRoutines::x86::_ONEHALF_adr = NULL;
 96 address StubRoutines::x86::_P_2_adr = NULL;
 97 address StubRoutines::x86::_SC_4_adr = NULL;
 98 address StubRoutines::x86::_Ctable_adr = NULL;
 99 address StubRoutines::x86::_SC_2_adr = NULL;
100 address StubRoutines::x86::_SC_3_adr = NULL;
101 address StubRoutines::x86::_SC_1_adr = NULL;
102 address StubRoutines::x86::_PI_INV_TABLE_adr = NULL;
103 address StubRoutines::x86::_PI_4_adr = NULL;
104 address StubRoutines::x86::_PI32INV_adr = NULL;
105 address StubRoutines::x86::_SIGN_MASK_adr = NULL;
106 address StubRoutines::x86::_P_1_adr = NULL;
107 address StubRoutines::x86::_P_3_adr = NULL;
108 address StubRoutines::x86::_NEG_ZERO_adr = NULL;
109 
110 //tables common for sincos and tancot
111 address StubRoutines::x86::_L_2il0floatpacket_0_adr = NULL;
112 address StubRoutines::x86::_Pi4Inv_adr = NULL;
113 address StubRoutines::x86::_Pi4x3_adr = NULL;
114 address StubRoutines::x86::_Pi4x4_adr = NULL;
115 address StubRoutines::x86::_ones_adr = NULL;
116 
117 uint64_t StubRoutines::x86::_crc_by128_masks[] =
118 {
119   /* The fields in this structure are arranged so that they can be
120    * picked up two at a time with 128-bit loads.
121    *
122    * Because of flipped bit order for this CRC polynomials
123    * the constant for X**N is left-shifted by 1.  This is because
124    * a 64 x 64 polynomial multiply produces a 127-bit result
125    * but the highest term is always aligned to bit 0 in the container.
126    * Pre-shifting by one fixes this, at the cost of potentially making
127    * the 32-bit constant no longer fit in a 32-bit container (thus the
128    * use of uint64_t, though this is also the size used by the carry-
129    * less multiply instruction.
130    *
131    * In addition, the flipped bit order and highest-term-at-least-bit
132    * multiply changes the constants used.  The 96-bit result will be
133    * aligned to the high-term end of the target 128-bit container,
134    * not the low-term end; that is, instead of a 512-bit or 576-bit fold,
135    * instead it is a 480 (=512-32) or 544 (=512+64-32) bit fold.
136    *
137    * This cause additional problems in the 128-to-64-bit reduction; see the
138    * code for details.  By storing a mask in the otherwise unused half of
139    * a 128-bit constant, bits can be cleared before multiplication without
140    * storing and reloading.  Note that staying on a 128-bit datapath means
141    * that some data is uselessly stored and some unused data is intersected
142    * with an irrelevant constant.
143    */
144 
145   ((uint64_t) 0xffffffffUL),     /* low  of K_M_64    */
146   ((uint64_t) 0xb1e6b092U << 1), /* high of K_M_64    */
147   ((uint64_t) 0xba8ccbe8U << 1), /* low  of K_160_96  */
148   ((uint64_t) 0x6655004fU << 1), /* high of K_160_96  */
149   ((uint64_t) 0xaa2215eaU << 1), /* low  of K_544_480 */
150   ((uint64_t) 0xe3720acbU << 1)  /* high of K_544_480 */
151 };
152 
153 /**
154  *  crc_table[] from jdk/src/share/native/java/util/zip/zlib-1.2.5/crc32.h
155  */
156 juint StubRoutines::x86::_crc_table[] =
157 {
158     0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
159     0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
160     0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
161     0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
162     0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
163     0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
164     0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
165     0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
166     0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
167     0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
168     0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
169     0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
170     0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
171     0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
172     0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
173     0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
174     0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
175     0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
176     0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
177     0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
178     0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
179     0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
180     0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
181     0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
182     0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
183     0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
184     0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
185     0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
186     0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
187     0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
188     0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
189     0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
190     0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
191     0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
192     0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
193     0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
194     0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
195     0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
196     0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
197     0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
198     0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
199     0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
200     0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
201     0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
202     0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
203     0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
204     0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
205     0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
206     0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
207     0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
208     0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
209     0x2d02ef8dUL
210 };
211 
212 #ifdef _LP64
213 juint StubRoutines::x86::_crc_table_avx512[] =
214 {
215     0xe95c1271UL, 0x00000000UL, 0xce3371cbUL, 0x00000000UL,
216     0xccaa009eUL, 0x00000000UL, 0x751997d0UL, 0x00000001UL,
217     0x4a7fe880UL, 0x00000001UL, 0xe88ef372UL, 0x00000001UL,
218     0xccaa009eUL, 0x00000000UL, 0x63cd6124UL, 0x00000001UL,
219     0xf7011640UL, 0x00000001UL, 0xdb710640UL, 0x00000001UL,
220     0xd7cfc6acUL, 0x00000001UL, 0xea89367eUL, 0x00000001UL,
221     0x8cb44e58UL, 0x00000001UL, 0xdf068dc2UL, 0x00000000UL,
222     0xae0b5394UL, 0x00000000UL, 0xc7569e54UL, 0x00000001UL,
223     0xc6e41596UL, 0x00000001UL, 0x54442bd4UL, 0x00000001UL,
224     0x74359406UL, 0x00000001UL, 0x3db1ecdcUL, 0x00000000UL,
225     0x5a546366UL, 0x00000001UL, 0xf1da05aaUL, 0x00000000UL,
226     0xccaa009eUL, 0x00000000UL, 0x751997d0UL, 0x00000001UL,
227     0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL
228 };
229 
230 juint StubRoutines::x86::_crc32c_table_avx512[] =
231 {
232     0xb9e02b86UL, 0x00000000UL, 0xdcb17aa4UL, 0x00000000UL,
233     0x493c7d27UL, 0x00000000UL, 0xc1068c50UL, 0x0000000eUL,
234     0x06e38d70UL, 0x00000002UL, 0x6992cea2UL, 0x00000000UL,
235     0x493c7d27UL, 0x00000000UL, 0xdd45aab8UL, 0x00000000UL,
236     0xdea713f0UL, 0x00000000UL, 0x05ec76f0UL, 0x00000001UL,
237     0x47db8317UL, 0x00000000UL, 0x2ad91c30UL, 0x00000000UL,
238     0x0715ce53UL, 0x00000000UL, 0xc49f4f67UL, 0x00000000UL,
239     0x39d3b296UL, 0x00000000UL, 0x083a6eecUL, 0x00000000UL,
240     0x9e4addf8UL, 0x00000000UL, 0x740eef02UL, 0x00000000UL,
241     0xddc0152bUL, 0x00000000UL, 0x1c291d04UL, 0x00000000UL,
242     0xba4fc28eUL, 0x00000000UL, 0x3da6d0cbUL, 0x00000000UL,
243     0x493c7d27UL, 0x00000000UL, 0xc1068c50UL, 0x0000000eUL,
244     0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL
245 };
246 
247 juint StubRoutines::x86::_crc_by128_masks_avx512[] =
248 {
249     0xffffffffUL, 0xffffffffUL, 0x00000000UL, 0x00000000UL,
250     0x00000000UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
251     0x80808080UL, 0x80808080UL, 0x80808080UL, 0x80808080UL
252 };
253 
254 juint StubRoutines::x86::_shuf_table_crc32_avx512[] =
255 {
256     0x83828100UL, 0x87868584UL, 0x8b8a8988UL, 0x8f8e8d8cUL,
257     0x03020100UL, 0x07060504UL, 0x0b0a0908UL, 0x000e0d0cUL
258 };
259 
260 juint StubRoutines::x86::_adler32_ascale_table[] =
261 {
262     0x00000000UL, 0x00000001UL, 0x00000002UL, 0x00000003UL,
263     0x00000004UL, 0x00000005UL, 0x00000006UL, 0x00000007UL
264 };
265 
266 juint StubRoutines::x86::_adler32_shuf0_table[] =
267 {
268     0xFFFFFF00UL, 0xFFFFFF01UL, 0xFFFFFF02UL, 0xFFFFFF03UL,
269     0xFFFFFF04UL, 0xFFFFFF05UL, 0xFFFFFF06UL, 0xFFFFFF07UL
270 };
271 
272 juint StubRoutines::x86::_adler32_shuf1_table[] =
273 {
274     0xFFFFFF08UL, 0xFFFFFF09, 0xFFFFFF0AUL, 0xFFFFFF0BUL,
275     0xFFFFFF0CUL, 0xFFFFFF0D, 0xFFFFFF0EUL, 0xFFFFFF0FUL
276 };
277 
278 #endif // _LP64
279 
280 #define D 32
281 #define P 0x82F63B78 // Reflection of Castagnoli (0x11EDC6F41)
282 
283 #define TILL_CYCLE 31
284 uint32_t _crc32c_pow_2k_table[TILL_CYCLE]; // because _crc32c_pow_2k_table[TILL_CYCLE == 31] == _crc32c_pow_2k_table[0]
285 
286 // A. Kadatch and B. Jenkins / Everything we know about CRC but afraid to forget September 3, 2010 8
287 // Listing 1: Multiplication of normalized polynomials
288 // "a" and "b" occupy D least significant bits.
289 uint32_t crc32c_multiply(uint32_t a, uint32_t b) {
290   uint32_t product = 0;
291   uint32_t b_pow_x_table[D + 1]; // b_pow_x_table[k] = (b * x**k) mod P
292   b_pow_x_table[0] = b;
293   for (int k = 0; k < D; ++k) {
294     // If "a" has non-zero coefficient at x**k,/ add ((b * x**k) mod P) to the result.
295     if ((a & (((uint32_t)1) << (D - 1 - k))) != 0) product ^= b_pow_x_table[k];
296 
297     // Compute b_pow_x_table[k+1] = (b ** x**(k+1)) mod P.
298     if (b_pow_x_table[k] & 1) {
299       // If degree of (b_pow_x_table[k] * x) is D, then
300       // degree of (b_pow_x_table[k] * x - P) is less than D.
301       b_pow_x_table[k + 1] = (b_pow_x_table[k] >> 1) ^ P;
302     }
303     else {
304       b_pow_x_table[k + 1] = b_pow_x_table[k] >> 1;
305     }
306   }
307   return product;
308 }
309 #undef D
310 #undef P
311 
312 // A. Kadatch and B. Jenkins / Everything we know about CRC but afraid to forget September 3, 2010 9
313 void crc32c_init_pow_2k(void) {
314   // _crc32c_pow_2k_table(0) =
315   // x^(2^k) mod P(x) = x mod P(x) = x
316   // Since we are operating on a reflected values
317   // x = 10b, reflect(x) = 0x40000000
318   _crc32c_pow_2k_table[0] = 0x40000000;
319 
320   for (int k = 1; k < TILL_CYCLE; k++) {
321     // _crc32c_pow_2k_table(k+1) = _crc32c_pow_2k_table(k-1)^2 mod P(x)
322     uint32_t tmp = _crc32c_pow_2k_table[k - 1];
323     _crc32c_pow_2k_table[k] = crc32c_multiply(tmp, tmp);
324   }
325 }
326 
327 // x^N mod P(x)
328 uint32_t crc32c_f_pow_n(uint32_t n) {
329   //            result = 1 (polynomial)
330   uint32_t one, result = 0x80000000, i = 0;
331 
332   while (one = (n & 1), (n == 1 || n - one > 0)) {
333     if (one) {
334       result = crc32c_multiply(result, _crc32c_pow_2k_table[i]);
335     }
336     n >>= 1;
337     i++;
338   }
339 
340   return result;
341 }
342 
343 juint *StubRoutines::x86::_crc32c_table;
344 
345 void StubRoutines::x86::generate_CRC32C_table(bool is_pclmulqdq_table_supported) {
346 
347   static juint pow_n[CRC32C_NUM_PRECOMPUTED_CONSTANTS];
348 
349   crc32c_init_pow_2k();
350 
351   pow_n[0] = crc32c_f_pow_n(CRC32C_HIGH * 8);      // 8N * 8 = 64N
352   pow_n[1] = crc32c_f_pow_n(CRC32C_HIGH * 8 * 2);  // 128N
353 
354   pow_n[2] = crc32c_f_pow_n(CRC32C_MIDDLE * 8);
355   pow_n[3] = crc32c_f_pow_n(CRC32C_MIDDLE * 8 * 2);
356 
357   pow_n[4] = crc32c_f_pow_n(CRC32C_LOW * 8);
358   pow_n[CRC32C_NUM_PRECOMPUTED_CONSTANTS - 1] =
359             crc32c_f_pow_n(CRC32C_LOW * 8 * 2);
360 
361   if (is_pclmulqdq_table_supported) {
362     _crc32c_table = pow_n;
363   } else {
364     static julong pclmulqdq_table[CRC32C_NUM_PRECOMPUTED_CONSTANTS * 256];
365 
366     for (int j = 0; j < CRC32C_NUM_PRECOMPUTED_CONSTANTS; j++) {
367       static juint X_CONST = pow_n[j];
368       for (int64_t i = 0; i < 256; i++) { // to force 64 bit wide computations
369       // S. Gueron / Information Processing Letters 112 (2012) 184
370       // Algorithm 3: Generating a carry-less multiplication lookup table.
371       // Input: A 32-bit constant, X_CONST.
372       // Output: A table of 256 entries, each one is a 64-bit quadword,
373       // that can be used for computing "byte" * X_CONST, for a given byte.
374         pclmulqdq_table[j * 256 + i] =
375           ((i & 1) * X_CONST) ^ ((i & 2) * X_CONST) ^ ((i & 4) * X_CONST) ^
376           ((i & 8) * X_CONST) ^ ((i & 16) * X_CONST) ^ ((i & 32) * X_CONST) ^
377           ((i & 64) * X_CONST) ^ ((i & 128) * X_CONST);
378       }
379     }
380     _crc32c_table = (juint*)pclmulqdq_table;
381   }
382 }
383 
384 ATTRIBUTE_ALIGNED(64) juint StubRoutines::x86::_k256[] =
385 {
386     0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
387     0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
388     0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
389     0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
390     0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
391     0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
392     0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
393     0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
394     0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
395     0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
396     0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
397     0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
398     0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
399     0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
400     0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
401     0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
402 };
403 
404 #ifdef _LP64
405 // used in MacroAssembler::sha256_AVX2
406 // dynamically built from _k256
407 ATTRIBUTE_ALIGNED(64) juint StubRoutines::x86::_k256_W[2*sizeof(StubRoutines::x86::_k256)];
408 
409 // used in MacroAssembler::sha512_AVX2
410 ATTRIBUTE_ALIGNED(64) julong StubRoutines::x86::_k512_W[] =
411 {
412     0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
413     0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
414     0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
415     0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
416     0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
417     0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
418     0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
419     0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
420     0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
421     0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
422     0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
423     0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
424     0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
425     0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
426     0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
427     0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
428     0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
429     0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
430     0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
431     0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
432     0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
433     0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
434     0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
435     0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
436     0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
437     0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
438     0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
439     0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
440     0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
441     0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
442     0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
443     0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
444     0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
445     0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
446     0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
447     0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
448     0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
449     0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
450     0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
451     0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
452 };
453 #endif