67 lines
1.4 KiB
C
67 lines
1.4 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
/// \file bcj_test.c
|
|
/// \brief Source code of compress_prepared_bcj_*
|
|
///
|
|
/// This is a simple program that should make the compiler to generate
|
|
/// PC-relative branches, jumps, and calls. The compiled files can then
|
|
/// be used to test the branch conversion filters. Note that this program
|
|
/// itself does nothing useful.
|
|
///
|
|
/// Compiling: gcc -std=c99 -fPIC bcj_test.c
|
|
/// Don't optimize or strip.
|
|
//
|
|
// This code has been put into the public domain.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
extern int jump(int a, int b);
|
|
|
|
|
|
extern int
|
|
call(int a, int b)
|
|
{
|
|
if (a < b)
|
|
a = jump(a, b);
|
|
|
|
return a;
|
|
}
|
|
|
|
|
|
extern int
|
|
jump(int a, int b)
|
|
{
|
|
// The loop generates conditional jump backwards.
|
|
while (1) {
|
|
if (a < b) {
|
|
a *= 2;
|
|
a += 3 * b;
|
|
break;
|
|
} else {
|
|
// Put enough code here to prevent JMP SHORT on x86.
|
|
a += b;
|
|
a /= 2;
|
|
b += b % 5;
|
|
a -= b / 3;
|
|
b = 2 * b + a - 1;
|
|
a *= b + a + 1;
|
|
b += a - 1;
|
|
a += b * 2 - a / 5;
|
|
}
|
|
}
|
|
|
|
return a;
|
|
}
|
|
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
int a = call(argc, argc + 1);
|
|
return a == 0;
|
|
}
|