summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-07-31 22:21:42 +0900
committerYukihiro Matsumoto <[email protected]>2012-07-31 22:21:42 +0900
commite87c95eba786b91c71f1c3ae8944c9b2e19f8711 (patch)
tree64c863ea7c8e5c24d1e2fa976c9858689d0ee5c9 /src
parent1314c59295dac8270421b6f24fded74d921b34c7 (diff)
downloadmruby-e87c95eba786b91c71f1c3ae8944c9b2e19f8711.tar.gz
mruby-e87c95eba786b91c71f1c3ae8944c9b2e19f8711.zip
codegen optimization based on http://d.hatena.ne.jp/mirichi/20120730/p1 [Japanese].
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 2e8104fdd..b944f348e 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1027,13 +1027,14 @@ codegen(codegen_scope *s, node *tree, int val)
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
lp->pc1 = new_label(s);
- codegen(s, tree->car, VAL);
- pop();
+ genop(s, MKOP_sBx(OP_JMP, 0));
lp->pc2 = new_label(s);
- genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0));
codegen(s, tree->cdr, NOVAL);
- genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc));
- dispatch(s, lp->pc2);
+ dispatch(s, lp->pc1);
+ codegen(s, tree->car, VAL);
+ pop();
+ genop(s, MKOP_AsBx(OP_JMPIF, cursp(), lp->pc2 - s->pc));
+
loop_pop(s, val);
}
break;
@@ -1043,13 +1044,14 @@ codegen(codegen_scope *s, node *tree, int val)
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
lp->pc1 = new_label(s);
- codegen(s, tree->car, VAL);
- pop();
+ genop(s, MKOP_sBx(OP_JMP, 0));
lp->pc2 = new_label(s);
- genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
codegen(s, tree->cdr, NOVAL);
- genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc));
- dispatch(s, lp->pc2);
+ dispatch(s, lp->pc1);
+ codegen(s, tree->car, VAL);
+ pop();
+ genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), lp->pc2 - s->pc));
+
loop_pop(s, val);
}
break;