Reduce instruction size

This commit is contained in:
take-cheeze
2018-10-29 19:17:05 +09:00
parent eebb56713e
commit 3248de83b6
5 changed files with 130 additions and 55 deletions
+26
View File
@@ -11,6 +11,7 @@
#include <mruby/string.h>
#include <mruby/dump.h>
#include <mruby/class.h>
#include <mruby/symbol.h>
/* ------------------------------------------------------ */
typedef struct symbol_name {
@@ -170,10 +171,35 @@ mrb_free_symtbl(mrb_state *mrb)
kh_destroy(n2s, mrb, mrb->name2sym);
}
struct reserved_symbol_t {
mrb_reserved_symbol sym;
char const *str;
};
static struct reserved_symbol_t reserved_symbols[] = {
{ mrb_sym_add, "+" },
{ mrb_sym_sub, "-" },
{ mrb_sym_mul, "*" },
{ mrb_sym_div, "/" },
{ mrb_sym_eq, "==" },
{ mrb_sym_lt, "<" },
{ mrb_sym_le, "<=" },
{ mrb_sym_gt, ">" },
{ mrb_sym_ge, ">=" },
{ mrb_sym_method_missing, "method_missing" },
{ 0, NULL },
};
void
mrb_init_symtbl(mrb_state *mrb)
{
int i;
mrb->name2sym = kh_init(n2s, mrb);
for (i = 0; reserved_symbols[i].sym != 0; ++i) {
mrb_sym s = mrb_intern_static(mrb, reserved_symbols[i].str, strlen(reserved_symbols[i].str));
mrb_assert(s == reserved_symbols[i].sym);
}
}
/**********************************************************************
+39 -23
View File
@@ -21,6 +21,7 @@
#include <mruby/opcode.h>
#include "value_array.h"
#include <mruby/throw.h>
#include <mruby/symbol.h>
#ifdef MRB_DISABLE_STDIO
#if defined(__cplusplus)
@@ -1009,6 +1010,7 @@ mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc)
uint32_t a;
uint16_t b;
uint8_t c;
mrb_sym mid;
#ifdef DIRECT_THREADED
static void *optable[] = {
@@ -1386,9 +1388,18 @@ RETRY_TRY_BLOCK:
SET_NIL_VALUE(regs[bidx]);
goto L_SENDB;
};
L_SEND_CONSTSYM:
{
/* push nil after arguments */
int bidx = (c == CALL_MAXARGS) ? a+2 : a+c+1;
SET_NIL_VALUE(regs[bidx]);
goto L_SENDB_CONSTSYM;
};
CASE(OP_SENDB, BBB)
L_SENDB:
mid = syms[b];
L_SENDB_CONSTSYM:
{
int argc = (c == CALL_MAXARGS) ? -1 : c;
int bidx = (argc < 0) ? a+2 : a+c+1;
@@ -1396,7 +1407,6 @@ RETRY_TRY_BLOCK:
struct RClass *cls;
mrb_callinfo *ci = mrb->c->ci;
mrb_value recv, blk;
mrb_sym mid = syms[b];
mrb_assert(bidx < irep->nregs);
@@ -2204,7 +2214,7 @@ RETRY_TRY_BLOCK:
v1(regs[a]) = v1(regs[a]) op v2(regs[a+1]);\
} while(0)
CASE(OP_ADD, BB) {
CASE(OP_ADD, B) {
/* need to check if op is overridden */
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
@@ -2259,13 +2269,14 @@ RETRY_TRY_BLOCK:
break;
default:
c = 1;
goto L_SEND;
mid = mrb_sym_add;
goto L_SEND_CONSTSYM;
}
mrb_gc_arena_restore(mrb, ai);
NEXT;
}
CASE(OP_SUB, BB) {
CASE(OP_SUB, B) {
/* need to check if op is overridden */
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
@@ -2316,12 +2327,13 @@ RETRY_TRY_BLOCK:
#endif
default:
c = 1;
goto L_SEND;
mid = mrb_sym_sub;
goto L_SEND_CONSTSYM;
}
NEXT;
}
CASE(OP_MUL, BB) {
CASE(OP_MUL, B) {
/* need to check if op is overridden */
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
@@ -2372,12 +2384,13 @@ RETRY_TRY_BLOCK:
#endif
default:
c = 1;
goto L_SEND;
mid = mrb_sym_mul;
goto L_SEND_CONSTSYM;
}
NEXT;
}
CASE(OP_DIV, BB) {
CASE(OP_DIV, B) {
#ifndef MRB_WITHOUT_FLOAT
double x, y, f;
#endif
@@ -2411,7 +2424,8 @@ RETRY_TRY_BLOCK:
#endif
default:
c = 1;
goto L_SEND;
mid = mrb_sym_div;
goto L_SEND_CONSTSYM;
}
#ifndef MRB_WITHOUT_FLOAT
@@ -2509,7 +2523,7 @@ RETRY_TRY_BLOCK:
#define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1]))
#ifdef MRB_WITHOUT_FLOAT
#define OP_CMP(op) do {\
#define OP_CMP(op, sym) do {\
int result;\
/* need to check if - is overridden */\
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
@@ -2518,7 +2532,8 @@ RETRY_TRY_BLOCK:
break;\
default:\
c = 1;\
goto L_SEND;\
mid = mrb_sym_ ## sym;\
goto L_SEND_CONSTSYM;\
}\
if (result) {\
SET_TRUE_VALUE(regs[a]);\
@@ -2528,7 +2543,7 @@ RETRY_TRY_BLOCK:
}\
} while(0)
#else
#define OP_CMP(op) do {\
#define OP_CMP(op, sym) do {\
int result;\
/* need to check if - is overridden */\
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
@@ -2546,7 +2561,8 @@ RETRY_TRY_BLOCK:
break;\
default:\
c = 1;\
goto L_SEND;\
mid = mrb_sym_ ## sym;\
goto L_SEND_CONSTSYM;\
}\
if (result) {\
SET_TRUE_VALUE(regs[a]);\
@@ -2557,33 +2573,33 @@ RETRY_TRY_BLOCK:
} while(0)
#endif
CASE(OP_EQ, BB) {
CASE(OP_EQ, B) {
if (mrb_obj_eq(mrb, regs[a], regs[a+1])) {
SET_TRUE_VALUE(regs[a]);
}
else {
OP_CMP(==);
OP_CMP(==, eq);
}
NEXT;
}
CASE(OP_LT, BB) {
OP_CMP(<);
CASE(OP_LT, B) {
OP_CMP(<, gt);
NEXT;
}
CASE(OP_LE, BB) {
OP_CMP(<=);
CASE(OP_LE, B) {
OP_CMP(<=, ge);
NEXT;
}
CASE(OP_GT, BB) {
OP_CMP(>);
CASE(OP_GT, B) {
OP_CMP(>, lt);
NEXT;
}
CASE(OP_GE, BB) {
OP_CMP(>=);
CASE(OP_GE, B) {
OP_CMP(>=, le);
NEXT;
}