Implement Fletcher-32 using SSSE3 instructions.

This commit is contained in:
2023-09-23 02:51:57 +01:00
parent b3ef2a3188
commit ccf605367d
5 changed files with 278 additions and 1 deletions

View File

@@ -246,3 +246,115 @@ TEST_F(fletcher32Fixture, fletcher32_neon_2352bytes)
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32_2352BYTES);
}
#endif
#if defined(__x86_64__) || defined(__amd64) || defined(_M_AMD64) || defined(_M_X64) || defined(__I386__) || \
defined(__i386__) || defined(__THW_INTEL) || defined(_M_IX86)
TEST_F(fletcher32Fixture, fletcher32_ssse3)
{
if(!have_ssse3()) return;
uint16_t sum1;
uint16_t sum2;
uint32_t fletcher32;
sum1 = 0xFFFF;
sum2 = 0xFFFF;
fletcher32_ssse3(&sum1, &sum2, buffer, 1048576);
fletcher32 = (sum2 << 16) | sum1;
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32);
}
TEST_F(fletcher32Fixture, fletcher32_ssse3_misaligned)
{
if(!have_ssse3()) return;
uint16_t sum1;
uint16_t sum2;
uint32_t fletcher32;
sum1 = 0xFFFF;
sum2 = 0xFFFF;
fletcher32_ssse3(&sum1, &sum2, buffer_misaligned+1, 1048576);
fletcher32 = (sum2 << 16) | sum1;
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32);
}
TEST_F(fletcher32Fixture, fletcher32_ssse3_15bytes)
{
if(!have_ssse3()) return;
uint16_t sum1;
uint16_t sum2;
uint32_t fletcher32;
sum1 = 0xFFFF;
sum2 = 0xFFFF;
fletcher32_ssse3(&sum1, &sum2, buffer, 15);
fletcher32 = (sum2 << 16) | sum1;
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32_15BYTES);
}
TEST_F(fletcher32Fixture, fletcher32_ssse3_31bytes)
{
if(!have_ssse3()) return;
uint16_t sum1;
uint16_t sum2;
uint32_t fletcher32;
sum1 = 0xFFFF;
sum2 = 0xFFFF;
fletcher32_ssse3(&sum1, &sum2, buffer, 31);
fletcher32 = (sum2 << 16) | sum1;
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32_31BYTES);
}
TEST_F(fletcher32Fixture, fletcher32_ssse3_63bytes)
{
if(!have_ssse3()) return;
uint16_t sum1;
uint16_t sum2;
uint32_t fletcher32;
sum1 = 0xFFFF;
sum2 = 0xFFFF;
fletcher32_ssse3(&sum1, &sum2, buffer, 63);
fletcher32 = (sum2 << 16) | sum1;
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32_63BYTES);
}
TEST_F(fletcher32Fixture, fletcher32_ssse3_2352bytes)
{
if(!have_ssse3()) return;
uint16_t sum1;
uint16_t sum2;
uint32_t fletcher32;
sum1 = 0xFFFF;
sum2 = 0xFFFF;
fletcher32_ssse3(&sum1, &sum2, buffer, 2352);
fletcher32 = (sum2 << 16) | sum1;
EXPECT_EQ(fletcher32, EXPECTED_FLETCHER32_2352BYTES);
}
#endif