/* -*-c-*- *********************************************************/ /*******************************************************************/ /*******************************************************************/ /** This file is VM main loop. ---- This file is auto generated by insns2vm.rb DO NOT TOUCH! If you want to fix something, you must edit 'insns.def' */ INSN_ENTRY(nop){ { DEBUG_ENTER_INSN("nop"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_nop 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_nop_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(nop)); { #line 40 "insns.def" /* none */ #line 32 "vm.inc" #undef CURRENT_INSN_nop #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(nop);}}} INSN_ENTRY(getlocal){ { VALUE val; rb_num_t level = (rb_num_t)GET_OPERAND(2); lindex_t idx = (lindex_t)GET_OPERAND(1); DEBUG_ENTER_INSN("getlocal"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getlocal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getlocal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getlocal)); COLLECT_USAGE_OPERAND(BIN(getlocal), 0, idx); COLLECT_USAGE_OPERAND(BIN(getlocal), 1, level); { #line 60 "insns.def" int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } val = *(ep - idx); #line 65 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getlocal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getlocal);}}} INSN_ENTRY(setlocal){ { rb_num_t level = (rb_num_t)GET_OPERAND(2); lindex_t idx = (lindex_t)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setlocal"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setlocal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setlocal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setlocal)); COLLECT_USAGE_OPERAND(BIN(setlocal), 0, idx); COLLECT_USAGE_OPERAND(BIN(setlocal), 1, level); { #line 83 "insns.def" int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } vm_env_write(ep, -(int)idx, val); #line 100 "vm.inc" #undef CURRENT_INSN_setlocal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setlocal);}}} INSN_ENTRY(getspecial){ { VALUE val; rb_num_t type = (rb_num_t)GET_OPERAND(2); rb_num_t key = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("getspecial"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getspecial 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getspecial_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getspecial)); COLLECT_USAGE_OPERAND(BIN(getspecial), 0, key); COLLECT_USAGE_OPERAND(BIN(getspecial), 1, type); { #line 104 "insns.def" val = vm_getspecial(th, GET_LEP(), key, type); #line 126 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getspecial #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getspecial);}}} INSN_ENTRY(setspecial){ { rb_num_t key = (rb_num_t)GET_OPERAND(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("setspecial"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setspecial 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setspecial_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setspecial)); COLLECT_USAGE_OPERAND(BIN(setspecial), 0, key); { #line 118 "insns.def" lep_svar_set(th, GET_LEP(), key, obj); #line 152 "vm.inc" #undef CURRENT_INSN_setspecial #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setspecial);}}} INSN_ENTRY(getinstancevariable){ { VALUE val; IC ic = (IC)GET_OPERAND(2); ID id = (ID)GET_OPERAND(1); DEBUG_ENTER_INSN("getinstancevariable"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getinstancevariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getinstancevariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getinstancevariable)); COLLECT_USAGE_OPERAND(BIN(getinstancevariable), 0, id); COLLECT_USAGE_OPERAND(BIN(getinstancevariable), 1, ic); { #line 133 "insns.def" val = vm_getinstancevariable(GET_SELF(), id, ic); #line 178 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getinstancevariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getinstancevariable);}}} INSN_ENTRY(setinstancevariable){ { IC ic = (IC)GET_OPERAND(2); ID id = (ID)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setinstancevariable"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setinstancevariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setinstancevariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setinstancevariable)); COLLECT_USAGE_OPERAND(BIN(setinstancevariable), 0, id); COLLECT_USAGE_OPERAND(BIN(setinstancevariable), 1, ic); { #line 148 "insns.def" vm_setinstancevariable(GET_SELF(), id, val, ic); #line 206 "vm.inc" #undef CURRENT_INSN_setinstancevariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setinstancevariable);}}} INSN_ENTRY(getclassvariable){ { VALUE val; ID id = (ID)GET_OPERAND(1); DEBUG_ENTER_INSN("getclassvariable"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getclassvariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getclassvariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getclassvariable)); COLLECT_USAGE_OPERAND(BIN(getclassvariable), 0, id); { #line 162 "insns.def" val = rb_cvar_get(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id); #line 230 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getclassvariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getclassvariable);}}} INSN_ENTRY(setclassvariable){ { ID id = (ID)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setclassvariable"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setclassvariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setclassvariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setclassvariable)); COLLECT_USAGE_OPERAND(BIN(setclassvariable), 0, id); { #line 176 "insns.def" vm_ensure_not_refinement_module(GET_SELF()); rb_cvar_set(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id, val); #line 257 "vm.inc" #undef CURRENT_INSN_setclassvariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setclassvariable);}}} INSN_ENTRY(getconstant){ { VALUE val; ID id = (ID)GET_OPERAND(1); VALUE klass = TOPN(0); DEBUG_ENTER_INSN("getconstant"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_getconstant 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getconstant_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getconstant)); COLLECT_USAGE_OPERAND(BIN(getconstant), 0, id); { #line 198 "insns.def" val = vm_get_ev_const(th, klass, id, 0); #line 282 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getconstant #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getconstant);}}} INSN_ENTRY(setconstant){ { ID id = (ID)GET_OPERAND(1); VALUE val = TOPN(1); VALUE cbase = TOPN(0); DEBUG_ENTER_INSN("setconstant"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_setconstant 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setconstant_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setconstant)); COLLECT_USAGE_OPERAND(BIN(setconstant), 0, id); { #line 220 "insns.def" vm_check_if_namespace(cbase); vm_ensure_not_refinement_module(GET_SELF()); rb_const_set(cbase, id, val); #line 311 "vm.inc" #undef CURRENT_INSN_setconstant #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setconstant);}}} INSN_ENTRY(getglobal){ { VALUE val; GENTRY entry = (GENTRY)GET_OPERAND(1); DEBUG_ENTER_INSN("getglobal"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getglobal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getglobal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getglobal)); COLLECT_USAGE_OPERAND(BIN(getglobal), 0, entry); { #line 236 "insns.def" val = GET_GLOBAL((VALUE)entry); #line 335 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getglobal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getglobal);}}} INSN_ENTRY(setglobal){ { GENTRY entry = (GENTRY)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setglobal"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setglobal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setglobal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setglobal)); COLLECT_USAGE_OPERAND(BIN(setglobal), 0, entry); { #line 250 "insns.def" SET_GLOBAL((VALUE)entry, val); #line 361 "vm.inc" #undef CURRENT_INSN_setglobal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setglobal);}}} INSN_ENTRY(putnil){ { VALUE val; DEBUG_ENTER_INSN("putnil"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_putnil 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putnil_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putnil)); { #line 269 "insns.def" val = Qnil; #line 384 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_putnil #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putnil);}}} INSN_ENTRY(putself){ { VALUE val; DEBUG_ENTER_INSN("putself"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_putself 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putself_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putself)); { #line 283 "insns.def" val = GET_SELF(); #line 409 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_putself #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putself);}}} INSN_ENTRY(putobject){ { VALUE val = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("putobject"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putobject 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putobject_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putobject)); COLLECT_USAGE_OPERAND(BIN(putobject), 0, val); { #line 299 "insns.def" /* */ #line 434 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_putobject #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putobject);}}} INSN_ENTRY(putspecialobject){ { VALUE val; rb_num_t value_type = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("putspecialobject"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putspecialobject 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putspecialobject_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putspecialobject)); COLLECT_USAGE_OPERAND(BIN(putspecialobject), 0, value_type); { #line 314 "insns.def" enum vm_special_object_type type = (enum vm_special_object_type)value_type; switch (type) { case VM_SPECIAL_OBJECT_VMCORE: val = rb_mRubyVMFrozenCore; break; case VM_SPECIAL_OBJECT_CBASE: val = vm_get_cbase(GET_EP()); break; case VM_SPECIAL_OBJECT_CONST_BASE: val = vm_get_const_base(GET_EP()); break; default: rb_bug("putspecialobject insn: unknown value_type"); } #line 474 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_putspecialobject #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putspecialobject);}}} INSN_ENTRY(putiseq){ { VALUE ret; ISEQ iseq = (ISEQ)GET_OPERAND(1); DEBUG_ENTER_INSN("putiseq"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putiseq 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putiseq_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putiseq)); COLLECT_USAGE_OPERAND(BIN(putiseq), 0, iseq); { #line 342 "insns.def" ret = (VALUE)iseq; #line 500 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(ret); #undef CURRENT_INSN_putiseq #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putiseq);}}} INSN_ENTRY(putstring){ { VALUE val; VALUE str = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("putstring"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putstring 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putstring_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putstring)); COLLECT_USAGE_OPERAND(BIN(putstring), 0, str); { #line 356 "insns.def" val = rb_str_resurrect(str); #line 526 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_putstring #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putstring);}}} INSN_ENTRY(concatstrings){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("concatstrings"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_concatstrings 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_concatstrings_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(concatstrings)); COLLECT_USAGE_OPERAND(BIN(concatstrings), 0, num); { #line 370 "insns.def" val = rb_str_concat_literals(num, &TOPN(num-1)); POPN(num); #line 553 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_concatstrings #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(concatstrings);}}} INSN_ENTRY(tostring){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("tostring"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_tostring 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_tostring_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(tostring)); { #line 385 "insns.def" val = rb_obj_as_string(val); #line 578 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_tostring #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(tostring);}}} INSN_ENTRY(freezestring){ { VALUE debug_info = (VALUE)GET_OPERAND(1); VALUE str = TOPN(0); DEBUG_ENTER_INSN("freezestring"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_freezestring 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_freezestring_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(freezestring)); COLLECT_USAGE_OPERAND(BIN(freezestring), 0, debug_info); { #line 399 "insns.def" if (!NIL_P(debug_info)) { rb_ivar_set(str, id_debug_created_info, debug_info); } rb_str_freeze(str); #line 607 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(str); #undef CURRENT_INSN_freezestring #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(freezestring);}}} INSN_ENTRY(toregexp){ { VALUE val; rb_num_t cnt = (rb_num_t)GET_OPERAND(2); rb_num_t opt = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("toregexp"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_toregexp 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_toregexp_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(toregexp)); COLLECT_USAGE_OPERAND(BIN(toregexp), 0, opt); COLLECT_USAGE_OPERAND(BIN(toregexp), 1, cnt); { #line 418 "insns.def" VALUE rb_reg_new_ary(VALUE ary, int options); rb_num_t i; const VALUE ary = rb_ary_tmp_new(cnt); for (i = 0; i < cnt; i++) { rb_ary_store(ary, cnt-i-1, TOPN(i)); } POPN(cnt); val = rb_reg_new_ary(ary, (int)opt); rb_ary_clear(ary); #line 643 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_toregexp #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(toregexp);}}} INSN_ENTRY(newarray){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("newarray"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_newarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_newarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(newarray)); COLLECT_USAGE_OPERAND(BIN(newarray), 0, num); { #line 440 "insns.def" val = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); POPN(num); #line 670 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_newarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(newarray);}}} INSN_ENTRY(duparray){ { VALUE val; VALUE ary = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("duparray"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_duparray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_duparray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(duparray)); COLLECT_USAGE_OPERAND(BIN(duparray), 0, ary); { #line 455 "insns.def" val = rb_ary_resurrect(ary); #line 696 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_duparray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(duparray);}}} INSN_ENTRY(expandarray){ { rb_num_t flag = (rb_num_t)GET_OPERAND(2); rb_num_t num = (rb_num_t)GET_OPERAND(1); VALUE ary = TOPN(0); DEBUG_ENTER_INSN("expandarray"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_expandarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_expandarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(expandarray)); COLLECT_USAGE_OPERAND(BIN(expandarray), 0, num); COLLECT_USAGE_OPERAND(BIN(expandarray), 1, flag); { #line 483 "insns.def" vm_expandarray(GET_CFP(), ary, num, (int)flag); #line 724 "vm.inc" #undef CURRENT_INSN_expandarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(expandarray);}}} INSN_ENTRY(concatarray){ { VALUE ary; VALUE ary1 = TOPN(1); VALUE ary2st = TOPN(0); DEBUG_ENTER_INSN("concatarray"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_concatarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_concatarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(concatarray)); { #line 497 "insns.def" const VALUE ary2 = ary2st; VALUE tmp1 = rb_check_convert_type(ary1, T_ARRAY, "Array", "to_a"); VALUE tmp2 = rb_check_convert_type(ary2, T_ARRAY, "Array", "to_a"); if (NIL_P(tmp1)) { tmp1 = rb_ary_new3(1, ary1); } if (NIL_P(tmp2)) { tmp2 = rb_ary_new3(1, ary2); } if (tmp1 == ary1) { tmp1 = rb_ary_dup(ary1); } ary = rb_ary_concat(tmp1, tmp2); #line 764 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(ary); #undef CURRENT_INSN_concatarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(concatarray);}}} INSN_ENTRY(splatarray){ { VALUE obj; VALUE flag = (VALUE)GET_OPERAND(1); VALUE ary = TOPN(0); DEBUG_ENTER_INSN("splatarray"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_splatarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_splatarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(splatarray)); COLLECT_USAGE_OPERAND(BIN(splatarray), 0, flag); { #line 526 "insns.def" VALUE tmp = rb_check_convert_type(ary, T_ARRAY, "Array", "to_a"); if (NIL_P(tmp)) { tmp = rb_ary_new3(1, ary); } else if (RTEST(flag)) { tmp = rb_ary_dup(tmp); } obj = tmp; #line 798 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(obj); #undef CURRENT_INSN_splatarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(splatarray);}}} INSN_ENTRY(newhash){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("newhash"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_newhash 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_newhash_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(newhash)); COLLECT_USAGE_OPERAND(BIN(newhash), 0, num); { #line 548 "insns.def" rb_num_t i; RUBY_DTRACE_CREATE_HOOK(HASH, num); val = rb_hash_new(); for (i = num; i > 0; i -= 2) { const VALUE v = TOPN(i - 2); const VALUE k = TOPN(i - 1); rb_hash_aset(val, k, v); } POPN(num); #line 835 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_newhash #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(newhash);}}} INSN_ENTRY(newrange){ { VALUE val; rb_num_t flag = (rb_num_t)GET_OPERAND(1); VALUE low = TOPN(1); VALUE high = TOPN(0); DEBUG_ENTER_INSN("newrange"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_newrange 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_newrange_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(newrange)); COLLECT_USAGE_OPERAND(BIN(newrange), 0, flag); { #line 573 "insns.def" val = rb_range_new(low, high, (int)flag); #line 863 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_newrange #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(newrange);}}} INSN_ENTRY(pop){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("pop"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_pop 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_pop_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(pop)); { #line 591 "insns.def" (void)val; /* none */ #line 889 "vm.inc" #undef CURRENT_INSN_pop #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(pop);}}} INSN_ENTRY(dup){ { VALUE val2; VALUE val1; VALUE val = TOPN(0); DEBUG_ENTER_INSN("dup"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_dup 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_dup_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(dup)); { #line 606 "insns.def" val1 = val2 = val; #line 914 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 2); PUSH(val1); PUSH(val2); #undef CURRENT_INSN_dup #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(dup);}}} INSN_ENTRY(dupn){ { rb_num_t n = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("dupn"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_dupn 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_dupn_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(dupn)); COLLECT_USAGE_OPERAND(BIN(dupn), 0, n); { #line 620 "insns.def" rb_num_t i; VALUE *sp = STACK_ADDR_FROM_TOP(n); for (i = 0; i < n; i++) { GET_SP()[i] = sp[i]; } INC_SP(n); #line 945 "vm.inc" #undef CURRENT_INSN_dupn #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(dupn);}}} INSN_ENTRY(swap){ { VALUE val = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("swap"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_swap 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_swap_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(swap)); { #line 640 "insns.def" /* none */ #line 969 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 2); PUSH(obj); PUSH(val); #undef CURRENT_INSN_swap #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(swap);}}} INSN_ENTRY(reverse){ { rb_num_t n = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("reverse"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_reverse 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_reverse_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(reverse)); COLLECT_USAGE_OPERAND(BIN(reverse), 0, n); { #line 654 "insns.def" rb_num_t i; VALUE *sp = STACK_ADDR_FROM_TOP(n); for (i=0; ibody->iseq_encoded, GET_SP(), class_iseq->body->local_table_size, class_iseq->body->stack_max); RESTORE_REGS(); NEXT_INSN(); #line 1381 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_defineclass #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(defineclass);}}} INSN_ENTRY(send){ { VALUE val; ISEQ blockiseq = (ISEQ)GET_OPERAND(3); CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); DEBUG_ENTER_INSN("send"); ADD_PC(1+3); PREFETCH(GET_PC()); #define CURRENT_INSN_send 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_send_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(send)); COLLECT_USAGE_OPERAND(BIN(send), 0, ci); COLLECT_USAGE_OPERAND(BIN(send), 1, cc); COLLECT_USAGE_OPERAND(BIN(send), 2, blockiseq); { #line 963 "insns.def" struct rb_calling_info calling; vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, FALSE); vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); CALL_METHOD(&calling, ci, cc); #line 1415 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_send #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(send);}}} INSN_ENTRY(opt_str_freeze){ { VALUE val; VALUE str = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("opt_str_freeze"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_str_freeze 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_str_freeze_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_str_freeze)); COLLECT_USAGE_OPERAND(BIN(opt_str_freeze), 0, str); { #line 976 "insns.def" if (BASIC_OP_UNREDEFINED_P(BOP_FREEZE, STRING_REDEFINED_OP_FLAG)) { val = str; } else { val = rb_funcall(rb_str_resurrect(str), idFreeze, 0); } #line 1446 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_str_freeze #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_str_freeze);}}} INSN_ENTRY(opt_newarray_max){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("opt_newarray_max"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_newarray_max 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_newarray_max_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_newarray_max)); COLLECT_USAGE_OPERAND(BIN(opt_newarray_max), 0, num); { #line 990 "insns.def" #define id_cmp idCmp if (BASIC_OP_UNREDEFINED_P(BOP_MAX, ARRAY_REDEFINED_OP_FLAG)) { if (num == 0) { val = Qnil; } else { struct cmp_opt_data cmp_opt = { 0, 0 }; VALUE result = Qundef; rb_num_t i = num - 1; result = TOPN(i); while (i-- > 0) { const VALUE v = TOPN(i); if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) > 0) { result = v; } } val = result == Qundef ? Qnil : result; } POPN(num); } else { VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); val = rb_funcall(ary, idMax, 0); POPN(num); } #undef id_cmp #line 1497 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_newarray_max #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_newarray_max);}}} INSN_ENTRY(opt_newarray_min){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("opt_newarray_min"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_newarray_min 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_newarray_min_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_newarray_min)); COLLECT_USAGE_OPERAND(BIN(opt_newarray_min), 0, num); { #line 1024 "insns.def" #define id_cmp idCmp if (BASIC_OP_UNREDEFINED_P(BOP_MIN, ARRAY_REDEFINED_OP_FLAG)) { if (num == 0) { val = Qnil; } else { struct cmp_opt_data cmp_opt = { 0, 0 }; VALUE result = Qundef; rb_num_t i = num - 1; result = TOPN(i); while (i-- > 0) { const VALUE v = TOPN(i); if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) < 0) { result = v; } } val = result == Qundef ? Qnil : result; } POPN(num); } else { VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); val = rb_funcall(ary, idMin, 0); POPN(num); } #undef id_cmp #line 1548 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_newarray_min #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_newarray_min);}}} INSN_ENTRY(opt_send_without_block){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); DEBUG_ENTER_INSN("opt_send_without_block"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_send_without_block 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_send_without_block_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_send_without_block)); COLLECT_USAGE_OPERAND(BIN(opt_send_without_block), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_send_without_block), 1, cc); { #line 1063 "insns.def" struct rb_calling_info calling; calling.block_handler = VM_BLOCK_HANDLER_NONE; vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); CALL_METHOD(&calling, ci, cc); #line 1579 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_send_without_block #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_send_without_block);}}} INSN_ENTRY(invokesuper){ { VALUE val; ISEQ blockiseq = (ISEQ)GET_OPERAND(3); CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); DEBUG_ENTER_INSN("invokesuper"); ADD_PC(1+3); PREFETCH(GET_PC()); #define CURRENT_INSN_invokesuper 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_invokesuper_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(invokesuper)); COLLECT_USAGE_OPERAND(BIN(invokesuper), 0, ci); COLLECT_USAGE_OPERAND(BIN(invokesuper), 1, cc); COLLECT_USAGE_OPERAND(BIN(invokesuper), 2, blockiseq); { #line 1080 "insns.def" struct rb_calling_info calling; calling.argc = ci->orig_argc; vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, TRUE); calling.recv = GET_SELF(); vm_search_super_method(th, GET_CFP(), &calling, ci, cc); CALL_METHOD(&calling, ci, cc); #line 1615 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_invokesuper #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(invokesuper);}}} INSN_ENTRY(invokeblock){ { VALUE val; CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); DEBUG_ENTER_INSN("invokeblock"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_invokeblock 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_invokeblock_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(invokeblock)); COLLECT_USAGE_OPERAND(BIN(invokeblock), 0, ci); { #line 1100 "insns.def" struct rb_calling_info calling; calling.argc = ci->orig_argc; calling.block_handler = VM_BLOCK_HANDLER_NONE; calling.recv = GET_SELF(); val = vm_invoke_block(th, GET_CFP(), &calling, ci); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } #line 1650 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_invokeblock #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(invokeblock);}}} INSN_ENTRY(leave){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("leave"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_leave 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_leave_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(leave)); { #line 1123 "insns.def" if (OPT_CHECKED_RUN) { const VALUE *const bp = vm_base_ptr(reg_cfp); if (reg_cfp->sp != bp) { rb_bug("Stack consistency error (sp: %"PRIdPTRDIFF", bp: %"PRIdPTRDIFF")", VM_SP_CNT(th, reg_cfp->sp), VM_SP_CNT(th, bp)); } } RUBY_VM_CHECK_INTS(th); if (vm_pop_frame(th, GET_CFP(), GET_EP())) { #if OPT_CALL_THREADED_CODE th->retval = val; return 0; #else return val; #endif } else { RESTORE_REGS(); } #line 1695 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_leave #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(leave);}}} INSN_ENTRY(throw){ { VALUE val; rb_num_t throw_state = (rb_num_t)GET_OPERAND(1); VALUE throwobj = TOPN(0); DEBUG_ENTER_INSN("throw"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_throw 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_throw_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(throw)); COLLECT_USAGE_OPERAND(BIN(throw), 0, throw_state); { #line 1161 "insns.def" RUBY_VM_CHECK_INTS(th); val = vm_throw(th, GET_CFP(), throw_state, throwobj); THROW_EXCEPTION(val); /* unreachable */ #line 1725 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_throw #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(throw);}}} INSN_ENTRY(jump){ { OFFSET dst = (OFFSET)GET_OPERAND(1); DEBUG_ENTER_INSN("jump"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_jump 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_jump_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(jump)); COLLECT_USAGE_OPERAND(BIN(jump), 0, dst); { #line 1182 "insns.def" RUBY_VM_CHECK_INTS(th); JUMP(dst); #line 1751 "vm.inc" #undef CURRENT_INSN_jump #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(jump);}}} INSN_ENTRY(branchif){ { OFFSET dst = (OFFSET)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("branchif"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_branchif 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_branchif_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(branchif)); COLLECT_USAGE_OPERAND(BIN(branchif), 0, dst); { #line 1197 "insns.def" if (RTEST(val)) { RUBY_VM_CHECK_INTS(th); JUMP(dst); } #line 1778 "vm.inc" #undef CURRENT_INSN_branchif #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(branchif);}}} INSN_ENTRY(branchunless){ { OFFSET dst = (OFFSET)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("branchunless"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_branchunless 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_branchunless_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(branchunless)); COLLECT_USAGE_OPERAND(BIN(branchunless), 0, dst); { #line 1214 "insns.def" if (!RTEST(val)) { RUBY_VM_CHECK_INTS(th); JUMP(dst); } #line 1805 "vm.inc" #undef CURRENT_INSN_branchunless #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(branchunless);}}} INSN_ENTRY(branchnil){ { OFFSET dst = (OFFSET)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("branchnil"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_branchnil 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_branchnil_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(branchnil)); COLLECT_USAGE_OPERAND(BIN(branchnil), 0, dst); { #line 1231 "insns.def" if (NIL_P(val)) { RUBY_VM_CHECK_INTS(th); JUMP(dst); } #line 1832 "vm.inc" #undef CURRENT_INSN_branchnil #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(branchnil);}}} INSN_ENTRY(getinlinecache){ { VALUE val; IC ic = (IC)GET_OPERAND(2); OFFSET dst = (OFFSET)GET_OPERAND(1); DEBUG_ENTER_INSN("getinlinecache"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getinlinecache 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getinlinecache_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getinlinecache)); COLLECT_USAGE_OPERAND(BIN(getinlinecache), 0, dst); COLLECT_USAGE_OPERAND(BIN(getinlinecache), 1, ic); { #line 1253 "insns.def" if (ic->ic_serial == GET_GLOBAL_CONSTANT_STATE() && (ic->ic_cref == NULL || ic->ic_cref == rb_vm_get_cref(GET_EP()))) { val = ic->ic_value.value; JUMP(dst); } else { /* none */ val = Qnil; } #line 1866 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_getinlinecache #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getinlinecache);}}} INSN_ENTRY(setinlinecache){ { IC ic = (IC)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setinlinecache"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setinlinecache 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setinlinecache_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setinlinecache)); COLLECT_USAGE_OPERAND(BIN(setinlinecache), 0, ic); { #line 1275 "insns.def" VM_ASSERT(ic->ic_value.value != Qundef); ic->ic_value.value = val; ic->ic_serial = GET_GLOBAL_CONSTANT_STATE() - ruby_vm_const_missing_count; ic->ic_cref = vm_get_const_key_cref(GET_EP()); ruby_vm_const_missing_count = 0; #line 1896 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_setinlinecache #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setinlinecache);}}} INSN_ENTRY(once){ { VALUE val; IC ic = (IC)GET_OPERAND(2); ISEQ iseq = (ISEQ)GET_OPERAND(1); DEBUG_ENTER_INSN("once"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_once 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_once_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(once)); COLLECT_USAGE_OPERAND(BIN(once), 0, iseq); COLLECT_USAGE_OPERAND(BIN(once), 1, ic); { #line 1293 "insns.def" union iseq_inline_storage_entry *is = (union iseq_inline_storage_entry *)ic; #define RUNNING_THREAD_ONCE_DONE ((rb_thread_t *)(0x1)) retry: if (is->once.running_thread == RUNNING_THREAD_ONCE_DONE) { val = is->once.value; } else if (is->once.running_thread == NULL) { is->once.running_thread = th; val = is->once.value = rb_ensure(vm_once_exec, (VALUE)iseq, vm_once_clear, (VALUE)is); /* is->once.running_thread is cleared by vm_once_clear() */ is->once.running_thread = RUNNING_THREAD_ONCE_DONE; /* success */ rb_iseq_add_mark_object(GET_ISEQ(), val); } else if (is->once.running_thread == th) { /* recursive once */ val = vm_once_exec((VALUE)iseq); } else { /* waiting for finish */ RUBY_VM_CHECK_INTS(th); rb_thread_schedule(); goto retry; } #line 1947 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_once #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(once);}}} INSN_ENTRY(opt_case_dispatch){ { OFFSET else_offset = (OFFSET)GET_OPERAND(2); CDHASH hash = (CDHASH)GET_OPERAND(1); VALUE key = TOPN(0); DEBUG_ENTER_INSN("opt_case_dispatch"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_case_dispatch 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_case_dispatch_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_case_dispatch)); COLLECT_USAGE_OPERAND(BIN(opt_case_dispatch), 0, hash); COLLECT_USAGE_OPERAND(BIN(opt_case_dispatch), 1, else_offset); { #line 1330 "insns.def" switch (OBJ_BUILTIN_TYPE(key)) { case -1: case T_FLOAT: case T_SYMBOL: case T_BIGNUM: case T_STRING: if (BASIC_OP_UNREDEFINED_P(BOP_EQQ, SYMBOL_REDEFINED_OP_FLAG | INTEGER_REDEFINED_OP_FLAG | FLOAT_REDEFINED_OP_FLAG | NIL_REDEFINED_OP_FLAG | TRUE_REDEFINED_OP_FLAG | FALSE_REDEFINED_OP_FLAG | STRING_REDEFINED_OP_FLAG)) { st_data_t val; if (RB_FLOAT_TYPE_P(key)) { double kval = RFLOAT_VALUE(key); if (!isinf(kval) && modf(kval, &kval) == 0.0) { key = FIXABLE(kval) ? LONG2FIX((long)kval) : rb_dbl2big(kval); } } if (st_lookup(RHASH_TBL_RAW(hash), key, &val)) { JUMP(FIX2INT((VALUE)val)); } else { JUMP(else_offset); } } } #line 2003 "vm.inc" #undef CURRENT_INSN_opt_case_dispatch #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_case_dispatch);}}} INSN_ENTRY(opt_plus){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_plus"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_plus 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_plus_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_plus)); COLLECT_USAGE_OPERAND(BIN(opt_plus), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_plus), 1, cc); { #line 1374 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_PLUS,INTEGER_REDEFINED_OP_FLAG)) { /* fixnum + fixnum */ #ifndef LONG_LONG_VALUE VALUE msb = (VALUE)1 << ((sizeof(VALUE) * CHAR_BIT) - 1); val = recv - 1 + obj; if ((~(recv ^ obj) & (recv ^ val)) & msb) { val = rb_int2big((SIGNED_VALUE)((val>>1) | (recv & msb))); } #else val = LONG2NUM(FIX2LONG(recv) + FIX2LONG(obj)); #endif } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj)); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_PLUS, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj)); } else if (RBASIC_CLASS(recv) == rb_cString && RBASIC_CLASS(obj) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_PLUS, STRING_REDEFINED_OP_FLAG)) { val = rb_str_plus(recv, obj); } else if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_PLUS, ARRAY_REDEFINED_OP_FLAG)) { val = rb_ary_plus(recv, obj); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2070 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_plus #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_plus);}}} INSN_ENTRY(opt_minus){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_minus"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_minus 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_minus_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_minus)); COLLECT_USAGE_OPERAND(BIN(opt_minus), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_minus), 1, cc); { #line 1427 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MINUS, INTEGER_REDEFINED_OP_FLAG)) { long a, b, c; a = FIX2LONG(recv); b = FIX2LONG(obj); c = a - b; val = LONG2NUM(c); } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj)); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) - RFLOAT_VALUE(obj)); } else { goto INSN_LABEL(normal_dispatch); } } else { /* other */ INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2128 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_minus #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_minus);}}} INSN_ENTRY(opt_mult){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_mult"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_mult 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_mult_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_mult)); COLLECT_USAGE_OPERAND(BIN(opt_mult), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_mult), 1, cc); { #line 1469 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MULT, INTEGER_REDEFINED_OP_FLAG)) { val = rb_fix_mul_fix(recv, obj); } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MULT, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) * RFLOAT_VALUE(obj)); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_MULT, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) * RFLOAT_VALUE(obj)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2180 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_mult #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_mult);}}} INSN_ENTRY(opt_div){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_div"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_div 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_div_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_div)); COLLECT_USAGE_OPERAND(BIN(opt_div), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_div), 1, cc); { #line 1505 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_DIV, INTEGER_REDEFINED_OP_FLAG)) { if (FIX2LONG(obj) == 0) goto INSN_LABEL(normal_dispatch); val = rb_fix_div_fix(recv, obj); } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_DIV, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) / RFLOAT_VALUE(obj)); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_DIV, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(RFLOAT_VALUE(recv) / RFLOAT_VALUE(obj)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2233 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_div #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_div);}}} INSN_ENTRY(opt_mod){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_mod"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_mod 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_mod_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_mod)); COLLECT_USAGE_OPERAND(BIN(opt_mod), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_mod), 1, cc); { #line 1542 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MOD, INTEGER_REDEFINED_OP_FLAG )) { if (FIX2LONG(obj) == 0) goto INSN_LABEL(normal_dispatch); val = rb_fix_mod_fix(recv, obj); } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MOD, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(ruby_float_mod(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj))); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_MOD, FLOAT_REDEFINED_OP_FLAG)) { val = DBL2NUM(ruby_float_mod(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj))); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2286 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_mod #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_mod);}}} INSN_ENTRY(opt_eq){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_eq"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_eq 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_eq_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_eq)); COLLECT_USAGE_OPERAND(BIN(opt_eq), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_eq), 1, cc); { #line 1579 "insns.def" val = opt_eq_func(recv, obj, ci, cc); if (val == Qundef) { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2323 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_eq #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_eq);}}} INSN_ENTRY(opt_neq){ { VALUE val; CALL_CACHE cc_eq = (CALL_CACHE)GET_OPERAND(4); CALL_INFO ci_eq = (CALL_INFO)GET_OPERAND(3); CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_neq"); ADD_PC(1+4); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_neq 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_neq_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_neq)); COLLECT_USAGE_OPERAND(BIN(opt_neq), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_neq), 1, cc); COLLECT_USAGE_OPERAND(BIN(opt_neq), 2, ci_eq); COLLECT_USAGE_OPERAND(BIN(opt_neq), 3, cc_eq); { #line 1600 "insns.def" extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2); vm_search_method(ci, cc, recv); val = Qundef; if (check_cfunc(cc->me, rb_obj_not_equal)) { val = opt_eq_func(recv, obj, ci_eq, cc_eq); if (val != Qundef) { val = RTEST(val) ? Qfalse : Qtrue; } } if (val == Qundef) { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2375 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_neq #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_neq);}}} INSN_ENTRY(opt_lt){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_lt"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_lt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_lt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_lt)); COLLECT_USAGE_OPERAND(BIN(opt_lt), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_lt), 1, cc); { #line 1632 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_LT, INTEGER_REDEFINED_OP_FLAG)) { SIGNED_VALUE a = recv, b = obj; if (a < b) { val = Qtrue; } else { val = Qfalse; } } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_LT, FLOAT_REDEFINED_OP_FLAG)) { /* flonum is not NaN */ val = RFLOAT_VALUE(recv) < RFLOAT_VALUE(obj) ? Qtrue : Qfalse; } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_LT, FLOAT_REDEFINED_OP_FLAG)) { val = double_cmp_lt(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2435 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_lt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_lt);}}} INSN_ENTRY(opt_le){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_le"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_le 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_le_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_le)); COLLECT_USAGE_OPERAND(BIN(opt_le), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_le), 1, cc); { #line 1676 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_LE, INTEGER_REDEFINED_OP_FLAG)) { SIGNED_VALUE a = recv, b = obj; if (a <= b) { val = Qtrue; } else { val = Qfalse; } } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_LE, FLOAT_REDEFINED_OP_FLAG)) { /* flonum is not NaN */ val = RFLOAT_VALUE(recv) <= RFLOAT_VALUE(obj) ? Qtrue : Qfalse; } else { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2486 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_le #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_le);}}} INSN_ENTRY(opt_gt){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_gt"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_gt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_gt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_gt)); COLLECT_USAGE_OPERAND(BIN(opt_gt), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_gt), 1, cc); { #line 1711 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_GT, INTEGER_REDEFINED_OP_FLAG)) { SIGNED_VALUE a = recv, b = obj; if (a > b) { val = Qtrue; } else { val = Qfalse; } } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_GT, FLOAT_REDEFINED_OP_FLAG)) { /* flonum is not NaN */ val = RFLOAT_VALUE(recv) > RFLOAT_VALUE(obj) ? Qtrue : Qfalse; } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (RBASIC_CLASS(recv) == rb_cFloat && RBASIC_CLASS(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_GT, FLOAT_REDEFINED_OP_FLAG)) { val = double_cmp_gt(RFLOAT_VALUE(recv), RFLOAT_VALUE(obj)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2546 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_gt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_gt);}}} INSN_ENTRY(opt_ge){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_ge"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_ge 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_ge_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_ge)); COLLECT_USAGE_OPERAND(BIN(opt_ge), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_ge), 1, cc); { #line 1755 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_GE, INTEGER_REDEFINED_OP_FLAG)) { SIGNED_VALUE a = recv, b = obj; if (a >= b) { val = Qtrue; } else { val = Qfalse; } } else if (FLONUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_GE, FLOAT_REDEFINED_OP_FLAG)) { /* flonum is not NaN */ val = RFLOAT_VALUE(recv) >= RFLOAT_VALUE(obj) ? Qtrue : Qfalse; } else { PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2596 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_ge #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_ge);}}} INSN_ENTRY(opt_ltlt){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_ltlt"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_ltlt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_ltlt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_ltlt)); COLLECT_USAGE_OPERAND(BIN(opt_ltlt), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_ltlt), 1, cc); { #line 1789 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (RBASIC_CLASS(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_LTLT, STRING_REDEFINED_OP_FLAG)) { val = rb_str_concat(recv, obj); } else if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_LTLT, ARRAY_REDEFINED_OP_FLAG)) { val = rb_ary_push(recv, obj); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2644 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_ltlt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_ltlt);}}} INSN_ENTRY(opt_aref){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_aref"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_aref 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_aref_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_aref)); COLLECT_USAGE_OPERAND(BIN(opt_aref), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_aref), 1, cc); { #line 1821 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG) && FIXNUM_P(obj)) { val = rb_ary_entry(recv, FIX2LONG(obj)); } else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) { val = rb_hash_aref(recv, obj); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(recv); } #line 2690 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_aref #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_aref);}}} INSN_ENTRY(opt_aset){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(2); VALUE obj = TOPN(1); VALUE set = TOPN(0); DEBUG_ENTER_INSN("opt_aset"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(3); #define CURRENT_INSN_opt_aset 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_aset_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_aset)); COLLECT_USAGE_OPERAND(BIN(opt_aset), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_aset), 1, cc); { #line 1851 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_ASET, ARRAY_REDEFINED_OP_FLAG) && FIXNUM_P(obj)) { rb_ary_store(recv, FIX2LONG(obj), set); val = set; } else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG)) { rb_hash_aset(recv, obj, set); val = set; } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); PUSH(set); CALL_SIMPLE_METHOD(recv); } #line 2740 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_aset #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_aset);}}} INSN_ENTRY(opt_aset_with){ { VALUE key = (VALUE)GET_OPERAND(3); CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("opt_aset_with"); ADD_PC(1+3); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_aset_with 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_aset_with_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_aset_with)); COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 1, cc); COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 2, key); { #line 1884 "insns.def" if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG)) { rb_hash_aset(recv, key, val); } else { PUSH(recv); PUSH(rb_str_resurrect(key)); PUSH(val); CALL_SIMPLE_METHOD(recv); } #line 2779 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_aset_with #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_aset_with);}}} INSN_ENTRY(opt_aref_with){ { VALUE val; VALUE key = (VALUE)GET_OPERAND(3); CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_aref_with"); ADD_PC(1+3); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_aref_with 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_aref_with_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_aref_with)); COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 1, cc); COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 2, key); { #line 1906 "insns.def" if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) { val = rb_hash_aref(recv, key); } else { PUSH(recv); PUSH(rb_str_resurrect(key)); CALL_SIMPLE_METHOD(recv); } #line 2817 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_aref_with #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_aref_with);}}} INSN_ENTRY(opt_length){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_length"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_length 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_length_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_length)); COLLECT_USAGE_OPERAND(BIN(opt_length), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_length), 1, cc); { #line 1927 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (RBASIC_CLASS(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_LENGTH, STRING_REDEFINED_OP_FLAG)) { val = rb_str_length(recv); } else if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_LENGTH, ARRAY_REDEFINED_OP_FLAG)) { val = LONG2NUM(RARRAY_LEN(recv)); } else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_LENGTH, HASH_REDEFINED_OP_FLAG)) { val = INT2FIX(RHASH_SIZE(recv)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); CALL_SIMPLE_METHOD(recv); } #line 2867 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_length #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_length);}}} INSN_ENTRY(opt_size){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_size"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_size 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_size_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_size)); COLLECT_USAGE_OPERAND(BIN(opt_size), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_size), 1, cc); { #line 1962 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (RBASIC_CLASS(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_SIZE, STRING_REDEFINED_OP_FLAG)) { val = rb_str_length(recv); } else if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_SIZE, ARRAY_REDEFINED_OP_FLAG)) { val = LONG2NUM(RARRAY_LEN(recv)); } else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_SIZE, HASH_REDEFINED_OP_FLAG)) { val = INT2FIX(RHASH_SIZE(recv)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); CALL_SIMPLE_METHOD(recv); } #line 2917 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_size #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_size);}}} INSN_ENTRY(opt_empty_p){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_empty_p"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_empty_p 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_empty_p_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_empty_p)); COLLECT_USAGE_OPERAND(BIN(opt_empty_p), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_empty_p), 1, cc); { #line 1997 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (RBASIC_CLASS(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, STRING_REDEFINED_OP_FLAG)) { if (RSTRING_LEN(recv) == 0) val = Qtrue; else val = Qfalse; } else if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, ARRAY_REDEFINED_OP_FLAG)) { if (RARRAY_LEN(recv) == 0) val = Qtrue; else val = Qfalse; } else if (RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, HASH_REDEFINED_OP_FLAG)) { if (RHASH_EMPTY_P(recv)) val = Qtrue; else val = Qfalse; } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); CALL_SIMPLE_METHOD(recv); } #line 2970 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_empty_p #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_empty_p);}}} INSN_ENTRY(opt_succ){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_succ"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_succ 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_succ_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_succ)); COLLECT_USAGE_OPERAND(BIN(opt_succ), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_succ), 1, cc); { #line 2035 "insns.def" if (SPECIAL_CONST_P(recv)) { if (FIXNUM_P(recv) && BASIC_OP_UNREDEFINED_P(BOP_SUCC, INTEGER_REDEFINED_OP_FLAG)) { /* fixnum + INT2FIX(1) */ if (recv != LONG2FIX(FIXNUM_MAX)) { val = recv - 1 + INT2FIX(1); } else { val = LONG2NUM(FIXNUM_MAX + 1); } } else { goto INSN_LABEL(normal_dispatch); } } else { if (RBASIC_CLASS(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_SUCC, STRING_REDEFINED_OP_FLAG)) { val = rb_str_succ(recv); } else { goto INSN_LABEL(normal_dispatch); } } if (0) { INSN_LABEL(normal_dispatch): PUSH(recv); CALL_SIMPLE_METHOD(recv); } #line 3028 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_succ #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_succ);}}} INSN_ENTRY(opt_not){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_not"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_not 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_not_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_not)); COLLECT_USAGE_OPERAND(BIN(opt_not), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_not), 1, cc); { #line 2078 "insns.def" vm_search_method(ci, cc, recv); if (check_cfunc(cc->me, rb_obj_not)) { val = RTEST(recv) ? Qfalse : Qtrue; } else { PUSH(recv); CALL_SIMPLE_METHOD(recv); } #line 3065 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_not #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_not);}}} INSN_ENTRY(opt_regexpmatch1){ { VALUE val; VALUE r = (VALUE)GET_OPERAND(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_regexpmatch1"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_regexpmatch1 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_regexpmatch1_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_regexpmatch1)); COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch1), 0, r); { #line 2101 "insns.def" if (BASIC_OP_UNREDEFINED_P(BOP_MATCH, REGEXP_REDEFINED_OP_FLAG)) { val = rb_reg_match(r, obj); } else { val = rb_funcall(r, idEqTilde, 1, obj); } #line 3097 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_regexpmatch1 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_regexpmatch1);}}} INSN_ENTRY(opt_regexpmatch2){ { VALUE val; CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2); CALL_INFO ci = (CALL_INFO)GET_OPERAND(1); VALUE obj2 = TOPN(1); VALUE obj1 = TOPN(0); DEBUG_ENTER_INSN("opt_regexpmatch2"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_regexpmatch2 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_regexpmatch2_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_regexpmatch2)); COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch2), 0, ci); COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch2), 1, cc); { #line 2120 "insns.def" if (CLASS_OF(obj2) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_MATCH, STRING_REDEFINED_OP_FLAG)) { val = rb_reg_match(obj1, obj2); } else { PUSH(obj2); PUSH(obj1); CALL_SIMPLE_METHOD(obj2); } #line 3135 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef CURRENT_INSN_opt_regexpmatch2 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_regexpmatch2);}}} INSN_ENTRY(opt_call_c_function){ { rb_insn_func_t funcptr = (rb_insn_func_t)GET_OPERAND(1); DEBUG_ENTER_INSN("opt_call_c_function"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_call_c_function 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_call_c_function_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(opt_call_c_function)); COLLECT_USAGE_OPERAND(BIN(opt_call_c_function), 0, funcptr); { #line 2142 "insns.def" reg_cfp = (funcptr)(th, reg_cfp); if (reg_cfp == 0) { VALUE err = th->errinfo; th->errinfo = Qnil; THROW_EXCEPTION(err); } RESTORE_REGS(); NEXT_INSN(); #line 3169 "vm.inc" #undef CURRENT_INSN_opt_call_c_function #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_call_c_function);}}} INSN_ENTRY(bitblt){ { VALUE ret; DEBUG_ENTER_INSN("bitblt"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_bitblt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_bitblt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(bitblt)); { #line 2165 "insns.def" ret = rb_str_new2("a bit of bacon, lettuce and tomato"); #line 3192 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(ret); #undef CURRENT_INSN_bitblt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(bitblt);}}} INSN_ENTRY(answer){ { VALUE ret; DEBUG_ENTER_INSN("answer"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_answer 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_answer_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(answer)); { #line 2179 "insns.def" ret = INT2FIX(42); #line 3217 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(ret); #undef CURRENT_INSN_answer #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(answer);}}} INSN_ENTRY(getlocal_OP__WC__0){ { VALUE val; #define level 0 lindex_t idx = (lindex_t)GET_OPERAND(1); DEBUG_ENTER_INSN("getlocal_OP__WC__0"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getlocal_OP__WC__0 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getlocal_OP__WC__0_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getlocal_OP__WC__0)); COLLECT_USAGE_OPERAND(BIN(getlocal_OP__WC__0), 0, idx); { #line 60 "insns.def" int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } val = *(ep - idx); #line 3251 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef level #undef CURRENT_INSN_getlocal_OP__WC__0 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getlocal_OP__WC__0);}}} INSN_ENTRY(getlocal_OP__WC__1){ { VALUE val; #define level 1 lindex_t idx = (lindex_t)GET_OPERAND(1); DEBUG_ENTER_INSN("getlocal_OP__WC__1"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getlocal_OP__WC__1 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getlocal_OP__WC__1_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(getlocal_OP__WC__1)); COLLECT_USAGE_OPERAND(BIN(getlocal_OP__WC__1), 0, idx); { #line 60 "insns.def" int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } val = *(ep - idx); #line 3286 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef level #undef CURRENT_INSN_getlocal_OP__WC__1 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getlocal_OP__WC__1);}}} INSN_ENTRY(setlocal_OP__WC__0){ { #define level 0 lindex_t idx = (lindex_t)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setlocal_OP__WC__0"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setlocal_OP__WC__0 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setlocal_OP__WC__0_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setlocal_OP__WC__0)); COLLECT_USAGE_OPERAND(BIN(setlocal_OP__WC__0), 0, idx); { #line 83 "insns.def" int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } vm_env_write(ep, -(int)idx, val); #line 3321 "vm.inc" #undef level #undef CURRENT_INSN_setlocal_OP__WC__0 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setlocal_OP__WC__0);}}} INSN_ENTRY(setlocal_OP__WC__1){ { #define level 1 lindex_t idx = (lindex_t)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setlocal_OP__WC__1"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setlocal_OP__WC__1 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setlocal_OP__WC__1_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(setlocal_OP__WC__1)); COLLECT_USAGE_OPERAND(BIN(setlocal_OP__WC__1), 0, idx); { #line 83 "insns.def" int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } vm_env_write(ep, -(int)idx, val); #line 3354 "vm.inc" #undef level #undef CURRENT_INSN_setlocal_OP__WC__1 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setlocal_OP__WC__1);}}} INSN_ENTRY(putobject_OP_INT2FIX_O_0_C_){ { #define val INT2FIX(0) DEBUG_ENTER_INSN("putobject_OP_INT2FIX_O_0_C_"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_putobject_OP_INT2FIX_O_0_C_ 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putobject_OP_INT2FIX_O_0_C__##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putobject_OP_INT2FIX_O_0_C_)); { #line 299 "insns.def" /* */ #line 3378 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef val #undef CURRENT_INSN_putobject_OP_INT2FIX_O_0_C_ #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putobject_OP_INT2FIX_O_0_C_);}}} INSN_ENTRY(putobject_OP_INT2FIX_O_1_C_){ { #define val INT2FIX(1) DEBUG_ENTER_INSN("putobject_OP_INT2FIX_O_1_C_"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_putobject_OP_INT2FIX_O_1_C_ 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putobject_OP_INT2FIX_O_1_C__##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t COLLECT_USAGE_INSN(BIN(putobject_OP_INT2FIX_O_1_C_)); { #line 299 "insns.def" /* */ #line 3404 "vm.inc" CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1); PUSH(val); #undef val #undef CURRENT_INSN_putobject_OP_INT2FIX_O_1_C_ #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putobject_OP_INT2FIX_O_1_C_);}}}