| /////////////////////////////////////////////////////////////////////////////// | |
| // | |
| /// \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 -c bcj_test.c | |
| /// Don't optimize or strip. | |
| // | |
| // Author: Lasse Collin | |
| // | |
| // This file has been put into the public domain. | |
| // You can do whatever you want with this file. | |
| // | |
| /////////////////////////////////////////////////////////////////////////////// | |
| 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; | |
| } |