codegen.c: skip `-@` call if the argument is a literal integer.

parent 2ef6e944
...@@ -858,6 +858,21 @@ gen_int(codegen_scope *s, uint16_t dst, mrb_int i) ...@@ -858,6 +858,21 @@ gen_int(codegen_scope *s, uint16_t dst, mrb_int i)
} }
} }
static void
gen_uminus(codegen_scope *s, uint16_t dst)
{
struct mrb_insn_data data = mrb_last_insn(s);
int32_t n;
if (get_int_operand(&data, &n)) {
s->pc = s->lastpc;
gen_int(s, dst, -n);
}
else {
genop_3(s, OP_SEND, dst, new_sym(s, MRB_OPSYM_2(s->mrb, minus)), 0);
}
}
static int static int
node_len(node *tree) node_len(node *tree)
{ {
...@@ -2695,10 +2710,10 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2695,10 +2710,10 @@ codegen(codegen_scope *s, node *tree, int val)
default: default:
if (val) { if (val) {
int sym = new_sym(s, MRB_OPSYM_2(s->mrb, minus));
codegen(s, tree, VAL); codegen(s, tree, VAL);
pop(); pop();
genop_3(s, OP_SEND, cursp(), sym, 0); push_n(2);pop_n(2); /* space for receiver&block */
gen_uminus(s, cursp());
push(); push();
} }
else { else {
......
...@@ -1248,7 +1248,7 @@ call_with_block(parser_state *p, node *a, node *b) ...@@ -1248,7 +1248,7 @@ call_with_block(parser_state *p, node *a, node *b)
} }
static node* static node*
negate_lit(parser_state *p, node *n) new_negate(parser_state *p, node *n)
{ {
return cons((node*)NODE_NEGATE, n); return cons((node*)NODE_NEGATE, n);
} }
...@@ -2292,11 +2292,11 @@ arg : lhs '=' arg_rhs ...@@ -2292,11 +2292,11 @@ arg : lhs '=' arg_rhs
} }
| tUMINUS_NUM tINTEGER tPOW arg | tUMINUS_NUM tINTEGER tPOW arg
{ {
$$ = call_uni_op(p, call_bin_op(p, $2, "**", $4), "-@"); $$ = new_negate(p, call_bin_op(p, $2, "**", $4));
} }
| tUMINUS_NUM tFLOAT tPOW arg | tUMINUS_NUM tFLOAT tPOW arg
{ {
$$ = call_uni_op(p, call_bin_op(p, $2, "**", $4), "-@"); $$ = new_negate(p, call_bin_op(p, $2, "**", $4));
} }
| tUPLUS arg | tUPLUS arg
{ {
...@@ -2304,7 +2304,7 @@ arg : lhs '=' arg_rhs ...@@ -2304,7 +2304,7 @@ arg : lhs '=' arg_rhs
} }
| tUMINUS arg | tUMINUS arg
{ {
$$ = call_uni_op(p, $2, "-@"); $$ = new_negate(p, $2);
} }
| arg '|' arg | arg '|' arg
{ {
...@@ -3463,11 +3463,11 @@ numeric : tINTEGER ...@@ -3463,11 +3463,11 @@ numeric : tINTEGER
| tFLOAT | tFLOAT
| tUMINUS_NUM tINTEGER %prec tLOWEST | tUMINUS_NUM tINTEGER %prec tLOWEST
{ {
$$ = negate_lit(p, $2); $$ = new_negate(p, $2);
} }
| tUMINUS_NUM tFLOAT %prec tLOWEST | tUMINUS_NUM tFLOAT %prec tLOWEST
{ {
$$ = negate_lit(p, $2); $$ = new_negate(p, $2);
} }
; ;
......
...@@ -1311,7 +1311,7 @@ call_with_block(parser_state *p, node *a, node *b) ...@@ -1311,7 +1311,7 @@ call_with_block(parser_state *p, node *a, node *b)
} }
static node* static node*
negate_lit(parser_state *p, node *n) new_negate(parser_state *p, node *n)
{ {
return cons((node*)NODE_NEGATE, n); return cons((node*)NODE_NEGATE, n);
} }
...@@ -7376,7 +7376,7 @@ yyreduce: ...@@ -7376,7 +7376,7 @@ yyreduce:
case 219: case 219:
#line 2294 "mrbgems/mruby-compiler/core/parse.y" #line 2294 "mrbgems/mruby-compiler/core/parse.y"
{ {
(yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@"); (yyval.nd) = new_negate(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)));
} }
#line 7382 "mrbgems/mruby-compiler/core/y.tab.c" #line 7382 "mrbgems/mruby-compiler/core/y.tab.c"
break; break;
...@@ -7384,7 +7384,7 @@ yyreduce: ...@@ -7384,7 +7384,7 @@ yyreduce:
case 220: case 220:
#line 2298 "mrbgems/mruby-compiler/core/parse.y" #line 2298 "mrbgems/mruby-compiler/core/parse.y"
{ {
(yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@"); (yyval.nd) = new_negate(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)));
} }
#line 7390 "mrbgems/mruby-compiler/core/y.tab.c" #line 7390 "mrbgems/mruby-compiler/core/y.tab.c"
break; break;
...@@ -7400,7 +7400,7 @@ yyreduce: ...@@ -7400,7 +7400,7 @@ yyreduce:
case 222: case 222:
#line 2306 "mrbgems/mruby-compiler/core/parse.y" #line 2306 "mrbgems/mruby-compiler/core/parse.y"
{ {
(yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "-@"); (yyval.nd) = new_negate(p, (yyvsp[0].nd));
} }
#line 7406 "mrbgems/mruby-compiler/core/y.tab.c" #line 7406 "mrbgems/mruby-compiler/core/y.tab.c"
break; break;
...@@ -9183,7 +9183,7 @@ yyreduce: ...@@ -9183,7 +9183,7 @@ yyreduce:
case 477: case 477:
#line 3465 "mrbgems/mruby-compiler/core/parse.y" #line 3465 "mrbgems/mruby-compiler/core/parse.y"
{ {
(yyval.nd) = negate_lit(p, (yyvsp[0].nd)); (yyval.nd) = new_negate(p, (yyvsp[0].nd));
} }
#line 9189 "mrbgems/mruby-compiler/core/y.tab.c" #line 9189 "mrbgems/mruby-compiler/core/y.tab.c"
break; break;
...@@ -9191,7 +9191,7 @@ yyreduce: ...@@ -9191,7 +9191,7 @@ yyreduce:
case 478: case 478:
#line 3469 "mrbgems/mruby-compiler/core/parse.y" #line 3469 "mrbgems/mruby-compiler/core/parse.y"
{ {
(yyval.nd) = negate_lit(p, (yyvsp[0].nd)); (yyval.nd) = new_negate(p, (yyvsp[0].nd));
} }
#line 9197 "mrbgems/mruby-compiler/core/y.tab.c" #line 9197 "mrbgems/mruby-compiler/core/y.tab.c"
break; break;
......
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