Skip to content

Commit 08a2f84

Browse files
author
Hamlin Li
committed
8339738: RISC-V: Vectorize crc32 intrinsic
Reviewed-by: fyang, luhenry
1 parent 1d070a3 commit 08a2f84

File tree

3 files changed

+340
-5
lines changed

3 files changed

+340
-5
lines changed

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

Lines changed: 122 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,6 +1454,103 @@ void MacroAssembler::update_word_crc32(Register crc, Register v, Register tmp1,
14541454
xorr(crc, crc, tmp2);
14551455
}
14561456

1457+
1458+
// This improvement (vectorization) is based on java.base/share/native/libzip/zlib/zcrc32.c.
1459+
// To make it, following steps are taken:
1460+
// 1. in zcrc32.c, modify N to 16 and related code,
1461+
// 2. re-generate the tables needed, we use tables of (N == 16, W == 4)
1462+
// 3. finally vectorize the code (original implementation in zcrc32.c is just scalar code).
1463+
// New tables for vector version is after table3.
1464+
void MacroAssembler::vector_update_crc32(Register crc, Register buf, Register len,
1465+
Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5,
1466+
Register table0, Register table3) {
1467+
assert_different_registers(t1, crc, buf, len, tmp1, tmp2, tmp3, tmp4, tmp5, table0, table3);
1468+
const int N = 16, W = 4;
1469+
const int64_t single_table_size = 256;
1470+
const Register blks = tmp2;
1471+
const Register tmpTable = tmp3, tableN16 = tmp4;
1472+
const VectorRegister vcrc = v4, vword = v8, vtmp = v12;
1473+
Label VectorLoop;
1474+
Label LastBlock;
1475+
1476+
add(tableN16, table3, 1*single_table_size*sizeof(juint), tmp1);
1477+
mv(tmp5, 0xff);
1478+
1479+
if (MaxVectorSize == 16) {
1480+
vsetivli(zr, N, Assembler::e32, Assembler::m4, Assembler::ma, Assembler::ta);
1481+
} else if (MaxVectorSize == 32) {
1482+
vsetivli(zr, N, Assembler::e32, Assembler::m2, Assembler::ma, Assembler::ta);
1483+
} else {
1484+
assert(MaxVectorSize > 32, "sanity");
1485+
vsetivli(zr, N, Assembler::e32, Assembler::m1, Assembler::ma, Assembler::ta);
1486+
}
1487+
1488+
vmv_v_x(vcrc, zr);
1489+
vmv_s_x(vcrc, crc);
1490+
1491+
// multiple of 64
1492+
srli(blks, len, 6);
1493+
slli(t1, blks, 6);
1494+
sub(len, len, t1);
1495+
sub(blks, blks, 1);
1496+
blez(blks, LastBlock);
1497+
1498+
bind(VectorLoop);
1499+
{
1500+
mv(tmpTable, tableN16);
1501+
1502+
vle32_v(vword, buf);
1503+
vxor_vv(vword, vword, vcrc);
1504+
1505+
addi(buf, buf, N*4);
1506+
1507+
vand_vx(vtmp, vword, tmp5);
1508+
vsll_vi(vtmp, vtmp, 2);
1509+
vluxei32_v(vcrc, tmpTable, vtmp);
1510+
1511+
mv(tmp1, 1);
1512+
for (int k = 1; k < W; k++) {
1513+
addi(tmpTable, tmpTable, single_table_size*4);
1514+
1515+
slli(t1, tmp1, 3);
1516+
vsrl_vx(vtmp, vword, t1);
1517+
1518+
vand_vx(vtmp, vtmp, tmp5);
1519+
vsll_vi(vtmp, vtmp, 2);
1520+
vluxei32_v(vtmp, tmpTable, vtmp);
1521+
1522+
vxor_vv(vcrc, vcrc, vtmp);
1523+
1524+
addi(tmp1, tmp1, 1);
1525+
}
1526+
1527+
sub(blks, blks, 1);
1528+
bgtz(blks, VectorLoop);
1529+
}
1530+
1531+
bind(LastBlock);
1532+
{
1533+
vle32_v(vtmp, buf);
1534+
vxor_vv(vcrc, vcrc, vtmp);
1535+
mv(crc, zr);
1536+
for (int i = 0; i < N; i++) {
1537+
vmv_x_s(tmp2, vcrc);
1538+
// in vmv_x_s, the value is sign-extended to SEW bits, but we need zero-extended here.
1539+
zext_w(tmp2, tmp2);
1540+
vslidedown_vi(vcrc, vcrc, 1);
1541+
xorr(crc, crc, tmp2);
1542+
for (int j = 0; j < W; j++) {
1543+
andr(t1, crc, tmp5);
1544+
shadd(t1, t1, table0, tmp1, 2);
1545+
lwu(t1, Address(t1, 0));
1546+
srli(tmp2, crc, 8);
1547+
xorr(crc, tmp2, t1);
1548+
}
1549+
}
1550+
addi(buf, buf, N*4);
1551+
}
1552+
}
1553+
14571554
/**
14581555
* @param crc register containing existing CRC (32-bit)
14591556
* @param buf register pointing to input byte buffer (byte*)
@@ -1465,21 +1562,28 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
14651562
Register table0, Register table1, Register table2, Register table3,
14661563
Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register tmp6) {
14671564
assert_different_registers(crc, buf, len, table0, table1, table2, table3, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6);
1468-
Label L_by16_loop, L_unroll_loop, L_unroll_loop_entry, L_by4, L_by4_loop, L_by1, L_by1_loop, L_exit;
1565+
Label L_by16_loop, L_vector_entry, L_unroll_loop, L_unroll_loop_entry, L_by4, L_by4_loop, L_by1, L_by1_loop, L_exit;
14691566

1567+
const int64_t single_table_size = 256;
14701568
const int64_t unroll = 16;
14711569
const int64_t unroll_words = unroll*wordSize;
14721570
mv(tmp5, right_32_bits);
1473-
subw(len, len, unroll_words);
14741571
andn(crc, tmp5, crc);
14751572

14761573
const ExternalAddress table_addr = StubRoutines::crc_table_addr();
14771574
la(table0, table_addr);
1478-
add(table1, table0, 1*256*sizeof(juint), tmp1);
1479-
add(table2, table0, 2*256*sizeof(juint), tmp1);
1480-
add(table3, table2, 1*256*sizeof(juint), tmp1);
1575+
add(table1, table0, 1*single_table_size*sizeof(juint), tmp1);
1576+
add(table2, table0, 2*single_table_size*sizeof(juint), tmp1);
1577+
add(table3, table2, 1*single_table_size*sizeof(juint), tmp1);
14811578

1579+
if (UseRVV) {
1580+
const int64_t tmp_limit = MaxVectorSize >= 32 ? unroll_words*3 : unroll_words*5;
1581+
mv(tmp1, tmp_limit);
1582+
bge(len, tmp1, L_vector_entry);
1583+
}
1584+
subw(len, len, unroll_words);
14821585
bge(len, zr, L_unroll_loop_entry);
1586+
14831587
addiw(len, len, unroll_words-4);
14841588
bge(len, zr, L_by4_loop);
14851589
addiw(len, len, 4);
@@ -1539,6 +1643,19 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
15391643
andi(tmp2, tmp2, right_8_bits);
15401644
update_byte_crc32(crc, tmp2, table0);
15411645

1646+
// put vector code here, otherwise "offset is too large" error occurs.
1647+
if (UseRVV) {
1648+
j(L_exit); // only need to jump exit when UseRVV == true, it's a jump from end of block `L_by1_loop`.
1649+
1650+
bind(L_vector_entry);
1651+
vector_update_crc32(crc, buf, len, tmp1, tmp2, tmp3, tmp4, tmp6, table0, table3);
1652+
1653+
addiw(len, len, -4);
1654+
bge(len, zr, L_by4_loop);
1655+
addiw(len, len, 4);
1656+
bgt(len, zr, L_by1_loop);
1657+
}
1658+
15421659
bind(L_exit);
15431660
andn(crc, tmp5, crc);
15441661
}

src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,6 +1319,9 @@ class MacroAssembler: public Assembler {
13191319
Register table0, Register table1, Register table2, Register table3,
13201320
bool upper);
13211321
void update_byte_crc32(Register crc, Register val, Register table);
1322+
void vector_update_crc32(Register crc, Register buf, Register len,
1323+
Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5,
1324+
Register table0, Register table3);
13221325

13231326
#ifdef COMPILER2
13241327
void mul_add(Register out, Register in, Register offset,

src/hotspot/cpu/riscv/stubRoutines_riscv.cpp

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,219 @@ ATTRIBUTE_ALIGNED(4096) juint StubRoutines::riscv::_crc_table[] =
276276
0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
277277
0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
278278
0xde0506f1UL,
279+
280+
// Tables for vector version
281+
// This improvement (vectorization) is based on java.base/share/native/libzip/zlib/zcrc32.c.
282+
// To make it, following steps are taken:
283+
// 1. in zcrc32.c, modify N to 16 and related code,
284+
// 2. re-generate the tables needed, we use tables of (N == 16, W == 4)
285+
// 3. finally vectorize the code (original implementation in zcrc32.c is just scalar code).
286+
0x00000000, 0x8f352d95, 0xc51b5d6b, 0x4a2e70fe, 0x5147bc97,
287+
0xde729102, 0x945ce1fc, 0x1b69cc69, 0xa28f792e, 0x2dba54bb,
288+
0x67942445, 0xe8a109d0, 0xf3c8c5b9, 0x7cfde82c, 0x36d398d2,
289+
0xb9e6b547, 0x9e6ff41d, 0x115ad988, 0x5b74a976, 0xd44184e3,
290+
0xcf28488a, 0x401d651f, 0x0a3315e1, 0x85063874, 0x3ce08d33,
291+
0xb3d5a0a6, 0xf9fbd058, 0x76cefdcd, 0x6da731a4, 0xe2921c31,
292+
0xa8bc6ccf, 0x2789415a, 0xe7aeee7b, 0x689bc3ee, 0x22b5b310,
293+
0xad809e85, 0xb6e952ec, 0x39dc7f79, 0x73f20f87, 0xfcc72212,
294+
0x45219755, 0xca14bac0, 0x803aca3e, 0x0f0fe7ab, 0x14662bc2,
295+
0x9b530657, 0xd17d76a9, 0x5e485b3c, 0x79c11a66, 0xf6f437f3,
296+
0xbcda470d, 0x33ef6a98, 0x2886a6f1, 0xa7b38b64, 0xed9dfb9a,
297+
0x62a8d60f, 0xdb4e6348, 0x547b4edd, 0x1e553e23, 0x916013b6,
298+
0x8a09dfdf, 0x053cf24a, 0x4f1282b4, 0xc027af21, 0x142cdab7,
299+
0x9b19f722, 0xd13787dc, 0x5e02aa49, 0x456b6620, 0xca5e4bb5,
300+
0x80703b4b, 0x0f4516de, 0xb6a3a399, 0x39968e0c, 0x73b8fef2,
301+
0xfc8dd367, 0xe7e41f0e, 0x68d1329b, 0x22ff4265, 0xadca6ff0,
302+
0x8a432eaa, 0x0576033f, 0x4f5873c1, 0xc06d5e54, 0xdb04923d,
303+
0x5431bfa8, 0x1e1fcf56, 0x912ae2c3, 0x28cc5784, 0xa7f97a11,
304+
0xedd70aef, 0x62e2277a, 0x798beb13, 0xf6bec686, 0xbc90b678,
305+
0x33a59bed, 0xf38234cc, 0x7cb71959, 0x369969a7, 0xb9ac4432,
306+
0xa2c5885b, 0x2df0a5ce, 0x67ded530, 0xe8ebf8a5, 0x510d4de2,
307+
0xde386077, 0x94161089, 0x1b233d1c, 0x004af175, 0x8f7fdce0,
308+
0xc551ac1e, 0x4a64818b, 0x6dedc0d1, 0xe2d8ed44, 0xa8f69dba,
309+
0x27c3b02f, 0x3caa7c46, 0xb39f51d3, 0xf9b1212d, 0x76840cb8,
310+
0xcf62b9ff, 0x4057946a, 0x0a79e494, 0x854cc901, 0x9e250568,
311+
0x111028fd, 0x5b3e5803, 0xd40b7596, 0x2859b56e, 0xa76c98fb,
312+
0xed42e805, 0x6277c590, 0x791e09f9, 0xf62b246c, 0xbc055492,
313+
0x33307907, 0x8ad6cc40, 0x05e3e1d5, 0x4fcd912b, 0xc0f8bcbe,
314+
0xdb9170d7, 0x54a45d42, 0x1e8a2dbc, 0x91bf0029, 0xb6364173,
315+
0x39036ce6, 0x732d1c18, 0xfc18318d, 0xe771fde4, 0x6844d071,
316+
0x226aa08f, 0xad5f8d1a, 0x14b9385d, 0x9b8c15c8, 0xd1a26536,
317+
0x5e9748a3, 0x45fe84ca, 0xcacba95f, 0x80e5d9a1, 0x0fd0f434,
318+
0xcff75b15, 0x40c27680, 0x0aec067e, 0x85d92beb, 0x9eb0e782,
319+
0x1185ca17, 0x5babbae9, 0xd49e977c, 0x6d78223b, 0xe24d0fae,
320+
0xa8637f50, 0x275652c5, 0x3c3f9eac, 0xb30ab339, 0xf924c3c7,
321+
0x7611ee52, 0x5198af08, 0xdead829d, 0x9483f263, 0x1bb6dff6,
322+
0x00df139f, 0x8fea3e0a, 0xc5c44ef4, 0x4af16361, 0xf317d626,
323+
0x7c22fbb3, 0x360c8b4d, 0xb939a6d8, 0xa2506ab1, 0x2d654724,
324+
0x674b37da, 0xe87e1a4f, 0x3c756fd9, 0xb340424c, 0xf96e32b2,
325+
0x765b1f27, 0x6d32d34e, 0xe207fedb, 0xa8298e25, 0x271ca3b0,
326+
0x9efa16f7, 0x11cf3b62, 0x5be14b9c, 0xd4d46609, 0xcfbdaa60,
327+
0x408887f5, 0x0aa6f70b, 0x8593da9e, 0xa21a9bc4, 0x2d2fb651,
328+
0x6701c6af, 0xe834eb3a, 0xf35d2753, 0x7c680ac6, 0x36467a38,
329+
0xb97357ad, 0x0095e2ea, 0x8fa0cf7f, 0xc58ebf81, 0x4abb9214,
330+
0x51d25e7d, 0xdee773e8, 0x94c90316, 0x1bfc2e83, 0xdbdb81a2,
331+
0x54eeac37, 0x1ec0dcc9, 0x91f5f15c, 0x8a9c3d35, 0x05a910a0,
332+
0x4f87605e, 0xc0b24dcb, 0x7954f88c, 0xf661d519, 0xbc4fa5e7,
333+
0x337a8872, 0x2813441b, 0xa726698e, 0xed081970, 0x623d34e5,
334+
0x45b475bf, 0xca81582a, 0x80af28d4, 0x0f9a0541, 0x14f3c928,
335+
0x9bc6e4bd, 0xd1e89443, 0x5eddb9d6, 0xe73b0c91, 0x680e2104,
336+
0x222051fa, 0xad157c6f, 0xb67cb006, 0x39499d93, 0x7367ed6d,
337+
0xfc52c0f8,
338+
0x00000000, 0x50b36adc, 0xa166d5b8, 0xf1d5bf64, 0x99bcad31,
339+
0xc90fc7ed, 0x38da7889, 0x68691255, 0xe8085c23, 0xb8bb36ff,
340+
0x496e899b, 0x19dde347, 0x71b4f112, 0x21079bce, 0xd0d224aa,
341+
0x80614e76, 0x0b61be07, 0x5bd2d4db, 0xaa076bbf, 0xfab40163,
342+
0x92dd1336, 0xc26e79ea, 0x33bbc68e, 0x6308ac52, 0xe369e224,
343+
0xb3da88f8, 0x420f379c, 0x12bc5d40, 0x7ad54f15, 0x2a6625c9,
344+
0xdbb39aad, 0x8b00f071, 0x16c37c0e, 0x467016d2, 0xb7a5a9b6,
345+
0xe716c36a, 0x8f7fd13f, 0xdfccbbe3, 0x2e190487, 0x7eaa6e5b,
346+
0xfecb202d, 0xae784af1, 0x5fadf595, 0x0f1e9f49, 0x67778d1c,
347+
0x37c4e7c0, 0xc61158a4, 0x96a23278, 0x1da2c209, 0x4d11a8d5,
348+
0xbcc417b1, 0xec777d6d, 0x841e6f38, 0xd4ad05e4, 0x2578ba80,
349+
0x75cbd05c, 0xf5aa9e2a, 0xa519f4f6, 0x54cc4b92, 0x047f214e,
350+
0x6c16331b, 0x3ca559c7, 0xcd70e6a3, 0x9dc38c7f, 0x2d86f81c,
351+
0x7d3592c0, 0x8ce02da4, 0xdc534778, 0xb43a552d, 0xe4893ff1,
352+
0x155c8095, 0x45efea49, 0xc58ea43f, 0x953dcee3, 0x64e87187,
353+
0x345b1b5b, 0x5c32090e, 0x0c8163d2, 0xfd54dcb6, 0xade7b66a,
354+
0x26e7461b, 0x76542cc7, 0x878193a3, 0xd732f97f, 0xbf5beb2a,
355+
0xefe881f6, 0x1e3d3e92, 0x4e8e544e, 0xceef1a38, 0x9e5c70e4,
356+
0x6f89cf80, 0x3f3aa55c, 0x5753b709, 0x07e0ddd5, 0xf63562b1,
357+
0xa686086d, 0x3b458412, 0x6bf6eece, 0x9a2351aa, 0xca903b76,
358+
0xa2f92923, 0xf24a43ff, 0x039ffc9b, 0x532c9647, 0xd34dd831,
359+
0x83feb2ed, 0x722b0d89, 0x22986755, 0x4af17500, 0x1a421fdc,
360+
0xeb97a0b8, 0xbb24ca64, 0x30243a15, 0x609750c9, 0x9142efad,
361+
0xc1f18571, 0xa9989724, 0xf92bfdf8, 0x08fe429c, 0x584d2840,
362+
0xd82c6636, 0x889f0cea, 0x794ab38e, 0x29f9d952, 0x4190cb07,
363+
0x1123a1db, 0xe0f61ebf, 0xb0457463, 0x5b0df038, 0x0bbe9ae4,
364+
0xfa6b2580, 0xaad84f5c, 0xc2b15d09, 0x920237d5, 0x63d788b1,
365+
0x3364e26d, 0xb305ac1b, 0xe3b6c6c7, 0x126379a3, 0x42d0137f,
366+
0x2ab9012a, 0x7a0a6bf6, 0x8bdfd492, 0xdb6cbe4e, 0x506c4e3f,
367+
0x00df24e3, 0xf10a9b87, 0xa1b9f15b, 0xc9d0e30e, 0x996389d2,
368+
0x68b636b6, 0x38055c6a, 0xb864121c, 0xe8d778c0, 0x1902c7a4,
369+
0x49b1ad78, 0x21d8bf2d, 0x716bd5f1, 0x80be6a95, 0xd00d0049,
370+
0x4dce8c36, 0x1d7de6ea, 0xeca8598e, 0xbc1b3352, 0xd4722107,
371+
0x84c14bdb, 0x7514f4bf, 0x25a79e63, 0xa5c6d015, 0xf575bac9,
372+
0x04a005ad, 0x54136f71, 0x3c7a7d24, 0x6cc917f8, 0x9d1ca89c,
373+
0xcdafc240, 0x46af3231, 0x161c58ed, 0xe7c9e789, 0xb77a8d55,
374+
0xdf139f00, 0x8fa0f5dc, 0x7e754ab8, 0x2ec62064, 0xaea76e12,
375+
0xfe1404ce, 0x0fc1bbaa, 0x5f72d176, 0x371bc323, 0x67a8a9ff,
376+
0x967d169b, 0xc6ce7c47, 0x768b0824, 0x263862f8, 0xd7eddd9c,
377+
0x875eb740, 0xef37a515, 0xbf84cfc9, 0x4e5170ad, 0x1ee21a71,
378+
0x9e835407, 0xce303edb, 0x3fe581bf, 0x6f56eb63, 0x073ff936,
379+
0x578c93ea, 0xa6592c8e, 0xf6ea4652, 0x7deab623, 0x2d59dcff,
380+
0xdc8c639b, 0x8c3f0947, 0xe4561b12, 0xb4e571ce, 0x4530ceaa,
381+
0x1583a476, 0x95e2ea00, 0xc55180dc, 0x34843fb8, 0x64375564,
382+
0x0c5e4731, 0x5ced2ded, 0xad389289, 0xfd8bf855, 0x6048742a,
383+
0x30fb1ef6, 0xc12ea192, 0x919dcb4e, 0xf9f4d91b, 0xa947b3c7,
384+
0x58920ca3, 0x0821667f, 0x88402809, 0xd8f342d5, 0x2926fdb1,
385+
0x7995976d, 0x11fc8538, 0x414fefe4, 0xb09a5080, 0xe0293a5c,
386+
0x6b29ca2d, 0x3b9aa0f1, 0xca4f1f95, 0x9afc7549, 0xf295671c,
387+
0xa2260dc0, 0x53f3b2a4, 0x0340d878, 0x8321960e, 0xd392fcd2,
388+
0x224743b6, 0x72f4296a, 0x1a9d3b3f, 0x4a2e51e3, 0xbbfbee87,
389+
0xeb48845b,
390+
0x00000000, 0xb61be070, 0xb746c6a1, 0x015d26d1, 0xb5fc8b03,
391+
0x03e76b73, 0x02ba4da2, 0xb4a1add2, 0xb0881047, 0x0693f037,
392+
0x07ced6e6, 0xb1d53696, 0x05749b44, 0xb36f7b34, 0xb2325de5,
393+
0x0429bd95, 0xba6126cf, 0x0c7ac6bf, 0x0d27e06e, 0xbb3c001e,
394+
0x0f9dadcc, 0xb9864dbc, 0xb8db6b6d, 0x0ec08b1d, 0x0ae93688,
395+
0xbcf2d6f8, 0xbdaff029, 0x0bb41059, 0xbf15bd8b, 0x090e5dfb,
396+
0x08537b2a, 0xbe489b5a, 0xafb34bdf, 0x19a8abaf, 0x18f58d7e,
397+
0xaeee6d0e, 0x1a4fc0dc, 0xac5420ac, 0xad09067d, 0x1b12e60d,
398+
0x1f3b5b98, 0xa920bbe8, 0xa87d9d39, 0x1e667d49, 0xaac7d09b,
399+
0x1cdc30eb, 0x1d81163a, 0xab9af64a, 0x15d26d10, 0xa3c98d60,
400+
0xa294abb1, 0x148f4bc1, 0xa02ee613, 0x16350663, 0x176820b2,
401+
0xa173c0c2, 0xa55a7d57, 0x13419d27, 0x121cbbf6, 0xa4075b86,
402+
0x10a6f654, 0xa6bd1624, 0xa7e030f5, 0x11fbd085, 0x841791ff,
403+
0x320c718f, 0x3351575e, 0x854ab72e, 0x31eb1afc, 0x87f0fa8c,
404+
0x86addc5d, 0x30b63c2d, 0x349f81b8, 0x828461c8, 0x83d94719,
405+
0x35c2a769, 0x81630abb, 0x3778eacb, 0x3625cc1a, 0x803e2c6a,
406+
0x3e76b730, 0x886d5740, 0x89307191, 0x3f2b91e1, 0x8b8a3c33,
407+
0x3d91dc43, 0x3cccfa92, 0x8ad71ae2, 0x8efea777, 0x38e54707,
408+
0x39b861d6, 0x8fa381a6, 0x3b022c74, 0x8d19cc04, 0x8c44ead5,
409+
0x3a5f0aa5, 0x2ba4da20, 0x9dbf3a50, 0x9ce21c81, 0x2af9fcf1,
410+
0x9e585123, 0x2843b153, 0x291e9782, 0x9f0577f2, 0x9b2cca67,
411+
0x2d372a17, 0x2c6a0cc6, 0x9a71ecb6, 0x2ed04164, 0x98cba114,
412+
0x999687c5, 0x2f8d67b5, 0x91c5fcef, 0x27de1c9f, 0x26833a4e,
413+
0x9098da3e, 0x243977ec, 0x9222979c, 0x937fb14d, 0x2564513d,
414+
0x214deca8, 0x97560cd8, 0x960b2a09, 0x2010ca79, 0x94b167ab,
415+
0x22aa87db, 0x23f7a10a, 0x95ec417a, 0xd35e25bf, 0x6545c5cf,
416+
0x6418e31e, 0xd203036e, 0x66a2aebc, 0xd0b94ecc, 0xd1e4681d,
417+
0x67ff886d, 0x63d635f8, 0xd5cdd588, 0xd490f359, 0x628b1329,
418+
0xd62abefb, 0x60315e8b, 0x616c785a, 0xd777982a, 0x693f0370,
419+
0xdf24e300, 0xde79c5d1, 0x686225a1, 0xdcc38873, 0x6ad86803,
420+
0x6b854ed2, 0xdd9eaea2, 0xd9b71337, 0x6facf347, 0x6ef1d596,
421+
0xd8ea35e6, 0x6c4b9834, 0xda507844, 0xdb0d5e95, 0x6d16bee5,
422+
0x7ced6e60, 0xcaf68e10, 0xcbaba8c1, 0x7db048b1, 0xc911e563,
423+
0x7f0a0513, 0x7e5723c2, 0xc84cc3b2, 0xcc657e27, 0x7a7e9e57,
424+
0x7b23b886, 0xcd3858f6, 0x7999f524, 0xcf821554, 0xcedf3385,
425+
0x78c4d3f5, 0xc68c48af, 0x7097a8df, 0x71ca8e0e, 0xc7d16e7e,
426+
0x7370c3ac, 0xc56b23dc, 0xc436050d, 0x722de57d, 0x760458e8,
427+
0xc01fb898, 0xc1429e49, 0x77597e39, 0xc3f8d3eb, 0x75e3339b,
428+
0x74be154a, 0xc2a5f53a, 0x5749b440, 0xe1525430, 0xe00f72e1,
429+
0x56149291, 0xe2b53f43, 0x54aedf33, 0x55f3f9e2, 0xe3e81992,
430+
0xe7c1a407, 0x51da4477, 0x508762a6, 0xe69c82d6, 0x523d2f04,
431+
0xe426cf74, 0xe57be9a5, 0x536009d5, 0xed28928f, 0x5b3372ff,
432+
0x5a6e542e, 0xec75b45e, 0x58d4198c, 0xeecff9fc, 0xef92df2d,
433+
0x59893f5d, 0x5da082c8, 0xebbb62b8, 0xeae64469, 0x5cfda419,
434+
0xe85c09cb, 0x5e47e9bb, 0x5f1acf6a, 0xe9012f1a, 0xf8faff9f,
435+
0x4ee11fef, 0x4fbc393e, 0xf9a7d94e, 0x4d06749c, 0xfb1d94ec,
436+
0xfa40b23d, 0x4c5b524d, 0x4872efd8, 0xfe690fa8, 0xff342979,
437+
0x492fc909, 0xfd8e64db, 0x4b9584ab, 0x4ac8a27a, 0xfcd3420a,
438+
0x429bd950, 0xf4803920, 0xf5dd1ff1, 0x43c6ff81, 0xf7675253,
439+
0x417cb223, 0x402194f2, 0xf63a7482, 0xf213c917, 0x44082967,
440+
0x45550fb6, 0xf34eefc6, 0x47ef4214, 0xf1f4a264, 0xf0a984b5,
441+
0x46b264c5,
442+
0x00000000, 0x7dcd4d3f, 0xfb9a9a7e, 0x8657d741, 0x2c4432bd,
443+
0x51897f82, 0xd7dea8c3, 0xaa13e5fc, 0x5888657a, 0x25452845,
444+
0xa312ff04, 0xdedfb23b, 0x74cc57c7, 0x09011af8, 0x8f56cdb9,
445+
0xf29b8086, 0xb110caf4, 0xccdd87cb, 0x4a8a508a, 0x37471db5,
446+
0x9d54f849, 0xe099b576, 0x66ce6237, 0x1b032f08, 0xe998af8e,
447+
0x9455e2b1, 0x120235f0, 0x6fcf78cf, 0xc5dc9d33, 0xb811d00c,
448+
0x3e46074d, 0x438b4a72, 0xb95093a9, 0xc49dde96, 0x42ca09d7,
449+
0x3f0744e8, 0x9514a114, 0xe8d9ec2b, 0x6e8e3b6a, 0x13437655,
450+
0xe1d8f6d3, 0x9c15bbec, 0x1a426cad, 0x678f2192, 0xcd9cc46e,
451+
0xb0518951, 0x36065e10, 0x4bcb132f, 0x0840595d, 0x758d1462,
452+
0xf3dac323, 0x8e178e1c, 0x24046be0, 0x59c926df, 0xdf9ef19e,
453+
0xa253bca1, 0x50c83c27, 0x2d057118, 0xab52a659, 0xd69feb66,
454+
0x7c8c0e9a, 0x014143a5, 0x871694e4, 0xfadbd9db, 0xa9d02113,
455+
0xd41d6c2c, 0x524abb6d, 0x2f87f652, 0x859413ae, 0xf8595e91,
456+
0x7e0e89d0, 0x03c3c4ef, 0xf1584469, 0x8c950956, 0x0ac2de17,
457+
0x770f9328, 0xdd1c76d4, 0xa0d13beb, 0x2686ecaa, 0x5b4ba195,
458+
0x18c0ebe7, 0x650da6d8, 0xe35a7199, 0x9e973ca6, 0x3484d95a,
459+
0x49499465, 0xcf1e4324, 0xb2d30e1b, 0x40488e9d, 0x3d85c3a2,
460+
0xbbd214e3, 0xc61f59dc, 0x6c0cbc20, 0x11c1f11f, 0x9796265e,
461+
0xea5b6b61, 0x1080b2ba, 0x6d4dff85, 0xeb1a28c4, 0x96d765fb,
462+
0x3cc48007, 0x4109cd38, 0xc75e1a79, 0xba935746, 0x4808d7c0,
463+
0x35c59aff, 0xb3924dbe, 0xce5f0081, 0x644ce57d, 0x1981a842,
464+
0x9fd67f03, 0xe21b323c, 0xa190784e, 0xdc5d3571, 0x5a0ae230,
465+
0x27c7af0f, 0x8dd44af3, 0xf01907cc, 0x764ed08d, 0x0b839db2,
466+
0xf9181d34, 0x84d5500b, 0x0282874a, 0x7f4fca75, 0xd55c2f89,
467+
0xa89162b6, 0x2ec6b5f7, 0x530bf8c8, 0x88d14467, 0xf51c0958,
468+
0x734bde19, 0x0e869326, 0xa49576da, 0xd9583be5, 0x5f0feca4,
469+
0x22c2a19b, 0xd059211d, 0xad946c22, 0x2bc3bb63, 0x560ef65c,
470+
0xfc1d13a0, 0x81d05e9f, 0x078789de, 0x7a4ac4e1, 0x39c18e93,
471+
0x440cc3ac, 0xc25b14ed, 0xbf9659d2, 0x1585bc2e, 0x6848f111,
472+
0xee1f2650, 0x93d26b6f, 0x6149ebe9, 0x1c84a6d6, 0x9ad37197,
473+
0xe71e3ca8, 0x4d0dd954, 0x30c0946b, 0xb697432a, 0xcb5a0e15,
474+
0x3181d7ce, 0x4c4c9af1, 0xca1b4db0, 0xb7d6008f, 0x1dc5e573,
475+
0x6008a84c, 0xe65f7f0d, 0x9b923232, 0x6909b2b4, 0x14c4ff8b,
476+
0x929328ca, 0xef5e65f5, 0x454d8009, 0x3880cd36, 0xbed71a77,
477+
0xc31a5748, 0x80911d3a, 0xfd5c5005, 0x7b0b8744, 0x06c6ca7b,
478+
0xacd52f87, 0xd11862b8, 0x574fb5f9, 0x2a82f8c6, 0xd8197840,
479+
0xa5d4357f, 0x2383e23e, 0x5e4eaf01, 0xf45d4afd, 0x899007c2,
480+
0x0fc7d083, 0x720a9dbc, 0x21016574, 0x5ccc284b, 0xda9bff0a,
481+
0xa756b235, 0x0d4557c9, 0x70881af6, 0xf6dfcdb7, 0x8b128088,
482+
0x7989000e, 0x04444d31, 0x82139a70, 0xffded74f, 0x55cd32b3,
483+
0x28007f8c, 0xae57a8cd, 0xd39ae5f2, 0x9011af80, 0xeddce2bf,
484+
0x6b8b35fe, 0x164678c1, 0xbc559d3d, 0xc198d002, 0x47cf0743,
485+
0x3a024a7c, 0xc899cafa, 0xb55487c5, 0x33035084, 0x4ece1dbb,
486+
0xe4ddf847, 0x9910b578, 0x1f476239, 0x628a2f06, 0x9851f6dd,
487+
0xe59cbbe2, 0x63cb6ca3, 0x1e06219c, 0xb415c460, 0xc9d8895f,
488+
0x4f8f5e1e, 0x32421321, 0xc0d993a7, 0xbd14de98, 0x3b4309d9,
489+
0x468e44e6, 0xec9da11a, 0x9150ec25, 0x17073b64, 0x6aca765b,
490+
0x29413c29, 0x548c7116, 0xd2dba657, 0xaf16eb68, 0x05050e94,
491+
0x78c843ab, 0xfe9f94ea, 0x8352d9d5, 0x71c95953, 0x0c04146c,
492+
0x8a53c32d, 0xf79e8e12, 0x5d8d6bee, 0x204026d1, 0xa617f190,
493+
0xdbdabcaf
279494
};

0 commit comments

Comments
 (0)