// 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: {
            break;
        }

        case _RESUME_CHECK: {
            #if defined(__EMSCRIPTEN__)
            if (_Py_emscripten_signal_clock == 0) {
                UOP_STAT_INC(uopcode, miss);
                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 = _PyFrame_GetCode(frame)->_co_instrumentation_version;
            assert((version & _PY_EVAL_EVENTS_MASK) == 0);
            if (eval_breaker != version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

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

        case _LOAD_FAST_CHECK: {
            PyObject *value;
            oparg = CURRENT_OPARG();
            value = GETLOCAL(oparg);
            if (value == NULL) {
                _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
                    UNBOUNDLOCAL_ERROR_MSG,
                    PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
                );
                if (1) JUMP_TO_ERROR();
            }
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_0: {
            PyObject *value;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_1: {
            PyObject *value;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_2: {
            PyObject *value;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_3: {
            PyObject *value;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_4: {
            PyObject *value;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_5: {
            PyObject *value;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_6: {
            PyObject *value;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_7: {
            PyObject *value;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST: {
            PyObject *value;
            oparg = CURRENT_OPARG();
            value = GETLOCAL(oparg);
            assert(value != NULL);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_AND_CLEAR: {
            PyObject *value;
            oparg = CURRENT_OPARG();
            value = GETLOCAL(oparg);
            // do not use SETLOCAL here, it decrefs the old value
            GETLOCAL(oparg) = NULL;
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_CONST: {
            PyObject *value;
            oparg = CURRENT_OPARG();
            value = GETITEM(FRAME_CO_CONSTS, oparg);
            Py_INCREF(value);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _STORE_FAST_0: {
            PyObject *value;
            oparg = 0;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_1: {
            PyObject *value;
            oparg = 1;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_2: {
            PyObject *value;
            oparg = 2;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_3: {
            PyObject *value;
            oparg = 3;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_4: {
            PyObject *value;
            oparg = 4;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_5: {
            PyObject *value;
            oparg = 5;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_6: {
            PyObject *value;
            oparg = 6;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST_7: {
            PyObject *value;
            oparg = 7;
            assert(oparg == CURRENT_OPARG());
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _STORE_FAST: {
            PyObject *value;
            oparg = CURRENT_OPARG();
            value = stack_pointer[-1];
            SETLOCAL(oparg, value);
            stack_pointer += -1;
            break;
        }

        case _POP_TOP: {
            PyObject *value;
            value = stack_pointer[-1];
            Py_DECREF(value);
            stack_pointer += -1;
            break;
        }

        case _PUSH_NULL: {
            PyObject *res;
            res = NULL;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _END_SEND: {
            PyObject *value;
            PyObject *receiver;
            value = stack_pointer[-1];
            receiver = stack_pointer[-2];
            Py_DECREF(receiver);
            stack_pointer[-2] = value;
            stack_pointer += -1;
            break;
        }

        case _UNARY_NEGATIVE: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            res = PyNumber_Negative(value);
            Py_DECREF(value);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-1] = res;
            break;
        }

        case _UNARY_NOT: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            assert(PyBool_Check(value));
            res = Py_IsFalse(value) ? Py_True : Py_False;
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            int err = PyObject_IsTrue(value);
            Py_DECREF(value);
            if (err < 0) JUMP_TO_ERROR();
            res = err ? Py_True : Py_False;
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_BOOL: {
            PyObject *value;
            value = stack_pointer[-1];
            if (!PyBool_Check(value)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            break;
        }

        case _TO_BOOL_INT: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            if (!PyLong_CheckExact(value)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            if (_PyLong_IsZero((PyLongObject *)value)) {
                assert(_Py_IsImmortal(value));
                res = Py_False;
            }
            else {
                Py_DECREF(value);
                res = Py_True;
            }
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_LIST: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            if (!PyList_CheckExact(value)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            res = Py_SIZE(value) ? Py_True : Py_False;
            Py_DECREF(value);
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_NONE: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            // This one is a bit weird, because we expect *some* failures:
            if (!Py_IsNone(value)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            res = Py_False;
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_STR: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            if (!PyUnicode_CheckExact(value)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(TO_BOOL, hit);
            if (value == &_Py_STR(empty)) {
                assert(_Py_IsImmortal(value));
                res = Py_False;
            }
            else {
                assert(Py_SIZE(value));
                Py_DECREF(value);
                res = Py_True;
            }
            stack_pointer[-1] = res;
            break;
        }

        case _REPLACE_WITH_TRUE: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            Py_DECREF(value);
            res = Py_True;
            stack_pointer[-1] = res;
            break;
        }

        case _UNARY_INVERT: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            res = PyNumber_Invert(value);
            Py_DECREF(value);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-1] = res;
            break;
        }

        case _GUARD_BOTH_INT: {
            PyObject *right;
            PyObject *left;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (!PyLong_CheckExact(left)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyLong_CheckExact(right)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _BINARY_OP_MULTIPLY_INT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            res = _PyLong_Multiply((PyLongObject *)left, (PyLongObject *)right);
            _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
            _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_ADD_INT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            res = _PyLong_Add((PyLongObject *)left, (PyLongObject *)right);
            _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
            _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_SUBTRACT_INT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            res = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right);
            _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
            _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _GUARD_BOTH_FLOAT: {
            PyObject *right;
            PyObject *left;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (!PyFloat_CheckExact(left)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyFloat_CheckExact(right)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left)->ob_fval *
            ((PyFloatObject *)right)->ob_fval;
            DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dres, res);
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_ADD_FLOAT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left)->ob_fval +
            ((PyFloatObject *)right)->ob_fval;
            DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dres, res);
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            double dres =
            ((PyFloatObject *)left)->ob_fval -
            ((PyFloatObject *)right)->ob_fval;
            DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dres, res);
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _GUARD_BOTH_UNICODE: {
            PyObject *right;
            PyObject *left;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (!PyUnicode_CheckExact(left)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyUnicode_CheckExact(right)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _BINARY_OP_ADD_UNICODE: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(BINARY_OP, hit);
            res = PyUnicode_Concat(left, right);
            _Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc);
            _Py_DECREF_SPECIALIZED(right, _PyUnicode_ExactDealloc);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR: {
            PyObject *sub;
            PyObject *container;
            PyObject *res;
            sub = stack_pointer[-1];
            container = stack_pointer[-2];
            res = PyObject_GetItem(container, sub);
            Py_DECREF(container);
            Py_DECREF(sub);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SLICE: {
            PyObject *stop;
            PyObject *start;
            PyObject *container;
            PyObject *res;
            stop = stack_pointer[-1];
            start = stack_pointer[-2];
            container = stack_pointer[-3];
            PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop);
            // Can't use ERROR_IF() here, because we haven't
            // DECREF'ed container yet, and we still own slice.
            if (slice == NULL) {
                res = NULL;
            }
            else {
                res = PyObject_GetItem(container, slice);
                Py_DECREF(slice);
            }
            Py_DECREF(container);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        case _STORE_SLICE: {
            PyObject *stop;
            PyObject *start;
            PyObject *container;
            PyObject *v;
            stop = stack_pointer[-1];
            start = stack_pointer[-2];
            container = stack_pointer[-3];
            v = stack_pointer[-4];
            PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop);
            int err;
            if (slice == NULL) {
                err = 1;
            }
            else {
                err = PyObject_SetItem(container, slice, v);
                Py_DECREF(slice);
            }
            Py_DECREF(v);
            Py_DECREF(container);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -4;
            break;
        }

        case _BINARY_SUBSCR_LIST_INT: {
            PyObject *sub;
            PyObject *list;
            PyObject *res;
            sub = stack_pointer[-1];
            list = stack_pointer[-2];
            if (!PyLong_CheckExact(sub)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyList_CheckExact(list)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            // Deopt unless 0 <= sub < PyList_Size(list)
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            if (index >= PyList_GET_SIZE(list)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(BINARY_SUBSCR, hit);
            res = PyList_GET_ITEM(list, index);
            assert(res != NULL);
            Py_INCREF(res);
            _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free);
            Py_DECREF(list);
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR_STR_INT: {
            PyObject *sub;
            PyObject *str;
            PyObject *res;
            sub = stack_pointer[-1];
            str = stack_pointer[-2];
            if (!PyLong_CheckExact(sub)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyUnicode_CheckExact(str)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                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);
                JUMP_TO_JUMP_TARGET();
            }
            // Specialize for reading an ASCII character from any string:
            Py_UCS4 c = PyUnicode_READ_CHAR(str, index);
            if (Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(BINARY_SUBSCR, hit);
            res = (PyObject*)&_Py_SINGLETON(strings).ascii[c];
            _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free);
            Py_DECREF(str);
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR_TUPLE_INT: {
            PyObject *sub;
            PyObject *tuple;
            PyObject *res;
            sub = stack_pointer[-1];
            tuple = stack_pointer[-2];
            if (!PyLong_CheckExact(sub)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyTuple_CheckExact(tuple)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            // Deopt unless 0 <= sub < PyTuple_Size(list)
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                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);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(BINARY_SUBSCR, hit);
            res = PyTuple_GET_ITEM(tuple, index);
            assert(res != NULL);
            Py_INCREF(res);
            _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free);
            Py_DECREF(tuple);
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR_DICT: {
            PyObject *sub;
            PyObject *dict;
            PyObject *res;
            sub = stack_pointer[-1];
            dict = stack_pointer[-2];
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(BINARY_SUBSCR, hit);
            int rc = PyDict_GetItemRef(dict, sub, &res);
            if (rc == 0) {
                _PyErr_SetKeyError(sub);
            }
            Py_DECREF(dict);
            Py_DECREF(sub);
            if (rc <= 0) JUMP_TO_ERROR();
            // not found or error
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

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

        case _LIST_APPEND: {
            PyObject *v;
            PyObject *list;
            oparg = CURRENT_OPARG();
            v = stack_pointer[-1];
            list = stack_pointer[-2 - (oparg-1)];
            if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) JUMP_TO_ERROR();
            stack_pointer += -1;
            break;
        }

        case _SET_ADD: {
            PyObject *v;
            PyObject *set;
            oparg = CURRENT_OPARG();
            v = stack_pointer[-1];
            set = stack_pointer[-2 - (oparg-1)];
            int err = PySet_Add(set, v);
            Py_DECREF(v);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -1;
            break;
        }

        case _STORE_SUBSCR: {
            PyObject *sub;
            PyObject *container;
            PyObject *v;
            sub = stack_pointer[-1];
            container = stack_pointer[-2];
            v = stack_pointer[-3];
            /* container[sub] = v */
            int err = PyObject_SetItem(container, sub, v);
            Py_DECREF(v);
            Py_DECREF(container);
            Py_DECREF(sub);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -3;
            break;
        }

        case _STORE_SUBSCR_LIST_INT: {
            PyObject *sub;
            PyObject *list;
            PyObject *value;
            sub = stack_pointer[-1];
            list = stack_pointer[-2];
            value = stack_pointer[-3];
            if (!PyLong_CheckExact(sub)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyList_CheckExact(list)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            // Ensure nonnegative, zero-or-one-digit ints.
            if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
            // Ensure index < len(list)
            if (index >= PyList_GET_SIZE(list)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(STORE_SUBSCR, hit);
            PyObject *old_value = PyList_GET_ITEM(list, index);
            PyList_SET_ITEM(list, index, value);
            assert(old_value != NULL);
            Py_DECREF(old_value);
            _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free);
            Py_DECREF(list);
            stack_pointer += -3;
            break;
        }

        case _STORE_SUBSCR_DICT: {
            PyObject *sub;
            PyObject *dict;
            PyObject *value;
            sub = stack_pointer[-1];
            dict = stack_pointer[-2];
            value = stack_pointer[-3];
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(STORE_SUBSCR, hit);
            int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value);
            Py_DECREF(dict);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -3;
            break;
        }

        case _DELETE_SUBSCR: {
            PyObject *sub;
            PyObject *container;
            sub = stack_pointer[-1];
            container = stack_pointer[-2];
            /* del container[sub] */
            int err = PyObject_DelItem(container, sub);
            Py_DECREF(container);
            Py_DECREF(sub);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -2;
            break;
        }

        case _CALL_INTRINSIC_1: {
            PyObject *value;
            PyObject *res;
            oparg = CURRENT_OPARG();
            value = stack_pointer[-1];
            assert(oparg <= MAX_INTRINSIC_1);
            res = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, value);
            Py_DECREF(value);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-1] = res;
            break;
        }

        case _CALL_INTRINSIC_2: {
            PyObject *value1;
            PyObject *value2;
            PyObject *res;
            oparg = CURRENT_OPARG();
            value1 = stack_pointer[-1];
            value2 = stack_pointer[-2];
            assert(oparg <= MAX_INTRINSIC_2);
            res = _PyIntrinsics_BinaryFunctions[oparg].func(tstate, value2, value1);
            Py_DECREF(value2);
            Py_DECREF(value1);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _POP_FRAME: {
            PyObject *retval;
            retval = stack_pointer[-1];
            #if TIER_ONE
            assert(frame != &entry_frame);
            #endif
            stack_pointer += -1;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            assert(EMPTY());
            _Py_LeaveRecursiveCallPy(tstate);
            // GH-99729: We need to unlink the frame *before* clearing it:
            _PyInterpreterFrame *dying = frame;
            frame = tstate->current_frame = dying->previous;
            _PyEval_FrameClearAndPop(tstate, dying);
            _PyFrame_StackPush(frame, retval);
            LOAD_SP();
            LOAD_IP(frame->return_offset);
            #if LLTRACE && TIER_ONE
            lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS());
            if (lltrace < 0) {
                goto exit_unwind;
            }
            #endif
            break;
        }

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

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

        case _GET_AITER: {
            PyObject *obj;
            PyObject *iter;
            obj = stack_pointer[-1];
            unaryfunc getter = NULL;
            PyTypeObject *type = Py_TYPE(obj);
            if (type->tp_as_async != NULL) {
                getter = type->tp_as_async->am_aiter;
            }
            if (getter == NULL) {
                _PyErr_Format(tstate, PyExc_TypeError,
                              "'async for' requires an object with "
                              "__aiter__ method, got %.100s",
                              type->tp_name);
                Py_DECREF(obj);
                if (true) JUMP_TO_ERROR();
            }
            iter = (*getter)(obj);
            Py_DECREF(obj);
            if (iter == NULL) JUMP_TO_ERROR();
            if (Py_TYPE(iter)->tp_as_async == NULL ||
                Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
                _PyErr_Format(tstate, PyExc_TypeError,
                              "'async for' received an object from __aiter__ "
                              "that does not implement __anext__: %.100s",
                              Py_TYPE(iter)->tp_name);
                Py_DECREF(iter);
                if (true) JUMP_TO_ERROR();
            }
            stack_pointer[-1] = iter;
            break;
        }

        case _GET_ANEXT: {
            PyObject *aiter;
            PyObject *awaitable;
            aiter = stack_pointer[-1];
            unaryfunc getter = NULL;
            PyObject *next_iter = NULL;
            PyTypeObject *type = Py_TYPE(aiter);
            if (PyAsyncGen_CheckExact(aiter)) {
                awaitable = type->tp_as_async->am_anext(aiter);
                if (awaitable == NULL) {
                    JUMP_TO_ERROR();
                }
            } else {
                if (type->tp_as_async != NULL){
                    getter = type->tp_as_async->am_anext;
                }
                if (getter != NULL) {
                    next_iter = (*getter)(aiter);
                    if (next_iter == NULL) {
                        JUMP_TO_ERROR();
                    }
                }
                else {
                    _PyErr_Format(tstate, PyExc_TypeError,
                                  "'async for' requires an iterator with "
                                  "__anext__ method, got %.100s",
                                  type->tp_name);
                    JUMP_TO_ERROR();
                }
                awaitable = _PyCoro_GetAwaitableIter(next_iter);
                if (awaitable == NULL) {
                    _PyErr_FormatFromCause(
                        PyExc_TypeError,
                        "'async for' received an invalid object "
                        "from __anext__: %.100s",
                        Py_TYPE(next_iter)->tp_name);
                    Py_DECREF(next_iter);
                    JUMP_TO_ERROR();
                } else {
                    Py_DECREF(next_iter);
                }
            }
            stack_pointer[0] = awaitable;
            stack_pointer += 1;
            break;
        }

        case _GET_AWAITABLE: {
            PyObject *iterable;
            PyObject *iter;
            oparg = CURRENT_OPARG();
            iterable = stack_pointer[-1];
            iter = _PyCoro_GetAwaitableIter(iterable);
            if (iter == NULL) {
                _PyEval_FormatAwaitableError(tstate, Py_TYPE(iterable), oparg);
            }
            Py_DECREF(iterable);
            if (iter != NULL && PyCoro_CheckExact(iter)) {
                PyObject *yf = _PyGen_yf((PyGenObject*)iter);
                if (yf != NULL) {
                    /* `iter` is a coroutine object that is being
                       awaited, `yf` is a pointer to the current awaitable
                       being awaited on. */
                    Py_DECREF(yf);
                    Py_CLEAR(iter);
                    _PyErr_SetString(tstate, PyExc_RuntimeError,
                                     "coroutine is being awaited already");
                    /* The code below jumps to `error` if `iter` is NULL. */
                }
            }
            if (iter == NULL) JUMP_TO_ERROR();
            stack_pointer[-1] = iter;
            break;
        }

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

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

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

        case _POP_EXCEPT: {
            PyObject *exc_value;
            exc_value = stack_pointer[-1];
            _PyErr_StackItem *exc_info = tstate->exc_info;
            Py_XSETREF(exc_info->exc_value, exc_value == Py_None ? NULL : exc_value);
            stack_pointer += -1;
            break;
        }

        case _LOAD_ASSERTION_ERROR: {
            PyObject *value;
            value = Py_NewRef(PyExc_AssertionError);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_BUILD_CLASS: {
            PyObject *bc;
            if (PyMapping_GetOptionalItem(BUILTINS(), &_Py_ID(__build_class__), &bc) < 0) JUMP_TO_ERROR();
            if (bc == NULL) {
                _PyErr_SetString(tstate, PyExc_NameError,
                                 "__build_class__ not found");
                if (true) JUMP_TO_ERROR();
            }
            stack_pointer[0] = bc;
            stack_pointer += 1;
            break;
        }

        case _STORE_NAME: {
            PyObject *v;
            oparg = CURRENT_OPARG();
            v = stack_pointer[-1];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            PyObject *ns = LOCALS();
            int err;
            if (ns == NULL) {
                _PyErr_Format(tstate, PyExc_SystemError,
                              "no locals found when storing %R", name);
                Py_DECREF(v);
                if (true) JUMP_TO_ERROR();
            }
            if (PyDict_CheckExact(ns))
            err = PyDict_SetItem(ns, name, v);
            else
            err = PyObject_SetItem(ns, name, v);
            Py_DECREF(v);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -1;
            break;
        }

        case _DELETE_NAME: {
            oparg = CURRENT_OPARG();
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            PyObject *ns = LOCALS();
            int err;
            if (ns == NULL) {
                _PyErr_Format(tstate, PyExc_SystemError,
                              "no locals when deleting %R", name);
                JUMP_TO_ERROR();
            }
            err = PyObject_DelItem(ns, name);
            // Can't use ERROR_IF here.
            if (err != 0) {
                _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
                    NAME_ERROR_MSG,
                    name);
                JUMP_TO_ERROR();
            }
            break;
        }

        case _UNPACK_SEQUENCE: {
            PyObject *seq;
            oparg = CURRENT_OPARG();
            seq = stack_pointer[-1];
            PyObject **top = stack_pointer + oparg - 1;
            int res = _PyEval_UnpackIterable(tstate, seq, oparg, -1, top);
            Py_DECREF(seq);
            if (res == 0) JUMP_TO_ERROR();
            stack_pointer += -1 + oparg;
            break;
        }

        case _UNPACK_SEQUENCE_TWO_TUPLE: {
            PyObject *seq;
            PyObject *val1;
            PyObject *val0;
            oparg = CURRENT_OPARG();
            seq = stack_pointer[-1];
            assert(oparg == 2);
            if (!PyTuple_CheckExact(seq)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyTuple_GET_SIZE(seq) != 2) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(UNPACK_SEQUENCE, hit);
            val0 = Py_NewRef(PyTuple_GET_ITEM(seq, 0));
            val1 = Py_NewRef(PyTuple_GET_ITEM(seq, 1));
            Py_DECREF(seq);
            stack_pointer[-1] = val1;
            stack_pointer[0] = val0;
            stack_pointer += 1;
            break;
        }

        case _UNPACK_SEQUENCE_TUPLE: {
            PyObject *seq;
            PyObject **values;
            oparg = CURRENT_OPARG();
            seq = stack_pointer[-1];
            values = &stack_pointer[-1];
            if (!PyTuple_CheckExact(seq)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyTuple_GET_SIZE(seq) != oparg) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(UNPACK_SEQUENCE, hit);
            PyObject **items = _PyTuple_ITEMS(seq);
            for (int i = oparg; --i >= 0; ) {
                *values++ = Py_NewRef(items[i]);
            }
            Py_DECREF(seq);
            stack_pointer += -1 + oparg;
            break;
        }

        case _UNPACK_SEQUENCE_LIST: {
            PyObject *seq;
            PyObject **values;
            oparg = CURRENT_OPARG();
            seq = stack_pointer[-1];
            values = &stack_pointer[-1];
            if (!PyList_CheckExact(seq)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyList_GET_SIZE(seq) != oparg) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(UNPACK_SEQUENCE, hit);
            PyObject **items = _PyList_ITEMS(seq);
            for (int i = oparg; --i >= 0; ) {
                *values++ = Py_NewRef(items[i]);
            }
            Py_DECREF(seq);
            stack_pointer += -1 + oparg;
            break;
        }

        case _UNPACK_EX: {
            PyObject *seq;
            oparg = CURRENT_OPARG();
            seq = stack_pointer[-1];
            int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
            PyObject **top = stack_pointer + totalargs - 1;
            int res = _PyEval_UnpackIterable(tstate, seq, oparg & 0xFF, oparg >> 8, top);
            Py_DECREF(seq);
            if (res == 0) JUMP_TO_ERROR();
            stack_pointer += (oparg >> 8) + (oparg & 0xFF);
            break;
        }

        case _STORE_ATTR: {
            PyObject *owner;
            PyObject *v;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            v = stack_pointer[-2];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            int err = PyObject_SetAttr(owner, name, v);
            Py_DECREF(v);
            Py_DECREF(owner);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -2;
            break;
        }

        case _DELETE_ATTR: {
            PyObject *owner;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            int err = PyObject_DelAttr(owner, name);
            Py_DECREF(owner);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -1;
            break;
        }

        case _STORE_GLOBAL: {
            PyObject *v;
            oparg = CURRENT_OPARG();
            v = stack_pointer[-1];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            int err = PyDict_SetItem(GLOBALS(), name, v);
            Py_DECREF(v);
            if (err) JUMP_TO_ERROR();
            stack_pointer += -1;
            break;
        }

        case _DELETE_GLOBAL: {
            oparg = CURRENT_OPARG();
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            int err = PyDict_Pop(GLOBALS(), name, NULL);
            // Can't use ERROR_IF here.
            if (err < 0) {
                JUMP_TO_ERROR();
            }
            if (err == 0) {
                _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
                    NAME_ERROR_MSG, name);
                JUMP_TO_ERROR();
            }
            break;
        }

        case _LOAD_LOCALS: {
            PyObject *locals;
            locals = LOCALS();
            if (locals == NULL) {
                _PyErr_SetString(tstate, PyExc_SystemError,
                                 "no locals found");
                if (true) JUMP_TO_ERROR();
            }
            Py_INCREF(locals);
            stack_pointer[0] = locals;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FROM_DICT_OR_GLOBALS: {
            PyObject *mod_or_class_dict;
            PyObject *v;
            oparg = CURRENT_OPARG();
            mod_or_class_dict = stack_pointer[-1];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
            if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) {
                JUMP_TO_ERROR();
            }
            if (v == NULL) {
                if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
                    JUMP_TO_ERROR();
                }
                if (v == NULL) {
                    if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
                        JUMP_TO_ERROR();
                    }
                    if (v == NULL) {
                        _PyEval_FormatExcCheckArg(
                            tstate, PyExc_NameError,
                            NAME_ERROR_MSG, name);
                        JUMP_TO_ERROR();
                    }
                }
            }
            Py_DECREF(mod_or_class_dict);
            stack_pointer[-1] = v;
            break;
        }

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

        case _LOAD_GLOBAL: {
            PyObject *res;
            PyObject *null = NULL;
            oparg = CURRENT_OPARG();
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
            if (PyDict_CheckExact(GLOBALS())
                && PyDict_CheckExact(BUILTINS()))
            {
                res = _PyDict_LoadGlobal((PyDictObject *)GLOBALS(),
                    (PyDictObject *)BUILTINS(),
                    name);
                if (res == NULL) {
                    if (!_PyErr_Occurred(tstate)) {
                        /* _PyDict_LoadGlobal() returns NULL without raising
                         * an exception if the key doesn't exist */
                        _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
                            NAME_ERROR_MSG, name);
                    }
                    if (true) JUMP_TO_ERROR();
                }
            }
            else {
                /* Slow-path if globals or builtins is not a dict */
                /* namespace 1: globals */
                if (PyMapping_GetOptionalItem(GLOBALS(), name, &res) < 0) JUMP_TO_ERROR();
                if (res == NULL) {
                    /* namespace 2: builtins */
                    if (PyMapping_GetOptionalItem(BUILTINS(), name, &res) < 0) JUMP_TO_ERROR();
                    if (res == NULL) {
                        _PyEval_FormatExcCheckArg(
                            tstate, PyExc_NameError,
                            NAME_ERROR_MSG, name);
                        if (true) JUMP_TO_ERROR();
                    }
                }
            }
            null = NULL;
            stack_pointer[0] = res;
            if (oparg & 1) stack_pointer[1] = null;
            stack_pointer += 1 + (oparg & 1);
            break;
        }

        case _GUARD_GLOBALS_VERSION: {
            uint16_t version = (uint16_t)CURRENT_OPERAND();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (dict->ma_keys->dk_version != version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            assert(DK_IS_UNICODE(dict->ma_keys));
            break;
        }

        case _GUARD_BUILTINS_VERSION: {
            uint16_t version = (uint16_t)CURRENT_OPERAND();
            PyDictObject *dict = (PyDictObject *)BUILTINS();
            if (!PyDict_CheckExact(dict)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (dict->ma_keys->dk_version != version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            assert(DK_IS_UNICODE(dict->ma_keys));
            break;
        }

        case _LOAD_GLOBAL_MODULE: {
            PyObject *res;
            PyObject *null = NULL;
            oparg = CURRENT_OPARG();
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            PyDictObject *dict = (PyDictObject *)GLOBALS();
            PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
            res = entries[index].me_value;
            if (res == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            Py_INCREF(res);
            STAT_INC(LOAD_GLOBAL, hit);
            null = NULL;
            stack_pointer[0] = res;
            if (oparg & 1) stack_pointer[1] = null;
            stack_pointer += 1 + (oparg & 1);
            break;
        }

        case _LOAD_GLOBAL_BUILTINS: {
            PyObject *res;
            PyObject *null = NULL;
            oparg = CURRENT_OPARG();
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            PyDictObject *bdict = (PyDictObject *)BUILTINS();
            PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(bdict->ma_keys);
            res = entries[index].me_value;
            if (res == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            Py_INCREF(res);
            STAT_INC(LOAD_GLOBAL, hit);
            null = NULL;
            stack_pointer[0] = res;
            if (oparg & 1) stack_pointer[1] = null;
            stack_pointer += 1 + (oparg & 1);
            break;
        }

        case _DELETE_FAST: {
            oparg = CURRENT_OPARG();
            PyObject *v = GETLOCAL(oparg);
            if (v == NULL) {
                _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
                    UNBOUNDLOCAL_ERROR_MSG,
                    PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
                );
                if (1) JUMP_TO_ERROR();
            }
            SETLOCAL(oparg, NULL);
            break;
        }

        case _MAKE_CELL: {
            oparg = CURRENT_OPARG();
            // "initial" is probably NULL but not if it's an arg (or set
            // via PyFrame_LocalsToFast() before MAKE_CELL has run).
            PyObject *initial = GETLOCAL(oparg);
            PyObject *cell = PyCell_New(initial);
            if (cell == NULL) {
                JUMP_TO_ERROR();
            }
            SETLOCAL(oparg, cell);
            break;
        }

        case _DELETE_DEREF: {
            oparg = CURRENT_OPARG();
            PyObject *cell = GETLOCAL(oparg);
            // Can't use ERROR_IF here.
            // Fortunately we don't need its superpower.
            PyObject *oldobj = PyCell_SwapTakeRef((PyCellObject *)cell, NULL);
            if (oldobj == NULL) {
                _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
                JUMP_TO_ERROR();
            }
            Py_DECREF(oldobj);
            break;
        }

        case _LOAD_FROM_DICT_OR_DEREF: {
            PyObject *class_dict;
            PyObject *value;
            oparg = CURRENT_OPARG();
            class_dict = stack_pointer[-1];
            PyObject *name;
            assert(class_dict);
            assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus);
            name = PyTuple_GET_ITEM(_PyFrame_GetCode(frame)->co_localsplusnames, oparg);
            if (PyMapping_GetOptionalItem(class_dict, name, &value) < 0) {
                JUMP_TO_ERROR();
            }
            if (!value) {
                PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg);
                value = PyCell_GetRef(cell);
                if (value == NULL) {
                    _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
                    JUMP_TO_ERROR();
                }
            }
            Py_DECREF(class_dict);
            stack_pointer[-1] = value;
            break;
        }

        case _LOAD_DEREF: {
            PyObject *value;
            oparg = CURRENT_OPARG();
            PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg);
            value = PyCell_GetRef(cell);
            if (value == NULL) {
                _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
                if (true) JUMP_TO_ERROR();
            }
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _STORE_DEREF: {
            PyObject *v;
            oparg = CURRENT_OPARG();
            v = stack_pointer[-1];
            PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg);
            PyCell_SetTakeRef(cell, v);
            stack_pointer += -1;
            break;
        }

        case _COPY_FREE_VARS: {
            oparg = CURRENT_OPARG();
            /* Copy closure variables to free variables */
            PyCodeObject *co = _PyFrame_GetCode(frame);
            assert(PyFunction_Check(frame->f_funcobj));
            PyObject *closure = ((PyFunctionObject *)frame->f_funcobj)->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] = Py_NewRef(o);
            }
            break;
        }

        case _BUILD_STRING: {
            PyObject **pieces;
            PyObject *str;
            oparg = CURRENT_OPARG();
            pieces = &stack_pointer[-oparg];
            str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg);
            for (int _i = oparg; --_i >= 0;) {
                Py_DECREF(pieces[_i]);
            }
            if (str == NULL) JUMP_TO_ERROR();
            stack_pointer[-oparg] = str;
            stack_pointer += 1 - oparg;
            break;
        }

        case _BUILD_TUPLE: {
            PyObject **values;
            PyObject *tup;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg];
            tup = _PyTuple_FromArraySteal(values, oparg);
            if (tup == NULL) JUMP_TO_ERROR();
            stack_pointer[-oparg] = tup;
            stack_pointer += 1 - oparg;
            break;
        }

        case _BUILD_LIST: {
            PyObject **values;
            PyObject *list;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg];
            list = _PyList_FromArraySteal(values, oparg);
            if (list == NULL) JUMP_TO_ERROR();
            stack_pointer[-oparg] = list;
            stack_pointer += 1 - oparg;
            break;
        }

        case _LIST_EXTEND: {
            PyObject *iterable;
            PyObject *list;
            oparg = CURRENT_OPARG();
            iterable = stack_pointer[-1];
            list = stack_pointer[-2 - (oparg-1)];
            PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
            if (none_val == NULL) {
                if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
                    (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
                {
                    _PyErr_Clear(tstate);
                    _PyErr_Format(tstate, PyExc_TypeError,
                                  "Value after * must be an iterable, not %.200s",
                                  Py_TYPE(iterable)->tp_name);
                }
                Py_DECREF(iterable);
                if (true) JUMP_TO_ERROR();
            }
            assert(Py_IsNone(none_val));
            Py_DECREF(iterable);
            stack_pointer += -1;
            break;
        }

        case _SET_UPDATE: {
            PyObject *iterable;
            PyObject *set;
            oparg = CURRENT_OPARG();
            iterable = stack_pointer[-1];
            set = stack_pointer[-2 - (oparg-1)];
            int err = _PySet_Update(set, iterable);
            Py_DECREF(iterable);
            if (err < 0) JUMP_TO_ERROR();
            stack_pointer += -1;
            break;
        }

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

        case _BUILD_MAP: {
            PyObject **values;
            PyObject *map;
            oparg = CURRENT_OPARG();
            values = &stack_pointer[-oparg*2];
            map = _PyDict_FromItems(
                                    values, 2,
                                    values+1, 2,
                                    oparg);
            for (int _i = oparg*2; --_i >= 0;) {
                Py_DECREF(values[_i]);
            }
            if (map == NULL) JUMP_TO_ERROR();
            stack_pointer[-oparg*2] = map;
            stack_pointer += 1 - oparg*2;
            break;
        }

        case _SETUP_ANNOTATIONS: {
            int err;
            PyObject *ann_dict;
            if (LOCALS() == NULL) {
                _PyErr_Format(tstate, PyExc_SystemError,
                              "no locals found when setting up annotations");
                if (true) JUMP_TO_ERROR();
            }
            /* check if __annotations__ in locals()... */
            if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) JUMP_TO_ERROR();
            if (ann_dict == NULL) {
                ann_dict = PyDict_New();
                if (ann_dict == NULL) JUMP_TO_ERROR();
                err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
                                       ann_dict);
                Py_DECREF(ann_dict);
                if (err) JUMP_TO_ERROR();
            }
            else {
                Py_DECREF(ann_dict);
            }
            break;
        }

        case _BUILD_CONST_KEY_MAP: {
            PyObject *keys;
            PyObject **values;
            PyObject *map;
            oparg = CURRENT_OPARG();
            keys = stack_pointer[-1];
            values = &stack_pointer[-1 - oparg];
            assert(PyTuple_CheckExact(keys));
            assert(PyTuple_GET_SIZE(keys) == (Py_ssize_t)oparg);
            map = _PyDict_FromItems(
                                    &PyTuple_GET_ITEM(keys, 0), 1,
                                    values, 1, oparg);
            for (int _i = oparg; --_i >= 0;) {
                Py_DECREF(values[_i]);
            }
            Py_DECREF(keys);
            if (map == NULL) JUMP_TO_ERROR();
            stack_pointer[-1 - oparg] = map;
            stack_pointer += -oparg;
            break;
        }

        case _DICT_UPDATE: {
            PyObject *update;
            PyObject *dict;
            oparg = CURRENT_OPARG();
            update = stack_pointer[-1];
            dict = stack_pointer[-2 - (oparg - 1)];
            if (PyDict_Update(dict, update) < 0) {
                if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
                    _PyErr_Format(tstate, PyExc_TypeError,
                                  "'%.200s' object is not a mapping",
                                  Py_TYPE(update)->tp_name);
                }
                Py_DECREF(update);
                if (true) JUMP_TO_ERROR();
            }
            Py_DECREF(update);
            stack_pointer += -1;
            break;
        }

        case _DICT_MERGE: {
            PyObject *update;
            PyObject *dict;
            PyObject *callable;
            oparg = CURRENT_OPARG();
            update = stack_pointer[-1];
            dict = stack_pointer[-2 - (oparg - 1)];
            callable = stack_pointer[-5 - (oparg - 1)];
            if (_PyDict_MergeEx(dict, update, 2) < 0) {
                _PyEval_FormatKwargsError(tstate, callable, update);
                Py_DECREF(update);
                if (true) JUMP_TO_ERROR();
            }
            Py_DECREF(update);
            stack_pointer += -1;
            break;
        }

        case _MAP_ADD: {
            PyObject *value;
            PyObject *key;
            PyObject *dict;
            oparg = CURRENT_OPARG();
            value = stack_pointer[-1];
            key = stack_pointer[-2];
            dict = stack_pointer[-3 - (oparg - 1)];
            assert(PyDict_CheckExact(dict));
            /* dict[key] = value */
            // Do not DECREF INPUTS because the function steals the references
            if (_PyDict_SetItem_Take2((PyDictObject *)dict, key, value) != 0) JUMP_TO_ERROR();
            stack_pointer += -2;
            break;
        }

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

        case _LOAD_SUPER_ATTR_ATTR: {
            PyObject *self;
            PyObject *class;
            PyObject *global_super;
            PyObject *attr;
            oparg = CURRENT_OPARG();
            self = stack_pointer[-1];
            class = stack_pointer[-2];
            global_super = stack_pointer[-3];
            assert(!(oparg & 1));
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_SUPER_ATTR, hit);
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
            attr = _PySuper_Lookup((PyTypeObject *)class, self, name, NULL);
            Py_DECREF(global_super);
            Py_DECREF(class);
            Py_DECREF(self);
            if (attr == NULL) JUMP_TO_ERROR();
            stack_pointer[-3] = attr;
            stack_pointer += -2;
            break;
        }

        case _LOAD_SUPER_ATTR_METHOD: {
            PyObject *self;
            PyObject *class;
            PyObject *global_super;
            PyObject *attr;
            PyObject *self_or_null;
            oparg = CURRENT_OPARG();
            self = stack_pointer[-1];
            class = stack_pointer[-2];
            global_super = stack_pointer[-3];
            assert(oparg & 1);
            if (global_super != (PyObject *)&PySuper_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyType_Check(class)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_SUPER_ATTR, hit);
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
            PyTypeObject *cls = (PyTypeObject *)class;
            int method_found = 0;
            attr = _PySuper_Lookup(cls, self, name,
                                   Py_TYPE(self)->tp_getattro == PyObject_GenericGetAttr ? &method_found : NULL);
            Py_DECREF(global_super);
            Py_DECREF(class);
            if (attr == NULL) {
                Py_DECREF(self);
                if (true) JUMP_TO_ERROR();
            }
            if (method_found) {
                self_or_null = self; // transfer ownership
            } else {
                Py_DECREF(self);
                self_or_null = NULL;
            }
            stack_pointer[-3] = attr;
            stack_pointer[-2] = self_or_null;
            stack_pointer += -1;
            break;
        }

        case _LOAD_ATTR: {
            PyObject *owner;
            PyObject *attr;
            PyObject *self_or_null = NULL;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
            if (oparg & 1) {
                /* Designed to work in tandem with CALL, pushes two values. */
                attr = NULL;
                if (_PyObject_GetMethod(owner, name, &attr)) {
                    /* We can bypass temporary bound method object.
                       meth is unbound method and obj is self.
                       meth | self | arg1 | ... | argN
                     */
                    assert(attr != NULL);  // No errors on this branch
                    self_or_null = owner;  // Transfer ownership
                }
                else {
                    /* meth is not an unbound method (but a regular attr, or
                       something was returned by a descriptor protocol).  Set
                       the second element of the stack to NULL, to signal
                       CALL that it's not a method call.
                       meth | NULL | arg1 | ... | argN
                     */
                    Py_DECREF(owner);
                    if (attr == NULL) JUMP_TO_ERROR();
                    self_or_null = NULL;
                }
            }
            else {
                /* Classic, pushes one value. */
                attr = PyObject_GetAttr(owner, name);
                Py_DECREF(owner);
                if (attr == NULL) JUMP_TO_ERROR();
            }
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = self_or_null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _GUARD_TYPE_VERSION: {
            PyObject *owner;
            owner = stack_pointer[-1];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND();
            PyTypeObject *tp = Py_TYPE(owner);
            assert(type_version != 0);
            if (tp->tp_version_tag != type_version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _CHECK_MANAGED_OBJECT_HAS_VALUES: {
            PyObject *owner;
            owner = stack_pointer[-1];
            assert(Py_TYPE(owner)->tp_dictoffset < 0);
            assert(Py_TYPE(owner)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (!_PyObject_InlineValues(owner)->valid) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _LOAD_ATTR_INSTANCE_VALUE_0: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            (void)null;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            attr = _PyObject_InlineValues(owner)->values[index];
            if (attr == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            Py_INCREF(attr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            break;
        }

        case _LOAD_ATTR_INSTANCE_VALUE_1: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            (void)null;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            attr = _PyObject_InlineValues(owner)->values[index];
            if (attr == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            Py_INCREF(attr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            stack_pointer[0] = null;
            stack_pointer += 1;
            break;
        }

        /* _LOAD_ATTR_INSTANCE_VALUE is split on (oparg & 1) */

        case _CHECK_ATTR_MODULE: {
            PyObject *owner;
            owner = stack_pointer[-1];
            uint32_t dict_version = (uint32_t)CURRENT_OPERAND();
            if (!PyModule_CheckExact(owner)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict;
            assert(dict != NULL);
            if (dict->ma_keys->dk_version != dict_version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _LOAD_ATTR_MODULE: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict;
            assert(dict->ma_keys->dk_kind == DICT_KEYS_UNICODE);
            assert(index < dict->ma_keys->dk_nentries);
            PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dict->ma_keys) + index;
            attr = ep->me_value;
            if (attr == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            Py_INCREF(attr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _CHECK_ATTR_WITH_HINT: {
            PyObject *owner;
            owner = stack_pointer[-1];
            assert(Py_TYPE(owner)->tp_flags & Py_TPFLAGS_MANAGED_DICT);
            PyManagedDictPointer *managed_dict = _PyObject_ManagedDictPointer(owner);
            PyDictObject *dict = managed_dict->dict;
            if (dict == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            assert(PyDict_CheckExact((PyObject *)dict));
            break;
        }

        case _LOAD_ATTR_WITH_HINT: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            uint16_t hint = (uint16_t)CURRENT_OPERAND();
            PyManagedDictPointer *managed_dict = _PyObject_ManagedDictPointer(owner);
            PyDictObject *dict = managed_dict->dict;
            if (hint >= (size_t)dict->ma_keys->dk_nentries) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
            if (DK_IS_UNICODE(dict->ma_keys)) {
                PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dict->ma_keys) + hint;
                if (ep->me_key != name) {
                    UOP_STAT_INC(uopcode, miss);
                    JUMP_TO_JUMP_TARGET();
                }
                attr = ep->me_value;
            }
            else {
                PyDictKeyEntry *ep = DK_ENTRIES(dict->ma_keys) + hint;
                if (ep->me_key != name) {
                    UOP_STAT_INC(uopcode, miss);
                    JUMP_TO_JUMP_TARGET();
                }
                attr = ep->me_value;
            }
            if (attr == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            Py_INCREF(attr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _LOAD_ATTR_SLOT_0: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            (void)null;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            char *addr = (char *)owner + index;
            attr = *(PyObject **)addr;
            if (attr == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            Py_INCREF(attr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            break;
        }

        case _LOAD_ATTR_SLOT_1: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            (void)null;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            char *addr = (char *)owner + index;
            attr = *(PyObject **)addr;
            if (attr == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(LOAD_ATTR, hit);
            Py_INCREF(attr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            stack_pointer[0] = null;
            stack_pointer += 1;
            break;
        }

        /* _LOAD_ATTR_SLOT is split on (oparg & 1) */

        case _CHECK_ATTR_CLASS: {
            PyObject *owner;
            owner = stack_pointer[-1];
            uint32_t type_version = (uint32_t)CURRENT_OPERAND();
            if (!PyType_Check(owner)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            assert(type_version != 0);
            if (((PyTypeObject *)owner)->tp_version_tag != type_version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _LOAD_ATTR_CLASS_0: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            (void)null;
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            attr = Py_NewRef(descr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            break;
        }

        case _LOAD_ATTR_CLASS_1: {
            PyObject *owner;
            PyObject *attr;
            PyObject *null = NULL;
            (void)null;
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            attr = Py_NewRef(descr);
            null = NULL;
            Py_DECREF(owner);
            stack_pointer[-1] = attr;
            stack_pointer[0] = null;
            stack_pointer += 1;
            break;
        }

        /* _LOAD_ATTR_CLASS is split on (oparg & 1) */

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

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

        case _GUARD_DORV_NO_DICT: {
            PyObject *owner;
            owner = stack_pointer[-1];
            assert(Py_TYPE(owner)->tp_dictoffset < 0);
            assert(Py_TYPE(owner)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (_PyObject_ManagedDictPointer(owner)->dict) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (_PyObject_InlineValues(owner)->valid == 0) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _STORE_ATTR_INSTANCE_VALUE: {
            PyObject *owner;
            PyObject *value;
            owner = stack_pointer[-1];
            value = stack_pointer[-2];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            STAT_INC(STORE_ATTR, hit);
            assert(_PyObject_ManagedDictPointer(owner)->dict == NULL);
            PyDictValues *values = _PyObject_InlineValues(owner);
            PyObject *old_value = values->values[index];
            values->values[index] = value;
            if (old_value == NULL) {
                _PyDictValues_AddToInsertionOrder(values, index);
            }
            else {
                Py_DECREF(old_value);
            }
            Py_DECREF(owner);
            stack_pointer += -2;
            break;
        }

        /* _STORE_ATTR_WITH_HINT is not a viable micro-op for tier 2 because it has unused cache entries */

        case _STORE_ATTR_SLOT: {
            PyObject *owner;
            PyObject *value;
            owner = stack_pointer[-1];
            value = stack_pointer[-2];
            uint16_t index = (uint16_t)CURRENT_OPERAND();
            char *addr = (char *)owner + index;
            STAT_INC(STORE_ATTR, hit);
            PyObject *old_value = *(PyObject **)addr;
            *(PyObject **)addr = value;
            Py_XDECREF(old_value);
            Py_DECREF(owner);
            stack_pointer += -2;
            break;
        }

        case _COMPARE_OP: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            assert((oparg >> 5) <= Py_GE);
            res = PyObject_RichCompare(left, right, oparg >> 5);
            Py_DECREF(left);
            Py_DECREF(right);
            if (res == NULL) JUMP_TO_ERROR();
            if (oparg & 16) {
                int res_bool = PyObject_IsTrue(res);
                Py_DECREF(res);
                if (res_bool < 0) JUMP_TO_ERROR();
                res = res_bool ? Py_True : Py_False;
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COMPARE_OP_FLOAT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(COMPARE_OP, hit);
            double dleft = PyFloat_AS_DOUBLE(left);
            double dright = PyFloat_AS_DOUBLE(right);
            // 1 if NaN, 2 if <, 4 if >, 8 if ==; this matches low four bits of the oparg
            int sign_ish = COMPARISON_BIT(dleft, dright);
            _Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
            _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
            res = (sign_ish & oparg) ? Py_True : Py_False;
            // It's always a bool, so we don't care about oparg & 16.
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COMPARE_OP_INT: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (!_PyLong_IsCompact((PyLongObject *)left)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!_PyLong_IsCompact((PyLongObject *)right)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(COMPARE_OP, hit);
            assert(_PyLong_DigitCount((PyLongObject *)left) <= 1 &&
                   _PyLong_DigitCount((PyLongObject *)right) <= 1);
            Py_ssize_t ileft = _PyLong_CompactValue((PyLongObject *)left);
            Py_ssize_t iright = _PyLong_CompactValue((PyLongObject *)right);
            // 2 if <, 4 if >, 8 if ==; this matches the low 4 bits of the oparg
            int sign_ish = COMPARISON_BIT(ileft, iright);
            _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free);
            _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
            res = (sign_ish & oparg) ? Py_True : Py_False;
            // It's always a bool, so we don't care about oparg & 16.
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COMPARE_OP_STR: {
            PyObject *right;
            PyObject *left;
            PyObject *res;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            STAT_INC(COMPARE_OP, hit);
            int eq = _PyUnicode_Equal(left, right);
            assert((oparg >> 5) == Py_EQ || (oparg >> 5) == Py_NE);
            _Py_DECREF_SPECIALIZED(left, _PyUnicode_ExactDealloc);
            _Py_DECREF_SPECIALIZED(right, _PyUnicode_ExactDealloc);
            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) ? Py_True : Py_False;
            // It's always a bool, so we don't care about oparg & 16.
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _IS_OP: {
            PyObject *right;
            PyObject *left;
            PyObject *b;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            int res = Py_Is(left, right) ^ oparg;
            Py_DECREF(left);
            Py_DECREF(right);
            b = res ? Py_True : Py_False;
            stack_pointer[-2] = b;
            stack_pointer += -1;
            break;
        }

        case _CONTAINS_OP: {
            PyObject *right;
            PyObject *left;
            PyObject *b;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            int res = PySequence_Contains(right, left);
            Py_DECREF(left);
            Py_DECREF(right);
            if (res < 0) JUMP_TO_ERROR();
            b = (res ^ oparg) ? Py_True : Py_False;
            stack_pointer[-2] = b;
            stack_pointer += -1;
            break;
        }

        case _CONTAINS_OP_SET: {
            PyObject *right;
            PyObject *left;
            PyObject *b;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (!(PySet_CheckExact(right) || PyFrozenSet_CheckExact(right))) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CONTAINS_OP, hit);
            // Note: both set and frozenset use the same seq_contains method!
            int res = _PySet_Contains((PySetObject *)right, left);
            Py_DECREF(left);
            Py_DECREF(right);
            if (res < 0) JUMP_TO_ERROR();
            b = (res ^ oparg) ? Py_True : Py_False;
            stack_pointer[-2] = b;
            stack_pointer += -1;
            break;
        }

        case _CONTAINS_OP_DICT: {
            PyObject *right;
            PyObject *left;
            PyObject *b;
            oparg = CURRENT_OPARG();
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (!PyDict_CheckExact(right)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CONTAINS_OP, hit);
            int res = PyDict_Contains(right, left);
            Py_DECREF(left);
            Py_DECREF(right);
            if (res < 0) JUMP_TO_ERROR();
            b = (res ^ oparg) ? Py_True : Py_False;
            stack_pointer[-2] = b;
            stack_pointer += -1;
            break;
        }

        case _CHECK_EG_MATCH: {
            PyObject *match_type;
            PyObject *exc_value;
            PyObject *rest;
            PyObject *match;
            match_type = stack_pointer[-1];
            exc_value = stack_pointer[-2];
            if (_PyEval_CheckExceptStarTypeValid(tstate, match_type) < 0) {
                Py_DECREF(exc_value);
                Py_DECREF(match_type);
                if (true) JUMP_TO_ERROR();
            }
            match = NULL;
            rest = NULL;
            int res = _PyEval_ExceptionGroupMatch(exc_value, match_type,
                &match, &rest);
            Py_DECREF(exc_value);
            Py_DECREF(match_type);
            if (res < 0) JUMP_TO_ERROR();
            assert((match == NULL) == (rest == NULL));
            if (match == NULL) JUMP_TO_ERROR();
            if (!Py_IsNone(match)) {
                PyErr_SetHandledException(match);
            }
            stack_pointer[-2] = rest;
            stack_pointer[-1] = match;
            break;
        }

        case _CHECK_EXC_MATCH: {
            PyObject *right;
            PyObject *left;
            PyObject *b;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            assert(PyExceptionInstance_Check(left));
            if (_PyEval_CheckExceptTypeValid(tstate, right) < 0) {
                Py_DECREF(right);
                if (true) JUMP_TO_ERROR();
            }
            int res = PyErr_GivenExceptionMatches(left, right);
            Py_DECREF(right);
            b = res ? Py_True : Py_False;
            stack_pointer[-1] = b;
            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: {
            PyObject *value;
            PyObject *b;
            value = stack_pointer[-1];
            if (Py_IsNone(value)) {
                b = Py_True;
            }
            else {
                b = Py_False;
                Py_DECREF(value);
            }
            stack_pointer[-1] = b;
            break;
        }

        case _GET_LEN: {
            PyObject *obj;
            PyObject *len_o;
            obj = stack_pointer[-1];
            // PUSH(len(TOS))
            Py_ssize_t len_i = PyObject_Length(obj);
            if (len_i < 0) JUMP_TO_ERROR();
            len_o = PyLong_FromSsize_t(len_i);
            if (len_o == NULL) JUMP_TO_ERROR();
            stack_pointer[0] = len_o;
            stack_pointer += 1;
            break;
        }

        case _MATCH_CLASS: {
            PyObject *names;
            PyObject *type;
            PyObject *subject;
            PyObject *attrs;
            oparg = CURRENT_OPARG();
            names = stack_pointer[-1];
            type = stack_pointer[-2];
            subject = stack_pointer[-3];
            // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or
            // None on failure.
            assert(PyTuple_CheckExact(names));
            attrs = _PyEval_MatchClass(tstate, subject, type, oparg, names);
            Py_DECREF(subject);
            Py_DECREF(type);
            Py_DECREF(names);
            if (attrs) {
                assert(PyTuple_CheckExact(attrs));  // Success!
            }
            else {
                if (_PyErr_Occurred(tstate)) JUMP_TO_ERROR();
                // Error!
                attrs = Py_None;  // Failure!
            }
            stack_pointer[-3] = attrs;
            stack_pointer += -2;
            break;
        }

        case _MATCH_MAPPING: {
            PyObject *subject;
            PyObject *res;
            subject = stack_pointer[-1];
            int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
            res = match ? Py_True : Py_False;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _MATCH_SEQUENCE: {
            PyObject *subject;
            PyObject *res;
            subject = stack_pointer[-1];
            int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
            res = match ? Py_True : Py_False;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _MATCH_KEYS: {
            PyObject *keys;
            PyObject *subject;
            PyObject *values_or_none;
            keys = stack_pointer[-1];
            subject = stack_pointer[-2];
            // On successful match, PUSH(values). Otherwise, PUSH(None).
            values_or_none = _PyEval_MatchKeys(tstate, subject, keys);
            if (values_or_none == NULL) JUMP_TO_ERROR();
            stack_pointer[0] = values_or_none;
            stack_pointer += 1;
            break;
        }

        case _GET_ITER: {
            PyObject *iterable;
            PyObject *iter;
            iterable = stack_pointer[-1];
            /* before: [obj]; after [getiter(obj)] */
            iter = PyObject_GetIter(iterable);
            Py_DECREF(iterable);
            if (iter == NULL) JUMP_TO_ERROR();
            stack_pointer[-1] = iter;
            break;
        }

        case _GET_YIELD_FROM_ITER: {
            PyObject *iterable;
            PyObject *iter;
            iterable = stack_pointer[-1];
            /* before: [obj]; after [getiter(obj)] */
            if (PyCoro_CheckExact(iterable)) {
                /* `iterable` is a coroutine */
                if (!(_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
                    /* and it is used in a 'yield from' expression of a
                       regular generator. */
                    _PyErr_SetString(tstate, PyExc_TypeError,
                                     "cannot 'yield from' a coroutine object "
                                     "in a non-coroutine generator");
                    JUMP_TO_ERROR();
                }
                iter = iterable;
            }
            else if (PyGen_CheckExact(iterable)) {
                iter = iterable;
            }
            else {
                /* `iterable` is not a generator. */
                iter = PyObject_GetIter(iterable);
                if (iter == NULL) {
                    JUMP_TO_ERROR();
                }
                Py_DECREF(iterable);
            }
            stack_pointer[-1] = iter;
            break;
        }

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

        case _FOR_ITER_TIER_TWO: {
            PyObject *iter;
            PyObject *next;
            iter = stack_pointer[-1];
            /* before: [iter]; after: [iter, iter()] *or* [] (and jump over END_FOR.) */
            next = (*Py_TYPE(iter)->tp_iternext)(iter);
            if (next == NULL) {
                if (_PyErr_Occurred(tstate)) {
                    if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
                        JUMP_TO_ERROR();
                    }
                    _PyErr_Clear(tstate);
                }
                /* iterator ended normally */
                Py_DECREF(iter);
                STACK_SHRINK(1);
                /* The translator sets the deopt target just past END_FOR */
                if (true) {
                    UOP_STAT_INC(uopcode, miss);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            // Common case: no jump, leave it to the code generator
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

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

        case _ITER_CHECK_LIST: {
            PyObject *iter;
            iter = stack_pointer[-1];
            if (Py_TYPE(iter) != &PyListIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

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

        case _GUARD_NOT_EXHAUSTED_LIST: {
            PyObject *iter;
            iter = stack_pointer[-1];
            _PyListIterObject *it = (_PyListIterObject *)iter;
            assert(Py_TYPE(iter) == &PyListIter_Type);
            PyListObject *seq = it->it_seq;
            if (seq == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if ((size_t)it->it_index >= (size_t)PyList_GET_SIZE(seq)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _ITER_NEXT_LIST: {
            PyObject *iter;
            PyObject *next;
            iter = stack_pointer[-1];
            _PyListIterObject *it = (_PyListIterObject *)iter;
            assert(Py_TYPE(iter) == &PyListIter_Type);
            PyListObject *seq = it->it_seq;
            assert(seq);
            assert(it->it_index < PyList_GET_SIZE(seq));
            next = Py_NewRef(PyList_GET_ITEM(seq, it->it_index++));
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

        case _ITER_CHECK_TUPLE: {
            PyObject *iter;
            iter = stack_pointer[-1];
            if (Py_TYPE(iter) != &PyTupleIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

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

        case _GUARD_NOT_EXHAUSTED_TUPLE: {
            PyObject *iter;
            iter = stack_pointer[-1];
            _PyTupleIterObject *it = (_PyTupleIterObject *)iter;
            assert(Py_TYPE(iter) == &PyTupleIter_Type);
            PyTupleObject *seq = it->it_seq;
            if (seq == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (it->it_index >= PyTuple_GET_SIZE(seq)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _ITER_NEXT_TUPLE: {
            PyObject *iter;
            PyObject *next;
            iter = stack_pointer[-1];
            _PyTupleIterObject *it = (_PyTupleIterObject *)iter;
            assert(Py_TYPE(iter) == &PyTupleIter_Type);
            PyTupleObject *seq = it->it_seq;
            assert(seq);
            assert(it->it_index < PyTuple_GET_SIZE(seq));
            next = Py_NewRef(PyTuple_GET_ITEM(seq, it->it_index++));
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

        case _ITER_CHECK_RANGE: {
            PyObject *iter;
            iter = stack_pointer[-1];
            _PyRangeIterObject *r = (_PyRangeIterObject *)iter;
            if (Py_TYPE(r) != &PyRangeIter_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

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

        case _GUARD_NOT_EXHAUSTED_RANGE: {
            PyObject *iter;
            iter = stack_pointer[-1];
            _PyRangeIterObject *r = (_PyRangeIterObject *)iter;
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            if (r->len <= 0) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _ITER_NEXT_RANGE: {
            PyObject *iter;
            PyObject *next;
            iter = stack_pointer[-1];
            _PyRangeIterObject *r = (_PyRangeIterObject *)iter;
            assert(Py_TYPE(r) == &PyRangeIter_Type);
            assert(r->len > 0);
            long value = r->start;
            r->start = value + r->step;
            r->len--;
            next = PyLong_FromLong(value);
            if (next == NULL) JUMP_TO_ERROR();
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

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

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

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

        case _WITH_EXCEPT_START: {
            PyObject *val;
            PyObject *lasti;
            PyObject *exit_func;
            PyObject *res;
            val = stack_pointer[-1];
            lasti = stack_pointer[-3];
            exit_func = stack_pointer[-4];
            /* At the top of the stack are 4 values:
               - val: TOP = exc_info()
               - unused: SECOND = previous exception
               - lasti: THIRD = lasti of exception in exc_info()
               - exit_func: FOURTH = the context.__exit__ bound method
               We call FOURTH(type(TOP), TOP, GetTraceback(TOP)).
               Then we push the __exit__ return value.
             */
            PyObject *exc, *tb;
            assert(val && PyExceptionInstance_Check(val));
            exc = PyExceptionInstance_Class(val);
            tb = PyException_GetTraceback(val);
            if (tb == NULL) {
                tb = Py_None;
            }
            else {
                Py_DECREF(tb);
            }
            assert(PyLong_Check(lasti));
            (void)lasti; // Shut up compiler warning if asserts are off
            PyObject *stack[4] = {NULL, exc, val, tb};
            res = PyObject_Vectorcall(exit_func, stack + 1,
                                      3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _PUSH_EXC_INFO: {
            PyObject *new_exc;
            PyObject *prev_exc;
            new_exc = stack_pointer[-1];
            _PyErr_StackItem *exc_info = tstate->exc_info;
            if (exc_info->exc_value != NULL) {
                prev_exc = exc_info->exc_value;
            }
            else {
                prev_exc = Py_None;
            }
            assert(PyExceptionInstance_Check(new_exc));
            exc_info->exc_value = Py_NewRef(new_exc);
            stack_pointer[-1] = prev_exc;
            stack_pointer[0] = new_exc;
            stack_pointer += 1;
            break;
        }

        case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT: {
            PyObject *owner;
            owner = stack_pointer[-1];
            assert(Py_TYPE(owner)->tp_flags & Py_TPFLAGS_INLINE_VALUES);
            if (!_PyObject_InlineValues(owner)->valid) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _GUARD_KEYS_VERSION: {
            PyObject *owner;
            owner = stack_pointer[-1];
            uint32_t keys_version = (uint32_t)CURRENT_OPERAND();
            PyTypeObject *owner_cls = Py_TYPE(owner);
            PyHeapTypeObject *owner_heap_type = (PyHeapTypeObject *)owner_cls;
            if (owner_heap_type->ht_cached_keys->dk_version != keys_version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _LOAD_ATTR_METHOD_WITH_VALUES: {
            PyObject *owner;
            PyObject *attr;
            PyObject *self = NULL;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            assert(oparg & 1);
            /* Cached method object */
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            attr = Py_NewRef(descr);
            assert(_PyType_HasFeature(Py_TYPE(attr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            self = owner;
            stack_pointer[-1] = attr;
            stack_pointer[0] = self;
            stack_pointer += 1;
            break;
        }

        case _LOAD_ATTR_METHOD_NO_DICT: {
            PyObject *owner;
            PyObject *attr;
            PyObject *self = NULL;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            assert(oparg & 1);
            assert(Py_TYPE(owner)->tp_dictoffset == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = Py_NewRef(descr);
            self = owner;
            stack_pointer[-1] = attr;
            stack_pointer[0] = self;
            stack_pointer += 1;
            break;
        }

        case _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES: {
            PyObject *owner;
            PyObject *attr;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            assert((oparg & 1) == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            Py_DECREF(owner);
            attr = Py_NewRef(descr);
            stack_pointer[-1] = attr;
            break;
        }

        case _LOAD_ATTR_NONDESCRIPTOR_NO_DICT: {
            PyObject *owner;
            PyObject *attr;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            assert((oparg & 1) == 0);
            assert(Py_TYPE(owner)->tp_dictoffset == 0);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            Py_DECREF(owner);
            attr = Py_NewRef(descr);
            stack_pointer[-1] = attr;
            break;
        }

        case _CHECK_ATTR_METHOD_LAZY_DICT: {
            PyObject *owner;
            owner = stack_pointer[-1];
            uint16_t dictoffset = (uint16_t)CURRENT_OPERAND();
            char *ptr = ((char *)owner) + MANAGED_DICT_OFFSET + dictoffset;
            PyObject *dict = *(PyObject **)ptr;
            /* This object has a __dict__, just not yet created */
            if (dict != NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _LOAD_ATTR_METHOD_LAZY_DICT: {
            PyObject *owner;
            PyObject *attr;
            PyObject *self = NULL;
            oparg = CURRENT_OPARG();
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)CURRENT_OPERAND();
            assert(oparg & 1);
            STAT_INC(LOAD_ATTR, hit);
            assert(descr != NULL);
            assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
            attr = Py_NewRef(descr);
            self = owner;
            stack_pointer[-1] = attr;
            stack_pointer[0] = self;
            stack_pointer += 1;
            break;
        }

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

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

        case _CHECK_PERIODIC: {
            CHECK_EVAL_BREAKER();
            break;
        }

        case _CHECK_CALL_BOUND_METHOD_EXACT_ARGS: {
            PyObject *null;
            PyObject *callable;
            oparg = CURRENT_OPARG();
            null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            if (null != NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (Py_TYPE(callable) != &PyMethod_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _INIT_CALL_BOUND_METHOD_EXACT_ARGS: {
            PyObject *callable;
            PyObject *func;
            PyObject *self;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            STAT_INC(CALL, hit);
            self = Py_NewRef(((PyMethodObject *)callable)->im_self);
            stack_pointer[-1 - oparg] = self;  // Patch stack as it is used by _INIT_CALL_PY_EXACT_ARGS
            func = Py_NewRef(((PyMethodObject *)callable)->im_func);
            stack_pointer[-2 - oparg] = func;  // This is used by CALL, upon deoptimization
            Py_DECREF(callable);
            stack_pointer[-2 - oparg] = func;
            stack_pointer[-1 - oparg] = self;
            break;
        }

        case _CHECK_PEP_523: {
            if (tstate->interp->eval_frame) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _CHECK_FUNCTION_EXACT_ARGS: {
            PyObject *self_or_null;
            PyObject *callable;
            oparg = CURRENT_OPARG();
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            uint32_t func_version = (uint32_t)CURRENT_OPERAND();
            if (!PyFunction_Check(callable)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyFunctionObject *func = (PyFunctionObject *)callable;
            if (func->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyCodeObject *code = (PyCodeObject *)func->func_code;
            if (code->co_argcount != oparg + (self_or_null != NULL)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _CHECK_STACK_SPACE: {
            PyObject *callable;
            oparg = CURRENT_OPARG();
            callable = stack_pointer[-2 - oparg];
            PyFunctionObject *func = (PyFunctionObject *)callable;
            PyCodeObject *code = (PyCodeObject *)func->func_code;
            if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (tstate->py_recursion_remaining <= 1) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_0: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            _PyInterpreterFrame *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 = (self_or_null != NULL);
            STAT_INC(CALL, hit);
            PyFunctionObject *func = (PyFunctionObject *)callable;
            new_frame = _PyFrame_PushUnchecked(tstate, func, oparg + has_self);
            PyObject **first_non_self_local = new_frame->localsplus + has_self;
            new_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            stack_pointer[-2 - oparg] = (PyObject *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_1: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            _PyInterpreterFrame *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 = (self_or_null != NULL);
            STAT_INC(CALL, hit);
            PyFunctionObject *func = (PyFunctionObject *)callable;
            new_frame = _PyFrame_PushUnchecked(tstate, func, oparg + has_self);
            PyObject **first_non_self_local = new_frame->localsplus + has_self;
            new_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            stack_pointer[-2 - oparg] = (PyObject *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_2: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            _PyInterpreterFrame *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 = (self_or_null != NULL);
            STAT_INC(CALL, hit);
            PyFunctionObject *func = (PyFunctionObject *)callable;
            new_frame = _PyFrame_PushUnchecked(tstate, func, oparg + has_self);
            PyObject **first_non_self_local = new_frame->localsplus + has_self;
            new_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            stack_pointer[-2 - oparg] = (PyObject *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_3: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            _PyInterpreterFrame *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 = (self_or_null != NULL);
            STAT_INC(CALL, hit);
            PyFunctionObject *func = (PyFunctionObject *)callable;
            new_frame = _PyFrame_PushUnchecked(tstate, func, oparg + has_self);
            PyObject **first_non_self_local = new_frame->localsplus + has_self;
            new_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            stack_pointer[-2 - oparg] = (PyObject *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS_4: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            _PyInterpreterFrame *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 = (self_or_null != NULL);
            STAT_INC(CALL, hit);
            PyFunctionObject *func = (PyFunctionObject *)callable;
            new_frame = _PyFrame_PushUnchecked(tstate, func, oparg + has_self);
            PyObject **first_non_self_local = new_frame->localsplus + has_self;
            new_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            stack_pointer[-2 - oparg] = (PyObject *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            _PyInterpreterFrame *new_frame;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int has_self = (self_or_null != NULL);
            STAT_INC(CALL, hit);
            PyFunctionObject *func = (PyFunctionObject *)callable;
            new_frame = _PyFrame_PushUnchecked(tstate, func, oparg + has_self);
            PyObject **first_non_self_local = new_frame->localsplus + has_self;
            new_frame->localsplus[0] = self_or_null;
            for (int i = 0; i < oparg; i++) {
                first_non_self_local[i] = args[i];
            }
            stack_pointer[-2 - oparg] = (PyObject *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _PUSH_FRAME: {
            _PyInterpreterFrame *new_frame;
            new_frame = (_PyInterpreterFrame *)stack_pointer[-1];
            // Write it out explicitly because it's subtly different.
            // Eventually this should be the only occurrence of this code.
            assert(tstate->interp->eval_frame == NULL);
            stack_pointer += -1;
            _PyFrame_SetStackPointer(frame, stack_pointer);
            new_frame->previous = frame;
            CALL_STAT_INC(inlined_py_calls);
            frame = tstate->current_frame = new_frame;
            tstate->py_recursion_remaining--;
            LOAD_SP();
            LOAD_IP(0);
            #if LLTRACE && TIER_ONE
            lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS());
            if (lltrace < 0) {
                goto exit_unwind;
            }
            #endif
            break;
        }

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

        case _CALL_TYPE_1: {
            PyObject *arg;
            PyObject *null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            arg = stack_pointer[-1];
            null = stack_pointer[-2];
            callable = stack_pointer[-3];
            assert(oparg == 1);
            if (null != NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (callable != (PyObject *)&PyType_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            res = Py_NewRef(Py_TYPE(arg));
            Py_DECREF(arg);
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        case _CALL_STR_1: {
            PyObject *arg;
            PyObject *null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            arg = stack_pointer[-1];
            null = stack_pointer[-2];
            callable = stack_pointer[-3];
            assert(oparg == 1);
            if (null != NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (callable != (PyObject *)&PyUnicode_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            res = PyObject_Str(arg);
            Py_DECREF(arg);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        case _CALL_TUPLE_1: {
            PyObject *arg;
            PyObject *null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            arg = stack_pointer[-1];
            null = stack_pointer[-2];
            callable = stack_pointer[-3];
            assert(oparg == 1);
            if (null != NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (callable != (PyObject *)&PyTuple_Type) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            res = PySequence_Tuple(arg);
            Py_DECREF(arg);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

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

        case _EXIT_INIT_CHECK: {
            PyObject *should_be_none;
            should_be_none = stack_pointer[-1];
            assert(STACK_LEVEL() == 2);
            if (should_be_none != Py_None) {
                PyErr_Format(PyExc_TypeError,
                             "__init__() should return None, not '%.200s'",
                             Py_TYPE(should_be_none)->tp_name);
                JUMP_TO_ERROR();
            }
            stack_pointer += -1;
            break;
        }

        case _CALL_BUILTIN_CLASS: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (!PyType_Check(callable)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyTypeObject *tp = (PyTypeObject *)callable;
            if (tp->tp_vectorcall == NULL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            res = tp->tp_vectorcall((PyObject *)tp, args, total_args, NULL);
            /* Free the arguments. */
            for (int i = 0; i < total_args; i++) {
                Py_DECREF(args[i]);
            }
            Py_DECREF(tp);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_BUILTIN_O: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            /* Builtin METH_O functions */
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (total_args != 1) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!PyCFunction_CheckExact(callable)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyCFunction_GET_FLAGS(callable) != METH_O) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            // CPython promises to check all non-vectorcall function calls.
            if (tstate->c_recursion_remaining <= 0) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable);
            PyObject *arg = args[0];
            _Py_EnterRecursiveCallTstateUnchecked(tstate);
            res = _PyCFunction_TrampolineCall(cfunc, PyCFunction_GET_SELF(callable), arg);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            Py_DECREF(arg);
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_BUILTIN_FAST: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            /* Builtin METH_FASTCALL functions, without keywords */
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (!PyCFunction_CheckExact(callable)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyCFunction_GET_FLAGS(callable) != METH_FASTCALL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable);
            /* res = func(self, args, nargs) */
            res = ((PyCFunctionFast)(void(*)(void))cfunc)(
                PyCFunction_GET_SELF(callable),
                args,
                total_args);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            /* Free the arguments. */
            for (int i = 0; i < total_args; i++) {
                Py_DECREF(args[i]);
            }
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_BUILTIN_FAST_WITH_KEYWORDS: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            /* Builtin METH_FASTCALL | METH_KEYWORDS functions */
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (!PyCFunction_CheckExact(callable)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (PyCFunction_GET_FLAGS(callable) != (METH_FASTCALL | METH_KEYWORDS)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            /* res = func(self, args, nargs, kwnames) */
            PyCFunctionFastWithKeywords cfunc =
            (PyCFunctionFastWithKeywords)(void(*)(void))
            PyCFunction_GET_FUNCTION(callable);
            res = cfunc(PyCFunction_GET_SELF(callable), args, total_args, NULL);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            /* Free the arguments. */
            for (int i = 0; i < total_args; i++) {
                Py_DECREF(args[i]);
            }
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_LEN: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            /* len(o) */
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (total_args != 1) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyInterpreterState *interp = tstate->interp;
            if (callable != interp->callable_cache.len) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyObject *arg = args[0];
            Py_ssize_t len_i = PyObject_Length(arg);
            if (len_i < 0) {
                JUMP_TO_ERROR();
            }
            res = PyLong_FromSsize_t(len_i);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res == NULL) {
                GOTO_ERROR(error);
            }
            Py_DECREF(callable);
            Py_DECREF(arg);
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_ISINSTANCE: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            /* isinstance(o, o2) */
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (total_args != 2) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyInterpreterState *interp = tstate->interp;
            if (callable != interp->callable_cache.isinstance) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyObject *cls = args[1];
            PyObject *inst = args[0];
            int retval = PyObject_IsInstance(inst, cls);
            if (retval < 0) {
                JUMP_TO_ERROR();
            }
            res = PyBool_FromLong(retval);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            if (res == NULL) {
                GOTO_ERROR(error);
            }
            Py_DECREF(inst);
            Py_DECREF(cls);
            Py_DECREF(callable);
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_O: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable;
            if (total_args != 2) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyMethodDef *meth = method->d_method;
            if (meth->ml_flags != METH_O) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            // CPython promises to check all non-vectorcall function calls.
            if (tstate->c_recursion_remaining <= 0) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *arg = args[1];
            PyObject *self = args[0];
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyCFunction cfunc = meth->ml_meth;
            _Py_EnterRecursiveCallTstateUnchecked(tstate);
            res = _PyCFunction_TrampolineCall(cfunc, self, arg);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            Py_DECREF(self);
            Py_DECREF(arg);
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable;
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyMethodDef *meth = method->d_method;
            if (meth->ml_flags != (METH_FASTCALL|METH_KEYWORDS)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyTypeObject *d_type = method->d_common.d_type;
            PyObject *self = args[0];
            if (!Py_IS_TYPE(self, d_type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            int nargs = total_args - 1;
            PyCFunctionFastWithKeywords cfunc =
            (PyCFunctionFastWithKeywords)(void(*)(void))meth->ml_meth;
            res = cfunc(self, args + 1, nargs, NULL);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            /* Free the arguments. */
            for (int i = 0; i < total_args; i++) {
                Py_DECREF(args[i]);
            }
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_NOARGS: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            assert(oparg == 0 || oparg == 1);
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            if (total_args != 1) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable;
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyMethodDef *meth = method->d_method;
            PyObject *self = args[0];
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (meth->ml_flags != METH_NOARGS) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            // CPython promises to check all non-vectorcall function calls.
            if (tstate->c_recursion_remaining <= 0) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyCFunction cfunc = meth->ml_meth;
            _Py_EnterRecursiveCallTstateUnchecked(tstate);
            res = _PyCFunction_TrampolineCall(cfunc, self, NULL);
            _Py_LeaveRecursiveCallTstate(tstate);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            Py_DECREF(self);
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST: {
            PyObject **args;
            PyObject *self_or_null;
            PyObject *callable;
            PyObject *res;
            oparg = CURRENT_OPARG();
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int total_args = oparg;
            if (self_or_null != NULL) {
                args--;
                total_args++;
            }
            PyMethodDescrObject *method = (PyMethodDescrObject *)callable;
            /* Builtin METH_FASTCALL methods, without keywords */
            if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyMethodDef *meth = method->d_method;
            if (meth->ml_flags != METH_FASTCALL) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            PyObject *self = args[0];
            if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            STAT_INC(CALL, hit);
            PyCFunctionFast cfunc =
            (PyCFunctionFast)(void(*)(void))meth->ml_meth;
            int nargs = total_args - 1;
            res = cfunc(self, args + 1, nargs);
            assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
            /* Clear the stack of the arguments. */
            for (int i = 0; i < total_args; i++) {
                Py_DECREF(args[i]);
            }
            Py_DECREF(callable);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

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

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

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

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

        case _MAKE_FUNCTION: {
            PyObject *codeobj;
            PyObject *func;
            codeobj = stack_pointer[-1];
            PyFunctionObject *func_obj = (PyFunctionObject *)
            PyFunction_New(codeobj, GLOBALS());
            Py_DECREF(codeobj);
            if (func_obj == NULL) {
                JUMP_TO_ERROR();
            }
            _PyFunction_SetVersion(
                                   func_obj, ((PyCodeObject *)codeobj)->co_version);
            func = (PyObject *)func_obj;
            stack_pointer[-1] = func;
            break;
        }

        case _SET_FUNCTION_ATTRIBUTE: {
            PyObject *func;
            PyObject *attr;
            oparg = CURRENT_OPARG();
            func = stack_pointer[-1];
            attr = stack_pointer[-2];
            assert(PyFunction_Check(func));
            PyFunctionObject *func_obj = (PyFunctionObject *)func;
            switch(oparg) {
                case MAKE_FUNCTION_CLOSURE:
                assert(func_obj->func_closure == NULL);
                func_obj->func_closure = attr;
                break;
                case MAKE_FUNCTION_ANNOTATIONS:
                assert(func_obj->func_annotations == NULL);
                func_obj->func_annotations = attr;
                break;
                case MAKE_FUNCTION_KWDEFAULTS:
                assert(PyDict_CheckExact(attr));
                assert(func_obj->func_kwdefaults == NULL);
                func_obj->func_kwdefaults = attr;
                break;
                case MAKE_FUNCTION_DEFAULTS:
                assert(PyTuple_CheckExact(attr));
                assert(func_obj->func_defaults == NULL);
                func_obj->func_defaults = attr;
                break;
                default:
                Py_UNREACHABLE();
            }
            stack_pointer[-2] = func;
            stack_pointer += -1;
            break;
        }

        case _BUILD_SLICE: {
            PyObject *step = NULL;
            PyObject *stop;
            PyObject *start;
            PyObject *slice;
            oparg = CURRENT_OPARG();
            if (oparg == 3) { step = stack_pointer[-((oparg == 3) ? 1 : 0)]; }
            stop = stack_pointer[-1 - ((oparg == 3) ? 1 : 0)];
            start = stack_pointer[-2 - ((oparg == 3) ? 1 : 0)];
            slice = PySlice_New(start, stop, step);
            Py_DECREF(start);
            Py_DECREF(stop);
            Py_XDECREF(step);
            if (slice == NULL) JUMP_TO_ERROR();
            stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice;
            stack_pointer += -1 - ((oparg == 3) ? 1 : 0);
            break;
        }

        case _CONVERT_VALUE: {
            PyObject *value;
            PyObject *result;
            oparg = CURRENT_OPARG();
            value = stack_pointer[-1];
            conversion_func conv_fn;
            assert(oparg >= FVC_STR && oparg <= FVC_ASCII);
            conv_fn = _PyEval_ConversionFuncs[oparg];
            result = conv_fn(value);
            Py_DECREF(value);
            if (result == NULL) JUMP_TO_ERROR();
            stack_pointer[-1] = result;
            break;
        }

        case _FORMAT_SIMPLE: {
            PyObject *value;
            PyObject *res;
            value = stack_pointer[-1];
            /* If value is a unicode object, then we know the result
             * of format(value) is value itself. */
            if (!PyUnicode_CheckExact(value)) {
                res = PyObject_Format(value, NULL);
                Py_DECREF(value);
                if (res == NULL) JUMP_TO_ERROR();
            }
            else {
                res = value;
            }
            stack_pointer[-1] = res;
            break;
        }

        case _FORMAT_WITH_SPEC: {
            PyObject *fmt_spec;
            PyObject *value;
            PyObject *res;
            fmt_spec = stack_pointer[-1];
            value = stack_pointer[-2];
            res = PyObject_Format(value, fmt_spec);
            Py_DECREF(value);
            Py_DECREF(fmt_spec);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COPY: {
            PyObject *bottom;
            PyObject *top;
            oparg = CURRENT_OPARG();
            bottom = stack_pointer[-1 - (oparg-1)];
            assert(oparg > 0);
            top = Py_NewRef(bottom);
            stack_pointer[0] = top;
            stack_pointer += 1;
            break;
        }

        case _BINARY_OP: {
            PyObject *rhs;
            PyObject *lhs;
            PyObject *res;
            oparg = CURRENT_OPARG();
            rhs = stack_pointer[-1];
            lhs = stack_pointer[-2];
            assert(_PyEval_BinaryOps[oparg]);
            res = _PyEval_BinaryOps[oparg](lhs, rhs);
            Py_DECREF(lhs);
            Py_DECREF(rhs);
            if (res == NULL) JUMP_TO_ERROR();
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _SWAP: {
            PyObject *top;
            PyObject *bottom;
            oparg = CURRENT_OPARG();
            top = stack_pointer[-1];
            bottom = stack_pointer[-2 - (oparg-2)];
            assert(oparg >= 2);
            stack_pointer[-2 - (oparg-2)] = top;
            stack_pointer[-1] = bottom;
            break;
        }

        /* _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 */

        /* _INSTRUMENTED_JUMP_BACKWARD 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: {
            PyObject *flag;
            flag = stack_pointer[-1];
            stack_pointer += -1;
            if (!Py_IsTrue(flag)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            assert(Py_IsTrue(flag));
            break;
        }

        case _GUARD_IS_FALSE_POP: {
            PyObject *flag;
            flag = stack_pointer[-1];
            stack_pointer += -1;
            if (!Py_IsFalse(flag)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            assert(Py_IsFalse(flag));
            break;
        }

        case _GUARD_IS_NONE_POP: {
            PyObject *val;
            val = stack_pointer[-1];
            stack_pointer += -1;
            if (!Py_IsNone(val)) {
                Py_DECREF(val);
                if (1) {
                    UOP_STAT_INC(uopcode, miss);
                    JUMP_TO_JUMP_TARGET();
                }
            }
            break;
        }

        case _GUARD_IS_NOT_NONE_POP: {
            PyObject *val;
            val = stack_pointer[-1];
            stack_pointer += -1;
            if (Py_IsNone(val)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            Py_DECREF(val);
            break;
        }

        case _JUMP_TO_TOP: {
            #ifndef _Py_JIT
            next_uop = &current_executor->trace[1];
            #endif
            CHECK_EVAL_BREAKER();
            break;
        }

        case _SET_IP: {
            PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND();
            frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
            break;
        }

        case _CHECK_STACK_SPACE_OPERAND: {
            uint32_t framesize = (uint32_t)CURRENT_OPERAND();
            assert(framesize <= INT_MAX);
            if (!_PyThreadState_HasStackSpace(tstate, framesize)) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            if (tstate->py_recursion_remaining <= 1) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _SAVE_RETURN_OFFSET: {
            oparg = CURRENT_OPARG();
            #if TIER_ONE
            frame->return_offset = (uint16_t)(next_instr - this_instr);
            #endif
            #if TIER_TWO
            frame->return_offset = oparg;
            #endif
            break;
        }

        case _EXIT_TRACE: {
            if (1) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _CHECK_VALIDITY: {
            if (!current_executor->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _LOAD_CONST_INLINE: {
            PyObject *value;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND();
            value = Py_NewRef(ptr);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_CONST_INLINE_BORROW: {
            PyObject *value;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND();
            value = ptr;
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _POP_TOP_LOAD_CONST_INLINE_BORROW: {
            PyObject *pop;
            PyObject *value;
            pop = stack_pointer[-1];
            PyObject *ptr = (PyObject *)CURRENT_OPERAND();
            Py_DECREF(pop);
            value = ptr;
            stack_pointer[-1] = value;
            break;
        }

        case _LOAD_CONST_INLINE_WITH_NULL: {
            PyObject *value;
            PyObject *null;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND();
            value = Py_NewRef(ptr);
            null = NULL;
            stack_pointer[0] = value;
            stack_pointer[1] = null;
            stack_pointer += 2;
            break;
        }

        case _LOAD_CONST_INLINE_BORROW_WITH_NULL: {
            PyObject *value;
            PyObject *null;
            PyObject *ptr = (PyObject *)CURRENT_OPERAND();
            value = ptr;
            null = NULL;
            stack_pointer[0] = value;
            stack_pointer[1] = null;
            stack_pointer += 2;
            break;
        }

        case _CHECK_FUNCTION: {
            uint32_t func_version = (uint32_t)CURRENT_OPERAND();
            assert(PyFunction_Check(frame->f_funcobj));
            if (((PyFunctionObject *)frame->f_funcobj)->func_version != func_version) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _INTERNAL_INCREMENT_OPT_COUNTER: {
            PyObject *opt;
            opt = stack_pointer[-1];
            _PyCounterOptimizerObject *exe = (_PyCounterOptimizerObject *)opt;
            exe->count++;
            stack_pointer += -1;
            break;
        }

        case _COLD_EXIT: {
            oparg = CURRENT_OPARG();
            _PyExecutorObject *previous = (_PyExecutorObject *)tstate->previous_executor;
            _PyExitData *exit = &previous->exits[oparg];
            PyCodeObject *code = _PyFrame_GetCode(frame);
            _Py_CODEUNIT *target = _PyCode_CODE(code) + exit->target;
            _Py_BackoffCounter temperature = exit->temperature;
            if (!backoff_counter_triggers(temperature)) {
                exit->temperature = advance_backoff_counter(temperature);
                GOTO_TIER_ONE(target);
            }
            _PyExecutorObject *executor;
            if (target->op.code == ENTER_EXECUTOR) {
                executor = code->co_executors->executors[target->op.arg];
                Py_INCREF(executor);
            }
            else {
                int optimized = _PyOptimizer_Optimize(frame, target, stack_pointer, &executor);
                if (optimized <= 0) {
                    exit->temperature = restart_backoff_counter(temperature);
                    if (optimized < 0) {
                        Py_DECREF(previous);
                        tstate->previous_executor = Py_None;
                        GOTO_UNWIND();
                    }
                    GOTO_TIER_ONE(target);
                }
            }
            /* We need two references. One to store in exit->executor and
             * one to keep the executor alive when executing. */
            Py_INCREF(executor);
            exit->executor = executor;
            GOTO_TIER_TWO(executor);
            break;
        }

        case _START_EXECUTOR: {
            PyObject *executor = (PyObject *)CURRENT_OPERAND();
            Py_DECREF(tstate->previous_executor);
            tstate->previous_executor = NULL;
            #ifndef _Py_JIT
            current_executor = (_PyExecutorObject*)executor;
            #endif
            if (!((_PyExecutorObject *)executor)->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            break;
        }

        case _FATAL_ERROR: {
            assert(0);
            Py_FatalError("Fatal error uop executed.");
            break;
        }

        case _CHECK_VALIDITY_AND_SET_IP: {
            PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND();
            if (!current_executor->vm_data.valid) {
                UOP_STAT_INC(uopcode, miss);
                JUMP_TO_JUMP_TARGET();
            }
            frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
            break;
        }

        case _DEOPT: {
            EXIT_TO_TIER1();
            break;
        }

        case _SIDE_EXIT: {
            EXIT_TO_TRACE();
            break;
        }

        case _ERROR_POP_N: {
            oparg = CURRENT_OPARG();
            stack_pointer += -oparg;
            GOTO_UNWIND();
            break;
        }

#undef TIER_TWO
