aboutsummaryrefslogtreecommitdiff
path: root/src/interp.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2025-04-09 22:20:01 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2025-04-09 22:20:01 +0300
commitbe5c83ba8e57bc67beee41bc2c7227e6b8ebd9d5 (patch)
tree2a0d208fed58629d710ac5f908f1cc49000ecf75 /src/interp.c
parent057131cb20fb1c46e90adecfb4a16eb62f100580 (diff)
downloadejit-be5c83ba8e57bc67beee41bc2c7227e6b8ebd9d5.tar.gz
ejit-be5c83ba8e57bc67beee41bc2c7227e6b8ebd9d5.zip
add callr_i/l/f/d
Diffstat (limited to 'src/interp.c')
-rw-r--r--src/interp.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/interp.c b/src/interp.c
index 268bfb3..6f94f98 100644
--- a/src/interp.c
+++ b/src/interp.c
@@ -213,14 +213,18 @@ union interp_ret ejit_run(struct ejit_func *f, size_t paramc, struct ejit_arg pa
[EJIT_OP_PARAM] = &&PARAM,
[EJIT_OP_PARAM_F] = &&PARAM_F,
+ [EJIT_OP_CALLR_I] = &&CALLR_I,
+ [EJIT_OP_CALLR_L] = &&CALLR_L,
+ [EJIT_OP_CALLR_F] = &&CALLR_F,
+ [EJIT_OP_CALLR_D] = &&CALLR_D,
[EJIT_OP_CALLI] = &&CALLI,
[EJIT_OP_TAILR] = &&TAILR,
[EJIT_OP_TAILI] = &&TAILI,
[EJIT_OP_ESCAPEI_I] = &&ESCAPEI_I,
- [EJIT_OP_ESCAPEI_F] = &&ESCAPEI_F,
[EJIT_OP_ESCAPEI_L] = &&ESCAPEI_L,
+ [EJIT_OP_ESCAPEI_F] = &&ESCAPEI_F,
[EJIT_OP_ESCAPEI_D] = &&ESCAPEI_D,
[EJIT_OP_START] = &&START,
@@ -1084,33 +1088,48 @@ top:
goto top;
DISPATCH();
+ DO(CALLR_I);
+ retval = ejit_run((struct ejit_func *)gpr[i.r1], argc, args, NULL);
+ argc = 0;
+ DISPATCH();
+
+ DO(CALLR_L);
+ retval = ejit_run((struct ejit_func *)gpr[i.r1], argc, args, NULL);
+ argc = 0;
+ DISPATCH();
+
+ DO(CALLR_F);
+ retval = ejit_run((struct ejit_func *)gpr[i.r1], argc, args, NULL);
+ argc = 0;
+ DISPATCH();
+
+ DO(CALLR_D);
+ retval = ejit_run((struct ejit_func *)gpr[i.r1], argc, args, NULL);
+ argc = 0;
+ DISPATCH();
+
DO(CALLI);
- struct ejit_func *f = i.p;
- retval = ejit_run(f, argc, args, NULL);
+ retval = ejit_run((struct ejit_func *)i.p, argc, args, NULL);
argc = 0;
DISPATCH();
DO(ESCAPEI_I);
- ejit_escape_i_t f = i.p;
- retval.i = f(argc, args);
+ retval.i = ((ejit_escape_i_t)i.p)(argc, args);
argc = 0;
DISPATCH();
DO(ESCAPEI_L);
- ejit_escape_l_t f = i.p;
- retval.i = f(argc, args);
+ retval.i = ((ejit_escape_l_t)i.p)(argc, args);
argc = 0;
DISPATCH();
DO(ESCAPEI_F);
- ejit_escape_f_t f = i.p;
- retval.f = f(argc, args);
+ retval.f = ((ejit_escape_f_t)i.p)(argc, args);
argc = 0;
DISPATCH();
DO(ESCAPEI_D);
- ejit_escape_d_t f = i.p;
- retval.f = f(argc, args);
+ retval.f = ((ejit_escape_d_t)i.p)(argc, args);
argc = 0;
DISPATCH();