diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-07-31 22:21:42 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-07-31 22:21:42 +0900 |
| commit | e87c95eba786b91c71f1c3ae8944c9b2e19f8711 (patch) | |
| tree | 64c863ea7c8e5c24d1e2fa976c9858689d0ee5c9 | |
| parent | 1314c59295dac8270421b6f24fded74d921b34c7 (diff) | |
| download | mruby-e87c95eba786b91c71f1c3ae8944c9b2e19f8711.tar.gz mruby-e87c95eba786b91c71f1c3ae8944c9b2e19f8711.zip | |
codegen optimization based on http://d.hatena.ne.jp/mirichi/20120730/p1 [Japanese].
| -rw-r--r-- | src/codegen.c | 22 |
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; |
