From 907df715ef751ad1e1dedc5bbbde4881944db1d7 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 2 Aug 2021 08:51:39 +0900 Subject: codegen.c: refactor unary operator optimization. --- mrbgems/mruby-compiler/core/codegen.c | 37 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 17 deletions(-) (limited to 'mrbgems/mruby-compiler/core/codegen.c') diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 4c1fa257c..9221cd91b 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1106,25 +1106,28 @@ gen_int(codegen_scope *s, uint16_t dst, mrb_int i) } } -static void +static mrb_bool gen_uniop(codegen_scope *s, mrb_sym sym, uint16_t dst) { struct mrb_insn_data data = mrb_last_insn(s); mrb_int n; - if (get_int_operand(s, &data, &n)) { - rewind_pc(s); - if (sym == MRB_OPSYM_2(s->mrb, minus)) { - n = -n; - } - else if (sym == MRB_OPSYM_2(s->mrb, neg)) { - n = ~n; - } - gen_int(s, dst, n); + if (!get_int_operand(s, &data, &n)) return FALSE; + if (sym == MRB_OPSYM_2(s->mrb, plus)) { + /* unary plus does nothing */ + } + else if (sym == MRB_OPSYM_2(s->mrb, minus)) { + n = -n; + } + else if (sym == MRB_OPSYM_2(s->mrb, neg)) { + n = ~n; } else { - genop_3(s, OP_SEND, dst, new_sym(s, sym), 0); + return FALSE; } + s->pc = addr_pc(s, data.addr); + gen_int(s, dst, n); + return TRUE; } static int @@ -1602,11 +1605,8 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe) else if (!noop && sym == MRB_OPSYM_2(s->mrb, eq) && n == 1) { genop_1(s, OP_EQ, cursp()); } - else if (!noop && n == 0 && - (sym == MRB_OPSYM_2(s->mrb, plus) || - sym == MRB_OPSYM_2(s->mrb, minus) || - sym == MRB_OPSYM_2(s->mrb, neg))) { - gen_uniop(s, sym, cursp()); + else if (!noop && n == 0 && gen_uniop(s, sym, cursp())) { + /* constant folding succeeded */ } else if (!noop && n == 1 && gen_binop(s, sym, cursp())) { /* constant folding succeeded */ @@ -2981,7 +2981,10 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, tree, VAL); pop(); push_n(2);pop_n(2); /* space for receiver&block */ - gen_uniop(s, MRB_OPSYM_2(s->mrb, minus), cursp()); + mrb_sym minus = MRB_OPSYM_2(s->mrb, minus); + if (!gen_uniop(s, minus, cursp())) { + genop_3(s, OP_SEND, cursp(), new_sym(s, minus), 0); + } push(); } else { -- cgit v1.2.3