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 };