initial SSE/AVX2 implementation

This commit is contained in:
Konstantinos Margaritis
2021-09-20 23:52:31 +03:00
committed by Konstantinos Margaritis
parent e5e2057ca9
commit e7161fdfec
5 changed files with 595 additions and 438 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -217,15 +217,63 @@ public:
SuperVector pshufb(SuperVector b);
SuperVector pshufb_maskz(SuperVector b, uint8_t const len);
SuperVector lshift64(uint8_t const N);
SuperVector rshift64(uint8_t const N);
SuperVector lshift128(uint8_t const N);
SuperVector rshift128(uint8_t const N);
SuperVector lshift128_var(uint8_t const N) const;
SuperVector rshift128_var(uint8_t const N) const;
// Shift instructions
template<uint8_t N>
SuperVector vshl_8_imm() const;
template<uint8_t N>
SuperVector vshl_16_imm() const;
template<uint8_t N>
SuperVector vshl_32_imm() const;
template<uint8_t N>
SuperVector vshl_64_imm() const;
template<uint8_t N>
SuperVector vshl_128_imm() const;
#if defined(HAVE_SIMD_256_BITS)
template<uint8_t N>
SuperVector vshl_256_imm() const;
#endif
template<uint8_t N>
SuperVector vshl_imm() const;
template<uint8_t N>
SuperVector vshr_8_imm() const;
template<uint8_t N>
SuperVector vshr_16_imm() const;
template<uint8_t N>
SuperVector vshr_32_imm() const;
template<uint8_t N>
SuperVector vshr_64_imm() const;
template<uint8_t N>
SuperVector vshr_128_imm() const;
#if defined(HAVE_SIMD_256_BITS)
template<uint8_t N>
SuperVector vshr_256_imm() const;
#endif
template<uint8_t N>
SuperVector vshr_imm() const;
SuperVector vshl_8 (uint8_t const N) const;
SuperVector vshl_16 (uint8_t const N) const;
SuperVector vshl_32 (uint8_t const N) const;
SuperVector vshl_64 (uint8_t const N) const;
SuperVector vshl_128(uint8_t const N) const;
#if defined(HAVE_SIMD_256_BITS)
SuperVector vshl_256(uint8_t const N) const;
#endif
SuperVector vshl (uint8_t const N) const;
SuperVector vshr_8 (uint8_t const N) const;
SuperVector vshr_16 (uint8_t const N) const;
SuperVector vshr_32 (uint8_t const N) const;
SuperVector vshr_64 (uint8_t const N) const;
SuperVector vshr_128(uint8_t const N) const;
#if defined(HAVE_SIMD_256_BITS)
SuperVector vshr_256(uint8_t const N) const;
#endif
SuperVector vshr (uint8_t const N) const;
// Constants
static SuperVector Ones();
static SuperVector Ones_vshr(uint8_t const N);
static SuperVector Ones_vshl(uint8_t const N);
static SuperVector Zeroes();
#if defined(DEBUG)
@@ -264,6 +312,25 @@ public:
#endif
};
template <std::size_t Begin, std::size_t End>
struct Unroller
{
template<typename Action>
static void iterator(Action &&action)
{
action(std::integral_constant<int, Begin>());
Unroller<Begin + 1, End>::iterator(action);
}
};
template <std::size_t End>
struct Unroller<End, End>
{
template<typename Action>
static void iterator(Action &&action UNUSED)
{}
};
#if defined(HS_OPTIMIZE)
#if defined(ARCH_IA32) || defined(ARCH_X86_64)
#include "util/supervector/arch/x86/impl.cpp"