[simd] Enable ksearch for (non-range) GlyphID search

This commit is contained in:
Behdad Esfahbod 2019-12-09 22:35:02 -06:00
parent 38c84b2246
commit bc25a5694c
2 changed files with 68 additions and 6 deletions

View File

@ -347,7 +347,49 @@ struct hb_sorted_array_t :
} }
#ifndef HB_NO_SIMD #ifndef HB_NO_SIMD
template <typename U = Type, template <typename U = Type,
hb_enable_if (hb_is_same (hb_decay<U>, OT::RangeRecord))> hb_enable_if (hb_is_same (hb_decay<U>, OT::HBGlyphID))>
bool bsearch_impl (hb_codepoint_t x, unsigned *pos, hb_priority<1>) const
{
#ifdef HB_SIMD_VERIFY
unsigned p0;
bool f0 = hb_bsearch_impl (&p0,
x,
this->arrayZ,
this->length,
sizeof (Type),
_hb_cmp_method<hb_codepoint_t, Type>);
unsigned p1;
bool f1 = hb_simd_ksearch_glyphid (&p1,
x,
this->arrayZ,
this->length,
sizeof (Type));
if (f0 != f1 || p0 != p1)
{
fprintf (stderr, "FAILED: Searching for %d; expected %d @ %d; got %d @ %d\n",
x, f0, p0, f1, p1);
for (unsigned i = 0; i < this->length; i++)
printf ("Glyph %d: %d\n", i,
(unsigned) this->arrayZ[i]);
}
#endif
#if 0
if (likely (this->length < 81))
return hb_bsearch_impl (pos,
x,
this->arrayZ,
this->length,
sizeof (Type),
_hb_cmp_method<hb_codepoint_t, Type>);
#endif
return hb_simd_ksearch_glyphid (pos,
x,
this->arrayZ,
this->length,
sizeof (Type));
}
template <typename U = Type,
hb_enable_if (hb_is_same (hb_decay<U>, OT::RangeRecord) && false)>
bool bsearch_impl (hb_codepoint_t x, unsigned *pos, hb_priority<1>) const bool bsearch_impl (hb_codepoint_t x, unsigned *pos, hb_priority<1>) const
{ {
#ifdef HB_SIMD_VERIFY #ifdef HB_SIMD_VERIFY

View File

@ -201,12 +201,14 @@
/* TODO: Test -mvzeroupper. */ /* TODO: Test -mvzeroupper. */
template <bool is_range = false>
static inline bool static inline bool
hb_simd_ksearch_glyphid_range (unsigned *pos, /* Out */ hb_simd_ksearch_glyphid (unsigned *pos, /* Out */
hb_codepoint_t k, hb_codepoint_t k,
const void *base, const void *base,
size_t length, size_t length,
size_t stride) size_t stride)
{ {
if (unlikely (k & ~0xFFFF)) if (unlikely (k & ~0xFFFF))
{ {
@ -259,6 +261,14 @@ hb_simd_ksearch_glyphid_range (unsigned *pos, /* Out */
0x0607,0x0405,0x0203,0x0001); 0x0607,0x0405,0x0203,0x0001);
V = _mm256_shuffle_epi8 (V, bswap16_shuffle); V = _mm256_shuffle_epi8 (V, bswap16_shuffle);
#endif #endif
if (!is_range)
{
static const __m256i dup_shuffle = _mm256_set_epi16 (0x0D0C,0x0D0C,0x0908,0x0908,
0x0504,0x0504,0x0100,0x0100,
0x0D0C,0x0D0C,0x0908,0x0908,
0x0504,0x0504,0x0100,0x0100);
V = _mm256_shuffle_epi8 (V, dup_shuffle);
}
V = _mm256_add_epi16 (V, __32768x16); V = _mm256_add_epi16 (V, __32768x16);
/* Compare and locate. */ /* Compare and locate. */
@ -278,6 +288,16 @@ hb_simd_ksearch_glyphid_range (unsigned *pos, /* Out */
return false; return false;
} }
static inline bool
hb_simd_ksearch_glyphid_range (unsigned *pos, /* Out */
hb_codepoint_t k,
const void *base,
size_t length,
size_t stride)
{
return hb_simd_ksearch_glyphid<true> (pos, k, base, length, stride);
}
#elif !defined(HB_NO_SIMD) #elif !defined(HB_NO_SIMD)
#define HB_NO_SIMD #define HB_NO_SIMD