inline static void cycle_bench(int start) { static volatile unsigned int start_cycle; if (start) { asm volatile ("pushl %%edx \n\t" "rdtsc \n\t" "movl %%eax,%0 \n\t" "cld \n\t" "popl %%edx \n\t" "nop \n\t" "nop \n\t" "nop \n\t" "nop \n\t" "nop \n\t" "nop \n\t" "nop \n\t" "nop \n\t" : "=m" (start_cycle) : : "eax", "edx"); } else { volatile int end; asm volatile ("pushl %%edx \n\t" "clc \n\t" "rdtsc \n\t" "movl %%eax, %0 \n\t" "popl %%edx \n\t" : "=m" (end) : : "eax", "edx"); printf("Cycle count = %u\n", end - start_cycle - 68); } } #if 0 // seems linux doesnt allow user progs to exec rdpcm.. inline static void cache_bench(int start) { static int start_cycle; if (start) { asm volatile( "movl $1,%%ecx \n\t" "rdpmc \n\t" "movl %%eax,%0 \n\t" : "=m" (start_cycle)); } else { int end; asm volatile( "movl $1,%%ecx \n\t" "rdpmc \n\t" "movl %%eax,%0" : "=m" (end)); printf("Cache reloads counted = %i\n", end - start_cycle); } } #endif