Skip to content

Instantly share code, notes, and snippets.

@GeorgyFirsov
Forked from imasahiro/gist:981138
Created September 28, 2021 14:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GeorgyFirsov/eeea00d493355246541a279d28ab7f13 to your computer and use it in GitHub Desktop.
Save GeorgyFirsov/eeea00d493355246541a279d28ab7f13 to your computer and use it in GitHub Desktop.
SIMD memset
#ifdef __SSE__
#include <emmintrin.h>
static void __memset(void *ptr, int c, size_t len)
{
int i;
register char *p = (char *) ptr;
for (i = 0; i < len; i++) {
p[i] = c;
}
}
void mymemset(void *ptr, int v, size_t len)
{
register size_t i;
size_t loff = ((intptr_t) ptr) % 16;
size_t l16 = (len - loff) / 16;
size_t lrem = len - l16 * 16 - loff;
register char *p = (char *) ptr;
char c = (char) v;
__m128i c16 = _mm_set_epi8(c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c);
__memset(p, c, loff);
p += loff;
for (i = 0; i < l16; ++i) {
_mm_store_si128((__m128i*)p, c16);
p += 16;
}
__memset(p, c, lrem);
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment