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