1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file       bcj_test.c
4/// \brief      Source code of compress_prepared_bcj_*
5///
6/// This is a simple program that should make the compiler to generate
7/// PC-relative branches, jumps, and calls. The compiled files can then
8/// be used to test the branch conversion filters. Note that this program
9/// itself does nothing useful.
10///
11/// Compiling: gcc -std=c99 -fPIC -c bcj_test.c
12/// Don't optimize or strip.
13//
14//  Author:     Lasse Collin
15//
16//  This file has been put into the public domain.
17//  You can do whatever you want with this file.
18//
19///////////////////////////////////////////////////////////////////////////////
20
21extern int jump(int a, int b);
22
23
24extern int
25call(int a, int b)
26{
27	if (a < b)
28		a = jump(a, b);
29
30	return a;
31}
32
33
34extern int
35jump(int a, int b)
36{
37	// The loop generates conditional jump backwards.
38	while (1) {
39		if (a < b) {
40			a *= 2;
41			a += 3 * b;
42			break;
43		} else {
44			// Put enough code here to prevent JMP SHORT on x86.
45			a += b;
46			a /= 2;
47			b += b % 5;
48			a -= b / 3;
49			b = 2 * b + a - 1;
50			a *= b + a + 1;
51			b += a - 1;
52			a += b * 2 - a / 5;
53		}
54	}
55
56	return a;
57}
58
59
60int
61main(int argc, char **argv)
62{
63	int a = call(argc, argc + 1);
64	return a == 0;
65}
66