1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-18 10:10:23 +02:00

Add some nop and jmp tests, and fix a hazard with jmpi/calli

This commit is contained in:
Andy Wingo 2019-03-26 16:28:38 +01:00
parent 8a8273c45c
commit 281cca514f
4 changed files with 92 additions and 10 deletions

View file

@ -2638,18 +2638,19 @@ callr(jit_state_t *_jit, int32_t r0)
static void
calli(jit_state_t *_jit, jit_word_t i0)
{
if (__X64)
ptrdiff_t rel32 = i0 - (_jit->pc.w + 4);
if (INT32_MIN <= rel32 && rel32 <= INT32_MAX)
{
ic(_jit, 0xe8);
ii(_jit, rel32);
}
else
{
int32_t reg = get_temp_gpr(_jit);
jit_patch_there(_jit, mov_addr(_jit, rn(reg)), (void*)i0);
callr(_jit, rn(reg));
unget_temp_gpr(_jit);
}
else
{
ic(_jit, 0xe8);
ii(_jit, i0 - (_jit->pc.w + 4));
}
}
static void
@ -2663,10 +2664,19 @@ jmpr(jit_state_t *_jit, int32_t r0)
static void
jmpi(jit_state_t *_jit, jit_word_t i0)
{
jit_word_t w;
ptrdiff_t rel32 = i0 - (_jit->pc.w + 4);
if (INT32_MIN <= rel32 && rel32 <= INT32_MAX)
{
ic(_jit, 0xe9);
w = i0 - (_jit->pc.w + 4);
ii(_jit, w);
ii(_jit, rel32);
}
else
{
int32_t reg = get_temp_gpr(_jit);
jit_patch_there(_jit, mov_addr(_jit, rn(reg)), (void*)i0);
jmpr(_jit, rn(reg));
unget_temp_gpr(_jit);
}
}
static jit_reloc_t

21
tests/jmpi.c Normal file
View file

@ -0,0 +1,21 @@
#include "test.h"
static int tail(void) { return 42; }
static void
run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
{
jit_begin(j, arena_base, arena_size);
jit_jmpi(j, tail);
int (*f)(void) = jit_end(j, NULL);
ASSERT(f() == 42);
}
int
main (int argc, char *argv[])
{
return main_helper(argc, argv, run_test);
}

27
tests/jmpr.c Normal file
View file

@ -0,0 +1,27 @@
#include "test.h"
static int tail(void) { return 42; }
static void
run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
{
jit_begin(j, arena_base, arena_size);
const jit_arg_abi_t abi[] = { JIT_ARG_ABI_POINTER };
jit_arg_t args[1];
const jit_anyreg_t regs[] = { { .gpr=JIT_R0 } };
jit_receive(j, 1, abi, args);
jit_load_args(j, 1, abi, args, regs);
jit_jmpr(j, JIT_R0);
int (*f)(void*) = jit_end(j, NULL);
ASSERT(f(tail) == 42);
}
int
main (int argc, char *argv[])
{
return main_helper(argc, argv, run_test);
}

24
tests/nop.c Normal file
View file

@ -0,0 +1,24 @@
#include "test.h"
static void
run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
{
jit_begin(j, arena_base, arena_size);
size_t total = 0;
char *start = jit_address(j);
for (size_t i = 1; i < 10; total += i, i++)
jit_nop(j, i);
char *end = jit_address(j);
ASSERT(end - start == total);
jit_reti(j, 42);
intmax_t (*f)(void) = jit_end(j, NULL);
ASSERT(f() == 42);
}
int
main (int argc, char *argv[])
{
return main_helper(argc, argv, run_test);
}