From 69d8bf704c2693daaa7551f8507b206121a19388 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 22 Oct 2022 09:49:00 +0100 Subject: [PATCH] JIT IR generation for force/release --- src/jit/jit-dump.c | 2 +- src/jit/jit-exits.c | 49 ++++++++++++++++++++++++++++++++++++ src/jit/jit-irgen.c | 60 +++++++++++++++++++++++++++++++++++++++++++++ src/jit/jit-optim.c | 3 ++- src/jit/jit-priv.h | 3 +++ src/rt/model.c | 17 ------------- 6 files changed, 115 insertions(+), 19 deletions(-) diff --git a/src/jit/jit-dump.c b/src/jit/jit-dump.c index 757b6e6b..0368031b 100644 --- a/src/jit/jit-dump.c +++ b/src/jit/jit-dump.c @@ -67,7 +67,7 @@ const char *jit_exit_name(jit_exit_t exit) "FILE_READ", "FILE_WRITE", "ENDFILE", "STRCONVI", "STRCONVR", "CANON_VALUE", "DEBUG_OUT", "ALIAS_SIGNAL", "MAP_SIGNAL", "MAP_CONST", "RESOLVE_SIGNAL", "LAST_EVENT", "LAST_ACTIVE", - "DISCONNECT", + "DISCONNECT", "ELAB_ORDER_FAIL", "FORCE", "RELEASE" }; assert(exit < ARRAY_LEN(names)); return names[exit]; diff --git a/src/jit/jit-exits.c b/src/jit/jit-exits.c index a8022155..995376ad 100644 --- a/src/jit/jit-exits.c +++ b/src/jit/jit-exits.c @@ -496,6 +496,23 @@ void *x_mspace_alloc(uint32_t size, uint32_t nelems) return mspace_alloc(jit_get_mspace(jit_for_thread()), total); } +void x_elab_order_fail(tree_t where) +{ + assert(tree_kind(where) == T_EXTERNAL_NAME); + + jit_msg(tree_loc(where), DIAG_FATAL, "%s %s has not yet been elaborated", + class_str(tree_class(where)), istr(tree_ident(tree_ref(where)))); +} + +void x_unreachable(tree_t where) +{ + if (where != NULL && tree_kind(where) == T_FUNC_BODY) + jit_msg(tree_loc(where), DIAG_FATAL, "function %s did not return a value", + istr(tree_ident(where))); + else + jit_msg(NULL, DIAG_FATAL, "executed unreachable instruction"); +} + //////////////////////////////////////////////////////////////////////////////// // Entry point from interpreter or JIT compiled code @@ -531,6 +548,38 @@ void __nvc_do_exit(jit_exit_t which, jit_scalar_t *args) } break; + case JIT_EXIT_ELAB_ORDER_FAIL: + { + tree_t where = args[0].pointer; + x_elab_order_fail(where); + } + break; + + case JIT_EXIT_FORCE: + { + sig_shared_t *shared = args[0].pointer; + int32_t offset = args[1].integer; + int32_t count = args[2].integer; + jit_scalar_t value = { .integer = args[3].integer }; + bool scalar = args[4].integer; + + if (scalar) + x_force(shared, offset, count, &value.integer); + else + x_force(shared, offset, count, value.pointer); + } + break; + + case JIT_EXIT_RELEASE: + { + sig_shared_t *shared = args[0].pointer; + int32_t offset = args[1].integer; + int32_t count = args[2].integer; + + x_release(shared, offset, count); + } + break; + default: fatal_trace("unhandled exit %s", jit_exit_name(which)); } diff --git a/src/jit/jit-irgen.c b/src/jit/jit-irgen.c index 9ff453c9..5e96b756 100644 --- a/src/jit/jit-irgen.c +++ b/src/jit/jit-irgen.c @@ -2299,6 +2299,26 @@ static void irgen_op_link_package(jit_irgen_t *g, int op) g->map[vcode_get_result(op)] = macro_getpriv(g, handle); } +static void irgen_op_link_instance(jit_irgen_t *g, int op) +{ + ident_t unit_name = vcode_get_ident(op); + jit_handle_t handle = jit_lazy_compile(g->func->jit, unit_name); + + jit_value_t context = macro_getpriv(g, handle); + + irgen_label_t *cont = irgen_alloc_label(g); + j_cmp(g, JIT_CC_NE, context, jit_null_ptr()); + j_jump(g, JIT_CC_T, cont); + + jit_value_t locus = irgen_get_arg(g, op, 0); + j_send(g, 0, locus); + macro_exit(g, JIT_EXIT_ELAB_ORDER_FAIL); + + irgen_bind_label(g, cont); + + g->map[vcode_get_result(op)] = context; +} + static void irgen_op_link_var(jit_irgen_t *g, int op) { ident_t var_name = vcode_get_ident(op); @@ -2776,6 +2796,37 @@ static void irgen_op_disconnect(jit_irgen_t *g, int op) macro_exit(g, JIT_EXIT_DISCONNECT); } +static void irgen_op_force(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 value = irgen_get_arg(g, op, 2); + + jit_value_t scalar = irgen_is_scalar(g, op, 2); + + j_send(g, 0, shared); + j_send(g, 1, offset); + j_send(g, 2, count); + j_send(g, 3, value); + j_send(g, 4, scalar); + + macro_exit(g, JIT_EXIT_FORCE); +} + +static void irgen_op_release(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); + + j_send(g, 0, shared); + j_send(g, 1, offset); + j_send(g, 2, count); + + macro_exit(g, JIT_EXIT_RELEASE); +} + static void irgen_op_sched_event(jit_irgen_t *g, int op) { jit_value_t shared = irgen_get_arg(g, op, 0); @@ -3136,6 +3187,9 @@ static void irgen_block(jit_irgen_t *g, vcode_block_t block) case VCODE_OP_LINK_PACKAGE: irgen_op_link_package(g, i); break; + case VCODE_OP_LINK_INSTANCE: + irgen_op_link_instance(g, i); + break; case VCODE_OP_LINK_VAR: irgen_op_link_var(g, i); break; @@ -3244,6 +3298,12 @@ static void irgen_block(jit_irgen_t *g, vcode_block_t block) case VCODE_OP_DISCONNECT: irgen_op_disconnect(g, i); break; + case VCODE_OP_FORCE: + irgen_op_force(g, i); + break; + case VCODE_OP_RELEASE: + irgen_op_release(g, i); + break; case VCODE_OP_EVENT: irgen_op_event(g, i); break; diff --git a/src/jit/jit-optim.c b/src/jit/jit-optim.c index 3ef502be..b2d189c7 100644 --- a/src/jit/jit-optim.c +++ b/src/jit/jit-optim.c @@ -39,7 +39,8 @@ static bool cfg_will_abort(jit_ir_t *ir) || ir->arg1.exit == JIT_EXIT_LENGTH_FAIL || ir->arg1.exit == JIT_EXIT_DIV_ZERO || ir->arg1.exit == JIT_EXIT_EXPONENT_FAIL - || ir->arg1.exit == JIT_EXIT_RANGE_FAIL; + || ir->arg1.exit == JIT_EXIT_RANGE_FAIL + || ir->arg1.exit == JIT_EXIT_ELAB_ORDER_FAIL; } else return ir->op == J_TRAP; diff --git a/src/jit/jit-priv.h b/src/jit/jit-priv.h index b724996c..790e81d5 100644 --- a/src/jit/jit-priv.h +++ b/src/jit/jit-priv.h @@ -133,6 +133,9 @@ typedef enum { JIT_EXIT_LAST_EVENT, JIT_EXIT_LAST_ACTIVE, JIT_EXIT_DISCONNECT, + JIT_EXIT_ELAB_ORDER_FAIL, + JIT_EXIT_FORCE, + JIT_EXIT_RELEASE, } jit_exit_t; typedef uint16_t jit_reg_t; diff --git a/src/rt/model.c b/src/rt/model.c index 5c608368..ecc699a1 100644 --- a/src/rt/model.c +++ b/src/rt/model.c @@ -3261,20 +3261,3 @@ void x_resolve_signal2(sig_shared_t *ss, jit_handle_t handle, void *context, x_resolve_signal(ss, &resolution); } - -void x_elab_order_fail(tree_t where) -{ - assert(tree_kind(where) == T_EXTERNAL_NAME); - - jit_msg(tree_loc(where), DIAG_FATAL, "%s %s has not yet been elaborated", - class_str(tree_class(where)), istr(tree_ident(tree_ref(where)))); -} - -void x_unreachable(tree_t where) -{ - if (where != NULL && tree_kind(where) == T_FUNC_BODY) - jit_msg(tree_loc(where), DIAG_FATAL, "function %s did not return a value", - istr(tree_ident(where))); - else - jit_msg(NULL, DIAG_FATAL, "executed unreachable instruction"); -} -- 2.39.2