diff options
Diffstat (limited to 'src/runtime/c/pgf/jit.c')
| -rw-r--r-- | src/runtime/c/pgf/jit.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/runtime/c/pgf/jit.c b/src/runtime/c/pgf/jit.c index 0470b7f9f..09fdf3bc6 100644 --- a/src/runtime/c/pgf/jit.c +++ b/src/runtime/c/pgf/jit.c @@ -1093,6 +1093,28 @@ pgf_jit_function(PgfReader* rdr, PgfAbstr* abstr, jit_bare_ret(a*sizeof(PgfClosure*)); break; } + case PGF_INSTR_DROP: { + size_t n = pgf_read_int(rdr); + size_t target = pgf_read_int(rdr); + +#ifdef PGF_JIT_DEBUG + gu_printf(out, err, "DROP %d %03d\n", n, target); +#endif + + if (n > 0) + jit_addi_p(JIT_SP, JIT_SP, n*sizeof(PgfClosure*)); + + jit_insn *jump = + jit_jmpi(jit_forward()); + + PgfSegmentPatch label_patch; + label_patch.segment = target; + label_patch.ref = jump; + label_patch.is_abs = false; + gu_buf_push(rdr->jit_state->segment_patches, PgfSegmentPatch, label_patch); + + break; + } case PGF_INSTR_FAIL: #ifdef PGF_JIT_DEBUG gu_printf(out, err, "FAIL\n"); |
