summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler
diff options
context:
space:
mode:
authortake-cheeze <[email protected]>2018-10-29 19:17:05 +0900
committertake-cheeze <[email protected]>2018-10-29 19:17:05 +0900
commit3248de83b6754eecc99d9ab6fdef8bb3575fcd04 (patch)
tree56f57e3526c89ff9581b0d7b71a0be742e09800d /mrbgems/mruby-compiler
parenteebb56713e27cde27a7b899da8636a0634704863 (diff)
downloadmruby-3248de83b6754eecc99d9ab6fdef8bb3575fcd04.tar.gz
mruby-3248de83b6754eecc99d9ab6fdef8bb3575fcd04.zip
Reduce instruction size
Diffstat (limited to 'mrbgems/mruby-compiler')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 8ab1b9bc3..759e7267e 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -468,11 +468,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 +493,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,6 +982,7 @@ 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);
}
+ // TODO: don't new when unused
idx = new_sym(s, sym);
tree = tree->cdr->cdr->car;
if (tree) {
@@ -1017,31 +1018,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) {
@@ -2025,28 +2026,28 @@ codegen(codegen_scope *s, node *tree, int val)
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);