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;
}