Skip to content

Instantly share code, notes, and snippets.

@mmalecki
Created August 23, 2011 16:57
Show Gist options
  • Save mmalecki/1165847 to your computer and use it in GitHub Desktop.
Save mmalecki/1165847 to your computer and use it in GitHub Desktop.
memset
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void* memset1(void* mem, int value, size_t num) {
char* m = mem;
char v = value;
while (num-- != 0)
*(m + num) = v;
return mem;
}
void* memset2(void* mem, int value, size_t num) {
int* m = mem;
char c;
char* mc;
for (; num >= 4; num -= 4)
*(m + num) = value;
if (num != 0) {
c = value;
mc = m + num;
while (num--)
*(mc + num) = 0;
}
return mem;
}
void* memset_sse(void* mem, int value, size_t num) {
value = value | (value << 8);
for (; num >= 16; num -= 16) {
asm(
"movd %0, %%xmm0 \n\t"
"movdqu %%xmm0, 0(%1) \n\t"
: : "r" (value), "r" (mem));
}
}
void* memset_asm(void* ptr, int value, size_t num) {
asm("rep stosl;" : : "a"(value | (value << 8) | (value << 16) | (value << 24)), "D" ((size_t) ptr), "c" (num / 4));
asm("rep stosb;" : : "a"(value), "D" (((size_t) ptr) + ((num / 4) * 4)),
"c" (num - ((num / 4) * 4)));
}
int main(int argc, char** argv) {
unsigned int i, e = 1024, sz = 1024 * 1024;
clock_t start, stop;
char* mem = (char*) malloc(sz);
start = clock();
for (i = 0; i < e; i++) {
memset(mem, 64, sz);
}
stop = clock();
printf("Standard memset: %f\n", ((double) stop - start) / CLOCKS_PER_SEC);
memset(mem, 0, sz);
start = clock();
for (i = 0; i < e; i++) {
memset1(mem, 61, sz);
}
stop = clock();
printf("Int memset: %f\n", ((double) stop - start) / CLOCKS_PER_SEC);
for (i = 0; i < sz; i++) {
if (*(mem + i) != 61) {
printf("Failed at %i!\n", i);
break;
}
}
memset(mem, 0, sz);
start = clock();
for (i = 0; i < e; i++) {
memset_asm(mem, 61, sz);
}
stop = clock();
printf("SSE memset: %f\n", ((double) stop - start) / CLOCKS_PER_SEC);
for (i = 0; i < sz; i++) {
if (*(mem + i) != 61) {
printf("Failed at %i (%x)!\n", i, *(mem + i));
break;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment