summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--array.rb8
-rw-r--r--compile.c20
-rw-r--r--insns.def50
-rw-r--r--prism_compile.c3
-rw-r--r--tool/mk_builtin_loader.rb2
-rw-r--r--vm_core.h2
-rw-r--r--yjit/src/codegen.rs12
-rw-r--r--yjit/src/cruby_bindings.inc.rs359
-rw-r--r--zjit/src/cruby_bindings.inc.rs359
-rw-r--r--zjit/src/hir.rs31
10 files changed, 478 insertions, 368 deletions
diff --git a/array.rb b/array.rb
index f45e6a0d5e..4fee5ecaeb 100644
--- a/array.rb
+++ b/array.rb
@@ -217,7 +217,7 @@ class Array
undef :each
def each # :nodoc:
- Primitive.attr! :inline_block, :c_trace
+ Primitive.attr! :inline_block, :c_trace, :without_interrupts
unless defined?(yield)
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)'
@@ -235,7 +235,7 @@ class Array
undef :map
def map # :nodoc:
- Primitive.attr! :inline_block, :c_trace
+ Primitive.attr! :inline_block, :c_trace, :without_interrupts
unless defined?(yield)
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)'
@@ -261,7 +261,7 @@ class Array
undef :select
def select # :nodoc:
- Primitive.attr! :inline_block, :c_trace
+ Primitive.attr! :inline_block, :c_trace, :without_interrupts
unless defined?(yield)
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)'
@@ -288,7 +288,7 @@ class Array
undef :find
def find(if_none_proc = nil) # :nodoc:
- Primitive.attr! :inline_block, :c_trace
+ Primitive.attr! :inline_block, :c_trace, :without_interrupts
unless defined?(yield)
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)'
diff --git a/compile.c b/compile.c
index a5a0ab46e9..5d6cfb1e16 100644
--- a/compile.c
+++ b/compile.c
@@ -4433,6 +4433,7 @@ iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
ISEQ_COMPILE_DATA(iseq)->option->tailcall_optimization;
const int do_si = ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction;
const int do_ou = ISEQ_COMPILE_DATA(iseq)->option->operands_unification;
+ const int do_without_ints = ISEQ_BODY(iseq)->builtin_attrs & BUILTIN_ATTR_WITHOUT_INTERRUPTS;
int rescue_level = 0;
int tailcallopt = do_tailcallopt;
@@ -4465,6 +4466,22 @@ iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
insn_operands_unification((INSN *)list);
}
+ if (do_without_ints) {
+ INSN *item = (INSN *)list;
+ if (IS_INSN_ID(item, jump)) {
+ item->insn_id = BIN(jump_without_ints);
+ }
+ else if (IS_INSN_ID(item, branchif)) {
+ item->insn_id = BIN(branchif_without_ints);
+ }
+ else if (IS_INSN_ID(item, branchunless)) {
+ item->insn_id = BIN(branchunless_without_ints);
+ }
+ else if (IS_INSN_ID(item, branchnil)) {
+ item->insn_id = BIN(branchnil_without_ints);
+ }
+ }
+
if (do_block_optimization) {
INSN * item = (INSN *)list;
// Give up if there is a throw
@@ -9223,6 +9240,9 @@ compile_builtin_attr(rb_iseq_t *iseq, const NODE *node)
// Let the iseq act like a C method in backtraces
ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_C_TRACE;
}
+ else if (strcmp(RSTRING_PTR(string), "without_interrupts") == 0) {
+ ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_WITHOUT_INTERRUPTS;
+ }
else {
goto unknown_arg;
}
diff --git a/insns.def b/insns.def
index f9a334d824..b7a60f3d5d 100644
--- a/insns.def
+++ b/insns.def
@@ -1265,6 +1265,56 @@ branchnil
}
}
+/* same as jump, but without interrupt check */
+DEFINE_INSN
+jump_without_ints
+(OFFSET dst)
+()
+()
+// attr bool leaf = true;
+{
+ JUMP(dst);
+}
+
+/* same as branchif, but without interrupt check */
+DEFINE_INSN
+branchif_without_ints
+(OFFSET dst)
+(VALUE val)
+()
+// attr bool leaf = true;
+{
+ if (RTEST(val)) {
+ JUMP(dst);
+ }
+}
+
+/* same as branchunless, but without interrupt check */
+DEFINE_INSN
+branchunless_without_ints
+(OFFSET dst)
+(VALUE val)
+()
+// attr bool leaf = true;
+{
+ if (!RTEST(val)) {
+ JUMP(dst);
+ }
+}
+
+/* same as branchnil, but without interrupt check */
+DEFINE_INSN
+branchnil_without_ints
+(OFFSET dst)
+(VALUE val)
+()
+// attr bool leaf = true;
+{
+ if (NIL_P(val)) {
+ JUMP(dst);
+ }
+}
+
/**********************************************************/
/* for optimize */
/**********************************************************/
diff --git a/prism_compile.c b/prism_compile.c
index 731859b35a..5d83e55a77 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -3441,6 +3441,9 @@ pm_compile_builtin_attr(rb_iseq_t *iseq, const pm_scope_node_t *scope_node, cons
// Let the iseq act like a C method in backtraces
ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_C_TRACE;
}
+ else if (strcmp(RSTRING_PTR(string), "without_interrupts") == 0) {
+ ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_WITHOUT_INTERRUPTS;
+ }
else {
COMPILE_ERROR(iseq, node_location->line, "unknown argument to attr!: %s", RSTRING_PTR(string));
return COMPILE_NG;
diff --git a/tool/mk_builtin_loader.rb b/tool/mk_builtin_loader.rb
index 5aa07962f9..3ab36ec45c 100644
--- a/tool/mk_builtin_loader.rb
+++ b/tool/mk_builtin_loader.rb
@@ -6,7 +6,7 @@ require_relative 'ruby_vm/helpers/c_escape'
SUBLIBS = {}
REQUIRED = {}
-BUILTIN_ATTRS = %w[leaf inline_block use_block c_trace]
+BUILTIN_ATTRS = %w[leaf inline_block use_block c_trace without_interrupts]
module CompileWarning
@@warnings = 0
diff --git a/vm_core.h b/vm_core.h
index b700a32909..5f0266da1d 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -403,6 +403,8 @@ enum rb_builtin_attr {
BUILTIN_ATTR_INLINE_BLOCK = 0x04,
// The iseq acts like a C method in backtraces.
BUILTIN_ATTR_C_TRACE = 0x08,
+ // The iseq uses noint branch/jump opcodes that skip interrupt checking.
+ BUILTIN_ATTR_WITHOUT_INTERRUPTS = 0x10,
};
typedef VALUE (*rb_jit_func_t)(struct rb_execution_context_struct *, struct rb_control_frame_struct *);
diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs
index 0fbca85716..0a4832d094 100644
--- a/yjit/src/codegen.rs
+++ b/yjit/src/codegen.rs
@@ -4641,7 +4641,7 @@ fn gen_branchif(
let jump_offset = jit.get_arg(0).as_i32();
// Check for interrupts, but only on backward branches that may create loops
- if jump_offset < 0 {
+ if jump_offset < 0 && jit.get_opcode() != YARVINSN_branchif_without_ints as usize {
gen_check_ints(asm, Counter::branchif_interrupted);
}
@@ -4693,7 +4693,7 @@ fn gen_branchunless(
let jump_offset = jit.get_arg(0).as_i32();
// Check for interrupts, but only on backward branches that may create loops
- if jump_offset < 0 {
+ if jump_offset < 0 && jit.get_opcode() != YARVINSN_branchunless_without_ints as usize {
gen_check_ints(asm, Counter::branchunless_interrupted);
}
@@ -4746,7 +4746,7 @@ fn gen_branchnil(
let jump_offset = jit.get_arg(0).as_i32();
// Check for interrupts, but only on backward branches that may create loops
- if jump_offset < 0 {
+ if jump_offset < 0 && jit.get_opcode() != YARVINSN_branchnil_without_ints as usize {
gen_check_ints(asm, Counter::branchnil_interrupted);
}
@@ -4901,7 +4901,7 @@ fn gen_jump(
let jump_offset = jit.get_arg(0).as_i32();
// Check for interrupts, but only on backward branches that may create loops
- if jump_offset < 0 {
+ if jump_offset < 0 && jit.get_opcode() != YARVINSN_jump_without_ints as usize {
gen_check_ints(asm, Counter::jump_interrupted);
}
@@ -10777,6 +10777,10 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> {
YARVINSN_branchnil => Some(gen_branchnil),
YARVINSN_throw => Some(gen_throw),
YARVINSN_jump => Some(gen_jump),
+ YARVINSN_branchif_without_ints => Some(gen_branchif),
+ YARVINSN_branchunless_without_ints => Some(gen_branchunless),
+ YARVINSN_branchnil_without_ints => Some(gen_branchnil),
+ YARVINSN_jump_without_ints => Some(gen_jump),
YARVINSN_opt_new => Some(gen_opt_new),
YARVINSN_getblockparamproxy => Some(gen_getblockparamproxy),
diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs
index 57824f4911..9ce8b5a020 100644
--- a/yjit/src/cruby_bindings.inc.rs
+++ b/yjit/src/cruby_bindings.inc.rs
@@ -486,6 +486,7 @@ pub const BUILTIN_ATTR_LEAF: rb_builtin_attr = 1;
pub const BUILTIN_ATTR_SINGLE_NOARG_LEAF: rb_builtin_attr = 2;
pub const BUILTIN_ATTR_INLINE_BLOCK: rb_builtin_attr = 4;
pub const BUILTIN_ATTR_C_TRACE: rb_builtin_attr = 8;
+pub const BUILTIN_ATTR_WITHOUT_INTERRUPTS: rb_builtin_attr = 16;
pub type rb_builtin_attr = u32;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
@@ -775,181 +776,189 @@ pub const YARVINSN_jump: ruby_vminsn_type = 72;
pub const YARVINSN_branchif: ruby_vminsn_type = 73;
pub const YARVINSN_branchunless: ruby_vminsn_type = 74;
pub const YARVINSN_branchnil: ruby_vminsn_type = 75;
-pub const YARVINSN_once: ruby_vminsn_type = 76;
-pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 77;
-pub const YARVINSN_opt_plus: ruby_vminsn_type = 78;
-pub const YARVINSN_opt_minus: ruby_vminsn_type = 79;
-pub const YARVINSN_opt_mult: ruby_vminsn_type = 80;
-pub const YARVINSN_opt_div: ruby_vminsn_type = 81;
-pub const YARVINSN_opt_mod: ruby_vminsn_type = 82;
-pub const YARVINSN_opt_eq: ruby_vminsn_type = 83;
-pub const YARVINSN_opt_neq: ruby_vminsn_type = 84;
-pub const YARVINSN_opt_lt: ruby_vminsn_type = 85;
-pub const YARVINSN_opt_le: ruby_vminsn_type = 86;
-pub const YARVINSN_opt_gt: ruby_vminsn_type = 87;
-pub const YARVINSN_opt_ge: ruby_vminsn_type = 88;
-pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 89;
-pub const YARVINSN_opt_and: ruby_vminsn_type = 90;
-pub const YARVINSN_opt_or: ruby_vminsn_type = 91;
-pub const YARVINSN_opt_aref: ruby_vminsn_type = 92;
-pub const YARVINSN_opt_aset: ruby_vminsn_type = 93;
-pub const YARVINSN_opt_length: ruby_vminsn_type = 94;
-pub const YARVINSN_opt_size: ruby_vminsn_type = 95;
-pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 96;
-pub const YARVINSN_opt_succ: ruby_vminsn_type = 97;
-pub const YARVINSN_opt_not: ruby_vminsn_type = 98;
-pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 99;
-pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 100;
-pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 101;
-pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 102;
-pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 103;
-pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 104;
-pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 105;
-pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 106;
-pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 107;
-pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 108;
-pub const YARVINSN_trace_nop: ruby_vminsn_type = 109;
-pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 110;
-pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 111;
-pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 112;
-pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 113;
-pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 114;
-pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 115;
-pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 116;
-pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 117;
-pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 118;
-pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 119;
-pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 120;
-pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 121;
-pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 122;
-pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 123;
-pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 124;
-pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 125;
-pub const YARVINSN_trace_putnil: ruby_vminsn_type = 126;
-pub const YARVINSN_trace_putself: ruby_vminsn_type = 127;
-pub const YARVINSN_trace_putobject: ruby_vminsn_type = 128;
-pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 129;
-pub const YARVINSN_trace_putstring: ruby_vminsn_type = 130;
-pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 131;
-pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 132;
-pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 133;
-pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 134;
-pub const YARVINSN_trace_intern: ruby_vminsn_type = 135;
-pub const YARVINSN_trace_newarray: ruby_vminsn_type = 136;
-pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 137;
-pub const YARVINSN_trace_duparray: ruby_vminsn_type = 138;
-pub const YARVINSN_trace_duphash: ruby_vminsn_type = 139;
-pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 140;
-pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 141;
-pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 142;
-pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 143;
-pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 144;
-pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 145;
-pub const YARVINSN_trace_newhash: ruby_vminsn_type = 146;
-pub const YARVINSN_trace_newrange: ruby_vminsn_type = 147;
-pub const YARVINSN_trace_pop: ruby_vminsn_type = 148;
-pub const YARVINSN_trace_dup: ruby_vminsn_type = 149;
-pub const YARVINSN_trace_dupn: ruby_vminsn_type = 150;
-pub const YARVINSN_trace_swap: ruby_vminsn_type = 151;
-pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 152;
-pub const YARVINSN_trace_topn: ruby_vminsn_type = 153;
-pub const YARVINSN_trace_setn: ruby_vminsn_type = 154;
-pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 155;
-pub const YARVINSN_trace_defined: ruby_vminsn_type = 156;
-pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 157;
-pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 158;
-pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 159;
-pub const YARVINSN_trace_checktype: ruby_vminsn_type = 160;
-pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 161;
-pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 162;
-pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 163;
-pub const YARVINSN_trace_send: ruby_vminsn_type = 164;
-pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 165;
-pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 166;
-pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 167;
-pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 168;
-pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 169;
-pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 170;
-pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 171;
-pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 172;
-pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 173;
-pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 174;
-pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 175;
-pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 176;
-pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 177;
-pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 178;
-pub const YARVINSN_trace_leave: ruby_vminsn_type = 179;
-pub const YARVINSN_trace_throw: ruby_vminsn_type = 180;
-pub const YARVINSN_trace_jump: ruby_vminsn_type = 181;
-pub const YARVINSN_trace_branchif: ruby_vminsn_type = 182;
-pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 183;
-pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 184;
-pub const YARVINSN_trace_once: ruby_vminsn_type = 185;
-pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 186;
-pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 187;
-pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 188;
-pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 189;
-pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 190;
-pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 191;
-pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 192;
-pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 193;
-pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 194;
-pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 195;
-pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 196;
-pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 197;
-pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 198;
-pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 199;
-pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 200;
-pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 201;
-pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 202;
-pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 203;
-pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 204;
-pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 205;
-pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 206;
-pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 207;
-pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 208;
-pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 209;
-pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 210;
-pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 211;
-pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 212;
-pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 213;
-pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 214;
-pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 215;
-pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 216;
-pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 217;
-pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 218;
-pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 219;
-pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 220;
-pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 221;
-pub const YARVINSN_zjit_send: ruby_vminsn_type = 222;
-pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 223;
-pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 224;
-pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 225;
-pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 226;
-pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 227;
-pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 228;
-pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 229;
-pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 230;
-pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 231;
-pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 232;
-pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 233;
-pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 234;
-pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 235;
-pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 236;
-pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 237;
-pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 238;
-pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 239;
-pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 240;
-pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 241;
-pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 242;
-pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 243;
-pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 244;
-pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 245;
-pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 246;
-pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 247;
-pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 248;
-pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 249;
-pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 250;
+pub const YARVINSN_jump_without_ints: ruby_vminsn_type = 76;
+pub const YARVINSN_branchif_without_ints: ruby_vminsn_type = 77;
+pub const YARVINSN_branchunless_without_ints: ruby_vminsn_type = 78;
+pub const YARVINSN_branchnil_without_ints: ruby_vminsn_type = 79;
+pub const YARVINSN_once: ruby_vminsn_type = 80;
+pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 81;
+pub const YARVINSN_opt_plus: ruby_vminsn_type = 82;
+pub const YARVINSN_opt_minus: ruby_vminsn_type = 83;
+pub const YARVINSN_opt_mult: ruby_vminsn_type = 84;
+pub const YARVINSN_opt_div: ruby_vminsn_type = 85;
+pub const YARVINSN_opt_mod: ruby_vminsn_type = 86;
+pub const YARVINSN_opt_eq: ruby_vminsn_type = 87;
+pub const YARVINSN_opt_neq: ruby_vminsn_type = 88;
+pub const YARVINSN_opt_lt: ruby_vminsn_type = 89;
+pub const YARVINSN_opt_le: ruby_vminsn_type = 90;
+pub const YARVINSN_opt_gt: ruby_vminsn_type = 91;
+pub const YARVINSN_opt_ge: ruby_vminsn_type = 92;
+pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 93;
+pub const YARVINSN_opt_and: ruby_vminsn_type = 94;
+pub const YARVINSN_opt_or: ruby_vminsn_type = 95;
+pub const YARVINSN_opt_aref: ruby_vminsn_type = 96;
+pub const YARVINSN_opt_aset: ruby_vminsn_type = 97;
+pub const YARVINSN_opt_length: ruby_vminsn_type = 98;
+pub const YARVINSN_opt_size: ruby_vminsn_type = 99;
+pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 100;
+pub const YARVINSN_opt_succ: ruby_vminsn_type = 101;
+pub const YARVINSN_opt_not: ruby_vminsn_type = 102;
+pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 103;
+pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 104;
+pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 105;
+pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 106;
+pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 107;
+pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 108;
+pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 109;
+pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 110;
+pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 111;
+pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 112;
+pub const YARVINSN_trace_nop: ruby_vminsn_type = 113;
+pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 114;
+pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 115;
+pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 116;
+pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 117;
+pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 118;
+pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 119;
+pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 120;
+pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 121;
+pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 122;
+pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 123;
+pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 124;
+pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 125;
+pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 126;
+pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 127;
+pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 128;
+pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 129;
+pub const YARVINSN_trace_putnil: ruby_vminsn_type = 130;
+pub const YARVINSN_trace_putself: ruby_vminsn_type = 131;
+pub const YARVINSN_trace_putobject: ruby_vminsn_type = 132;
+pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 133;
+pub const YARVINSN_trace_putstring: ruby_vminsn_type = 134;
+pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 135;
+pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 136;
+pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 137;
+pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 138;
+pub const YARVINSN_trace_intern: ruby_vminsn_type = 139;
+pub const YARVINSN_trace_newarray: ruby_vminsn_type = 140;
+pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 141;
+pub const YARVINSN_trace_duparray: ruby_vminsn_type = 142;
+pub const YARVINSN_trace_duphash: ruby_vminsn_type = 143;
+pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 144;
+pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 145;
+pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 146;
+pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 147;
+pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 148;
+pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 149;
+pub const YARVINSN_trace_newhash: ruby_vminsn_type = 150;
+pub const YARVINSN_trace_newrange: ruby_vminsn_type = 151;
+pub const YARVINSN_trace_pop: ruby_vminsn_type = 152;
+pub const YARVINSN_trace_dup: ruby_vminsn_type = 153;
+pub const YARVINSN_trace_dupn: ruby_vminsn_type = 154;
+pub const YARVINSN_trace_swap: ruby_vminsn_type = 155;
+pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 156;
+pub const YARVINSN_trace_topn: ruby_vminsn_type = 157;
+pub const YARVINSN_trace_setn: ruby_vminsn_type = 158;
+pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 159;
+pub const YARVINSN_trace_defined: ruby_vminsn_type = 160;
+pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 161;
+pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 162;
+pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 163;
+pub const YARVINSN_trace_checktype: ruby_vminsn_type = 164;
+pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 165;
+pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 166;
+pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 167;
+pub const YARVINSN_trace_send: ruby_vminsn_type = 168;
+pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 169;
+pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 170;
+pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 171;
+pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 172;
+pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 173;
+pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 174;
+pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 175;
+pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 176;
+pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 177;
+pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 178;
+pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 179;
+pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 180;
+pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 181;
+pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 182;
+pub const YARVINSN_trace_leave: ruby_vminsn_type = 183;
+pub const YARVINSN_trace_throw: ruby_vminsn_type = 184;
+pub const YARVINSN_trace_jump: ruby_vminsn_type = 185;
+pub const YARVINSN_trace_branchif: ruby_vminsn_type = 186;
+pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 187;
+pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 188;
+pub const YARVINSN_trace_jump_without_ints: ruby_vminsn_type = 189;
+pub const YARVINSN_trace_branchif_without_ints: ruby_vminsn_type = 190;
+pub const YARVINSN_trace_branchunless_without_ints: ruby_vminsn_type = 191;
+pub const YARVINSN_trace_branchnil_without_ints: ruby_vminsn_type = 192;
+pub const YARVINSN_trace_once: ruby_vminsn_type = 193;
+pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 194;
+pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 195;
+pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 196;
+pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 197;
+pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 198;
+pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 199;
+pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 200;
+pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 201;
+pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 202;
+pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 203;
+pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 204;
+pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 205;
+pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 206;
+pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 207;
+pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 208;
+pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 209;
+pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 210;
+pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 211;
+pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 212;
+pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 213;
+pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 214;
+pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 215;
+pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 216;
+pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 217;
+pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 218;
+pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 219;
+pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 220;
+pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 221;
+pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 222;
+pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 223;
+pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 224;
+pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 225;
+pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 226;
+pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 227;
+pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 228;
+pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 229;
+pub const YARVINSN_zjit_send: ruby_vminsn_type = 230;
+pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 231;
+pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 232;
+pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 233;
+pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 234;
+pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 235;
+pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 236;
+pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 237;
+pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 238;
+pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 239;
+pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 240;
+pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 241;
+pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 242;
+pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 243;
+pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 244;
+pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 245;
+pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 246;
+pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 247;
+pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 248;
+pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 249;
+pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 250;
+pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 251;
+pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 252;
+pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 253;
+pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 254;
+pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 255;
+pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 256;
+pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 257;
+pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 258;
pub type ruby_vminsn_type = u32;
pub type rb_iseq_callback = ::std::option::Option<
unsafe extern "C" fn(arg1: *const rb_iseq_t, arg2: *mut ::std::os::raw::c_void),
diff --git a/zjit/src/cruby_bindings.inc.rs b/zjit/src/cruby_bindings.inc.rs
index 0cd312abf9..77103b9930 100644
--- a/zjit/src/cruby_bindings.inc.rs
+++ b/zjit/src/cruby_bindings.inc.rs
@@ -585,6 +585,7 @@ pub const BUILTIN_ATTR_LEAF: rb_builtin_attr = 1;
pub const BUILTIN_ATTR_SINGLE_NOARG_LEAF: rb_builtin_attr = 2;
pub const BUILTIN_ATTR_INLINE_BLOCK: rb_builtin_attr = 4;
pub const BUILTIN_ATTR_C_TRACE: rb_builtin_attr = 8;
+pub const BUILTIN_ATTR_WITHOUT_INTERRUPTS: rb_builtin_attr = 16;
pub type rb_builtin_attr = u32;
pub type rb_jit_func_t = ::std::option::Option<
unsafe extern "C" fn(
@@ -1564,181 +1565,189 @@ pub const YARVINSN_jump: ruby_vminsn_type = 72;
pub const YARVINSN_branchif: ruby_vminsn_type = 73;
pub const YARVINSN_branchunless: ruby_vminsn_type = 74;
pub const YARVINSN_branchnil: ruby_vminsn_type = 75;
-pub const YARVINSN_once: ruby_vminsn_type = 76;
-pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 77;
-pub const YARVINSN_opt_plus: ruby_vminsn_type = 78;
-pub const YARVINSN_opt_minus: ruby_vminsn_type = 79;
-pub const YARVINSN_opt_mult: ruby_vminsn_type = 80;
-pub const YARVINSN_opt_div: ruby_vminsn_type = 81;
-pub const YARVINSN_opt_mod: ruby_vminsn_type = 82;
-pub const YARVINSN_opt_eq: ruby_vminsn_type = 83;
-pub const YARVINSN_opt_neq: ruby_vminsn_type = 84;
-pub const YARVINSN_opt_lt: ruby_vminsn_type = 85;
-pub const YARVINSN_opt_le: ruby_vminsn_type = 86;
-pub const YARVINSN_opt_gt: ruby_vminsn_type = 87;
-pub const YARVINSN_opt_ge: ruby_vminsn_type = 88;
-pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 89;
-pub const YARVINSN_opt_and: ruby_vminsn_type = 90;
-pub const YARVINSN_opt_or: ruby_vminsn_type = 91;
-pub const YARVINSN_opt_aref: ruby_vminsn_type = 92;
-pub const YARVINSN_opt_aset: ruby_vminsn_type = 93;
-pub const YARVINSN_opt_length: ruby_vminsn_type = 94;
-pub const YARVINSN_opt_size: ruby_vminsn_type = 95;
-pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 96;
-pub const YARVINSN_opt_succ: ruby_vminsn_type = 97;
-pub const YARVINSN_opt_not: ruby_vminsn_type = 98;
-pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 99;
-pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 100;
-pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 101;
-pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 102;
-pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 103;
-pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 104;
-pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 105;
-pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 106;
-pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 107;
-pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 108;
-pub const YARVINSN_trace_nop: ruby_vminsn_type = 109;
-pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 110;
-pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 111;
-pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 112;
-pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 113;
-pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 114;
-pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 115;
-pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 116;
-pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 117;
-pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 118;
-pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 119;
-pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 120;
-pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 121;
-pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 122;
-pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 123;
-pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 124;
-pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 125;
-pub const YARVINSN_trace_putnil: ruby_vminsn_type = 126;
-pub const YARVINSN_trace_putself: ruby_vminsn_type = 127;
-pub const YARVINSN_trace_putobject: ruby_vminsn_type = 128;
-pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 129;
-pub const YARVINSN_trace_putstring: ruby_vminsn_type = 130;
-pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 131;
-pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 132;
-pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 133;
-pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 134;
-pub const YARVINSN_trace_intern: ruby_vminsn_type = 135;
-pub const YARVINSN_trace_newarray: ruby_vminsn_type = 136;
-pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 137;
-pub const YARVINSN_trace_duparray: ruby_vminsn_type = 138;
-pub const YARVINSN_trace_duphash: ruby_vminsn_type = 139;
-pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 140;
-pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 141;
-pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 142;
-pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 143;
-pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 144;
-pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 145;
-pub const YARVINSN_trace_newhash: ruby_vminsn_type = 146;
-pub const YARVINSN_trace_newrange: ruby_vminsn_type = 147;
-pub const YARVINSN_trace_pop: ruby_vminsn_type = 148;
-pub const YARVINSN_trace_dup: ruby_vminsn_type = 149;
-pub const YARVINSN_trace_dupn: ruby_vminsn_type = 150;
-pub const YARVINSN_trace_swap: ruby_vminsn_type = 151;
-pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 152;
-pub const YARVINSN_trace_topn: ruby_vminsn_type = 153;
-pub const YARVINSN_trace_setn: ruby_vminsn_type = 154;
-pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 155;
-pub const YARVINSN_trace_defined: ruby_vminsn_type = 156;
-pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 157;
-pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 158;
-pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 159;
-pub const YARVINSN_trace_checktype: ruby_vminsn_type = 160;
-pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 161;
-pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 162;
-pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 163;
-pub const YARVINSN_trace_send: ruby_vminsn_type = 164;
-pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 165;
-pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 166;
-pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 167;
-pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 168;
-pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 169;
-pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 170;
-pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 171;
-pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 172;
-pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 173;
-pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 174;
-pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 175;
-pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 176;
-pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 177;
-pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 178;
-pub const YARVINSN_trace_leave: ruby_vminsn_type = 179;
-pub const YARVINSN_trace_throw: ruby_vminsn_type = 180;
-pub const YARVINSN_trace_jump: ruby_vminsn_type = 181;
-pub const YARVINSN_trace_branchif: ruby_vminsn_type = 182;
-pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 183;
-pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 184;
-pub const YARVINSN_trace_once: ruby_vminsn_type = 185;
-pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 186;
-pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 187;
-pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 188;
-pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 189;
-pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 190;
-pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 191;
-pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 192;
-pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 193;
-pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 194;
-pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 195;
-pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 196;
-pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 197;
-pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 198;
-pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 199;
-pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 200;
-pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 201;
-pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 202;
-pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 203;
-pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 204;
-pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 205;
-pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 206;
-pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 207;
-pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 208;
-pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 209;
-pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 210;
-pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 211;
-pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 212;
-pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 213;
-pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 214;
-pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 215;
-pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 216;
-pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 217;
-pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 218;
-pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 219;
-pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 220;
-pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 221;
-pub const YARVINSN_zjit_send: ruby_vminsn_type = 222;
-pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 223;
-pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 224;
-pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 225;
-pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 226;
-pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 227;
-pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 228;
-pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 229;
-pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 230;
-pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 231;
-pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 232;
-pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 233;
-pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 234;
-pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 235;
-pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 236;
-pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 237;
-pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 238;
-pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 239;
-pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 240;
-pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 241;
-pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 242;
-pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 243;
-pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 244;
-pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 245;
-pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 246;
-pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 247;
-pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 248;
-pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 249;
-pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 250;
+pub const YARVINSN_jump_without_ints: ruby_vminsn_type = 76;
+pub const YARVINSN_branchif_without_ints: ruby_vminsn_type = 77;
+pub const YARVINSN_branchunless_without_ints: ruby_vminsn_type = 78;
+pub const YARVINSN_branchnil_without_ints: ruby_vminsn_type = 79;
+pub const YARVINSN_once: ruby_vminsn_type = 80;
+pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 81;
+pub const YARVINSN_opt_plus: ruby_vminsn_type = 82;
+pub const YARVINSN_opt_minus: ruby_vminsn_type = 83;
+pub const YARVINSN_opt_mult: ruby_vminsn_type = 84;
+pub const YARVINSN_opt_div: ruby_vminsn_type = 85;
+pub const YARVINSN_opt_mod: ruby_vminsn_type = 86;
+pub const YARVINSN_opt_eq: ruby_vminsn_type = 87;
+pub const YARVINSN_opt_neq: ruby_vminsn_type = 88;
+pub const YARVINSN_opt_lt: ruby_vminsn_type = 89;
+pub const YARVINSN_opt_le: ruby_vminsn_type = 90;
+pub const YARVINSN_opt_gt: ruby_vminsn_type = 91;
+pub const YARVINSN_opt_ge: ruby_vminsn_type = 92;
+pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 93;
+pub const YARVINSN_opt_and: ruby_vminsn_type = 94;
+pub const YARVINSN_opt_or: ruby_vminsn_type = 95;
+pub const YARVINSN_opt_aref: ruby_vminsn_type = 96;
+pub const YARVINSN_opt_aset: ruby_vminsn_type = 97;
+pub const YARVINSN_opt_length: ruby_vminsn_type = 98;
+pub const YARVINSN_opt_size: ruby_vminsn_type = 99;
+pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 100;
+pub const YARVINSN_opt_succ: ruby_vminsn_type = 101;
+pub const YARVINSN_opt_not: ruby_vminsn_type = 102;
+pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 103;
+pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 104;
+pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 105;
+pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 106;
+pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 107;
+pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 108;
+pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 109;
+pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 110;
+pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 111;
+pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 112;
+pub const YARVINSN_trace_nop: ruby_vminsn_type = 113;
+pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 114;
+pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 115;
+pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 116;
+pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 117;
+pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 118;
+pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 119;
+pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 120;
+pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 121;
+pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 122;
+pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 123;
+pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 124;
+pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 125;
+pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 126;
+pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 127;
+pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 128;
+pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 129;
+pub const YARVINSN_trace_putnil: ruby_vminsn_type = 130;
+pub const YARVINSN_trace_putself: ruby_vminsn_type = 131;
+pub const YARVINSN_trace_putobject: ruby_vminsn_type = 132;
+pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 133;
+pub const YARVINSN_trace_putstring: ruby_vminsn_type = 134;
+pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 135;
+pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 136;
+pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 137;
+pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 138;
+pub const YARVINSN_trace_intern: ruby_vminsn_type = 139;
+pub const YARVINSN_trace_newarray: ruby_vminsn_type = 140;
+pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 141;
+pub const YARVINSN_trace_duparray: ruby_vminsn_type = 142;
+pub const YARVINSN_trace_duphash: ruby_vminsn_type = 143;
+pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 144;
+pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 145;
+pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 146;
+pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 147;
+pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 148;
+pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 149;
+pub const YARVINSN_trace_newhash: ruby_vminsn_type = 150;
+pub const YARVINSN_trace_newrange: ruby_vminsn_type = 151;
+pub const YARVINSN_trace_pop: ruby_vminsn_type = 152;
+pub const YARVINSN_trace_dup: ruby_vminsn_type = 153;
+pub const YARVINSN_trace_dupn: ruby_vminsn_type = 154;
+pub const YARVINSN_trace_swap: ruby_vminsn_type = 155;
+pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 156;
+pub const YARVINSN_trace_topn: ruby_vminsn_type = 157;
+pub const YARVINSN_trace_setn: ruby_vminsn_type = 158;
+pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 159;
+pub const YARVINSN_trace_defined: ruby_vminsn_type = 160;
+pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 161;
+pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 162;
+pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 163;
+pub const YARVINSN_trace_checktype: ruby_vminsn_type = 164;
+pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 165;
+pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 166;
+pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 167;
+pub const YARVINSN_trace_send: ruby_vminsn_type = 168;
+pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 169;
+pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 170;
+pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 171;
+pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 172;
+pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 173;
+pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 174;
+pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 175;
+pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 176;
+pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 177;
+pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 178;
+pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 179;
+pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 180;
+pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 181;
+pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 182;
+pub const YARVINSN_trace_leave: ruby_vminsn_type = 183;
+pub const YARVINSN_trace_throw: ruby_vminsn_type = 184;
+pub const YARVINSN_trace_jump: ruby_vminsn_type = 185;
+pub const YARVINSN_trace_branchif: ruby_vminsn_type = 186;
+pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 187;
+pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 188;
+pub const YARVINSN_trace_jump_without_ints: ruby_vminsn_type = 189;
+pub const YARVINSN_trace_branchif_without_ints: ruby_vminsn_type = 190;
+pub const YARVINSN_trace_branchunless_without_ints: ruby_vminsn_type = 191;
+pub const YARVINSN_trace_branchnil_without_ints: ruby_vminsn_type = 192;
+pub const YARVINSN_trace_once: ruby_vminsn_type = 193;
+pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 194;
+pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 195;
+pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 196;
+pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 197;
+pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 198;
+pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 199;
+pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 200;
+pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 201;
+pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 202;
+pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 203;
+pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 204;
+pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 205;
+pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 206;
+pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 207;
+pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 208;
+pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 209;
+pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 210;
+pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 211;
+pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 212;
+pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 213;
+pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 214;
+pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 215;
+pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 216;
+pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 217;
+pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 218;
+pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 219;
+pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 220;
+pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 221;
+pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 222;
+pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 223;
+pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 224;
+pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 225;
+pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 226;
+pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 227;
+pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 228;
+pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 229;
+pub const YARVINSN_zjit_send: ruby_vminsn_type = 230;
+pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 231;
+pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 232;
+pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 233;
+pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 234;
+pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 235;
+pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 236;
+pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 237;
+pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 238;
+pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 239;
+pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 240;
+pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 241;
+pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 242;
+pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 243;
+pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 244;
+pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 245;
+pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 246;
+pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 247;
+pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 248;
+pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 249;
+pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 250;
+pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 251;
+pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 252;
+pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 253;
+pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 254;
+pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 255;
+pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 256;
+pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 257;
+pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 258;
pub type ruby_vminsn_type = u32;
pub type rb_iseq_callback = ::std::option::Option<
unsafe extern "C" fn(arg1: *const rb_iseq_t, arg2: *mut ::std::os::raw::c_void),
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs
index fe0122d297..cf2371ef5a 100644
--- a/zjit/src/hir.rs
+++ b/zjit/src/hir.rs
@@ -6119,7 +6119,8 @@ fn compute_bytecode_info(iseq: *const rb_iseq_t, opt_table: &[u32]) -> BytecodeI
.unwrap();
insn_idx += insn_len(opcode as usize);
match opcode {
- YARVINSN_branchunless | YARVINSN_jump | YARVINSN_branchif | YARVINSN_branchnil => {
+ YARVINSN_branchunless | YARVINSN_jump | YARVINSN_branchif | YARVINSN_branchnil
+ | YARVINSN_branchunless_without_ints | YARVINSN_jump_without_ints | YARVINSN_branchif_without_ints | YARVINSN_branchnil_without_ints => {
let offset = get_arg(pc, 0).as_i64();
jump_targets.insert(insn_idx_at_offset(insn_idx, offset));
}
@@ -6232,6 +6233,10 @@ fn invalidates_locals(opcode: u32, operands: *const VALUE) -> bool {
| YARVINSN_branchunless
| YARVINSN_branchif
| YARVINSN_branchnil
+ | YARVINSN_jump_without_ints
+ | YARVINSN_branchunless_without_ints
+ | YARVINSN_branchif_without_ints
+ | YARVINSN_branchnil_without_ints
| YARVINSN_leave => false,
// TODO(max): Read the invokebuiltin target from operands and determine if it's leaf
_ => unsafe { !rb_zjit_insn_leaf(opcode as i32, operands) }
@@ -6655,8 +6660,10 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
let snapshot = fun.push_insn(block, Insn::Snapshot { state: exit_state });
state.stack_push(fun.push_insn(block, Insn::GetConstantPath { ic, state: snapshot }));
}
- YARVINSN_branchunless => {
- fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ YARVINSN_branchunless | YARVINSN_branchunless_without_ints => {
+ if opcode == YARVINSN_branchunless {
+ fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ }
let offset = get_arg(pc, 0).as_i64();
let val = state.stack_pop()?;
let test_id = fun.push_insn(block, Insn::Test { val });
@@ -6675,8 +6682,10 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
state.replace(val, not_nil_false);
queue.push_back((state.clone(), target, target_idx, local_inval));
}
- YARVINSN_branchif => {
- fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ YARVINSN_branchif | YARVINSN_branchif_without_ints => {
+ if opcode == YARVINSN_branchif {
+ fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ }
let offset = get_arg(pc, 0).as_i64();
let val = state.stack_pop()?;
let test_id = fun.push_insn(block, Insn::Test { val });
@@ -6695,8 +6704,10 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
state.replace(val, nil_false);
queue.push_back((state.clone(), target, target_idx, local_inval));
}
- YARVINSN_branchnil => {
- fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ YARVINSN_branchnil | YARVINSN_branchnil_without_ints => {
+ if opcode == YARVINSN_branchnil {
+ fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ }
let offset = get_arg(pc, 0).as_i64();
let val = state.stack_pop()?;
let test_id = fun.push_insn(block, Insn::IsNil { val });
@@ -6745,9 +6756,11 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
state.stack_setn(argc, insn_id);
state.stack_setn(argc + 1, insn_id);
}
- YARVINSN_jump => {
+ YARVINSN_jump | YARVINSN_jump_without_ints => {
let offset = get_arg(pc, 0).as_i64();
- fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ if opcode == YARVINSN_jump {
+ fun.push_insn(block, Insn::CheckInterrupts { state: exit_id });
+ }
let target_idx = insn_idx_at_offset(insn_idx, offset);
let target = insn_idx_to_block[&target_idx];
let _branch_id = fun.push_insn(block, Insn::Jump(