#include #include #include "testcode.h" /* This code has 1,500,000 total branches */ /* 500,000 not-taken conditional branches */ /* 500,000 taken conditional branches */ /* 500,000 unconditional branches */ int branches_testcode(void) { #if defined(__i386__) || (defined __x86_64__) asm( "\txor %%ecx,%%ecx\n" "\tmov $500000,%%ecx\n" "test_loop:\n" "\tjmp test_jmp\n" "\tnop\n" "test_jmp:\n" "\txor %%eax,%%eax\n" "\tjnz test_jmp2\n" "\tinc %%eax\n" "test_jmp2:\n" "\tdec %%ecx\n" "\tjnz test_loop\n" : /* no output registers */ : /* no inputs */ : "cc", "%ecx", "%eax" /* clobbered */ ); return 0; #elif defined(__arm__) /* Initial code contributed by sam wang linux.swang _at_ gmail.com */ asm( "\teor r3,r3,r3\n" "\tldr r3,=500000\n" "test_loop:\n" "\tB test_jmp\n" "\tnop\n" "test_jmp:\n" "\teor r2,r2,r2\n" "\tcmp r2,#1\n" "\tbge test_jmp2\n" "\tnop\n" "\tadd r2,r2,#1\n" "test_jmp2:\n" "\tsub r3,r3,#1\n" "\tcmp r3,#1\n" "\tbgt test_loop\n" : /* no output registers */ : /* no inputs */ : "cc", "r2", "r3" /* clobbered */ ); return 0; #elif defined(__aarch64__) asm( "\teor x3,x3,x3\n" "\tldr x3,=500000\n" "test_loop:\n" "\tB test_jmp\n" "\tnop\n" "test_jmp:\n" "\teor x2,x2,x2\n" "\tcmp x2,#1\n" "\tbge test_jmp2\n" "\tnop\n" "\tadd x2,x2,#1\n" "test_jmp2:\n" "\tsub x3,x3,#1\n" "\tcmp x3,#1\n" "\tbgt test_loop\n" : /* no output registers */ : /* no inputs */ : "cc", "x2", "x3" /* clobbered */ ); return 0; #elif defined(__powerpc__) /* Not really optimized */ asm( "\txor 3,3,3\n" "\tlis 3,500000@ha\n" "\taddi 3,3,500000@l\n" "test_loop:\n" "\tb test_jmp\n" "\tnop\n" "test_jmp:\n" "\txor 4,4,4\n" "\tcmpwi cr0,4,1\n" "\tbge test_jmp2\n" "\tnop\n" "\taddi 4,4,1\n" "test_jmp2:\n" "\taddi 3,3,-1\n" "\tcmpwi cr0,3,1\n" "\tbgt test_loop\n" : /* no output registers */ : /* no inputs */ : "cr0", "r3", "r4" /* clobbered */ ); return 0; #endif return -1; } int random_branches_testcode(int number, int quiet) { int j,junk=0; double junk2=5.0; for(j=0;j>2)^(random()>>4)) %1000)>500) goto label_false; junk++; /* can't just add, the optimizer is way too clever */ junk2*=junk; //printf("T"); label_false: //printf("F"); ; } if (!quiet) printf("%lf\n",junk2); return junk; }