#include unsigned int rdtsc() { unsigned int eax, edx; asm volatile ("rdtsc" :"=a"(eax), "=d"(edx)); return eax; } #define N 9 #define A16(P) \ P P P P \ P P P P \ P P P P \ P P P P \ #define GEN(name, A) \ int time_##name[N]; \ int \ name(int a, int b, int n, int x) \ { \ int ret; \ unsigned int begin, end; \ int i; \ \ begin = rdtsc(); \ for (i=n-1; i>=0; i--) { \ asm volatile (A16(A) \ :::"eax", "ebx", "ecx", "edx"); \ } \ asm("xor %%eax, %%eax":::"eax"); \ asm("xor %%ebx, %%ebx":::"ebx"); \ asm("xor %%ecx, %%ecx":::"ecx"); \ asm("xor %%edx, %%edx":::"edx"); \ end = rdtsc(); \ \ asm volatile ("emms"); \ time_##name[x] = end-begin; \ \ return ret; \ } GEN(add, "add %%eax, %%ecx\n\t") GEN(mul, "imul %%ecx, %%edx\n\t") GEN(paraadd, "add %%eax, %%ebx\n\tadd %%ecx, %%edx\n\t"); GEN(paramul, "imul %%eax, %%ebx\n\timul %%ecx, %%edx\n\t") GEN(depadd, "add %%eax, %%ebx\n\tadd %%ecx, %%ebx\n\t"); GEN(empty, "#\n\t") GEN(nop, "xchg %%eax, %%eax\n\t") GEN(removedep, "add %%eax, %%ecx\n\txor %%ecx, %%ecx\n\t") GEN(addrgen, "leal 4(%%eax,%%ecx), %%eax\n\t") GEN(paraaddrgen, "leal 4(%%eax,%%ebx), %%eax\n\tleal 4(%%ecx,%%edx), %%ecx\n\t") GEN(pmadd, "paddd %%mm1, %%mm0\n\t") GEN(para_pmadd, "paddd %%mm4, %%mm5\n\tpaddd %%mm2, %%mm3\n\tpaddd %%mm1, %%mm0\n\t") GEN(para_pmaddw, "paddw %%mm4, %%mm5\n\tpaddw %%mm2, %%mm3\n\tpaddw %%mm1, %%mm0\n\t") GEN(para_pmaddw8,"paddw %%mm0, %%mm0\n\t" "paddw %%mm1, %%mm1\n\t" "paddw %%mm2, %%mm2\n\t" "paddw %%mm3, %%mm3\n\t" "paddw %%mm4, %%mm4\n\t" "paddw %%mm5, %%mm5\n\t" "paddw %%mm6, %%mm6\n\t" "paddw %%mm7, %%mm7\n\t"); GEN(incpc, "jmp 1f\n1:\n\t") GEN(nopcall, "call hoge\n\t") GEN(indirect, "movl hoge_adr, %%ecx\n\tmovl %%ecx, %%eax\n\tcall *%%eax\n\t") int time_load[N]; int load(int a, int b, int n, int x) { int ret; unsigned int begin, end; int i; int stack, stack2; begin = rdtsc(); for (i=0; i