summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-11-02 22:37:47 +0900
committerGitHub <[email protected]>2018-11-02 22:37:47 +0900
commit9c5e28646b8c7fece19cf614cb05d6e14adca2f3 (patch)
treea2915328c6b428db841d94343b1d6beb992b52e2 /mrbgems
parent788e4388f86452c119e145b835e7853f39732811 (diff)
parent6a6586ca84c6a9a691c9968320eed5e60e824b3c (diff)
downloadmruby-9c5e28646b8c7fece19cf614cb05d6e14adca2f3.tar.gz
mruby-9c5e28646b8c7fece19cf614cb05d6e14adca2f3.zip
Merge pull request #4151 from take-cheeze/remove_op_symidx
Reduce instruction size
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c51
1 files changed, 28 insertions, 23 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 8ab1b9bc3..22ac51239 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -18,6 +18,7 @@
#include <mruby/opcode.h>
#include <mruby/re.h>
#include <mruby/throw.h>
+#include <mruby/symbol.h>
#ifndef MRB_CODEGEN_LEVEL_MAX
#define MRB_CODEGEN_LEVEL_MAX 1024
@@ -468,11 +469,11 @@ gen_return(codegen_scope *s, uint8_t op, uint16_t src)
}
static void
-gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst, uint16_t idx)
+gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst)
{
if (no_peephole(s)) {
normal:
- genop_2(s, op, dst, idx);
+ genop_1(s, op, dst);
return;
}
else {
@@ -493,10 +494,10 @@ gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst, uint16_t idx)
if (data.b >= 128) goto normal;
s->pc = s->lastpc;
if (op == OP_ADD) {
- genop_3(s, OP_ADDI, dst, idx, (uint8_t)data.b);
+ genop_2(s, OP_ADDI, dst, (uint8_t)data.b);
}
else {
- genop_3(s, OP_SUBI, dst, idx, (uint8_t)data.b);
+ genop_2(s, OP_SUBI, dst, (uint8_t)data.b);
}
break;
default:
@@ -982,7 +983,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
gen_move(s, cursp(), recv, 1);
skip = genjmp2(s, OP_JMPNIL, cursp(), 0, val);
}
- idx = new_sym(s, sym);
+ if (!mrb_symbol_constsym_send_p(sym)) {
+ idx = new_sym(s, sym);
+ }
tree = tree->cdr->cdr->car;
if (tree) {
n = gen_values(s, tree->car, VAL, sp?1:0);
@@ -1017,31 +1020,31 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
if (!noop && symlen == 1 && symname[0] == '+' && n == 1) {
- gen_addsub(s, OP_ADD, cursp(), idx);
+ gen_addsub(s, OP_ADD, cursp());
}
else if (!noop && symlen == 1 && symname[0] == '-' && n == 1) {
- gen_addsub(s, OP_SUB, cursp(), idx);
+ gen_addsub(s, OP_SUB, cursp());
}
else if (!noop && symlen == 1 && symname[0] == '*' && n == 1) {
- genop_2(s, OP_MUL, cursp(), idx);
+ genop_1(s, OP_MUL, cursp());
}
else if (!noop && symlen == 1 && symname[0] == '/' && n == 1) {
- genop_2(s, OP_DIV, cursp(), idx);
+ genop_1(s, OP_DIV, cursp());
}
else if (!noop && symlen == 1 && symname[0] == '<' && n == 1) {
- genop_2(s, OP_LT, cursp(), idx);
+ genop_1(s, OP_LT, cursp());
}
else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1) {
- genop_2(s, OP_LE, cursp(), idx);
+ genop_1(s, OP_LE, cursp());
}
else if (!noop && symlen == 1 && symname[0] == '>' && n == 1) {
- genop_2(s, OP_GT, cursp(), idx);
+ genop_1(s, OP_GT, cursp());
}
else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1) {
- genop_2(s, OP_GE, cursp(), idx);
+ genop_1(s, OP_GE, cursp());
}
else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1) {
- genop_2(s, OP_EQ, cursp(), idx);
+ genop_1(s, OP_EQ, cursp());
}
else {
if (sendv) {
@@ -2023,30 +2026,32 @@ codegen(codegen_scope *s, node *tree, int val)
push(); pop();
pop(); pop();
- idx = new_sym(s, sym);
+ if (!mrb_symbol_constsym_send_p(sym)) {
+ idx = new_sym(s, sym);
+ }
if (len == 1 && name[0] == '+') {
- gen_addsub(s, OP_ADD, cursp(), idx);
+ gen_addsub(s, OP_ADD, cursp());
}
else if (len == 1 && name[0] == '-') {
- gen_addsub(s, OP_SUB, cursp(), idx);
+ gen_addsub(s, OP_SUB, cursp());
}
else if (len == 1 && name[0] == '*') {
- genop_2(s, OP_MUL, cursp(), idx);
+ genop_1(s, OP_MUL, cursp());
}
else if (len == 1 && name[0] == '/') {
- genop_2(s, OP_DIV, cursp(), idx);
+ genop_1(s, OP_DIV, cursp());
}
else if (len == 1 && name[0] == '<') {
- genop_2(s, OP_LT, cursp(), idx);
+ genop_1(s, OP_LT, cursp());
}
else if (len == 2 && name[0] == '<' && name[1] == '=') {
- genop_2(s, OP_LE, cursp(), idx);
+ genop_1(s, OP_LE, cursp());
}
else if (len == 1 && name[0] == '>') {
- genop_2(s, OP_GT, cursp(), idx);
+ genop_1(s, OP_GT, cursp());
}
else if (len == 2 && name[0] == '>' && name[1] == '=') {
- genop_2(s, OP_GE, cursp(), idx);
+ genop_1(s, OP_GE, cursp());
}
else {
genop_3(s, OP_SEND, cursp(), idx, 1);