From 8a98b46ef2b5673fcdf0a9a466857a5de044dfc5 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 20 Apr 2024 10:47:49 +0300 Subject: add lightening jit --- src/execute.c | 83 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 39 deletions(-) (limited to 'src/execute.c') diff --git a/src/execute.c b/src/execute.c index 0d321d7..bd9cd6b 100644 --- a/src/execute.c +++ b/src/execute.c @@ -8,9 +8,11 @@ #define UNUSED(x) (void)x #define DEF(x) \ -static void exec_##x(struct insn i, size_t sp, struct vec *stack, struct vec *globals) + static void exec_##x(struct insn i, size_t sp, struct vec *stack, \ + struct vec *globals) -static int64_t load(struct loc l, size_t sp, struct vec *stack, struct vec *globals) +static int64_t load(struct loc l, size_t sp, struct vec *stack, + struct vec *globals) { if (l.l) return vect_at(int64_t, *stack, l.o + sp); @@ -18,7 +20,8 @@ static int64_t load(struct loc l, size_t sp, struct vec *stack, struct vec *glob return vect_at(int64_t, *globals, l.o); } -static void store(struct loc l, int64_t v, size_t sp, struct vec *stack, struct vec *globals) +static void store(struct loc l, int64_t v, size_t sp, struct vec *stack, + struct vec *globals) { if (l.l) { vect_at(int64_t, *stack, l.o + sp) = v; @@ -155,13 +158,13 @@ DEF(LOAD_WEEKDAY) { const char *day = "Sunday"; switch (time.tm_wday) { - case 0: day = "Sunday"; break; - case 1: day = "Monday"; break; - case 2: day = "Tuesday"; break; - case 3: day = "Wednesday"; break; - case 4: day = "Thursday"; break; - case 5: day = "Friday"; break; - case 6: day = "Saturday"; break; + case 0: day = "Sunday"; break; + case 1: day = "Monday"; break; + case 2: day = "Tuesday"; break; + case 3: day = "Wednesday"; break; + case 4: day = "Thursday"; break; + case 5: day = "Friday"; break; + case 6: day = "Saturday"; break; } put(i.o, (int64_t)day); @@ -250,7 +253,8 @@ DEF(DATE_DIFF) { put(i.o, days); } -static int64_t exec_func(struct fn *f, struct vec *args, size_t sp, struct vec *stack, struct vec *globals) +static int64_t exec_func(struct fn *f, struct vec *args, size_t sp, + struct vec *stack, struct vec *globals) { /* move args to formal locations */ size_t i = 0; @@ -306,37 +310,38 @@ static int64_t exec_func(struct fn *f, struct vec *args, size_t sp, struct vec * struct fn *cf = find_fn(i.v); assert(cf); - retval = exec_func(cf, args, sp + f->max_sp, stack, globals); + retval = exec_func(cf, args, sp + f->max_sp, stack, + globals); break; } - DO(MOVE); - DO(ADD); - DO(SUB); - DO(MUL); - DO(DIV); - DO(CONST); - DO(PRINT_DATE); - DO(PRINT_INT); - DO(PRINT_BOOL); - DO(PRINT_STRING); - DO(PRINT_NEWLINE); - DO(PRINT_SPACE); - DO(LOAD_DAY); - DO(LOAD_MONTH); - DO(LOAD_YEAR); - DO(LOAD_WEEKDAY); - DO(LOAD_WEEKNUM); - DO(STORE_DAY); - DO(STORE_MONTH); - DO(STORE_YEAR); - DO(DATE_ADD); - DO(DATE_SUB); - DO(DATE_DIFF); - DO(TODAY); - DO(EQ); - DO(LT); - DO(NEG); + DO(MOVE); + DO(ADD); + DO(SUB); + DO(MUL); + DO(DIV); + DO(CONST); + DO(PRINT_DATE); + DO(PRINT_INT); + DO(PRINT_BOOL); + DO(PRINT_STRING); + DO(PRINT_NEWLINE); + DO(PRINT_SPACE); + DO(LOAD_DAY); + DO(LOAD_MONTH); + DO(LOAD_YEAR); + DO(LOAD_WEEKDAY); + DO(LOAD_WEEKNUM); + DO(STORE_DAY); + DO(STORE_MONTH); + DO(STORE_YEAR); + DO(DATE_ADD); + DO(DATE_SUB); + DO(DATE_DIFF); + DO(TODAY); + DO(EQ); + DO(LT); + DO(NEG); } #undef DO -- cgit v1.2.3