Blame src/validation_tests/branches_testcode.c

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