From 1a38414369cb006a5e31063cd08b1dfb46b49b26 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 22 Oct 2022 09:36:39 +0100 Subject: [PATCH] Implement signal disconnection in interpreter --- src/jit/jit-dump.c | 3 ++- src/jit/jit-exits.c | 13 +++++++++++++ src/jit/jit-interp.c | 21 +-------------------- src/jit/jit-irgen.c | 36 ++++++++++++++++++++++++++++++++---- src/jit/jit-priv.h | 1 + 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/jit/jit-dump.c b/src/jit/jit-dump.c index 85043350..757b6e6b 100644 --- a/src/jit/jit-dump.c +++ b/src/jit/jit-dump.c @@ -66,7 +66,8 @@ const char *jit_exit_name(jit_exit_t exit) "TEST_ACTIVE", "SCHED_EVENT", "FILE_OPEN", "FILE_CLOSE", "FILE_READ", "FILE_WRITE", "ENDFILE", "STRCONVI", "STRCONVR", "CANON_VALUE", "DEBUG_OUT", "ALIAS_SIGNAL", "MAP_SIGNAL", - "MAP_CONST", "RESOLVE_SIGNAL", "LAST_EVENT", "LAST_ACTIVE" + "MAP_CONST", "RESOLVE_SIGNAL", "LAST_EVENT", "LAST_ACTIVE", + "DISCONNECT", }; assert(exit < ARRAY_LEN(names)); return names[exit]; diff --git a/src/jit/jit-exits.c b/src/jit/jit-exits.c index b314d0c4..a8022155 100644 --- a/src/jit/jit-exits.c +++ b/src/jit/jit-exits.c @@ -518,6 +518,19 @@ void __nvc_do_exit(jit_exit_t which, jit_scalar_t *args) args[2].integer = u.dims[0].length; } break; + + case JIT_EXIT_DISCONNECT: + { + sig_shared_t *shared = args[0].pointer; + int32_t offset = args[1].integer; + int32_t count = args[2].integer; + int64_t reject = args[3].integer; + int64_t after = args[4].integer; + + x_disconnect(shared, offset, count, after, reject); + } + break; + default: fatal_trace("unhandled exit %s", jit_exit_name(which)); } diff --git a/src/jit/jit-interp.c b/src/jit/jit-interp.c index 8c813ec8..787f093a 100644 --- a/src/jit/jit-interp.c +++ b/src/jit/jit-interp.c @@ -980,21 +980,6 @@ static void interp_string_to_real(jit_interp_t *state) state->nargs = 1; } -static void interp_int_to_string(jit_interp_t *state) -{ - int64_t value = state->args[0].integer; - - char *buf = mspace_alloc(state->mspace, 20); - if (buf == NULL) - return; - - ffi_uarray_t u = x_int_to_string(value, buf, 20); - state->args[0].pointer = u.ptr; - state->args[1].integer = u.dims[0].left; - state->args[2].integer = u.dims[0].length; - state->nargs = 3; -} - static void interp_real_to_string(jit_interp_t *state) { double value = state->args[0].real; @@ -1140,10 +1125,6 @@ static void interp_exit(jit_interp_t *state, jit_ir_t *ir) interp_assert_fail(state); break; - case JIT_EXIT_INT_TO_STRING: - interp_int_to_string(state); - break; - case JIT_EXIT_REAL_TO_STRING: interp_real_to_string(state); break; @@ -1245,7 +1226,7 @@ static void interp_exit(jit_interp_t *state, jit_ir_t *ir) break; default: - fatal_trace("cannot interpret exit %s", jit_exit_name(ir->arg1.exit)); + __nvc_do_exit(ir->arg1.exit, state->args); } } diff --git a/src/jit/jit-irgen.c b/src/jit/jit-irgen.c index 468db01b..9ff453c9 100644 --- a/src/jit/jit-irgen.c +++ b/src/jit/jit-irgen.c @@ -2709,9 +2709,13 @@ static void irgen_op_resolved(jit_irgen_t *g, int op) jit_value_t data_ptr = irgen_lea(g, jit_addr_from_value(shared, 8)); - // XXX: scale by type size??? + vcode_reg_t result = vcode_get_result(op); + vcode_type_t vtype = vtype_pointed(vcode_reg_type(result)); + + const int scale = irgen_size_bytes(vtype); + jit_value_t scaled = j_mul(g, offset, jit_value_from_int64(scale)); - g->map[vcode_get_result(op)] = j_add(g, data_ptr, offset); + g->map[result] = j_add(g, data_ptr, scaled); } static void irgen_op_last_value(jit_irgen_t *g, int op) @@ -2724,9 +2728,13 @@ static void irgen_op_last_value(jit_irgen_t *g, int op) jit_value_t last_value = j_add(g, data_ptr, size); - // XXX: scale by type size??? + vcode_reg_t result = vcode_get_result(op); + vcode_type_t vtype = vtype_pointed(vcode_reg_type(result)); + + const int scale = irgen_size_bytes(vtype); + jit_value_t scaled = j_mul(g, offset, jit_value_from_int64(scale)); - g->map[vcode_get_result(op)] = j_add(g, last_value, offset); + g->map[result] = j_add(g, last_value, scaled); } static void irgen_op_sched_waveform(jit_irgen_t *g, int op) @@ -2751,6 +2759,23 @@ static void irgen_op_sched_waveform(jit_irgen_t *g, int op) macro_exit(g, JIT_EXIT_SCHED_WAVEFORM); } +static void irgen_op_disconnect(jit_irgen_t *g, int op) +{ + jit_value_t shared = irgen_get_arg(g, op, 0); + jit_value_t offset = jit_value_from_reg(jit_value_as_reg(shared) + 1); + jit_value_t count = irgen_get_arg(g, op, 1); + jit_value_t reject = irgen_get_arg(g, op, 2); + jit_value_t after = irgen_get_arg(g, op, 3); + + j_send(g, 0, shared); + j_send(g, 1, offset); + j_send(g, 2, count); + j_send(g, 3, reject); + j_send(g, 4, after); + + macro_exit(g, JIT_EXIT_DISCONNECT); +} + static void irgen_op_sched_event(jit_irgen_t *g, int op) { jit_value_t shared = irgen_get_arg(g, op, 0); @@ -3216,6 +3241,9 @@ static void irgen_block(jit_irgen_t *g, vcode_block_t block) case VCODE_OP_SCHED_WAVEFORM: irgen_op_sched_waveform(g, i); break; + case VCODE_OP_DISCONNECT: + irgen_op_disconnect(g, i); + break; case VCODE_OP_EVENT: irgen_op_event(g, i); break; diff --git a/src/jit/jit-priv.h b/src/jit/jit-priv.h index faa5fe81..b724996c 100644 --- a/src/jit/jit-priv.h +++ b/src/jit/jit-priv.h @@ -132,6 +132,7 @@ typedef enum { JIT_EXIT_RESOLVE_SIGNAL, JIT_EXIT_LAST_EVENT, JIT_EXIT_LAST_ACTIVE, + JIT_EXIT_DISCONNECT, } jit_exit_t; typedef uint16_t jit_reg_t; -- 2.39.2