Skip to content

Commit dd21bd1

Browse files
committed
crc: Designate {Mu,Kn}Constant as consteval
This ensures compile-time generation of these constants rather than calling it from the main loops. This turns a lot of the constants into simple memory-loads or embeds the load directly into the instruction!
1 parent ba3f784 commit dd21bd1

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

source/CRC/CRC32-x64.cpp

+8-9
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static const CRC32TableT& GetCRC32Table(Polynomial Poly)
7676
}
7777
}
7878

79-
constexpr std::uint32_t BitReverse32(std::uint32_t Value)
79+
consteval std::uint32_t BitReverse32(std::uint32_t Value)
8080
{
8181
std::uint32_t Reversed = 0;
8282
for( std::uint32_t BitIndex = 0u; BitIndex < 32u; ++BitIndex )
@@ -88,7 +88,7 @@ constexpr std::uint32_t BitReverse32(std::uint32_t Value)
8888
}
8989

9090
// BitReverse(x^(shift) mod P(x) << 32) << 1
91-
constexpr std::uint64_t
91+
consteval std::uint64_t
9292
KnConstant(std::uint32_t ByteShift, std::uint32_t Polynomial)
9393
{
9494
std::uint32_t Remainder = 1u << 24;
@@ -112,7 +112,7 @@ constexpr std::uint64_t
112112
}
113113

114114
// BitReverse(x^64 / P(x)) << 1
115-
constexpr std::uint64_t MuConstant(uint32_t Polynomial)
115+
consteval std::uint64_t MuConstant(uint32_t Polynomial)
116116
{
117117
std::uint32_t Remainder = 1u << 24;
118118
std::uint32_t Quotient = 0u;
@@ -173,7 +173,7 @@ std::uint32_t
173173
// Todo: VPCLMULQDQ(AVX2, AVX512)
174174
for( ; Data.size() >= 64; Data = Data.subspan(64) )
175175
{
176-
static const __m128i K1K2 = _mm_set_epi64x(
176+
const __m128i K1K2 = _mm_set_epi64x(
177177
KnConstant(64 - 4, Polynomial), KnConstant(64 + 4, Polynomial));
178178

179179
const __m128i MulLo0 = _mm_clmulepi64_si128(CRCVec0, K1K2, 0b0000'0000);
@@ -202,7 +202,7 @@ std::uint32_t
202202
}
203203

204204
// Reduce 512 to 128
205-
static const __m128i K3K4 = _mm_set_epi64x(
205+
const __m128i K3K4 = _mm_set_epi64x(
206206
KnConstant(16 - 4, Polynomial), KnConstant(16 + 4, Polynomial));
207207

208208
// Reduce Vec1 into Vec0
@@ -239,7 +239,7 @@ std::uint32_t
239239
}
240240

241241
// Reduce 128 to 64
242-
static const __m128i Lo32Mask64 = _mm_set1_epi64x(0xFFFFFFFF);
242+
const __m128i Lo32Mask64 = _mm_set1_epi64x(0xFFFFFFFF);
243243
{
244244
const __m128i MulHiLo
245245
= _mm_clmulepi64_si128(CRCVec0, K3K4, 0b0001'0000);
@@ -248,8 +248,7 @@ std::uint32_t
248248

249249
CRCVec0 = _mm_xor_si128(Upper64, MulHiLo);
250250

251-
static const __m128i K5K0
252-
= _mm_cvtsi64_si128(KnConstant(8, Polynomial));
251+
const __m128i K5K0 = _mm_cvtsi64_si128(KnConstant(8, Polynomial));
253252

254253
const __m128i Upper96 = _mm_srli_si128(CRCVec0, 4);
255254

@@ -262,7 +261,7 @@ std::uint32_t
262261

263262
// Reduce 64 to 32
264263
{
265-
static const __m128i Poly = _mm_set_epi64x(
264+
const __m128i Poly = _mm_set_epi64x(
266265
MuConstant(Polynomial), KnConstant(4, Polynomial) | 1);
267266

268267
__m128i Trunc32 = _mm_and_si128(CRCVec0, Lo32Mask64);

0 commit comments

Comments
 (0)