[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 02/02: Add support for labels, and fix a bug in uadd/imm
From: |
Andy Wingo |
Subject: |
[Guile-commits] 02/02: Add support for labels, and fix a bug in uadd/imm and usub/imm. |
Date: |
Mon, 20 Aug 2018 09:39:43 -0400 (EDT) |
wingo pushed a commit to branch lightning
in repository guile.
commit 77695612f47e280779c79b8ab6831995a715a91c
Author: Andy Wingo <address@hidden>
Date: Mon Aug 20 15:35:47 2018 +0200
Add support for labels, and fix a bug in uadd/imm and usub/imm.
* libguile/jit.c (add_inter_instruction_patch, compile, compute_mcode):
Add support for labels.
(compile_uadd_immediate, compile_usub_immediate): Fix cases where we
were adding the wrong operand as an immediate.
---
libguile/jit.c | 23 ++++++++++++++++++-----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/libguile/jit.c b/libguile/jit.c
index 6f42ce5..ff608b4 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -52,6 +52,7 @@ struct scm_jit_state {
const uint32_t *start;
uint32_t *ip;
const uint32_t *end;
+ jit_node_t **labels;
int32_t frame_size;
uint8_t hooks_enabled;
};
@@ -811,7 +812,9 @@ static void
add_inter_instruction_patch (scm_jit_state *j, jit_node_t *label,
const uint32_t *target)
{
- abort ();
+ if (target < j->start || target >= j->end)
+ abort ();
+ jit_patch_at (label, j->labels[target - j->start]);
}
@@ -1967,11 +1970,11 @@ compile_uadd_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
{
#if SIZEOF_UINTPTR_T >= 8
emit_sp_ref_u64 (j, T0, a);
- jit_addi (T0, T0, a);
+ jit_addi (T0, T0, b);
emit_sp_set_u64 (j, dst, T0);
#else
emit_sp_ref_u64 (j, T0, T1, a);
- jit_addci (T0, T0, a);
+ jit_addci (T0, T0, b);
jit_addxi (T1, T1, 0);
emit_sp_set_u64 (j, dst, T0, T1);
#endif
@@ -1982,11 +1985,11 @@ compile_usub_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
{
#if SIZEOF_UINTPTR_T >= 8
emit_sp_ref_u64 (j, T0, a);
- jit_subi (T0, T0, a);
+ jit_subi (T0, T0, b);
emit_sp_set_u64 (j, dst, T0);
#else
emit_sp_ref_u64 (j, T0, T1, a);
- jit_subci (T0, T0, a);
+ jit_subci (T0, T0, b);
jit_subxi (T1, T1, 0);
emit_sp_set_u64 (j, dst, T0, T1);
#endif
@@ -3498,13 +3501,19 @@ compile1 (scm_jit_state *j)
static void
compile (scm_jit_state *j)
{
+ uint32_t offset;
+
jit_prolog ();
jit_tramp (entry_frame_size);
+ for (offset = 0; j->start + offset < j->end; offset++)
+ j->labels[offset] = jit_forward ();
+
j->ip = (uint32_t *) j->start;
while (j->ip < j->end)
{
fprintf (stderr, "compile %p <= %p < %p\n", j->start, j->ip, j->end);
+ jit_link (j->labels[j->ip - j->start]);
compile1 (j);
}
}
@@ -3555,6 +3564,8 @@ compute_mcode (scm_thread *thread, struct
scm_jit_function_data *data)
j->thread = thread;
j->start = (const uint32_t *) (((char *)data) + data->start);
j->end = (const uint32_t *) (((char *)data) + data->end);
+ j->labels = malloc ((j->end - j->start) * sizeof (*j->labels));
+ if (!j->labels) abort ();
if (j->start >= j->end)
abort ();
@@ -3573,6 +3584,8 @@ compute_mcode (scm_thread *thread, struct
scm_jit_function_data *data)
fprintf (stderr, "mcode: %p,+%zu\n", data->mcode, size);
}
+ free (j->labels);
+ j->labels = NULL;
jit_clear_state ();
j->jit = NULL;