#include <stdio.h>
typedef char chars[1000000];
chars t, a, ta;
long long rdtsc();
__asm ("rdtsc:pusha;cpuid;popa;rdtsc;ret;");
void fun1() {
memset(a, 3, 1000000);
}
void fun2() {
int i;
for (i=0; i<sizeof(a)/4; i++) ((int*)a)[i]=0x03030303;
}
void fun3() {
__asm volatile(
"cld;rep stosb":
:
"c"(sizeof(a)),
"a"(3),
"D"(a)
);
}
void fun4() {
__asm volatile(
"cld;rep stosl":
:
"c"(sizeof(a)/4),
"a"(0x03030303),
"D"(a)
);
}
int main() {
long long t;
int i;
#if 1
for (i=0; i<110; i++) {
t = rdtsc();
fun1();
printf ("%8lld", rdtsc()-t);
t = rdtsc();
fun2();
printf ("%8lld", rdtsc()-t);
t = rdtsc();
fun3();
printf ("%8lld", rdtsc()-t);
t = rdtsc();
fun4();
printf ("%8lld\n", rdtsc()-t);
}
#else
for (i=0; i<sizeof(a)-1; i++)
b[i] = 1;
b[i] = 0;
fun4();
return strcmp(a, b);
#endif
return 0;
}