summaryrefslogtreecommitdiff
path: root/libguile/lightening
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-06-20 10:15:24 +0200
committerAndy Wingo <wingo@pobox.com>2019-06-20 10:15:24 +0200
commitacce0297ffb3662e32fbed5b1d693cd639130e64 (patch)
tree4db78696b667a702cf148f2cb5e57890c4414649 /libguile/lightening
parentaf72d01de8c64776f550205c540f9678c5dda2e5 (diff)
parent62183fb098e14ad45fc0eae727f98558812b67db (diff)
downloadguile-acce0297ffb3662e32fbed5b1d693cd639130e64.tar.gz
Merge remote-tracking branch 'lightening/master'
Diffstat (limited to 'libguile/lightening')
-rw-r--r--libguile/lightening/lightening.h4
-rw-r--r--libguile/lightening/lightening/aarch64-cpu.c16
-rw-r--r--libguile/lightening/lightening/aarch64.h1
-rw-r--r--libguile/lightening/lightening/arm-cpu.c16
-rw-r--r--libguile/lightening/lightening/arm.h1
-rw-r--r--libguile/lightening/lightening/x86-cpu.c18
-rw-r--r--libguile/lightening/lightening/x86.h1
-rw-r--r--libguile/lightening/tests/link-register.c35
8 files changed, 92 insertions, 0 deletions
diff --git a/libguile/lightening/lightening.h b/libguile/lightening/lightening.h
index 7fd96f2ae..bcf2032fa 100644
--- a/libguile/lightening/lightening.h
+++ b/libguile/lightening/lightening.h
@@ -584,6 +584,10 @@ jit_load_args_3(jit_state_t *_jit, jit_operand_t a, jit_operand_t b,
M(_G___, jmpr) \
M(_p___, jmpi) \
M(R____, jmp) \
+ \
+ M(_p___, jmpi_with_link) \
+ M(_____, pop_link_register) \
+ M(_____, push_link_register) \
\
M(_____, ret) \
M(_G___, retr) \
diff --git a/libguile/lightening/lightening/aarch64-cpu.c b/libguile/lightening/lightening/aarch64-cpu.c
index e99c69633..13aa351e9 100644
--- a/libguile/lightening/lightening/aarch64-cpu.c
+++ b/libguile/lightening/lightening/aarch64-cpu.c
@@ -2426,6 +2426,22 @@ calli(jit_state_t *_jit, jit_word_t i0)
}
static void
+jmpi_with_link(jit_state_t *_jit, jit_word_t i0)
+{
+ return calli(_jit, i0);
+}
+
+static void
+push_link_register(jit_state_t *_jit)
+{
+}
+
+static void
+pop_link_register(jit_state_t *_jit)
+{
+}
+
+static void
ret(jit_state_t *_jit)
{
RET(_jit);
diff --git a/libguile/lightening/lightening/aarch64.h b/libguile/lightening/lightening/aarch64.h
index 9aa0f0dca..5c99f6303 100644
--- a/libguile/lightening/lightening/aarch64.h
+++ b/libguile/lightening/lightening/aarch64.h
@@ -123,6 +123,7 @@
#define JIT_PLATFORM_CALLEE_SAVE_GPRS _X29, _X30
// x31 is stack pointer.
+#define JIT_LR _X30
#define JIT_SP _X31
#define JIT_F0 _D0
diff --git a/libguile/lightening/lightening/arm-cpu.c b/libguile/lightening/lightening/arm-cpu.c
index a280ca192..d96d57b2d 100644
--- a/libguile/lightening/lightening/arm-cpu.c
+++ b/libguile/lightening/lightening/arm-cpu.c
@@ -2912,6 +2912,22 @@ calli(jit_state_t *_jit, jit_word_t i0)
}
static void
+jmpi_with_link(jit_state_t *_jit, jit_word_t i0)
+{
+ jit_patch_there(_jit, T2_BLI(_jit), (void*)i0);
+}
+
+static void
+push_link_register(jit_state_t *_jit)
+{
+}
+
+static void
+pop_link_register(jit_state_t *_jit)
+{
+}
+
+static void
ret(jit_state_t *_jit)
{
T1_BX(_jit, jit_gpr_regno(_LR));
diff --git a/libguile/lightening/lightening/arm.h b/libguile/lightening/lightening/arm.h
index 47bd2c257..b18411e1e 100644
--- a/libguile/lightening/lightening/arm.h
+++ b/libguile/lightening/lightening/arm.h
@@ -105,6 +105,7 @@
#define JIT_V5 _R10
#define JIT_V6 _R11
+#define JIT_LR _R14
#define JIT_SP _R13
#define _LR _R14
#define _PC _R15
diff --git a/libguile/lightening/lightening/x86-cpu.c b/libguile/lightening/lightening/x86-cpu.c
index aa2bbdd78..d737f2625 100644
--- a/libguile/lightening/lightening/x86-cpu.c
+++ b/libguile/lightening/lightening/x86-cpu.c
@@ -2553,6 +2553,24 @@ calli(jit_state_t *_jit, jit_word_t i0)
}
static void
+jmpi_with_link(jit_state_t *_jit, jit_word_t i0)
+{
+ return calli(_jit, i0);
+}
+
+static void
+pop_link_register(jit_state_t *_jit)
+{
+ popr(_jit, jit_gpr_regno (JIT_LR));
+}
+
+static void
+push_link_register(jit_state_t *_jit)
+{
+ pushr(_jit, jit_gpr_regno (JIT_LR));
+}
+
+static void
jmpr(jit_state_t *_jit, int32_t r0)
{
rex(_jit, 0, WIDE, _NOREG, _NOREG, r0);
diff --git a/libguile/lightening/lightening/x86.h b/libguile/lightening/lightening/x86.h
index 64ee00637..983ebdb8f 100644
--- a/libguile/lightening/lightening/x86.h
+++ b/libguile/lightening/lightening/x86.h
@@ -74,6 +74,7 @@
#endif
#define JIT_SP _RSP
+#define JIT_LR JIT_TMP0
#if __X32
# define JIT_R0 _RAX
# define JIT_R1 _RCX
diff --git a/libguile/lightening/tests/link-register.c b/libguile/lightening/tests/link-register.c
new file mode 100644
index 000000000..96ee959b1
--- /dev/null
+++ b/libguile/lightening/tests/link-register.c
@@ -0,0 +1,35 @@
+#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 align = jit_enter_jit_abi(j, 0, 0, 0);
+ jit_load_args_1(j, jit_operand_gpr (JIT_OPERAND_ABI_POINTER, JIT_R0));
+
+ jit_reloc_t call_tramp = jit_jmp (j);
+
+ void *tramp = jit_address (j);
+ jit_pop_link_register (j);
+ jit_movr (j, JIT_R0, JIT_LR);
+ jit_leave_jit_abi(j, 0, 0, align);
+ jit_retr (j, JIT_R0);
+
+ jit_patch_here (j, call_tramp);
+ jit_jmpi_with_link (j, tramp);
+
+ void *expected_link = jit_address_to_function_pointer (jit_address (j));
+
+ size_t size = 0;
+ void* ret = jit_end(j, &size);
+
+ void* (*f)(void) = ret;
+
+ ASSERT(f() == expected_link);
+}
+
+int
+main (int argc, char *argv[])
+{
+ return main_helper(argc, argv, run_test);
+}