xref: /openbmc/linux/tools/perf/tests/workloads/brstack.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1*a104f0eaSNamhyung Kim /* SPDX-License-Identifier: GPL-2.0 */
2*a104f0eaSNamhyung Kim #include <stdlib.h>
3*a104f0eaSNamhyung Kim #include "../tests.h"
4*a104f0eaSNamhyung Kim 
5*a104f0eaSNamhyung Kim #define BENCH_RUNS 999999
6*a104f0eaSNamhyung Kim 
7*a104f0eaSNamhyung Kim static volatile int cnt;
8*a104f0eaSNamhyung Kim 
brstack_bar(void)9*a104f0eaSNamhyung Kim static void brstack_bar(void) {
10*a104f0eaSNamhyung Kim }				/* return */
11*a104f0eaSNamhyung Kim 
brstack_foo(void)12*a104f0eaSNamhyung Kim static void brstack_foo(void) {
13*a104f0eaSNamhyung Kim 	brstack_bar();		/* call */
14*a104f0eaSNamhyung Kim }				/* return */
15*a104f0eaSNamhyung Kim 
brstack_bench(void)16*a104f0eaSNamhyung Kim static void brstack_bench(void) {
17*a104f0eaSNamhyung Kim 	void (*brstack_foo_ind)(void) = brstack_foo;
18*a104f0eaSNamhyung Kim 
19*a104f0eaSNamhyung Kim 	if ((cnt++) % 3)	/* branch (cond) */
20*a104f0eaSNamhyung Kim 		brstack_foo();	/* call */
21*a104f0eaSNamhyung Kim 	brstack_bar();		/* call */
22*a104f0eaSNamhyung Kim 	brstack_foo_ind();	/* call (ind) */
23*a104f0eaSNamhyung Kim }
24*a104f0eaSNamhyung Kim 
brstack(int argc,const char ** argv)25*a104f0eaSNamhyung Kim static int brstack(int argc, const char **argv)
26*a104f0eaSNamhyung Kim {
27*a104f0eaSNamhyung Kim 	int num_loops = BENCH_RUNS;
28*a104f0eaSNamhyung Kim 
29*a104f0eaSNamhyung Kim 	if (argc > 0)
30*a104f0eaSNamhyung Kim 		num_loops = atoi(argv[0]);
31*a104f0eaSNamhyung Kim 
32*a104f0eaSNamhyung Kim 	while (1) {
33*a104f0eaSNamhyung Kim 		if ((cnt++) > num_loops)
34*a104f0eaSNamhyung Kim 			break;
35*a104f0eaSNamhyung Kim 		brstack_bench();/* call */
36*a104f0eaSNamhyung Kim 	}			/* branch (uncond) */
37*a104f0eaSNamhyung Kim 	return 0;
38*a104f0eaSNamhyung Kim }
39*a104f0eaSNamhyung Kim 
40*a104f0eaSNamhyung Kim DEFINE_WORKLOAD(brstack);
41