| /////////////////////////////////////////////////////////////////////////////// |
| // |
| /// \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; |
| } |