Commit c5536326 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

replace * and == by optimization instructions OP_MUL and OP_EQ respectively; close #264

parent a74ab0c2
...@@ -645,6 +645,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) ...@@ -645,6 +645,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
else if (!noop && name[0] == '-' && strlen(name) == 1) { else if (!noop && name[0] == '-' && strlen(name) == 1) {
genop(s, MKOP_ABC(OP_SUB, cursp(), idx, n)); genop(s, MKOP_ABC(OP_SUB, cursp(), idx, n));
} }
else if (!noop && name[0] == '*' && strlen(name) == 1) {
genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
}
else if (!noop && name[0] == '<' && strlen(name) == 1) { else if (!noop && name[0] == '<' && strlen(name) == 1) {
genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
} }
...@@ -657,6 +660,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) ...@@ -657,6 +660,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
else if (!noop && name[0] == '>' && strlen(name) == 2 && name[1] == '=') { else if (!noop && name[0] == '>' && strlen(name) == 2 && name[1] == '=') {
genop(s, MKOP_ABC(OP_GE, cursp(), idx, n)); genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
} }
else if (!noop && name[0] == '=' && strlen(name) == 2 && name[1] == '=') {
genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
}
else { else {
if (sendv) n = CALL_MAXARGS; if (sendv) n = CALL_MAXARGS;
genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n)); genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n));
...@@ -2152,6 +2158,11 @@ codedump(mrb_state *mrb, int n) ...@@ -2152,6 +2158,11 @@ codedump(mrb_state *mrb, int n)
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
GETARG_C(c)); GETARG_C(c));
break; break;
case OP_MUL:
printf("OP_MUL\tR%d\t'%s'\t%d\n", GETARG_A(c),
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
GETARG_C(c));
break;
case OP_LT: case OP_LT:
printf("OP_LT\tR%d\t'%s'\t%d\n", GETARG_A(c), printf("OP_LT\tR%d\t'%s'\t%d\n", GETARG_A(c),
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
...@@ -2172,6 +2183,11 @@ codedump(mrb_state *mrb, int n) ...@@ -2172,6 +2183,11 @@ codedump(mrb_state *mrb, int n)
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
GETARG_C(c)); GETARG_C(c));
break; break;
case OP_EQ:
printf("OP_EQ\tR%d\t'%s'\t%d\n", GETARG_A(c),
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
GETARG_C(c));
break;
case OP_STOP: case OP_STOP:
printf("OP_STOP\n"); printf("OP_STOP\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment