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