[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 67/86: Add some nop and jmp tests, and fix a hazard with
From: |
Andy Wingo |
Subject: |
[Guile-commits] 67/86: Add some nop and jmp tests, and fix a hazard with jmpi/calli |
Date: |
Wed, 3 Apr 2019 11:39:02 -0400 (EDT) |
wingo pushed a commit to branch lightening
in repository guile.
commit 281cca514f90cefde8ffafa1af0bc597afdb4fca
Author: Andy Wingo <address@hidden>
Date: Tue Mar 26 16:28:38 2019 +0100
Add some nop and jmp tests, and fix a hazard with jmpi/calli
---
jit/x86-cpu.c | 30 ++++++++++++++++++++----------
tests/jmpi.c | 21 +++++++++++++++++++++
tests/jmpr.c | 27 +++++++++++++++++++++++++++
tests/nop.c | 24 ++++++++++++++++++++++++
4 files changed, 92 insertions(+), 10 deletions(-)
diff --git a/jit/x86-cpu.c b/jit/x86-cpu.c
index 7d5a1b7..4bc5e38 100644
--- a/jit/x86-cpu.c
+++ b/jit/x86-cpu.c
@@ -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;
- ic(_jit, 0xe9);
- w = i0 - (_jit->pc.w + 4);
- ii(_jit, w);
+ ptrdiff_t rel32 = i0 - (_jit->pc.w + 4);
+ if (INT32_MIN <= rel32 && rel32 <= INT32_MAX)
+ {
+ ic(_jit, 0xe9);
+ 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
diff --git a/tests/jmpi.c b/tests/jmpi.c
new file mode 100644
index 0000000..2f9213f
--- /dev/null
+++ b/tests/jmpi.c
@@ -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);
+}
diff --git a/tests/jmpr.c b/tests/jmpr.c
new file mode 100644
index 0000000..32a7717
--- /dev/null
+++ b/tests/jmpr.c
@@ -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);
+}
diff --git a/tests/nop.c b/tests/nop.c
new file mode 100644
index 0000000..16c5c8a
--- /dev/null
+++ b/tests/nop.c
@@ -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);
+}
- [Guile-commits] 63/86: Add unordered float compare-and-branch tests, (continued)
- [Guile-commits] 63/86: Add unordered float compare-and-branch tests, Andy Wingo, 2019/04/03
- [Guile-commits] 53/86: Add stxr tests, Andy Wingo, 2019/04/03
- [Guile-commits] 56/86: Tweak test build to run faster, and adapt CI, Andy Wingo, 2019/04/03
- [Guile-commits] 40/86: Add bitops tests, Andy Wingo, 2019/04/03
- [Guile-commits] 78/86: Clean up stack after calls, Andy Wingo, 2019/04/03
- [Guile-commits] 75/86: get_temp_{gpr, xpr} returns a jit_{gpr, fpr}_t, Andy Wingo, 2019/04/03
- [Guile-commits] 66/86: Add sub-and-branch-on-overflow tests, Andy Wingo, 2019/04/03
- [Guile-commits] 73/86: Add movi_[df] tests, Andy Wingo, 2019/04/03
- [Guile-commits] 64/86: Add flag-checking test-and-branch tests, Andy Wingo, 2019/04/03
- [Guile-commits] 69/86: Add abs/sqrt tests, Andy Wingo, 2019/04/03
- [Guile-commits] 67/86: Add some nop and jmp tests, and fix a hazard with jmpi/calli,
Andy Wingo <=
- [Guile-commits] 62/86: Add anti-float comparison tests, Andy Wingo, 2019/04/03
- [Guile-commits] 51/86: Add str tests, Andy Wingo, 2019/04/03
- [Guile-commits] 58/86: Add bltr test, Andy Wingo, 2019/04/03
- [Guile-commits] 65/86: Add add-and-branch-on-overflow tests, Andy Wingo, 2019/04/03
- [Guile-commits] 59/86: Add more integer reg/reg branch-and-compare tests, Andy Wingo, 2019/04/03
- [Guile-commits] 80/86: Add subdir-objects option to libguile makefile., Andy Wingo, 2019/04/03
- [Guile-commits] 82/86: Merge in changes from upstream lightening, Andy Wingo, 2019/04/03
- [Guile-commits] 68/86: Add push/pop test, Andy Wingo, 2019/04/03
- [Guile-commits] 70/86: Add truncr_[df]_[li] tests, Andy Wingo, 2019/04/03
- [Guile-commits] 72/86: Add int->float tests, Andy Wingo, 2019/04/03