1 /*
  2  * Copyright (c) 2013, 2025, 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 "runtime/deoptimization.hpp"
 26 #include "runtime/frame.inline.hpp"
 27 #include "runtime/javaThread.hpp"
 28 #include "runtime/stubRoutines.hpp"
 29 #include "utilities/globalDefinitions.hpp"
 30 #include "crc32c.h"
 31 
 32 // Implementation of the platform-specific part of StubRoutines - for
 33 // a description of how to extend it, see the stubRoutines.hpp file.
 34 
 35 // define fields for arch-specific entries
 36 
 37 #define DEFINE_ARCH_ENTRY(arch, blob_name, stub_name, field_name, getter_name) \
 38   address StubRoutines:: arch :: STUB_FIELD_NAME(field_name)  = nullptr;
 39 
 40 #define DEFINE_ARCH_ENTRY_INIT(arch, blob_name, stub_name, field_name, getter_name, init_function) \
 41   address StubRoutines:: arch :: STUB_FIELD_NAME(field_name)  = CAST_FROM_FN_PTR(address, init_function);
 42 
 43 STUBGEN_ARCH_ENTRIES_DO(DEFINE_ARCH_ENTRY, DEFINE_ARCH_ENTRY_INIT)
 44 
 45 #undef DEFINE_ARCH_ENTRY_INIT
 46 #undef DEFINE_ARCH_ENTRY
 47 
 48 address StubRoutines::crc_table_addr() {
 49   return (address)StubRoutines::x86::_crc_table;
 50 }
 51 address StubRoutines::crc32c_table_addr() {
 52   if (StubRoutines::x86::_crc32c_table == nullptr) {
 53     bool supports_clmul = VM_Version::supports_clmul();
 54     StubRoutines::x86::generate_CRC32C_table(supports_clmul);
 55   }
 56   return (address)StubRoutines::x86::_crc32c_table;
 57 }
 58 
 59 address StubRoutines::x86::_k256_adr = nullptr;
 60 address StubRoutines::x86::_k256_W_adr = nullptr;
 61 address StubRoutines::x86::_k512_W_addr = nullptr;
 62 
 63 const uint64_t StubRoutines::x86::_crc_by128_masks[] =
 64 {
 65   /* The fields in this structure are arranged so that they can be
 66    * picked up two at a time with 128-bit loads.
 67    *
 68    * Because of flipped bit order for this CRC polynomials
 69    * the constant for X**N is left-shifted by 1.  This is because
 70    * a 64 x 64 polynomial multiply produces a 127-bit result
 71    * but the highest term is always aligned to bit 0 in the container.
 72    * Pre-shifting by one fixes this, at the cost of potentially making
 73    * the 32-bit constant no longer fit in a 32-bit container (thus the
 74    * use of uint64_t, though this is also the size used by the carry-
 75    * less multiply instruction.
 76    *
 77    * In addition, the flipped bit order and highest-term-at-least-bit
 78    * multiply changes the constants used.  The 96-bit result will be
 79    * aligned to the high-term end of the target 128-bit container,
 80    * not the low-term end; that is, instead of a 512-bit or 576-bit fold,
 81    * instead it is a 480 (=512-32) or 544 (=512+64-32) bit fold.
 82    *
 83    * This cause additional problems in the 128-to-64-bit reduction; see the
 84    * code for details.  By storing a mask in the otherwise unused half of
 85    * a 128-bit constant, bits can be cleared before multiplication without
 86    * storing and reloading.  Note that staying on a 128-bit datapath means
 87    * that some data is uselessly stored and some unused data is intersected
 88    * with an irrelevant constant.
 89    */
 90 
 91   ((uint64_t) 0xffffffffUL),     /* low  of K_M_64    */
 92   ((uint64_t) 0xb1e6b092U << 1), /* high of K_M_64    */
 93   ((uint64_t) 0xba8ccbe8U << 1), /* low  of K_160_96  */
 94   ((uint64_t) 0x6655004fU << 1), /* high of K_160_96  */
 95   ((uint64_t) 0xaa2215eaU << 1), /* low  of K_544_480 */
 96   ((uint64_t) 0xe3720acbU << 1)  /* high of K_544_480 */
 97 };
 98 
 99 /**
100  *  crc_table[] from jdk/src/share/native/java/util/zip/zlib-1.2.5/crc32.h
101  */
102 const juint StubRoutines::x86::_crc_table[] =
103 {
104     0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
105     0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
106     0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
107     0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
108     0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
109     0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
110     0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
111     0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
112     0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
113     0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
114     0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
115     0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
116     0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
117     0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
118     0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
119     0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
120     0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
121     0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
122     0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
123     0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
124     0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
125     0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
126     0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
127     0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
128     0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
129     0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
130     0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
131     0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
132     0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
133     0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
134     0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
135     0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
136     0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
137     0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
138     0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
139     0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
140     0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
141     0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
142     0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
143     0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
144     0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
145     0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
146     0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
147     0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
148     0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
149     0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
150     0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
151     0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
152     0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
153     0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
154     0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
155     0x2d02ef8dUL
156 };
157 
158 const juint StubRoutines::x86::_crc_table_avx512[] =
159 {
160     0xe95c1271UL, 0x00000000UL, 0xce3371cbUL, 0x00000000UL,
161     0xccaa009eUL, 0x00000000UL, 0x751997d0UL, 0x00000001UL,
162     0x4a7fe880UL, 0x00000001UL, 0xe88ef372UL, 0x00000001UL,
163     0xccaa009eUL, 0x00000000UL, 0x63cd6124UL, 0x00000001UL,
164     0xf7011640UL, 0x00000001UL, 0xdb710640UL, 0x00000001UL,
165     0xd7cfc6acUL, 0x00000001UL, 0xea89367eUL, 0x00000001UL,
166     0x8cb44e58UL, 0x00000001UL, 0xdf068dc2UL, 0x00000000UL,
167     0xae0b5394UL, 0x00000000UL, 0xc7569e54UL, 0x00000001UL,
168     0xc6e41596UL, 0x00000001UL, 0x54442bd4UL, 0x00000001UL,
169     0x74359406UL, 0x00000001UL, 0x3db1ecdcUL, 0x00000000UL,
170     0x5a546366UL, 0x00000001UL, 0xf1da05aaUL, 0x00000000UL,
171     0xccaa009eUL, 0x00000000UL, 0x751997d0UL, 0x00000001UL,
172     0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL
173 };
174 
175 const juint StubRoutines::x86::_crc32c_table_avx512[] =
176 {
177     0xb9e02b86UL, 0x00000000UL, 0xdcb17aa4UL, 0x00000000UL,
178     0x493c7d27UL, 0x00000000UL, 0xc1068c50UL, 0x0000000eUL,
179     0x06e38d70UL, 0x00000002UL, 0x6992cea2UL, 0x00000000UL,
180     0x493c7d27UL, 0x00000000UL, 0xdd45aab8UL, 0x00000000UL,
181     0xdea713f0UL, 0x00000000UL, 0x05ec76f0UL, 0x00000001UL,
182     0x47db8317UL, 0x00000000UL, 0x2ad91c30UL, 0x00000000UL,
183     0x0715ce53UL, 0x00000000UL, 0xc49f4f67UL, 0x00000000UL,
184     0x39d3b296UL, 0x00000000UL, 0x083a6eecUL, 0x00000000UL,
185     0x9e4addf8UL, 0x00000000UL, 0x740eef02UL, 0x00000000UL,
186     0xddc0152bUL, 0x00000000UL, 0x1c291d04UL, 0x00000000UL,
187     0xba4fc28eUL, 0x00000000UL, 0x3da6d0cbUL, 0x00000000UL,
188     0x493c7d27UL, 0x00000000UL, 0xc1068c50UL, 0x0000000eUL,
189     0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL
190 };
191 
192 const juint StubRoutines::x86::_crc_by128_masks_avx512[] =
193 {
194     0xffffffffUL, 0xffffffffUL, 0x00000000UL, 0x00000000UL,
195     0x00000000UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
196     0x80808080UL, 0x80808080UL, 0x80808080UL, 0x80808080UL
197 };
198 
199 const juint StubRoutines::x86::_shuf_table_crc32_avx512[] =
200 {
201     0x83828100UL, 0x87868584UL, 0x8b8a8988UL, 0x8f8e8d8cUL,
202     0x03020100UL, 0x07060504UL, 0x0b0a0908UL, 0x000e0d0cUL
203 };
204 
205 const jint StubRoutines::x86::_arrays_hashcode_powers_of_31[] =
206 {
207      2111290369,
208     -2010103841,
209       350799937,
210        11316127,
211       693101697,
212      -254736545,
213       961614017,
214        31019807,
215     -2077209343,
216       -67006753,
217      1244764481,
218     -2038056289,
219       211350913,
220      -408824225,
221      -844471871,
222      -997072353,
223      1353309697,
224      -510534177,
225      1507551809,
226      -505558625,
227      -293403007,
228       129082719,
229     -1796951359,
230      -196513505,
231     -1807454463,
232      1742810335,
233       887503681,
234        28629151,
235          923521,
236           29791,
237             961,
238              31,
239               1,
240 };
241 
242 #define D 32
243 #define P 0x82F63B78 // Reflection of Castagnoli (0x11EDC6F41)
244 
245 #define TILL_CYCLE 31
246 uint32_t _crc32c_pow_2k_table[TILL_CYCLE]; // because _crc32c_pow_2k_table[TILL_CYCLE == 31] == _crc32c_pow_2k_table[0]
247 
248 // A. Kadatch and B. Jenkins / Everything we know about CRC but afraid to forget September 3, 2010 8
249 // Listing 1: Multiplication of normalized polynomials
250 // "a" and "b" occupy D least significant bits.
251 static uint32_t crc32c_multiply(uint32_t a, uint32_t b) {
252   uint32_t product = 0;
253   uint32_t b_pow_x_table[D + 1]; // b_pow_x_table[k] = (b * x**k) mod P
254   b_pow_x_table[0] = b;
255   for (int k = 0; k < D; ++k) {
256     // If "a" has non-zero coefficient at x**k,/ add ((b * x**k) mod P) to the result.
257     if ((a & (((uint32_t)1) << (D - 1 - k))) != 0) product ^= b_pow_x_table[k];
258 
259     // Compute b_pow_x_table[k+1] = (b ** x**(k+1)) mod P.
260     if (b_pow_x_table[k] & 1) {
261       // If degree of (b_pow_x_table[k] * x) is D, then
262       // degree of (b_pow_x_table[k] * x - P) is less than D.
263       b_pow_x_table[k + 1] = (b_pow_x_table[k] >> 1) ^ P;
264     }
265     else {
266       b_pow_x_table[k + 1] = b_pow_x_table[k] >> 1;
267     }
268   }
269   return product;
270 }
271 #undef D
272 #undef P
273 
274 // A. Kadatch and B. Jenkins / Everything we know about CRC but afraid to forget September 3, 2010 9
275 static void crc32c_init_pow_2k(void) {
276   // _crc32c_pow_2k_table(0) =
277   // x^(2^k) mod P(x) = x mod P(x) = x
278   // Since we are operating on a reflected values
279   // x = 10b, reflect(x) = 0x40000000
280   _crc32c_pow_2k_table[0] = 0x40000000;
281 
282   for (int k = 1; k < TILL_CYCLE; k++) {
283     // _crc32c_pow_2k_table(k+1) = _crc32c_pow_2k_table(k-1)^2 mod P(x)
284     uint32_t tmp = _crc32c_pow_2k_table[k - 1];
285     _crc32c_pow_2k_table[k] = crc32c_multiply(tmp, tmp);
286   }
287 }
288 
289 // x^N mod P(x)
290 static uint32_t crc32c_f_pow_n(uint32_t n) {
291   //            result = 1 (polynomial)
292   uint32_t one, result = 0x80000000, i = 0;
293 
294   while (one = (n & 1), (n == 1 || n - one > 0)) {
295     if (one) {
296       result = crc32c_multiply(result, _crc32c_pow_2k_table[i]);
297     }
298     n >>= 1;
299     i++;
300   }
301 
302   return result;
303 }
304 
305 juint* StubRoutines::x86::_crc32c_table = nullptr;
306 
307 void StubRoutines::x86::generate_CRC32C_table(bool is_pclmulqdq_table_supported) {
308 
309   static juint pow_n[CRC32C_NUM_PRECOMPUTED_CONSTANTS];
310 
311   crc32c_init_pow_2k();
312 
313   pow_n[0] = crc32c_f_pow_n(CRC32C_HIGH * 8);      // 8N * 8 = 64N
314   pow_n[1] = crc32c_f_pow_n(CRC32C_HIGH * 8 * 2);  // 128N
315 
316   pow_n[2] = crc32c_f_pow_n(CRC32C_MIDDLE * 8);
317   pow_n[3] = crc32c_f_pow_n(CRC32C_MIDDLE * 8 * 2);
318 
319   pow_n[4] = crc32c_f_pow_n(CRC32C_LOW * 8);
320   pow_n[CRC32C_NUM_PRECOMPUTED_CONSTANTS - 1] =
321             crc32c_f_pow_n(CRC32C_LOW * 8 * 2);
322 
323   if (is_pclmulqdq_table_supported) {
324     _crc32c_table = pow_n;
325   } else {
326     static julong pclmulqdq_table[CRC32C_NUM_PRECOMPUTED_CONSTANTS * 256];
327 
328     for (int j = 0; j < CRC32C_NUM_PRECOMPUTED_CONSTANTS; j++) {
329       static juint X_CONST = pow_n[j];
330       for (int64_t i = 0; i < 256; i++) { // to force 64 bit wide computations
331       // S. Gueron / Information Processing Letters 112 (2012) 184
332       // Algorithm 3: Generating a carry-less multiplication lookup table.
333       // Input: A 32-bit constant, X_CONST.
334       // Output: A table of 256 entries, each one is a 64-bit quadword,
335       // that can be used for computing "byte" * X_CONST, for a given byte.
336         pclmulqdq_table[j * 256 + i] =
337           ((i & 1) * X_CONST) ^ ((i & 2) * X_CONST) ^ ((i & 4) * X_CONST) ^
338           ((i & 8) * X_CONST) ^ ((i & 16) * X_CONST) ^ ((i & 32) * X_CONST) ^
339           ((i & 64) * X_CONST) ^ ((i & 128) * X_CONST);
340       }
341     }
342     _crc32c_table = (juint*)pclmulqdq_table;
343   }
344 }
345 
346 ATTRIBUTE_ALIGNED(64) const juint StubRoutines::x86::_k256[] =
347 {
348     0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
349     0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
350     0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
351     0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
352     0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
353     0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
354     0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
355     0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
356     0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
357     0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
358     0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
359     0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
360     0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
361     0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
362     0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
363     0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
364 };
365 
366 // used in MacroAssembler::sha256_AVX2
367 // dynamically built from _k256
368 ATTRIBUTE_ALIGNED(64) juint StubRoutines::x86::_k256_W[2*sizeof(StubRoutines::x86::_k256)];
369 
370 // used in MacroAssembler::sha512_AVX2
371 ATTRIBUTE_ALIGNED(64) const julong StubRoutines::x86::_k512_W[] =
372 {
373     0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
374     0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
375     0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
376     0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
377     0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
378     0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
379     0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
380     0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
381     0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
382     0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
383     0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
384     0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
385     0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
386     0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
387     0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
388     0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
389     0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
390     0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
391     0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
392     0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
393     0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
394     0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
395     0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
396     0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
397     0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
398     0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
399     0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
400     0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
401     0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
402     0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
403     0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
404     0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
405     0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
406     0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
407     0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
408     0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
409     0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
410     0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
411     0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
412     0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
413 };