diff --git a/.gitmodules b/.gitmodules index 293029ad1718..58a22b9a7f23 100644 --- a/.gitmodules +++ b/.gitmodules @@ -290,3 +290,6 @@ [submodule "contrib/morton-nd"] path = contrib/morton-nd url = https://github.com/morton-nd/morton-nd +[submodule "contrib/crc32-vpmsum"] + path = contrib/crc32-vpmsum + url = https://github.com/antonblanchard/crc32-vpmsum.git diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 8ebd4ab55d35..452da55b3733 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -51,6 +51,7 @@ endfunction() add_contrib (miniselect-cmake miniselect) add_contrib (pdqsort-cmake pdqsort) +add_contrib (crc32-vpmsum-cmake crc32-vpmsum) add_contrib (sparsehash-c11-cmake sparsehash-c11) add_contrib (abseil-cpp-cmake abseil-cpp) add_contrib (magic-enum-cmake magic_enum) diff --git a/contrib/crc32-vpmsum b/contrib/crc32-vpmsum new file mode 160000 index 000000000000..452155439389 --- /dev/null +++ b/contrib/crc32-vpmsum @@ -0,0 +1 @@ +Subproject commit 452155439389311fc7d143621eaf56a258e02476 diff --git a/contrib/crc32-vpmsum-cmake/CMakeLists.txt b/contrib/crc32-vpmsum-cmake/CMakeLists.txt new file mode 100644 index 000000000000..bb7d56184105 --- /dev/null +++ b/contrib/crc32-vpmsum-cmake/CMakeLists.txt @@ -0,0 +1,12 @@ +if (NOT ARCH_PPC64LE) + message(STATUS "crc32-vpmsum library is only supported on ppc64le") + return() +endif() + +SET(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/crc32-vpmsum") + +add_library(_crc32-vpmsum + "${LIBRARY_DIR}/vec_crc32.c" + ) +target_include_directories(_crc32-vpmsum SYSTEM BEFORE PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") +add_library(ch_contrib::crc32-vpmsum ALIAS _crc32-vpmsum) diff --git a/contrib/crc32-vpmsum-cmake/README.md b/contrib/crc32-vpmsum-cmake/README.md new file mode 100644 index 000000000000..4ca1b9891164 --- /dev/null +++ b/contrib/crc32-vpmsum-cmake/README.md @@ -0,0 +1,8 @@ +# To Generate crc32_constants.h + +- Run make file in `../crc32-vpmsum` diretory using folling options and CRC polynomial. These options should use the same polynomial and order used by intel intrinisic functions +```bash +make crc32_constants.h CRC="0x182f63b78" OPTIONS="-x" +``` +- move the generated `crc32_constants.h` into this directory +- To understand more about this go here: https://masterchef2209.wordpress.com/2020/06/17/guide-to-intel-sse4-2-crc-intrinisics-implementation-for-simde/ diff --git a/contrib/crc32-vpmsum-cmake/crc32_constants.h b/contrib/crc32-vpmsum-cmake/crc32_constants.h new file mode 100644 index 000000000000..e5d9c95ab336 --- /dev/null +++ b/contrib/crc32-vpmsum-cmake/crc32_constants.h @@ -0,0 +1,2031 @@ +/* +* +* THIS FILE IS GENERATED WITH +./crc32_constants -x 0x182f63b78 + +* This is from https://github.com/antonblanchard/crc32-vpmsum/ +* DO NOT MODIFY IT MANUALLY! +* +*/ + +#define CRC 0x82f63b78 +#define CRC_XOR +#define MAX_SIZE 32768 + +#ifndef __ASSEMBLER__ +#ifdef CRC_TABLE +static const unsigned int crc_table[] = { + 0x00000000, 0x82f63b78, 0x871a4d88, 0x05ec76f0, + 0x8cc2a068, 0x0e349b10, 0x0bd8ede0, 0x892ed698, + 0x9b737ba8, 0x198540d0, 0x1c693620, 0x9e9f0d58, + 0x17b1dbc0, 0x9547e0b8, 0x90ab9648, 0x125dad30, + 0xb410cc28, 0x36e6f750, 0x330a81a0, 0xb1fcbad8, + 0x38d26c40, 0xba245738, 0xbfc821c8, 0x3d3e1ab0, + 0x2f63b780, 0xad958cf8, 0xa879fa08, 0x2a8fc170, + 0xa3a117e8, 0x21572c90, 0x24bb5a60, 0xa64d6118, + 0xead7a328, 0x68219850, 0x6dcdeea0, 0xef3bd5d8, + 0x66150340, 0xe4e33838, 0xe10f4ec8, 0x63f975b0, + 0x71a4d880, 0xf352e3f8, 0xf6be9508, 0x7448ae70, + 0xfd6678e8, 0x7f904390, 0x7a7c3560, 0xf88a0e18, + 0x5ec76f00, 0xdc315478, 0xd9dd2288, 0x5b2b19f0, + 0xd205cf68, 0x50f3f410, 0x551f82e0, 0xd7e9b998, + 0xc5b414a8, 0x47422fd0, 0x42ae5920, 0xc0586258, + 0x4976b4c0, 0xcb808fb8, 0xce6cf948, 0x4c9ac230, + 0x57597d28, 0xd5af4650, 0xd04330a0, 0x52b50bd8, + 0xdb9bdd40, 0x596de638, 0x5c8190c8, 0xde77abb0, + 0xcc2a0680, 0x4edc3df8, 0x4b304b08, 0xc9c67070, + 0x40e8a6e8, 0xc21e9d90, 0xc7f2eb60, 0x4504d018, + 0xe349b100, 0x61bf8a78, 0x6453fc88, 0xe6a5c7f0, + 0x6f8b1168, 0xed7d2a10, 0xe8915ce0, 0x6a676798, + 0x783acaa8, 0xfaccf1d0, 0xff208720, 0x7dd6bc58, + 0xf4f86ac0, 0x760e51b8, 0x73e22748, 0xf1141c30, + 0xbd8ede00, 0x3f78e578, 0x3a949388, 0xb862a8f0, + 0x314c7e68, 0xb3ba4510, 0xb65633e0, 0x34a00898, + 0x26fda5a8, 0xa40b9ed0, 0xa1e7e820, 0x2311d358, + 0xaa3f05c0, 0x28c93eb8, 0x2d254848, 0xafd37330, + 0x099e1228, 0x8b682950, 0x8e845fa0, 0x0c7264d8, + 0x855cb240, 0x07aa8938, 0x0246ffc8, 0x80b0c4b0, + 0x92ed6980, 0x101b52f8, 0x15f72408, 0x97011f70, + 0x1e2fc9e8, 0x9cd9f290, 0x99358460, 0x1bc3bf18, + 0xaeb2fa50, 0x2c44c128, 0x29a8b7d8, 0xab5e8ca0, + 0x22705a38, 0xa0866140, 0xa56a17b0, 0x279c2cc8, + 0x35c181f8, 0xb737ba80, 0xb2dbcc70, 0x302df708, + 0xb9032190, 0x3bf51ae8, 0x3e196c18, 0xbcef5760, + 0x1aa23678, 0x98540d00, 0x9db87bf0, 0x1f4e4088, + 0x96609610, 0x1496ad68, 0x117adb98, 0x938ce0e0, + 0x81d14dd0, 0x032776a8, 0x06cb0058, 0x843d3b20, + 0x0d13edb8, 0x8fe5d6c0, 0x8a09a030, 0x08ff9b48, + 0x44655978, 0xc6936200, 0xc37f14f0, 0x41892f88, + 0xc8a7f910, 0x4a51c268, 0x4fbdb498, 0xcd4b8fe0, + 0xdf1622d0, 0x5de019a8, 0x580c6f58, 0xdafa5420, + 0x53d482b8, 0xd122b9c0, 0xd4cecf30, 0x5638f448, + 0xf0759550, 0x7283ae28, 0x776fd8d8, 0xf599e3a0, + 0x7cb73538, 0xfe410e40, 0xfbad78b0, 0x795b43c8, + 0x6b06eef8, 0xe9f0d580, 0xec1ca370, 0x6eea9808, + 0xe7c44e90, 0x653275e8, 0x60de0318, 0xe2283860, + 0xf9eb8778, 0x7b1dbc00, 0x7ef1caf0, 0xfc07f188, + 0x75292710, 0xf7df1c68, 0xf2336a98, 0x70c551e0, + 0x6298fcd0, 0xe06ec7a8, 0xe582b158, 0x67748a20, + 0xee5a5cb8, 0x6cac67c0, 0x69401130, 0xebb62a48, + 0x4dfb4b50, 0xcf0d7028, 0xcae106d8, 0x48173da0, + 0xc139eb38, 0x43cfd040, 0x4623a6b0, 0xc4d59dc8, + 0xd68830f8, 0x547e0b80, 0x51927d70, 0xd3644608, + 0x5a4a9090, 0xd8bcabe8, 0xdd50dd18, 0x5fa6e660, + 0x133c2450, 0x91ca1f28, 0x942669d8, 0x16d052a0, + 0x9ffe8438, 0x1d08bf40, 0x18e4c9b0, 0x9a12f2c8, + 0x884f5ff8, 0x0ab96480, 0x0f551270, 0x8da32908, + 0x048dff90, 0x867bc4e8, 0x8397b218, 0x01618960, + 0xa72ce878, 0x25dad300, 0x2036a5f0, 0xa2c09e88, + 0x2bee4810, 0xa9187368, 0xacf40598, 0x2e023ee0, + 0x3c5f93d0, 0xbea9a8a8, 0xbb45de58, 0x39b3e520, + 0xb09d33b8, 0x326b08c0, 0x37877e30, 0xb5714548,}; + +#endif /* CRC_TABLE */ +#ifdef POWER8_INTRINSICS + +/* Constants */ + +/* Reduce 262144 kbits to 1024 bits */ +static const __vector unsigned long long vcrc_const[255] + __attribute__((aligned (16))) = { +#ifdef __LITTLE_ENDIAN__ + /* x^261184 mod p(x)` , x^261120 mod p(x)` */ + { 0x000000003f02aaa0, 0x00000000a7bbf060 }, + /* x^260160 mod p(x)` , x^260096 mod p(x)` */ + { 0x00000000bb290eb0, 0x00000000d61de5d0 }, + /* x^259136 mod p(x)` , x^259072 mod p(x)` */ + { 0x00000000f3725eb8, 0x00000000a8efc958 }, + /* x^258112 mod p(x)` , x^258048 mod p(x)` */ + { 0x00000000744d94c0, 0x0000000062663048 }, + /* x^257088 mod p(x)` , x^257024 mod p(x)` */ + { 0x0000000087289250, 0x000000004c0c4488 }, + /* x^256064 mod p(x)` , x^256000 mod p(x)` */ + { 0x00000000b5559480, 0x000000009f3c1950 }, + /* x^255040 mod p(x)` , x^254976 mod p(x)` */ + { 0x00000000c6a6f640, 0x00000000d32d9018 }, + /* x^254016 mod p(x)` , x^253952 mod p(x)` */ + { 0x00000000637a6528, 0x0000000081bd8fb8 }, + /* x^252992 mod p(x)` , x^252928 mod p(x)` */ + { 0x0000000010166ef0, 0x000000004575d0a0 }, + /* x^251968 mod p(x)` , x^251904 mod p(x)` */ + { 0x0000000049923d48, 0x000000005a1c1e18 }, + /* x^250944 mod p(x)` , x^250880 mod p(x)` */ + { 0x0000000099f6ae90, 0x0000000045173208 }, + /* x^249920 mod p(x)` , x^249856 mod p(x)` */ + { 0x000000002162c550, 0x00000000420b5f60 }, + /* x^248896 mod p(x)` , x^248832 mod p(x)` */ + { 0x00000000ef3107a0, 0x00000000f4c5b728 }, + /* x^247872 mod p(x)` , x^247808 mod p(x)` */ + { 0x00000000851e8a40, 0x0000000018760b58 }, + /* x^246848 mod p(x)` , x^246784 mod p(x)` */ + { 0x000000007a786e68, 0x000000006d7dba68 }, + /* x^245824 mod p(x)` , x^245760 mod p(x)` */ + { 0x000000005d97c3d0, 0x0000000047095830 }, + /* x^244800 mod p(x)` , x^244736 mod p(x)` */ + { 0x00000000a8760580, 0x0000000002645d18 }, + /* x^243776 mod p(x)` , x^243712 mod p(x)` */ + { 0x000000008dcc4f00, 0x00000000981b3ed0 }, + /* x^242752 mod p(x)` , x^242688 mod p(x)` */ + { 0x000000005fb60768, 0x00000000e00c9140 }, + /* x^241728 mod p(x)` , x^241664 mod p(x)` */ + { 0x000000004e5bd750, 0x00000000e4d9ed90 }, + /* x^240704 mod p(x)` , x^240640 mod p(x)` */ + { 0x00000000273fb988, 0x0000000016425e38 }, + /* x^239680 mod p(x)` , x^239616 mod p(x)` */ + { 0x0000000019020f38, 0x00000000be2a57e0 }, + /* x^238656 mod p(x)` , x^238592 mod p(x)` */ + { 0x0000000097f1ad90, 0x00000000de359190 }, + /* x^237632 mod p(x)` , x^237568 mod p(x)` */ + { 0x00000000279425c8, 0x0000000066221000 }, + /* x^236608 mod p(x)` , x^236544 mod p(x)` */ + { 0x000000002ca764d8, 0x00000000e107ea58 }, + /* x^235584 mod p(x)` , x^235520 mod p(x)` */ + { 0x00000000342c21c8, 0x0000000016aa2380 }, + /* x^234560 mod p(x)` , x^234496 mod p(x)` */ + { 0x00000000a4217dc0, 0x00000000551c7100 }, + /* x^233536 mod p(x)` , x^233472 mod p(x)` */ + { 0x00000000e3a887c8, 0x00000000d3a97040 }, + /* x^232512 mod p(x)` , x^232448 mod p(x)` */ + { 0x000000003ca6edb0, 0x00000000d2d1b480 }, + /* x^231488 mod p(x)` , x^231424 mod p(x)` */ + { 0x00000000def30ae0, 0x00000000ec5a17d8 }, + /* x^230464 mod p(x)` , x^230400 mod p(x)` */ + { 0x00000000cfad2020, 0x00000000f997aa90 }, + /* x^229440 mod p(x)` , x^229376 mod p(x)` */ + { 0x00000000ceb08770, 0x000000004bb85080 }, + /* x^228416 mod p(x)` , x^228352 mod p(x)` */ + { 0x00000000f18c7b08, 0x00000000547d3030 }, + /* x^227392 mod p(x)` , x^227328 mod p(x)` */ + { 0x0000000018f5e738, 0x00000000d32d1d48 }, + /* x^226368 mod p(x)` , x^226304 mod p(x)` */ + { 0x000000008ec52840, 0x00000000aa966a20 }, + /* x^225344 mod p(x)` , x^225280 mod p(x)` */ + { 0x000000003c2364d0, 0x0000000077e06f48 }, + /* x^224320 mod p(x)` , x^224256 mod p(x)` */ + { 0x00000000639146e0, 0x00000000bf106be8 }, + /* x^223296 mod p(x)` , x^223232 mod p(x)` */ + { 0x00000000e0dea810, 0x00000000fa7ad608 }, + /* x^222272 mod p(x)` , x^222208 mod p(x)` */ + { 0x00000000271c60a0, 0x0000000044310840 }, + /* x^221248 mod p(x)` , x^221184 mod p(x)` */ + { 0x0000000027c94138, 0x00000000dcbbc0b8 }, + /* x^220224 mod p(x)` , x^220160 mod p(x)` */ + { 0x000000002dccbe38, 0x000000005cdf7278 }, + /* x^219200 mod p(x)` , x^219136 mod p(x)` */ + { 0x00000000b35fe5d0, 0x00000000a9a8af50 }, + /* x^218176 mod p(x)` , x^218112 mod p(x)` */ + { 0x00000000f210bac0, 0x000000006ceb84a8 }, + /* x^217152 mod p(x)` , x^217088 mod p(x)` */ + { 0x0000000046d4daf8, 0x0000000047ca21d0 }, + /* x^216128 mod p(x)` , x^216064 mod p(x)` */ + { 0x00000000fa755018, 0x0000000087e84d38 }, + /* x^215104 mod p(x)` , x^215040 mod p(x)` */ + { 0x00000000b7e8bb68, 0x00000000129b97b0 }, + /* x^214080 mod p(x)` , x^214016 mod p(x)` */ + { 0x0000000055b429a0, 0x00000000187e14b0 }, + /* x^213056 mod p(x)` , x^212992 mod p(x)` */ + { 0x00000000bb853930, 0x00000000ab24f090 }, + /* x^212032 mod p(x)` , x^211968 mod p(x)` */ + { 0x000000007839c800, 0x000000001c2d80e0 }, + /* x^211008 mod p(x)` , x^210944 mod p(x)` */ + { 0x00000000d2e2e3f0, 0x00000000ea26b4b0 }, + /* x^209984 mod p(x)` , x^209920 mod p(x)` */ + { 0x0000000035c34ed0, 0x000000001e81e6f0 }, + /* x^208960 mod p(x)` , x^208896 mod p(x)` */ + { 0x000000003e0a2d48, 0x0000000017bf67f8 }, + /* x^207936 mod p(x)` , x^207872 mod p(x)` */ + { 0x000000002168d9f8, 0x0000000066549f48 }, + /* x^206912 mod p(x)` , x^206848 mod p(x)` */ + { 0x00000000fd387468, 0x000000009f0eb700 }, + /* x^205888 mod p(x)` , x^205824 mod p(x)` */ + { 0x000000000a851398, 0x000000009a50dd20 }, + /* x^204864 mod p(x)` , x^204800 mod p(x)` */ + { 0x0000000031b21488, 0x00000000e038cf70 }, + /* x^203840 mod p(x)` , x^203776 mod p(x)` */ + { 0x00000000c8d01a30, 0x00000000f062b098 }, + /* x^202816 mod p(x)` , x^202752 mod p(x)` */ + { 0x000000005aae2f58, 0x00000000faab9b58 }, + /* x^201792 mod p(x)` , x^201728 mod p(x)` */ + { 0x00000000b0ac75e0, 0x00000000fc23b1c0 }, + /* x^200768 mod p(x)` , x^200704 mod p(x)` */ + { 0x00000000eb50e330, 0x0000000088adaa30 }, + /* x^199744 mod p(x)` , x^199680 mod p(x)` */ + { 0x00000000c0ef3138, 0x0000000014601f18 }, + /* x^198720 mod p(x)` , x^198656 mod p(x)` */ + { 0x000000005d4431e0, 0x0000000073817a40 }, + /* x^197696 mod p(x)` , x^197632 mod p(x)` */ + { 0x00000000b34963b0, 0x00000000aab01b50 }, + /* x^196672 mod p(x)` , x^196608 mod p(x)` */ + { 0x00000000f770d030, 0x0000000066ad8040 }, + /* x^195648 mod p(x)` , x^195584 mod p(x)` */ + { 0x000000005849c7a0, 0x00000000378db488 }, + /* x^194624 mod p(x)` , x^194560 mod p(x)` */ + { 0x000000007bb1b3a0, 0x000000003bde9048 }, + /* x^193600 mod p(x)` , x^193536 mod p(x)` */ + { 0x000000000dceb318, 0x00000000f6ece068 }, + /* x^192576 mod p(x)` , x^192512 mod p(x)` */ + { 0x000000008e9947b0, 0x000000009d4e7020 }, + /* x^191552 mod p(x)` , x^191488 mod p(x)` */ + { 0x000000002ed2aa58, 0x000000009efee6f0 }, + /* x^190528 mod p(x)` , x^190464 mod p(x)` */ + { 0x00000000922596d0, 0x00000000ea471800 }, + /* x^189504 mod p(x)` , x^189440 mod p(x)` */ + { 0x0000000028f93bf0, 0x0000000011a5a9a8 }, + /* x^188480 mod p(x)` , x^188416 mod p(x)` */ + { 0x00000000e78ba040, 0x00000000a8c96eb0 }, + /* x^187456 mod p(x)` , x^187392 mod p(x)` */ + { 0x000000004677b9e0, 0x000000009800fa50 }, + /* x^186432 mod p(x)` , x^186368 mod p(x)` */ + { 0x00000000db725228, 0x00000000ab64bc50 }, + /* x^185408 mod p(x)` , x^185344 mod p(x)` */ + { 0x00000000a98d1b58, 0x0000000095768218 }, + /* x^184384 mod p(x)` , x^184320 mod p(x)` */ + { 0x00000000eb702a98, 0x0000000050eb16b8 }, + /* x^183360 mod p(x)` , x^183296 mod p(x)` */ + { 0x0000000015ceb5e8, 0x00000000a8e66520 }, + /* x^182336 mod p(x)` , x^182272 mod p(x)` */ + { 0x00000000da4ce2f8, 0x00000000f42e1430 }, + /* x^181312 mod p(x)` , x^181248 mod p(x)` */ + { 0x000000006b66a7b0, 0x000000001cd1de48 }, + /* x^180288 mod p(x)` , x^180224 mod p(x)` */ + { 0x000000003c610c28, 0x00000000971aa4a0 }, + /* x^179264 mod p(x)` , x^179200 mod p(x)` */ + { 0x0000000046906840, 0x0000000070120028 }, + /* x^178240 mod p(x)` , x^178176 mod p(x)` */ + { 0x0000000060c4e8e8, 0x000000000a3d6600 }, + /* x^177216 mod p(x)` , x^177152 mod p(x)` */ + { 0x0000000011e757a0, 0x00000000c52f2bb8 }, + /* x^176192 mod p(x)` , x^176128 mod p(x)` */ + { 0x000000001cd4ecf8, 0x00000000d8447d10 }, + /* x^175168 mod p(x)` , x^175104 mod p(x)` */ + { 0x000000003d9b3c80, 0x00000000d71fda58 }, + /* x^174144 mod p(x)` , x^174080 mod p(x)` */ + { 0x0000000012e30d80, 0x000000003ad5c5b8 }, + /* x^173120 mod p(x)` , x^173056 mod p(x)` */ + { 0x000000009d0be168, 0x00000000116fcfc8 }, + /* x^172096 mod p(x)` , x^172032 mod p(x)` */ + { 0x00000000e9c4a830, 0x00000000c8341988 }, + /* x^171072 mod p(x)` , x^171008 mod p(x)` */ + { 0x000000005d83b300, 0x000000009cda6d70 }, + /* x^170048 mod p(x)` , x^169984 mod p(x)` */ + { 0x0000000058d96488, 0x0000000053f67a60 }, + /* x^169024 mod p(x)` , x^168960 mod p(x)` */ + { 0x0000000098438eb0, 0x0000000060182988 }, + /* x^168000 mod p(x)` , x^167936 mod p(x)` */ + { 0x00000000b59bc4f0, 0x00000000e7915ce8 }, + /* x^166976 mod p(x)` , x^166912 mod p(x)` */ + { 0x00000000d8745368, 0x0000000099d3d008 }, + /* x^165952 mod p(x)` , x^165888 mod p(x)` */ + { 0x000000006d727638, 0x000000009674ce28 }, + /* x^164928 mod p(x)` , x^164864 mod p(x)` */ + { 0x0000000070325da0, 0x00000000f0d04eb8 }, + /* x^163904 mod p(x)` , x^163840 mod p(x)` */ + { 0x0000000052672a00, 0x00000000850ce358 }, + /* x^162880 mod p(x)` , x^162816 mod p(x)` */ + { 0x00000000abd304f0, 0x00000000af77ff10 }, + /* x^161856 mod p(x)` , x^161792 mod p(x)` */ + { 0x0000000099981718, 0x00000000953f0098 }, + /* x^160832 mod p(x)` , x^160768 mod p(x)` */ + { 0x00000000b73da600, 0x00000000b26c5368 }, + /* x^159808 mod p(x)` , x^159744 mod p(x)` */ + { 0x00000000dca323d0, 0x00000000b26d0688 }, + /* x^158784 mod p(x)` , x^158720 mod p(x)` */ + { 0x000000004bea9548, 0x000000009e5e2da8 }, + /* x^157760 mod p(x)` , x^157696 mod p(x)` */ + { 0x000000005c9a1e40, 0x00000000e17ef8d8 }, + /* x^156736 mod p(x)` , x^156672 mod p(x)` */ + { 0x000000009ecf7398, 0x00000000e23d7f38 }, + /* x^155712 mod p(x)` , x^155648 mod p(x)` */ + { 0x0000000061f97a20, 0x000000007d8bd2f8 }, + /* x^154688 mod p(x)` , x^154624 mod p(x)` */ + { 0x0000000035c0bbc8, 0x000000009e3f9060 }, + /* x^153664 mod p(x)` , x^153600 mod p(x)` */ + { 0x00000000f8b23b70, 0x00000000eeaf0db8 }, + /* x^152640 mod p(x)` , x^152576 mod p(x)` */ + { 0x00000000ae46b4f8, 0x00000000adca6b20 }, + /* x^151616 mod p(x)` , x^151552 mod p(x)` */ + { 0x00000000d758b910, 0x00000000929ea200 }, + /* x^150592 mod p(x)` , x^150528 mod p(x)` */ + { 0x000000008cd61ce8, 0x00000000087498b0 }, + /* x^149568 mod p(x)` , x^149504 mod p(x)` */ + { 0x000000002a925aa8, 0x0000000093b2cdb8 }, + /* x^148544 mod p(x)` , x^148480 mod p(x)` */ + { 0x00000000781bcad0, 0x0000000015489758 }, + /* x^147520 mod p(x)` , x^147456 mod p(x)` */ + { 0x000000003c0964d8, 0x00000000df102ee0 }, + /* x^146496 mod p(x)` , x^146432 mod p(x)` */ + { 0x00000000dd92f618, 0x00000000555cee70 }, + /* x^145472 mod p(x)` , x^145408 mod p(x)` */ + { 0x000000007b0c7238, 0x000000004e70a868 }, + /* x^144448 mod p(x)` , x^144384 mod p(x)` */ + { 0x000000008f2cffa8, 0x00000000536e6838 }, + /* x^143424 mod p(x)` , x^143360 mod p(x)` */ + { 0x00000000234bf6e8, 0x00000000226432f8 }, + /* x^142400 mod p(x)` , x^142336 mod p(x)` */ + { 0x0000000039447900, 0x000000005f360d48 }, + /* x^141376 mod p(x)` , x^141312 mod p(x)` */ + { 0x000000001443ee60, 0x0000000073de4148 }, + /* x^140352 mod p(x)` , x^140288 mod p(x)` */ + { 0x00000000351348c0, 0x000000009b229440 }, + /* x^139328 mod p(x)` , x^139264 mod p(x)` */ + { 0x00000000ae9aa030, 0x00000000be6828f0 }, + /* x^138304 mod p(x)` , x^138240 mod p(x)` */ + { 0x00000000de4d6b60, 0x00000000d7473150 }, + /* x^137280 mod p(x)` , x^137216 mod p(x)` */ + { 0x00000000438b4bd8, 0x00000000290ace58 }, + /* x^136256 mod p(x)` , x^136192 mod p(x)` */ + { 0x000000000889fe48, 0x00000000a9b91248 }, + /* x^135232 mod p(x)` , x^135168 mod p(x)` */ + { 0x00000000b93262e8, 0x000000002fc7eed0 }, + /* x^134208 mod p(x)` , x^134144 mod p(x)` */ + { 0x000000007d040f88, 0x00000000a57ab490 }, + /* x^133184 mod p(x)` , x^133120 mod p(x)` */ + { 0x00000000a8fed440, 0x0000000010b3e7b0 }, + /* x^132160 mod p(x)` , x^132096 mod p(x)` */ + { 0x00000000ccbe9580, 0x00000000443b0590 }, + /* x^131136 mod p(x)` , x^131072 mod p(x)` */ + { 0x00000000e139f248, 0x00000000ce470948 }, + /* x^130112 mod p(x)` , x^130048 mod p(x)` */ + { 0x000000005e7fcb00, 0x0000000023c5f6f0 }, + /* x^129088 mod p(x)` , x^129024 mod p(x)` */ + { 0x000000005bcf78c0, 0x00000000f323c050 }, + /* x^128064 mod p(x)` , x^128000 mod p(x)` */ + { 0x00000000123c9040, 0x000000005b8d5ec8 }, + /* x^127040 mod p(x)` , x^126976 mod p(x)` */ + { 0x000000006ce46e18, 0x00000000c7299430 }, + /* x^126016 mod p(x)` , x^125952 mod p(x)` */ + { 0x00000000c3a45280, 0x00000000b2d95268 }, + /* x^124992 mod p(x)` , x^124928 mod p(x)` */ + { 0x00000000ea2f2258, 0x00000000b3772ab0 }, + /* x^123968 mod p(x)` , x^123904 mod p(x)` */ + { 0x00000000234acfa8, 0x00000000c5670b70 }, + /* x^122944 mod p(x)` , x^122880 mod p(x)` */ + { 0x0000000062c09258, 0x00000000ec6f72a0 }, + /* x^121920 mod p(x)` , x^121856 mod p(x)` */ + { 0x000000008fabbd68, 0x00000000eff71d98 }, + /* x^120896 mod p(x)` , x^120832 mod p(x)` */ + { 0x00000000e0dbdc70, 0x0000000013a1ca38 }, + /* x^119872 mod p(x)` , x^119808 mod p(x)` */ + { 0x000000009a03ec48, 0x00000000128afbe0 }, + /* x^118848 mod p(x)` , x^118784 mod p(x)` */ + { 0x00000000a77f0358, 0x0000000012986948 }, + /* x^117824 mod p(x)` , x^117760 mod p(x)` */ + { 0x00000000bde4e590, 0x0000000029130cb0 }, + /* x^116800 mod p(x)` , x^116736 mod p(x)` */ + { 0x00000000822ba058, 0x00000000c928f9a8 }, + /* x^115776 mod p(x)` , x^115712 mod p(x)` */ + { 0x000000000c6b0028, 0x00000000de509958 }, + /* x^114752 mod p(x)` , x^114688 mod p(x)` */ + { 0x00000000a8f3d788, 0x00000000f3ec14a0 }, + /* x^113728 mod p(x)` , x^113664 mod p(x)` */ + { 0x0000000076e65d50, 0x0000000061896e28 }, + /* x^112704 mod p(x)` , x^112640 mod p(x)` */ + { 0x00000000f4beec20, 0x0000000041065698 }, + /* x^111680 mod p(x)` , x^111616 mod p(x)` */ + { 0x000000003b34efd8, 0x00000000bf6868f0 }, + /* x^110656 mod p(x)` , x^110592 mod p(x)` */ + { 0x0000000006c25018, 0x00000000ea572ad8 }, + /* x^109632 mod p(x)` , x^109568 mod p(x)` */ + { 0x00000000e32c7078, 0x0000000007c2c6f8 }, + /* x^108608 mod p(x)` , x^108544 mod p(x)` */ + { 0x0000000043b958e8, 0x00000000f667b558 }, + /* x^107584 mod p(x)` , x^107520 mod p(x)` */ + { 0x00000000b8ee5338, 0x0000000038f2fa70 }, + /* x^106560 mod p(x)` , x^106496 mod p(x)` */ + { 0x0000000012635bb8, 0x000000005946cf18 }, + /* x^105536 mod p(x)` , x^105472 mod p(x)` */ + { 0x00000000c26f8568, 0x0000000076641590 }, + /* x^104512 mod p(x)` , x^104448 mod p(x)` */ + { 0x0000000007cb5370, 0x000000002e5cfb88 }, + /* x^103488 mod p(x)` , x^103424 mod p(x)` */ + { 0x000000005dbb32f8, 0x0000000067b87920 }, + /* x^102464 mod p(x)` , x^102400 mod p(x)` */ + { 0x00000000c5d4a380, 0x000000003eaf4130 }, + /* x^101440 mod p(x)` , x^101376 mod p(x)` */ + { 0x00000000abb3dda8, 0x0000000087dba310 }, + /* x^100416 mod p(x)` , x^100352 mod p(x)` */ + { 0x00000000e62cca40, 0x00000000c1898528 }, + /* x^99392 mod p(x)` , x^99328 mod p(x)` */ + { 0x000000004f6a6c30, 0x00000000dc879ef8 }, + /* x^98368 mod p(x)` , x^98304 mod p(x)` */ + { 0x0000000039319fd8, 0x00000000c79b8720 }, + /* x^97344 mod p(x)` , x^97280 mod p(x)` */ + { 0x0000000001646478, 0x00000000c0c1ff28 }, + /* x^96320 mod p(x)` , x^96256 mod p(x)` */ + { 0x000000002dc882f0, 0x00000000a0c36c10 }, + /* x^95296 mod p(x)` , x^95232 mod p(x)` */ + { 0x0000000077b2c488, 0x0000000061eed100 }, + /* x^94272 mod p(x)` , x^94208 mod p(x)` */ + { 0x000000001f571a60, 0x0000000016272d48 }, + /* x^93248 mod p(x)` , x^93184 mod p(x)` */ + { 0x00000000a553c958, 0x000000007437d150 }, + /* x^92224 mod p(x)` , x^92160 mod p(x)` */ + { 0x000000003ac2c5f0, 0x0000000001ac1638 }, + /* x^91200 mod p(x)` , x^91136 mod p(x)` */ + { 0x00000000efceaf70, 0x0000000072717528 }, + /* x^90176 mod p(x)` , x^90112 mod p(x)` */ + { 0x00000000a88d2290, 0x00000000267e1a80 }, + /* x^89152 mod p(x)` , x^89088 mod p(x)` */ + { 0x00000000139c49e0, 0x00000000a4a1aa40 }, + /* x^88128 mod p(x)` , x^88064 mod p(x)` */ + { 0x00000000717f3fc0, 0x0000000087eb5f98 }, + /* x^87104 mod p(x)` , x^87040 mod p(x)` */ + { 0x0000000062c30aa0, 0x00000000e101f550 }, + /* x^86080 mod p(x)` , x^86016 mod p(x)` */ + { 0x00000000b0c36de0, 0x000000009dd3b578 }, + /* x^85056 mod p(x)` , x^84992 mod p(x)` */ + { 0x00000000bbfcfa20, 0x000000001a7e1020 }, + /* x^84032 mod p(x)` , x^83968 mod p(x)` */ + { 0x00000000805ce658, 0x00000000158a8410 }, + /* x^83008 mod p(x)` , x^82944 mod p(x)` */ + { 0x00000000799f5fc0, 0x0000000026922b08 }, + /* x^81984 mod p(x)` , x^81920 mod p(x)` */ + { 0x00000000fdb2eca8, 0x00000000a534bf08 }, + /* x^80960 mod p(x)` , x^80896 mod p(x)` */ + { 0x000000005b454690, 0x000000000c1e8220 }, + /* x^79936 mod p(x)` , x^79872 mod p(x)` */ + { 0x00000000828e3ea0, 0x00000000afb6f120 }, + /* x^78912 mod p(x)` , x^78848 mod p(x)` */ + { 0x00000000afeee440, 0x000000009b63c270 }, + /* x^77888 mod p(x)` , x^77824 mod p(x)` */ + { 0x000000009d860ed8, 0x00000000e33bb3e8 }, + /* x^76864 mod p(x)` , x^76800 mod p(x)` */ + { 0x0000000053141a30, 0x00000000a5570ca0 }, + /* x^75840 mod p(x)` , x^75776 mod p(x)` */ + { 0x0000000017407a68, 0x000000008e9326c0 }, + /* x^74816 mod p(x)` , x^74752 mod p(x)` */ + { 0x000000005557e9c8, 0x000000004b99a3d0 }, + /* x^73792 mod p(x)` , x^73728 mod p(x)` */ + { 0x00000000805eda50, 0x0000000009f79420 }, + /* x^72768 mod p(x)` , x^72704 mod p(x)` */ + { 0x00000000fdf25818, 0x00000000a4f947a0 }, + /* x^71744 mod p(x)` , x^71680 mod p(x)` */ + { 0x000000002cc580c8, 0x000000007bc29b98 }, + /* x^70720 mod p(x)` , x^70656 mod p(x)` */ + { 0x000000004192fd80, 0x000000005c1226a0 }, + /* x^69696 mod p(x)` , x^69632 mod p(x)` */ + { 0x00000000bdc016b8, 0x0000000060bc7ee8 }, + /* x^68672 mod p(x)` , x^68608 mod p(x)` */ + { 0x00000000fa5954e8, 0x00000000c1a69ed0 }, + /* x^67648 mod p(x)` , x^67584 mod p(x)` */ + { 0x00000000bafa86c8, 0x00000000bc649eb8 }, + /* x^66624 mod p(x)` , x^66560 mod p(x)` */ + { 0x000000003be64b40, 0x000000001d98d568 }, + /* x^65600 mod p(x)` , x^65536 mod p(x)` */ + { 0x00000000e6f61a98, 0x000000006c48a398 }, + /* x^64576 mod p(x)` , x^64512 mod p(x)` */ + { 0x00000000f969fbc0, 0x000000002c1bfa78 }, + /* x^63552 mod p(x)` , x^63488 mod p(x)` */ + { 0x00000000708772b8, 0x00000000203fb510 }, + /* x^62528 mod p(x)` , x^62464 mod p(x)` */ + { 0x00000000429a2b80, 0x0000000091463d78 }, + /* x^61504 mod p(x)` , x^61440 mod p(x)` */ + { 0x0000000092237fb8, 0x000000008c4c35b0 }, + /* x^60480 mod p(x)` , x^60416 mod p(x)` */ + { 0x00000000101ffd30, 0x000000000b5a11f0 }, + /* x^59456 mod p(x)` , x^59392 mod p(x)` */ + { 0x000000008bf0ebd0, 0x00000000fdd4cf60 }, + /* x^58432 mod p(x)` , x^58368 mod p(x)` */ + { 0x00000000b80e0238, 0x0000000082dad1d8 }, + /* x^57408 mod p(x)` , x^57344 mod p(x)` */ + { 0x000000007b2a9c88, 0x0000000087a03800 }, + /* x^56384 mod p(x)` , x^56320 mod p(x)` */ + { 0x00000000e4cfd648, 0x00000000eadb6578 }, + /* x^55360 mod p(x)` , x^55296 mod p(x)` */ + { 0x00000000af00b1e0, 0x00000000b0be6d10 }, + /* x^54336 mod p(x)` , x^54272 mod p(x)` */ + { 0x00000000890e4588, 0x000000001c2934a0 }, + /* x^53312 mod p(x)` , x^53248 mod p(x)` */ + { 0x0000000092340968, 0x00000000fe5e43b8 }, + /* x^52288 mod p(x)` , x^52224 mod p(x)` */ + { 0x00000000e8617728, 0x00000000e139bbb0 }, + /* x^51264 mod p(x)` , x^51200 mod p(x)` */ + { 0x00000000cb39d4f0, 0x0000000049b2b620 }, + /* x^50240 mod p(x)` , x^50176 mod p(x)` */ + { 0x00000000aabe8378, 0x00000000e9f73c38 }, + /* x^49216 mod p(x)` , x^49152 mod p(x)` */ + { 0x00000000b6facd58, 0x000000001a1d4020 }, + /* x^48192 mod p(x)` , x^48128 mod p(x)` */ + { 0x00000000cb02ad60, 0x00000000109b5698 }, + /* x^47168 mod p(x)` , x^47104 mod p(x)` */ + { 0x000000002a586828, 0x00000000960eac90 }, + /* x^46144 mod p(x)` , x^46080 mod p(x)` */ + { 0x00000000d8b51488, 0x000000008c018d68 }, + /* x^45120 mod p(x)` , x^45056 mod p(x)` */ + { 0x0000000035cc6098, 0x0000000001b64120 }, + /* x^44096 mod p(x)` , x^44032 mod p(x)` */ + { 0x0000000004dd9470, 0x0000000035ab8f98 }, + /* x^43072 mod p(x)` , x^43008 mod p(x)` */ + { 0x0000000061f4ada0, 0x0000000064292110 }, + /* x^42048 mod p(x)` , x^41984 mod p(x)` */ + { 0x0000000078d43230, 0x000000001ae9e868 }, + /* x^41024 mod p(x)` , x^40960 mod p(x)` */ + { 0x000000004eb578d8, 0x0000000055d072e8 }, + /* x^40000 mod p(x)` , x^39936 mod p(x)` */ + { 0x00000000166c65f0, 0x000000002ae9eee0 }, + /* x^38976 mod p(x)` , x^38912 mod p(x)` */ + { 0x00000000231d91b0, 0x00000000ccc901f0 }, + /* x^37952 mod p(x)` , x^37888 mod p(x)` */ + { 0x0000000044bfd368, 0x0000000002380788 }, + /* x^36928 mod p(x)` , x^36864 mod p(x)` */ + { 0x00000000639c03f8, 0x000000006402f1f0 }, + /* x^35904 mod p(x)` , x^35840 mod p(x)` */ + { 0x000000004d187408, 0x0000000087085388 }, + /* x^34880 mod p(x)` , x^34816 mod p(x)` */ + { 0x00000000d0dc3100, 0x0000000005a17c98 }, + /* x^33856 mod p(x)` , x^33792 mod p(x)` */ + { 0x00000000459cb920, 0x000000005038f630 }, + /* x^32832 mod p(x)` , x^32768 mod p(x)` */ + { 0x000000006d5e50e0, 0x00000000a3738908 }, + /* x^31808 mod p(x)` , x^31744 mod p(x)` */ + { 0x0000000039f37110, 0x000000002f51c128 }, + /* x^30784 mod p(x)` , x^30720 mod p(x)` */ + { 0x00000000bcac3f90, 0x00000000a3444c50 }, + /* x^29760 mod p(x)` , x^29696 mod p(x)` */ + { 0x00000000139b9d00, 0x0000000096822e58 }, + /* x^28736 mod p(x)` , x^28672 mod p(x)` */ + { 0x00000000e59b7588, 0x00000000e83e1830 }, + /* x^27712 mod p(x)` , x^27648 mod p(x)` */ + { 0x00000000280d7d30, 0x000000003eef3e88 }, + /* x^26688 mod p(x)` , x^26624 mod p(x)` */ + { 0x000000007c509ae8, 0x000000000b89a3a8 }, + /* x^25664 mod p(x)` , x^25600 mod p(x)` */ + { 0x00000000d1442918, 0x000000009cdc20a8 }, + /* x^24640 mod p(x)` , x^24576 mod p(x)` */ + { 0x00000000fe120f60, 0x00000000b212ef78 }, + /* x^23616 mod p(x)` , x^23552 mod p(x)` */ + { 0x00000000223d97e0, 0x00000000c4cda310 }, + /* x^22592 mod p(x)` , x^22528 mod p(x)` */ + { 0x0000000058b23628, 0x00000000dd4aa1b0 }, + /* x^21568 mod p(x)` , x^21504 mod p(x)` */ + { 0x000000000eca9050, 0x000000005b9901b0 }, + /* x^20544 mod p(x)` , x^20480 mod p(x)` */ + { 0x000000004cf2ac08, 0x00000000ac111240 }, + /* x^19520 mod p(x)` , x^19456 mod p(x)` */ + { 0x0000000069ef4748, 0x0000000081b31860 }, + /* x^18496 mod p(x)` , x^18432 mod p(x)` */ + { 0x00000000883510b8, 0x00000000d0499130 }, + /* x^17472 mod p(x)` , x^17408 mod p(x)` */ + { 0x00000000587539c8, 0x0000000015817a68 }, + /* x^16448 mod p(x)` , x^16384 mod p(x)` */ + { 0x000000004c2e2020, 0x000000009c175750 }, + /* x^15424 mod p(x)` , x^15360 mod p(x)` */ + { 0x00000000bca2ad48, 0x0000000036553828 }, + /* x^14400 mod p(x)` , x^14336 mod p(x)` */ + { 0x0000000038218a38, 0x00000000ab735970 }, + /* x^13376 mod p(x)` , x^13312 mod p(x)` */ + { 0x0000000069012558, 0x000000004292f240 }, + /* x^12352 mod p(x)` , x^12288 mod p(x)` */ + { 0x000000006e323e78, 0x00000000f6a49b10 }, + /* x^11328 mod p(x)` , x^11264 mod p(x)` */ + { 0x00000000c3904210, 0x00000000aa1544a0 }, + /* x^10304 mod p(x)` , x^10240 mod p(x)` */ + { 0x000000008cdf0750, 0x00000000c10034e0 }, + /* x^9280 mod p(x)` , x^9216 mod p(x)` */ + { 0x000000003c729668, 0x0000000098495940 }, + /* x^8256 mod p(x)` , x^8192 mod p(x)` */ + { 0x000000003ff18098, 0x00000000de1f2308 }, + /* x^7232 mod p(x)` , x^7168 mod p(x)` */ + { 0x0000000030fa3308, 0x0000000064504c38 }, + /* x^6208 mod p(x)` , x^6144 mod p(x)` */ + { 0x000000001d2a7968, 0x0000000003133470 }, + /* x^5184 mod p(x)` , x^5120 mod p(x)` */ + { 0x000000007d651470, 0x000000007c60cb68 }, + /* x^4160 mod p(x)` , x^4096 mod p(x)` */ + { 0x00000000e0154410, 0x00000000041b5708 }, + /* x^3136 mod p(x)` , x^3072 mod p(x)` */ + { 0x000000002a64dac0, 0x0000000018246d28 }, + /* x^2112 mod p(x)` , x^2048 mod p(x)` */ + { 0x0000000085115738, 0x000000005b419030 }, + /* x^1088 mod p(x)` , x^1024 mod p(x)` */ + { 0x00000000cfe98310, 0x000000002e5acf98 } +#else /* __LITTLE_ENDIAN__ */ + /* x^261184 mod p(x)` , x^261120 mod p(x)` */ + { 0x00000000a7bbf060, 0x000000003f02aaa0 }, + /* x^260160 mod p(x)` , x^260096 mod p(x)` */ + { 0x00000000d61de5d0, 0x00000000bb290eb0 }, + /* x^259136 mod p(x)` , x^259072 mod p(x)` */ + { 0x00000000a8efc958, 0x00000000f3725eb8 }, + /* x^258112 mod p(x)` , x^258048 mod p(x)` */ + { 0x0000000062663048, 0x00000000744d94c0 }, + /* x^257088 mod p(x)` , x^257024 mod p(x)` */ + { 0x000000004c0c4488, 0x0000000087289250 }, + /* x^256064 mod p(x)` , x^256000 mod p(x)` */ + { 0x000000009f3c1950, 0x00000000b5559480 }, + /* x^255040 mod p(x)` , x^254976 mod p(x)` */ + { 0x00000000d32d9018, 0x00000000c6a6f640 }, + /* x^254016 mod p(x)` , x^253952 mod p(x)` */ + { 0x0000000081bd8fb8, 0x00000000637a6528 }, + /* x^252992 mod p(x)` , x^252928 mod p(x)` */ + { 0x000000004575d0a0, 0x0000000010166ef0 }, + /* x^251968 mod p(x)` , x^251904 mod p(x)` */ + { 0x000000005a1c1e18, 0x0000000049923d48 }, + /* x^250944 mod p(x)` , x^250880 mod p(x)` */ + { 0x0000000045173208, 0x0000000099f6ae90 }, + /* x^249920 mod p(x)` , x^249856 mod p(x)` */ + { 0x00000000420b5f60, 0x000000002162c550 }, + /* x^248896 mod p(x)` , x^248832 mod p(x)` */ + { 0x00000000f4c5b728, 0x00000000ef3107a0 }, + /* x^247872 mod p(x)` , x^247808 mod p(x)` */ + { 0x0000000018760b58, 0x00000000851e8a40 }, + /* x^246848 mod p(x)` , x^246784 mod p(x)` */ + { 0x000000006d7dba68, 0x000000007a786e68 }, + /* x^245824 mod p(x)` , x^245760 mod p(x)` */ + { 0x0000000047095830, 0x000000005d97c3d0 }, + /* x^244800 mod p(x)` , x^244736 mod p(x)` */ + { 0x0000000002645d18, 0x00000000a8760580 }, + /* x^243776 mod p(x)` , x^243712 mod p(x)` */ + { 0x00000000981b3ed0, 0x000000008dcc4f00 }, + /* x^242752 mod p(x)` , x^242688 mod p(x)` */ + { 0x00000000e00c9140, 0x000000005fb60768 }, + /* x^241728 mod p(x)` , x^241664 mod p(x)` */ + { 0x00000000e4d9ed90, 0x000000004e5bd750 }, + /* x^240704 mod p(x)` , x^240640 mod p(x)` */ + { 0x0000000016425e38, 0x00000000273fb988 }, + /* x^239680 mod p(x)` , x^239616 mod p(x)` */ + { 0x00000000be2a57e0, 0x0000000019020f38 }, + /* x^238656 mod p(x)` , x^238592 mod p(x)` */ + { 0x00000000de359190, 0x0000000097f1ad90 }, + /* x^237632 mod p(x)` , x^237568 mod p(x)` */ + { 0x0000000066221000, 0x00000000279425c8 }, + /* x^236608 mod p(x)` , x^236544 mod p(x)` */ + { 0x00000000e107ea58, 0x000000002ca764d8 }, + /* x^235584 mod p(x)` , x^235520 mod p(x)` */ + { 0x0000000016aa2380, 0x00000000342c21c8 }, + /* x^234560 mod p(x)` , x^234496 mod p(x)` */ + { 0x00000000551c7100, 0x00000000a4217dc0 }, + /* x^233536 mod p(x)` , x^233472 mod p(x)` */ + { 0x00000000d3a97040, 0x00000000e3a887c8 }, + /* x^232512 mod p(x)` , x^232448 mod p(x)` */ + { 0x00000000d2d1b480, 0x000000003ca6edb0 }, + /* x^231488 mod p(x)` , x^231424 mod p(x)` */ + { 0x00000000ec5a17d8, 0x00000000def30ae0 }, + /* x^230464 mod p(x)` , x^230400 mod p(x)` */ + { 0x00000000f997aa90, 0x00000000cfad2020 }, + /* x^229440 mod p(x)` , x^229376 mod p(x)` */ + { 0x000000004bb85080, 0x00000000ceb08770 }, + /* x^228416 mod p(x)` , x^228352 mod p(x)` */ + { 0x00000000547d3030, 0x00000000f18c7b08 }, + /* x^227392 mod p(x)` , x^227328 mod p(x)` */ + { 0x00000000d32d1d48, 0x0000000018f5e738 }, + /* x^226368 mod p(x)` , x^226304 mod p(x)` */ + { 0x00000000aa966a20, 0x000000008ec52840 }, + /* x^225344 mod p(x)` , x^225280 mod p(x)` */ + { 0x0000000077e06f48, 0x000000003c2364d0 }, + /* x^224320 mod p(x)` , x^224256 mod p(x)` */ + { 0x00000000bf106be8, 0x00000000639146e0 }, + /* x^223296 mod p(x)` , x^223232 mod p(x)` */ + { 0x00000000fa7ad608, 0x00000000e0dea810 }, + /* x^222272 mod p(x)` , x^222208 mod p(x)` */ + { 0x0000000044310840, 0x00000000271c60a0 }, + /* x^221248 mod p(x)` , x^221184 mod p(x)` */ + { 0x00000000dcbbc0b8, 0x0000000027c94138 }, + /* x^220224 mod p(x)` , x^220160 mod p(x)` */ + { 0x000000005cdf7278, 0x000000002dccbe38 }, + /* x^219200 mod p(x)` , x^219136 mod p(x)` */ + { 0x00000000a9a8af50, 0x00000000b35fe5d0 }, + /* x^218176 mod p(x)` , x^218112 mod p(x)` */ + { 0x000000006ceb84a8, 0x00000000f210bac0 }, + /* x^217152 mod p(x)` , x^217088 mod p(x)` */ + { 0x0000000047ca21d0, 0x0000000046d4daf8 }, + /* x^216128 mod p(x)` , x^216064 mod p(x)` */ + { 0x0000000087e84d38, 0x00000000fa755018 }, + /* x^215104 mod p(x)` , x^215040 mod p(x)` */ + { 0x00000000129b97b0, 0x00000000b7e8bb68 }, + /* x^214080 mod p(x)` , x^214016 mod p(x)` */ + { 0x00000000187e14b0, 0x0000000055b429a0 }, + /* x^213056 mod p(x)` , x^212992 mod p(x)` */ + { 0x00000000ab24f090, 0x00000000bb853930 }, + /* x^212032 mod p(x)` , x^211968 mod p(x)` */ + { 0x000000001c2d80e0, 0x000000007839c800 }, + /* x^211008 mod p(x)` , x^210944 mod p(x)` */ + { 0x00000000ea26b4b0, 0x00000000d2e2e3f0 }, + /* x^209984 mod p(x)` , x^209920 mod p(x)` */ + { 0x000000001e81e6f0, 0x0000000035c34ed0 }, + /* x^208960 mod p(x)` , x^208896 mod p(x)` */ + { 0x0000000017bf67f8, 0x000000003e0a2d48 }, + /* x^207936 mod p(x)` , x^207872 mod p(x)` */ + { 0x0000000066549f48, 0x000000002168d9f8 }, + /* x^206912 mod p(x)` , x^206848 mod p(x)` */ + { 0x000000009f0eb700, 0x00000000fd387468 }, + /* x^205888 mod p(x)` , x^205824 mod p(x)` */ + { 0x000000009a50dd20, 0x000000000a851398 }, + /* x^204864 mod p(x)` , x^204800 mod p(x)` */ + { 0x00000000e038cf70, 0x0000000031b21488 }, + /* x^203840 mod p(x)` , x^203776 mod p(x)` */ + { 0x00000000f062b098, 0x00000000c8d01a30 }, + /* x^202816 mod p(x)` , x^202752 mod p(x)` */ + { 0x00000000faab9b58, 0x000000005aae2f58 }, + /* x^201792 mod p(x)` , x^201728 mod p(x)` */ + { 0x00000000fc23b1c0, 0x00000000b0ac75e0 }, + /* x^200768 mod p(x)` , x^200704 mod p(x)` */ + { 0x0000000088adaa30, 0x00000000eb50e330 }, + /* x^199744 mod p(x)` , x^199680 mod p(x)` */ + { 0x0000000014601f18, 0x00000000c0ef3138 }, + /* x^198720 mod p(x)` , x^198656 mod p(x)` */ + { 0x0000000073817a40, 0x000000005d4431e0 }, + /* x^197696 mod p(x)` , x^197632 mod p(x)` */ + { 0x00000000aab01b50, 0x00000000b34963b0 }, + /* x^196672 mod p(x)` , x^196608 mod p(x)` */ + { 0x0000000066ad8040, 0x00000000f770d030 }, + /* x^195648 mod p(x)` , x^195584 mod p(x)` */ + { 0x00000000378db488, 0x000000005849c7a0 }, + /* x^194624 mod p(x)` , x^194560 mod p(x)` */ + { 0x000000003bde9048, 0x000000007bb1b3a0 }, + /* x^193600 mod p(x)` , x^193536 mod p(x)` */ + { 0x00000000f6ece068, 0x000000000dceb318 }, + /* x^192576 mod p(x)` , x^192512 mod p(x)` */ + { 0x000000009d4e7020, 0x000000008e9947b0 }, + /* x^191552 mod p(x)` , x^191488 mod p(x)` */ + { 0x000000009efee6f0, 0x000000002ed2aa58 }, + /* x^190528 mod p(x)` , x^190464 mod p(x)` */ + { 0x00000000ea471800, 0x00000000922596d0 }, + /* x^189504 mod p(x)` , x^189440 mod p(x)` */ + { 0x0000000011a5a9a8, 0x0000000028f93bf0 }, + /* x^188480 mod p(x)` , x^188416 mod p(x)` */ + { 0x00000000a8c96eb0, 0x00000000e78ba040 }, + /* x^187456 mod p(x)` , x^187392 mod p(x)` */ + { 0x000000009800fa50, 0x000000004677b9e0 }, + /* x^186432 mod p(x)` , x^186368 mod p(x)` */ + { 0x00000000ab64bc50, 0x00000000db725228 }, + /* x^185408 mod p(x)` , x^185344 mod p(x)` */ + { 0x0000000095768218, 0x00000000a98d1b58 }, + /* x^184384 mod p(x)` , x^184320 mod p(x)` */ + { 0x0000000050eb16b8, 0x00000000eb702a98 }, + /* x^183360 mod p(x)` , x^183296 mod p(x)` */ + { 0x00000000a8e66520, 0x0000000015ceb5e8 }, + /* x^182336 mod p(x)` , x^182272 mod p(x)` */ + { 0x00000000f42e1430, 0x00000000da4ce2f8 }, + /* x^181312 mod p(x)` , x^181248 mod p(x)` */ + { 0x000000001cd1de48, 0x000000006b66a7b0 }, + /* x^180288 mod p(x)` , x^180224 mod p(x)` */ + { 0x00000000971aa4a0, 0x000000003c610c28 }, + /* x^179264 mod p(x)` , x^179200 mod p(x)` */ + { 0x0000000070120028, 0x0000000046906840 }, + /* x^178240 mod p(x)` , x^178176 mod p(x)` */ + { 0x000000000a3d6600, 0x0000000060c4e8e8 }, + /* x^177216 mod p(x)` , x^177152 mod p(x)` */ + { 0x00000000c52f2bb8, 0x0000000011e757a0 }, + /* x^176192 mod p(x)` , x^176128 mod p(x)` */ + { 0x00000000d8447d10, 0x000000001cd4ecf8 }, + /* x^175168 mod p(x)` , x^175104 mod p(x)` */ + { 0x00000000d71fda58, 0x000000003d9b3c80 }, + /* x^174144 mod p(x)` , x^174080 mod p(x)` */ + { 0x000000003ad5c5b8, 0x0000000012e30d80 }, + /* x^173120 mod p(x)` , x^173056 mod p(x)` */ + { 0x00000000116fcfc8, 0x000000009d0be168 }, + /* x^172096 mod p(x)` , x^172032 mod p(x)` */ + { 0x00000000c8341988, 0x00000000e9c4a830 }, + /* x^171072 mod p(x)` , x^171008 mod p(x)` */ + { 0x000000009cda6d70, 0x000000005d83b300 }, + /* x^170048 mod p(x)` , x^169984 mod p(x)` */ + { 0x0000000053f67a60, 0x0000000058d96488 }, + /* x^169024 mod p(x)` , x^168960 mod p(x)` */ + { 0x0000000060182988, 0x0000000098438eb0 }, + /* x^168000 mod p(x)` , x^167936 mod p(x)` */ + { 0x00000000e7915ce8, 0x00000000b59bc4f0 }, + /* x^166976 mod p(x)` , x^166912 mod p(x)` */ + { 0x0000000099d3d008, 0x00000000d8745368 }, + /* x^165952 mod p(x)` , x^165888 mod p(x)` */ + { 0x000000009674ce28, 0x000000006d727638 }, + /* x^164928 mod p(x)` , x^164864 mod p(x)` */ + { 0x00000000f0d04eb8, 0x0000000070325da0 }, + /* x^163904 mod p(x)` , x^163840 mod p(x)` */ + { 0x00000000850ce358, 0x0000000052672a00 }, + /* x^162880 mod p(x)` , x^162816 mod p(x)` */ + { 0x00000000af77ff10, 0x00000000abd304f0 }, + /* x^161856 mod p(x)` , x^161792 mod p(x)` */ + { 0x00000000953f0098, 0x0000000099981718 }, + /* x^160832 mod p(x)` , x^160768 mod p(x)` */ + { 0x00000000b26c5368, 0x00000000b73da600 }, + /* x^159808 mod p(x)` , x^159744 mod p(x)` */ + { 0x00000000b26d0688, 0x00000000dca323d0 }, + /* x^158784 mod p(x)` , x^158720 mod p(x)` */ + { 0x000000009e5e2da8, 0x000000004bea9548 }, + /* x^157760 mod p(x)` , x^157696 mod p(x)` */ + { 0x00000000e17ef8d8, 0x000000005c9a1e40 }, + /* x^156736 mod p(x)` , x^156672 mod p(x)` */ + { 0x00000000e23d7f38, 0x000000009ecf7398 }, + /* x^155712 mod p(x)` , x^155648 mod p(x)` */ + { 0x000000007d8bd2f8, 0x0000000061f97a20 }, + /* x^154688 mod p(x)` , x^154624 mod p(x)` */ + { 0x000000009e3f9060, 0x0000000035c0bbc8 }, + /* x^153664 mod p(x)` , x^153600 mod p(x)` */ + { 0x00000000eeaf0db8, 0x00000000f8b23b70 }, + /* x^152640 mod p(x)` , x^152576 mod p(x)` */ + { 0x00000000adca6b20, 0x00000000ae46b4f8 }, + /* x^151616 mod p(x)` , x^151552 mod p(x)` */ + { 0x00000000929ea200, 0x00000000d758b910 }, + /* x^150592 mod p(x)` , x^150528 mod p(x)` */ + { 0x00000000087498b0, 0x000000008cd61ce8 }, + /* x^149568 mod p(x)` , x^149504 mod p(x)` */ + { 0x0000000093b2cdb8, 0x000000002a925aa8 }, + /* x^148544 mod p(x)` , x^148480 mod p(x)` */ + { 0x0000000015489758, 0x00000000781bcad0 }, + /* x^147520 mod p(x)` , x^147456 mod p(x)` */ + { 0x00000000df102ee0, 0x000000003c0964d8 }, + /* x^146496 mod p(x)` , x^146432 mod p(x)` */ + { 0x00000000555cee70, 0x00000000dd92f618 }, + /* x^145472 mod p(x)` , x^145408 mod p(x)` */ + { 0x000000004e70a868, 0x000000007b0c7238 }, + /* x^144448 mod p(x)` , x^144384 mod p(x)` */ + { 0x00000000536e6838, 0x000000008f2cffa8 }, + /* x^143424 mod p(x)` , x^143360 mod p(x)` */ + { 0x00000000226432f8, 0x00000000234bf6e8 }, + /* x^142400 mod p(x)` , x^142336 mod p(x)` */ + { 0x000000005f360d48, 0x0000000039447900 }, + /* x^141376 mod p(x)` , x^141312 mod p(x)` */ + { 0x0000000073de4148, 0x000000001443ee60 }, + /* x^140352 mod p(x)` , x^140288 mod p(x)` */ + { 0x000000009b229440, 0x00000000351348c0 }, + /* x^139328 mod p(x)` , x^139264 mod p(x)` */ + { 0x00000000be6828f0, 0x00000000ae9aa030 }, + /* x^138304 mod p(x)` , x^138240 mod p(x)` */ + { 0x00000000d7473150, 0x00000000de4d6b60 }, + /* x^137280 mod p(x)` , x^137216 mod p(x)` */ + { 0x00000000290ace58, 0x00000000438b4bd8 }, + /* x^136256 mod p(x)` , x^136192 mod p(x)` */ + { 0x00000000a9b91248, 0x000000000889fe48 }, + /* x^135232 mod p(x)` , x^135168 mod p(x)` */ + { 0x000000002fc7eed0, 0x00000000b93262e8 }, + /* x^134208 mod p(x)` , x^134144 mod p(x)` */ + { 0x00000000a57ab490, 0x000000007d040f88 }, + /* x^133184 mod p(x)` , x^133120 mod p(x)` */ + { 0x0000000010b3e7b0, 0x00000000a8fed440 }, + /* x^132160 mod p(x)` , x^132096 mod p(x)` */ + { 0x00000000443b0590, 0x00000000ccbe9580 }, + /* x^131136 mod p(x)` , x^131072 mod p(x)` */ + { 0x00000000ce470948, 0x00000000e139f248 }, + /* x^130112 mod p(x)` , x^130048 mod p(x)` */ + { 0x0000000023c5f6f0, 0x000000005e7fcb00 }, + /* x^129088 mod p(x)` , x^129024 mod p(x)` */ + { 0x00000000f323c050, 0x000000005bcf78c0 }, + /* x^128064 mod p(x)` , x^128000 mod p(x)` */ + { 0x000000005b8d5ec8, 0x00000000123c9040 }, + /* x^127040 mod p(x)` , x^126976 mod p(x)` */ + { 0x00000000c7299430, 0x000000006ce46e18 }, + /* x^126016 mod p(x)` , x^125952 mod p(x)` */ + { 0x00000000b2d95268, 0x00000000c3a45280 }, + /* x^124992 mod p(x)` , x^124928 mod p(x)` */ + { 0x00000000b3772ab0, 0x00000000ea2f2258 }, + /* x^123968 mod p(x)` , x^123904 mod p(x)` */ + { 0x00000000c5670b70, 0x00000000234acfa8 }, + /* x^122944 mod p(x)` , x^122880 mod p(x)` */ + { 0x00000000ec6f72a0, 0x0000000062c09258 }, + /* x^121920 mod p(x)` , x^121856 mod p(x)` */ + { 0x00000000eff71d98, 0x000000008fabbd68 }, + /* x^120896 mod p(x)` , x^120832 mod p(x)` */ + { 0x0000000013a1ca38, 0x00000000e0dbdc70 }, + /* x^119872 mod p(x)` , x^119808 mod p(x)` */ + { 0x00000000128afbe0, 0x000000009a03ec48 }, + /* x^118848 mod p(x)` , x^118784 mod p(x)` */ + { 0x0000000012986948, 0x00000000a77f0358 }, + /* x^117824 mod p(x)` , x^117760 mod p(x)` */ + { 0x0000000029130cb0, 0x00000000bde4e590 }, + /* x^116800 mod p(x)` , x^116736 mod p(x)` */ + { 0x00000000c928f9a8, 0x00000000822ba058 }, + /* x^115776 mod p(x)` , x^115712 mod p(x)` */ + { 0x00000000de509958, 0x000000000c6b0028 }, + /* x^114752 mod p(x)` , x^114688 mod p(x)` */ + { 0x00000000f3ec14a0, 0x00000000a8f3d788 }, + /* x^113728 mod p(x)` , x^113664 mod p(x)` */ + { 0x0000000061896e28, 0x0000000076e65d50 }, + /* x^112704 mod p(x)` , x^112640 mod p(x)` */ + { 0x0000000041065698, 0x00000000f4beec20 }, + /* x^111680 mod p(x)` , x^111616 mod p(x)` */ + { 0x00000000bf6868f0, 0x000000003b34efd8 }, + /* x^110656 mod p(x)` , x^110592 mod p(x)` */ + { 0x00000000ea572ad8, 0x0000000006c25018 }, + /* x^109632 mod p(x)` , x^109568 mod p(x)` */ + { 0x0000000007c2c6f8, 0x00000000e32c7078 }, + /* x^108608 mod p(x)` , x^108544 mod p(x)` */ + { 0x00000000f667b558, 0x0000000043b958e8 }, + /* x^107584 mod p(x)` , x^107520 mod p(x)` */ + { 0x0000000038f2fa70, 0x00000000b8ee5338 }, + /* x^106560 mod p(x)` , x^106496 mod p(x)` */ + { 0x000000005946cf18, 0x0000000012635bb8 }, + /* x^105536 mod p(x)` , x^105472 mod p(x)` */ + { 0x0000000076641590, 0x00000000c26f8568 }, + /* x^104512 mod p(x)` , x^104448 mod p(x)` */ + { 0x000000002e5cfb88, 0x0000000007cb5370 }, + /* x^103488 mod p(x)` , x^103424 mod p(x)` */ + { 0x0000000067b87920, 0x000000005dbb32f8 }, + /* x^102464 mod p(x)` , x^102400 mod p(x)` */ + { 0x000000003eaf4130, 0x00000000c5d4a380 }, + /* x^101440 mod p(x)` , x^101376 mod p(x)` */ + { 0x0000000087dba310, 0x00000000abb3dda8 }, + /* x^100416 mod p(x)` , x^100352 mod p(x)` */ + { 0x00000000c1898528, 0x00000000e62cca40 }, + /* x^99392 mod p(x)` , x^99328 mod p(x)` */ + { 0x00000000dc879ef8, 0x000000004f6a6c30 }, + /* x^98368 mod p(x)` , x^98304 mod p(x)` */ + { 0x00000000c79b8720, 0x0000000039319fd8 }, + /* x^97344 mod p(x)` , x^97280 mod p(x)` */ + { 0x00000000c0c1ff28, 0x0000000001646478 }, + /* x^96320 mod p(x)` , x^96256 mod p(x)` */ + { 0x00000000a0c36c10, 0x000000002dc882f0 }, + /* x^95296 mod p(x)` , x^95232 mod p(x)` */ + { 0x0000000061eed100, 0x0000000077b2c488 }, + /* x^94272 mod p(x)` , x^94208 mod p(x)` */ + { 0x0000000016272d48, 0x000000001f571a60 }, + /* x^93248 mod p(x)` , x^93184 mod p(x)` */ + { 0x000000007437d150, 0x00000000a553c958 }, + /* x^92224 mod p(x)` , x^92160 mod p(x)` */ + { 0x0000000001ac1638, 0x000000003ac2c5f0 }, + /* x^91200 mod p(x)` , x^91136 mod p(x)` */ + { 0x0000000072717528, 0x00000000efceaf70 }, + /* x^90176 mod p(x)` , x^90112 mod p(x)` */ + { 0x00000000267e1a80, 0x00000000a88d2290 }, + /* x^89152 mod p(x)` , x^89088 mod p(x)` */ + { 0x00000000a4a1aa40, 0x00000000139c49e0 }, + /* x^88128 mod p(x)` , x^88064 mod p(x)` */ + { 0x0000000087eb5f98, 0x00000000717f3fc0 }, + /* x^87104 mod p(x)` , x^87040 mod p(x)` */ + { 0x00000000e101f550, 0x0000000062c30aa0 }, + /* x^86080 mod p(x)` , x^86016 mod p(x)` */ + { 0x000000009dd3b578, 0x00000000b0c36de0 }, + /* x^85056 mod p(x)` , x^84992 mod p(x)` */ + { 0x000000001a7e1020, 0x00000000bbfcfa20 }, + /* x^84032 mod p(x)` , x^83968 mod p(x)` */ + { 0x00000000158a8410, 0x00000000805ce658 }, + /* x^83008 mod p(x)` , x^82944 mod p(x)` */ + { 0x0000000026922b08, 0x00000000799f5fc0 }, + /* x^81984 mod p(x)` , x^81920 mod p(x)` */ + { 0x00000000a534bf08, 0x00000000fdb2eca8 }, + /* x^80960 mod p(x)` , x^80896 mod p(x)` */ + { 0x000000000c1e8220, 0x000000005b454690 }, + /* x^79936 mod p(x)` , x^79872 mod p(x)` */ + { 0x00000000afb6f120, 0x00000000828e3ea0 }, + /* x^78912 mod p(x)` , x^78848 mod p(x)` */ + { 0x000000009b63c270, 0x00000000afeee440 }, + /* x^77888 mod p(x)` , x^77824 mod p(x)` */ + { 0x00000000e33bb3e8, 0x000000009d860ed8 }, + /* x^76864 mod p(x)` , x^76800 mod p(x)` */ + { 0x00000000a5570ca0, 0x0000000053141a30 }, + /* x^75840 mod p(x)` , x^75776 mod p(x)` */ + { 0x000000008e9326c0, 0x0000000017407a68 }, + /* x^74816 mod p(x)` , x^74752 mod p(x)` */ + { 0x000000004b99a3d0, 0x000000005557e9c8 }, + /* x^73792 mod p(x)` , x^73728 mod p(x)` */ + { 0x0000000009f79420, 0x00000000805eda50 }, + /* x^72768 mod p(x)` , x^72704 mod p(x)` */ + { 0x00000000a4f947a0, 0x00000000fdf25818 }, + /* x^71744 mod p(x)` , x^71680 mod p(x)` */ + { 0x000000007bc29b98, 0x000000002cc580c8 }, + /* x^70720 mod p(x)` , x^70656 mod p(x)` */ + { 0x000000005c1226a0, 0x000000004192fd80 }, + /* x^69696 mod p(x)` , x^69632 mod p(x)` */ + { 0x0000000060bc7ee8, 0x00000000bdc016b8 }, + /* x^68672 mod p(x)` , x^68608 mod p(x)` */ + { 0x00000000c1a69ed0, 0x00000000fa5954e8 }, + /* x^67648 mod p(x)` , x^67584 mod p(x)` */ + { 0x00000000bc649eb8, 0x00000000bafa86c8 }, + /* x^66624 mod p(x)` , x^66560 mod p(x)` */ + { 0x000000001d98d568, 0x000000003be64b40 }, + /* x^65600 mod p(x)` , x^65536 mod p(x)` */ + { 0x000000006c48a398, 0x00000000e6f61a98 }, + /* x^64576 mod p(x)` , x^64512 mod p(x)` */ + { 0x000000002c1bfa78, 0x00000000f969fbc0 }, + /* x^63552 mod p(x)` , x^63488 mod p(x)` */ + { 0x00000000203fb510, 0x00000000708772b8 }, + /* x^62528 mod p(x)` , x^62464 mod p(x)` */ + { 0x0000000091463d78, 0x00000000429a2b80 }, + /* x^61504 mod p(x)` , x^61440 mod p(x)` */ + { 0x000000008c4c35b0, 0x0000000092237fb8 }, + /* x^60480 mod p(x)` , x^60416 mod p(x)` */ + { 0x000000000b5a11f0, 0x00000000101ffd30 }, + /* x^59456 mod p(x)` , x^59392 mod p(x)` */ + { 0x00000000fdd4cf60, 0x000000008bf0ebd0 }, + /* x^58432 mod p(x)` , x^58368 mod p(x)` */ + { 0x0000000082dad1d8, 0x00000000b80e0238 }, + /* x^57408 mod p(x)` , x^57344 mod p(x)` */ + { 0x0000000087a03800, 0x000000007b2a9c88 }, + /* x^56384 mod p(x)` , x^56320 mod p(x)` */ + { 0x00000000eadb6578, 0x00000000e4cfd648 }, + /* x^55360 mod p(x)` , x^55296 mod p(x)` */ + { 0x00000000b0be6d10, 0x00000000af00b1e0 }, + /* x^54336 mod p(x)` , x^54272 mod p(x)` */ + { 0x000000001c2934a0, 0x00000000890e4588 }, + /* x^53312 mod p(x)` , x^53248 mod p(x)` */ + { 0x00000000fe5e43b8, 0x0000000092340968 }, + /* x^52288 mod p(x)` , x^52224 mod p(x)` */ + { 0x00000000e139bbb0, 0x00000000e8617728 }, + /* x^51264 mod p(x)` , x^51200 mod p(x)` */ + { 0x0000000049b2b620, 0x00000000cb39d4f0 }, + /* x^50240 mod p(x)` , x^50176 mod p(x)` */ + { 0x00000000e9f73c38, 0x00000000aabe8378 }, + /* x^49216 mod p(x)` , x^49152 mod p(x)` */ + { 0x000000001a1d4020, 0x00000000b6facd58 }, + /* x^48192 mod p(x)` , x^48128 mod p(x)` */ + { 0x00000000109b5698, 0x00000000cb02ad60 }, + /* x^47168 mod p(x)` , x^47104 mod p(x)` */ + { 0x00000000960eac90, 0x000000002a586828 }, + /* x^46144 mod p(x)` , x^46080 mod p(x)` */ + { 0x000000008c018d68, 0x00000000d8b51488 }, + /* x^45120 mod p(x)` , x^45056 mod p(x)` */ + { 0x0000000001b64120, 0x0000000035cc6098 }, + /* x^44096 mod p(x)` , x^44032 mod p(x)` */ + { 0x0000000035ab8f98, 0x0000000004dd9470 }, + /* x^43072 mod p(x)` , x^43008 mod p(x)` */ + { 0x0000000064292110, 0x0000000061f4ada0 }, + /* x^42048 mod p(x)` , x^41984 mod p(x)` */ + { 0x000000001ae9e868, 0x0000000078d43230 }, + /* x^41024 mod p(x)` , x^40960 mod p(x)` */ + { 0x0000000055d072e8, 0x000000004eb578d8 }, + /* x^40000 mod p(x)` , x^39936 mod p(x)` */ + { 0x000000002ae9eee0, 0x00000000166c65f0 }, + /* x^38976 mod p(x)` , x^38912 mod p(x)` */ + { 0x00000000ccc901f0, 0x00000000231d91b0 }, + /* x^37952 mod p(x)` , x^37888 mod p(x)` */ + { 0x0000000002380788, 0x0000000044bfd368 }, + /* x^36928 mod p(x)` , x^36864 mod p(x)` */ + { 0x000000006402f1f0, 0x00000000639c03f8 }, + /* x^35904 mod p(x)` , x^35840 mod p(x)` */ + { 0x0000000087085388, 0x000000004d187408 }, + /* x^34880 mod p(x)` , x^34816 mod p(x)` */ + { 0x0000000005a17c98, 0x00000000d0dc3100 }, + /* x^33856 mod p(x)` , x^33792 mod p(x)` */ + { 0x000000005038f630, 0x00000000459cb920 }, + /* x^32832 mod p(x)` , x^32768 mod p(x)` */ + { 0x00000000a3738908, 0x000000006d5e50e0 }, + /* x^31808 mod p(x)` , x^31744 mod p(x)` */ + { 0x000000002f51c128, 0x0000000039f37110 }, + /* x^30784 mod p(x)` , x^30720 mod p(x)` */ + { 0x00000000a3444c50, 0x00000000bcac3f90 }, + /* x^29760 mod p(x)` , x^29696 mod p(x)` */ + { 0x0000000096822e58, 0x00000000139b9d00 }, + /* x^28736 mod p(x)` , x^28672 mod p(x)` */ + { 0x00000000e83e1830, 0x00000000e59b7588 }, + /* x^27712 mod p(x)` , x^27648 mod p(x)` */ + { 0x000000003eef3e88, 0x00000000280d7d30 }, + /* x^26688 mod p(x)` , x^26624 mod p(x)` */ + { 0x000000000b89a3a8, 0x000000007c509ae8 }, + /* x^25664 mod p(x)` , x^25600 mod p(x)` */ + { 0x000000009cdc20a8, 0x00000000d1442918 }, + /* x^24640 mod p(x)` , x^24576 mod p(x)` */ + { 0x00000000b212ef78, 0x00000000fe120f60 }, + /* x^23616 mod p(x)` , x^23552 mod p(x)` */ + { 0x00000000c4cda310, 0x00000000223d97e0 }, + /* x^22592 mod p(x)` , x^22528 mod p(x)` */ + { 0x00000000dd4aa1b0, 0x0000000058b23628 }, + /* x^21568 mod p(x)` , x^21504 mod p(x)` */ + { 0x000000005b9901b0, 0x000000000eca9050 }, + /* x^20544 mod p(x)` , x^20480 mod p(x)` */ + { 0x00000000ac111240, 0x000000004cf2ac08 }, + /* x^19520 mod p(x)` , x^19456 mod p(x)` */ + { 0x0000000081b31860, 0x0000000069ef4748 }, + /* x^18496 mod p(x)` , x^18432 mod p(x)` */ + { 0x00000000d0499130, 0x00000000883510b8 }, + /* x^17472 mod p(x)` , x^17408 mod p(x)` */ + { 0x0000000015817a68, 0x00000000587539c8 }, + /* x^16448 mod p(x)` , x^16384 mod p(x)` */ + { 0x000000009c175750, 0x000000004c2e2020 }, + /* x^15424 mod p(x)` , x^15360 mod p(x)` */ + { 0x0000000036553828, 0x00000000bca2ad48 }, + /* x^14400 mod p(x)` , x^14336 mod p(x)` */ + { 0x00000000ab735970, 0x0000000038218a38 }, + /* x^13376 mod p(x)` , x^13312 mod p(x)` */ + { 0x000000004292f240, 0x0000000069012558 }, + /* x^12352 mod p(x)` , x^12288 mod p(x)` */ + { 0x00000000f6a49b10, 0x000000006e323e78 }, + /* x^11328 mod p(x)` , x^11264 mod p(x)` */ + { 0x00000000aa1544a0, 0x00000000c3904210 }, + /* x^10304 mod p(x)` , x^10240 mod p(x)` */ + { 0x00000000c10034e0, 0x000000008cdf0750 }, + /* x^9280 mod p(x)` , x^9216 mod p(x)` */ + { 0x0000000098495940, 0x000000003c729668 }, + /* x^8256 mod p(x)` , x^8192 mod p(x)` */ + { 0x00000000de1f2308, 0x000000003ff18098 }, + /* x^7232 mod p(x)` , x^7168 mod p(x)` */ + { 0x0000000064504c38, 0x0000000030fa3308 }, + /* x^6208 mod p(x)` , x^6144 mod p(x)` */ + { 0x0000000003133470, 0x000000001d2a7968 }, + /* x^5184 mod p(x)` , x^5120 mod p(x)` */ + { 0x000000007c60cb68, 0x000000007d651470 }, + /* x^4160 mod p(x)` , x^4096 mod p(x)` */ + { 0x00000000041b5708, 0x00000000e0154410 }, + /* x^3136 mod p(x)` , x^3072 mod p(x)` */ + { 0x0000000018246d28, 0x000000002a64dac0 }, + /* x^2112 mod p(x)` , x^2048 mod p(x)` */ + { 0x000000005b419030, 0x0000000085115738 }, + /* x^1088 mod p(x)` , x^1024 mod p(x)` */ + { 0x000000002e5acf98, 0x00000000cfe98310 } +#endif /* __LITTLE_ENDIAN__ */ + }; + +/* Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros */ + +static const __vector unsigned long long vcrc_short_const[16] + __attribute__((aligned (16))) = { +#ifdef __LITTLE_ENDIAN__ + /* x^2048 mod p(x) , x^2016 mod p(x) , x^1984 mod p(x) , x^1952 mod p(x) */ + { 0x7a96b2a0aac8e100, 0x85115738e9dee9d0 }, + /* x^1920 mod p(x) , x^1888 mod p(x) , x^1856 mod p(x) , x^1824 mod p(x) */ + { 0xde76b9e0423e1db8, 0xd46815d06a2a1db8 }, + /* x^1792 mod p(x) , x^1760 mod p(x) , x^1728 mod p(x) , x^1696 mod p(x) */ + { 0x1b0f7e0857122190, 0x62f99a2876cd0e78 }, + /* x^1664 mod p(x) , x^1632 mod p(x) , x^1600 mod p(x) , x^1568 mod p(x) */ + { 0xf0b0e4d8c27ffaf8, 0x29818c08b788e7e0 }, + /* x^1536 mod p(x) , x^1504 mod p(x) , x^1472 mod p(x) , x^1440 mod p(x) */ + { 0x15b7175015da5eb8, 0x870cd0d877513530 }, + /* x^1408 mod p(x) , x^1376 mod p(x) , x^1344 mod p(x) , x^1312 mod p(x) */ + { 0xafceaa4898c329b0, 0x4d2ad878a3204890 }, + /* x^1280 mod p(x) , x^1248 mod p(x) , x^1216 mod p(x) , x^1184 mod p(x) */ + { 0xc3d61620a94800c8, 0xb6f39120a6e2bb68 }, + /* x^1152 mod p(x) , x^1120 mod p(x) , x^1088 mod p(x) , x^1056 mod p(x) */ + { 0x2e5acf980037bf98, 0x117a2ae0a16b2a50 }, + /* x^1024 mod p(x) , x^992 mod p(x) , x^960 mod p(x) , x^928 mod p(x) */ + { 0x91a5c6c0c54c4540, 0xcfe983103a1293c8 }, + /* x^896 mod p(x) , x^864 mod p(x) , x^832 mod p(x) , x^800 mod p(x) */ + { 0xdd5bad08df977028, 0x17db71d04ee58750 }, + /* x^768 mod p(x) , x^736 mod p(x) , x^704 mod p(x) , x^672 mod p(x) */ + { 0x91cf3768e07471a0, 0x2e532e70c8571170 }, + /* x^640 mod p(x) , x^608 mod p(x) , x^576 mod p(x) , x^544 mod p(x) */ + { 0xc4a91cd03297dd68, 0xe71121c860e9b1a0 }, + /* x^512 mod p(x) , x^480 mod p(x) , x^448 mod p(x) , x^416 mod p(x) */ + { 0x4dbdcd0060ac1578, 0x651e70d8fe9264c0 }, + /* x^384 mod p(x) , x^352 mod p(x) , x^320 mod p(x) , x^288 mod p(x) */ + { 0x986135b03ce6f5e8, 0x81d1d408f70f6960 }, + /* x^256 mod p(x) , x^224 mod p(x) , x^192 mod p(x) , x^160 mod p(x) */ + { 0x6d3308a8148f48d8, 0xc64421704c399e10 }, + /* x^128 mod p(x) , x^96 mod p(x) , x^64 mod p(x) , x^32 mod p(x) */ + { 0x43a094c882f63b78, 0x1cb857700b7bbcb0 } +#else /* __LITTLE_ENDIAN__ */ + /* x^2048 mod p(x) , x^2016 mod p(x) , x^1984 mod p(x) , x^1952 mod p(x) */ + { 0x85115738e9dee9d0, 0x7a96b2a0aac8e100 }, + /* x^1920 mod p(x) , x^1888 mod p(x) , x^1856 mod p(x) , x^1824 mod p(x) */ + { 0xd46815d06a2a1db8, 0xde76b9e0423e1db8 }, + /* x^1792 mod p(x) , x^1760 mod p(x) , x^1728 mod p(x) , x^1696 mod p(x) */ + { 0x62f99a2876cd0e78, 0x1b0f7e0857122190 }, + /* x^1664 mod p(x) , x^1632 mod p(x) , x^1600 mod p(x) , x^1568 mod p(x) */ + { 0x29818c08b788e7e0, 0xf0b0e4d8c27ffaf8 }, + /* x^1536 mod p(x) , x^1504 mod p(x) , x^1472 mod p(x) , x^1440 mod p(x) */ + { 0x870cd0d877513530, 0x15b7175015da5eb8 }, + /* x^1408 mod p(x) , x^1376 mod p(x) , x^1344 mod p(x) , x^1312 mod p(x) */ + { 0x4d2ad878a3204890, 0xafceaa4898c329b0 }, + /* x^1280 mod p(x) , x^1248 mod p(x) , x^1216 mod p(x) , x^1184 mod p(x) */ + { 0xb6f39120a6e2bb68, 0xc3d61620a94800c8 }, + /* x^1152 mod p(x) , x^1120 mod p(x) , x^1088 mod p(x) , x^1056 mod p(x) */ + { 0x117a2ae0a16b2a50, 0x2e5acf980037bf98 }, + /* x^1024 mod p(x) , x^992 mod p(x) , x^960 mod p(x) , x^928 mod p(x) */ + { 0xcfe983103a1293c8, 0x91a5c6c0c54c4540 }, + /* x^896 mod p(x) , x^864 mod p(x) , x^832 mod p(x) , x^800 mod p(x) */ + { 0x17db71d04ee58750, 0xdd5bad08df977028 }, + /* x^768 mod p(x) , x^736 mod p(x) , x^704 mod p(x) , x^672 mod p(x) */ + { 0x2e532e70c8571170, 0x91cf3768e07471a0 }, + /* x^640 mod p(x) , x^608 mod p(x) , x^576 mod p(x) , x^544 mod p(x) */ + { 0xe71121c860e9b1a0, 0xc4a91cd03297dd68 }, + /* x^512 mod p(x) , x^480 mod p(x) , x^448 mod p(x) , x^416 mod p(x) */ + { 0x651e70d8fe9264c0, 0x4dbdcd0060ac1578 }, + /* x^384 mod p(x) , x^352 mod p(x) , x^320 mod p(x) , x^288 mod p(x) */ + { 0x81d1d408f70f6960, 0x986135b03ce6f5e8 }, + /* x^256 mod p(x) , x^224 mod p(x) , x^192 mod p(x) , x^160 mod p(x) */ + { 0xc64421704c399e10, 0x6d3308a8148f48d8 }, + /* x^128 mod p(x) , x^96 mod p(x) , x^64 mod p(x) , x^32 mod p(x) */ + { 0x1cb857700b7bbcb0, 0x43a094c882f63b78 } +#endif /* __LITTLE_ENDIAN__ */ + }; + +/* Barrett constants */ +/* 33 bit reflected Barrett constant m - (4^32)/n */ + +static const __vector unsigned long long v_Barrett_const[2] + __attribute__((aligned (16))) = { + /* x^64 div p(x) */ +#ifdef __LITTLE_ENDIAN__ + { 0x00000001fd9489fb, 0x0000000000000000 }, + { 0x0000000182f63b78, 0x0000000000000000 } +#else /* __LITTLE_ENDIAN__ */ + { 0x0000000000000000, 0x00000001fd9489fb }, + { 0x0000000000000000, 0x0000000182f63b78 } +#endif /* __LITTLE_ENDIAN__ */ + }; +#endif /* POWER8_INTRINSICS */ + +#else /* __ASSEMBLER__ */ +.constants: + + /* Reduce 262144 kbits to 1024 bits */ + /* x^261184 mod p(x), x^261120 mod p(x) */ + .octa 0x00000000a7bbf060000000003f02aaa0 + + /* x^260160 mod p(x), x^260096 mod p(x) */ + .octa 0x00000000d61de5d000000000bb290eb0 + + /* x^259136 mod p(x), x^259072 mod p(x) */ + .octa 0x00000000a8efc95800000000f3725eb8 + + /* x^258112 mod p(x), x^258048 mod p(x) */ + .octa 0x000000006266304800000000744d94c0 + + /* x^257088 mod p(x), x^257024 mod p(x) */ + .octa 0x000000004c0c44880000000087289250 + + /* x^256064 mod p(x), x^256000 mod p(x) */ + .octa 0x000000009f3c195000000000b5559480 + + /* x^255040 mod p(x), x^254976 mod p(x) */ + .octa 0x00000000d32d901800000000c6a6f640 + + /* x^254016 mod p(x), x^253952 mod p(x) */ + .octa 0x0000000081bd8fb800000000637a6528 + + /* x^252992 mod p(x), x^252928 mod p(x) */ + .octa 0x000000004575d0a00000000010166ef0 + + /* x^251968 mod p(x), x^251904 mod p(x) */ + .octa 0x000000005a1c1e180000000049923d48 + + /* x^250944 mod p(x), x^250880 mod p(x) */ + .octa 0x00000000451732080000000099f6ae90 + + /* x^249920 mod p(x), x^249856 mod p(x) */ + .octa 0x00000000420b5f60000000002162c550 + + /* x^248896 mod p(x), x^248832 mod p(x) */ + .octa 0x00000000f4c5b72800000000ef3107a0 + + /* x^247872 mod p(x), x^247808 mod p(x) */ + .octa 0x0000000018760b5800000000851e8a40 + + /* x^246848 mod p(x), x^246784 mod p(x) */ + .octa 0x000000006d7dba68000000007a786e68 + + /* x^245824 mod p(x), x^245760 mod p(x) */ + .octa 0x0000000047095830000000005d97c3d0 + + /* x^244800 mod p(x), x^244736 mod p(x) */ + .octa 0x0000000002645d1800000000a8760580 + + /* x^243776 mod p(x), x^243712 mod p(x) */ + .octa 0x00000000981b3ed0000000008dcc4f00 + + /* x^242752 mod p(x), x^242688 mod p(x) */ + .octa 0x00000000e00c9140000000005fb60768 + + /* x^241728 mod p(x), x^241664 mod p(x) */ + .octa 0x00000000e4d9ed90000000004e5bd750 + + /* x^240704 mod p(x), x^240640 mod p(x) */ + .octa 0x0000000016425e3800000000273fb988 + + /* x^239680 mod p(x), x^239616 mod p(x) */ + .octa 0x00000000be2a57e00000000019020f38 + + /* x^238656 mod p(x), x^238592 mod p(x) */ + .octa 0x00000000de3591900000000097f1ad90 + + /* x^237632 mod p(x), x^237568 mod p(x) */ + .octa 0x000000006622100000000000279425c8 + + /* x^236608 mod p(x), x^236544 mod p(x) */ + .octa 0x00000000e107ea58000000002ca764d8 + + /* x^235584 mod p(x), x^235520 mod p(x) */ + .octa 0x0000000016aa238000000000342c21c8 + + /* x^234560 mod p(x), x^234496 mod p(x) */ + .octa 0x00000000551c710000000000a4217dc0 + + /* x^233536 mod p(x), x^233472 mod p(x) */ + .octa 0x00000000d3a9704000000000e3a887c8 + + /* x^232512 mod p(x), x^232448 mod p(x) */ + .octa 0x00000000d2d1b480000000003ca6edb0 + + /* x^231488 mod p(x), x^231424 mod p(x) */ + .octa 0x00000000ec5a17d800000000def30ae0 + + /* x^230464 mod p(x), x^230400 mod p(x) */ + .octa 0x00000000f997aa9000000000cfad2020 + + /* x^229440 mod p(x), x^229376 mod p(x) */ + .octa 0x000000004bb8508000000000ceb08770 + + /* x^228416 mod p(x), x^228352 mod p(x) */ + .octa 0x00000000547d303000000000f18c7b08 + + /* x^227392 mod p(x), x^227328 mod p(x) */ + .octa 0x00000000d32d1d480000000018f5e738 + + /* x^226368 mod p(x), x^226304 mod p(x) */ + .octa 0x00000000aa966a20000000008ec52840 + + /* x^225344 mod p(x), x^225280 mod p(x) */ + .octa 0x0000000077e06f48000000003c2364d0 + + /* x^224320 mod p(x), x^224256 mod p(x) */ + .octa 0x00000000bf106be800000000639146e0 + + /* x^223296 mod p(x), x^223232 mod p(x) */ + .octa 0x00000000fa7ad60800000000e0dea810 + + /* x^222272 mod p(x), x^222208 mod p(x) */ + .octa 0x000000004431084000000000271c60a0 + + /* x^221248 mod p(x), x^221184 mod p(x) */ + .octa 0x00000000dcbbc0b80000000027c94138 + + /* x^220224 mod p(x), x^220160 mod p(x) */ + .octa 0x000000005cdf7278000000002dccbe38 + + /* x^219200 mod p(x), x^219136 mod p(x) */ + .octa 0x00000000a9a8af5000000000b35fe5d0 + + /* x^218176 mod p(x), x^218112 mod p(x) */ + .octa 0x000000006ceb84a800000000f210bac0 + + /* x^217152 mod p(x), x^217088 mod p(x) */ + .octa 0x0000000047ca21d00000000046d4daf8 + + /* x^216128 mod p(x), x^216064 mod p(x) */ + .octa 0x0000000087e84d3800000000fa755018 + + /* x^215104 mod p(x), x^215040 mod p(x) */ + .octa 0x00000000129b97b000000000b7e8bb68 + + /* x^214080 mod p(x), x^214016 mod p(x) */ + .octa 0x00000000187e14b00000000055b429a0 + + /* x^213056 mod p(x), x^212992 mod p(x) */ + .octa 0x00000000ab24f09000000000bb853930 + + /* x^212032 mod p(x), x^211968 mod p(x) */ + .octa 0x000000001c2d80e0000000007839c800 + + /* x^211008 mod p(x), x^210944 mod p(x) */ + .octa 0x00000000ea26b4b000000000d2e2e3f0 + + /* x^209984 mod p(x), x^209920 mod p(x) */ + .octa 0x000000001e81e6f00000000035c34ed0 + + /* x^208960 mod p(x), x^208896 mod p(x) */ + .octa 0x0000000017bf67f8000000003e0a2d48 + + /* x^207936 mod p(x), x^207872 mod p(x) */ + .octa 0x0000000066549f48000000002168d9f8 + + /* x^206912 mod p(x), x^206848 mod p(x) */ + .octa 0x000000009f0eb70000000000fd387468 + + /* x^205888 mod p(x), x^205824 mod p(x) */ + .octa 0x000000009a50dd20000000000a851398 + + /* x^204864 mod p(x), x^204800 mod p(x) */ + .octa 0x00000000e038cf700000000031b21488 + + /* x^203840 mod p(x), x^203776 mod p(x) */ + .octa 0x00000000f062b09800000000c8d01a30 + + /* x^202816 mod p(x), x^202752 mod p(x) */ + .octa 0x00000000faab9b58000000005aae2f58 + + /* x^201792 mod p(x), x^201728 mod p(x) */ + .octa 0x00000000fc23b1c000000000b0ac75e0 + + /* x^200768 mod p(x), x^200704 mod p(x) */ + .octa 0x0000000088adaa3000000000eb50e330 + + /* x^199744 mod p(x), x^199680 mod p(x) */ + .octa 0x0000000014601f1800000000c0ef3138 + + /* x^198720 mod p(x), x^198656 mod p(x) */ + .octa 0x0000000073817a40000000005d4431e0 + + /* x^197696 mod p(x), x^197632 mod p(x) */ + .octa 0x00000000aab01b5000000000b34963b0 + + /* x^196672 mod p(x), x^196608 mod p(x) */ + .octa 0x0000000066ad804000000000f770d030 + + /* x^195648 mod p(x), x^195584 mod p(x) */ + .octa 0x00000000378db488000000005849c7a0 + + /* x^194624 mod p(x), x^194560 mod p(x) */ + .octa 0x000000003bde9048000000007bb1b3a0 + + /* x^193600 mod p(x), x^193536 mod p(x) */ + .octa 0x00000000f6ece068000000000dceb318 + + /* x^192576 mod p(x), x^192512 mod p(x) */ + .octa 0x000000009d4e7020000000008e9947b0 + + /* x^191552 mod p(x), x^191488 mod p(x) */ + .octa 0x000000009efee6f0000000002ed2aa58 + + /* x^190528 mod p(x), x^190464 mod p(x) */ + .octa 0x00000000ea47180000000000922596d0 + + /* x^189504 mod p(x), x^189440 mod p(x) */ + .octa 0x0000000011a5a9a80000000028f93bf0 + + /* x^188480 mod p(x), x^188416 mod p(x) */ + .octa 0x00000000a8c96eb000000000e78ba040 + + /* x^187456 mod p(x), x^187392 mod p(x) */ + .octa 0x000000009800fa50000000004677b9e0 + + /* x^186432 mod p(x), x^186368 mod p(x) */ + .octa 0x00000000ab64bc5000000000db725228 + + /* x^185408 mod p(x), x^185344 mod p(x) */ + .octa 0x000000009576821800000000a98d1b58 + + /* x^184384 mod p(x), x^184320 mod p(x) */ + .octa 0x0000000050eb16b800000000eb702a98 + + /* x^183360 mod p(x), x^183296 mod p(x) */ + .octa 0x00000000a8e665200000000015ceb5e8 + + /* x^182336 mod p(x), x^182272 mod p(x) */ + .octa 0x00000000f42e143000000000da4ce2f8 + + /* x^181312 mod p(x), x^181248 mod p(x) */ + .octa 0x000000001cd1de48000000006b66a7b0 + + /* x^180288 mod p(x), x^180224 mod p(x) */ + .octa 0x00000000971aa4a0000000003c610c28 + + /* x^179264 mod p(x), x^179200 mod p(x) */ + .octa 0x00000000701200280000000046906840 + + /* x^178240 mod p(x), x^178176 mod p(x) */ + .octa 0x000000000a3d66000000000060c4e8e8 + + /* x^177216 mod p(x), x^177152 mod p(x) */ + .octa 0x00000000c52f2bb80000000011e757a0 + + /* x^176192 mod p(x), x^176128 mod p(x) */ + .octa 0x00000000d8447d10000000001cd4ecf8 + + /* x^175168 mod p(x), x^175104 mod p(x) */ + .octa 0x00000000d71fda58000000003d9b3c80 + + /* x^174144 mod p(x), x^174080 mod p(x) */ + .octa 0x000000003ad5c5b80000000012e30d80 + + /* x^173120 mod p(x), x^173056 mod p(x) */ + .octa 0x00000000116fcfc8000000009d0be168 + + /* x^172096 mod p(x), x^172032 mod p(x) */ + .octa 0x00000000c834198800000000e9c4a830 + + /* x^171072 mod p(x), x^171008 mod p(x) */ + .octa 0x000000009cda6d70000000005d83b300 + + /* x^170048 mod p(x), x^169984 mod p(x) */ + .octa 0x0000000053f67a600000000058d96488 + + /* x^169024 mod p(x), x^168960 mod p(x) */ + .octa 0x00000000601829880000000098438eb0 + + /* x^168000 mod p(x), x^167936 mod p(x) */ + .octa 0x00000000e7915ce800000000b59bc4f0 + + /* x^166976 mod p(x), x^166912 mod p(x) */ + .octa 0x0000000099d3d00800000000d8745368 + + /* x^165952 mod p(x), x^165888 mod p(x) */ + .octa 0x000000009674ce28000000006d727638 + + /* x^164928 mod p(x), x^164864 mod p(x) */ + .octa 0x00000000f0d04eb80000000070325da0 + + /* x^163904 mod p(x), x^163840 mod p(x) */ + .octa 0x00000000850ce3580000000052672a00 + + /* x^162880 mod p(x), x^162816 mod p(x) */ + .octa 0x00000000af77ff1000000000abd304f0 + + /* x^161856 mod p(x), x^161792 mod p(x) */ + .octa 0x00000000953f00980000000099981718 + + /* x^160832 mod p(x), x^160768 mod p(x) */ + .octa 0x00000000b26c536800000000b73da600 + + /* x^159808 mod p(x), x^159744 mod p(x) */ + .octa 0x00000000b26d068800000000dca323d0 + + /* x^158784 mod p(x), x^158720 mod p(x) */ + .octa 0x000000009e5e2da8000000004bea9548 + + /* x^157760 mod p(x), x^157696 mod p(x) */ + .octa 0x00000000e17ef8d8000000005c9a1e40 + + /* x^156736 mod p(x), x^156672 mod p(x) */ + .octa 0x00000000e23d7f38000000009ecf7398 + + /* x^155712 mod p(x), x^155648 mod p(x) */ + .octa 0x000000007d8bd2f80000000061f97a20 + + /* x^154688 mod p(x), x^154624 mod p(x) */ + .octa 0x000000009e3f90600000000035c0bbc8 + + /* x^153664 mod p(x), x^153600 mod p(x) */ + .octa 0x00000000eeaf0db800000000f8b23b70 + + /* x^152640 mod p(x), x^152576 mod p(x) */ + .octa 0x00000000adca6b2000000000ae46b4f8 + + /* x^151616 mod p(x), x^151552 mod p(x) */ + .octa 0x00000000929ea20000000000d758b910 + + /* x^150592 mod p(x), x^150528 mod p(x) */ + .octa 0x00000000087498b0000000008cd61ce8 + + /* x^149568 mod p(x), x^149504 mod p(x) */ + .octa 0x0000000093b2cdb8000000002a925aa8 + + /* x^148544 mod p(x), x^148480 mod p(x) */ + .octa 0x000000001548975800000000781bcad0 + + /* x^147520 mod p(x), x^147456 mod p(x) */ + .octa 0x00000000df102ee0000000003c0964d8 + + /* x^146496 mod p(x), x^146432 mod p(x) */ + .octa 0x00000000555cee7000000000dd92f618 + + /* x^145472 mod p(x), x^145408 mod p(x) */ + .octa 0x000000004e70a868000000007b0c7238 + + /* x^144448 mod p(x), x^144384 mod p(x) */ + .octa 0x00000000536e6838000000008f2cffa8 + + /* x^143424 mod p(x), x^143360 mod p(x) */ + .octa 0x00000000226432f800000000234bf6e8 + + /* x^142400 mod p(x), x^142336 mod p(x) */ + .octa 0x000000005f360d480000000039447900 + + /* x^141376 mod p(x), x^141312 mod p(x) */ + .octa 0x0000000073de4148000000001443ee60 + + /* x^140352 mod p(x), x^140288 mod p(x) */ + .octa 0x000000009b22944000000000351348c0 + + /* x^139328 mod p(x), x^139264 mod p(x) */ + .octa 0x00000000be6828f000000000ae9aa030 + + /* x^138304 mod p(x), x^138240 mod p(x) */ + .octa 0x00000000d747315000000000de4d6b60 + + /* x^137280 mod p(x), x^137216 mod p(x) */ + .octa 0x00000000290ace5800000000438b4bd8 + + /* x^136256 mod p(x), x^136192 mod p(x) */ + .octa 0x00000000a9b91248000000000889fe48 + + /* x^135232 mod p(x), x^135168 mod p(x) */ + .octa 0x000000002fc7eed000000000b93262e8 + + /* x^134208 mod p(x), x^134144 mod p(x) */ + .octa 0x00000000a57ab490000000007d040f88 + + /* x^133184 mod p(x), x^133120 mod p(x) */ + .octa 0x0000000010b3e7b000000000a8fed440 + + /* x^132160 mod p(x), x^132096 mod p(x) */ + .octa 0x00000000443b059000000000ccbe9580 + + /* x^131136 mod p(x), x^131072 mod p(x) */ + .octa 0x00000000ce47094800000000e139f248 + + /* x^130112 mod p(x), x^130048 mod p(x) */ + .octa 0x0000000023c5f6f0000000005e7fcb00 + + /* x^129088 mod p(x), x^129024 mod p(x) */ + .octa 0x00000000f323c050000000005bcf78c0 + + /* x^128064 mod p(x), x^128000 mod p(x) */ + .octa 0x000000005b8d5ec800000000123c9040 + + /* x^127040 mod p(x), x^126976 mod p(x) */ + .octa 0x00000000c7299430000000006ce46e18 + + /* x^126016 mod p(x), x^125952 mod p(x) */ + .octa 0x00000000b2d9526800000000c3a45280 + + /* x^124992 mod p(x), x^124928 mod p(x) */ + .octa 0x00000000b3772ab000000000ea2f2258 + + /* x^123968 mod p(x), x^123904 mod p(x) */ + .octa 0x00000000c5670b7000000000234acfa8 + + /* x^122944 mod p(x), x^122880 mod p(x) */ + .octa 0x00000000ec6f72a00000000062c09258 + + /* x^121920 mod p(x), x^121856 mod p(x) */ + .octa 0x00000000eff71d98000000008fabbd68 + + /* x^120896 mod p(x), x^120832 mod p(x) */ + .octa 0x0000000013a1ca3800000000e0dbdc70 + + /* x^119872 mod p(x), x^119808 mod p(x) */ + .octa 0x00000000128afbe0000000009a03ec48 + + /* x^118848 mod p(x), x^118784 mod p(x) */ + .octa 0x000000001298694800000000a77f0358 + + /* x^117824 mod p(x), x^117760 mod p(x) */ + .octa 0x0000000029130cb000000000bde4e590 + + /* x^116800 mod p(x), x^116736 mod p(x) */ + .octa 0x00000000c928f9a800000000822ba058 + + /* x^115776 mod p(x), x^115712 mod p(x) */ + .octa 0x00000000de509958000000000c6b0028 + + /* x^114752 mod p(x), x^114688 mod p(x) */ + .octa 0x00000000f3ec14a000000000a8f3d788 + + /* x^113728 mod p(x), x^113664 mod p(x) */ + .octa 0x0000000061896e280000000076e65d50 + + /* x^112704 mod p(x), x^112640 mod p(x) */ + .octa 0x000000004106569800000000f4beec20 + + /* x^111680 mod p(x), x^111616 mod p(x) */ + .octa 0x00000000bf6868f0000000003b34efd8 + + /* x^110656 mod p(x), x^110592 mod p(x) */ + .octa 0x00000000ea572ad80000000006c25018 + + /* x^109632 mod p(x), x^109568 mod p(x) */ + .octa 0x0000000007c2c6f800000000e32c7078 + + /* x^108608 mod p(x), x^108544 mod p(x) */ + .octa 0x00000000f667b5580000000043b958e8 + + /* x^107584 mod p(x), x^107520 mod p(x) */ + .octa 0x0000000038f2fa7000000000b8ee5338 + + /* x^106560 mod p(x), x^106496 mod p(x) */ + .octa 0x000000005946cf180000000012635bb8 + + /* x^105536 mod p(x), x^105472 mod p(x) */ + .octa 0x000000007664159000000000c26f8568 + + /* x^104512 mod p(x), x^104448 mod p(x) */ + .octa 0x000000002e5cfb880000000007cb5370 + + /* x^103488 mod p(x), x^103424 mod p(x) */ + .octa 0x0000000067b87920000000005dbb32f8 + + /* x^102464 mod p(x), x^102400 mod p(x) */ + .octa 0x000000003eaf413000000000c5d4a380 + + /* x^101440 mod p(x), x^101376 mod p(x) */ + .octa 0x0000000087dba31000000000abb3dda8 + + /* x^100416 mod p(x), x^100352 mod p(x) */ + .octa 0x00000000c189852800000000e62cca40 + + /* x^99392 mod p(x), x^99328 mod p(x) */ + .octa 0x00000000dc879ef8000000004f6a6c30 + + /* x^98368 mod p(x), x^98304 mod p(x) */ + .octa 0x00000000c79b87200000000039319fd8 + + /* x^97344 mod p(x), x^97280 mod p(x) */ + .octa 0x00000000c0c1ff280000000001646478 + + /* x^96320 mod p(x), x^96256 mod p(x) */ + .octa 0x00000000a0c36c10000000002dc882f0 + + /* x^95296 mod p(x), x^95232 mod p(x) */ + .octa 0x0000000061eed1000000000077b2c488 + + /* x^94272 mod p(x), x^94208 mod p(x) */ + .octa 0x0000000016272d48000000001f571a60 + + /* x^93248 mod p(x), x^93184 mod p(x) */ + .octa 0x000000007437d15000000000a553c958 + + /* x^92224 mod p(x), x^92160 mod p(x) */ + .octa 0x0000000001ac1638000000003ac2c5f0 + + /* x^91200 mod p(x), x^91136 mod p(x) */ + .octa 0x000000007271752800000000efceaf70 + + /* x^90176 mod p(x), x^90112 mod p(x) */ + .octa 0x00000000267e1a8000000000a88d2290 + + /* x^89152 mod p(x), x^89088 mod p(x) */ + .octa 0x00000000a4a1aa4000000000139c49e0 + + /* x^88128 mod p(x), x^88064 mod p(x) */ + .octa 0x0000000087eb5f9800000000717f3fc0 + + /* x^87104 mod p(x), x^87040 mod p(x) */ + .octa 0x00000000e101f5500000000062c30aa0 + + /* x^86080 mod p(x), x^86016 mod p(x) */ + .octa 0x000000009dd3b57800000000b0c36de0 + + /* x^85056 mod p(x), x^84992 mod p(x) */ + .octa 0x000000001a7e102000000000bbfcfa20 + + /* x^84032 mod p(x), x^83968 mod p(x) */ + .octa 0x00000000158a841000000000805ce658 + + /* x^83008 mod p(x), x^82944 mod p(x) */ + .octa 0x0000000026922b0800000000799f5fc0 + + /* x^81984 mod p(x), x^81920 mod p(x) */ + .octa 0x00000000a534bf0800000000fdb2eca8 + + /* x^80960 mod p(x), x^80896 mod p(x) */ + .octa 0x000000000c1e8220000000005b454690 + + /* x^79936 mod p(x), x^79872 mod p(x) */ + .octa 0x00000000afb6f12000000000828e3ea0 + + /* x^78912 mod p(x), x^78848 mod p(x) */ + .octa 0x000000009b63c27000000000afeee440 + + /* x^77888 mod p(x), x^77824 mod p(x) */ + .octa 0x00000000e33bb3e8000000009d860ed8 + + /* x^76864 mod p(x), x^76800 mod p(x) */ + .octa 0x00000000a5570ca00000000053141a30 + + /* x^75840 mod p(x), x^75776 mod p(x) */ + .octa 0x000000008e9326c00000000017407a68 + + /* x^74816 mod p(x), x^74752 mod p(x) */ + .octa 0x000000004b99a3d0000000005557e9c8 + + /* x^73792 mod p(x), x^73728 mod p(x) */ + .octa 0x0000000009f7942000000000805eda50 + + /* x^72768 mod p(x), x^72704 mod p(x) */ + .octa 0x00000000a4f947a000000000fdf25818 + + /* x^71744 mod p(x), x^71680 mod p(x) */ + .octa 0x000000007bc29b98000000002cc580c8 + + /* x^70720 mod p(x), x^70656 mod p(x) */ + .octa 0x000000005c1226a0000000004192fd80 + + /* x^69696 mod p(x), x^69632 mod p(x) */ + .octa 0x0000000060bc7ee800000000bdc016b8 + + /* x^68672 mod p(x), x^68608 mod p(x) */ + .octa 0x00000000c1a69ed000000000fa5954e8 + + /* x^67648 mod p(x), x^67584 mod p(x) */ + .octa 0x00000000bc649eb800000000bafa86c8 + + /* x^66624 mod p(x), x^66560 mod p(x) */ + .octa 0x000000001d98d568000000003be64b40 + + /* x^65600 mod p(x), x^65536 mod p(x) */ + .octa 0x000000006c48a39800000000e6f61a98 + + /* x^64576 mod p(x), x^64512 mod p(x) */ + .octa 0x000000002c1bfa7800000000f969fbc0 + + /* x^63552 mod p(x), x^63488 mod p(x) */ + .octa 0x00000000203fb51000000000708772b8 + + /* x^62528 mod p(x), x^62464 mod p(x) */ + .octa 0x0000000091463d7800000000429a2b80 + + /* x^61504 mod p(x), x^61440 mod p(x) */ + .octa 0x000000008c4c35b00000000092237fb8 + + /* x^60480 mod p(x), x^60416 mod p(x) */ + .octa 0x000000000b5a11f000000000101ffd30 + + /* x^59456 mod p(x), x^59392 mod p(x) */ + .octa 0x00000000fdd4cf60000000008bf0ebd0 + + /* x^58432 mod p(x), x^58368 mod p(x) */ + .octa 0x0000000082dad1d800000000b80e0238 + + /* x^57408 mod p(x), x^57344 mod p(x) */ + .octa 0x0000000087a03800000000007b2a9c88 + + /* x^56384 mod p(x), x^56320 mod p(x) */ + .octa 0x00000000eadb657800000000e4cfd648 + + /* x^55360 mod p(x), x^55296 mod p(x) */ + .octa 0x00000000b0be6d1000000000af00b1e0 + + /* x^54336 mod p(x), x^54272 mod p(x) */ + .octa 0x000000001c2934a000000000890e4588 + + /* x^53312 mod p(x), x^53248 mod p(x) */ + .octa 0x00000000fe5e43b80000000092340968 + + /* x^52288 mod p(x), x^52224 mod p(x) */ + .octa 0x00000000e139bbb000000000e8617728 + + /* x^51264 mod p(x), x^51200 mod p(x) */ + .octa 0x0000000049b2b62000000000cb39d4f0 + + /* x^50240 mod p(x), x^50176 mod p(x) */ + .octa 0x00000000e9f73c3800000000aabe8378 + + /* x^49216 mod p(x), x^49152 mod p(x) */ + .octa 0x000000001a1d402000000000b6facd58 + + /* x^48192 mod p(x), x^48128 mod p(x) */ + .octa 0x00000000109b569800000000cb02ad60 + + /* x^47168 mod p(x), x^47104 mod p(x) */ + .octa 0x00000000960eac90000000002a586828 + + /* x^46144 mod p(x), x^46080 mod p(x) */ + .octa 0x000000008c018d6800000000d8b51488 + + /* x^45120 mod p(x), x^45056 mod p(x) */ + .octa 0x0000000001b641200000000035cc6098 + + /* x^44096 mod p(x), x^44032 mod p(x) */ + .octa 0x0000000035ab8f980000000004dd9470 + + /* x^43072 mod p(x), x^43008 mod p(x) */ + .octa 0x00000000642921100000000061f4ada0 + + /* x^42048 mod p(x), x^41984 mod p(x) */ + .octa 0x000000001ae9e8680000000078d43230 + + /* x^41024 mod p(x), x^40960 mod p(x) */ + .octa 0x0000000055d072e8000000004eb578d8 + + /* x^40000 mod p(x), x^39936 mod p(x) */ + .octa 0x000000002ae9eee000000000166c65f0 + + /* x^38976 mod p(x), x^38912 mod p(x) */ + .octa 0x00000000ccc901f000000000231d91b0 + + /* x^37952 mod p(x), x^37888 mod p(x) */ + .octa 0x00000000023807880000000044bfd368 + + /* x^36928 mod p(x), x^36864 mod p(x) */ + .octa 0x000000006402f1f000000000639c03f8 + + /* x^35904 mod p(x), x^35840 mod p(x) */ + .octa 0x0000000087085388000000004d187408 + + /* x^34880 mod p(x), x^34816 mod p(x) */ + .octa 0x0000000005a17c9800000000d0dc3100 + + /* x^33856 mod p(x), x^33792 mod p(x) */ + .octa 0x000000005038f63000000000459cb920 + + /* x^32832 mod p(x), x^32768 mod p(x) */ + .octa 0x00000000a3738908000000006d5e50e0 + + /* x^31808 mod p(x), x^31744 mod p(x) */ + .octa 0x000000002f51c1280000000039f37110 + + /* x^30784 mod p(x), x^30720 mod p(x) */ + .octa 0x00000000a3444c5000000000bcac3f90 + + /* x^29760 mod p(x), x^29696 mod p(x) */ + .octa 0x0000000096822e5800000000139b9d00 + + /* x^28736 mod p(x), x^28672 mod p(x) */ + .octa 0x00000000e83e183000000000e59b7588 + + /* x^27712 mod p(x), x^27648 mod p(x) */ + .octa 0x000000003eef3e8800000000280d7d30 + + /* x^26688 mod p(x), x^26624 mod p(x) */ + .octa 0x000000000b89a3a8000000007c509ae8 + + /* x^25664 mod p(x), x^25600 mod p(x) */ + .octa 0x000000009cdc20a800000000d1442918 + + /* x^24640 mod p(x), x^24576 mod p(x) */ + .octa 0x00000000b212ef7800000000fe120f60 + + /* x^23616 mod p(x), x^23552 mod p(x) */ + .octa 0x00000000c4cda31000000000223d97e0 + + /* x^22592 mod p(x), x^22528 mod p(x) */ + .octa 0x00000000dd4aa1b00000000058b23628 + + /* x^21568 mod p(x), x^21504 mod p(x) */ + .octa 0x000000005b9901b0000000000eca9050 + + /* x^20544 mod p(x), x^20480 mod p(x) */ + .octa 0x00000000ac111240000000004cf2ac08 + + /* x^19520 mod p(x), x^19456 mod p(x) */ + .octa 0x0000000081b318600000000069ef4748 + + /* x^18496 mod p(x), x^18432 mod p(x) */ + .octa 0x00000000d049913000000000883510b8 + + /* x^17472 mod p(x), x^17408 mod p(x) */ + .octa 0x0000000015817a6800000000587539c8 + + /* x^16448 mod p(x), x^16384 mod p(x) */ + .octa 0x000000009c175750000000004c2e2020 + + /* x^15424 mod p(x), x^15360 mod p(x) */ + .octa 0x000000003655382800000000bca2ad48 + + /* x^14400 mod p(x), x^14336 mod p(x) */ + .octa 0x00000000ab7359700000000038218a38 + + /* x^13376 mod p(x), x^13312 mod p(x) */ + .octa 0x000000004292f2400000000069012558 + + /* x^12352 mod p(x), x^12288 mod p(x) */ + .octa 0x00000000f6a49b10000000006e323e78 + + /* x^11328 mod p(x), x^11264 mod p(x) */ + .octa 0x00000000aa1544a000000000c3904210 + + /* x^10304 mod p(x), x^10240 mod p(x) */ + .octa 0x00000000c10034e0000000008cdf0750 + + /* x^9280 mod p(x), x^9216 mod p(x) */ + .octa 0x0000000098495940000000003c729668 + + /* x^8256 mod p(x), x^8192 mod p(x) */ + .octa 0x00000000de1f2308000000003ff18098 + + /* x^7232 mod p(x), x^7168 mod p(x) */ + .octa 0x0000000064504c380000000030fa3308 + + /* x^6208 mod p(x), x^6144 mod p(x) */ + .octa 0x0000000003133470000000001d2a7968 + + /* x^5184 mod p(x), x^5120 mod p(x) */ + .octa 0x000000007c60cb68000000007d651470 + + /* x^4160 mod p(x), x^4096 mod p(x) */ + .octa 0x00000000041b570800000000e0154410 + + /* x^3136 mod p(x), x^3072 mod p(x) */ + .octa 0x0000000018246d28000000002a64dac0 + + /* x^2112 mod p(x), x^2048 mod p(x) */ + .octa 0x000000005b4190300000000085115738 + + /* x^1088 mod p(x), x^1024 mod p(x) */ + .octa 0x000000002e5acf9800000000cfe98310 + +.short_constants: + + /* Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros */ + /* x^2048 mod p(x), x^2016 mod p(x), x^1984 mod p(x), x^1952 mod p(x) */ + .octa 0x85115738e9dee9d07a96b2a0aac8e100 + + /* x^1920 mod p(x), x^1888 mod p(x), x^1856 mod p(x), x^1824 mod p(x) */ + .octa 0xd46815d06a2a1db8de76b9e0423e1db8 + + /* x^1792 mod p(x), x^1760 mod p(x), x^1728 mod p(x), x^1696 mod p(x) */ + .octa 0x62f99a2876cd0e781b0f7e0857122190 + + /* x^1664 mod p(x), x^1632 mod p(x), x^1600 mod p(x), x^1568 mod p(x) */ + .octa 0x29818c08b788e7e0f0b0e4d8c27ffaf8 + + /* x^1536 mod p(x), x^1504 mod p(x), x^1472 mod p(x), x^1440 mod p(x) */ + .octa 0x870cd0d87751353015b7175015da5eb8 + + /* x^1408 mod p(x), x^1376 mod p(x), x^1344 mod p(x), x^1312 mod p(x) */ + .octa 0x4d2ad878a3204890afceaa4898c329b0 + + /* x^1280 mod p(x), x^1248 mod p(x), x^1216 mod p(x), x^1184 mod p(x) */ + .octa 0xb6f39120a6e2bb68c3d61620a94800c8 + + /* x^1152 mod p(x), x^1120 mod p(x), x^1088 mod p(x), x^1056 mod p(x) */ + .octa 0x117a2ae0a16b2a502e5acf980037bf98 + + /* x^1024 mod p(x), x^992 mod p(x), x^960 mod p(x), x^928 mod p(x) */ + .octa 0xcfe983103a1293c891a5c6c0c54c4540 + + /* x^896 mod p(x), x^864 mod p(x), x^832 mod p(x), x^800 mod p(x) */ + .octa 0x17db71d04ee58750dd5bad08df977028 + + /* x^768 mod p(x), x^736 mod p(x), x^704 mod p(x), x^672 mod p(x) */ + .octa 0x2e532e70c857117091cf3768e07471a0 + + /* x^640 mod p(x), x^608 mod p(x), x^576 mod p(x), x^544 mod p(x) */ + .octa 0xe71121c860e9b1a0c4a91cd03297dd68 + + /* x^512 mod p(x), x^480 mod p(x), x^448 mod p(x), x^416 mod p(x) */ + .octa 0x651e70d8fe9264c04dbdcd0060ac1578 + + /* x^384 mod p(x), x^352 mod p(x), x^320 mod p(x), x^288 mod p(x) */ + .octa 0x81d1d408f70f6960986135b03ce6f5e8 + + /* x^256 mod p(x), x^224 mod p(x), x^192 mod p(x), x^160 mod p(x) */ + .octa 0xc64421704c399e106d3308a8148f48d8 + + /* x^128 mod p(x), x^96 mod p(x), x^64 mod p(x), x^32 mod p(x) */ + .octa 0x1cb857700b7bbcb043a094c882f63b78 + + +.barrett_constants: + /* Barrett constant m - (4^32)/n */ + .octa 0x000000000000000000000001fd9489fb /* x^64 div p(x) */ + /* Barrett constant n */ + .octa 0x00000000000000000000000182f63b78 +#endif /* __ASSEMBLER__ */ diff --git a/contrib/crc32-vpmsum-cmake/vec_crc32.h b/contrib/crc32-vpmsum-cmake/vec_crc32.h new file mode 100644 index 000000000000..0ef13616b34c --- /dev/null +++ b/contrib/crc32-vpmsum-cmake/vec_crc32.h @@ -0,0 +1,29 @@ +#ifndef VEC_CRC32 +#define VEC_CRC32 + + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned int crc32_vpmsum(unsigned int crc, const unsigned char *p, unsigned long len); + +static inline uint32_t crc32_ppc(uint64_t crc, unsigned char const *buffer, size_t len) +{ + unsigned char *emptybuffer; + if (!buffer) { + emptybuffer = (unsigned char *)malloc(len); + bzero(emptybuffer, len); + crc = crc32_vpmsum(crc, emptybuffer, len); + free(emptybuffer); + } else { + crc = crc32_vpmsum(crc, buffer, (unsigned long)len); + } + return crc; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/contrib/zlib-ng b/contrib/zlib-ng index bffad6f6fe74..50f0eae1a411 160000 --- a/contrib/zlib-ng +++ b/contrib/zlib-ng @@ -1 +1 @@ -Subproject commit bffad6f6fe74d6a2f92e2668390664a926c68733 +Subproject commit 50f0eae1a411764cd6d1e85b3ce471438acd3c1c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce2cc862b323..251a858fda1a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -377,6 +377,7 @@ target_link_libraries(clickhouse_common_io PUBLIC boost::program_options boost::system + ch_contrib::crc32-vpmsum ch_contrib::cityhash ch_contrib::zlib pcg_random diff --git a/src/Common/HashTable/Hash.h b/src/Common/HashTable/Hash.h index f36ab5767666..503be1cb2051 100644 --- a/src/Common/HashTable/Hash.h +++ b/src/Common/HashTable/Hash.h @@ -48,6 +48,10 @@ inline DB::UInt64 intHash64(DB::UInt64 x) #include #endif +#if (defined(__PPC64__) || defined(__powerpc64__)) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#include "vec_crc32.h" +#endif + /// NOTE: Intel intrinsic can be confusing. /// - https://code.google.com/archive/p/sse-intrinsics/wikis/PmovIntrinsicBug.wiki /// - https://stackoverflow.com/questions/15752770/mm-crc32-u64-poorly-defined @@ -57,6 +61,8 @@ inline DB::UInt64 intHashCRC32(DB::UInt64 x) return _mm_crc32_u64(-1ULL, x); #elif defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) return __crc32cd(-1U, x); +#elif (defined(__PPC64__) || defined(__powerpc64__)) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return crc32_ppc(-1U, reinterpret_cast(&x), sizeof(x)); #else /// On other platforms we do not have CRC32. NOTE This can be confusing. /// NOTE: consider using intHash32() @@ -69,6 +75,8 @@ inline DB::UInt64 intHashCRC32(DB::UInt64 x, DB::UInt64 updated_value) return _mm_crc32_u64(updated_value, x); #elif defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) return __crc32cd(static_cast(updated_value), x); +#elif (defined(__PPC64__) || defined(__powerpc64__)) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return crc32_ppc(updated_value, reinterpret_cast(&x), sizeof(x)); #else /// On other platforms we do not have CRC32. NOTE This can be confusing. return intHash64(x) ^ updated_value;