// This file is generated by Tools/cases_generator/tier2_generator.py
// from:
//   Python/bytecodes.c
// Do not edit!

#ifdef TIER_ONE
    #error "This file is for Tier 2 only"
#endif
#define TIER_TWO 2

        case _NOP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _NOP_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _NOP_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _NOP_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_PERIODIC_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = check_periodics(tstate);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err != 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _CHECK_PERIODIC_AT_END is not a viable micro-op for tier 2 because it is replaced */

        case _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            if ((oparg & RESUME_OPARG_LOCATION_MASK) < RESUME_AFTER_YIELD_FROM) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                int err = check_periodics(tstate);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (err != 0) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _LOAD_BYTECODE is not a viable micro-op for tier 2 because it is replaced */

        case _RESUME_CHECK_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            assert((version & _PY_EVAL_EVENTS_MASK) == 0);
            if (eval_breaker != version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (frame->tlbc_index !=
                    ((_PyThreadStateImpl *)tstate)->tlbc_index) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RESUME_CHECK_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            assert((version & _PY_EVAL_EVENTS_MASK) == 0);
            if (eval_breaker != version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (frame->tlbc_index !=
                    ((_PyThreadStateImpl *)tstate)->tlbc_index) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RESUME_CHECK_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            assert((version & _PY_EVAL_EVENTS_MASK) == 0);
            if (eval_breaker != version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (frame->tlbc_index !=
                    ((_PyThreadStateImpl *)tstate)->tlbc_index) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RESUME_CHECK_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            assert((version & _PY_EVAL_EVENTS_MASK) == 0);
            if (eval_breaker != version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (frame->tlbc_index !=
                    ((_PyThreadStateImpl *)tstate)->tlbc_index) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _MONITOR_RESUME is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        case _LOAD_FAST_CHECK_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            _PyStackRef value_s = GETLOCAL(oparg);
            if (PyStackRef_IsNull(value_s)) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
                    UNBOUNDLOCAL_ERROR_MSG,
                    PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
                );
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            value = PyStackRef_DUP(value_s);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_CHECK_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            _PyStackRef value_s = GETLOCAL(oparg);
            if (PyStackRef_IsNull(value_s)) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
                    UNBOUNDLOCAL_ERROR_MSG,
                    PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
                );
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            value = PyStackRef_DUP(value_s);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_CHECK_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            _PyStackRef value_s = GETLOCAL(oparg);
            if (PyStackRef_IsNull(value_s)) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
                    UNBOUNDLOCAL_ERROR_MSG,
                    PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
                );
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            value = PyStackRef_DUP(value_s);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_0_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_0_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_0_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_1_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_1_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_2_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_2_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_2_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_3_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_3_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_3_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_4_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_4_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_4_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_5_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_5_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_5_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_6_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_6_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_6_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_7_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_7_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_7_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_DUP(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_0_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_0_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_0_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_1_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_1_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_2_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_2_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_2_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_3_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_3_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_3_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_4_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_4_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_4_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_5_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_5_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_5_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_6_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_6_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_6_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_7_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_7_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_7_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_BORROW_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            assert(!PyStackRef_IsNull(GETLOCAL(oparg)));
            value = PyStackRef_Borrow(GETLOCAL(oparg));
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_AND_CLEAR_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            value = GETLOCAL(oparg);
            GETLOCAL(oparg) = PyStackRef_NULL;
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_AND_CLEAR_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            value = GETLOCAL(oparg);
            GETLOCAL(oparg) = PyStackRef_NULL;
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FAST_AND_CLEAR_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            value = GETLOCAL(oparg);
            GETLOCAL(oparg) = PyStackRef_NULL;
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_0_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_0_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_0_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_1_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_1_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_2_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_2_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_2_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_3_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_3_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_3_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SMALL_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            assert(oparg < _PY_NSMALLPOSINTS);
            PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg];
            value = PyStackRef_FromPyObjectBorrow(obj);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_0_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_0_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_0_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_0_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_1_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_1_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_1_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_1_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_2_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_2_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_2_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_2_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_3_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_3_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_3_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_3_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_4_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_4_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_4_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_4_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_5_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_5_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_5_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_5_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_6_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_6_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_6_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_6_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_7_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_7_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_7_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_7_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            oparg = CURRENT_OPARG();
            value = stack_pointer[-1];
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            value = _stack_item_0;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache0 = trash;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            value = _stack_item_1;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache1 = trash;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_FAST_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef trash;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            value = _stack_item_2;
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = value;
            trash = tmp;
            _tos_cache2 = trash;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_XCLOSE(value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_NOP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) ||
                   _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value))));
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_NOP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) ||
                   _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value))));
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_NOP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) ||
                   _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value))));
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_NOP_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) ||
                   _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value))));
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_INT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            assert(PyLong_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyLong_ExactDealloc);
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_INT_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            assert(PyLong_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyLong_ExactDealloc);
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_INT_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            assert(PyLong_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyLong_ExactDealloc);
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_INT_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            assert(PyLong_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyLong_ExactDealloc);
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_FLOAT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            assert(PyFloat_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyFloat_ExactDealloc);
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_FLOAT_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            assert(PyFloat_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyFloat_ExactDealloc);
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_FLOAT_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            assert(PyFloat_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyFloat_ExactDealloc);
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_FLOAT_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            assert(PyFloat_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyFloat_ExactDealloc);
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_UNICODE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            assert(PyUnicode_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyUnicode_ExactDealloc);
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_UNICODE_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            assert(PyUnicode_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyUnicode_ExactDealloc);
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_UNICODE_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            assert(PyUnicode_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyUnicode_ExactDealloc);
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_UNICODE_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            assert(PyUnicode_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
            PyStackRef_CLOSE_SPECIALIZED(value, _PyUnicode_ExactDealloc);
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_TOP_OPARG_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef_CloseStack(args, oparg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_NULL_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef res;
            res = PyStackRef_NULL;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_NULL_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            res = PyStackRef_NULL;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_NULL_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            res = PyStackRef_NULL;
            _tos_cache2 = res;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _END_FOR_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_ITER_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef index_or_null;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            index_or_null = _stack_item_1;
            iter = _stack_item_0;
            (void)index_or_null;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(iter);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _END_SEND_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef index_or_null;
            _PyStackRef receiver;
            _PyStackRef val;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            index_or_null = _stack_item_1;
            receiver = _stack_item_0;
            val = value;
            (void)index_or_null;
            stack_pointer[0] = val;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(receiver);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = val;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NEGATIVE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            stack_pointer[0] = value;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = PyNumber_Negative(PyStackRef_AsPyObjectBorrow(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NEGATIVE_FLOAT_INPLACE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            value = stack_pointer[-1];
            PyObject *val_o = PyStackRef_AsPyObjectBorrow(value);
            assert(PyFloat_CheckExact(val_o));
            assert(_PyObject_IsUniquelyReferenced(val_o));
            STAT_INC(UNARY_NEGATIVE, hit);
            double dres = -((PyFloatObject *)val_o)->ob_fval;
            ((PyFloatObject *)val_o)->ob_fval = dres;
            res = value;
            v = PyStackRef_NULL;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NEGATIVE_FLOAT_INPLACE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *val_o = PyStackRef_AsPyObjectBorrow(value);
            assert(PyFloat_CheckExact(val_o));
            assert(_PyObject_IsUniquelyReferenced(val_o));
            STAT_INC(UNARY_NEGATIVE, hit);
            double dres = -((PyFloatObject *)val_o)->ob_fval;
            ((PyFloatObject *)val_o)->ob_fval = dres;
            res = value;
            v = PyStackRef_NULL;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NEGATIVE_FLOAT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            PyObject *val_o = PyStackRef_AsPyObjectBorrow(value);
            assert(PyFloat_CheckExact(val_o));
            assert(_PyObject_IsUniquelyReferenced(val_o));
            STAT_INC(UNARY_NEGATIVE, hit);
            double dres = -((PyFloatObject *)val_o)->ob_fval;
            ((PyFloatObject *)val_o)->ob_fval = dres;
            res = value;
            v = PyStackRef_NULL;
            _tos_cache2 = v;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NOT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            value = stack_pointer[-1];
            assert(PyStackRef_BoolCheck(value));
            res = PyStackRef_IsFalse(value)
            ? PyStackRef_True : PyStackRef_False;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NOT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            assert(PyStackRef_BoolCheck(value));
            res = PyStackRef_IsFalse(value)
            ? PyStackRef_True : PyStackRef_False;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NOT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            assert(PyStackRef_BoolCheck(value));
            res = PyStackRef_IsFalse(value)
            ? PyStackRef_True : PyStackRef_False;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_NOT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            assert(PyStackRef_BoolCheck(value));
            res = PyStackRef_IsFalse(value)
            ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = res;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            stack_pointer[0] = value;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyObject_IsTrue(PyStackRef_AsPyObjectBorrow(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = err ? PyStackRef_True : PyStackRef_False;
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_BOOL_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            if (!PyStackRef_BoolCheck(value)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_BOOL_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            if (!PyStackRef_BoolCheck(value)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_BOOL_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            if (!PyStackRef_BoolCheck(value)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_BOOL_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            if (!PyStackRef_BoolCheck(value)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_INT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            value = stack_pointer[-1];
            STAT_INC(TO_BOOL, hit);
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            res = (_PyLong_IsZero((PyLongObject *)value_o)) ? PyStackRef_False : PyStackRef_True;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_INT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            STAT_INC(TO_BOOL, hit);
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            res = (_PyLong_IsZero((PyLongObject *)value_o)) ? PyStackRef_False : PyStackRef_True;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            STAT_INC(TO_BOOL, hit);
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            res = (_PyLong_IsZero((PyLongObject *)value_o)) ? PyStackRef_False : PyStackRef_True;
            v = value;
            _tos_cache2 = v;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_LIST_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_LIST_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_LIST_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_LIST_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_LIST_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_LIST_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_LIST_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_LIST_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyList_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SLICE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySlice_Check(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SLICE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySlice_Check(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SLICE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySlice_Check(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SLICE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySlice_Check(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_LIST_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            value = stack_pointer[-1];
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(PyList_CheckExact(value_o));
            STAT_INC(TO_BOOL, hit);
            res = PyList_GET_SIZE(value_o) ? PyStackRef_True : PyStackRef_False;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_LIST_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(PyList_CheckExact(value_o));
            STAT_INC(TO_BOOL, hit);
            res = PyList_GET_SIZE(value_o) ? PyStackRef_True : PyStackRef_False;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_LIST_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(PyList_CheckExact(value_o));
            STAT_INC(TO_BOOL, hit);
            res = PyList_GET_SIZE(value_o) ? PyStackRef_True : PyStackRef_False;
            v = value;
            _tos_cache2 = v;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_NONE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            value = stack_pointer[-1];
            if (!PyStackRef_IsNone(value)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            res = PyStackRef_False;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_NONE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            if (!PyStackRef_IsNone(value)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            res = PyStackRef_False;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_NONE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            if (!PyStackRef_IsNone(value)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            res = PyStackRef_False;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_NONE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            if (!PyStackRef_IsNone(value)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            res = PyStackRef_False;
            _tos_cache2 = res;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_COMPACT_ASCII_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyUnicode_IS_COMPACT_ASCII(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_COMPACT_ASCII_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyUnicode_IS_COMPACT_ASCII(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_COMPACT_ASCII_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyUnicode_IS_COMPACT_ASCII(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_COMPACT_ASCII_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyUnicode_IS_COMPACT_ASCII(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_UNICODE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_UNICODE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_UNICODE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_UNICODE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyUnicode_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_UNICODE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyUnicode_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_UNICODE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyUnicode_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_UNICODE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyUnicode_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_UNICODE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyUnicode_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_STR_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            value = stack_pointer[-1];
            STAT_INC(TO_BOOL, hit);
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            res = value_o == &_Py_STR(empty) ? PyStackRef_False : PyStackRef_True;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_STR_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            STAT_INC(TO_BOOL, hit);
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            res = value_o == &_Py_STR(empty) ? PyStackRef_False : PyStackRef_True;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TO_BOOL_STR_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            STAT_INC(TO_BOOL, hit);
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            res = value_o == &_Py_STR(empty) ? PyStackRef_False : PyStackRef_True;
            v = value;
            _tos_cache2 = v;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _REPLACE_WITH_TRUE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            value = stack_pointer[-1];
            res = PyStackRef_True;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _REPLACE_WITH_TRUE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            res = PyStackRef_True;
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _REPLACE_WITH_TRUE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            res = PyStackRef_True;
            v = value;
            _tos_cache2 = v;
            _tos_cache1 = res;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNARY_INVERT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            stack_pointer[0] = value;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = PyNumber_Invert(PyStackRef_AsPyObjectBorrow(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            v = value;
            _tos_cache1 = v;
            _tos_cache0 = res;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_INT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!_PyLong_CheckExactAndCompact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_INT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!_PyLong_CheckExactAndCompact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_INT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!_PyLong_CheckExactAndCompact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_INT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            left = _stack_item_1;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!_PyLong_CheckExactAndCompact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = left;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = left;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_INT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!_PyLong_CheckExactAndCompact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_INT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!_PyLong_CheckExactAndCompact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_INT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!_PyLong_CheckExactAndCompact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_INT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!_PyLong_CheckExactAndCompact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_OVERFLOWED_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            assert(Py_TYPE(left_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)left_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_OVERFLOWED_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            assert(Py_TYPE(left_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_OVERFLOWED_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            assert(Py_TYPE(left_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_OVERFLOWED_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            left = _stack_item_1;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            assert(Py_TYPE(left_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = left;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = left;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_OVERFLOWED_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(Py_TYPE(value_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)value_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_OVERFLOWED_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(Py_TYPE(value_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_OVERFLOWED_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(Py_TYPE(value_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_OVERFLOWED_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            assert(Py_TYPE(value_o) == &PyLong_Type);
            if (!_PyLong_IsCompact((PyLongObject *)value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyLong_CheckExact(left_o));
            assert(PyLong_CheckExact(right_o));
            assert(_PyLong_BothAreCompact((PyLongObject *)left_o, (PyLongObject *)right_o));
            STAT_INC(BINARY_OP, hit);
            res = _PyCompactLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
            if (PyStackRef_IsNull(res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            INT_INPLACE_OP(left, right, left, +, _PyCompactLong_Add);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            INT_INPLACE_OP(left, right, left, +, _PyCompactLong_Add);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            INT_INPLACE_OP(left, right, left, +, _PyCompactLong_Add);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            INT_INPLACE_OP(left, right, left, -, _PyCompactLong_Subtract);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            INT_INPLACE_OP(left, right, left, -, _PyCompactLong_Subtract);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            INT_INPLACE_OP(left, right, left, -, _PyCompactLong_Subtract);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            INT_INPLACE_OP(left, right, left, *, _PyCompactLong_Multiply);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            INT_INPLACE_OP(left, right, left, *, _PyCompactLong_Multiply);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            INT_INPLACE_OP(left, right, left, *, _PyCompactLong_Multiply);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            INT_INPLACE_OP(left, right, right, +, _PyCompactLong_Add);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            INT_INPLACE_OP(left, right, right, +, _PyCompactLong_Add);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_INT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            INT_INPLACE_OP(left, right, right, +, _PyCompactLong_Add);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            INT_INPLACE_OP(left, right, right, -, _PyCompactLong_Subtract);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            INT_INPLACE_OP(left, right, right, -, _PyCompactLong_Subtract);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_INT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            INT_INPLACE_OP(left, right, right, -, _PyCompactLong_Subtract);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            INT_INPLACE_OP(left, right, right, *, _PyCompactLong_Multiply);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            INT_INPLACE_OP(left, right, right, *, _PyCompactLong_Multiply);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_INT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            INT_INPLACE_OP(left, right, right, *, _PyCompactLong_Multiply);
            if (PyStackRef_IsNull(_int_inplace_res)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            res = _int_inplace_res;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_FLOAT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!PyFloat_CheckExact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_FLOAT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!PyFloat_CheckExact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_FLOAT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!PyFloat_CheckExact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_FLOAT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            left = _stack_item_1;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            if (!PyFloat_CheckExact(left_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = left;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = left;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FLOAT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyFloat_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FLOAT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyFloat_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FLOAT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyFloat_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FLOAT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyFloat_CheckExact(value_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval *
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval *
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = right;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval *
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval +
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval +
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = right;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval +
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval -
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval -
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = right;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left_o)->ob_fval -
            ((PyFloatObject *)right_o)->ob_fval;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_OP(left, right, left, +);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_OP(left, right, left, +);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_OP(left, right, left, +);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_OP(left, right, left, -);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_OP(left, right, left, -);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_OP(left, right, left, -);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_OP(left, right, left, *);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_OP(left, right, left, *);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_OP(left, right, left, *);
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_OP(left, right, right, +);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_OP(left, right, right, +);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_FLOAT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_OP(left, right, right, +);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_OP(left, right, right, *);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_OP(left, right, right, *);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_OP(left, right, right, *);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_OP(left, right, right, -);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_OP(left, right, right, -);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_OP(left, right, right, -);
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyFloat_CheckExact(left_o));
            assert(PyFloat_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            double divisor = ((PyFloatObject *)right_o)->ob_fval;
            if (divisor == 0.0) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyErr_SetString(PyExc_ZeroDivisionError,
                                "float division by zero");
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            double dres = ((PyFloatObject *)left_o)->ob_fval / divisor;
            PyObject *d = PyFloat_FromDouble(dres);
            if (d == NULL) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(d);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_INPLACE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_DIVOP(left, right, left);
            if (_divop_err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_INPLACE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_DIVOP(left, right, left);
            if (_divop_err) {
                stack_pointer[0] = right;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_INPLACE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_DIVOP(left, right, left);
            if (_divop_err) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = left;
            l = PyStackRef_NULL;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_INPLACE_RIGHT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            FLOAT_INPLACE_DIVOP(left, right, right);
            if (_divop_err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_INPLACE_RIGHT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            FLOAT_INPLACE_DIVOP(left, right, right);
            if (_divop_err) {
                stack_pointer[0] = right;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_TRUEDIV_FLOAT_INPLACE_RIGHT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            FLOAT_INPLACE_DIVOP(left, right, right);
            if (_divop_err) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = right;
            l = left;
            r = PyStackRef_NULL;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_UNICODE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyUnicode_CheckExact(left_o));
            assert(PyUnicode_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            PyObject *res_o = PyUnicode_Concat(left_o, right_o);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_UNICODE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyUnicode_CheckExact(left_o));
            assert(PyUnicode_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            PyObject *res_o = PyUnicode_Concat(left_o, right_o);
            if (res_o == NULL) {
                stack_pointer[0] = right;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_ADD_UNICODE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyUnicode_CheckExact(left_o));
            assert(PyUnicode_CheckExact(right_o));
            STAT_INC(BINARY_OP, hit);
            PyObject *res_o = PyUnicode_Concat(left_o, right_o);
            if (res_o == NULL) {
                stack_pointer[0] = left;
                stack_pointer[1] = right;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_INPLACE_ADD_UNICODE_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            assert(PyUnicode_CheckExact(left_o));
            assert(PyUnicode_CheckExact(PyStackRef_AsPyObjectBorrow(right)));
            int next_oparg;
            #if TIER_ONE
            assert(next_instr->op.code == STORE_FAST);
            next_oparg = next_instr->op.arg;
            #else
            next_oparg = (int)CURRENT_OPERAND0_16();
            #endif
            _PyStackRef *target_local = &GETLOCAL(next_oparg);
            assert(PyUnicode_CheckExact(left_o));
            if (PyStackRef_AsPyObjectBorrow(*target_local) != left_o) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(BINARY_OP, hit);
            assert(Py_REFCNT(left_o) >= 2 || !PyStackRef_IsHeapSafe(left));
            PyObject *temp = PyStackRef_AsPyObjectSteal(*target_local);
            PyObject *right_o = PyStackRef_AsPyObjectSteal(right);
            PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyUnicode_Append(&temp, right_o);
            _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            *target_local = PyStackRef_NULL;
            if (temp == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(temp);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_LHS_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            left = stack_pointer[-2];
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->lhs_type != NULL);
            if (Py_TYPE(left_o) != d->lhs_type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_LHS_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            left = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->lhs_type != NULL);
            if (Py_TYPE(left_o) != d->lhs_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_LHS_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            left = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->lhs_type != NULL);
            if (Py_TYPE(left_o) != d->lhs_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = left;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_LHS_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            left = _stack_item_1;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->lhs_type != NULL);
            if (Py_TYPE(left_o) != d->lhs_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = left;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = left;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_RHS_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            right = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->rhs_type != NULL);
            if (Py_TYPE(right_o) != d->rhs_type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = right;
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_RHS_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef _stack_item_0 = _tos_cache0;
            right = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->rhs_type != NULL);
            if (Py_TYPE(right_o) != d->rhs_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = right;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = right;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_RHS_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->rhs_type != NULL);
            if (Py_TYPE(right_o) != d->rhs_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = right;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_RHS_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            right = _stack_item_2;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d && d->guard == NULL && d->rhs_type != NULL);
            if (Py_TYPE(right_o) != d->rhs_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = right;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = right;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_EXTEND_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            assert(d != NULL);
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int match = (d->guard != NULL)
            ? d->guard(left_o, right_o)
        : (Py_TYPE(left_o) == d->lhs_type && Py_TYPE(right_o) == d->rhs_type);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (!match) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = right;
                _tos_cache0 = left;
                SET_CURRENT_CACHED_VALUES(2);
                stack_pointer += -2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = right;
            _tos_cache0 = left;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_EXTEND_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
            _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
            STAT_INC(BINARY_OP, hit);
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = d->action(left_o, right_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            assert(d->result_type == NULL || Py_TYPE(res_o) == d->result_type);
            assert(!d->result_unique || Py_REFCNT(res_o) == 1 || _Py_IsImmortal(res_o));
            assert(!PyFloat_CheckExact(res_o) || Py_REFCNT(res_o) == 1);
            res = PyStackRef_FromPyObjectSteal(res_o);
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_SLICE_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef stop;
            _PyStackRef start;
            _PyStackRef container;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            stop = _stack_item_2;
            start = _stack_item_1;
            container = _stack_item_0;
            PyObject *container_o = PyStackRef_AsPyObjectBorrow(container);
            PyObject *start_o = PyStackRef_AsPyObjectBorrow(start);
            PyObject *stop_o = PyStackRef_AsPyObjectBorrow(stop);
            PyObject *res_o;
            if (PyList_CheckExact(container_o)) {
                stack_pointer[0] = container;
                stack_pointer[1] = start;
                stack_pointer[2] = stop;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyList_BinarySlice(container_o, start_o, stop_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else if (PyTuple_CheckExact(container_o)) {
                stack_pointer[0] = container;
                stack_pointer[1] = start;
                stack_pointer[2] = stop;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyTuple_BinarySlice(container_o, start_o, stop_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else if (PyUnicode_CheckExact(container_o)) {
                stack_pointer[0] = container;
                stack_pointer[1] = start;
                stack_pointer[2] = stop;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyUnicode_BinarySlice(container_o, start_o, stop_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else {
                PyObject *slice = PySlice_New(start_o, stop_o, NULL);
                if (slice == NULL) {
                    res_o = NULL;
                }
                else {
                    stack_pointer[0] = container;
                    stack_pointer[1] = start;
                    stack_pointer[2] = stop;
                    stack_pointer += 3;
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    res_o = PyObject_GetItem(container_o, slice);
                    Py_DECREF(slice);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                    stack_pointer += -3;
                }
                stack_pointer += 3;
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef tmp = stop;
            stop = PyStackRef_NULL;
            stack_pointer[-3] = container;
            stack_pointer[-2] = start;
            stack_pointer[-1] = stop;
            PyStackRef_CLOSE(tmp);
            tmp = start;
            start = PyStackRef_NULL;
            stack_pointer[-2] = start;
            PyStackRef_CLOSE(tmp);
            tmp = container;
            container = PyStackRef_NULL;
            stack_pointer[-3] = container;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_SLICE_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef stop;
            _PyStackRef start;
            _PyStackRef container;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            stop = _stack_item_2;
            start = _stack_item_1;
            container = _stack_item_0;
            v = stack_pointer[-1];
            stack_pointer[0] = container;
            stack_pointer[1] = start;
            stack_pointer[2] = stop;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
                PyStackRef_AsPyObjectSteal(stop));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            int err;
            if (slice == NULL) {
                err = 1;
            }
            else {
                stack_pointer += -2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v));
                Py_DECREF(slice);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += 2;
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef tmp = container;
            container = PyStackRef_NULL;
            stack_pointer[-3] = container;
            PyStackRef_CLOSE(tmp);
            tmp = v;
            v = PyStackRef_NULL;
            stack_pointer[-4] = v;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -4;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_LIST_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef list_st;
            _PyStackRef res;
            _PyStackRef ls;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            list_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
            assert(PyLong_CheckExact(sub));
            assert(PyList_CheckExact(list));
            Py_ssize_t index = _PyLong_CompactValue((PyLongObject *)sub);
            if (index < 0) {
                index += PyList_GET_SIZE(list);
            }
            #ifdef Py_GIL_DISABLED
            stack_pointer[0] = list_st;
            stack_pointer[1] = sub_st;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyList_GetItemRef((PyListObject*)list, index);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = list_st;
                SET_CURRENT_CACHED_VALUES(2);
                stack_pointer += -2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            #else
            if (index < 0 || index >= PyList_GET_SIZE(list)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = list_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *res_o = PyList_GET_ITEM(list, index);
            assert(res_o != NULL);
            res = PyStackRef_FromPyObjectNew(res_o);
            stack_pointer += 2;
            #endif
            STAT_INC(BINARY_OP, hit);
            ls = list_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ls;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_LIST_SLICE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef list_st;
            _PyStackRef res;
            _PyStackRef ls;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            list_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
            assert(PySlice_Check(sub));
            assert(PyList_CheckExact(list));
            stack_pointer[0] = list_st;
            stack_pointer[1] = sub_st;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyList_SliceSubscript(list, sub);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            STAT_INC(BINARY_OP, hit);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            ls = list_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ls;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_STR_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef str_st;
            _PyStackRef res;
            _PyStackRef s;
            _PyStackRef i;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            str_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *str = PyStackRef_AsPyObjectBorrow(str_st);
            assert(PyLong_CheckExact(sub));
            assert(PyUnicode_CheckExact(str));
            if (!_PyLong_IsNonNegativeCompact((PyLongObject*)sub)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = str_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (PyUnicode_GET_LENGTH(str) <= index) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = str_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            uint8_t c = PyUnicode_1BYTE_DATA(str)[index];
            assert(c < 128);
            STAT_INC(BINARY_OP, hit);
            PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
            s = str_st;
            i = sub_st;
            res = PyStackRef_FromPyObjectBorrow(res_o);
            _tos_cache2 = i;
            _tos_cache1 = s;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_USTR_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef str_st;
            _PyStackRef res;
            _PyStackRef s;
            _PyStackRef i;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            str_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *str = PyStackRef_AsPyObjectBorrow(str_st);
            assert(PyLong_CheckExact(sub));
            assert(PyUnicode_CheckExact(str));
            if (!_PyLong_IsNonNegativeCompact((PyLongObject*)sub)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = str_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (PyUnicode_GET_LENGTH(str) <= index) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = str_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            Py_UCS4 c = PyUnicode_READ_CHAR(str, index);
            if (Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = str_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(BINARY_OP, hit);
            PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
            s = str_st;
            i = sub_st;
            res = PyStackRef_FromPyObjectBorrow(res_o);
            _tos_cache2 = i;
            _tos_cache1 = s;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TUPLE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TUPLE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TUPLE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TUPLE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_TUPLE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_TUPLE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_TUPLE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_TUPLE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyTuple_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            sub_st = stack_pointer[-1];
            tuple_st = stack_pointer[-2];
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (index >= PyTuple_GET_SIZE(tuple)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = sub_st;
            _tos_cache0 = tuple_st;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            sub_st = _stack_item_0;
            tuple_st = stack_pointer[-1];
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = sub_st;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (index >= PyTuple_GET_SIZE(tuple)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = sub_st;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = sub_st;
            _tos_cache0 = tuple_st;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            tuple_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = tuple_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (index >= PyTuple_GET_SIZE(tuple)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = sub_st;
                _tos_cache0 = tuple_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = sub_st;
            _tos_cache0 = tuple_st;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            sub_st = _stack_item_2;
            tuple_st = _stack_item_1;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = sub_st;
                _tos_cache1 = tuple_st;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (index >= PyTuple_GET_SIZE(tuple)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = sub_st;
                _tos_cache1 = tuple_st;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = sub_st;
            _tos_cache1 = tuple_st;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_TUPLE_INT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            _PyStackRef res;
            _PyStackRef ts;
            _PyStackRef ss;
            sub_st = stack_pointer[-1];
            tuple_st = stack_pointer[-2];
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            STAT_INC(BINARY_OP, hit);
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
            assert(res_o != NULL);
            res = PyStackRef_FromPyObjectNew(res_o);
            ts = tuple_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ts;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_TUPLE_INT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            _PyStackRef res;
            _PyStackRef ts;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            sub_st = _stack_item_0;
            tuple_st = stack_pointer[-1];
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            STAT_INC(BINARY_OP, hit);
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
            assert(res_o != NULL);
            res = PyStackRef_FromPyObjectNew(res_o);
            ts = tuple_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ts;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_TUPLE_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef tuple_st;
            _PyStackRef res;
            _PyStackRef ts;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            tuple_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st);
            assert(PyLong_CheckExact(sub));
            assert(PyTuple_CheckExact(tuple));
            STAT_INC(BINARY_OP, hit);
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            PyObject *res_o = PyTuple_GET_ITEM(tuple, index);
            assert(res_o != NULL);
            res = PyStackRef_FromPyObjectNew(res_o);
            ts = tuple_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ts;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_SUBSCRIPT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_subscript != _PyDict_Subscript) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_SUBSCRIPT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_subscript != _PyDict_Subscript) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_SUBSCRIPT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_subscript != _PyDict_Subscript) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_SUBSCRIPT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_subscript != _PyDict_Subscript) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_STORE_SUBSCRIPT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_ass_subscript != _PyDict_StoreSubscript) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = nos;
            _tos_cache0 = stack_pointer[-3];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_STORE_SUBSCRIPT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_ass_subscript != _PyDict_StoreSubscript) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = nos;
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_STORE_SUBSCRIPT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_ass_subscript != _PyDict_StoreSubscript) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = nos;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_DICT_STORE_SUBSCRIPT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (!Py_TYPE(o)->tp_as_mapping) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(o)->tp_as_mapping->mp_ass_subscript != _PyDict_StoreSubscript) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_DICT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_DICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_DICT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_DICT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_DICT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_DICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_DICT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_DICT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENDICT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENDICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENDICT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENDICT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenDict_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_DICT_KNOWN_HASH_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef dict_st;
            _PyStackRef res;
            _PyStackRef ds;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            dict_st = _stack_item_0;
            PyObject *hash = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
            assert(Py_TYPE(dict)->tp_as_mapping->mp_subscript == _PyDict_Subscript);
            STAT_INC(BINARY_OP, hit);
            stack_pointer[0] = dict_st;
            stack_pointer[1] = sub_st;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyDict_SubscriptKnownHash(dict, sub, (Py_hash_t)hash);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            ds = dict_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ds;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_DICT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef dict_st;
            _PyStackRef res;
            _PyStackRef ds;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub_st = _stack_item_1;
            dict_st = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
            assert(Py_TYPE(dict)->tp_as_mapping->mp_subscript == _PyDict_Subscript);
            STAT_INC(BINARY_OP, hit);
            stack_pointer[0] = dict_st;
            stack_pointer[1] = sub_st;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyDict_Subscript(dict, sub);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            ds = dict_st;
            ss = sub_st;
            _tos_cache2 = ss;
            _tos_cache1 = ds;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_CHECK_FUNC_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef container;
            _PyStackRef getitem;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            container = _stack_item_0;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
            if (!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = container;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
            PyObject *getitem_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(ht->_spec_cache.getitem);
            if (getitem_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = container;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyFunction_Check(getitem_o));
            uint32_t cached_version = FT_ATOMIC_LOAD_UINT32_RELAXED(ht->_spec_cache.getitem_version);
            if (((PyFunctionObject *)getitem_o)->func_version != cached_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = container;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem_o);
            assert(code->co_argcount == 2);
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = container;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            getitem = PyStackRef_FromPyObjectNew(getitem_o);
            _tos_cache2 = getitem;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = container;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_INIT_CALL_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef getitem;
            _PyStackRef sub;
            _PyStackRef container;
            _PyStackRef new_frame;
            getitem = stack_pointer[-1];
            sub = stack_pointer[-2];
            container = stack_pointer[-3];
            STAT_INC(BINARY_OP, hit);
            _PyInterpreterFrame* pushed_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
            pushed_frame->localsplus[0] = container;
            pushed_frame->localsplus[1] = sub;
            frame->return_offset = 6u ;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_INIT_CALL_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef getitem;
            _PyStackRef sub;
            _PyStackRef container;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            getitem = _stack_item_0;
            sub = stack_pointer[-1];
            container = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            _PyInterpreterFrame* pushed_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
            pushed_frame->localsplus[0] = container;
            pushed_frame->localsplus[1] = sub;
            frame->return_offset = 6u ;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_INIT_CALL_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef getitem;
            _PyStackRef sub;
            _PyStackRef container;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            getitem = _stack_item_1;
            sub = _stack_item_0;
            container = stack_pointer[-1];
            STAT_INC(BINARY_OP, hit);
            _PyInterpreterFrame* pushed_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
            pushed_frame->localsplus[0] = container;
            pushed_frame->localsplus[1] = sub;
            frame->return_offset = 6u ;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_SUBSCR_INIT_CALL_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef getitem;
            _PyStackRef sub;
            _PyStackRef container;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            getitem = _stack_item_2;
            sub = _stack_item_1;
            container = _stack_item_0;
            STAT_INC(BINARY_OP, hit);
            _PyInterpreterFrame* pushed_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
            pushed_frame->localsplus[0] = container;
            pushed_frame->localsplus[1] = sub;
            frame->return_offset = 6u ;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LIST_APPEND_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            _PyStackRef list;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            v = _stack_item_0;
            list = stack_pointer[-1 - (oparg-1)];
            int err = _PyList_AppendTakeRef((PyListObject *)PyStackRef_AsPyObjectBorrow(list),
                PyStackRef_AsPyObjectSteal(v));
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_ADD_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            _PyStackRef set;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            v = _stack_item_0;
            set = stack_pointer[-1 - (oparg-1)];
            stack_pointer[0] = v;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PySet_AddTakeRef((PySetObject *)PyStackRef_AsPyObjectBorrow(set),
                                        PyStackRef_AsPyObjectSteal(v));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err) {
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_SUBSCR_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub;
            _PyStackRef container;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            sub = _stack_item_2;
            container = _stack_item_1;
            v = _stack_item_0;
            stack_pointer[0] = v;
            stack_pointer[1] = container;
            stack_pointer[2] = sub;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), PyStackRef_AsPyObjectBorrow(sub), PyStackRef_AsPyObjectBorrow(v));
            _PyStackRef tmp = sub;
            sub = PyStackRef_NULL;
            stack_pointer[-1] = sub;
            PyStackRef_CLOSE(tmp);
            tmp = container;
            container = PyStackRef_NULL;
            stack_pointer[-2] = container;
            PyStackRef_CLOSE(tmp);
            tmp = v;
            v = PyStackRef_NULL;
            stack_pointer[-3] = v;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_SUBSCR_LIST_INT_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub_st;
            _PyStackRef list_st;
            _PyStackRef value;
            _PyStackRef ls;
            _PyStackRef ss;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            sub_st = _stack_item_2;
            list_st = _stack_item_1;
            value = _stack_item_0;
            PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
            PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
            assert(PyLong_CheckExact(sub));
            assert(PyList_CheckExact(list));
            Py_ssize_t index = _PyLong_CompactValue((PyLongObject *)sub);
            if (!LOCK_OBJECT(list)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = sub_st;
                _tos_cache1 = list_st;
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t len = PyList_GET_SIZE(list);
            if (index < 0) {
                index += len;
            }
            if (index < 0 || index >= len) {
                UNLOCK_OBJECT(list);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = sub_st;
                    _tos_cache1 = list_st;
                    _tos_cache0 = value;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            STAT_INC(STORE_SUBSCR, hit);
            PyObject *old_value = PyList_GET_ITEM(list, index);
            FT_ATOMIC_STORE_PTR_RELEASE(_PyList_ITEMS(list)[index],
                                        PyStackRef_AsPyObjectSteal(value));
            assert(old_value != NULL);
            UNLOCK_OBJECT(list);
            ls = list_st;
            ss = sub_st;
            stack_pointer[0] = ls;
            stack_pointer[1] = ss;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_DECREF(old_value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache1 = ss;
            _tos_cache0 = ls;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_SUBSCR_DICT_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub;
            _PyStackRef dict_st;
            _PyStackRef value;
            _PyStackRef st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            sub = _stack_item_2;
            dict_st = _stack_item_1;
            value = _stack_item_0;
            PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
            assert(Py_TYPE(dict)->tp_as_mapping->mp_ass_subscript == _PyDict_StoreSubscript);
            STAT_INC(STORE_SUBSCR, hit);
            stack_pointer[0] = value;
            stack_pointer[1] = dict_st;
            stack_pointer[2] = sub;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyDict_SetItem_Take2((PyDictObject *)dict,
                PyStackRef_AsPyObjectSteal(sub),
                PyStackRef_AsPyObjectSteal(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err) {
                stack_pointer += -3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(dict_st);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            st = dict_st;
            _tos_cache0 = st;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_SUBSCR_DICT_KNOWN_HASH_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub;
            _PyStackRef dict_st;
            _PyStackRef value;
            _PyStackRef st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            sub = _stack_item_2;
            dict_st = _stack_item_1;
            value = _stack_item_0;
            PyObject *hash = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
            assert(Py_TYPE(dict)->tp_as_mapping->mp_ass_subscript == _PyDict_StoreSubscript);
            STAT_INC(STORE_SUBSCR, hit);
            stack_pointer[0] = value;
            stack_pointer[1] = dict_st;
            stack_pointer[2] = sub;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyDict_SetItem_Take2_KnownHash((PyDictObject *)dict,
                PyStackRef_AsPyObjectSteal(sub),
                PyStackRef_AsPyObjectSteal(value),
                (Py_hash_t)hash);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err) {
                stack_pointer += -3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(dict_st);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            st = dict_st;
            _tos_cache0 = st;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DELETE_SUBSCR_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef sub;
            _PyStackRef container;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            sub = _stack_item_1;
            container = _stack_item_0;
            stack_pointer[0] = container;
            stack_pointer[1] = sub;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyObject_DelItem(PyStackRef_AsPyObjectBorrow(container),
                                       PyStackRef_AsPyObjectBorrow(sub));
            _PyStackRef tmp = sub;
            sub = PyStackRef_NULL;
            stack_pointer[-1] = sub;
            PyStackRef_CLOSE(tmp);
            tmp = container;
            container = PyStackRef_NULL;
            stack_pointer[-2] = container;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_INTRINSIC_1_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            value = _stack_item_0;
            assert(oparg <= MAX_INTRINSIC_1);
            stack_pointer[0] = value;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            v = value;
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache1 = v;
            _tos_cache0 = res;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_INTRINSIC_2_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value1_st;
            _PyStackRef value2_st;
            _PyStackRef res;
            _PyStackRef vs1;
            _PyStackRef vs2;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            value1_st = _stack_item_1;
            value2_st = _stack_item_0;
            assert(oparg <= MAX_INTRINSIC_2);
            PyObject *value1 = PyStackRef_AsPyObjectBorrow(value1_st);
            PyObject *value2 = PyStackRef_AsPyObjectBorrow(value2_st);
            stack_pointer[0] = value2_st;
            stack_pointer[1] = value1_st;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyIntrinsics_BinaryFunctions[oparg].func(tstate, value2, value1);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            vs1 = value1_st;
            vs2 = value2_st;
            _tos_cache2 = vs2;
            _tos_cache1 = vs1;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_HEAP_SAFE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            value = PyStackRef_MakeHeapSafe(value);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_HEAP_SAFE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            value = PyStackRef_MakeHeapSafe(value);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_HEAP_SAFE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            value = PyStackRef_MakeHeapSafe(value);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_HEAP_SAFE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            value = PyStackRef_MakeHeapSafe(value);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RETURN_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef retval;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            retval = _stack_item_0;
            assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
            _PyStackRef temp = retval;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            assert(STACK_LEVEL() == 0);
            DTRACE_FUNCTION_RETURN();
            _Py_LeaveRecursiveCallPy(tstate);
            _PyInterpreterFrame *dying = frame;
            frame = tstate->current_frame = dying->previous;
            _PyEval_FrameClearAndPop(tstate, dying);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            LOAD_IP(frame->return_offset);
            res = temp;
            LLTRACE_RESUME_FRAME();
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GET_AITER_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef obj;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            obj = _stack_item_0;
            unaryfunc getter = NULL;
            PyObject *obj_o = PyStackRef_AsPyObjectBorrow(obj);
            PyObject *iter_o;
            PyTypeObject *type = Py_TYPE(obj_o);
            if (type->tp_as_async != NULL) {
                getter = type->tp_as_async->am_aiter;
            }
            if (getter == NULL) {
                stack_pointer[0] = obj;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_Format(tstate, PyExc_TypeError,
                              "'async for' requires an object with "
                              "__aiter__ method, got %.100s",
                              type->tp_name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(obj);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            stack_pointer[0] = obj;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            iter_o = (*getter)(obj_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(obj);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (iter_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (Py_TYPE(iter_o)->tp_as_async == NULL ||
                Py_TYPE(iter_o)->tp_as_async->am_anext == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_Format(tstate, PyExc_TypeError,
                              "'async for' received an object from __aiter__ "
                              "that does not implement __anext__: %.100s",
                              Py_TYPE(iter_o)->tp_name);
                Py_DECREF(iter_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            iter = PyStackRef_FromPyObjectSteal(iter_o);
            _tos_cache0 = iter;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GET_ANEXT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef aiter;
            _PyStackRef awaitable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            aiter = _stack_item_0;
            stack_pointer[0] = aiter;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *awaitable_o = _PyEval_GetANext(PyStackRef_AsPyObjectBorrow(aiter));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (awaitable_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            awaitable = PyStackRef_FromPyObjectSteal(awaitable_o);
            _tos_cache1 = awaitable;
            _tos_cache0 = aiter;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GET_AWAITABLE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            iterable = _stack_item_0;
            stack_pointer[0] = iterable;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *iter_o = _PyEval_GetAwaitable(PyStackRef_AsPyObjectBorrow(iterable), oparg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(iterable);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (iter_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            iter = PyStackRef_FromPyObjectSteal(iter_o);
            _tos_cache0 = iter;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _SEND is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        case _SEND_GEN_FRAME_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            _PyStackRef receiver;
            _PyStackRef gen_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            v = _stack_item_2;
            receiver = _stack_item_0;
            PyGenObject *gen = (PyGenObject *)PyStackRef_AsPyObjectBorrow(receiver);
            if (Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = v;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = receiver;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (!gen_try_set_executing((PyGenObject *)gen)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = v;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = receiver;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(SEND, hit);
            _PyInterpreterFrame *pushed_frame = &gen->gi_iframe;
            _PyFrame_StackPush(pushed_frame, PyStackRef_MakeHeapSafe(v));
            gen->gi_exc_state.previous_item = tstate->exc_info;
            tstate->exc_info = &gen->gi_exc_state;
            assert( 2u + oparg <= UINT16_MAX);
            frame->return_offset = (uint16_t)( 2u + oparg);
            pushed_frame->previous = frame;
            gen_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache2 = gen_frame;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = receiver;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _YIELD_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef retval;
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            retval = _stack_item_0;
            assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
            frame->instr_ptr++;
            PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
            assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
            assert(oparg == 0 || oparg == 1);
            _PyStackRef temp = retval;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            DTRACE_FUNCTION_RETURN();
            tstate->exc_info = gen->gi_exc_state.previous_item;
            gen->gi_exc_state.previous_item = NULL;
            _Py_LeaveRecursiveCallPy(tstate);
            _PyInterpreterFrame *gen_frame = frame;
            frame = tstate->current_frame = frame->previous;
            gen_frame->previous = NULL;
            ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
            FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
            assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
            #if TIER_ONE && defined(Py_DEBUG)
            if (!PyStackRef_IsNone(frame->f_executable)) {
                int i = frame->instr_ptr - _PyFrame_GetBytecode(frame);
                int opcode = _Py_GetBaseCodeUnit(_PyFrame_GetCode(frame), i).op.code;
                assert(opcode == SEND || opcode == FOR_ITER);
            }
            #endif
            stack_pointer = _PyFrame_GetStackPointer(frame);
            LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
            value = temp;
            LLTRACE_RESUME_FRAME();
            _tos_cache0 = value;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _POP_EXCEPT_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef exc_value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            exc_value = _stack_item_0;
            _PyErr_StackItem *exc_info = tstate->exc_info;
            stack_pointer[0] = exc_value;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_XSETREF(exc_info->exc_value,
                       PyStackRef_IsNone(exc_value)
                       ? NULL : PyStackRef_AsPyObjectSteal(exc_value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_COMMON_CONSTANT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            assert(oparg < NUM_COMMON_CONSTANTS);
            value = PyStackRef_FromPyObjectNew(tstate->interp->common_consts[oparg]);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_COMMON_CONSTANT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            assert(oparg < NUM_COMMON_CONSTANTS);
            value = PyStackRef_FromPyObjectNew(tstate->interp->common_consts[oparg]);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_COMMON_CONSTANT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            assert(oparg < NUM_COMMON_CONSTANTS);
            value = PyStackRef_FromPyObjectNew(tstate->interp->common_consts[oparg]);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_BUILD_CLASS_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bc;
            int err;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *bc_o = _PyMapping_GetOptionalItem2(BUILTINS(), &_Py_ID(__build_class__), &err);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (bc_o == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_SetString(tstate, PyExc_NameError,
                                 "__build_class__ not found");
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            bc = PyStackRef_FromPyObjectSteal(bc_o);
            _tos_cache0 = bc;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_NAME_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            v = _stack_item_0;
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            PyObject *ns = LOCALS();
            int err;
            if (ns == NULL) {
                stack_pointer[0] = v;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_Format(tstate, PyExc_SystemError,
                              "no locals found when storing %R", name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(v);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (PyDict_CheckExact(ns)) {
                stack_pointer[0] = v;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                err = PyDict_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else {
                stack_pointer[0] = v;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                err = PyObject_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(v);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DELETE_NAME_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            PyObject *ns = LOCALS();
            int err;
            if (ns == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_Format(tstate, PyExc_SystemError,
                              "no locals when deleting %R", name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            err = PyObject_DelItem(ns, name);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err != 0) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
                    NAME_ERROR_MSG,
                    name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef *top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            seq = _stack_item_0;
            top = &stack_pointer[oparg];
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = _PyEval_UnpackIterableStackRef(tstate, seq_o, oparg, -1, top);
            Py_DECREF(seq_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res == 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_TWO_TUPLE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef val1;
            _PyStackRef val0;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            seq = _stack_item_0;
            assert(oparg == 2);
            PyObject *seq_o = PyStackRef_AsPyObjectBorrow(seq);
            assert(PyTuple_CheckExact(seq_o));
            if (PyTuple_GET_SIZE(seq_o) != 2) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = seq;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(seq_o, 0));
            val1 = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(seq_o, 1));
            stack_pointer[0] = val1;
            stack_pointer[1] = val0;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(seq);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache1 = val0;
            _tos_cache0 = val1;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef val1;
            _PyStackRef val0;
            seq = stack_pointer[-1];
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 0));
            val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
            PyObject_GC_UnTrack(seq_o);
            _PyStolenTuple_Free(seq_o);
            _tos_cache1 = val0;
            _tos_cache0 = val1;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef val1;
            _PyStackRef val0;
            _PyStackRef _stack_item_0 = _tos_cache0;
            seq = _stack_item_0;
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 0));
            val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
            PyObject_GC_UnTrack(seq_o);
            _PyStolenTuple_Free(seq_o);
            _tos_cache1 = val0;
            _tos_cache0 = val1;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef val1;
            _PyStackRef val0;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            seq = _stack_item_1;
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 0));
            val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
            PyObject_GC_UnTrack(seq_o);
            _PyStolenTuple_Free(seq_o);
            _tos_cache2 = val0;
            _tos_cache1 = val1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef val2;
            _PyStackRef val1;
            _PyStackRef val0;
            seq = stack_pointer[-1];
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 0));
            val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
            val2 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 2));
            PyObject_GC_UnTrack(seq_o);
            _PyStolenTuple_Free(seq_o);
            _tos_cache2 = val0;
            _tos_cache1 = val1;
            _tos_cache0 = val2;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef val2;
            _PyStackRef val1;
            _PyStackRef val0;
            _PyStackRef _stack_item_0 = _tos_cache0;
            seq = _stack_item_0;
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 0));
            val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
            val2 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 2));
            PyObject_GC_UnTrack(seq_o);
            _PyStolenTuple_Free(seq_o);
            _tos_cache2 = val0;
            _tos_cache1 = val1;
            _tos_cache0 = val2;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_TUPLE_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef *values;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            seq = _stack_item_0;
            values = &stack_pointer[0];
            PyObject *seq_o = PyStackRef_AsPyObjectBorrow(seq);
            assert(PyTuple_CheckExact(seq_o));
            if (PyTuple_GET_SIZE(seq_o) != oparg) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = seq;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(UNPACK_SEQUENCE, hit);
            PyObject **items = _PyTuple_ITEMS(seq_o);
            for (int i = oparg; --i >= 0; ) {
                *values++ = PyStackRef_FromPyObjectNew(items[i]);
            }
            stack_pointer += oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(seq);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_UNIQUE_TUPLE_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef *values;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            seq = _stack_item_0;
            values = &stack_pointer[0];
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            assert(PyTuple_CheckExact(seq_o));
            assert(PyTuple_GET_SIZE(seq_o) == oparg);
            assert(_PyObject_IsUniquelyReferenced(seq_o));
            STAT_INC(UNPACK_SEQUENCE, hit);
            PyObject **items = _PyTuple_ITEMS(seq_o);
            for (int i = oparg; --i >= 0; ) {
                *values++ = PyStackRef_FromPyObjectSteal(items[i]);
            }
            PyObject_GC_UnTrack(seq_o);
            _PyStolenTuple_Free(seq_o);
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_SEQUENCE_LIST_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef *values;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            seq = _stack_item_0;
            values = &stack_pointer[0];
            PyObject *seq_o = PyStackRef_AsPyObjectBorrow(seq);
            assert(PyList_CheckExact(seq_o));
            if (!LOCK_OBJECT(seq_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = seq;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyList_GET_SIZE(seq_o) != oparg) {
                UNLOCK_OBJECT(seq_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = seq;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            STAT_INC(UNPACK_SEQUENCE, hit);
            PyObject **items = _PyList_ITEMS(seq_o);
            for (int i = oparg; --i >= 0; ) {
                *values++ = PyStackRef_FromPyObjectNew(items[i]);
            }
            UNLOCK_OBJECT(seq_o);
            stack_pointer += oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(seq);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _UNPACK_EX_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef seq;
            _PyStackRef *top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            seq = _stack_item_0;
            top = &stack_pointer[1 + (oparg & 0xFF) + (oparg >> 8)];
            PyObject *seq_o = PyStackRef_AsPyObjectSteal(seq);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = _PyEval_UnpackIterableStackRef(tstate, seq_o, oparg & 0xFF, oparg >> 8, top);
            Py_DECREF(seq_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res == 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += 1 + (oparg & 0xFF) + (oparg >> 8);
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_ATTR_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            owner = _stack_item_1;
            v = _stack_item_0;
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            stack_pointer[0] = v;
            stack_pointer[1] = owner;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyObject_SetAttr(PyStackRef_AsPyObjectBorrow(owner),
                                       name, PyStackRef_AsPyObjectBorrow(v));
            _PyStackRef tmp = owner;
            owner = PyStackRef_NULL;
            stack_pointer[-1] = owner;
            PyStackRef_CLOSE(tmp);
            tmp = v;
            v = PyStackRef_NULL;
            stack_pointer[-2] = v;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DELETE_ATTR_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            stack_pointer[0] = owner;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyObject_DelAttr(PyStackRef_AsPyObjectBorrow(owner), name);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(owner);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_GLOBAL_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            v = _stack_item_0;
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            stack_pointer[0] = v;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyDict_SetItem(GLOBALS(), name, PyStackRef_AsPyObjectBorrow(v));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(v);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DELETE_GLOBAL_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyDict_Pop(GLOBALS(), name, NULL);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (err == 0) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
                    NAME_ERROR_MSG, name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_LOCALS_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef locals;
            PyObject *l = LOCALS();
            if (l == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_SetString(tstate, PyExc_SystemError,
                                 "no locals found");
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            locals = PyStackRef_FromPyObjectNew(l);
            _tos_cache0 = locals;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_LOCALS_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef locals;
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *l = LOCALS();
            if (l == NULL) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_SetString(tstate, PyExc_SystemError,
                                 "no locals found");
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            locals = PyStackRef_FromPyObjectNew(l);
            _tos_cache1 = locals;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_LOCALS_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef locals;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *l = LOCALS();
            if (l == NULL) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_SetString(tstate, PyExc_SystemError,
                                 "no locals found");
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            locals = PyStackRef_FromPyObjectNew(l);
            _tos_cache2 = locals;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _LOAD_FROM_DICT_OR_GLOBALS is not a viable micro-op for tier 2 because it has both popping and not-popping errors */

        case _LOAD_NAME_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            oparg = CURRENT_OPARG();
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *v_o = _PyEval_LoadName(tstate, frame, name);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (v_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (PyLazyImport_CheckExact(v_o)) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyObject *l_v = _PyImport_LoadLazyImportTstate(tstate, v_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (l_v == NULL) {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    Py_DECREF(v_o);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                _PyFrame_SetStackPointer(frame, stack_pointer);
                int err = PyDict_SetItem(GLOBALS(), name, l_v);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (err < 0) {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    Py_DECREF(v_o);
                    Py_DECREF(l_v);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                _PyFrame_SetStackPointer(frame, stack_pointer);
                Py_SETREF(v_o, l_v);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            v = PyStackRef_FromPyObjectSteal(v_o);
            _tos_cache0 = v;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_GLOBAL_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *res;
            oparg = CURRENT_OPARG();
            res = &stack_pointer[0];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyEval_LoadGlobalStackRef(GLOBALS(), BUILTINS(), name, res);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (PyStackRef_IsNull(*res)) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_NULL_CONDITIONAL_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *null;
            oparg = CURRENT_OPARG();
            null = &stack_pointer[0];
            if (oparg & 1) {
                null[0] = PyStackRef_NULL;
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += (oparg & 1);
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_GLOBALS_VERSION_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint16_t version = (uint16_t)CURRENT_OPERAND0_16();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_GLOBALS_VERSION_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint16_t version = (uint16_t)CURRENT_OPERAND0_16();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_GLOBALS_VERSION_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint16_t version = (uint16_t)CURRENT_OPERAND0_16();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_GLOBALS_VERSION_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint16_t version = (uint16_t)CURRENT_OPERAND0_16();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_GLOBAL_MODULE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef res;
            uint16_t version = (uint16_t)CURRENT_OPERAND0_16();
            uint16_t index = (uint16_t)CURRENT_OPERAND1_16();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
            assert(index < DK_SIZE(keys));
            PyObject *res_o = FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
            if (res_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #if Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(&entries[index].me_value, res_o, &res);
            if (!increfed) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #else
            res = PyStackRef_FromPyObjectNew(res_o);
            #endif
            STAT_INC(LOAD_GLOBAL, hit);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_GLOBAL_BUILTINS_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef res;
            uint16_t version = (uint16_t)CURRENT_OPERAND0_16();
            uint16_t index = (uint16_t)CURRENT_OPERAND1_16();
            PyDictObject *dict = (PyDictObject *)BUILTINS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
            PyObject *res_o = FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
            if (res_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #if Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(&entries[index].me_value, res_o, &res);
            if (!increfed) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #else
            res = PyStackRef_FromPyObjectNew(res_o);
            #endif
            STAT_INC(LOAD_GLOBAL, hit);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DELETE_FAST_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            _PyStackRef v = GETLOCAL(oparg);
            if (PyStackRef_IsNull(v)) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
                    UNBOUNDLOCAL_ERROR_MSG,
                    PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
                );
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = PyStackRef_NULL;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_XCLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_CELL_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            PyObject *initial = PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
            PyObject *cell = PyCell_New(initial);
            if (cell == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef tmp = GETLOCAL(oparg);
            GETLOCAL(oparg) = PyStackRef_FromPyObjectSteal(cell);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_XCLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DELETE_DEREF_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            PyObject *cell = PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
            PyObject *oldobj = PyCell_SwapTakeRef((PyCellObject *)cell, NULL);
            if (oldobj == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_DECREF(oldobj);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_FROM_DICT_OR_DEREF_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef class_dict_st;
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            class_dict_st = _stack_item_0;
            PyObject *name;
            PyObject *class_dict = PyStackRef_AsPyObjectBorrow(class_dict_st);
            assert(class_dict);
            assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus);
            name = PyTuple_GET_ITEM(_PyFrame_GetCode(frame)->co_localsplusnames, oparg);
            int err;
            stack_pointer[0] = class_dict_st;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject* value_o = _PyMapping_GetOptionalItem2(class_dict, name, &err);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (!value_o) {
                PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
                value_o = PyCell_GetRef(cell);
                if (value_o == NULL) {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
            }
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(class_dict_st);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            value = PyStackRef_FromPyObjectSteal(value_o);
            _tos_cache0 = value;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_DEREF_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            oparg = CURRENT_OPARG();
            PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
            _PyFrame_SetStackPointer(frame, stack_pointer);
            value = _PyCell_GetStackRef(cell);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (PyStackRef_IsNull(value)) {
                stack_pointer[0] = value;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = value;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_DEREF_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef v;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            v = _stack_item_0;
            PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
            stack_pointer[0] = v;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyCell_SetTakeRef(cell, PyStackRef_AsPyObjectSteal(v));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_FREE_VARS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            PyCodeObject *co = _PyFrame_GetCode(frame);
            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
            PyObject *closure = func->func_closure;
            assert(oparg == co->co_nfreevars);
            int offset = co->co_nlocalsplus - oparg;
            for (int i = 0; i < oparg; ++i) {
                PyObject *o = PyTuple_GET_ITEM(closure, i);
                frame->localsplus[offset + i] = PyStackRef_FromPyObjectNew(o);
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_FREE_VARS_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            PyCodeObject *co = _PyFrame_GetCode(frame);
            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
            PyObject *closure = func->func_closure;
            assert(oparg == co->co_nfreevars);
            int offset = co->co_nlocalsplus - oparg;
            for (int i = 0; i < oparg; ++i) {
                PyObject *o = PyTuple_GET_ITEM(closure, i);
                frame->localsplus[offset + i] = PyStackRef_FromPyObjectNew(o);
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_FREE_VARS_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            PyCodeObject *co = _PyFrame_GetCode(frame);
            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
            PyObject *closure = func->func_closure;
            assert(oparg == co->co_nfreevars);
            int offset = co->co_nlocalsplus - oparg;
            for (int i = 0; i < oparg; ++i) {
                PyObject *o = PyTuple_GET_ITEM(closure, i);
                frame->localsplus[offset + i] = PyStackRef_FromPyObjectNew(o);
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_FREE_VARS_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            PyCodeObject *co = _PyFrame_GetCode(frame);
            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
            PyObject *closure = func->func_closure;
            assert(oparg == co->co_nfreevars);
            int offset = co->co_nlocalsplus - oparg;
            for (int i = 0; i < oparg; ++i) {
                PyObject *o = PyTuple_GET_ITEM(closure, i);
                frame->localsplus[offset + i] = PyStackRef_FromPyObjectNew(o);
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_STRING_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *pieces;
            _PyStackRef str;
            oparg = CURRENT_OPARG();
            pieces = &stack_pointer[-oparg];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *str_o = _Py_BuildString_StackRefSteal(pieces, oparg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (str_o == NULL) {
                stack_pointer += -oparg;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            str = PyStackRef_FromPyObjectSteal(str_o);
            _tos_cache0 = str;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_INTERPOLATION_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *format;
            _PyStackRef str;
            _PyStackRef value;
            _PyStackRef interpolation;
            oparg = CURRENT_OPARG();
            format = &stack_pointer[-(oparg & 1)];
            str = stack_pointer[-1 - (oparg & 1)];
            value = stack_pointer[-2 - (oparg & 1)];
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            PyObject *str_o = PyStackRef_AsPyObjectBorrow(str);
            int conversion = oparg >> 2;
            PyObject *format_o;
            if (oparg & 1) {
                format_o = PyStackRef_AsPyObjectBorrow(format[0]);
            }
            else {
                format_o = &_Py_STR(empty);
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *interpolation_o = _PyInterpolation_Build(value_o, str_o, conversion, format_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (oparg & 1) {
                stack_pointer += -(oparg & 1);
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(format[0]);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else {
                stack_pointer += -(oparg & 1);
            }
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(str);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (interpolation_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            interpolation = PyStackRef_FromPyObjectSteal(interpolation_o);
            _tos_cache0 = interpolation;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_TEMPLATE_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef interpolations;
            _PyStackRef strings;
            _PyStackRef template;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            interpolations = _stack_item_1;
            strings = _stack_item_0;
            PyObject *strings_o = PyStackRef_AsPyObjectBorrow(strings);
            PyObject *interpolations_o = PyStackRef_AsPyObjectBorrow(interpolations);
            stack_pointer[0] = strings;
            stack_pointer[1] = interpolations;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *template_o = _PyTemplate_Build(strings_o, interpolations_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(interpolations);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(strings);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (template_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            template = PyStackRef_FromPyObjectSteal(template_o);
            _tos_cache0 = template;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_TUPLE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *values;
            _PyStackRef tup;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg];
            PyObject *tup_o = _PyTuple_FromStackRefStealOnSuccess(values, oparg);
            if (tup_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            tup = PyStackRef_FromPyObjectStealMortal(tup_o);
            _tos_cache0 = tup;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_LIST_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *values;
            _PyStackRef list;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *list_o = _PyList_FromStackRefStealOnSuccess(values, oparg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (list_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            list = PyStackRef_FromPyObjectStealMortal(list_o);
            _tos_cache0 = list;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LIST_EXTEND_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable_st;
            _PyStackRef list_st;
            _PyStackRef i;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            iterable_st = _stack_item_0;
            list_st = stack_pointer[-1 - (oparg-1)];
            PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
            PyObject *iterable = PyStackRef_AsPyObjectBorrow(iterable_st);
            stack_pointer[0] = iterable_st;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (none_val == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                int matches = _PyErr_ExceptionMatches(tstate, PyExc_TypeError);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (matches &&
                    (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
                {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    _PyErr_Clear(tstate);
                    _PyErr_Format(tstate, PyExc_TypeError,
                                  "Value after * must be an iterable, not %.200s",
                                  Py_TYPE(iterable)->tp_name);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                }
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            assert(Py_IsNone(none_val));
            i = iterable_st;
            _tos_cache0 = i;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_UPDATE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef set;
            _PyStackRef i;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            iterable = _stack_item_0;
            set = stack_pointer[-1 - (oparg-1)];
            stack_pointer[0] = iterable;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PySet_Update(PyStackRef_AsPyObjectBorrow(set),
                                    PyStackRef_AsPyObjectBorrow(iterable));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            i = iterable;
            _tos_cache0 = i;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_SET_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *values;
            _PyStackRef set;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *set_o = PySet_New(NULL);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (set_o == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyStackRef tmp;
                for (int _i = oparg; --_i >= 0;) {
                    tmp = values[_i];
                    values[_i] = PyStackRef_NULL;
                    PyStackRef_CLOSE(tmp);
                }
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -oparg;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            int err = 0;
            for (Py_ssize_t i = 0; i < oparg; i++) {
                _PyStackRef value = values[i];
                values[i] = PyStackRef_NULL;
                if (err == 0) {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    err = _PySet_AddTakeRef((PySetObject *)set_o, PyStackRef_AsPyObjectSteal(value));
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                }
                else {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    PyStackRef_CLOSE(value);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                }
            }
            if (err) {
                stack_pointer += -oparg;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                Py_DECREF(set_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            set = PyStackRef_FromPyObjectStealMortal(set_o);
            _tos_cache0 = set;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_MAP_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *values;
            _PyStackRef map;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg*2];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *map_o = _Py_BuildMap_StackRefSteal(values, oparg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (map_o == NULL) {
                stack_pointer += -oparg*2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            map = PyStackRef_FromPyObjectStealMortal(map_o);
            _tos_cache0 = map;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -oparg*2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SETUP_ANNOTATIONS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            if (LOCALS() == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyErr_Format(tstate, PyExc_SystemError,
                              "no locals found when setting up annotations");
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            int err;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject* ann_dict = _PyMapping_GetOptionalItem2(LOCALS(), &_Py_ID(__annotations__), &err);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (ann_dict == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                ann_dict = PyDict_New();
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (ann_dict == NULL) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                _PyFrame_SetStackPointer(frame, stack_pointer);
                err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
                                       ann_dict);
                Py_DECREF(ann_dict);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (err) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
            }
            else {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                Py_DECREF(ann_dict);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DICT_UPDATE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef update;
            _PyStackRef dict;
            _PyStackRef upd;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            update = _stack_item_0;
            dict = stack_pointer[-1 - (oparg - 1)];
            PyObject *dict_o = PyStackRef_AsPyObjectBorrow(dict);
            PyObject *update_o = PyStackRef_AsPyObjectBorrow(update);
            stack_pointer[0] = update;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = PyDict_Update(dict_o, update_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                int matches = _PyErr_ExceptionMatches(tstate, PyExc_AttributeError);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (matches) {
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    PyObject *exc = _PyErr_GetRaisedException(tstate);
                    int has_keys = PyObject_HasAttrWithError(update_o, &_Py_ID(keys));
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                    if (has_keys == 0) {
                        _PyFrame_SetStackPointer(frame, stack_pointer);
                        _PyErr_Format(tstate, PyExc_TypeError,
                                      "'%T' object is not a mapping",
                                      update_o);
                        Py_DECREF(exc);
                        stack_pointer = _PyFrame_GetStackPointer(frame);
                    }
                    else {
                        _PyFrame_SetStackPointer(frame, stack_pointer);
                        _PyErr_ChainExceptions1(exc);
                        stack_pointer = _PyFrame_GetStackPointer(frame);
                    }
                }
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            upd = update;
            _tos_cache0 = upd;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DICT_MERGE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef update;
            _PyStackRef dict;
            _PyStackRef callable;
            _PyStackRef u;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            update = _stack_item_0;
            dict = stack_pointer[-1 - (oparg - 1)];
            callable = stack_pointer[-4 - (oparg - 1)];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyObject *dict_o = PyStackRef_AsPyObjectBorrow(dict);
            PyObject *update_o = PyStackRef_AsPyObjectBorrow(update);
            PyObject *dupkey = NULL;
            stack_pointer[0] = update;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyDict_MergeUniq(dict_o, update_o, &dupkey);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FormatKwargsError(tstate, callable_o, update_o, dupkey);
                Py_XDECREF(dupkey);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            u = update;
            _tos_cache0 = u;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAP_ADD_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef key;
            _PyStackRef dict_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            value = _stack_item_1;
            key = _stack_item_0;
            dict_st = stack_pointer[-1 - (oparg - 1)];
            PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
            assert(PyDict_CheckExact(dict));
            stack_pointer[0] = key;
            stack_pointer[1] = value;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyDict_SetItem_Take2(
                (PyDictObject *)dict,
                PyStackRef_AsPyObjectSteal(key),
                PyStackRef_AsPyObjectSteal(value)
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err != 0) {
                stack_pointer += -2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SUPER_ATTR_ATTR_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_st;
            _PyStackRef class_st;
            _PyStackRef global_super_st;
            _PyStackRef attr_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            self_st = _stack_item_2;
            class_st = _stack_item_1;
            global_super_st = _stack_item_0;
            PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
            PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
            PyObject *self = PyStackRef_AsPyObjectBorrow(self_st);
            assert(!(oparg & 1));
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = self_st;
                _tos_cache1 = class_st;
                _tos_cache0 = global_super_st;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = self_st;
                _tos_cache1 = class_st;
                _tos_cache0 = global_super_st;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_SUPER_ATTR, hit);
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
            stack_pointer[0] = global_super_st;
            stack_pointer[1] = class_st;
            stack_pointer[2] = self_st;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *attr = _PySuper_Lookup((PyTypeObject *)class, self, name, NULL);
            _PyStackRef tmp = self_st;
            self_st = PyStackRef_NULL;
            stack_pointer[-1] = self_st;
            PyStackRef_CLOSE(tmp);
            tmp = class_st;
            class_st = PyStackRef_NULL;
            stack_pointer[-2] = class_st;
            PyStackRef_CLOSE(tmp);
            tmp = global_super_st;
            global_super_st = PyStackRef_NULL;
            stack_pointer[-3] = global_super_st;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (attr == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            attr_st = PyStackRef_FromPyObjectSteal(attr);
            _tos_cache0 = attr_st;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TYPE_VERSION_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = (PyTypeObject *)PyStackRef_AsPyObjectBorrow(nos);
            assert(type_version != 0);
            if (!PyType_Check((PyObject *)tp)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TYPE_VERSION_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = (PyTypeObject *)PyStackRef_AsPyObjectBorrow(nos);
            assert(type_version != 0);
            if (!PyType_Check((PyObject *)tp)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TYPE_VERSION_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = (PyTypeObject *)PyStackRef_AsPyObjectBorrow(nos);
            assert(type_version != 0);
            if (!PyType_Check((PyObject *)tp)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_TYPE_VERSION_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = (PyTypeObject *)PyStackRef_AsPyObjectBorrow(nos);
            assert(type_version != 0);
            if (!PyType_Check((PyObject *)tp)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_LOAD_SUPER_ATTR_METHOD_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef class_st;
            _PyStackRef global_super_st;
            oparg = CURRENT_OPARG();
            class_st = stack_pointer[-2];
            global_super_st = stack_pointer[-3];
            PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
            PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
            assert(oparg & 1);
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = class_st;
            _tos_cache0 = global_super_st;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_LOAD_SUPER_ATTR_METHOD_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef class_st;
            _PyStackRef global_super_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            class_st = stack_pointer[-1];
            global_super_st = stack_pointer[-2];
            PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
            PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
            assert(oparg & 1);
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = class_st;
            _tos_cache0 = global_super_st;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_LOAD_SUPER_ATTR_METHOD_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef class_st;
            _PyStackRef global_super_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            class_st = _stack_item_0;
            global_super_st = stack_pointer[-1];
            PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
            PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
            assert(oparg & 1);
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = class_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = class_st;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = class_st;
            _tos_cache0 = global_super_st;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_LOAD_SUPER_ATTR_METHOD_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef class_st;
            _PyStackRef global_super_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            class_st = _stack_item_1;
            global_super_st = _stack_item_0;
            PyObject *global_super = PyStackRef_AsPyObjectBorrow(global_super_st);
            PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
            assert(oparg & 1);
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = class_st;
                _tos_cache0 = global_super_st;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = class_st;
                _tos_cache0 = global_super_st;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = class_st;
            _tos_cache0 = global_super_st;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SUPER_ATTR_METHOD_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_st;
            _PyStackRef class_st;
            _PyStackRef global_super_st;
            _PyStackRef attr;
            _PyStackRef self_or_null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            self_st = _stack_item_2;
            class_st = _stack_item_1;
            global_super_st = _stack_item_0;
            PyObject *class = PyStackRef_AsPyObjectBorrow(class_st);
            PyObject *self = PyStackRef_AsPyObjectBorrow(self_st);
            STAT_INC(LOAD_SUPER_ATTR, hit);
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
            PyTypeObject *cls = (PyTypeObject *)class;
            int method_found = 0;
            PyObject *attr_o;
            {
                int *method_found_ptr = &method_found;
                stack_pointer[0] = global_super_st;
                stack_pointer[1] = class_st;
                stack_pointer[2] = self_st;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                attr_o = _PySuper_Lookup(cls, self, name,
                    Py_TYPE(self)->tp_getattro == PyObject_GenericGetAttr ? method_found_ptr : NULL);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            if (attr_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (method_found) {
                self_or_null = self_st;
            } else {
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(self_st);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                self_or_null = PyStackRef_NULL;
                stack_pointer += 1;
            }
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef tmp = global_super_st;
            global_super_st = self_or_null;
            stack_pointer[-2] = global_super_st;
            PyStackRef_CLOSE(tmp);
            tmp = class_st;
            class_st = PyStackRef_NULL;
            stack_pointer[-1] = class_st;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            attr = PyStackRef_FromPyObjectSteal(attr_o);
            _tos_cache1 = self_or_null;
            _tos_cache0 = attr;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef *self_or_null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            self_or_null = &stack_pointer[1];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
            if (oparg & 1) {
                stack_pointer[0] = owner;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                attr = _Py_LoadAttr_StackRefSteal(tstate, owner, name, self_or_null);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (PyStackRef_IsNull(attr)) {
                    stack_pointer[-1] = attr;
                    stack_pointer += (oparg&1);
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
            }
            else {
                stack_pointer[0] = owner;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                attr = _PyObject_GetAttrStackRef(PyStackRef_AsPyObjectBorrow(owner), name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer[-1] = attr;
                stack_pointer += (oparg&1);
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(owner);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (PyStackRef_IsNull(attr)) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                stack_pointer += -(oparg&1);
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[-1] = attr;
            stack_pointer += (oparg&1);
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_LOCKED_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(type_version != 0);
            PyTypeObject *tp = Py_TYPE(owner_o);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_LOCKED_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(type_version != 0);
            PyTypeObject *tp = Py_TYPE(owner_o);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_LOCKED_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(type_version != 0);
            PyTypeObject *tp = Py_TYPE(owner_o);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = owner;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_VERSION_LOCKED_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(type_version != 0);
            PyTypeObject *tp = Py_TYPE(owner_o);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = owner;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            PyObject *type = (PyObject *)CURRENT_OPERAND0_64();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            if (tp != (PyTypeObject *)type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            PyObject *type = (PyObject *)CURRENT_OPERAND0_64();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            if (tp != (PyTypeObject *)type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            PyObject *type = (PyObject *)CURRENT_OPERAND0_64();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            if (tp != (PyTypeObject *)type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            PyObject *type = (PyObject *)CURRENT_OPERAND0_64();
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            if (tp != (PyTypeObject *)type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_MANAGED_OBJECT_HAS_VALUES_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_MANAGED_OBJECT_HAS_VALUES_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_MANAGED_OBJECT_HAS_VALUES_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_MANAGED_OBJECT_HAS_VALUES_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_INSTANCE_VALUE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            owner = stack_pointer[-1];
            uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(value_ptr, attr_o, &attr);
            if (!increfed) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache1 = o;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_INSTANCE_VALUE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(value_ptr, attr_o, &attr);
            if (!increfed) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache1 = o;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_INSTANCE_VALUE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(value_ptr, attr_o, &attr);
            if (!increfed) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = owner;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache2 = o;
            _tos_cache1 = attr;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_MODULE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint32_t dict_version = (uint32_t)CURRENT_OPERAND0_32();
            uint16_t index = (uint16_t)CURRENT_OPERAND1_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            if (Py_TYPE(owner_o)->tp_getattro != PyModule_Type.tp_getattro) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner_o)->md_dict;
            assert(dict != NULL);
            PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != dict_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            assert(keys->dk_kind == DICT_KEYS_UNICODE);
            assert(index < FT_ATOMIC_LOAD_SSIZE_RELAXED(keys->dk_nentries));
            PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(keys) + index;
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_value);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(&ep->me_value, attr_o, &attr);
            if (!increfed) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache1 = o;
            _tos_cache0 = attr;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_WITH_HINT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            uint16_t hint = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_MANAGED_DICT);
            PyDictObject *dict = _PyObject_GetManagedDict(owner_o);
            if (dict == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictKeysObject *dk = FT_ATOMIC_LOAD_PTR(dict->ma_keys);
            assert(PyDict_CheckExact((PyObject *)dict));
            #ifdef Py_GIL_DISABLED
            if (!_Py_IsOwnedByCurrentThread((PyObject *)dict) && !_PyObject_GC_IS_SHARED(dict)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            PyObject *attr_o;
            if (hint >= (size_t)FT_ATOMIC_LOAD_SSIZE_RELAXED(dk->dk_nentries)) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
            if (dk->dk_kind != DICT_KEYS_UNICODE) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dk) + hint;
            if (FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_key) != name) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            attr_o = FT_ATOMIC_LOAD_PTR(ep->me_value);
            if (attr_o == NULL) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            STAT_INC(LOAD_ATTR, hit);
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(&ep->me_value, attr_o, &attr);
            if (!increfed) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            o = owner;
            _tos_cache1 = o;
            _tos_cache0 = attr;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_SLOT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            PyObject **addr = (PyObject **)((char *)owner_o + index);
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR(*addr);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(addr, attr_o, &attr);
            if (!increfed) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache1 = o;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_SLOT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint16_t index = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            PyObject **addr = (PyObject **)((char *)owner_o + index);
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR(*addr);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(addr, attr_o, &attr);
            if (!increfed) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache1 = o;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_SLOT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint16_t index = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            PyObject **addr = (PyObject **)((char *)owner_o + index);
            PyObject *attr_o = FT_ATOMIC_LOAD_PTR(*addr);
            if (attr_o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            int increfed = _Py_TryIncrefCompareStackRef(addr, attr_o, &attr);
            if (!increfed) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #else
            attr = PyStackRef_FromPyObjectNew(attr_o);
            #endif
            STAT_INC(LOAD_ATTR, hit);
            o = owner;
            _tos_cache2 = o;
            _tos_cache1 = attr;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_CLASS_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            if (!PyType_Check(owner_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_CLASS_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            if (!PyType_Check(owner_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_CLASS_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            if (!PyType_Check(owner_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_CLASS_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            if (!PyType_Check(owner_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            assert(type_version != 0);
            if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_CLASS_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            attr = PyStackRef_FromPyObjectNew(descr);
            stack_pointer[0] = owner;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef tmp = owner;
            owner = attr;
            stack_pointer[-1] = owner;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = attr;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_PROPERTY_FRAME_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef new_frame;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *fget = (PyObject *)CURRENT_OPERAND1_64();
            assert((oparg & 1) == 0);
            assert(Py_IS_TYPE(fget, &PyFunction_Type));
            PyFunctionObject *f = (PyFunctionObject *)fget;
            if (f->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)f->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(fget), 1, frame);
            pushed_frame->localsplus[0] = owner;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_PROPERTY_FRAME_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *fget = (PyObject *)CURRENT_OPERAND1_64();
            assert((oparg & 1) == 0);
            assert(Py_IS_TYPE(fget, &PyFunction_Type));
            PyFunctionObject *f = (PyFunctionObject *)fget;
            if (f->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)f->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(fget), 1, frame);
            pushed_frame->localsplus[0] = owner;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_PROPERTY_FRAME_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            owner = _stack_item_1;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *fget = (PyObject *)CURRENT_OPERAND1_64();
            assert((oparg & 1) == 0);
            assert(Py_IS_TYPE(fget, &PyFunction_Type));
            PyFunctionObject *f = (PyFunctionObject *)fget;
            if (f->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)f->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(fget), 1, frame);
            pushed_frame->localsplus[0] = owner;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache1 = new_frame;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_PROPERTY_FRAME_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            owner = _stack_item_2;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *fget = (PyObject *)CURRENT_OPERAND1_64();
            assert((oparg & 1) == 0);
            assert(Py_IS_TYPE(fget, &PyFunction_Type));
            PyFunctionObject *f = (PyFunctionObject *)fget;
            if (f->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)f->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(fget), 1, frame);
            pushed_frame->localsplus[0] = owner;
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache2 = new_frame;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_FRAME_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *getattribute = (PyObject *)CURRENT_OPERAND1_64();
            assert((oparg & 1) == 0);
            assert(Py_IS_TYPE(getattribute, &PyFunction_Type));
            PyFunctionObject *f = (PyFunctionObject *)getattribute;
            assert(func_version != 0);
            if (f->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)f->func_code;
            assert(code->co_argcount == 2);
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(
                tstate, PyStackRef_FromPyObjectNew(f), 2, frame);
            pushed_frame->localsplus[0] = owner;
            pushed_frame->localsplus[1] = PyStackRef_FromPyObjectNew(name);
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_NO_DICT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (_PyObject_GetManagedDict(owner_o) ||
                !FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_NO_DICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (_PyObject_GetManagedDict(owner_o) ||
                !FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = owner;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_NO_DICT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (_PyObject_GetManagedDict(owner_o) ||
                !FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = owner;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_NO_DICT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_dictoffset < 0);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (_PyObject_GetManagedDict(owner_o) ||
                !FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                UNLOCK_OBJECT(owner_o);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = owner;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_ATTR_INSTANCE_VALUE_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef value;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            value = _stack_item_0;
            uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            STAT_INC(STORE_ATTR, hit);
            assert(_PyObject_GetManagedDict(owner_o) == NULL);
            PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
            PyObject *old_value = *value_ptr;
            FT_ATOMIC_STORE_PTR_RELEASE(*value_ptr, PyStackRef_AsPyObjectSteal(value));
            if (old_value == NULL) {
                PyDictValues *values = _PyObject_InlineValues(owner_o);
                Py_ssize_t index = value_ptr - values->values;
                _PyDictValues_AddToInsertionOrder(values, index);
            }
            UNLOCK_OBJECT(owner_o);
            o = owner;
            stack_pointer[0] = o;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_XDECREF(old_value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = o;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOCK_OBJECT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            value = stack_pointer[-1];
            if (!LOCK_OBJECT(PyStackRef_AsPyObjectBorrow(value))) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOCK_OBJECT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            if (!LOCK_OBJECT(PyStackRef_AsPyObjectBorrow(value))) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOCK_OBJECT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            value = _stack_item_1;
            if (!LOCK_OBJECT(PyStackRef_AsPyObjectBorrow(value))) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = value;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOCK_OBJECT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            value = _stack_item_2;
            if (!LOCK_OBJECT(PyStackRef_AsPyObjectBorrow(value))) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = value;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_ATTR_WITH_HINT_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef value;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            owner = _stack_item_1;
            value = _stack_item_0;
            uint16_t hint = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_MANAGED_DICT);
            PyDictObject *dict = _PyObject_GetManagedDict(owner_o);
            if (dict == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (!LOCK_OBJECT(dict)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyDict_CheckExact((PyObject *)dict));
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            if (hint >= (size_t)dict->ma_keys->dk_nentries ||
                dict->ma_keys->dk_kind != DICT_KEYS_UNICODE) {
                UNLOCK_OBJECT(dict);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = owner;
                    _tos_cache0 = value;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dict->ma_keys) + hint;
            if (ep->me_key != name) {
                UNLOCK_OBJECT(dict);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = owner;
                    _tos_cache0 = value;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            PyObject *old_value = ep->me_value;
            if (old_value == NULL) {
                UNLOCK_OBJECT(dict);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = owner;
                    _tos_cache0 = value;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            stack_pointer[0] = value;
            stack_pointer[1] = owner;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyDict_NotifyEvent(PyDict_EVENT_MODIFIED, dict, name, PyStackRef_AsPyObjectBorrow(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            FT_ATOMIC_STORE_PTR_RELEASE(ep->me_value, PyStackRef_AsPyObjectSteal(value));
            UNLOCK_OBJECT(dict);
            STAT_INC(STORE_ATTR, hit);
            o = owner;
            stack_pointer[-2] = o;
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_XDECREF(old_value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = o;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _STORE_ATTR_SLOT_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef value;
            _PyStackRef o;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            value = _stack_item_0;
            uint16_t index = (uint16_t)CURRENT_OPERAND0_16();
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            if (!LOCK_OBJECT(owner_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = value;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            char *addr = (char *)owner_o + index;
            STAT_INC(STORE_ATTR, hit);
            PyObject *old_value = *(PyObject **)addr;
            FT_ATOMIC_STORE_PTR_RELEASE(*(PyObject **)addr, PyStackRef_AsPyObjectSteal(value));
            UNLOCK_OBJECT(owner_o);
            o = owner;
            stack_pointer[0] = o;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_XDECREF(old_value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = o;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COMPARE_OP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert((oparg >> 5) <= Py_GE);
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = PyObject_RichCompare(left_o, right_o, oparg >> 5);
            _PyStackRef tmp = right;
            right = PyStackRef_NULL;
            stack_pointer[-1] = right;
            PyStackRef_CLOSE(tmp);
            tmp = left;
            left = PyStackRef_NULL;
            stack_pointer[-2] = left;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (oparg & 16) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                int res_bool = PyObject_IsTrue(res_o);
                Py_DECREF(res_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (res_bool < 0) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                res = res_bool ? PyStackRef_True : PyStackRef_False;
            }
            else {
                res = PyStackRef_FromPyObjectSteal(res_o);
            }
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COMPARE_OP_FLOAT_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            STAT_INC(COMPARE_OP, hit);
            double dleft = PyFloat_AS_DOUBLE(left_o);
            double dright = PyFloat_AS_DOUBLE(right_o);
            int sign_ish = COMPARISON_BIT(dleft, dright);
            l = left;
            r = right;
            res = (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COMPARE_OP_FLOAT_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            right = _stack_item_0;
            left = stack_pointer[-1];
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            STAT_INC(COMPARE_OP, hit);
            double dleft = PyFloat_AS_DOUBLE(left_o);
            double dright = PyFloat_AS_DOUBLE(right_o);
            int sign_ish = COMPARISON_BIT(dleft, dright);
            l = left;
            r = right;
            res = (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COMPARE_OP_FLOAT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            STAT_INC(COMPARE_OP, hit);
            double dleft = PyFloat_AS_DOUBLE(left_o);
            double dright = PyFloat_AS_DOUBLE(right_o);
            int sign_ish = COMPARISON_BIT(dleft, dright);
            l = left;
            r = right;
            res = (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COMPARE_OP_INT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(_PyLong_IsCompact((PyLongObject *)left_o));
            assert(_PyLong_IsCompact((PyLongObject *)right_o));
            STAT_INC(COMPARE_OP, hit);
            assert(_PyLong_DigitCount((PyLongObject *)left_o) <= 1 &&
                   _PyLong_DigitCount((PyLongObject *)right_o) <= 1);
            Py_ssize_t ileft = _PyLong_CompactValue((PyLongObject *)left_o);
            Py_ssize_t iright = _PyLong_CompactValue((PyLongObject *)right_o);
            int sign_ish = COMPARISON_BIT(ileft, iright);
            l = left;
            r = right;
            res =  (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COMPARE_OP_STR_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            STAT_INC(COMPARE_OP, hit);
            int eq = _PyUnicode_Equal(left_o, right_o);
            assert((oparg >> 5) == Py_EQ || (oparg >> 5) == Py_NE);
            l = left;
            r = right;
            assert(eq == 0 || eq == 1);
            assert((oparg & 0xf) == COMPARISON_NOT_EQUALS || (oparg & 0xf) == COMPARISON_EQUALS);
            assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS);
            res = ((COMPARISON_NOT_EQUALS + eq) & oparg) ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _IS_OP_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef l;
            _PyStackRef r;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            int res = Py_Is(PyStackRef_AsPyObjectBorrow(left), PyStackRef_AsPyObjectBorrow(right)) ^ oparg;
            b = res ? PyStackRef_True : PyStackRef_False;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = b;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _IS_OP_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            right = _stack_item_0;
            left = stack_pointer[-1];
            int res = Py_Is(PyStackRef_AsPyObjectBorrow(left), PyStackRef_AsPyObjectBorrow(right)) ^ oparg;
            b = res ? PyStackRef_True : PyStackRef_False;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = b;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _IS_OP_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            int res = Py_Is(PyStackRef_AsPyObjectBorrow(left), PyStackRef_AsPyObjectBorrow(right)) ^ oparg;
            b = res ? PyStackRef_True : PyStackRef_False;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = b;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CONTAINS_OP_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = PySequence_Contains(right_o, left_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            b = (res ^ oparg) ? PyStackRef_True : PyStackRef_False;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = b;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_SET_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_SET_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_SET_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_ANY_SET_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyAnySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SET_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SET_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SET_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_SET_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PySet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENSET_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            tos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenSet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENSET_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            tos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenSet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = tos;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = tos;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENSET_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            tos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenSet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = tos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = tos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TOS_FROZENSET_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef tos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            tos = _stack_item_2;
            PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
            if (!PyFrozenSet_CheckExact(o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = tos;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = tos;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CONTAINS_OP_SET_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyAnySet_CheckExact(right_o));
            STAT_INC(CONTAINS_OP, hit);
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = _PySet_Contains((PySetObject *)right_o, left_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            b = (res ^ oparg) ? PyStackRef_True : PyStackRef_False;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = b;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CONTAINS_OP_DICT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyAnyDict_CheckExact(right_o));
            STAT_INC(CONTAINS_OP, hit);
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = PyDict_Contains(right_o, left_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            b = (res ^ oparg) ? PyStackRef_True : PyStackRef_False;
            l = left;
            r = right;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = b;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_EG_MATCH_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef match_type_st;
            _PyStackRef exc_value_st;
            _PyStackRef rest;
            _PyStackRef match;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            match_type_st = _stack_item_1;
            exc_value_st = _stack_item_0;
            PyObject *exc_value = PyStackRef_AsPyObjectBorrow(exc_value_st);
            PyObject *match_type = PyStackRef_AsPyObjectBorrow(match_type_st);
            stack_pointer[0] = exc_value_st;
            stack_pointer[1] = match_type_st;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyEval_CheckExceptStarTypeValid(tstate, match_type);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyStackRef tmp = match_type_st;
                match_type_st = PyStackRef_NULL;
                stack_pointer[-1] = match_type_st;
                PyStackRef_CLOSE(tmp);
                tmp = exc_value_st;
                exc_value_st = PyStackRef_NULL;
                stack_pointer[-2] = exc_value_st;
                PyStackRef_CLOSE(tmp);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            PyObject *match_o = NULL;
            PyObject *rest_o = NULL;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = _PyEval_ExceptionGroupMatch(frame, exc_value, match_type,
                &match_o, &rest_o);
            _PyStackRef tmp = match_type_st;
            match_type_st = PyStackRef_NULL;
            stack_pointer[-1] = match_type_st;
            PyStackRef_CLOSE(tmp);
            tmp = exc_value_st;
            exc_value_st = PyStackRef_NULL;
            stack_pointer[-2] = exc_value_st;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (res < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            assert((match_o == NULL) == (rest_o == NULL));
            if (match_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            if (!Py_IsNone(match_o)) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyErr_SetHandledException(match_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            rest = PyStackRef_FromPyObjectSteal(rest_o);
            match = PyStackRef_FromPyObjectSteal(match_o);
            _tos_cache1 = match;
            _tos_cache0 = rest;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_EXC_MATCH_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef right;
            _PyStackRef left;
            _PyStackRef b;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            right = _stack_item_1;
            left = _stack_item_0;
            PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
            PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
            assert(PyExceptionInstance_Check(left_o));
            stack_pointer[0] = left;
            stack_pointer[1] = right;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyEval_CheckExceptTypeValid(tstate, right_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int res = PyErr_GivenExceptionMatches(left_o, right_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(right);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            b = res ? PyStackRef_True : PyStackRef_False;
            _tos_cache1 = b;
            _tos_cache0 = left;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _IMPORT_NAME_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef fromlist;
            _PyStackRef level;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            fromlist = _stack_item_1;
            level = _stack_item_0;
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
            PyObject *res_o;
            if (!(oparg & 0x02)) {
                stack_pointer[0] = level;
                stack_pointer[1] = fromlist;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyEval_LazyImportName(tstate, BUILTINS(), GLOBALS(),
                    LOCALS(), name,
                    PyStackRef_AsPyObjectBorrow(fromlist),
                    PyStackRef_AsPyObjectBorrow(level),
                    oparg & 0x01);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else {
                stack_pointer[0] = level;
                stack_pointer[1] = fromlist;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyEval_ImportName(tstate, BUILTINS(), GLOBALS(),
                    LOCALS(), name,
                    PyStackRef_AsPyObjectBorrow(fromlist),
                    PyStackRef_AsPyObjectBorrow(level));
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef tmp = fromlist;
            fromlist = PyStackRef_NULL;
            stack_pointer[-1] = fromlist;
            PyStackRef_CLOSE(tmp);
            tmp = level;
            level = PyStackRef_NULL;
            stack_pointer[-2] = level;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _IMPORT_FROM_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef from;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            from = _stack_item_0;
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            PyObject *res_o;
            if (PyLazyImport_CheckExact(PyStackRef_AsPyObjectBorrow(from))) {
                stack_pointer[0] = from;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyEval_LazyImportFrom(
                    tstate, frame, PyStackRef_AsPyObjectBorrow(from), name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            else {
                stack_pointer[0] = from;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = _PyEval_ImportFrom(
                    tstate, PyStackRef_AsPyObjectBorrow(from), name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            if (res_o == NULL) {
                stack_pointer[-1] = from;
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache1 = res;
            _tos_cache0 = from;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _POP_JUMP_IF_FALSE is not a viable micro-op for tier 2 because it is replaced */

        /* _POP_JUMP_IF_TRUE is not a viable micro-op for tier 2 because it is replaced */

        case _IS_NONE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef b;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            if (PyStackRef_IsNone(value)) {
                b = PyStackRef_True;
            }
            else {
                b = PyStackRef_False;
                stack_pointer[0] = value;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyStackRef tmp = value;
                value = b;
                stack_pointer[-1] = value;
                PyStackRef_CLOSE(tmp);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
            }
            _tos_cache0 = b;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _JUMP_BACKWARD_NO_INTERRUPT is not a viable micro-op for tier 2 because it is replaced */

        case _GET_LEN_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef obj;
            _PyStackRef len;
            _PyStackRef _stack_item_0 = _tos_cache0;
            obj = _stack_item_0;
            stack_pointer[0] = obj;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_ssize_t len_i = PyObject_Length(PyStackRef_AsPyObjectBorrow(obj));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (len_i < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            PyObject *len_o = PyLong_FromSsize_t(len_i);
            if (len_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            len = PyStackRef_FromPyObjectSteal(len_o);
            _tos_cache1 = len;
            _tos_cache0 = obj;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_CLASS_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef names;
            _PyStackRef type;
            _PyStackRef subject;
            _PyStackRef attrs;
            _PyStackRef s;
            _PyStackRef tp;
            _PyStackRef n;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            names = _stack_item_2;
            type = _stack_item_1;
            subject = _stack_item_0;
            assert(PyTuple_CheckExact(PyStackRef_AsPyObjectBorrow(names)));
            stack_pointer[0] = subject;
            stack_pointer[1] = type;
            stack_pointer[2] = names;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *attrs_o = _PyEval_MatchClass(tstate,
                PyStackRef_AsPyObjectBorrow(subject),
                PyStackRef_AsPyObjectBorrow(type), oparg,
                PyStackRef_AsPyObjectBorrow(names));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (attrs_o) {
                assert(PyTuple_CheckExact(attrs_o));
                attrs = PyStackRef_FromPyObjectSteal(attrs_o);
            }
            else {
                if (_PyErr_Occurred(tstate)) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                attrs = PyStackRef_None;
            }
            s = subject;
            tp = type;
            n = names;
            _tos_cache2 = n;
            _tos_cache1 = tp;
            _tos_cache0 = s;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer[-3] = attrs;
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_MAPPING_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef subject;
            _PyStackRef res;
            subject = stack_pointer[-1];
            int match = PyStackRef_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
            res = match ? PyStackRef_True : PyStackRef_False;
            _tos_cache1 = res;
            _tos_cache0 = subject;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_MAPPING_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef subject;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            subject = _stack_item_0;
            int match = PyStackRef_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
            res = match ? PyStackRef_True : PyStackRef_False;
            _tos_cache1 = res;
            _tos_cache0 = subject;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_MAPPING_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef subject;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            subject = _stack_item_1;
            int match = PyStackRef_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
            res = match ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = res;
            _tos_cache1 = subject;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_SEQUENCE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef subject;
            _PyStackRef res;
            subject = stack_pointer[-1];
            int match = PyStackRef_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
            res = match ? PyStackRef_True : PyStackRef_False;
            _tos_cache1 = res;
            _tos_cache0 = subject;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_SEQUENCE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef subject;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            subject = _stack_item_0;
            int match = PyStackRef_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
            res = match ? PyStackRef_True : PyStackRef_False;
            _tos_cache1 = res;
            _tos_cache0 = subject;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_SEQUENCE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef subject;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            subject = _stack_item_1;
            int match = PyStackRef_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
            res = match ? PyStackRef_True : PyStackRef_False;
            _tos_cache2 = res;
            _tos_cache1 = subject;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MATCH_KEYS_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef keys;
            _PyStackRef subject;
            _PyStackRef values_or_none;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            keys = _stack_item_1;
            subject = _stack_item_0;
            stack_pointer[0] = subject;
            stack_pointer[1] = keys;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *values_or_none_o = _PyEval_MatchKeys(tstate,
                PyStackRef_AsPyObjectBorrow(subject), PyStackRef_AsPyObjectBorrow(keys));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (values_or_none_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            values_or_none = PyStackRef_FromPyObjectSteal(values_or_none_o);
            _tos_cache2 = values_or_none;
            _tos_cache1 = keys;
            _tos_cache0 = subject;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GET_ITER_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef iter;
            _PyStackRef index_or_null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            iterable = _stack_item_0;
            stack_pointer[0] = iterable;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef result = _PyEval_GetIter(iterable, &index_or_null, oparg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (PyStackRef_IsError(result)) {
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            iter = result;
            _tos_cache1 = index_or_null;
            _tos_cache0 = iter;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITERATOR_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            iterable = stack_pointer[-1];
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->tp_iter != PyObject_SelfIter) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache0 = iterable;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITERATOR_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iterable = _stack_item_0;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->tp_iter != PyObject_SelfIter) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = iterable;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache0 = iterable;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITERATOR_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iterable = _stack_item_1;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->tp_iter != PyObject_SelfIter) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = iterable;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache1 = iterable;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITERATOR_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            iterable = _stack_item_2;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->tp_iter != PyObject_SelfIter) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = iterable;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache2 = iterable;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITER_VIRTUAL_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            iterable = stack_pointer[-1];
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache0 = iterable;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITER_VIRTUAL_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iterable = _stack_item_0;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = iterable;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache0 = iterable;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITER_VIRTUAL_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iterable = _stack_item_1;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = iterable;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache1 = iterable;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_ITER_VIRTUAL_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            iterable = _stack_item_2;
            PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable));
            if (tp->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = iterable;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(GET_ITER, hit);
            _tos_cache2 = iterable;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_TAGGED_ZERO_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef zero;
            zero = PyStackRef_TagInt(0);
            _tos_cache0 = zero;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_TAGGED_ZERO_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef zero;
            _PyStackRef _stack_item_0 = _tos_cache0;
            zero = PyStackRef_TagInt(0);
            _tos_cache1 = zero;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_TAGGED_ZERO_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef zero;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            zero = PyStackRef_TagInt(0);
            _tos_cache2 = zero;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GET_ITER_TRAD_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iterable;
            _PyStackRef iter;
            _PyStackRef index_or_null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iterable = _stack_item_0;
            stack_pointer[0] = iterable;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *iter_o = PyObject_GetIter(PyStackRef_AsPyObjectBorrow(iterable));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(iterable);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (iter_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            iter = PyStackRef_FromPyObjectSteal(iter_o);
            index_or_null = PyStackRef_NULL;
            _tos_cache1 = index_or_null;
            _tos_cache0 = iter;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _FOR_ITER is not a viable micro-op for tier 2 because it is replaced */

        case _FOR_ITER_TIER_TWO_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            stack_pointer[0] = iter;
            stack_pointer[1] = null_or_index;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef item = _PyForIter_VirtualIteratorNext(tstate, frame, iter, &null_or_index);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (!PyStackRef_IsValid(item)) {
                if (PyStackRef_IsError(item)) {
                    stack_pointer[-1] = null_or_index;
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = null_or_index;
                    _tos_cache0 = iter;
                    SET_CURRENT_CACHED_VALUES(2);
                    stack_pointer += -2;
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            next = item;
            _tos_cache2 = next;
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_ITER_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            iter = stack_pointer[-2];
            PyObject *expected_type = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != (PyTypeObject *)expected_type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_ITER_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iter = stack_pointer[-1];
            PyObject *expected_type = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != (PyTypeObject *)expected_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_ITER_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iter = _stack_item_0;
            PyObject *expected_type = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != (PyTypeObject *)expected_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_TYPE_ITER_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            iter = _stack_item_1;
            PyObject *expected_type = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != (PyTypeObject *)expected_type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_INLINE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iter = _stack_item_0;
            PyObject *iternext_fn = (PyObject *)CURRENT_OPERAND0_64();
            assert(sizeof(iternextfunc) == sizeof(uintptr_t));
            volatile iternextfunc iternext_v = (iternextfunc)iternext_fn;
            stack_pointer[0] = iter;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *item = iternext_v(PyStackRef_AsPyObjectBorrow(iter));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (item == NULL) {
                if (_PyErr_Occurred(tstate)) {
                    if (_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
                        _PyFrame_SetStackPointer(frame, stack_pointer);
                        _PyEval_MonitorRaise(tstate, frame, frame->instr_ptr);
                        _PyErr_Clear(tstate);
                        stack_pointer = _PyFrame_GetStackPointer(frame);
                    }
                    else {
                        SET_CURRENT_CACHED_VALUES(0);
                        JUMP_TO_ERROR();
                    }
                }
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = iter;
                    SET_CURRENT_CACHED_VALUES(2);
                    stack_pointer += -2;
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            STAT_INC(FOR_ITER, hit);
            next = PyStackRef_FromPyObjectSteal(item);
            _tos_cache2 = next;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_ITER_VIRTUAL_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            iter = stack_pointer[-2];
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o)->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_ITER_VIRTUAL_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iter = stack_pointer[-1];
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o)->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_ITER_VIRTUAL_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iter = _stack_item_0;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o)->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_ITER_VIRTUAL_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            iter = _stack_item_1;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o)->_tp_iteritem == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _FOR_ITER_VIRTUAL is not a viable micro-op for tier 2 because it is replaced */

        case _FOR_ITER_VIRTUAL_TIER_TWO_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            Py_ssize_t index = PyStackRef_UntagInt(null_or_index);
            stack_pointer[0] = iter;
            stack_pointer[1] = null_or_index;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyObjectIndexPair next_index = Py_TYPE(iter_o)->_tp_iteritem(iter_o, index);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            PyObject *next_o = next_index.object;
            index = next_index.index;
            if (next_o == NULL) {
                if (index < 0) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = null_or_index;
                    _tos_cache0 = iter;
                    SET_CURRENT_CACHED_VALUES(2);
                    stack_pointer += -2;
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            next = PyStackRef_FromPyObjectSteal(next_o);
            null_or_index = PyStackRef_TagInt(index);
            _tos_cache2 = next;
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _INSTRUMENTED_FOR_ITER is not a viable micro-op for tier 2 because it is instrumented */

        case _ITER_CHECK_LIST_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            null_or_index = stack_pointer[-1];
            iter = stack_pointer[-2];
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyList_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            #ifdef Py_GIL_DISABLED
            if (!_Py_IsOwnedByCurrentThread(iter_o) && !_PyObject_GC_IS_SHARED(iter_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_LIST_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null_or_index = _stack_item_0;
            iter = stack_pointer[-1];
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyList_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = null_or_index;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            #ifdef Py_GIL_DISABLED
            if (!_Py_IsOwnedByCurrentThread(iter_o) && !_PyObject_GC_IS_SHARED(iter_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = null_or_index;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_LIST_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyList_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = null_or_index;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            #ifdef Py_GIL_DISABLED
            if (!_Py_IsOwnedByCurrentThread(iter_o) && !_PyObject_GC_IS_SHARED(iter_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = null_or_index;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_LIST_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            null_or_index = _stack_item_2;
            iter = _stack_item_1;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyList_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = null_or_index;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            #ifdef Py_GIL_DISABLED
            if (!_Py_IsOwnedByCurrentThread(iter_o) && !_PyObject_GC_IS_SHARED(iter_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = null_or_index;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache2 = null_or_index;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _ITER_JUMP_LIST is not a viable micro-op for tier 2 because it is replaced */

        case _GUARD_NOT_EXHAUSTED_LIST_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            null_or_index = stack_pointer[-1];
            iter = stack_pointer[-2];
            #ifndef Py_GIL_DISABLED
            PyObject *list_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(list_o) == &PyList_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyList_GET_SIZE(list_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_LIST_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null_or_index = _stack_item_0;
            iter = stack_pointer[-1];
            #ifndef Py_GIL_DISABLED
            PyObject *list_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(list_o) == &PyList_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyList_GET_SIZE(list_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = null_or_index;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_LIST_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            #ifndef Py_GIL_DISABLED
            PyObject *list_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(list_o) == &PyList_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyList_GET_SIZE(list_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = null_or_index;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_LIST_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            null_or_index = _stack_item_2;
            iter = _stack_item_1;
            #ifndef Py_GIL_DISABLED
            PyObject *list_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(list_o) == &PyList_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyList_GET_SIZE(list_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = null_or_index;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache2 = null_or_index;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _ITER_NEXT_LIST is not a viable micro-op for tier 2 because it is replaced */

        case _ITER_NEXT_LIST_TIER_TWO_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            PyObject *list_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(PyList_CheckExact(list_o));
            #ifdef Py_GIL_DISABLED
            assert(_Py_IsOwnedByCurrentThread((PyObject *)list_o) ||
                  _PyObject_GC_IS_SHARED(list_o));
            STAT_INC(FOR_ITER, hit);
            stack_pointer[0] = iter;
            stack_pointer[1] = null_or_index;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int result = _PyList_GetItemRefNoLock((PyListObject *)list_o, PyStackRef_UntagInt(null_or_index), &next);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (result <= 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = null_or_index;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                stack_pointer += -2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            #else
            assert(PyStackRef_UntagInt(null_or_index) < PyList_GET_SIZE(list_o));
            next = PyStackRef_FromPyObjectNew(PyList_GET_ITEM(list_o, PyStackRef_UntagInt(null_or_index)));
            stack_pointer += 2;
            #endif
            null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
            _tos_cache2 = next;
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_TUPLE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            null_or_index = stack_pointer[-1];
            iter = stack_pointer[-2];
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_TUPLE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null_or_index = _stack_item_0;
            iter = stack_pointer[-1];
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = null_or_index;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_TUPLE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = null_or_index;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_TUPLE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            null_or_index = _stack_item_2;
            iter = _stack_item_1;
            PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(iter_o) != &PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = null_or_index;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyStackRef_IsTaggedInt(null_or_index));
            _tos_cache2 = null_or_index;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _ITER_JUMP_TUPLE is not a viable micro-op for tier 2 because it is replaced */

        case _GUARD_NOT_EXHAUSTED_TUPLE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            null_or_index = stack_pointer[-1];
            iter = stack_pointer[-2];
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyTuple_GET_SIZE(tuple_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_TUPLE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null_or_index = _stack_item_0;
            iter = stack_pointer[-1];
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyTuple_GET_SIZE(tuple_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = null_or_index;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_TUPLE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyTuple_GET_SIZE(tuple_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = null_or_index;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_TUPLE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            null_or_index = _stack_item_2;
            iter = _stack_item_1;
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            if ((size_t)PyStackRef_UntagInt(null_or_index) >= (size_t)PyTuple_GET_SIZE(tuple_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = null_or_index;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = null_or_index;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_TUPLE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef next;
            null_or_index = stack_pointer[-1];
            iter = stack_pointer[-2];
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            uintptr_t i = PyStackRef_UntagInt(null_or_index);
            assert((size_t)i < (size_t)PyTuple_GET_SIZE(tuple_o));
            next = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(tuple_o, i));
            null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
            _tos_cache2 = next;
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_TUPLE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null_or_index = _stack_item_0;
            iter = stack_pointer[-1];
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            uintptr_t i = PyStackRef_UntagInt(null_or_index);
            assert((size_t)i < (size_t)PyTuple_GET_SIZE(tuple_o));
            next = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(tuple_o, i));
            null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
            _tos_cache2 = next;
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_TUPLE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null_or_index;
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null_or_index = _stack_item_1;
            iter = _stack_item_0;
            PyObject *tuple_o = PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(tuple_o) == &PyTuple_Type);
            uintptr_t i = PyStackRef_UntagInt(null_or_index);
            assert((size_t)i < (size_t)PyTuple_GET_SIZE(tuple_o));
            next = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(tuple_o, i));
            null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
            _tos_cache2 = next;
            _tos_cache1 = null_or_index;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_RANGE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            iter = stack_pointer[-2];
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(r) != &PyRangeIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (!_PyObject_IsUniquelyReferenced((PyObject *)r)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_RANGE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iter = stack_pointer[-1];
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(r) != &PyRangeIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (!_PyObject_IsUniquelyReferenced((PyObject *)r)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_RANGE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iter = _stack_item_0;
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(r) != &PyRangeIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (!_PyObject_IsUniquelyReferenced((PyObject *)r)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_CHECK_RANGE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            iter = _stack_item_1;
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(r) != &PyRangeIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            #ifdef Py_GIL_DISABLED
            if (!_PyObject_IsUniquelyReferenced((PyObject *)r)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            #endif
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _ITER_JUMP_RANGE is not a viable micro-op for tier 2 because it is replaced */

        case _GUARD_NOT_EXHAUSTED_RANGE_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            iter = stack_pointer[-2];
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            if (r->len <= 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_RANGE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iter = stack_pointer[-1];
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            if (r->len <= 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_RANGE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iter = _stack_item_0;
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            if (r->len <= 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOT_EXHAUSTED_RANGE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            iter = _stack_item_1;
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            if (r->len <= 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = iter;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = iter;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_RANGE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef next;
            iter = stack_pointer[-2];
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            #ifdef Py_GIL_DISABLED
            assert(_PyObject_IsUniquelyReferenced((PyObject *)r));
            #endif
            assert(r->len > 0);
            long value = r->start;
            r->start = value + r->step;
            r->len--;
            PyObject *res = PyLong_FromLong(value);
            if (res == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            next = PyStackRef_FromPyObjectSteal(res);
            _tos_cache2 = next;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_RANGE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            iter = stack_pointer[-1];
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            #ifdef Py_GIL_DISABLED
            assert(_PyObject_IsUniquelyReferenced((PyObject *)r));
            #endif
            assert(r->len > 0);
            long value = r->start;
            r->start = value + r->step;
            r->len--;
            PyObject *res = PyLong_FromLong(value);
            if (res == NULL) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            next = PyStackRef_FromPyObjectSteal(res);
            _tos_cache2 = next;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ITER_NEXT_RANGE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef next;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            iter = _stack_item_0;
            _PyRangeIterObject *r = (_PyRangeIterObject *)PyStackRef_AsPyObjectBorrow(iter);
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            #ifdef Py_GIL_DISABLED
            assert(_PyObject_IsUniquelyReferenced((PyObject *)r));
            #endif
            assert(r->len > 0);
            long value = r->start;
            r->start = value + r->step;
            r->len--;
            PyObject *res = PyLong_FromLong(value);
            if (res == NULL) {
                stack_pointer[0] = iter;
                stack_pointer[1] = _stack_item_1;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            next = PyStackRef_FromPyObjectSteal(res);
            _tos_cache2 = next;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FOR_ITER_GEN_FRAME_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef gen_frame;
            oparg = CURRENT_OPARG();
            iter = stack_pointer[-2];
            PyGenObject *gen = (PyGenObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(gen) != &PyGen_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (!gen_try_set_executing((PyGenObject *)gen)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(FOR_ITER, hit);
            _PyInterpreterFrame *pushed_frame = &gen->gi_iframe;
            _PyFrame_StackPush(pushed_frame, PyStackRef_None);
            gen->gi_exc_state.previous_item = tstate->exc_info;
            tstate->exc_info = &gen->gi_exc_state;
            pushed_frame->previous = frame;
            frame->return_offset = (uint16_t)( 2u + oparg);
            gen_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache2 = gen_frame;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FOR_ITER_GEN_FRAME_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef gen_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            iter = stack_pointer[-1];
            PyGenObject *gen = (PyGenObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(gen) != &PyGen_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (!gen_try_set_executing((PyGenObject *)gen)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(FOR_ITER, hit);
            _PyInterpreterFrame *pushed_frame = &gen->gi_iframe;
            _PyFrame_StackPush(pushed_frame, PyStackRef_None);
            gen->gi_exc_state.previous_item = tstate->exc_info;
            tstate->exc_info = &gen->gi_exc_state;
            pushed_frame->previous = frame;
            frame->return_offset = (uint16_t)( 2u + oparg);
            gen_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache2 = gen_frame;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FOR_ITER_GEN_FRAME_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef iter;
            _PyStackRef gen_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            iter = _stack_item_0;
            PyGenObject *gen = (PyGenObject *)PyStackRef_AsPyObjectBorrow(iter);
            if (Py_TYPE(gen) != &PyGen_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (!gen_try_set_executing((PyGenObject *)gen)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = iter;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(FOR_ITER, hit);
            _PyInterpreterFrame *pushed_frame = &gen->gi_iframe;
            _PyFrame_StackPush(pushed_frame, PyStackRef_None);
            gen->gi_exc_state.previous_item = tstate->exc_info;
            tstate->exc_info = &gen->gi_exc_state;
            pushed_frame->previous = frame;
            frame->return_offset = (uint16_t)( 2u + oparg);
            gen_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache2 = gen_frame;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = iter;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INSERT_NULL_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self;
            _PyStackRef *method_and_self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            self = _stack_item_0;
            method_and_self = &stack_pointer[0];
            method_and_self[1] = self;
            method_and_self[0] = PyStackRef_NULL;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_SPECIAL_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *method_and_self;
            oparg = CURRENT_OPARG();
            method_and_self = &stack_pointer[-2];
            PyObject *name = _Py_SpecialMethods[oparg].name;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _PyObject_LookupSpecialMethod(name, method_and_self);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (err <= 0) {
                if (err == 0) {
                    PyObject *owner = PyStackRef_AsPyObjectBorrow(method_and_self[1]);
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    const char *errfmt = _PyEval_SpecialMethodCanSuggest(owner, oparg)
                    ? _Py_SpecialMethods[oparg].error_suggestion
                : _Py_SpecialMethods[oparg].error;
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                    assert(!_PyErr_Occurred(tstate));
                    assert(errfmt != NULL);
                    _PyFrame_SetStackPointer(frame, stack_pointer);
                    _PyErr_Format(tstate, PyExc_TypeError, errfmt, owner);
                    stack_pointer = _PyFrame_GetStackPointer(frame);
                }
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _WITH_EXCEPT_START_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef val;
            _PyStackRef lasti;
            _PyStackRef exit_self;
            _PyStackRef exit_func;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            val = _stack_item_2;
            lasti = _stack_item_0;
            exit_self = stack_pointer[-1];
            exit_func = stack_pointer[-2];
            PyObject *exc, *tb;
            PyObject *val_o = PyStackRef_AsPyObjectBorrow(val);
            PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func);
            assert(val_o && PyExceptionInstance_Check(val_o));
            exc = PyExceptionInstance_Class(val_o);
            PyObject *original_tb = tb = PyException_GetTraceback(val_o);
            if (tb == NULL) {
                tb = Py_None;
            }
            assert(PyStackRef_IsTaggedInt(lasti));
            (void)lasti;
            PyObject* res_o;
            {
                PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
                int has_self = !PyStackRef_IsNull(exit_self);
                stack_pointer[0] = lasti;
                stack_pointer[1] = _stack_item_1;
                stack_pointer[2] = val;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
                    (3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_XDECREF(original_tb);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = res;
            _tos_cache1 = val;
            _tos_cache0 = _stack_item_1;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_EXC_INFO_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef exc;
            _PyStackRef prev_exc;
            _PyStackRef new_exc;
            exc = stack_pointer[-1];
            _PyErr_StackItem *exc_info = tstate->exc_info;
            if (exc_info->exc_value != NULL) {
                prev_exc = PyStackRef_FromPyObjectSteal(exc_info->exc_value);
            }
            else {
                prev_exc = PyStackRef_None;
            }
            assert(PyStackRef_ExceptionInstanceCheck(exc));
            exc_info->exc_value = PyStackRef_AsPyObjectNew(exc);
            new_exc = exc;
            _tos_cache1 = new_exc;
            _tos_cache0 = prev_exc;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_EXC_INFO_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef exc;
            _PyStackRef prev_exc;
            _PyStackRef new_exc;
            _PyStackRef _stack_item_0 = _tos_cache0;
            exc = _stack_item_0;
            _PyErr_StackItem *exc_info = tstate->exc_info;
            if (exc_info->exc_value != NULL) {
                prev_exc = PyStackRef_FromPyObjectSteal(exc_info->exc_value);
            }
            else {
                prev_exc = PyStackRef_None;
            }
            assert(PyStackRef_ExceptionInstanceCheck(exc));
            exc_info->exc_value = PyStackRef_AsPyObjectNew(exc);
            new_exc = exc;
            _tos_cache1 = new_exc;
            _tos_cache0 = prev_exc;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_EXC_INFO_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef exc;
            _PyStackRef prev_exc;
            _PyStackRef new_exc;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            exc = _stack_item_1;
            _PyErr_StackItem *exc_info = tstate->exc_info;
            if (exc_info->exc_value != NULL) {
                prev_exc = PyStackRef_FromPyObjectSteal(exc_info->exc_value);
            }
            else {
                prev_exc = PyStackRef_None;
            }
            assert(PyStackRef_ExceptionInstanceCheck(exc));
            exc_info->exc_value = PyStackRef_AsPyObjectNew(exc);
            new_exc = exc;
            _tos_cache2 = new_exc;
            _tos_cache1 = prev_exc;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            PyDictValues *ivs = _PyObject_InlineValues(owner_o);
            if (!FT_ATOMIC_LOAD_UINT8(ivs->valid)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            PyDictValues *ivs = _PyObject_InlineValues(owner_o);
            if (!FT_ATOMIC_LOAD_UINT8(ivs->valid)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            PyDictValues *ivs = _PyObject_InlineValues(owner_o);
            if (!FT_ATOMIC_LOAD_UINT8(ivs->valid)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
            assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            PyDictValues *ivs = _PyObject_InlineValues(owner_o);
            if (!FT_ATOMIC_LOAD_UINT8(ivs->valid)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_KEYS_VERSION_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            uint32_t keys_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *owner_cls = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            PyHeapTypeObject *owner_heap_type = (PyHeapTypeObject *)owner_cls;
            PyDictKeysObject *keys = owner_heap_type->ht_cached_keys;
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_KEYS_VERSION_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint32_t keys_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *owner_cls = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            PyHeapTypeObject *owner_heap_type = (PyHeapTypeObject *)owner_cls;
            PyDictKeysObject *keys = owner_heap_type->ht_cached_keys;
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_KEYS_VERSION_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint32_t keys_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *owner_cls = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            PyHeapTypeObject *owner_heap_type = (PyHeapTypeObject *)owner_cls;
            PyDictKeysObject *keys = owner_heap_type->ht_cached_keys;
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_KEYS_VERSION_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            uint32_t keys_version = (uint32_t)CURRENT_OPERAND0_32();
            PyTypeObject *owner_cls = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
            PyHeapTypeObject *owner_heap_type = (PyHeapTypeObject *)owner_cls;
            PyDictKeysObject *keys = owner_heap_type->ht_cached_keys;
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_WITH_VALUES_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache1 = self;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_WITH_VALUES_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache1 = self;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_WITH_VALUES_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            owner = _stack_item_1;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache2 = self;
            _tos_cache1 = attr;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_NO_DICT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache1 = self;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_NO_DICT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache1 = self;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_NO_DICT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            owner = _stack_item_1;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache2 = self;
            _tos_cache1 = attr;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert((oparg & 1) == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(owner);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            attr = PyStackRef_FromPyObjectNew(descr);
            _tos_cache0 = attr;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert((oparg & 1) == 0);
            assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(owner);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            attr = PyStackRef_FromPyObjectNew(descr);
            _tos_cache0 = attr;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_METHOD_LAZY_DICT_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            owner = stack_pointer[-1];
            uint16_t dictoffset = (uint16_t)CURRENT_OPERAND0_16();
            char *ptr = ((char *)PyStackRef_AsPyObjectBorrow(owner)) + MANAGED_DICT_OFFSET + dictoffset;
            PyObject *dict = FT_ATOMIC_LOAD_PTR_ACQUIRE(*(PyObject **)ptr);
            if (dict != NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_METHOD_LAZY_DICT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            owner = _stack_item_0;
            uint16_t dictoffset = (uint16_t)CURRENT_OPERAND0_16();
            char *ptr = ((char *)PyStackRef_AsPyObjectBorrow(owner)) + MANAGED_DICT_OFFSET + dictoffset;
            PyObject *dict = FT_ATOMIC_LOAD_PTR_ACQUIRE(*(PyObject **)ptr);
            if (dict != NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = owner;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = owner;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_METHOD_LAZY_DICT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            owner = _stack_item_1;
            uint16_t dictoffset = (uint16_t)CURRENT_OPERAND0_16();
            char *ptr = ((char *)PyStackRef_AsPyObjectBorrow(owner)) + MANAGED_DICT_OFFSET + dictoffset;
            PyObject *dict = FT_ATOMIC_LOAD_PTR_ACQUIRE(*(PyObject **)ptr);
            if (dict != NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = owner;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = owner;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_ATTR_METHOD_LAZY_DICT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            owner = _stack_item_2;
            uint16_t dictoffset = (uint16_t)CURRENT_OPERAND0_16();
            char *ptr = ((char *)PyStackRef_AsPyObjectBorrow(owner)) + MANAGED_DICT_OFFSET + dictoffset;
            PyObject *dict = FT_ATOMIC_LOAD_PTR_ACQUIRE(*(PyObject **)ptr);
            if (dict != NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = owner;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = owner;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_LAZY_DICT_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache1 = self;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_LAZY_DICT_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            owner = _stack_item_0;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache1 = self;
            _tos_cache0 = attr;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_ATTR_METHOD_LAZY_DICT_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef owner;
            _PyStackRef attr;
            _PyStackRef self;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            owner = _stack_item_1;
            PyObject *descr = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = PyStackRef_FromPyObjectNew(descr);
            self = owner;
            _tos_cache2 = self;
            _tos_cache1 = attr;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAYBE_EXPAND_METHOD_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            if (PyStackRef_TYPE(callable) == &PyMethod_Type && PyStackRef_IsNull(self_or_null)) {
                PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
                PyObject *self = ((PyMethodObject *)callable_o)->im_self;
                self_or_null = PyStackRef_FromPyObjectNew(self);
                PyObject *method = ((PyMethodObject *)callable_o)->im_func;
                _PyStackRef temp = callable;
                callable = PyStackRef_FromPyObjectNew(method);
                stack_pointer[-2 - oparg] = callable;
                stack_pointer[-1 - oparg] = self_or_null;
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(temp);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[-2 - oparg] = callable;
            stack_pointer[-1 - oparg] = self_or_null;
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _DO_CALL is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        /* _MONITOR_CALL is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        case _PY_FRAME_GENERAL_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            int total_args = oparg;
            if (!PyStackRef_IsNull(self_or_null)) {
                args--;
                total_args++;
            }
            assert(Py_TYPE(callable_o) == &PyFunction_Type);
            int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(callable_o))->co_flags;
            PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable_o));
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyInterpreterFrame *temp = _PyEvalFramePushAndInit(
                tstate, callable, locals,
                args, total_args, NULL, frame
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (temp == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            new_frame = PyStackRef_Wrap(temp);
            _tos_cache0 = new_frame;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_VERSION_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyFunction_Check(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_VERSION_INLINE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = (PyObject *)CURRENT_OPERAND1_64();
            assert(PyFunction_Check(callable_o));
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_VERSION_INLINE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = (PyObject *)CURRENT_OPERAND1_64();
            assert(PyFunction_Check(callable_o));
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_VERSION_INLINE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = (PyObject *)CURRENT_OPERAND1_64();
            assert(PyFunction_Check(callable_o));
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_VERSION_INLINE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = (PyObject *)CURRENT_OPERAND1_64();
            assert(PyFunction_Check(callable_o));
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_METHOD_VERSION_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (Py_TYPE(callable_o) != &PyMethod_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *func = ((PyMethodObject *)callable_o)->im_func;
            if (!PyFunction_Check(func)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (((PyFunctionObject *)func)->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _EXPAND_METHOD_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            assert(PyStackRef_IsNull(self_or_null));
            assert(Py_TYPE(callable_o) == &PyMethod_Type);
            self_or_null = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
            assert(PyStackRef_FunctionCheck(callable));
            stack_pointer[-2 - oparg] = callable;
            stack_pointer[-1 - oparg] = self_or_null;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_NOT_PY_CALLABLE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (PyFunction_Check(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(callable_o) == &PyMethod_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_NON_PY_GENERAL_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            #if TIER_ONE
            assert(opcode != INSTRUMENTED_CALL);
            #endif
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _Py_VectorCall_StackRefSteal(
                callable,
                arguments,
                total_args,
                PyStackRef_NULL);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                stack_pointer += -2 - oparg;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(PyStackRef_AsPyObjectBorrow(callable)) != &PyMethod_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            assert(PyStackRef_IsNull(self_or_null));
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            STAT_INC(CALL, hit);
            self_or_null = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
            stack_pointer[-2 - oparg] = callable;
            stack_pointer[-1 - oparg] = self_or_null;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_PEP_523_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            if (IS_PEP523_HOOKED(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_PEP_523_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            if (IS_PEP523_HOOKED(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_PEP_523_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            if (IS_PEP523_HOOKED(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_PEP_523_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            if (IS_PEP523_HOOKED(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_EXACT_ARGS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            assert(PyFunction_Check(callable_o));
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            PyCodeObject *code = (PyCodeObject *)func->func_code;
            if (code->co_argcount != oparg + (!PyStackRef_IsNull(self_or_null))) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_STACK_SPACE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            PyCodeObject *code = (PyCodeObject *)func->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_REMAINING_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            if (tstate->py_recursion_remaining <= 1) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_REMAINING_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            if (tstate->py_recursion_remaining <= 1) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_REMAINING_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            if (tstate->py_recursion_remaining <= 1) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_REMAINING_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            if (tstate->py_recursion_remaining <= 1) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_0_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = !PyStackRef_IsNull(self_or_null);
            STAT_INC(CALL, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
            _PyStackRef *first_non_self_local = pushed_frame->localsplus + has_self;
            pushed_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_1_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = !PyStackRef_IsNull(self_or_null);
            STAT_INC(CALL, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
            _PyStackRef *first_non_self_local = pushed_frame->localsplus + has_self;
            pushed_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_2_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = !PyStackRef_IsNull(self_or_null);
            STAT_INC(CALL, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
            _PyStackRef *first_non_self_local = pushed_frame->localsplus + has_self;
            pushed_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_3_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = !PyStackRef_IsNull(self_or_null);
            STAT_INC(CALL, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
            _PyStackRef *first_non_self_local = pushed_frame->localsplus + has_self;
            pushed_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_4_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = !PyStackRef_IsNull(self_or_null);
            STAT_INC(CALL, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
            _PyStackRef *first_non_self_local = pushed_frame->localsplus + has_self;
            pushed_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = !PyStackRef_IsNull(self_or_null);
            STAT_INC(CALL, hit);
            _PyInterpreterFrame *pushed_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
            _PyStackRef *first_non_self_local = pushed_frame->localsplus + has_self;
            pushed_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            new_frame = PyStackRef_Wrap(pushed_frame);
            _tos_cache0 = new_frame;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PUSH_FRAME_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            new_frame = _stack_item_0;
            assert(!IS_PEP523_HOOKED(tstate));
            _PyInterpreterFrame *temp = PyStackRef_Unwrap(new_frame);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            assert(temp->previous == frame || temp->previous->previous == frame);
            CALL_STAT_INC(inlined_py_calls);
            frame = tstate->current_frame = temp;
            tstate->py_recursion_remaining--;
            LOAD_SP();
            LOAD_IP(0);
            DTRACE_FUNCTION_ENTRY();
            LLTRACE_RESUME_FRAME();
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NULL_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            null = stack_pointer[-2];
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NULL_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null = stack_pointer[-1];
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NULL_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null = _stack_item_0;
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = null;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NULL_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            null = _stack_item_1;
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = null;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = null;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NOT_NULL_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            nos = stack_pointer[-2];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NOT_NULL_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            nos = stack_pointer[-1];
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NOT_NULL_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            nos = _stack_item_0;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = nos;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = nos;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_NOS_NOT_NULL_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef nos;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            nos = _stack_item_1;
            PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
            if (o == NULL) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = nos;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = nos;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_THIRD_NULL_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            null = stack_pointer[-3];
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_THIRD_NULL_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            null = stack_pointer[-2];
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_THIRD_NULL_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            null = stack_pointer[-1];
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_THIRD_NULL_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            null = _stack_item_0;
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = null;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = null;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TYPE_1_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            callable = stack_pointer[-3];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyType_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TYPE_1_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            callable = stack_pointer[-2];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyType_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TYPE_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            callable = stack_pointer[-1];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyType_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TYPE_1_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callable = _stack_item_0;
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyType_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = callable;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_TYPE_1_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef res;
            _PyStackRef a;
            oparg = CURRENT_OPARG();
            arg = stack_pointer[-1];
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            assert(oparg == 1);
            STAT_INC(CALL, hit);
            a = arg;
            res = PyStackRef_FromPyObjectNew(Py_TYPE(arg_o));
            _tos_cache1 = a;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_TYPE_1_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef res;
            _PyStackRef a;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            arg = _stack_item_0;
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            assert(oparg == 1);
            STAT_INC(CALL, hit);
            a = arg;
            res = PyStackRef_FromPyObjectNew(Py_TYPE(arg_o));
            _tos_cache1 = a;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_TYPE_1_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef res;
            _PyStackRef a;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            arg = _stack_item_1;
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            assert(oparg == 1);
            STAT_INC(CALL, hit);
            a = arg;
            res = PyStackRef_FromPyObjectNew(Py_TYPE(arg_o));
            _tos_cache1 = a;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_TYPE_1_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef res;
            _PyStackRef a;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            arg = _stack_item_2;
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            assert(oparg == 1);
            STAT_INC(CALL, hit);
            a = arg;
            res = PyStackRef_FromPyObjectNew(Py_TYPE(arg_o));
            _tos_cache1 = a;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_STR_1_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            callable = stack_pointer[-3];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyUnicode_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_STR_1_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            callable = stack_pointer[-2];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyUnicode_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_STR_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            callable = stack_pointer[-1];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyUnicode_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_STR_1_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callable = _stack_item_0;
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyUnicode_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = callable;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_STR_1_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef res;
            _PyStackRef a;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            arg = _stack_item_2;
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            assert(oparg == 1);
            STAT_INC(CALL, hit);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = arg;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = PyObject_Str(arg_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            a = arg;
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache1 = a;
            _tos_cache0 = res;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TUPLE_1_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            callable = stack_pointer[-3];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TUPLE_1_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            callable = stack_pointer[-2];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TUPLE_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            callable = stack_pointer[-1];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_TUPLE_1_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callable = _stack_item_0;
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (callable_o != (PyObject *)&PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = callable;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_TUPLE_1_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef res;
            _PyStackRef a;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            arg = _stack_item_2;
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            assert(oparg == 1);
            STAT_INC(CALL, hit);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = arg;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = PySequence_Tuple(arg_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            a = arg;
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache1 = a;
            _tos_cache0 = res;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_OBJECT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyStackRef_IsNull(self_or_null)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyTypeObject *tp = (PyTypeObject *)callable_o;
            if (FT_ATOMIC_LOAD_UINT32_RELAXED(tp->tp_version_tag) != type_version) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _ALLOCATE_OBJECT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            assert(PyStackRef_IsNull(self_or_null));
            assert(PyType_Check(callable_o));
            PyTypeObject *tp = (PyTypeObject *)callable_o;
            assert(tp->tp_new == PyBaseObject_Type.tp_new);
            assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE);
            assert(tp->tp_alloc == PyType_GenericAlloc);
            PyHeapTypeObject *cls = (PyHeapTypeObject *)callable_o;
            PyFunctionObject *init_func = (PyFunctionObject *)FT_ATOMIC_LOAD_PTR_ACQUIRE(cls->_spec_cache.init);
            PyCodeObject *code = (PyCodeObject *)init_func->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize + _Py_InitCleanup.co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *self_o = PyType_GenericAlloc(tp, 0);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (self_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            self_or_null = PyStackRef_FromPyObjectSteal(self_o);
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectNew(init_func);
            stack_pointer[-2 - oparg] = callable;
            stack_pointer[-1 - oparg] = self_or_null;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CREATE_INIT_FRAME_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self;
            _PyStackRef init;
            _PyStackRef init_frame;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self = stack_pointer[-1 - oparg];
            init = stack_pointer[-2 - oparg];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyInterpreterFrame *shim = _PyFrame_PushTrampolineUnchecked(
                tstate, (PyCodeObject *)&_Py_InitCleanup, 1, frame);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            assert(_PyFrame_GetBytecode(shim)[0].op.code == EXIT_INIT_CHECK);
            assert(_PyFrame_GetBytecode(shim)[1].op.code == RETURN_VALUE);
            shim->localsplus[0] = PyStackRef_DUP(self);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyInterpreterFrame *temp = _PyEvalFramePushAndInit(
                tstate, init, NULL, args-1, oparg+1, NULL, shim);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (temp == NULL) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyEval_FrameClearAndPop(tstate, shim);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            frame->return_offset = 1 + INLINE_CACHE_ENTRIES_CALL;
            tstate->py_recursion_remaining--;
            init_frame = PyStackRef_Wrap(temp);
            _tos_cache0 = init_frame;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _EXIT_INIT_CHECK_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef should_be_none;
            _PyStackRef _stack_item_0 = _tos_cache0;
            should_be_none = _stack_item_0;
            if (!PyStackRef_IsNone(should_be_none)) {
                stack_pointer[0] = should_be_none;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyErr_Format(PyExc_TypeError,
                             "__init__() should return None, not '%.200s'",
                             Py_TYPE(PyStackRef_AsPyObjectBorrow(should_be_none))->tp_name);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_BUILTIN_CLASS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyType_Check(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyTypeObject *tp = (PyTypeObject *)callable_o;
            if (tp->tp_vectorcall == NULL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_BUILTIN_CLASS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _Py_CallBuiltinClass_StackRef(
                callable,
                arguments,
                total_args);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_BUILTIN_O_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyCFunction_CheckExact(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyCFunction_GET_FLAGS(callable_o) != METH_O) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            int total_args = oparg;
            if (!PyStackRef_IsNull(self_or_null)) {
                total_args++;
            }
            if (total_args != 1) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_BUILTIN_O_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef c;
            _PyStackRef s;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyStackRef_IsNull(self_or_null)) {
                args--;
            }
            STAT_INC(CALL, hit);
            PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable_o);
            _PyStackRef arg = args[0];
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, PyCFunction_GET_SELF(callable_o), PyStackRef_AsPyObjectBorrow(arg));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = args[0];
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_BUILTIN_FAST_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyCFunction_CheckExact(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyCFunction_GET_FLAGS(callable_o) != METH_FASTCALL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_BUILTIN_FAST_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _Py_BuiltinCallFast_StackRef(
                callable,
                arguments,
                total_args
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_BUILTIN_FAST_WITH_KEYWORDS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyCFunction_CheckExact(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyCFunction_GET_FLAGS(callable_o) != (METH_FASTCALL | METH_KEYWORDS)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_BUILTIN_FAST_WITH_KEYWORDS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _Py_BuiltinCallFastWithKeywords_StackRef(callable, arguments, total_args);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LEN_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            callable = stack_pointer[-3];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.len) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LEN_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            callable = stack_pointer[-2];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.len) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LEN_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            callable = stack_pointer[-1];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.len) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LEN_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callable = _stack_item_0;
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.len) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = callable;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_LEN_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef a;
            _PyStackRef c;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            arg = _stack_item_2;
            callable = _stack_item_0;
            STAT_INC(CALL, hit);
            PyObject *arg_o = PyStackRef_AsPyObjectBorrow(arg);
            stack_pointer[0] = callable;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = arg;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            Py_ssize_t len_i = PyObject_Length(arg_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (len_i < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            PyObject *res_o = PyLong_FromSsize_t(len_i);
            assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            a = arg;
            c = callable;
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = c;
            _tos_cache1 = a;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_ISINSTANCE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            callable = stack_pointer[-4];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.isinstance) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = stack_pointer[-3];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_ISINSTANCE_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            callable = stack_pointer[-3];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.isinstance) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_ISINSTANCE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            callable = stack_pointer[-2];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.isinstance) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_ISINSTANCE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callable = stack_pointer[-1];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.isinstance) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_ISINSTANCE_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef cls;
            _PyStackRef instance;
            _PyStackRef null;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            cls = _stack_item_2;
            instance = _stack_item_1;
            null = _stack_item_0;
            callable = stack_pointer[-1];
            STAT_INC(CALL, hit);
            PyObject *inst_o = PyStackRef_AsPyObjectBorrow(instance);
            PyObject *cls_o = PyStackRef_AsPyObjectBorrow(cls);
            stack_pointer[0] = null;
            stack_pointer[1] = instance;
            stack_pointer[2] = cls;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int retval = PyObject_IsInstance(inst_o, cls_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (retval < 0) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            (void)null;
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(cls);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(instance);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(callable);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            res = retval ? PyStackRef_True : PyStackRef_False;
            assert((!PyStackRef_IsNull(res)) ^ (_PyErr_Occurred(tstate) != NULL));
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LIST_APPEND_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            callable = stack_pointer[-3];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.list_append) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LIST_APPEND_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            callable = stack_pointer[-2];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.list_append) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LIST_APPEND_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            callable = stack_pointer[-1];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.list_append) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_LIST_APPEND_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callable = _stack_item_0;
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyInterpreterState *interp = tstate->interp;
            if (callable_o != interp->callable_cache.list_append) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = callable;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = callable;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_LIST_APPEND_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef self;
            _PyStackRef callable;
            _PyStackRef none;
            _PyStackRef c;
            _PyStackRef s;
            oparg = CURRENT_OPARG();
            arg = stack_pointer[-1];
            self = stack_pointer[-2];
            callable = stack_pointer[-3];
            assert(oparg == 1);
            PyObject *self_o = PyStackRef_AsPyObjectBorrow(self);
            if (!LOCK_OBJECT(self_o)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg));
            UNLOCK_OBJECT(self_o);
            if (err) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = self;
            none = PyStackRef_None;
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = none;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_LIST_APPEND_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef self;
            _PyStackRef callable;
            _PyStackRef none;
            _PyStackRef c;
            _PyStackRef s;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            arg = _stack_item_0;
            self = stack_pointer[-1];
            callable = stack_pointer[-2];
            assert(oparg == 1);
            PyObject *self_o = PyStackRef_AsPyObjectBorrow(self);
            if (!LOCK_OBJECT(self_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = arg;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg));
            UNLOCK_OBJECT(self_o);
            if (err) {
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = self;
            none = PyStackRef_None;
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = none;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_LIST_APPEND_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef self;
            _PyStackRef callable;
            _PyStackRef none;
            _PyStackRef c;
            _PyStackRef s;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            arg = _stack_item_1;
            self = _stack_item_0;
            callable = stack_pointer[-1];
            assert(oparg == 1);
            PyObject *self_o = PyStackRef_AsPyObjectBorrow(self);
            if (!LOCK_OBJECT(self_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = arg;
                _tos_cache0 = self;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg));
            UNLOCK_OBJECT(self_o);
            if (err) {
                stack_pointer[0] = self;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = self;
            none = PyStackRef_None;
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = none;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_LIST_APPEND_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef arg;
            _PyStackRef self;
            _PyStackRef callable;
            _PyStackRef none;
            _PyStackRef c;
            _PyStackRef s;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            arg = _stack_item_2;
            self = _stack_item_1;
            callable = _stack_item_0;
            assert(oparg == 1);
            PyObject *self_o = PyStackRef_AsPyObjectBorrow(self);
            if (!LOCK_OBJECT(self_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = arg;
                _tos_cache1 = self;
                _tos_cache0 = callable;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg));
            UNLOCK_OBJECT(self_o);
            if (err) {
                stack_pointer[0] = callable;
                stack_pointer[1] = self;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = self;
            none = PyStackRef_None;
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = none;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_METHOD_DESCRIPTOR_O_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (method->d_method->ml_flags != METH_O) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            int total_args = oparg;
            if (!PyStackRef_IsNull(self_or_null)) {
                total_args++;
            }
            if (total_args != 2) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *self = PyStackRef_AsPyObjectBorrow(
                PyStackRef_IsNull(self_or_null) ? args[0] : self_or_null);
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_O_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef c;
            _PyStackRef s;
            _PyStackRef a;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
            }
            STAT_INC(CALL, hit);
            PyCFunction cfunc = method->d_method->ml_meth;
            PyObject *self = PyStackRef_AsPyObjectBorrow(arguments[0]);
            PyObject *arg = PyStackRef_AsPyObjectBorrow(arguments[1]);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, self, arg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = arguments[0];
            a = arguments[1];
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = a;
            _tos_cache1 = s;
            _tos_cache0 = c;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_LIMIT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            if (_Py_ReachedRecursionLimit(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_LIMIT_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            if (_Py_ReachedRecursionLimit(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_LIMIT_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            if (_Py_ReachedRecursionLimit(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_RECURSION_LIMIT_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            if (_Py_ReachedRecursionLimit(tstate)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_O_INLINE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef c;
            _PyStackRef s;
            _PyStackRef a;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            callable = stack_pointer[-1 - oparg];
            PyObject *cfunc = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg == 2);
            STAT_INC(CALL, hit);
            volatile PyCFunction cfunc_v = (PyCFunction)cfunc;
            PyObject *self = PyStackRef_AsPyObjectBorrow(args[0]);
            PyObject *arg = PyStackRef_AsPyObjectBorrow(args[1]);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyCFunction_TrampolineCall(cfunc_v, self, arg);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = args[0];
            a = args[1];
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = a;
            _tos_cache1 = s;
            _tos_cache0 = c;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer[-1 - oparg] = res;
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (method->d_method->ml_flags != (METH_FASTCALL|METH_KEYWORDS)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            if (total_args == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *self = PyStackRef_AsPyObjectBorrow(arguments[0]);
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            PyObject *self = PyStackRef_AsPyObjectBorrow(arguments[0]);
            assert(self != NULL);
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyCFunctionFastWithKeywords cfunc = _PyCFunctionFastWithKeywords_CAST(method->d_method->ml_meth);
            PyObject *res_o = _PyCallMethodDescriptorFastWithKeywords_StackRef(
                callable,
                cfunc,
                self,
                arguments,
                total_args
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_INLINE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_st;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_st = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *cfunc = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *self = PyStackRef_AsPyObjectBorrow(self_st);
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            volatile PyCFunctionFastWithKeywords cfunc_v = _PyCFunctionFastWithKeywords_CAST(cfunc);
            PyObject *res_o = _PyCallMethodDescriptorFastWithKeywords_StackRef(
                callable,
                cfunc_v,
                self,
                args - 1,
                oparg + 1
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_METHOD_DESCRIPTOR_NOARGS_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (method->d_method->ml_flags != METH_NOARGS) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            int total_args = oparg;
            if (!PyStackRef_IsNull(self_or_null)) {
                total_args++;
            }
            if (total_args != 1) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *self = PyStackRef_AsPyObjectBorrow(
                PyStackRef_IsNull(self_or_null) ? args[0] : self_or_null);
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_NOARGS_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef c;
            _PyStackRef s;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            assert(oparg == 1 || !PyStackRef_IsNull(self_or_null));
            if (!PyStackRef_IsNull(self_or_null)) {
                args--;
            }
            _PyStackRef self_stackref = args[0];
            PyObject *self = PyStackRef_AsPyObjectBorrow(self_stackref);
            STAT_INC(CALL, hit);
            PyCFunction cfunc = method->d_method->ml_meth;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, self, NULL);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = args[0];
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_NOARGS_INLINE_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef c;
            _PyStackRef s;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            callable = stack_pointer[-1 - oparg];
            PyObject *cfunc = (PyObject *)CURRENT_OPERAND0_64();
            assert(oparg == 1);
            _PyStackRef self_stackref = args[0];
            PyObject *self = PyStackRef_AsPyObjectBorrow(self_stackref);
            STAT_INC(CALL, hit);
            volatile PyCFunction cfunc_v = (PyCFunction)cfunc;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyCFunction_TrampolineCall(cfunc_v, self, NULL);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            c = callable;
            s = args[0];
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache2 = s;
            _tos_cache1 = c;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CALLABLE_METHOD_DESCRIPTOR_FAST_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (method->d_method->ml_flags != METH_FASTCALL) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            int total_args = oparg;
            if (!PyStackRef_IsNull(self_or_null)) {
                total_args++;
            }
            if (total_args == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *self = PyStackRef_AsPyObjectBorrow(
                PyStackRef_IsNull(self_or_null) ? args[0] : self_or_null);
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            PyObject *self = PyStackRef_AsPyObjectBorrow(arguments[0]);
            assert(self != NULL);
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyCFunctionFast cfunc = _PyCFunctionFast_CAST(method->d_method->ml_meth);
            PyObject *res_o = _PyCallMethodDescriptorFast_StackRef(
                callable,
                cfunc,
                self,
                arguments,
                total_args
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST_INLINE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef self_st;
            _PyStackRef callable;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_st = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *cfunc = (PyObject *)CURRENT_OPERAND0_64();
            PyObject *self = PyStackRef_AsPyObjectBorrow(self_st);
            assert(self != NULL);
            STAT_INC(CALL, hit);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            volatile PyCFunctionFast cfunc_v = _PyCFunctionFast_CAST(cfunc);
            PyObject *res_o = _PyCallMethodDescriptorFast_StackRef(
                callable,
                cfunc_v,
                self,
                args - 1,
                oparg + 1
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            _PyStackRef temp = callable;
            callable = PyStackRef_FromPyObjectSteal(res_o);
            stack_pointer[-2 - oparg] = callable;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(temp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _MONITOR_CALL_KW is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        case _MAYBE_EXPAND_METHOD_KW_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            if (PyStackRef_TYPE(callable) == &PyMethod_Type && PyStackRef_IsNull(self_or_null)) {
                PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
                PyObject *self = ((PyMethodObject *)callable_o)->im_self;
                self_or_null = PyStackRef_FromPyObjectNew(self);
                PyObject *method = ((PyMethodObject *)callable_o)->im_func;
                _PyStackRef temp = callable;
                callable = PyStackRef_FromPyObjectNew(method);
                stack_pointer[-2 - oparg] = callable;
                stack_pointer[-1 - oparg] = self_or_null;
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(temp);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
            }
            _tos_cache0 = _stack_item_0;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer[-2 - oparg] = callable;
            stack_pointer[-1 - oparg] = self_or_null;
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _DO_CALL_KW is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        case _PY_FRAME_KW_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef kwnames;
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef new_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            kwnames = _stack_item_0;
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            PyObject *kwnames_o = PyStackRef_AsPyObjectBorrow(kwnames);
            int positional_args = total_args - (int)PyTuple_GET_SIZE(kwnames_o);
            assert(Py_TYPE(callable_o) == &PyFunction_Type);
            int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(callable_o))->co_flags;
            PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable_o));
            stack_pointer[0] = kwnames;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyInterpreterFrame *temp = _PyEvalFramePushAndInit(
                tstate, callable, locals,
                arguments, positional_args, kwnames_o, frame
            );
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(kwnames);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (temp == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            new_frame = PyStackRef_Wrap(temp);
            _tos_cache0 = new_frame;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_FUNCTION_VERSION_KW_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (!PyFunction_Check(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyFunctionObject *func = (PyFunctionObject *)callable_o;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_METHOD_VERSION_KW_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef null;
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            uint32_t func_version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (Py_TYPE(callable_o) != &PyMethod_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *func = ((PyMethodObject *)callable_o)->im_func;
            if (!PyFunction_Check(func)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (((PyFunctionObject *)func)->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyStackRef_IsNull(null)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _EXPAND_METHOD_KW_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            assert(PyStackRef_IsNull(self_or_null));
            _PyStackRef callable_s = callable;
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            assert(Py_TYPE(callable_o) == &PyMethod_Type);
            self_or_null = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
            callable = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
            assert(PyStackRef_FunctionCheck(callable));
            stack_pointer[-2 - oparg] = callable;
            stack_pointer[-1 - oparg] = self_or_null;
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(callable_s);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            _tos_cache0 = _stack_item_0;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_NOT_PY_CALLABLE_KW_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callable;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
            if (PyFunction_Check(callable_o)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(callable_o) == &PyMethod_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_KW_NON_PY_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef kwnames;
            _PyStackRef *args;
            _PyStackRef self_or_null;
            _PyStackRef callable;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            kwnames = _stack_item_0;
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            #if TIER_ONE
            assert(opcode != INSTRUMENTED_CALL);
            #endif
            int total_args = oparg;
            _PyStackRef *arguments = args;
            if (!PyStackRef_IsNull(self_or_null)) {
                arguments--;
                total_args++;
            }
            stack_pointer[0] = kwnames;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _Py_VectorCall_StackRefSteal(
                callable,
                arguments,
                total_args,
                kwnames);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                stack_pointer += -3 - oparg;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -3 - oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_CALLARGS_A_TUPLE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef callargs;
            _PyStackRef func;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            callargs = _stack_item_1;
            func = stack_pointer[-1];
            PyObject *callargs_o = PyStackRef_AsPyObjectBorrow(callargs);
            if (!PyTuple_CheckExact(callargs_o)) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = callargs;
                stack_pointer[2] = _stack_item_2;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                int err = _Py_Check_ArgsIterable(tstate, PyStackRef_AsPyObjectBorrow(func), callargs_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (err < 0) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyObject *tuple_o = PySequence_Tuple(callargs_o);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (tuple_o == NULL) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                _PyStackRef temp = callargs;
                callargs = PyStackRef_FromPyObjectSteal(tuple_o);
                stack_pointer[-2] = callargs;
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(temp);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -3;
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = callargs;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _DO_CALL_FUNCTION_EX is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        case _CHECK_IS_PY_CALLABLE_EX_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            func_st = stack_pointer[-4];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) != &PyFunction_Type) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            if (((PyFunctionObject *)func)->vectorcall != _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = stack_pointer[-3];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_PY_CALLABLE_EX_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            func_st = stack_pointer[-3];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) != &PyFunction_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            if (((PyFunctionObject *)func)->vectorcall != _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_PY_CALLABLE_EX_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            func_st = stack_pointer[-2];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) != &PyFunction_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            if (((PyFunctionObject *)func)->vectorcall != _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_PY_CALLABLE_EX_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            func_st = stack_pointer[-1];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) != &PyFunction_Type) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            if (((PyFunctionObject *)func)->vectorcall != _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _PY_FRAME_EX_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef kwargs_st;
            _PyStackRef callargs_st;
            _PyStackRef func_st;
            _PyStackRef ex_frame;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            kwargs_st = _stack_item_2;
            callargs_st = _stack_item_1;
            func_st = stack_pointer[-1];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            PyObject *callargs = PyStackRef_AsPyObjectSteal(callargs_st);
            assert(PyTuple_CheckExact(callargs));
            assert(Py_TYPE(func) == &PyFunction_Type);
            assert(((PyFunctionObject *)func)->vectorcall == _PyFunction_Vectorcall);
            PyObject *kwargs = PyStackRef_IsNull(kwargs_st) ? NULL : PyStackRef_AsPyObjectSteal(kwargs_st);
            assert(kwargs == NULL || PyDict_CheckExact(kwargs));
            Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
            int code_flags = ((PyCodeObject *)PyFunction_GET_CODE(func))->co_flags;
            PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(func));
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyInterpreterFrame *new_frame = _PyEvalFramePushAndInit_Ex(
                tstate, func_st, locals,
                nargs, callargs, kwargs, frame);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (new_frame == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            ex_frame = PyStackRef_Wrap(new_frame);
            _tos_cache0 = ex_frame;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_NOT_PY_CALLABLE_EX_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            func_st = stack_pointer[-4];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) == &PyFunction_Type && ((PyFunctionObject *)func)->vectorcall == _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = stack_pointer[-3];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_NOT_PY_CALLABLE_EX_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            func_st = stack_pointer[-3];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) == &PyFunction_Type && ((PyFunctionObject *)func)->vectorcall == _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_NOT_PY_CALLABLE_EX_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            func_st = stack_pointer[-2];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) == &PyFunction_Type && ((PyFunctionObject *)func)->vectorcall == _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_IS_NOT_PY_CALLABLE_EX_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_st;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            func_st = stack_pointer[-1];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            if (Py_TYPE(func) == &PyFunction_Type && ((PyFunctionObject *)func)->vectorcall == _PyFunction_Vectorcall) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CALL_FUNCTION_EX_NON_PY_GENERAL_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef kwargs_st;
            _PyStackRef callargs_st;
            _PyStackRef null;
            _PyStackRef func_st;
            _PyStackRef result;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            kwargs_st = _stack_item_2;
            callargs_st = _stack_item_1;
            null = _stack_item_0;
            func_st = stack_pointer[-1];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
            PyObject *callargs = PyStackRef_AsPyObjectBorrow(callargs_st);
            (void)null;
            assert(PyTuple_CheckExact(callargs));
            PyObject *kwargs = PyStackRef_AsPyObjectBorrow(kwargs_st);
            assert(kwargs == NULL || PyDict_CheckExact(kwargs));
            stack_pointer[0] = null;
            stack_pointer[1] = callargs_st;
            stack_pointer[2] = kwargs_st;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *result_o = PyObject_Call(func, callargs, kwargs);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_XCLOSE(kwargs_st);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(callargs_st);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(func_st);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (result_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            result = PyStackRef_FromPyObjectSteal(result_o);
            _tos_cache0 = result;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_FUNCTION_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef codeobj_st;
            _PyStackRef func;
            _PyStackRef co;
            _PyStackRef _stack_item_0 = _tos_cache0;
            codeobj_st = _stack_item_0;
            PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
            stack_pointer[0] = codeobj_st;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyFunctionObject *func_obj = (PyFunctionObject *)
            PyFunction_New(codeobj, GLOBALS());
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (func_obj == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            co = codeobj_st;
            _PyFunction_SetVersion(
                                   func_obj, ((PyCodeObject *)codeobj)->co_version);
            func = PyStackRef_FromPyObjectSteal((PyObject *)func_obj);
            _tos_cache1 = co;
            _tos_cache0 = func;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_FUNCTION_ATTRIBUTE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_in;
            _PyStackRef attr_st;
            _PyStackRef func_out;
            oparg = CURRENT_OPARG();
            func_in = stack_pointer[-1];
            attr_st = stack_pointer[-2];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_in);
            PyObject *attr = PyStackRef_AsPyObjectSteal(attr_st);
            func_out = func_in;
            assert(PyFunction_Check(func));
            size_t offset = _Py_FunctionAttributeOffsets[oparg];
            assert(offset != 0);
            PyObject **ptr = (PyObject **)(((char *)func) + offset);
            assert(*ptr == NULL);
            *ptr = attr;
            _tos_cache0 = func_out;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_FUNCTION_ATTRIBUTE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_in;
            _PyStackRef attr_st;
            _PyStackRef func_out;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            func_in = _stack_item_0;
            attr_st = stack_pointer[-1];
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_in);
            PyObject *attr = PyStackRef_AsPyObjectSteal(attr_st);
            func_out = func_in;
            assert(PyFunction_Check(func));
            size_t offset = _Py_FunctionAttributeOffsets[oparg];
            assert(offset != 0);
            PyObject **ptr = (PyObject **)(((char *)func) + offset);
            assert(*ptr == NULL);
            *ptr = attr;
            _tos_cache0 = func_out;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_FUNCTION_ATTRIBUTE_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_in;
            _PyStackRef attr_st;
            _PyStackRef func_out;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            func_in = _stack_item_1;
            attr_st = _stack_item_0;
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_in);
            PyObject *attr = PyStackRef_AsPyObjectSteal(attr_st);
            func_out = func_in;
            assert(PyFunction_Check(func));
            size_t offset = _Py_FunctionAttributeOffsets[oparg];
            assert(offset != 0);
            PyObject **ptr = (PyObject **)(((char *)func) + offset);
            assert(*ptr == NULL);
            *ptr = attr;
            _tos_cache0 = func_out;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_FUNCTION_ATTRIBUTE_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef func_in;
            _PyStackRef attr_st;
            _PyStackRef func_out;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            func_in = _stack_item_2;
            attr_st = _stack_item_1;
            PyObject *func = PyStackRef_AsPyObjectBorrow(func_in);
            PyObject *attr = PyStackRef_AsPyObjectSteal(attr_st);
            func_out = func_in;
            assert(PyFunction_Check(func));
            size_t offset = _Py_FunctionAttributeOffsets[oparg];
            assert(offset != 0);
            PyObject **ptr = (PyObject **)(((char *)func) + offset);
            assert(*ptr == NULL);
            *ptr = attr;
            _tos_cache1 = func_out;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RETURN_GENERATOR_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef res;
            assert(PyStackRef_FunctionCheck(frame->f_funcobj));
            PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (gen == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            assert(STACK_LEVEL() <= 2);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
            frame->instr_ptr++;
            _PyFrame_Copy(frame, gen_frame);
            assert(frame->frame_obj == NULL);
            gen->gi_frame_state = FRAME_CREATED;
            gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
            _Py_LeaveRecursiveCallPy(tstate);
            _PyInterpreterFrame *prev = frame->previous;
            _PyThreadState_PopFrame(tstate, frame);
            frame = tstate->current_frame = prev;
            LOAD_IP(frame->return_offset);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
            LLTRACE_RESUME_FRAME();
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BUILD_SLICE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef *args;
            _PyStackRef slice;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            PyObject *start_o = PyStackRef_AsPyObjectBorrow(args[0]);
            PyObject *stop_o = PyStackRef_AsPyObjectBorrow(args[1]);
            PyObject *step_o = oparg == 3 ? PyStackRef_AsPyObjectBorrow(args[2]) : NULL;
            PyObject *slice_o = PySlice_New(start_o, stop_o, step_o);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            _PyStackRef tmp;
            for (int _i = oparg; --_i >= 0;) {
                tmp = args[_i];
                args[_i] = PyStackRef_NULL;
                PyStackRef_CLOSE(tmp);
            }
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -oparg;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (slice_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            slice = PyStackRef_FromPyObjectStealMortal(slice_o);
            _tos_cache0 = slice;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CONVERT_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef result;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            value = _stack_item_0;
            conversion_func conv_fn;
            assert(oparg >= FVC_STR && oparg <= FVC_ASCII);
            conv_fn = _PyEval_ConversionFuncs[oparg];
            stack_pointer[0] = value;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *result_o = conv_fn(PyStackRef_AsPyObjectBorrow(value));
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(value);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (result_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            result = PyStackRef_FromPyObjectSteal(result_o);
            _tos_cache0 = result;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FORMAT_SIMPLE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            value = _stack_item_0;
            PyObject *value_o = PyStackRef_AsPyObjectBorrow(value);
            if (!PyUnicode_CheckExact(value_o)) {
                stack_pointer[0] = value;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyObject *res_o = PyObject_Format(value_o, NULL);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(value);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (res_o == NULL) {
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_ERROR();
                }
                res = PyStackRef_FromPyObjectSteal(res_o);
            }
            else {
                res = value;
            }
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FORMAT_WITH_SPEC_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef fmt_spec;
            _PyStackRef value;
            _PyStackRef res;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            fmt_spec = _stack_item_1;
            value = _stack_item_0;
            stack_pointer[0] = value;
            stack_pointer[1] = fmt_spec;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = PyObject_Format(PyStackRef_AsPyObjectBorrow(value), PyStackRef_AsPyObjectBorrow(fmt_spec));
            _PyStackRef tmp = fmt_spec;
            fmt_spec = PyStackRef_NULL;
            stack_pointer[-1] = fmt_spec;
            PyStackRef_CLOSE(tmp);
            tmp = value;
            value = PyStackRef_NULL;
            stack_pointer[-2] = value;
            PyStackRef_CLOSE(tmp);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            _tos_cache0 = res;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_1_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            bottom = stack_pointer[-1];
            top = PyStackRef_DUP(bottom);
            _tos_cache1 = top;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_1_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            bottom = _stack_item_0;
            top = PyStackRef_DUP(bottom);
            _tos_cache1 = top;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_1_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            bottom = _stack_item_1;
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = bottom;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_2_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            bottom = stack_pointer[-2];
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_2_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            bottom = stack_pointer[-1];
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_2_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            bottom = _stack_item_0;
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_3_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            bottom = stack_pointer[-3];
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_3_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            bottom = stack_pointer[-2];
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_3_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            bottom = stack_pointer[-1];
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_3_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            bottom = _stack_item_0;
            top = PyStackRef_DUP(bottom);
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_2;
            _tos_cache0 = _stack_item_1;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer[0] = bottom;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COPY_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef bottom;
            _PyStackRef top;
            oparg = CURRENT_OPARG();
            bottom = stack_pointer[-1 - (oparg-1)];
            top = PyStackRef_DUP(bottom);
            _tos_cache0 = top;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _BINARY_OP_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef rhs;
            _PyStackRef lhs;
            _PyStackRef res;
            _PyStackRef l;
            _PyStackRef r;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            rhs = _stack_item_1;
            lhs = _stack_item_0;
            PyObject *lhs_o = PyStackRef_AsPyObjectBorrow(lhs);
            PyObject *rhs_o = PyStackRef_AsPyObjectBorrow(rhs);
            assert(_PyEval_BinaryOps[oparg]);
            stack_pointer[0] = lhs;
            stack_pointer[1] = rhs;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyObject *res_o = _PyEval_BinaryOps[oparg](lhs_o, rhs_o);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (res_o == NULL) {
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_ERROR();
            }
            res = PyStackRef_FromPyObjectSteal(res_o);
            l = lhs;
            r = rhs;
            _tos_cache2 = r;
            _tos_cache1 = l;
            _tos_cache0 = res;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_2_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            top = stack_pointer[-1];
            bottom = stack_pointer[-2];
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache1 = top;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_2_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            top = _stack_item_0;
            bottom = stack_pointer[-1];
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache1 = top;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_2_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            top = _stack_item_1;
            bottom = _stack_item_0;
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache1 = top;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_2_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            top = _stack_item_2;
            bottom = _stack_item_1;
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache2 = top;
            _tos_cache1 = bottom;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_3_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            top = stack_pointer[-1];
            bottom = stack_pointer[-3];
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache2 = top;
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_3_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            top = _stack_item_0;
            bottom = stack_pointer[-2];
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache2 = top;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_3_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            top = _stack_item_1;
            bottom = stack_pointer[-1];
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_3_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            top = _stack_item_2;
            bottom = _stack_item_0;
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache2 = top;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SWAP_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            top = _stack_item_0;
            bottom = stack_pointer[-1 - (oparg-2)];
            _PyStackRef temp = bottom;
            bottom = top;
            top = temp;
            _tos_cache0 = top;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer[-1 - (oparg-2)] = bottom;
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _INSTRUMENTED_LINE is not a viable micro-op for tier 2 because it is instrumented */

        /* _INSTRUMENTED_INSTRUCTION is not a viable micro-op for tier 2 because it is instrumented */

        /* _INSTRUMENTED_JUMP_FORWARD is not a viable micro-op for tier 2 because it is instrumented */

        /* _MONITOR_JUMP_BACKWARD is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */

        /* _INSTRUMENTED_NOT_TAKEN is not a viable micro-op for tier 2 because it is instrumented */

        /* _INSTRUMENTED_POP_JUMP_IF_TRUE is not a viable micro-op for tier 2 because it is instrumented */

        /* _INSTRUMENTED_POP_JUMP_IF_FALSE is not a viable micro-op for tier 2 because it is instrumented */

        /* _INSTRUMENTED_POP_JUMP_IF_NONE is not a viable micro-op for tier 2 because it is instrumented */

        /* _INSTRUMENTED_POP_JUMP_IF_NOT_NONE is not a viable micro-op for tier 2 because it is instrumented */

        case _GUARD_IS_TRUE_POP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            flag = stack_pointer[-1];
            int is_true = PyStackRef_IsTrue(flag);
            if (!is_true) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_TRUE_POP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            flag = _stack_item_0;
            int is_true = PyStackRef_IsTrue(flag);
            if (!is_true) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_TRUE_POP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            flag = _stack_item_1;
            int is_true = PyStackRef_IsTrue(flag);
            if (!is_true) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_TRUE_POP_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            flag = _stack_item_2;
            int is_true = PyStackRef_IsTrue(flag);
            if (!is_true) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_FALSE_POP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            flag = stack_pointer[-1];
            int is_false = PyStackRef_IsFalse(flag);
            if (!is_false) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_FALSE_POP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            flag = _stack_item_0;
            int is_false = PyStackRef_IsFalse(flag);
            if (!is_false) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_FALSE_POP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            flag = _stack_item_1;
            int is_false = PyStackRef_IsFalse(flag);
            if (!is_false) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_FALSE_POP_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            flag = _stack_item_2;
            int is_false = PyStackRef_IsFalse(flag);
            if (!is_false) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_4_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_4_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_4_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_4_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_5_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_5_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_5_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_5_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_6_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_6_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_6_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_6_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_7_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_7_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_7_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_7_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = CURRENT_OPARG();
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_SET_POP_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_4_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_4_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_4_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_4_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_5_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_5_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_5_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_5_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_6_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_6_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_6_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_6_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_7_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_7_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_7_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_7_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            oparg = CURRENT_OPARG();
            flag = stack_pointer[-1];
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            flag = _stack_item_0;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            flag = _stack_item_1;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_BIT_IS_UNSET_POP_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef flag;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            flag = _stack_item_2;
            #ifdef Py_STACKREF_DEBUG
            uintptr_t bits = flag.index;
            #else
            uintptr_t bits = flag.bits;
            #endif
            uintptr_t set = (1 << oparg) & bits;
            if (set != 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_NONE_POP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef val;
            val = stack_pointer[-1];
            int is_none = PyStackRef_IsNone(val);
            if (!is_none) {
                stack_pointer += -1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(val);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (1) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_NONE_POP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef val;
            _PyStackRef _stack_item_0 = _tos_cache0;
            val = _stack_item_0;
            int is_none = PyStackRef_IsNone(val);
            if (!is_none) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(val);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (1) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_NONE_POP_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef val;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            val = _stack_item_1;
            int is_none = PyStackRef_IsNone(val);
            if (!is_none) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(val);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (1) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    stack_pointer += -1;
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_NONE_POP_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef val;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            val = _stack_item_2;
            int is_none = PyStackRef_IsNone(val);
            if (!is_none) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                PyStackRef_CLOSE(val);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (1) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    stack_pointer += -2;
                    ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IS_NOT_NONE_POP_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef val;
            _PyStackRef _stack_item_0 = _tos_cache0;
            val = _stack_item_0;
            int is_none = PyStackRef_IsNone(val);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            PyStackRef_CLOSE(val);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            if (is_none) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = PyStackRef_ZERO_BITS;
            _tos_cache1 = PyStackRef_ZERO_BITS;
            _tos_cache2 = PyStackRef_ZERO_BITS;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _JUMP_TO_TOP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            JUMP_TO_JUMP_TARGET();
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_IP_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND0_64();
            frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_IP_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND0_64();
            frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_IP_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND0_64();
            frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SET_IP_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND0_64();
            frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_STACK_SPACE_OPERAND_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint32_t framesize = (uint32_t)CURRENT_OPERAND0_32();
            assert(framesize <= INT_MAX);
            if (!_PyThreadState_HasStackSpace(tstate, framesize)) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_STACK_SPACE_OPERAND_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint32_t framesize = (uint32_t)CURRENT_OPERAND0_32();
            assert(framesize <= INT_MAX);
            if (!_PyThreadState_HasStackSpace(tstate, framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_STACK_SPACE_OPERAND_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint32_t framesize = (uint32_t)CURRENT_OPERAND0_32();
            assert(framesize <= INT_MAX);
            if (!_PyThreadState_HasStackSpace(tstate, framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_STACK_SPACE_OPERAND_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint32_t framesize = (uint32_t)CURRENT_OPERAND0_32();
            assert(framesize <= INT_MAX);
            if (!_PyThreadState_HasStackSpace(tstate, framesize)) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SAVE_RETURN_OFFSET_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            #if TIER_ONE
            frame->return_offset = (uint16_t)(next_instr - this_instr);
            #endif
            #if TIER_TWO
            frame->return_offset = oparg;
            #endif
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SAVE_RETURN_OFFSET_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            oparg = CURRENT_OPARG();
            #if TIER_ONE
            frame->return_offset = (uint16_t)(next_instr - this_instr);
            #endif
            #if TIER_TWO
            frame->return_offset = oparg;
            #endif
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SAVE_RETURN_OFFSET_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            oparg = CURRENT_OPARG();
            #if TIER_ONE
            frame->return_offset = (uint16_t)(next_instr - this_instr);
            #endif
            #if TIER_TWO
            frame->return_offset = oparg;
            #endif
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SAVE_RETURN_OFFSET_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            oparg = CURRENT_OPARG();
            #if TIER_ONE
            frame->return_offset = (uint16_t)(next_instr - this_instr);
            #endif
            #if TIER_TWO
            frame->return_offset = oparg;
            #endif
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _EXIT_TRACE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            _PyExitData *exit = (_PyExitData *)exit_p;
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            const _Py_CODEUNIT *target = ((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame))
            + exit->target;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("SIDE EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code], exit->is_control_flow);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            #endif
            tstate->jit_exit = exit;
            SET_CURRENT_CACHED_VALUES(0);
            TIER2_TO_TIER2(exit->executor);
        }

        case _EXIT_TRACE_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            _PyExitData *exit = (_PyExitData *)exit_p;
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            const _Py_CODEUNIT *target = ((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame))
            + exit->target;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("SIDE EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code], exit->is_control_flow);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
            }
            #endif
            tstate->jit_exit = exit;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            TIER2_TO_TIER2(exit->executor);
        }

        case _EXIT_TRACE_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            _PyExitData *exit = (_PyExitData *)exit_p;
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            const _Py_CODEUNIT *target = ((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame))
            + exit->target;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("SIDE EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code], exit->is_control_flow);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -2;
            }
            #endif
            tstate->jit_exit = exit;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            TIER2_TO_TIER2(exit->executor);
        }

        case _EXIT_TRACE_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            _PyExitData *exit = (_PyExitData *)exit_p;
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            const _Py_CODEUNIT *target = ((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame))
            + exit->target;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer[2] = _stack_item_2;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("SIDE EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code], exit->is_control_flow);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -3;
            }
            #endif
            tstate->jit_exit = exit;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = _stack_item_2;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            TIER2_TO_TIER2(exit->executor);
        }

        case _DYNAMIC_EXIT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            _PyExitData *exit = (_PyExitData *)exit_p;
            _Py_CODEUNIT *target = frame->instr_ptr;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("DYNAMIC EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code]);
                stack_pointer = _PyFrame_GetStackPointer(frame);
            }
            #endif
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(frame->instr_ptr);
        }

        case _DYNAMIC_EXIT_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            _PyExitData *exit = (_PyExitData *)exit_p;
            _Py_CODEUNIT *target = frame->instr_ptr;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer += 1;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("DYNAMIC EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code]);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -1;
            }
            #endif
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            GOTO_TIER_ONE(frame->instr_ptr);
        }

        case _DYNAMIC_EXIT_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            _PyExitData *exit = (_PyExitData *)exit_p;
            _Py_CODEUNIT *target = frame->instr_ptr;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer += 2;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("DYNAMIC EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code]);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -2;
            }
            #endif
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            GOTO_TIER_ONE(frame->instr_ptr);
        }

        case _DYNAMIC_EXIT_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *exit_p = (PyObject *)CURRENT_OPERAND0_64();
            #if defined(Py_DEBUG) && !defined(_Py_JIT)
            _PyExitData *exit = (_PyExitData *)exit_p;
            _Py_CODEUNIT *target = frame->instr_ptr;
            OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
            if (frame->lltrace >= 3) {
                stack_pointer[0] = _stack_item_0;
                stack_pointer[1] = _stack_item_1;
                stack_pointer[2] = _stack_item_2;
                stack_pointer += 3;
                ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                printf("DYNAMIC EXIT: [UOp ");
                _PyUOpPrint(&next_uop[-1]);
                printf(", exit %tu, temp %d, target %d -> %s]\n",
                       exit - current_executor->exits, exit->temperature.value_and_backoff,
                       (int)(target - _PyFrame_GetBytecode(frame)),
                       _PyOpcode_OpName[target->op.code]);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                stack_pointer += -3;
            }
            #endif
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = _stack_item_2;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            GOTO_TIER_ONE(frame->instr_ptr);
        }

        case _CHECK_VALIDITY_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            if (!current_executor->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_VALIDITY_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            if (!current_executor->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_VALIDITY_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            if (!current_executor->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _CHECK_VALIDITY_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            if (!current_executor->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_INLINE_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
            value = PyStackRef_FromPyObjectNew(ptr);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_INLINE_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
            value = PyStackRef_FromPyObjectNew(ptr);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_INLINE_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
            value = PyStackRef_FromPyObjectNew(ptr);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_INLINE_BORROW_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
            value = PyStackRef_FromPyObjectBorrow(ptr);
            _tos_cache0 = value;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_INLINE_BORROW_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
            value = PyStackRef_FromPyObjectBorrow(ptr);
            _tos_cache1 = value;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _LOAD_CONST_INLINE_BORROW_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef value;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
            value = PyStackRef_FromPyObjectBorrow(ptr);
            _tos_cache2 = value;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RROT_3_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef middle;
            _PyStackRef bottom;
            top = stack_pointer[-1];
            middle = stack_pointer[-2];
            bottom = stack_pointer[-3];
            _PyStackRef temp = top;
            top = middle;
            middle = bottom;
            bottom = temp;
            _tos_cache2 = top;
            _tos_cache1 = middle;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RROT_3_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef middle;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            top = _stack_item_0;
            middle = stack_pointer[-1];
            bottom = stack_pointer[-2];
            _PyStackRef temp = top;
            top = middle;
            middle = bottom;
            bottom = temp;
            _tos_cache2 = top;
            _tos_cache1 = middle;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RROT_3_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef middle;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            top = _stack_item_1;
            middle = _stack_item_0;
            bottom = stack_pointer[-1];
            _PyStackRef temp = top;
            top = middle;
            middle = bottom;
            bottom = temp;
            _tos_cache2 = top;
            _tos_cache1 = middle;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _RROT_3_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef top;
            _PyStackRef middle;
            _PyStackRef bottom;
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            top = _stack_item_2;
            middle = _stack_item_1;
            bottom = _stack_item_0;
            _PyStackRef temp = top;
            top = middle;
            middle = bottom;
            bottom = temp;
            _tos_cache2 = top;
            _tos_cache1 = middle;
            _tos_cache0 = bottom;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _START_EXECUTOR_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *executor = (PyObject *)CURRENT_OPERAND0_64();
            #ifndef _Py_JIT
            assert(current_executor == (_PyExecutorObject*)executor);
            #endif
            assert(tstate->jit_exit == NULL || tstate->jit_exit->executor == current_executor);
            tstate->current_executor = (PyObject *)current_executor;
            if (!current_executor->vm_data.valid) {
                assert(tstate->jit_exit->executor == current_executor);
                assert(tstate->current_executor == executor);
                _PyFrame_SetStackPointer(frame, stack_pointer);
                _PyExecutor_ClearExit(tstate->jit_exit);
                stack_pointer = _PyFrame_GetStackPointer(frame);
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_WARM_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            current_executor->vm_data.cold = false;
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_WARM_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            current_executor->vm_data.cold = false;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_WARM_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            current_executor->vm_data.cold = false;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _MAKE_WARM_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            current_executor->vm_data.cold = false;
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FATAL_ERROR_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            assert(0);
            Py_FatalError("Fatal error uop executed.");
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FATAL_ERROR_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            assert(0);
            Py_FatalError("Fatal error uop executed.");
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FATAL_ERROR_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            assert(0);
            Py_FatalError("Fatal error uop executed.");
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _FATAL_ERROR_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            assert(0);
            Py_FatalError("Fatal error uop executed.");
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _DEOPT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                          ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _DEOPT_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                          ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _DEOPT_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                          ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _DEOPT_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = _stack_item_2;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE((frame->owner == FRAME_OWNED_BY_INTERPRETER)
                          ? _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _HANDLE_PENDING_AND_DEOPT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _Py_HandlePending(tstate);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(err ? NULL : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _HANDLE_PENDING_AND_DEOPT_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _Py_HandlePending(tstate);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(err ? NULL : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _HANDLE_PENDING_AND_DEOPT_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _Py_HandlePending(tstate);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(err ? NULL : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _HANDLE_PENDING_AND_DEOPT_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = _stack_item_2;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            _PyFrame_SetStackPointer(frame, stack_pointer);
            int err = _Py_HandlePending(tstate);
            stack_pointer = _PyFrame_GetStackPointer(frame);
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(err ? NULL : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
        }

        case _ERROR_POP_N_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            oparg = CURRENT_OPARG();
            uint32_t target = (uint32_t)CURRENT_OPERAND0_32();
            assert(oparg == 0);
            frame->instr_ptr = _PyFrame_GetBytecode(frame) + target;
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(NULL);
        }

        case _SPILL_OR_RELOAD_r01: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r02: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r03: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _tos_cache2 = stack_pointer[-1];
            _tos_cache1 = stack_pointer[-2];
            _tos_cache0 = stack_pointer[-3];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r10: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r12: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r13: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _tos_cache2 = _stack_item_0;
            _tos_cache1 = stack_pointer[-1];
            _tos_cache0 = stack_pointer[-2];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r20: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r21: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _tos_cache0 = _stack_item_1;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r23: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _tos_cache2 = _stack_item_1;
            _tos_cache1 = _stack_item_0;
            _tos_cache0 = stack_pointer[-1];
            SET_CURRENT_CACHED_VALUES(3);
            stack_pointer += -1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r30: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            SET_CURRENT_CACHED_VALUES(0);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer[2] = _stack_item_2;
            stack_pointer += 3;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r31: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            _tos_cache0 = _stack_item_2;
            SET_CURRENT_CACHED_VALUES(1);
            stack_pointer[0] = _stack_item_0;
            stack_pointer[1] = _stack_item_1;
            stack_pointer += 2;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _SPILL_OR_RELOAD_r32: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            _tos_cache1 = _stack_item_2;
            _tos_cache0 = _stack_item_1;
            SET_CURRENT_CACHED_VALUES(2);
            stack_pointer[0] = _stack_item_0;
            stack_pointer += 1;
            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TIER2_RESUME_CHECK_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t iversion = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            if (eval_breaker != iversion) {
                UOP_STAT_INC(uopcode, miss);
                SET_CURRENT_CACHED_VALUES(0);
                JUMP_TO_JUMP_TARGET();
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TIER2_RESUME_CHECK_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t iversion = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            if (eval_breaker != iversion) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(1);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TIER2_RESUME_CHECK_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t iversion = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            if (eval_breaker != iversion) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(2);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _TIER2_RESUME_CHECK_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
            #endif
            uintptr_t iversion = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version);
            uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
            if (eval_breaker != iversion) {
                UOP_STAT_INC(uopcode, miss);
                _tos_cache2 = _stack_item_2;
                _tos_cache1 = _stack_item_1;
                _tos_cache0 = _stack_item_0;
                SET_CURRENT_CACHED_VALUES(3);
                JUMP_TO_JUMP_TARGET();
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _COLD_EXIT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyExitData *exit = tstate->jit_exit;
            assert(exit != NULL);
            assert(frame->owner < FRAME_OWNED_BY_INTERPRETER);
            _Py_CODEUNIT *target = _PyFrame_GetBytecode(frame) + exit->target;
            _Py_BackoffCounter temperature = exit->temperature;
            _PyExecutorObject *executor;
            if (target->op.code == ENTER_EXECUTOR) {
                PyCodeObject *code = _PyFrame_GetCode(frame);
                executor = code->co_executors->executors[target->op.arg];
                Py_INCREF(executor);
                assert(tstate->jit_exit == exit);
                exit->executor = executor;
                SET_CURRENT_CACHED_VALUES(0);
                TIER2_TO_TIER2(exit->executor);
            }
            else {
                if (!backoff_counter_triggers(temperature)) {
                    exit->temperature = advance_backoff_counter(temperature);
                    SET_CURRENT_CACHED_VALUES(0);
                    GOTO_TIER_ONE(target);
                }
                _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit);
                assert(tstate->current_executor == (PyObject *)previous_executor);
                int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow;
                int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, stack_pointer, chain_depth, exit, target->op.arg, previous_executor);
                exit->temperature = restart_backoff_counter(exit->temperature);
                if (succ) {
                    GOTO_TIER_ONE_CONTINUE_TRACING(target);
                }
                SET_CURRENT_CACHED_VALUES(0);
                GOTO_TIER_ONE(target);
            }
        }

        case _COLD_DYNAMIC_EXIT_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _Py_CODEUNIT *target = frame->instr_ptr;
            SET_CURRENT_CACHED_VALUES(0);
            GOTO_TIER_ONE(target);
        }

        case _GUARD_CODE_VERSION__PUSH_FRAME_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION__PUSH_FRAME_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION__PUSH_FRAME_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION__PUSH_FRAME_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_YIELD_VALUE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_YIELD_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_YIELD_VALUE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_YIELD_VALUE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_VALUE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_VALUE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_VALUE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_GENERATOR_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_GENERATOR_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_GENERATOR_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_CODE_VERSION_RETURN_GENERATOR_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            uint32_t version = (uint32_t)CURRENT_OPERAND0_32();
            PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
            assert(PyCode_Check(code));
            if (((PyCodeObject *)code)->co_version != version) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP__PUSH_FRAME_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr;
            if (target != (_Py_CODEUNIT *)ip) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP__PUSH_FRAME_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr;
            if (target != (_Py_CODEUNIT *)ip) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP__PUSH_FRAME_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr;
            if (target != (_Py_CODEUNIT *)ip) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP__PUSH_FRAME_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr;
            if (target != (_Py_CODEUNIT *)ip) {
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_YIELD_VALUE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_YIELD_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_YIELD_VALUE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_YIELD_VALUE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_VALUE_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_VALUE_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_VALUE_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_VALUE_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_GENERATOR_r00: {
            CHECK_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    SET_CURRENT_CACHED_VALUES(0);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            SET_CURRENT_CACHED_VALUES(0);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_GENERATOR_r11: {
            CHECK_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(1);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(1);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_GENERATOR_r22: {
            CHECK_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(2);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(2);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        case _GUARD_IP_RETURN_GENERATOR_r33: {
            CHECK_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            _PyStackRef _stack_item_0 = _tos_cache0;
            _PyStackRef _stack_item_1 = _tos_cache1;
            _PyStackRef _stack_item_2 = _tos_cache2;
            PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
            _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
            if (target != (_Py_CODEUNIT *)ip) {
                frame->instr_ptr += frame->return_offset;
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    _tos_cache2 = _stack_item_2;
                    _tos_cache1 = _stack_item_1;
                    _tos_cache0 = _stack_item_0;
                    SET_CURRENT_CACHED_VALUES(3);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            _tos_cache2 = _stack_item_2;
            _tos_cache1 = _stack_item_1;
            _tos_cache0 = _stack_item_0;
            SET_CURRENT_CACHED_VALUES(3);
            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
            break;
        }

        /* _TRACE_RECORD is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */


#undef TIER_TWO
