diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-12-01 14:28:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-12-01 14:28:27 +0900 |
| commit | 7d6b8024b56f59289baba5bc94a4ab5bf82f8298 (patch) | |
| tree | 4d42fd38fedb5e4a912de80ee22bf1fac60d7187 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 2e2f81a443f0af24da877aa8c39a1aef2badde3c (diff) | |
| download | mruby-7d6b8024b56f59289baba5bc94a4ab5bf82f8298.tar.gz mruby-7d6b8024b56f59289baba5bc94a4ab5bf82f8298.zip | |
codegen.c: fix a bug in `OP_ADDI` and `OP_SUBI` regarding negative values.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index fa755e1e7..a1cde4d7d 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -779,13 +779,16 @@ gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst) mrb_int n0; if (addr_pc(s, data.addr) == s->lastlabel || !get_int_operand(s, &data0, &n0)) { /* OP_ADDI/OP_SUBI takes upto 16bits */ - if (n > INT16_MAX) goto normal; + if (n > INT16_MAX || n < INT16_MIN) goto normal; rewind_pc(s); - if (op == OP_ADD) { - genop_2(s, OP_ADDI, dst, (uint16_t)n); - } - else { - genop_2(s, OP_SUBI, dst, (uint16_t)n); + if (n > 0) { + if (op == OP_ADD) genop_2(s, OP_ADDI, dst, (uint16_t)n); + else genop_2(s, OP_SUBI, dst, (uint16_t)n); + } + else { /* n < 0 */ + n = -n; + if (op == OP_ADD) genop_2(s, OP_SUBI, dst, (uint16_t)n); + else genop_2(s, OP_ADDI, dst, (uint16_t)n); } return; } |
