Module: RubyVM::MJIT
- Defined in:
- lib/mjit/instruction.rb
Defined Under Namespace
Classes: Instruction
Constant Summary collapse
- INSNS =
{ 0 => Instruction.new( name: :nop, bin: 0, # BIN(nop) len: 1, # insn_len expr: "{\n /* none */\n}\n EXPR\n declarations: [],\n preamble: [],\n opes: [],\n pops: [],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 1 => Instruction.new(\n name: :getlocal,\n bin: 1, # BIN(getlocal)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = *(vm_get_ep(GET_EP(), level) - idx);\n RB_DEBUG_COUNTER_INC(lvar_get);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}, {:decl=>\"rb_num_t level\", :type=>\"rb_num_t\", :name=>\"level\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 2 => Instruction.new(\n name: :setlocal,\n bin: 2, # BIN(setlocal)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);\n RB_DEBUG_COUNTER_INC(lvar_set);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}, {:decl=>\"rb_num_t level\", :type=>\"rb_num_t\", :name=>\"level\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 3 => Instruction.new(\n name: :getblockparam,\n bin: 3, # BIN(getblockparam)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n const VALUE *ep = vm_get_ep(GET_EP(), level);\n VM_ASSERT(VM_ENV_LOCAL_P(ep));\n\n if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {\n val = rb_vm_bh_to_procval(ec, VM_ENV_BLOCK_HANDLER(ep));\n vm_env_write(ep, -(int)idx, val);\n VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);\n }\n else {\n val = *(ep - idx);\n RB_DEBUG_COUNTER_INC(lvar_get);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}, {:decl=>\"rb_num_t level\", :type=>\"rb_num_t\", :name=>\"level\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 4 => Instruction.new(\n name: :setblockparam,\n bin: 4, # BIN(setblockparam)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n const VALUE *ep = vm_get_ep(GET_EP(), level);\n VM_ASSERT(VM_ENV_LOCAL_P(ep));\n\n vm_env_write(ep, -(int)idx, val);\n RB_DEBUG_COUNTER_INC(lvar_set);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n\n VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}, {:decl=>\"rb_num_t level\", :type=>\"rb_num_t\", :name=>\"level\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 5 => Instruction.new(\n name: :getblockparamproxy,\n bin: 5, # BIN(getblockparamproxy)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n const VALUE *ep = vm_get_ep(GET_EP(), level);\n VM_ASSERT(VM_ENV_LOCAL_P(ep));\n\n if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {\n VALUE block_handler = VM_ENV_BLOCK_HANDLER(ep);\n\n if (block_handler) {\n switch (vm_block_handler_type(block_handler)) {\n case block_handler_type_iseq:\n case block_handler_type_ifunc:\n val = rb_block_param_proxy;\n break;\n case block_handler_type_symbol:\n val = rb_sym_to_proc(VM_BH_TO_SYMBOL(block_handler));\n goto INSN_LABEL(set);\n case block_handler_type_proc:\n val = VM_BH_TO_PROC(block_handler);\n goto INSN_LABEL(set);\n default:\n VM_UNREACHABLE(getblockparamproxy);\n }\n }\n else {\n val = Qnil;\n INSN_LABEL(set):\n vm_env_write(ep, -(int)idx, val);\n VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);\n }\n }\n else {\n val = *(ep - idx);\n RB_DEBUG_COUNTER_INC(lvar_get);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}, {:decl=>\"rb_num_t level\", :type=>\"rb_num_t\", :name=>\"level\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 6 => Instruction.new(\n name: :getspecial,\n bin: 6, # BIN(getspecial)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_getspecial(ec, GET_LEP(), key, type);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) key, type\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t key\", :type=>\"rb_num_t\", :name=>\"key\"}, {:decl=>\"rb_num_t type\", :type=>\"rb_num_t\", :name=>\"type\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 7 => Instruction.new(\n name: :setspecial,\n bin: 7, # BIN(setspecial)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n lep_svar_set(ec, GET_LEP(), key, obj);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) obj\", \"MAYBE_UNUSED(rb_num_t) key\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t key\", :type=>\"rb_num_t\", :name=>\"key\"}],\n pops: [{:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 8 => Instruction.new(\n name: :getinstancevariable,\n bin: 8, # BIN(getinstancevariable)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_getinstancevariable(GET_ISEQ(), GET_SELF(), id, ic);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(IVC) ic\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"IVC ic\", :type=>\"IVC\", :name=>\"ic\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 9 => Instruction.new(\n name: :setinstancevariable,\n bin: 9, # BIN(setinstancevariable)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n vm_setinstancevariable(GET_ISEQ(), GET_SELF(), id, val, ic);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(IVC) ic\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"IVC ic\", :type=>\"IVC\", :name=>\"ic\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 10 => Instruction.new(\n name: :getclassvariable,\n bin: 10, # BIN(getclassvariable)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n rb_control_frame_t *cfp = GET_CFP();\n val = vm_getclassvariable(GET_ISEQ(), cfp, id, ic);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ICVARC) ic\", \"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"ICVARC ic\", :type=>\"ICVARC\", :name=>\"ic\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 11 => Instruction.new(\n name: :setclassvariable,\n bin: 11, # BIN(setclassvariable)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n vm_ensure_not_refinement_module(GET_SELF());\n vm_setclassvariable(GET_ISEQ(), GET_CFP(), id, val, ic);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ICVARC) ic\", \"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"ICVARC ic\", :type=>\"ICVARC\", :name=>\"ic\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 12 => Instruction.new(\n name: :opt_getconstant_path,\n bin: 12, # BIN(opt_getconstant_path)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n const ID *segments = ic->segments;\n struct iseq_inline_constant_cache_entry *ice = ic->entry;\n if (ice && vm_ic_hit_p(ice, GET_EP())) {\n val = ice->value;\n\n VM_ASSERT(val == vm_get_ev_const_chain(ec, segments));\n } else {\n ruby_vm_constant_cache_misses++;\n val = vm_get_ev_const_chain(ec, segments);\n vm_ic_track_const_chain(GET_CFP(), ic, segments);\n // Because leaf=false, we need to undo the PC increment to get the address to this instruction\n // INSN_ATTR(width) == 2\n vm_ic_update(GET_ISEQ(), ic, val, GET_EP(), GET_PC() - 2);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(IC) ic\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"IC ic\", :type=>\"IC\", :name=>\"ic\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 13 => Instruction.new(\n name: :getconstant,\n bin: 13, # BIN(getconstant)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_get_ev_const(ec, klass, id, allow_nil == Qtrue, 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(VALUE) allow_nil, klass, val\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}],\n pops: [{:decl=>\"VALUE klass\", :type=>\"VALUE\", :name=>\"klass\"}, {:decl=>\"VALUE allow_nil\", :type=>\"VALUE\", :name=>\"allow_nil\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 14 => Instruction.new(\n name: :setconstant,\n bin: 14, # BIN(setconstant)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n vm_check_if_namespace(cbase);\n vm_ensure_not_refinement_module(GET_SELF());\n rb_const_set(cbase, id, val);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(VALUE) cbase, val\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}, {:decl=>\"VALUE cbase\", :type=>\"VALUE\", :name=>\"cbase\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 15 => Instruction.new(\n name: :getglobal,\n bin: 15, # BIN(getglobal)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = rb_gvar_get(gid);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) gid\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ID gid\", :type=>\"ID\", :name=>\"gid\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 16 => Instruction.new(\n name: :setglobal,\n bin: 16, # BIN(setglobal)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n rb_gvar_set(gid, val);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) gid\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ID gid\", :type=>\"ID\", :name=>\"gid\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 17 => Instruction.new(\n name: :putnil,\n bin: 17, # BIN(putnil)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n val = Qnil;\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 18 => Instruction.new(\n name: :putself,\n bin: 18, # BIN(putself)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n val = GET_SELF();\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 19 => Instruction.new(\n name: :putobject,\n bin: 19, # BIN(putobject)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n /* */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 20 => Instruction.new(\n name: :putspecialobject,\n bin: 20, # BIN(putspecialobject)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n enum vm_special_object_type type;\n\n type = (enum vm_special_object_type)value_type;\n val = vm_get_special_object(GET_EP(), type);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) value_type\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t value_type\", :type=>\"rb_num_t\", :name=>\"value_type\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 21 => Instruction.new(\n name: :putstring,\n bin: 21, # BIN(putstring)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = rb_ec_str_resurrect(ec, str);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) str, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE str\", :type=>\"VALUE\", :name=>\"str\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 22 => Instruction.new(\n name: :concatstrings,\n bin: 22, # BIN(concatstrings)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = rb_str_concat_literals(num, STACK_ADDR_FROM_TOP(num));\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 23 => Instruction.new(\n name: :anytostring,\n bin: 23, # BIN(anytostring)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n val = rb_obj_as_string_result(str, val);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) str, val\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}, {:decl=>\"VALUE str\", :type=>\"VALUE\", :name=>\"str\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 24 => Instruction.new(\n name: :toregexp,\n bin: 24, # BIN(toregexp)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n const VALUE ary = rb_ary_tmp_new_from_values(0, cnt, STACK_ADDR_FROM_TOP(cnt));\n val = rb_reg_new_ary(ary, (int)opt);\n rb_ary_clear(ary);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) cnt, opt\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t opt\", :type=>\"rb_num_t\", :name=>\"opt\"}, {:decl=>\"rb_num_t cnt\", :type=>\"rb_num_t\", :name=>\"cnt\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 25 => Instruction.new(\n name: :intern,\n bin: 25, # BIN(intern)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n sym = rb_str_intern(str);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) str, sym\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE str\", :type=>\"VALUE\", :name=>\"str\"}],\n rets: [{:decl=>\"VALUE sym\", :type=>\"VALUE\", :name=>\"sym\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 26 => Instruction.new(\n name: :newarray,\n bin: 26, # BIN(newarray)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = rb_ec_ary_new_from_values(ec, num, STACK_ADDR_FROM_TOP(num));\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 27 => Instruction.new(\n name: :newarraykwsplat,\n bin: 27, # BIN(newarraykwsplat)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n if (RHASH_EMPTY_P(*STACK_ADDR_FROM_TOP(1))) {\n val = rb_ary_new4(num-1, STACK_ADDR_FROM_TOP(num));\n }\n else {\n val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num));\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 28 => Instruction.new(\n name: :duparray,\n bin: 28, # BIN(duparray)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n RUBY_DTRACE_CREATE_HOOK(ARRAY, RARRAY_LEN(ary));\n val = rb_ary_resurrect(ary);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) ary, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE ary\", :type=>\"VALUE\", :name=>\"ary\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 29 => Instruction.new(\n name: :duphash,\n bin: 29, # BIN(duphash)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n RUBY_DTRACE_CREATE_HOOK(HASH, RHASH_SIZE(hash) << 1);\n val = rb_hash_resurrect(hash);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) hash, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE hash\", :type=>\"VALUE\", :name=>\"hash\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 30 => Instruction.new(\n name: :expandarray,\n bin: 30, # BIN(expandarray)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n vm_expandarray(GET_SP(), ary, num, (int)flag);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) ary\", \"MAYBE_UNUSED(rb_num_t) flag, num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}, {:decl=>\"rb_num_t flag\", :type=>\"rb_num_t\", :name=>\"flag\"}],\n pops: [{:decl=>\"VALUE ary\", :type=>\"VALUE\", :name=>\"ary\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 31 => Instruction.new(\n name: :concatarray,\n bin: 31, # BIN(concatarray)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n ary = vm_concat_array(ary1, ary2);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) ary, ary1, ary2\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE ary1\", :type=>\"VALUE\", :name=>\"ary1\"}, {:decl=>\"VALUE ary2\", :type=>\"VALUE\", :name=>\"ary2\"}],\n rets: [{:decl=>\"VALUE ary\", :type=>\"VALUE\", :name=>\"ary\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 32 => Instruction.new(\n name: :splatarray,\n bin: 32, # BIN(splatarray)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n obj = vm_splat_array(flag, ary);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) ary, flag, obj\"],\n preamble: [],\n opes: [{:decl=>\"VALUE flag\", :type=>\"VALUE\", :name=>\"flag\"}],\n pops: [{:decl=>\"VALUE ary\", :type=>\"VALUE\", :name=>\"ary\"}],\n rets: [{:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 33 => Instruction.new(\n name: :newhash,\n bin: 33, # BIN(newhash)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n RUBY_DTRACE_CREATE_HOOK(HASH, num);\n\n if (num) {\n val = rb_hash_new_with_size(num / 2);\n rb_hash_bulk_insert(num, STACK_ADDR_FROM_TOP(num), val);\n }\n else {\n val = rb_hash_new();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 34 => Instruction.new(\n name: :newrange,\n bin: 34, # BIN(newrange)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = rb_range_new(low, high, (int)flag);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) high, low, val\", \"MAYBE_UNUSED(rb_num_t) flag\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t flag\", :type=>\"rb_num_t\", :name=>\"flag\"}],\n pops: [{:decl=>\"VALUE low\", :type=>\"VALUE\", :name=>\"low\"}, {:decl=>\"VALUE high\", :type=>\"VALUE\", :name=>\"high\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 35 => Instruction.new(\n name: :pop,\n bin: 35, # BIN(pop)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n (void)val;\n /* none */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 36 => Instruction.new(\n name: :dup,\n bin: 36, # BIN(dup)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n val1 = val2 = val;\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val, val1, val2\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [{:decl=>\"VALUE val1\", :type=>\"VALUE\", :name=>\"val1\"}, {:decl=>\"VALUE val2\", :type=>\"VALUE\", :name=>\"val2\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 37 => Instruction.new(\n name: :dupn,\n bin: 37, # BIN(dupn)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n void *dst = GET_SP();\n void *src = STACK_ADDR_FROM_TOP(n);\n\n MEMCPY(dst, src, VALUE, n);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(rb_num_t) n\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t n\", :type=>\"rb_num_t\", :name=>\"n\"}],\n pops: [],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 38 => Instruction.new(\n name: :swap,\n bin: 38, # BIN(swap)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n /* none */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) obj, val\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}, {:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 39 => Instruction.new(\n name: :opt_reverse,\n bin: 39, # BIN(opt_reverse)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n rb_num_t i;\n VALUE *sp = STACK_ADDR_FROM_TOP(n);\n\n for (i=0; i<n/2; i++) {\n VALUE v0 = sp[i];\n VALUE v1 = TOPN(i);\n sp[i] = v1;\n TOPN(i) = v0;\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(rb_num_t) n\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t n\", :type=>\"rb_num_t\", :name=>\"n\"}],\n pops: [],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 40 => Instruction.new(\n name: :topn,\n bin: 40, # BIN(topn)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = TOPN(n);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) n\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t n\", :type=>\"rb_num_t\", :name=>\"n\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 41 => Instruction.new(\n name: :setn,\n bin: 41, # BIN(setn)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n TOPN(n) = val;\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) n\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t n\", :type=>\"rb_num_t\", :name=>\"n\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 42 => Instruction.new(\n name: :adjuststack,\n bin: 42, # BIN(adjuststack)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n /* none */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(rb_num_t) n\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t n\", :type=>\"rb_num_t\", :name=>\"n\"}],\n pops: [],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 43 => Instruction.new(\n name: :defined,\n bin: 43, # BIN(defined)\n len: 4, # insn_len\n expr: <<-EXPR,\n{\n val = Qnil;\n if (vm_defined(ec, GET_CFP(), op_type, obj, v)) {\n val = pushval;\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) obj, pushval, v, val\", \"MAYBE_UNUSED(rb_num_t) op_type\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t op_type\", :type=>\"rb_num_t\", :name=>\"op_type\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}, {:decl=>\"VALUE pushval\", :type=>\"VALUE\", :name=>\"pushval\"}],\n pops: [{:decl=>\"VALUE v\", :type=>\"VALUE\", :name=>\"v\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 44 => Instruction.new(\n name: :checkmatch,\n bin: 44, # BIN(checkmatch)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n result = vm_check_match(ec, target, pattern, flag);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) pattern, result, target\", \"MAYBE_UNUSED(rb_num_t) flag\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t flag\", :type=>\"rb_num_t\", :name=>\"flag\"}],\n pops: [{:decl=>\"VALUE target\", :type=>\"VALUE\", :name=>\"target\"}, {:decl=>\"VALUE pattern\", :type=>\"VALUE\", :name=>\"pattern\"}],\n rets: [{:decl=>\"VALUE result\", :type=>\"VALUE\", :name=>\"result\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 45 => Instruction.new(\n name: :checkkeyword,\n bin: 45, # BIN(checkkeyword)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) ret\", \"MAYBE_UNUSED(lindex_t) keyword_index, kw_bits_index\"],\n preamble: [],\n opes: [{:decl=>\"lindex_t kw_bits_index\", :type=>\"lindex_t\", :name=>\"kw_bits_index\"}, {:decl=>\"lindex_t keyword_index\", :type=>\"lindex_t\", :name=>\"keyword_index\"}],\n pops: [],\n rets: [{:decl=>\"VALUE ret\", :type=>\"VALUE\", :name=>\"ret\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 46 => Instruction.new(\n name: :checktype,\n bin: 46, # BIN(checktype)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n ret = RBOOL(TYPE(val) == (int)type);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) ret, val\", \"MAYBE_UNUSED(rb_num_t) type\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t type\", :type=>\"rb_num_t\", :name=>\"type\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [{:decl=>\"VALUE ret\", :type=>\"VALUE\", :name=>\"ret\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 47 => Instruction.new(\n name: :defineclass,\n bin: 47, # BIN(defineclass)\n len: 4, # insn_len\n expr: <<-EXPR,\n{\n VALUE klass = vm_find_or_create_class_by_id(id, flags, cbase, super);\n\n rb_iseq_check(class_iseq);\n\n /* enter scope */\n vm_push_frame(ec, class_iseq, VM_FRAME_MAGIC_CLASS | VM_ENV_FLAG_LOCAL, klass,\n GET_BLOCK_HANDLER(),\n (VALUE)vm_cref_push(ec, klass, NULL, FALSE, FALSE),\n ISEQ_BODY(class_iseq)->iseq_encoded, GET_SP(),\n ISEQ_BODY(class_iseq)->local_table_size,\n ISEQ_BODY(class_iseq)->stack_max);\n RESTORE_REGS();\n NEXT_INSN();\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(ISEQ) class_iseq\", \"MAYBE_UNUSED(VALUE) cbase, super, val\", \"MAYBE_UNUSED(rb_num_t) flags\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"ISEQ class_iseq\", :type=>\"ISEQ\", :name=>\"class_iseq\"}, {:decl=>\"rb_num_t flags\", :type=>\"rb_num_t\", :name=>\"flags\"}],\n pops: [{:decl=>\"VALUE cbase\", :type=>\"VALUE\", :name=>\"cbase\"}, {:decl=>\"VALUE super\", :type=>\"VALUE\", :name=>\"super\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 48 => Instruction.new(\n name: :definemethod,\n bin: 48, # BIN(definemethod)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n vm_define_method(ec, Qnil, id, (VALUE)iseq, FALSE);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(ISEQ) iseq\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"ISEQ iseq\", :type=>\"ISEQ\", :name=>\"iseq\"}],\n pops: [],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 49 => Instruction.new(\n name: :definesmethod,\n bin: 49, # BIN(definesmethod)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n vm_define_method(ec, obj, id, (VALUE)iseq, TRUE);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ID) id\", \"MAYBE_UNUSED(ISEQ) iseq\", \"MAYBE_UNUSED(VALUE) obj\"],\n preamble: [],\n opes: [{:decl=>\"ID id\", :type=>\"ID\", :name=>\"id\"}, {:decl=>\"ISEQ iseq\", :type=>\"ISEQ\", :name=>\"iseq\"}],\n pops: [{:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 50 => Instruction.new(\n name: :send,\n bin: 50, # BIN(send)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, false);\n val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method);\n\n if (val == Qundef) {\n RESTORE_REGS();\n NEXT_INSN();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(ISEQ) blockiseq\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}, {:decl=>\"ISEQ blockiseq\", :type=>\"ISEQ\", :name=>\"blockiseq\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 51 => Instruction.new(\n name: :opt_send_without_block,\n bin: 51, # BIN(opt_send_without_block)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n VALUE bh = VM_BLOCK_HANDLER_NONE;\n val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method);\n\n if (val == Qundef) {\n RESTORE_REGS();\n NEXT_INSN();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 52 => Instruction.new(\n name: :objtostring,\n bin: 52, # BIN(objtostring)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_objtostring(GET_ISEQ(), recv, cd);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 53 => Instruction.new(\n name: :opt_str_freeze,\n bin: 53, # BIN(opt_str_freeze)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze);\n\n if (val == Qundef) {\n PUSH(rb_str_resurrect(str));\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) str, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE str\", :type=>\"VALUE\", :name=>\"str\"}, {:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 54 => Instruction.new(\n name: :opt_nil_p,\n bin: 54, # BIN(opt_nil_p)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_nil_p(GET_ISEQ(), cd, recv);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 55 => Instruction.new(\n name: :opt_str_uminus,\n bin: 55, # BIN(opt_str_uminus)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus);\n\n if (val == Qundef) {\n PUSH(rb_str_resurrect(str));\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) str, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE str\", :type=>\"VALUE\", :name=>\"str\"}, {:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 56 => Instruction.new(\n name: :opt_newarray_max,\n bin: 56, # BIN(opt_newarray_max)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_newarray_max(ec, num, STACK_ADDR_FROM_TOP(num));\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 57 => Instruction.new(\n name: :opt_newarray_min,\n bin: 57, # BIN(opt_newarray_min)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_newarray_min(ec, num, STACK_ADDR_FROM_TOP(num));\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) num\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t num\", :type=>\"rb_num_t\", :name=>\"num\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 58 => Instruction.new(\n name: :invokesuper,\n bin: 58, # BIN(invokesuper)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, true);\n val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_super);\n\n if (val == Qundef) {\n RESTORE_REGS();\n NEXT_INSN();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(ISEQ) blockiseq\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}, {:decl=>\"ISEQ blockiseq\", :type=>\"ISEQ\", :name=>\"blockiseq\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 59 => Instruction.new(\n name: :invokeblock,\n bin: 59, # BIN(invokeblock)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n VALUE bh = VM_BLOCK_HANDLER_NONE;\n val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_invokeblock);\n\n if (val == Qundef) {\n RESTORE_REGS();\n NEXT_INSN();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 60 => Instruction.new(\n name: :leave,\n bin: 60, # BIN(leave)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n if (OPT_CHECKED_RUN) {\n const VALUE *const bp = vm_base_ptr(GET_CFP());\n if (GET_SP() != bp) {\n vm_stack_consistency_error(ec, GET_CFP(), bp);\n }\n }\n\n if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {\n#if OPT_CALL_THREADED_CODE\n rb_ec_thread_ptr(ec)->retval = val;\n return 0;\n#else\n return val;\n#endif\n }\n else {\n RESTORE_REGS();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 61 => Instruction.new(\n name: :throw,\n bin: 61, # BIN(throw)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_throw(ec, GET_CFP(), throw_state, throwobj);\n THROW_EXCEPTION(val);\n /* unreachable */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) throwobj, val\", \"MAYBE_UNUSED(rb_num_t) throw_state\"],\n preamble: [],\n opes: [{:decl=>\"rb_num_t throw_state\", :type=>\"rb_num_t\", :name=>\"throw_state\"}],\n pops: [{:decl=>\"VALUE throwobj\", :type=>\"VALUE\", :name=>\"throwobj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 62 => Instruction.new(\n name: :jump,\n bin: 62, # BIN(jump)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n RUBY_VM_CHECK_INTS(ec);\n JUMP(dst);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(OFFSET) dst\"],\n preamble: [],\n opes: [{:decl=>\"OFFSET dst\", :type=>\"OFFSET\", :name=>\"dst\"}],\n pops: [],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: true,\n handles_sp?: false,\n ),\n 63 => Instruction.new(\n name: :branchif,\n bin: 63, # BIN(branchif)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n if (RTEST(val)) {\n RUBY_VM_CHECK_INTS(ec);\n JUMP(dst);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(OFFSET) dst\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"OFFSET dst\", :type=>\"OFFSET\", :name=>\"dst\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: true,\n handles_sp?: false,\n ),\n 64 => Instruction.new(\n name: :branchunless,\n bin: 64, # BIN(branchunless)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n if (!RTEST(val)) {\n RUBY_VM_CHECK_INTS(ec);\n JUMP(dst);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(OFFSET) dst\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"OFFSET dst\", :type=>\"OFFSET\", :name=>\"dst\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: true,\n handles_sp?: false,\n ),\n 65 => Instruction.new(\n name: :branchnil,\n bin: 65, # BIN(branchnil)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n if (NIL_P(val)) {\n RUBY_VM_CHECK_INTS(ec);\n JUMP(dst);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(OFFSET) dst\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"OFFSET dst\", :type=>\"OFFSET\", :name=>\"dst\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: false,\n leaf_without_check_ints?: true,\n handles_sp?: false,\n ),\n 66 => Instruction.new(\n name: :once,\n bin: 66, # BIN(once)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_once_dispatch(ec, iseq, ise);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(ISE) ise\", \"MAYBE_UNUSED(ISEQ) iseq\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"ISEQ iseq\", :type=>\"ISEQ\", :name=>\"iseq\"}, {:decl=>\"ISE ise\", :type=>\"ISE\", :name=>\"ise\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: true,\n ),\n 67 => Instruction.new(\n name: :opt_case_dispatch,\n bin: 67, # BIN(opt_case_dispatch)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n OFFSET dst = vm_case_dispatch(hash, else_offset, key);\n\n if (dst) {\n JUMP(dst);\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CDHASH) hash\", \"MAYBE_UNUSED(OFFSET) else_offset\", \"MAYBE_UNUSED(VALUE) key\"],\n preamble: [],\n opes: [{:decl=>\"CDHASH hash\", :type=>\"CDHASH\", :name=>\"hash\"}, {:decl=>\"OFFSET else_offset\", :type=>\"OFFSET\", :name=>\"else_offset\"}],\n pops: [{:decl=>\"VALUE key\", :type=>\"VALUE\", :name=>\"key\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 68 => Instruction.new(\n name: :opt_plus,\n bin: 68, # BIN(opt_plus)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_plus(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 69 => Instruction.new(\n name: :opt_minus,\n bin: 69, # BIN(opt_minus)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_minus(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 70 => Instruction.new(\n name: :opt_mult,\n bin: 70, # BIN(opt_mult)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_mult(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 71 => Instruction.new(\n name: :opt_div,\n bin: 71, # BIN(opt_div)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_div(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 72 => Instruction.new(\n name: :opt_mod,\n bin: 72, # BIN(opt_mod)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_mod(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 73 => Instruction.new(\n name: :opt_eq,\n bin: 73, # BIN(opt_eq)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = opt_equality(GET_ISEQ(), recv, obj, cd);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 74 => Instruction.new(\n name: :opt_neq,\n bin: 74, # BIN(opt_neq)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_neq(GET_ISEQ(), cd, cd_eq, recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd, cd_eq\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd_eq\", :type=>\"CALL_DATA\", :name=>\"cd_eq\"}, {:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 75 => Instruction.new(\n name: :opt_lt,\n bin: 75, # BIN(opt_lt)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_lt(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 76 => Instruction.new(\n name: :opt_le,\n bin: 76, # BIN(opt_le)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_le(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 77 => Instruction.new(\n name: :opt_gt,\n bin: 77, # BIN(opt_gt)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_gt(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 78 => Instruction.new(\n name: :opt_ge,\n bin: 78, # BIN(opt_ge)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_ge(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 79 => Instruction.new(\n name: :opt_ltlt,\n bin: 79, # BIN(opt_ltlt)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_ltlt(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 80 => Instruction.new(\n name: :opt_and,\n bin: 80, # BIN(opt_and)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_and(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 81 => Instruction.new(\n name: :opt_or,\n bin: 81, # BIN(opt_or)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_or(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 82 => Instruction.new(\n name: :opt_aref,\n bin: 82, # BIN(opt_aref)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_aref(recv, obj);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 83 => Instruction.new(\n name: :opt_aset,\n bin: 83, # BIN(opt_aset)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_aset(recv, obj, set);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj, recv, set, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE obj\", :type=>\"VALUE\", :name=>\"obj\"}, {:decl=>\"VALUE set\", :type=>\"VALUE\", :name=>\"set\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 84 => Instruction.new(\n name: :opt_aset_with,\n bin: 84, # BIN(opt_aset_with)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n VALUE tmp = vm_opt_aset_with(recv, key, val);\n\n if (tmp != Qundef) {\n val = tmp;\n }\n else {\n#ifndef MJIT_HEADER\n TOPN(0) = rb_str_resurrect(key);\n PUSH(val);\n#endif\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) key, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE key\", :type=>\"VALUE\", :name=>\"key\"}, {:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}, {:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 85 => Instruction.new(\n name: :opt_aref_with,\n bin: 85, # BIN(opt_aref_with)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_aref_with(recv, key);\n\n if (val == Qundef) {\n#ifndef MJIT_HEADER\n PUSH(rb_str_resurrect(key));\n#endif\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) key, recv, val\"],\n preamble: [],\n opes: [{:decl=>\"VALUE key\", :type=>\"VALUE\", :name=>\"key\"}, {:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 86 => Instruction.new(\n name: :opt_length,\n bin: 86, # BIN(opt_length)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_length(recv, BOP_LENGTH);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 87 => Instruction.new(\n name: :opt_size,\n bin: 87, # BIN(opt_size)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_length(recv, BOP_SIZE);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 88 => Instruction.new(\n name: :opt_empty_p,\n bin: 88, # BIN(opt_empty_p)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_empty_p(recv);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 89 => Instruction.new(\n name: :opt_succ,\n bin: 89, # BIN(opt_succ)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_succ(recv);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 90 => Instruction.new(\n name: :opt_not,\n bin: 90, # BIN(opt_not)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_not(GET_ISEQ(), cd, recv);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) recv, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE recv\", :type=>\"VALUE\", :name=>\"recv\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 91 => Instruction.new(\n name: :opt_regexpmatch2,\n bin: 91, # BIN(opt_regexpmatch2)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_opt_regexpmatch2(obj2, obj1);\n\n if (val == Qundef) {\n CALL_SIMPLE_METHOD();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(CALL_DATA) cd\", \"MAYBE_UNUSED(VALUE) obj1, obj2, val\"],\n preamble: [],\n opes: [{:decl=>\"CALL_DATA cd\", :type=>\"CALL_DATA\", :name=>\"cd\"}],\n pops: [{:decl=>\"VALUE obj2\", :type=>\"VALUE\", :name=>\"obj2\"}, {:decl=>\"VALUE obj1\", :type=>\"VALUE\", :name=>\"obj1\"}],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 92 => Instruction.new(\n name: :invokebuiltin,\n bin: 92, # BIN(invokebuiltin)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = vm_invoke_builtin(ec, reg_cfp, bf, STACK_ADDR_FROM_TOP(bf->argc));\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(RB_BUILTIN) bf\", \"MAYBE_UNUSED(VALUE) val\"],\n preamble: [],\n opes: [{:decl=>\"RB_BUILTIN bf\", :type=>\"RB_BUILTIN\", :name=>\"bf\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 93 => Instruction.new(\n name: :opt_invokebuiltin_delegate,\n bin: 93, # BIN(opt_invokebuiltin_delegate)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(RB_BUILTIN) bf\", \"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) index\"],\n preamble: [],\n opes: [{:decl=>\"RB_BUILTIN bf\", :type=>\"RB_BUILTIN\", :name=>\"bf\"}, {:decl=>\"rb_num_t index\", :type=>\"rb_num_t\", :name=>\"index\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 94 => Instruction.new(\n name: :opt_invokebuiltin_delegate_leave,\n bin: 94, # BIN(opt_invokebuiltin_delegate_leave)\n len: 3, # insn_len\n expr: <<-EXPR,\n{\n val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);\n\n /* leave fastpath */\n /* TracePoint/return fallbacks this insn to opt_invokebuiltin_delegate */\n if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {\n#if OPT_CALL_THREADED_CODE\n rb_ec_thread_ptr(ec)->retval = val;\n return 0;\n#else\n return val;\n#endif\n }\n else {\n RESTORE_REGS();\n }\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(RB_BUILTIN) bf\", \"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(rb_num_t) index\"],\n preamble: [],\n opes: [{:decl=>\"RB_BUILTIN bf\", :type=>\"RB_BUILTIN\", :name=>\"bf\"}, {:decl=>\"rb_num_t index\", :type=>\"rb_num_t\", :name=>\"index\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: false,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 95 => Instruction.new(\n name: :getlocal_WC_0,\n bin: 95, # BIN(getlocal_WC_0)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = *(vm_get_ep(GET_EP(), level) - idx);\n RB_DEBUG_COUNTER_INC(lvar_get);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [\" const rb_num_t level = 0;\"],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 96 => Instruction.new(\n name: :getlocal_WC_1,\n bin: 96, # BIN(getlocal_WC_1)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n val = *(vm_get_ep(GET_EP(), level) - idx);\n RB_DEBUG_COUNTER_INC(lvar_get);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [\" const rb_num_t level = 1;\"],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 97 => Instruction.new(\n name: :setlocal_WC_0,\n bin: 97, # BIN(setlocal_WC_0)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);\n RB_DEBUG_COUNTER_INC(lvar_set);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [\" const rb_num_t level = 0;\"],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 98 => Instruction.new(\n name: :setlocal_WC_1,\n bin: 98, # BIN(setlocal_WC_1)\n len: 2, # insn_len\n expr: <<-EXPR,\n{\n vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);\n RB_DEBUG_COUNTER_INC(lvar_set);\n (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\", \"MAYBE_UNUSED(lindex_t) idx\", \"MAYBE_UNUSED(rb_num_t) level\"],\n preamble: [\" const rb_num_t level = 1;\"],\n opes: [{:decl=>\"lindex_t idx\", :type=>\"lindex_t\", :name=>\"idx\"}],\n pops: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n rets: [],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 99 => Instruction.new(\n name: :putobject_INT2FIX_0_,\n bin: 99, # BIN(putobject_INT2FIX_0_)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n /* */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [\" const VALUE val = INT2FIX(0);\"],\n opes: [],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n 100 => Instruction.new(\n name: :putobject_INT2FIX_1_,\n bin: 100, # BIN(putobject_INT2FIX_1_)\n len: 1, # insn_len\n expr: <<-EXPR,\n{\n /* */\n}\n EXPR\n declarations: [\"MAYBE_UNUSED(VALUE) val\"],\n preamble: [\" const VALUE val = INT2FIX(1);\"],\n opes: [],\n pops: [],\n rets: [{:decl=>\"VALUE val\", :type=>\"VALUE\", :name=>\"val\"}],\n always_leaf?: true,\n leaf_without_check_ints?: false,\n handles_sp?: false,\n ),\n}\n",