diff options
author | Kimplul <kimi.h.kuparinen@gmail.com> | 2025-09-19 16:56:32 +0300 |
---|---|---|
committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2025-09-19 16:56:32 +0300 |
commit | d567612fd6344204c6c8438b8fe7fe7dbd54d924 (patch) | |
tree | af8f09821c108718e8659a391aa1f12762d4fba8 /tests/z_double_label.c | |
parent | 798c891dc6ed0016810f7363bc5914764d3c0fc7 (diff) | |
download | ejit-d567612fd6344204c6c8438b8fe7fe7dbd54d924.tar.gz ejit-d567612fd6344204c6c8438b8fe7fe7dbd54d924.zip |
Diffstat (limited to 'tests/z_double_label.c')
-rw-r--r-- | tests/z_double_label.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/z_double_label.c b/tests/z_double_label.c new file mode 100644 index 0000000..4817d8c --- /dev/null +++ b/tests/z_double_label.c @@ -0,0 +1,38 @@ +#include <ejit/ejit.h> +#include <assert.h> +#include "do_jit.h" + +int main(int argc, char *argv[]) +{ + (void)argv; + bool do_jit = argc > 1; + struct ejit_func *f = ejit_create_func(EJIT_INT32, 0, NULL); + ejit_movi(f, EJIT_GPR(0), 0); + + struct ejit_reloc l1 = ejit_jmp(f); + struct ejit_label mid = ejit_label(f); + struct ejit_reloc l2 = ejit_jmp(f); + + /* patch relocs to same address with two separate labels. */ + ejit_patch(f, l1, ejit_label(f)); + ejit_patch(f, l2, ejit_label(f)); + + /* we came from the first jump, jump to the end */ + struct ejit_reloc end = ejit_beqi(f, EJIT_GPR(0), 1); + + /* set r0 to 1 to indicate that we've done the first jump */ + ejit_movi(f, EJIT_GPR(0), 1); + + /* jump in between the two jumps */ + ejit_patch(f, ejit_jmp(f), mid); + + ejit_patch(f, end, ejit_label(f)); + ejit_reti(f, 0); + + + ejit_select_compile_func(f, 1, 0, false, do_jit, true); + + assert(ejit_run_func_i(f, 0, NULL) == 0); + + ejit_destroy_func(f); +} |