jweinst1
4/15/2020 - 10:03 AM

Uses intel's SSE2 related instructions to vectorize char filtering.

Uses intel's SSE2 related instructions to vectorize char filtering.

#include <immintrin.h>


static int filter_below_3(const char* src, char* dst) {
    __m128i values = _mm_loadu_si128((const __m128i*)src);
    __m128i tocmp =  _mm_set1_epi8('3');
    __m128i results =  _mm_cmpgt_epi8(values, tocmp);
    // conditionally moves chars to dst.
    _mm_maskmoveu_si128(values, results, dst);
    // converts the result vector into a boolean value.
    return _mm_movemask_epi8(results);
}


int main(int argc, char const* argv[])
{
    const char TESTCH[] = "12345678";
    char res[9] = {0};
    puts("Filtering Test");
    int did_some_pass = filter_below_3(TESTCH, res);
    if(!did_some_pass) {
        printf("Nothing above 3!\n");
        return 1;
    }
    res[8] = '\n';
    printf("Got the result %c%c%c%c%c%c%c\n", res[0], res[1], res[2], res[3], res[5], res[6], res[7]);
    // Got the result    4678
    return 0;
}