From 10ca53522644826e54383c1d4bb73d7b4d51fce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alf-Andr=C3=A9=20Walla?= Date: Thu, 18 Jul 2024 17:16:42 +0200 Subject: [PATCH] Update dynamic argument calls to avoid macro --- engine/scripts/src/gameplay.cpp | 3 - engine/scripts/src/level1.cpp | 12 +--- engine/src/script/script_syscalls.cpp | 6 -- ext/libriscv | 2 +- programs/micro/api/api_impl.h | 82 +++++++++++++++++---------- programs/micro/libc/engine.hpp | 2 - 6 files changed, 56 insertions(+), 51 deletions(-) diff --git a/engine/scripts/src/gameplay.cpp b/engine/scripts/src/gameplay.cpp index 1f93e59..48c5fca 100644 --- a/engine/scripts/src/gameplay.cpp +++ b/engine/scripts/src/gameplay.cpp @@ -1,7 +1,6 @@ #include "events.hpp" #include using namespace api; -extern void benchmark_multiprocessing(); int main() { @@ -84,8 +83,6 @@ PUBLIC(void benchmarks()) measure("Dynamic call handler x4 (call)", opaque_dyncall_handler); measure("Allocate 1024-bytes, and free it", bench_alloc_free); - - //benchmark_multiprocessing(); } struct C diff --git a/engine/scripts/src/level1.cpp b/engine/scripts/src/level1.cpp index c269a64..da74b04 100644 --- a/engine/scripts/src/level1.cpp +++ b/engine/scripts/src/level1.cpp @@ -5,12 +5,6 @@ extern void do_threads_stuff(); extern void do_remote_stuff(); static void do_benchmarks(); -static inline void -my_dynamic_call(long val, float fval, const std::string& str) -{ - DYNCALL("Test::my_dynamic_call", val, fval, str); -} - /* This is the function that gets called at the start. See: engine/src/main.cpp */ PUBLIC(void start()) @@ -21,7 +15,7 @@ PUBLIC(void start()) print("** Fully dynamic system calls **\n"); - my_dynamic_call(1234, 5678.0, "nine-ten-eleven-twelve!"); + DynamicCall("Test::my_dynamic_call")(1234, 5678.0, "nine-ten-eleven-twelve!"); if (Game::setting("benchmarks").value_or(false)) do_benchmarks(); @@ -63,14 +57,14 @@ void do_benchmarks() "Dynamic arguments (no arguments)", [] { - DYNCALL("Test::void"); + DynamicCall("Test::void")(); }); measure( "Dynamic arguments (4x arguments)", [] { - DYNCALL("Test::void", -4096, 5678.0, 524287, 8765.0); + DynamicCall("Test::void")(-4096, 5678.0, 524287, 8765.0); }); measure( diff --git a/engine/src/script/script_syscalls.cpp b/engine/src/script/script_syscalls.cpp index fc7ae6c..551d18b 100644 --- a/engine/src/script/script_syscalls.cpp +++ b/engine/src/script/script_syscalls.cpp @@ -36,12 +36,6 @@ APICALL(api_write) const uint32_t len_g = std::min(4096u, (uint32_t)len); auto& scr = script(machine); - if (scr.machine().is_multiprocessing()) - { - machine.set_result(-1); - return; - } - if (scr.stdout_enabled()) { std::array buffers; diff --git a/ext/libriscv b/ext/libriscv index bfb3a6c..6b3abd7 160000 --- a/ext/libriscv +++ b/ext/libriscv @@ -1 +1 @@ -Subproject commit bfb3a6c6f0e0abdb06df879a044a57c523c11613 +Subproject commit 6b3abd73eff1e3b4e6913048e0c0a1eb7a0e3a43 diff --git a/programs/micro/api/api_impl.h b/programs/micro/api/api_impl.h index f0f76cd..364eeb5 100644 --- a/programs/micro/api/api_impl.h +++ b/programs/micro/api/api_impl.h @@ -264,36 +264,33 @@ dynamic_call(const uint32_t hash, const char* name, Args&&... args) std::array gpr {}; std::array fpr {}; - ( - [&] + ([&] { + if constexpr (std::is_integral_v>) { - if constexpr (std::is_integral_v>) - { - gpr[argc] = args; - type[argc] = 0b001; - argc++; - } - else if constexpr (std::is_floating_point_v< - std::remove_reference_t>) - { - fpr[argc] = args; - type[argc] = 0b010; - argc++; - } - else if constexpr (is_stdstring>::value) - { - gpr[argc] = (uintptr_t)args.data(); - type[argc] = 0b111; - argc++; - } - else if constexpr (is_string::value) - { - gpr[argc] = (uintptr_t) const_cast(args); - type[argc] = 0b111; - argc++; - } - }(), - ...); + gpr[argc] = args; + type[argc] = 0b001; + argc++; + } + else if constexpr (std::is_floating_point_v< + std::remove_reference_t>) + { + fpr[argc] = args; + type[argc] = 0b010; + argc++; + } + else if constexpr (is_stdstring>::value) + { + gpr[argc] = (uintptr_t)args.data(); + type[argc] = 0b111; + argc++; + } + else if constexpr (is_string::value) + { + gpr[argc] = (uintptr_t) const_cast(args); + type[argc] = 0b111; + argc++; + } + }(), ...); register long a0 asm("a0"); register float fa0 asm("fa0"); @@ -334,4 +331,29 @@ dynamic_call(const uint32_t hash, const char* name, Args&&... args) : "r"(name_hash), "m"(*name_ptr), "r"(name_ptr)); } -#define DYNCALL(name, ...) dynamic_call(crc32(name), name, ##__VA_ARGS__) +struct DynamicCall +{ + const uint32_t hash; + const char* const name; + + template + constexpr void operator()(Args&&... args) + { + dynamic_call(hash, name, std::forward(args)...); + } + + constexpr operator uint32_t() const + { + return hash; + } + constexpr operator const char*() const + { + return name; + } + + template + constexpr DynamicCall(const char (&name)[N]) + : hash(crc32ct(name)), name(name) + { + } +}; diff --git a/programs/micro/libc/engine.hpp b/programs/micro/libc/engine.hpp index 18a13f6..16781cf 100644 --- a/programs/micro/libc/engine.hpp +++ b/programs/micro/libc/engine.hpp @@ -47,5 +47,3 @@ extern "C" long sys_write(const void*, size_t); extern "C" void (*farcall_helper) (); extern "C" void (*direct_farcall_helper) (); extern "C" void sys_interrupt (uint32_t, uint32_t, const void*, size_t); -extern "C" unsigned sys_multiprocess(unsigned); -extern "C" uint32_t sys_multiprocess_wait();