mirror of
https://github.com/azahar-emu/mcl
synced 2025-11-07 15:40:07 +01:00
mcl: hmap: x64 implementation
This commit is contained in:
parent
fa6ff746ae
commit
689f393f74
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
#if defined(MCL_ARCHITECTURE_ARM64)
|
#if defined(MCL_ARCHITECTURE_ARM64)
|
||||||
# include <arm_neon.h>
|
# include <arm_neon.h>
|
||||||
|
#elif defined(MCL_ARCHITECTURE_X86_64)
|
||||||
|
# include <emmintrin.h>
|
||||||
#else
|
#else
|
||||||
# include <array>
|
# include <array>
|
||||||
# include <cstring>
|
# include <cstring>
|
||||||
@ -101,6 +103,44 @@ struct meta_byte_group {
|
|||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(MCL_ARCHITECTURE_X86_64)
|
||||||
|
|
||||||
|
struct meta_byte_group {
|
||||||
|
meta_byte_group(meta_byte* ptr)
|
||||||
|
: data{_mm_load_si128(reinterpret_cast<__m128i const*>(ptr))}
|
||||||
|
{}
|
||||||
|
|
||||||
|
u16 match(meta_byte cmp)
|
||||||
|
{
|
||||||
|
return _mm_movemask_epi8(_mm_cmpeq_epi8(data, _mm_set1_epi8(static_cast<u8>(cmp))));
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 match_empty_or_tombstone()
|
||||||
|
{
|
||||||
|
return _mm_movemask_epi8(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_any_empty()
|
||||||
|
{
|
||||||
|
return match(meta_byte::empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_all_empty_or_tombstone()
|
||||||
|
{
|
||||||
|
return match_empty_or_tombstone() == 0xffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
__m128i data;
|
||||||
|
};
|
||||||
|
|
||||||
|
# define MCL_HMAP_MATCH_META_BYTE_GROUP(MATCH, ...) \
|
||||||
|
{ \
|
||||||
|
for (const u64 match_result{MATCH}; match_result != 0; match_result &= match_result - 1) { \
|
||||||
|
const size_t match_index{static_cast<size_t>(std::countr_zero(match_result))}; \
|
||||||
|
__VA_ARGS__ \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
struct meta_byte_group {
|
struct meta_byte_group {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user