Python/generated_cases.c.h generated
Python/optimizer_cases.c.h generated
Python/opcode_targets.h generated
+Python/record_functions.c.h generated
Python/stdlib_module_names.h generated
Tools/peg_generator/pegen/grammar_parser.py generated
aclocal.m4 generated
#define HAS_PERIODIC_FLAG (32768)
#define HAS_UNPREDICTABLE_JUMP_FLAG (65536)
#define HAS_NEEDS_GUARD_IP_FLAG (131072)
+#define HAS_RECORDS_VALUE_FLAG (262144)
#define OPCODE_HAS_ARG(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_ARG_FLAG))
#define OPCODE_HAS_CONST(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_CONST_FLAG))
#define OPCODE_HAS_NAME(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_NAME_FLAG))
#define OPCODE_HAS_PERIODIC(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_PERIODIC_FLAG))
#define OPCODE_HAS_UNPREDICTABLE_JUMP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_UNPREDICTABLE_JUMP_FLAG))
#define OPCODE_HAS_NEEDS_GUARD_IP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_NEEDS_GUARD_IP_FLAG))
+#define OPCODE_HAS_RECORDS_VALUE(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_RECORDS_VALUE_FLAG))
#define OPARG_SIMPLE 0
#define OPARG_CACHE_1 1
[BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
[BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG },
[BINARY_OP_SUBSCR_DICT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
- [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+ [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
[BINARY_OP_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[BINARY_OP_SUBSCR_LIST_SLICE] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BINARY_OP_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
[BUILD_TUPLE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
[CACHE] = { true, INSTR_FMT_IX, 0 },
[CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [CALL_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [CALL_BOUND_METHOD_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
+ [CALL_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_BOUND_METHOD_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
[CALL_EX_NON_PY_GENERAL] = { true, INSTR_FMT_IXC, HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
- [CALL_EX_PY] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+ [CALL_EX_PY] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
[CALL_FUNCTION_EX] = { true, INSTR_FMT_IXC, HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
[CALL_INTRINSIC_1] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[CALL_INTRINSIC_2] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[CALL_LEN] = { true, INSTR_FMT_IXC00, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[CALL_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
- [CALL_NON_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [CALL_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+ [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_NON_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [CALL_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
[CALL_STR_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[CALL_TUPLE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[CALL_TYPE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
[FORMAT_SIMPLE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[FORMAT_WITH_SPEC] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[FOR_ITER] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
- [FOR_ITER_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+ [FOR_ITER_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
[FOR_ITER_LIST] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
[FOR_ITER_RANGE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
[FOR_ITER_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG },
[LIST_EXTEND] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[LOAD_ATTR] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[LOAD_ATTR_CLASS] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+ [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [LOAD_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
- [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG },
- [LOAD_ATTR_METHOD_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
+ [LOAD_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_METHOD_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_RECORDS_VALUE_FLAG },
[LOAD_ATTR_MODULE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ATTR_PROPERTY] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+ [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_PROPERTY] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
[LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[LOAD_COMMON_CONSTANT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
[LOAD_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG },
[RESERVED] = { true, INSTR_FMT_IX, 0 },
[RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[RESUME_CHECK] = { true, INSTR_FMT_IX, HAS_DEOPT_FLAG },
- [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
- [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+ [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
[SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
[SEND_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_SYNC_SP_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
[SETUP_ANNOTATIONS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[SET_UPDATE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[STORE_ATTR] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[STORE_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IXC000, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
- [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+ [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
+ [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
[STORE_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ESCAPES_FLAG },
[STORE_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ESCAPES_FLAG },
[STORE_FAST_LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ESCAPES_FLAG },
[STORE_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[SWAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_PURE_FLAG },
[TO_BOOL] = { true, INSTR_FMT_IXC00, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [TO_BOOL_ALWAYS_TRUE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
+ [TO_BOOL_ALWAYS_TRUE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG | HAS_RECORDS_VALUE_FLAG },
[TO_BOOL_BOOL] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG },
[TO_BOOL_INT] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG },
[TO_BOOL_LIST] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[UNPACK_SEQUENCE_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[UNPACK_SEQUENCE_TWO_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[WITH_EXCEPT_START] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+ [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NEEDS_GUARD_IP_FLAG | HAS_RECORDS_VALUE_FLAG },
[ANNOTATIONS_PLACEHOLDER] = { true, -1, HAS_PURE_FLAG },
[JUMP] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[JUMP_IF_FALSE] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
};
#endif
-#define MAX_UOP_PER_EXPANSION 10
+#define MAX_UOP_PER_EXPANSION 11
struct opcode_macro_expansion {
int nuops;
struct { int16_t uop; int8_t size; int8_t offset; } uops[MAX_UOP_PER_EXPANSION];
[BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 5, .uops = { { _GUARD_TOS_FLOAT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_FLOAT, OPARG_SIMPLE, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, OPARG_SIMPLE, 5 }, { _POP_TOP_FLOAT, OPARG_SIMPLE, 5 }, { _POP_TOP_FLOAT, OPARG_SIMPLE, 5 } } },
[BINARY_OP_MULTIPLY_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_INT, OPARG_SIMPLE, 0 }, { _BINARY_OP_MULTIPLY_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 } } },
[BINARY_OP_SUBSCR_DICT] = { .nuops = 4, .uops = { { _GUARD_NOS_DICT, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_DICT, OPARG_SIMPLE, 5 }, { _POP_TOP, OPARG_SIMPLE, 5 }, { _POP_TOP, OPARG_SIMPLE, 5 } } },
- [BINARY_OP_SUBSCR_GETITEM] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_CHECK_FUNC, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_INIT_CALL, OPARG_SIMPLE, 5 }, { _PUSH_FRAME, OPARG_SIMPLE, 5 } } },
+ [BINARY_OP_SUBSCR_GETITEM] = { .nuops = 5, .uops = { { _RECORD_TOS, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_CHECK_FUNC, OPARG_SIMPLE, 5 }, { _BINARY_OP_SUBSCR_INIT_CALL, OPARG_SIMPLE, 5 }, { _PUSH_FRAME, OPARG_SIMPLE, 5 } } },
[BINARY_OP_SUBSCR_LIST_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_LIST_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 }, { _POP_TOP, OPARG_SIMPLE, 5 } } },
[BINARY_OP_SUBSCR_LIST_SLICE] = { .nuops = 3, .uops = { { _GUARD_TOS_SLICE, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_LIST_SLICE, OPARG_SIMPLE, 5 } } },
[BINARY_OP_SUBSCR_STR_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_COMPACT_ASCII, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBSCR_STR_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_INT, OPARG_SIMPLE, 5 }, { _POP_TOP_UNICODE, OPARG_SIMPLE, 5 } } },
[BUILD_STRING] = { .nuops = 1, .uops = { { _BUILD_STRING, OPARG_SIMPLE, 0 } } },
[BUILD_TEMPLATE] = { .nuops = 1, .uops = { { _BUILD_TEMPLATE, OPARG_SIMPLE, 0 } } },
[BUILD_TUPLE] = { .nuops = 1, .uops = { { _BUILD_TUPLE, OPARG_SIMPLE, 0 } } },
- [CALL_ALLOC_AND_ENTER_INIT] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_AND_ALLOCATE_OBJECT, 2, 1 }, { _CREATE_INIT_FRAME, OPARG_SIMPLE, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
- [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 10, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
- [CALL_BOUND_METHOD_GENERAL] = { .nuops = 7, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
- [CALL_BUILTIN_CLASS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_CLASS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_BUILTIN_FAST] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_BUILTIN_O] = { .nuops = 4, .uops = { { _CALL_BUILTIN_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_ALLOC_AND_ENTER_INIT] = { .nuops = 5, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_AND_ALLOCATE_OBJECT, 2, 1 }, { _CREATE_INIT_FRAME, OPARG_SIMPLE, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+ [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 11, .uops = { { _RECORD_BOUND_METHOD, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+ [CALL_BOUND_METHOD_GENERAL] = { .nuops = 8, .uops = { { _RECORD_BOUND_METHOD, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+ [CALL_BUILTIN_CLASS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_CLASS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_BUILTIN_FAST] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_BUILTIN_O] = { .nuops = 5, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_BUILTIN_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
[CALL_EX_NON_PY_GENERAL] = { .nuops = 4, .uops = { { _CHECK_IS_NOT_PY_CALLABLE_EX, OPARG_SIMPLE, 1 }, { _MAKE_CALLARGS_A_TUPLE, OPARG_SIMPLE, 1 }, { _CALL_FUNCTION_EX_NON_PY_GENERAL, OPARG_SIMPLE, 1 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 1 } } },
- [CALL_EX_PY] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _MAKE_CALLARGS_A_TUPLE, OPARG_SIMPLE, 1 }, { _CHECK_IS_PY_CALLABLE_EX, OPARG_SIMPLE, 1 }, { _PY_FRAME_EX, OPARG_SIMPLE, 1 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
+ [CALL_EX_PY] = { .nuops = 7, .uops = { { _RECORD_4OS, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _MAKE_CALLARGS_A_TUPLE, OPARG_SIMPLE, 1 }, { _CHECK_IS_PY_CALLABLE_EX, OPARG_SIMPLE, 1 }, { _PY_FRAME_EX, OPARG_SIMPLE, 1 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
[CALL_INTRINSIC_1] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_1, OPARG_SIMPLE, 0 } } },
[CALL_INTRINSIC_2] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_2, OPARG_SIMPLE, 0 } } },
[CALL_ISINSTANCE] = { .nuops = 3, .uops = { { _GUARD_THIRD_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_ISINSTANCE, OPARG_SIMPLE, 3 }, { _CALL_ISINSTANCE, OPARG_SIMPLE, 3 } } },
[CALL_LEN] = { .nuops = 5, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_LEN, OPARG_SIMPLE, 3 }, { _CALL_LEN, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
[CALL_LIST_APPEND] = { .nuops = 6, .uops = { { _GUARD_CALLABLE_LIST_APPEND, OPARG_SIMPLE, 3 }, { _GUARD_NOS_NOT_NULL, OPARG_SIMPLE, 3 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 3 }, { _CALL_LIST_APPEND, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
[CALL_METHOD_DESCRIPTOR_FAST] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_NOARGS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 5, .uops = { { _CALL_METHOD_DESCRIPTOR_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_NON_PY_GENERAL] = { .nuops = 3, .uops = { { _CHECK_IS_NOT_PY_CALLABLE, OPARG_SIMPLE, 3 }, { _CALL_NON_PY_GENERAL, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
- [CALL_PY_EXACT_ARGS] = { .nuops = 8, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
- [CALL_PY_GENERAL] = { .nuops = 6, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+ [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 3, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_METHOD_DESCRIPTOR_NOARGS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 6, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CALL_METHOD_DESCRIPTOR_O, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_NON_PY_GENERAL] = { .nuops = 4, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_IS_NOT_PY_CALLABLE, OPARG_SIMPLE, 3 }, { _CALL_NON_PY_GENERAL, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
+ [CALL_PY_EXACT_ARGS] = { .nuops = 9, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
+ [CALL_PY_GENERAL] = { .nuops = 7, .uops = { { _RECORD_CALLABLE, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_RECURSION_REMAINING, OPARG_SIMPLE, 3 }, { _PY_FRAME_GENERAL, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
[CALL_STR_1] = { .nuops = 5, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_STR_1, OPARG_SIMPLE, 3 }, { _CALL_STR_1, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
[CALL_TUPLE_1] = { .nuops = 5, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_TUPLE_1, OPARG_SIMPLE, 3 }, { _CALL_TUPLE_1, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC_AT_END, OPARG_REPLACED, 3 } } },
[CALL_TYPE_1] = { .nuops = 4, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_TYPE_1, OPARG_SIMPLE, 3 }, { _CALL_TYPE_1, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
[FORMAT_SIMPLE] = { .nuops = 1, .uops = { { _FORMAT_SIMPLE, OPARG_SIMPLE, 0 } } },
[FORMAT_WITH_SPEC] = { .nuops = 1, .uops = { { _FORMAT_WITH_SPEC, OPARG_SIMPLE, 0 } } },
[FOR_ITER] = { .nuops = 1, .uops = { { _FOR_ITER, OPARG_REPLACED, 0 } } },
- [FOR_ITER_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _FOR_ITER_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
+ [FOR_ITER_GEN] = { .nuops = 4, .uops = { { _RECORD_NOS, OPARG_SIMPLE, 0 }, { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _FOR_ITER_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
[FOR_ITER_LIST] = { .nuops = 3, .uops = { { _ITER_CHECK_LIST, OPARG_SIMPLE, 1 }, { _ITER_JUMP_LIST, OPARG_REPLACED, 1 }, { _ITER_NEXT_LIST, OPARG_REPLACED, 1 } } },
[FOR_ITER_RANGE] = { .nuops = 3, .uops = { { _ITER_CHECK_RANGE, OPARG_SIMPLE, 1 }, { _ITER_JUMP_RANGE, OPARG_REPLACED, 1 }, { _ITER_NEXT_RANGE, OPARG_SIMPLE, 1 } } },
[FOR_ITER_TUPLE] = { .nuops = 3, .uops = { { _ITER_CHECK_TUPLE, OPARG_SIMPLE, 1 }, { _ITER_JUMP_TUPLE, OPARG_REPLACED, 1 }, { _ITER_NEXT_TUPLE, OPARG_SIMPLE, 1 } } },
[LIST_EXTEND] = { .nuops = 1, .uops = { { _LIST_EXTEND, OPARG_SIMPLE, 0 } } },
[LOAD_ATTR] = { .nuops = 1, .uops = { { _LOAD_ATTR, OPARG_SIMPLE, 8 } } },
[LOAD_ATTR_CLASS] = { .nuops = 3, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
- [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 4, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _GUARD_TYPE_VERSION, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
- [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 5, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
- [LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } },
- [LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } },
- [LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } },
+ [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_CLASS, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+ [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 6, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+ [LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } },
+ [LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 3, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } },
+ [LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } },
[LOAD_ATTR_MODULE] = { .nuops = 4, .uops = { { _LOAD_ATTR_MODULE, 2, 1 }, { _LOAD_ATTR_MODULE, OPERAND1_1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
- [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } },
- [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } },
- [LOAD_ATTR_PROPERTY] = { .nuops = 5, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_PROPERTY_FRAME, 4, 5 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 9 }, { _PUSH_FRAME, OPARG_SIMPLE, 9 } } },
- [LOAD_ATTR_SLOT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
- [LOAD_ATTR_WITH_HINT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+ [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 3, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } },
+ [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } },
+ [LOAD_ATTR_PROPERTY] = { .nuops = 6, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_PEP_523, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_PROPERTY_FRAME, 4, 5 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 9 }, { _PUSH_FRAME, OPARG_SIMPLE, 9 } } },
+ [LOAD_ATTR_SLOT] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+ [LOAD_ATTR_WITH_HINT] = { .nuops = 5, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
[LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, OPARG_SIMPLE, 0 } } },
[LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, OPARG_SIMPLE, 0 } } },
[LOAD_CONST] = { .nuops = 1, .uops = { { _LOAD_CONST, OPARG_SIMPLE, 0 } } },
[PUSH_EXC_INFO] = { .nuops = 1, .uops = { { _PUSH_EXC_INFO, OPARG_SIMPLE, 0 } } },
[PUSH_NULL] = { .nuops = 1, .uops = { { _PUSH_NULL, OPARG_SIMPLE, 0 } } },
[RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 0 } } },
- [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } },
- [RETURN_VALUE] = { .nuops = 1, .uops = { { _RETURN_VALUE, OPARG_SIMPLE, 0 } } },
+ [RETURN_GENERATOR] = { .nuops = 2, .uops = { { _RECORD_CALLER_CODE, OPARG_SIMPLE, 0 }, { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } },
+ [RETURN_VALUE] = { .nuops = 2, .uops = { { _RECORD_CALLER_CODE, OPARG_SIMPLE, 0 }, { _RETURN_VALUE, OPARG_SIMPLE, 0 } } },
[SEND_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _SEND_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } },
[SETUP_ANNOTATIONS] = { .nuops = 1, .uops = { { _SETUP_ANNOTATIONS, OPARG_SIMPLE, 0 } } },
[SET_ADD] = { .nuops = 1, .uops = { { _SET_ADD, OPARG_SIMPLE, 0 } } },
[SET_UPDATE] = { .nuops = 1, .uops = { { _SET_UPDATE, OPARG_SIMPLE, 0 } } },
[STORE_ATTR] = { .nuops = 1, .uops = { { _STORE_ATTR, OPARG_SIMPLE, 3 } } },
[STORE_ATTR_INSTANCE_VALUE] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION_AND_LOCK, 2, 1 }, { _GUARD_DORV_NO_DICT, OPARG_SIMPLE, 3 }, { _STORE_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
- [STORE_ATTR_SLOT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
- [STORE_ATTR_WITH_HINT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
+ [STORE_ATTR_SLOT] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
+ [STORE_ATTR_WITH_HINT] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 } } },
[STORE_DEREF] = { .nuops = 1, .uops = { { _STORE_DEREF, OPARG_SIMPLE, 0 } } },
[STORE_FAST] = { .nuops = 2, .uops = { { _SWAP_FAST, OPARG_SIMPLE, 0 }, { _POP_TOP, OPARG_SIMPLE, 0 } } },
[STORE_FAST_LOAD_FAST] = { .nuops = 3, .uops = { { _SWAP_FAST, OPARG_TOP, 0 }, { _POP_TOP, OPARG_TOP, 0 }, { _LOAD_FAST, OPARG_BOTTOM, 0 } } },
[STORE_SUBSCR_LIST_INT] = { .nuops = 5, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 0 }, { _STORE_SUBSCR_LIST_INT, OPARG_SIMPLE, 1 }, { _POP_TOP_INT, OPARG_SIMPLE, 1 }, { _POP_TOP, OPARG_SIMPLE, 1 } } },
[SWAP] = { .nuops = 1, .uops = { { _SWAP, OPARG_SIMPLE, 0 } } },
[TO_BOOL] = { .nuops = 1, .uops = { { _TO_BOOL, OPARG_SIMPLE, 2 } } },
- [TO_BOOL_ALWAYS_TRUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _REPLACE_WITH_TRUE, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
+ [TO_BOOL_ALWAYS_TRUE] = { .nuops = 4, .uops = { { _RECORD_TOS_TYPE, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _REPLACE_WITH_TRUE, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
[TO_BOOL_BOOL] = { .nuops = 1, .uops = { { _TO_BOOL_BOOL, OPARG_SIMPLE, 3 } } },
[TO_BOOL_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _TO_BOOL_INT, OPARG_SIMPLE, 3 }, { _POP_TOP_INT, OPARG_SIMPLE, 3 } } },
[TO_BOOL_LIST] = { .nuops = 3, .uops = { { _GUARD_TOS_LIST, OPARG_SIMPLE, 0 }, { _TO_BOOL_LIST, OPARG_SIMPLE, 3 }, { _POP_TOP, OPARG_SIMPLE, 3 } } },
[UNPACK_SEQUENCE_TUPLE] = { .nuops = 2, .uops = { { _GUARD_TOS_TUPLE, OPARG_SIMPLE, 0 }, { _UNPACK_SEQUENCE_TUPLE, OPARG_SIMPLE, 1 } } },
[UNPACK_SEQUENCE_TWO_TUPLE] = { .nuops = 2, .uops = { { _GUARD_TOS_TUPLE, OPARG_SIMPLE, 0 }, { _UNPACK_SEQUENCE_TWO_TUPLE, OPARG_SIMPLE, 1 } } },
[WITH_EXCEPT_START] = { .nuops = 1, .uops = { { _WITH_EXCEPT_START, OPARG_SIMPLE, 0 } } },
- [YIELD_VALUE] = { .nuops = 1, .uops = { { _YIELD_VALUE, OPARG_SIMPLE, 0 } } },
+ [YIELD_VALUE] = { .nuops = 2, .uops = { { _RECORD_CALLER_CODE, OPARG_SIMPLE, 0 }, { _YIELD_VALUE, OPARG_SIMPLE, 0 } } },
};
#endif // NEED_OPCODE_METADATA
PyCodeObject *instr_code; // Strong
struct _PyInterpreterFrame *instr_frame;
_PyBloomFilter dependencies;
+ PyObject *recorded_value; // Strong, may be NULL
} _PyJitTracerPreviousState;
typedef struct _PyJitTracerTranslatorState {
PyAPI_FUNC(int)
_PyJit_TryInitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame,
_Py_CODEUNIT *curr_instr, _Py_CODEUNIT *start_instr,
- _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit,
+ _Py_CODEUNIT *close_loop_instr, _PyStackRef *stack_pointer, int chain_depth, _PyExitData *exit,
int oparg, _PyExecutorObject *current_executor);
PyAPI_FUNC(void) _PyJit_FinalizeTracing(PyThreadState *tstate, int err);
void _PyJit_Tracer_InvalidateDependency(PyThreadState *old_tstate, void *obj);
+#ifdef _Py_TIER2
+typedef void (*_Py_RecordFuncPtr)(_PyInterpreterFrame *frame, _PyStackRef *stackpointer, int oparg, PyObject **recorded_value);
+PyAPI_DATA(const _Py_RecordFuncPtr) _PyOpcode_RecordFunctions[];
+PyAPI_DATA(const uint8_t) _PyOpcode_RecordFunctionIndices[256];
+#endif
+
#ifdef __cplusplus
}
#endif
#define _PY_FRAME_GENERAL 538
#define _PY_FRAME_KW 539
#define _QUICKEN_RESUME 540
-#define _REPLACE_WITH_TRUE 541
+#define _RECORD_4OS 541
+#define _RECORD_BOUND_METHOD 542
+#define _RECORD_CALLABLE 543
+#define _RECORD_CALLER_CODE 544
+#define _RECORD_NOS 545
+#define _RECORD_TOS 546
+#define _RECORD_TOS_TYPE 547
+#define _REPLACE_WITH_TRUE 548
#define _RESUME_CHECK RESUME_CHECK
-#define _RETURN_GENERATOR RETURN_GENERATOR
-#define _RETURN_VALUE RETURN_VALUE
-#define _SAVE_RETURN_OFFSET 542
-#define _SEND 543
-#define _SEND_GEN_FRAME 544
+#define _RETURN_GENERATOR 549
+#define _RETURN_VALUE 550
+#define _SAVE_RETURN_OFFSET 551
+#define _SEND 552
+#define _SEND_GEN_FRAME 553
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
#define _SET_ADD SET_ADD
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
#define _SET_UPDATE SET_UPDATE
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 545
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 546
-#define _SPILL_OR_RELOAD 547
-#define _START_EXECUTOR 548
-#define _STORE_ATTR 549
-#define _STORE_ATTR_INSTANCE_VALUE 550
-#define _STORE_ATTR_SLOT 551
-#define _STORE_ATTR_WITH_HINT 552
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 554
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 555
+#define _SPILL_OR_RELOAD 556
+#define _START_EXECUTOR 557
+#define _STORE_ATTR 558
+#define _STORE_ATTR_INSTANCE_VALUE 559
+#define _STORE_ATTR_SLOT 560
+#define _STORE_ATTR_WITH_HINT 561
#define _STORE_DEREF STORE_DEREF
#define _STORE_GLOBAL STORE_GLOBAL
#define _STORE_NAME STORE_NAME
-#define _STORE_SLICE 553
-#define _STORE_SUBSCR 554
-#define _STORE_SUBSCR_DICT 555
-#define _STORE_SUBSCR_LIST_INT 556
-#define _SWAP 557
-#define _SWAP_2 558
-#define _SWAP_3 559
-#define _SWAP_FAST 560
-#define _SWAP_FAST_0 561
-#define _SWAP_FAST_1 562
-#define _SWAP_FAST_2 563
-#define _SWAP_FAST_3 564
-#define _SWAP_FAST_4 565
-#define _SWAP_FAST_5 566
-#define _SWAP_FAST_6 567
-#define _SWAP_FAST_7 568
-#define _TIER2_RESUME_CHECK 569
-#define _TO_BOOL 570
+#define _STORE_SLICE 562
+#define _STORE_SUBSCR 563
+#define _STORE_SUBSCR_DICT 564
+#define _STORE_SUBSCR_LIST_INT 565
+#define _SWAP 566
+#define _SWAP_2 567
+#define _SWAP_3 568
+#define _SWAP_FAST 569
+#define _SWAP_FAST_0 570
+#define _SWAP_FAST_1 571
+#define _SWAP_FAST_2 572
+#define _SWAP_FAST_3 573
+#define _SWAP_FAST_4 574
+#define _SWAP_FAST_5 575
+#define _SWAP_FAST_6 576
+#define _SWAP_FAST_7 577
+#define _TIER2_RESUME_CHECK 578
+#define _TO_BOOL 579
#define _TO_BOOL_BOOL TO_BOOL_BOOL
-#define _TO_BOOL_INT 571
-#define _TO_BOOL_LIST 572
+#define _TO_BOOL_INT 580
+#define _TO_BOOL_LIST 581
#define _TO_BOOL_NONE TO_BOOL_NONE
-#define _TO_BOOL_STR 573
+#define _TO_BOOL_STR 582
#define _TRACE_RECORD TRACE_RECORD
-#define _UNARY_INVERT 574
-#define _UNARY_NEGATIVE 575
+#define _UNARY_INVERT 583
+#define _UNARY_NEGATIVE 584
#define _UNARY_NOT UNARY_NOT
#define _UNPACK_EX UNPACK_EX
-#define _UNPACK_SEQUENCE 576
-#define _UNPACK_SEQUENCE_LIST 577
-#define _UNPACK_SEQUENCE_TUPLE 578
-#define _UNPACK_SEQUENCE_TWO_TUPLE 579
+#define _UNPACK_SEQUENCE 585
+#define _UNPACK_SEQUENCE_LIST 586
+#define _UNPACK_SEQUENCE_TUPLE 587
+#define _UNPACK_SEQUENCE_TWO_TUPLE 588
#define _WITH_EXCEPT_START WITH_EXCEPT_START
-#define _YIELD_VALUE YIELD_VALUE
-#define MAX_UOP_ID 579
-#define _BINARY_OP_r23 580
-#define _BINARY_OP_ADD_FLOAT_r03 581
-#define _BINARY_OP_ADD_FLOAT_r13 582
-#define _BINARY_OP_ADD_FLOAT_r23 583
-#define _BINARY_OP_ADD_INT_r03 584
-#define _BINARY_OP_ADD_INT_r13 585
-#define _BINARY_OP_ADD_INT_r23 586
-#define _BINARY_OP_ADD_UNICODE_r03 587
-#define _BINARY_OP_ADD_UNICODE_r13 588
-#define _BINARY_OP_ADD_UNICODE_r23 589
-#define _BINARY_OP_EXTEND_r23 590
-#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 591
-#define _BINARY_OP_MULTIPLY_FLOAT_r03 592
-#define _BINARY_OP_MULTIPLY_FLOAT_r13 593
-#define _BINARY_OP_MULTIPLY_FLOAT_r23 594
-#define _BINARY_OP_MULTIPLY_INT_r03 595
-#define _BINARY_OP_MULTIPLY_INT_r13 596
-#define _BINARY_OP_MULTIPLY_INT_r23 597
-#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 598
-#define _BINARY_OP_SUBSCR_DICT_r23 599
-#define _BINARY_OP_SUBSCR_INIT_CALL_r01 600
-#define _BINARY_OP_SUBSCR_INIT_CALL_r11 601
-#define _BINARY_OP_SUBSCR_INIT_CALL_r21 602
-#define _BINARY_OP_SUBSCR_INIT_CALL_r31 603
-#define _BINARY_OP_SUBSCR_LIST_INT_r23 604
-#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 605
-#define _BINARY_OP_SUBSCR_STR_INT_r23 606
-#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 607
-#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 608
-#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 609
-#define _BINARY_OP_SUBSCR_USTR_INT_r23 610
-#define _BINARY_OP_SUBTRACT_FLOAT_r03 611
-#define _BINARY_OP_SUBTRACT_FLOAT_r13 612
-#define _BINARY_OP_SUBTRACT_FLOAT_r23 613
-#define _BINARY_OP_SUBTRACT_INT_r03 614
-#define _BINARY_OP_SUBTRACT_INT_r13 615
-#define _BINARY_OP_SUBTRACT_INT_r23 616
-#define _BINARY_SLICE_r31 617
-#define _BUILD_INTERPOLATION_r01 618
-#define _BUILD_LIST_r01 619
-#define _BUILD_MAP_r01 620
-#define _BUILD_SET_r01 621
-#define _BUILD_SLICE_r01 622
-#define _BUILD_STRING_r01 623
-#define _BUILD_TEMPLATE_r21 624
-#define _BUILD_TUPLE_r01 625
-#define _CALL_BUILTIN_CLASS_r01 626
-#define _CALL_BUILTIN_FAST_r01 627
-#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 628
-#define _CALL_BUILTIN_O_r03 629
-#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 630
-#define _CALL_INTRINSIC_1_r11 631
-#define _CALL_INTRINSIC_2_r21 632
-#define _CALL_ISINSTANCE_r31 633
-#define _CALL_KW_NON_PY_r11 634
-#define _CALL_LEN_r33 635
-#define _CALL_LIST_APPEND_r03 636
-#define _CALL_LIST_APPEND_r13 637
-#define _CALL_LIST_APPEND_r23 638
-#define _CALL_LIST_APPEND_r33 639
-#define _CALL_METHOD_DESCRIPTOR_FAST_r01 640
-#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 641
-#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 642
-#define _CALL_METHOD_DESCRIPTOR_O_r03 643
-#define _CALL_NON_PY_GENERAL_r01 644
-#define _CALL_STR_1_r32 645
-#define _CALL_TUPLE_1_r32 646
-#define _CALL_TYPE_1_r02 647
-#define _CALL_TYPE_1_r12 648
-#define _CALL_TYPE_1_r22 649
-#define _CALL_TYPE_1_r32 650
-#define _CHECK_AND_ALLOCATE_OBJECT_r00 651
-#define _CHECK_ATTR_CLASS_r01 652
-#define _CHECK_ATTR_CLASS_r11 653
-#define _CHECK_ATTR_CLASS_r22 654
-#define _CHECK_ATTR_CLASS_r33 655
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 656
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 657
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 658
-#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 659
-#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 660
-#define _CHECK_EG_MATCH_r22 661
-#define _CHECK_EXC_MATCH_r22 662
-#define _CHECK_FUNCTION_EXACT_ARGS_r00 663
-#define _CHECK_FUNCTION_VERSION_r00 664
-#define _CHECK_FUNCTION_VERSION_INLINE_r00 665
-#define _CHECK_FUNCTION_VERSION_INLINE_r11 666
-#define _CHECK_FUNCTION_VERSION_INLINE_r22 667
-#define _CHECK_FUNCTION_VERSION_INLINE_r33 668
-#define _CHECK_FUNCTION_VERSION_KW_r11 669
-#define _CHECK_IS_NOT_PY_CALLABLE_r00 670
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 671
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 672
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 673
-#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 674
-#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 675
-#define _CHECK_IS_PY_CALLABLE_EX_r03 676
-#define _CHECK_IS_PY_CALLABLE_EX_r13 677
-#define _CHECK_IS_PY_CALLABLE_EX_r23 678
-#define _CHECK_IS_PY_CALLABLE_EX_r33 679
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 680
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 681
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 682
-#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 683
-#define _CHECK_METHOD_VERSION_r00 684
-#define _CHECK_METHOD_VERSION_KW_r11 685
-#define _CHECK_PEP_523_r00 686
-#define _CHECK_PEP_523_r11 687
-#define _CHECK_PEP_523_r22 688
-#define _CHECK_PEP_523_r33 689
-#define _CHECK_PERIODIC_r00 690
-#define _CHECK_PERIODIC_AT_END_r00 691
-#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 692
-#define _CHECK_RECURSION_REMAINING_r00 693
-#define _CHECK_RECURSION_REMAINING_r11 694
-#define _CHECK_RECURSION_REMAINING_r22 695
-#define _CHECK_RECURSION_REMAINING_r33 696
-#define _CHECK_STACK_SPACE_r00 697
-#define _CHECK_STACK_SPACE_OPERAND_r00 698
-#define _CHECK_STACK_SPACE_OPERAND_r11 699
-#define _CHECK_STACK_SPACE_OPERAND_r22 700
-#define _CHECK_STACK_SPACE_OPERAND_r33 701
-#define _CHECK_VALIDITY_r00 702
-#define _CHECK_VALIDITY_r11 703
-#define _CHECK_VALIDITY_r22 704
-#define _CHECK_VALIDITY_r33 705
-#define _COLD_DYNAMIC_EXIT_r00 706
-#define _COLD_EXIT_r00 707
-#define _COMPARE_OP_r21 708
-#define _COMPARE_OP_FLOAT_r03 709
-#define _COMPARE_OP_FLOAT_r13 710
-#define _COMPARE_OP_FLOAT_r23 711
-#define _COMPARE_OP_INT_r23 712
-#define _COMPARE_OP_STR_r23 713
-#define _CONTAINS_OP_r23 714
-#define _CONTAINS_OP_DICT_r23 715
-#define _CONTAINS_OP_SET_r23 716
-#define _CONVERT_VALUE_r11 717
-#define _COPY_r01 718
-#define _COPY_1_r02 719
-#define _COPY_1_r12 720
-#define _COPY_1_r23 721
-#define _COPY_2_r03 722
-#define _COPY_2_r13 723
-#define _COPY_2_r23 724
-#define _COPY_3_r03 725
-#define _COPY_3_r13 726
-#define _COPY_3_r23 727
-#define _COPY_3_r33 728
-#define _COPY_FREE_VARS_r00 729
-#define _COPY_FREE_VARS_r11 730
-#define _COPY_FREE_VARS_r22 731
-#define _COPY_FREE_VARS_r33 732
-#define _CREATE_INIT_FRAME_r01 733
-#define _DELETE_ATTR_r10 734
-#define _DELETE_DEREF_r00 735
-#define _DELETE_FAST_r00 736
-#define _DELETE_GLOBAL_r00 737
-#define _DELETE_NAME_r00 738
-#define _DELETE_SUBSCR_r20 739
-#define _DEOPT_r00 740
-#define _DEOPT_r10 741
-#define _DEOPT_r20 742
-#define _DEOPT_r30 743
-#define _DICT_MERGE_r10 744
-#define _DICT_UPDATE_r10 745
-#define _DO_CALL_r01 746
-#define _DO_CALL_FUNCTION_EX_r31 747
-#define _DO_CALL_KW_r11 748
-#define _DYNAMIC_EXIT_r00 749
-#define _DYNAMIC_EXIT_r10 750
-#define _DYNAMIC_EXIT_r20 751
-#define _DYNAMIC_EXIT_r30 752
-#define _END_FOR_r10 753
-#define _END_SEND_r21 754
-#define _ERROR_POP_N_r00 755
-#define _EXIT_INIT_CHECK_r10 756
-#define _EXIT_TRACE_r00 757
-#define _EXIT_TRACE_r10 758
-#define _EXIT_TRACE_r20 759
-#define _EXIT_TRACE_r30 760
-#define _EXPAND_METHOD_r00 761
-#define _EXPAND_METHOD_KW_r11 762
-#define _FATAL_ERROR_r00 763
-#define _FATAL_ERROR_r11 764
-#define _FATAL_ERROR_r22 765
-#define _FATAL_ERROR_r33 766
-#define _FORMAT_SIMPLE_r11 767
-#define _FORMAT_WITH_SPEC_r21 768
-#define _FOR_ITER_r23 769
-#define _FOR_ITER_GEN_FRAME_r03 770
-#define _FOR_ITER_GEN_FRAME_r13 771
-#define _FOR_ITER_GEN_FRAME_r23 772
-#define _FOR_ITER_TIER_TWO_r23 773
-#define _GET_AITER_r11 774
-#define _GET_ANEXT_r12 775
-#define _GET_AWAITABLE_r11 776
-#define _GET_ITER_r12 777
-#define _GET_LEN_r12 778
-#define _GET_YIELD_FROM_ITER_r11 779
-#define _GUARD_BINARY_OP_EXTEND_r22 780
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 781
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 782
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 783
-#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 784
-#define _GUARD_BIT_IS_SET_POP_r00 785
-#define _GUARD_BIT_IS_SET_POP_r10 786
-#define _GUARD_BIT_IS_SET_POP_r21 787
-#define _GUARD_BIT_IS_SET_POP_r32 788
-#define _GUARD_BIT_IS_SET_POP_4_r00 789
-#define _GUARD_BIT_IS_SET_POP_4_r10 790
-#define _GUARD_BIT_IS_SET_POP_4_r21 791
-#define _GUARD_BIT_IS_SET_POP_4_r32 792
-#define _GUARD_BIT_IS_SET_POP_5_r00 793
-#define _GUARD_BIT_IS_SET_POP_5_r10 794
-#define _GUARD_BIT_IS_SET_POP_5_r21 795
-#define _GUARD_BIT_IS_SET_POP_5_r32 796
-#define _GUARD_BIT_IS_SET_POP_6_r00 797
-#define _GUARD_BIT_IS_SET_POP_6_r10 798
-#define _GUARD_BIT_IS_SET_POP_6_r21 799
-#define _GUARD_BIT_IS_SET_POP_6_r32 800
-#define _GUARD_BIT_IS_SET_POP_7_r00 801
-#define _GUARD_BIT_IS_SET_POP_7_r10 802
-#define _GUARD_BIT_IS_SET_POP_7_r21 803
-#define _GUARD_BIT_IS_SET_POP_7_r32 804
-#define _GUARD_BIT_IS_UNSET_POP_r00 805
-#define _GUARD_BIT_IS_UNSET_POP_r10 806
-#define _GUARD_BIT_IS_UNSET_POP_r21 807
-#define _GUARD_BIT_IS_UNSET_POP_r32 808
-#define _GUARD_BIT_IS_UNSET_POP_4_r00 809
-#define _GUARD_BIT_IS_UNSET_POP_4_r10 810
-#define _GUARD_BIT_IS_UNSET_POP_4_r21 811
-#define _GUARD_BIT_IS_UNSET_POP_4_r32 812
-#define _GUARD_BIT_IS_UNSET_POP_5_r00 813
-#define _GUARD_BIT_IS_UNSET_POP_5_r10 814
-#define _GUARD_BIT_IS_UNSET_POP_5_r21 815
-#define _GUARD_BIT_IS_UNSET_POP_5_r32 816
-#define _GUARD_BIT_IS_UNSET_POP_6_r00 817
-#define _GUARD_BIT_IS_UNSET_POP_6_r10 818
-#define _GUARD_BIT_IS_UNSET_POP_6_r21 819
-#define _GUARD_BIT_IS_UNSET_POP_6_r32 820
-#define _GUARD_BIT_IS_UNSET_POP_7_r00 821
-#define _GUARD_BIT_IS_UNSET_POP_7_r10 822
-#define _GUARD_BIT_IS_UNSET_POP_7_r21 823
-#define _GUARD_BIT_IS_UNSET_POP_7_r32 824
-#define _GUARD_CALLABLE_ISINSTANCE_r03 825
-#define _GUARD_CALLABLE_ISINSTANCE_r13 826
-#define _GUARD_CALLABLE_ISINSTANCE_r23 827
-#define _GUARD_CALLABLE_ISINSTANCE_r33 828
-#define _GUARD_CALLABLE_LEN_r03 829
-#define _GUARD_CALLABLE_LEN_r13 830
-#define _GUARD_CALLABLE_LEN_r23 831
-#define _GUARD_CALLABLE_LEN_r33 832
-#define _GUARD_CALLABLE_LIST_APPEND_r03 833
-#define _GUARD_CALLABLE_LIST_APPEND_r13 834
-#define _GUARD_CALLABLE_LIST_APPEND_r23 835
-#define _GUARD_CALLABLE_LIST_APPEND_r33 836
-#define _GUARD_CALLABLE_STR_1_r03 837
-#define _GUARD_CALLABLE_STR_1_r13 838
-#define _GUARD_CALLABLE_STR_1_r23 839
-#define _GUARD_CALLABLE_STR_1_r33 840
-#define _GUARD_CALLABLE_TUPLE_1_r03 841
-#define _GUARD_CALLABLE_TUPLE_1_r13 842
-#define _GUARD_CALLABLE_TUPLE_1_r23 843
-#define _GUARD_CALLABLE_TUPLE_1_r33 844
-#define _GUARD_CALLABLE_TYPE_1_r03 845
-#define _GUARD_CALLABLE_TYPE_1_r13 846
-#define _GUARD_CALLABLE_TYPE_1_r23 847
-#define _GUARD_CALLABLE_TYPE_1_r33 848
-#define _GUARD_DORV_NO_DICT_r01 849
-#define _GUARD_DORV_NO_DICT_r11 850
-#define _GUARD_DORV_NO_DICT_r22 851
-#define _GUARD_DORV_NO_DICT_r33 852
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 853
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 854
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 855
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 856
-#define _GUARD_GLOBALS_VERSION_r00 857
-#define _GUARD_GLOBALS_VERSION_r11 858
-#define _GUARD_GLOBALS_VERSION_r22 859
-#define _GUARD_GLOBALS_VERSION_r33 860
-#define _GUARD_IP_RETURN_GENERATOR_r00 861
-#define _GUARD_IP_RETURN_GENERATOR_r11 862
-#define _GUARD_IP_RETURN_GENERATOR_r22 863
-#define _GUARD_IP_RETURN_GENERATOR_r33 864
-#define _GUARD_IP_RETURN_VALUE_r00 865
-#define _GUARD_IP_RETURN_VALUE_r11 866
-#define _GUARD_IP_RETURN_VALUE_r22 867
-#define _GUARD_IP_RETURN_VALUE_r33 868
-#define _GUARD_IP_YIELD_VALUE_r00 869
-#define _GUARD_IP_YIELD_VALUE_r11 870
-#define _GUARD_IP_YIELD_VALUE_r22 871
-#define _GUARD_IP_YIELD_VALUE_r33 872
-#define _GUARD_IP__PUSH_FRAME_r00 873
-#define _GUARD_IP__PUSH_FRAME_r11 874
-#define _GUARD_IP__PUSH_FRAME_r22 875
-#define _GUARD_IP__PUSH_FRAME_r33 876
-#define _GUARD_IS_FALSE_POP_r00 877
-#define _GUARD_IS_FALSE_POP_r10 878
-#define _GUARD_IS_FALSE_POP_r21 879
-#define _GUARD_IS_FALSE_POP_r32 880
-#define _GUARD_IS_NONE_POP_r00 881
-#define _GUARD_IS_NONE_POP_r10 882
-#define _GUARD_IS_NONE_POP_r21 883
-#define _GUARD_IS_NONE_POP_r32 884
-#define _GUARD_IS_NOT_NONE_POP_r10 885
-#define _GUARD_IS_TRUE_POP_r00 886
-#define _GUARD_IS_TRUE_POP_r10 887
-#define _GUARD_IS_TRUE_POP_r21 888
-#define _GUARD_IS_TRUE_POP_r32 889
-#define _GUARD_KEYS_VERSION_r01 890
-#define _GUARD_KEYS_VERSION_r11 891
-#define _GUARD_KEYS_VERSION_r22 892
-#define _GUARD_KEYS_VERSION_r33 893
-#define _GUARD_NOS_COMPACT_ASCII_r02 894
-#define _GUARD_NOS_COMPACT_ASCII_r12 895
-#define _GUARD_NOS_COMPACT_ASCII_r22 896
-#define _GUARD_NOS_COMPACT_ASCII_r33 897
-#define _GUARD_NOS_DICT_r02 898
-#define _GUARD_NOS_DICT_r12 899
-#define _GUARD_NOS_DICT_r22 900
-#define _GUARD_NOS_DICT_r33 901
-#define _GUARD_NOS_FLOAT_r02 902
-#define _GUARD_NOS_FLOAT_r12 903
-#define _GUARD_NOS_FLOAT_r22 904
-#define _GUARD_NOS_FLOAT_r33 905
-#define _GUARD_NOS_INT_r02 906
-#define _GUARD_NOS_INT_r12 907
-#define _GUARD_NOS_INT_r22 908
-#define _GUARD_NOS_INT_r33 909
-#define _GUARD_NOS_LIST_r02 910
-#define _GUARD_NOS_LIST_r12 911
-#define _GUARD_NOS_LIST_r22 912
-#define _GUARD_NOS_LIST_r33 913
-#define _GUARD_NOS_NOT_NULL_r02 914
-#define _GUARD_NOS_NOT_NULL_r12 915
-#define _GUARD_NOS_NOT_NULL_r22 916
-#define _GUARD_NOS_NOT_NULL_r33 917
-#define _GUARD_NOS_NULL_r02 918
-#define _GUARD_NOS_NULL_r12 919
-#define _GUARD_NOS_NULL_r22 920
-#define _GUARD_NOS_NULL_r33 921
-#define _GUARD_NOS_OVERFLOWED_r02 922
-#define _GUARD_NOS_OVERFLOWED_r12 923
-#define _GUARD_NOS_OVERFLOWED_r22 924
-#define _GUARD_NOS_OVERFLOWED_r33 925
-#define _GUARD_NOS_TUPLE_r02 926
-#define _GUARD_NOS_TUPLE_r12 927
-#define _GUARD_NOS_TUPLE_r22 928
-#define _GUARD_NOS_TUPLE_r33 929
-#define _GUARD_NOS_UNICODE_r02 930
-#define _GUARD_NOS_UNICODE_r12 931
-#define _GUARD_NOS_UNICODE_r22 932
-#define _GUARD_NOS_UNICODE_r33 933
-#define _GUARD_NOT_EXHAUSTED_LIST_r02 934
-#define _GUARD_NOT_EXHAUSTED_LIST_r12 935
-#define _GUARD_NOT_EXHAUSTED_LIST_r22 936
-#define _GUARD_NOT_EXHAUSTED_LIST_r33 937
-#define _GUARD_NOT_EXHAUSTED_RANGE_r02 938
-#define _GUARD_NOT_EXHAUSTED_RANGE_r12 939
-#define _GUARD_NOT_EXHAUSTED_RANGE_r22 940
-#define _GUARD_NOT_EXHAUSTED_RANGE_r33 941
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 942
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 943
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 944
-#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 945
-#define _GUARD_THIRD_NULL_r03 946
-#define _GUARD_THIRD_NULL_r13 947
-#define _GUARD_THIRD_NULL_r23 948
-#define _GUARD_THIRD_NULL_r33 949
-#define _GUARD_TOS_ANY_SET_r01 950
-#define _GUARD_TOS_ANY_SET_r11 951
-#define _GUARD_TOS_ANY_SET_r22 952
-#define _GUARD_TOS_ANY_SET_r33 953
-#define _GUARD_TOS_DICT_r01 954
-#define _GUARD_TOS_DICT_r11 955
-#define _GUARD_TOS_DICT_r22 956
-#define _GUARD_TOS_DICT_r33 957
-#define _GUARD_TOS_FLOAT_r01 958
-#define _GUARD_TOS_FLOAT_r11 959
-#define _GUARD_TOS_FLOAT_r22 960
-#define _GUARD_TOS_FLOAT_r33 961
-#define _GUARD_TOS_INT_r01 962
-#define _GUARD_TOS_INT_r11 963
-#define _GUARD_TOS_INT_r22 964
-#define _GUARD_TOS_INT_r33 965
-#define _GUARD_TOS_LIST_r01 966
-#define _GUARD_TOS_LIST_r11 967
-#define _GUARD_TOS_LIST_r22 968
-#define _GUARD_TOS_LIST_r33 969
-#define _GUARD_TOS_OVERFLOWED_r01 970
-#define _GUARD_TOS_OVERFLOWED_r11 971
-#define _GUARD_TOS_OVERFLOWED_r22 972
-#define _GUARD_TOS_OVERFLOWED_r33 973
-#define _GUARD_TOS_SLICE_r01 974
-#define _GUARD_TOS_SLICE_r11 975
-#define _GUARD_TOS_SLICE_r22 976
-#define _GUARD_TOS_SLICE_r33 977
-#define _GUARD_TOS_TUPLE_r01 978
-#define _GUARD_TOS_TUPLE_r11 979
-#define _GUARD_TOS_TUPLE_r22 980
-#define _GUARD_TOS_TUPLE_r33 981
-#define _GUARD_TOS_UNICODE_r01 982
-#define _GUARD_TOS_UNICODE_r11 983
-#define _GUARD_TOS_UNICODE_r22 984
-#define _GUARD_TOS_UNICODE_r33 985
-#define _GUARD_TYPE_VERSION_r01 986
-#define _GUARD_TYPE_VERSION_r11 987
-#define _GUARD_TYPE_VERSION_r22 988
-#define _GUARD_TYPE_VERSION_r33 989
-#define _GUARD_TYPE_VERSION_AND_LOCK_r01 990
-#define _GUARD_TYPE_VERSION_AND_LOCK_r11 991
-#define _GUARD_TYPE_VERSION_AND_LOCK_r22 992
-#define _GUARD_TYPE_VERSION_AND_LOCK_r33 993
-#define _HANDLE_PENDING_AND_DEOPT_r00 994
-#define _HANDLE_PENDING_AND_DEOPT_r10 995
-#define _HANDLE_PENDING_AND_DEOPT_r20 996
-#define _HANDLE_PENDING_AND_DEOPT_r30 997
-#define _IMPORT_FROM_r12 998
-#define _IMPORT_NAME_r21 999
-#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1000
-#define _INIT_CALL_PY_EXACT_ARGS_r01 1001
-#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1002
-#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1003
-#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1004
-#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1005
-#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1006
-#define _INSERT_1_LOAD_CONST_INLINE_r02 1007
-#define _INSERT_1_LOAD_CONST_INLINE_r12 1008
-#define _INSERT_1_LOAD_CONST_INLINE_r23 1009
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1010
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1011
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1012
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1013
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1014
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1015
-#define _INSERT_NULL_r10 1016
-#define _INSTRUMENTED_FOR_ITER_r23 1017
-#define _INSTRUMENTED_INSTRUCTION_r00 1018
-#define _INSTRUMENTED_JUMP_FORWARD_r00 1019
-#define _INSTRUMENTED_JUMP_FORWARD_r11 1020
-#define _INSTRUMENTED_JUMP_FORWARD_r22 1021
-#define _INSTRUMENTED_JUMP_FORWARD_r33 1022
-#define _INSTRUMENTED_LINE_r00 1023
-#define _INSTRUMENTED_NOT_TAKEN_r00 1024
-#define _INSTRUMENTED_NOT_TAKEN_r11 1025
-#define _INSTRUMENTED_NOT_TAKEN_r22 1026
-#define _INSTRUMENTED_NOT_TAKEN_r33 1027
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1028
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1029
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1030
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1031
-#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1032
-#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1033
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1034
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1035
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1036
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1037
-#define _IS_NONE_r11 1038
-#define _IS_OP_r03 1039
-#define _IS_OP_r13 1040
-#define _IS_OP_r23 1041
-#define _ITER_CHECK_LIST_r02 1042
-#define _ITER_CHECK_LIST_r12 1043
-#define _ITER_CHECK_LIST_r22 1044
-#define _ITER_CHECK_LIST_r33 1045
-#define _ITER_CHECK_RANGE_r02 1046
-#define _ITER_CHECK_RANGE_r12 1047
-#define _ITER_CHECK_RANGE_r22 1048
-#define _ITER_CHECK_RANGE_r33 1049
-#define _ITER_CHECK_TUPLE_r02 1050
-#define _ITER_CHECK_TUPLE_r12 1051
-#define _ITER_CHECK_TUPLE_r22 1052
-#define _ITER_CHECK_TUPLE_r33 1053
-#define _ITER_JUMP_LIST_r02 1054
-#define _ITER_JUMP_LIST_r12 1055
-#define _ITER_JUMP_LIST_r22 1056
-#define _ITER_JUMP_LIST_r33 1057
-#define _ITER_JUMP_RANGE_r02 1058
-#define _ITER_JUMP_RANGE_r12 1059
-#define _ITER_JUMP_RANGE_r22 1060
-#define _ITER_JUMP_RANGE_r33 1061
-#define _ITER_JUMP_TUPLE_r02 1062
-#define _ITER_JUMP_TUPLE_r12 1063
-#define _ITER_JUMP_TUPLE_r22 1064
-#define _ITER_JUMP_TUPLE_r33 1065
-#define _ITER_NEXT_LIST_r23 1066
-#define _ITER_NEXT_LIST_TIER_TWO_r23 1067
-#define _ITER_NEXT_RANGE_r03 1068
-#define _ITER_NEXT_RANGE_r13 1069
-#define _ITER_NEXT_RANGE_r23 1070
-#define _ITER_NEXT_TUPLE_r03 1071
-#define _ITER_NEXT_TUPLE_r13 1072
-#define _ITER_NEXT_TUPLE_r23 1073
-#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1074
-#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1075
-#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1076
-#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1077
-#define _JUMP_TO_TOP_r00 1078
-#define _LIST_APPEND_r10 1079
-#define _LIST_EXTEND_r10 1080
-#define _LOAD_ATTR_r10 1081
-#define _LOAD_ATTR_CLASS_r11 1082
-#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1083
-#define _LOAD_ATTR_INSTANCE_VALUE_r02 1084
-#define _LOAD_ATTR_INSTANCE_VALUE_r12 1085
-#define _LOAD_ATTR_INSTANCE_VALUE_r23 1086
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1087
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1088
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1089
-#define _LOAD_ATTR_METHOD_NO_DICT_r02 1090
-#define _LOAD_ATTR_METHOD_NO_DICT_r12 1091
-#define _LOAD_ATTR_METHOD_NO_DICT_r23 1092
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1093
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1094
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1095
-#define _LOAD_ATTR_MODULE_r12 1096
-#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1097
-#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1098
-#define _LOAD_ATTR_PROPERTY_FRAME_r11 1099
-#define _LOAD_ATTR_SLOT_r02 1100
-#define _LOAD_ATTR_SLOT_r12 1101
-#define _LOAD_ATTR_SLOT_r23 1102
-#define _LOAD_ATTR_WITH_HINT_r12 1103
-#define _LOAD_BUILD_CLASS_r01 1104
-#define _LOAD_BYTECODE_r00 1105
-#define _LOAD_COMMON_CONSTANT_r01 1106
-#define _LOAD_COMMON_CONSTANT_r12 1107
-#define _LOAD_COMMON_CONSTANT_r23 1108
-#define _LOAD_CONST_r01 1109
-#define _LOAD_CONST_r12 1110
-#define _LOAD_CONST_r23 1111
-#define _LOAD_CONST_INLINE_r01 1112
-#define _LOAD_CONST_INLINE_r12 1113
-#define _LOAD_CONST_INLINE_r23 1114
-#define _LOAD_CONST_INLINE_BORROW_r01 1115
-#define _LOAD_CONST_INLINE_BORROW_r12 1116
-#define _LOAD_CONST_INLINE_BORROW_r23 1117
-#define _LOAD_CONST_UNDER_INLINE_r02 1118
-#define _LOAD_CONST_UNDER_INLINE_r12 1119
-#define _LOAD_CONST_UNDER_INLINE_r23 1120
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1121
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1122
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1123
-#define _LOAD_DEREF_r01 1124
-#define _LOAD_FAST_r01 1125
-#define _LOAD_FAST_r12 1126
-#define _LOAD_FAST_r23 1127
-#define _LOAD_FAST_0_r01 1128
-#define _LOAD_FAST_0_r12 1129
-#define _LOAD_FAST_0_r23 1130
-#define _LOAD_FAST_1_r01 1131
-#define _LOAD_FAST_1_r12 1132
-#define _LOAD_FAST_1_r23 1133
-#define _LOAD_FAST_2_r01 1134
-#define _LOAD_FAST_2_r12 1135
-#define _LOAD_FAST_2_r23 1136
-#define _LOAD_FAST_3_r01 1137
-#define _LOAD_FAST_3_r12 1138
-#define _LOAD_FAST_3_r23 1139
-#define _LOAD_FAST_4_r01 1140
-#define _LOAD_FAST_4_r12 1141
-#define _LOAD_FAST_4_r23 1142
-#define _LOAD_FAST_5_r01 1143
-#define _LOAD_FAST_5_r12 1144
-#define _LOAD_FAST_5_r23 1145
-#define _LOAD_FAST_6_r01 1146
-#define _LOAD_FAST_6_r12 1147
-#define _LOAD_FAST_6_r23 1148
-#define _LOAD_FAST_7_r01 1149
-#define _LOAD_FAST_7_r12 1150
-#define _LOAD_FAST_7_r23 1151
-#define _LOAD_FAST_AND_CLEAR_r01 1152
-#define _LOAD_FAST_AND_CLEAR_r12 1153
-#define _LOAD_FAST_AND_CLEAR_r23 1154
-#define _LOAD_FAST_BORROW_r01 1155
-#define _LOAD_FAST_BORROW_r12 1156
-#define _LOAD_FAST_BORROW_r23 1157
-#define _LOAD_FAST_BORROW_0_r01 1158
-#define _LOAD_FAST_BORROW_0_r12 1159
-#define _LOAD_FAST_BORROW_0_r23 1160
-#define _LOAD_FAST_BORROW_1_r01 1161
-#define _LOAD_FAST_BORROW_1_r12 1162
-#define _LOAD_FAST_BORROW_1_r23 1163
-#define _LOAD_FAST_BORROW_2_r01 1164
-#define _LOAD_FAST_BORROW_2_r12 1165
-#define _LOAD_FAST_BORROW_2_r23 1166
-#define _LOAD_FAST_BORROW_3_r01 1167
-#define _LOAD_FAST_BORROW_3_r12 1168
-#define _LOAD_FAST_BORROW_3_r23 1169
-#define _LOAD_FAST_BORROW_4_r01 1170
-#define _LOAD_FAST_BORROW_4_r12 1171
-#define _LOAD_FAST_BORROW_4_r23 1172
-#define _LOAD_FAST_BORROW_5_r01 1173
-#define _LOAD_FAST_BORROW_5_r12 1174
-#define _LOAD_FAST_BORROW_5_r23 1175
-#define _LOAD_FAST_BORROW_6_r01 1176
-#define _LOAD_FAST_BORROW_6_r12 1177
-#define _LOAD_FAST_BORROW_6_r23 1178
-#define _LOAD_FAST_BORROW_7_r01 1179
-#define _LOAD_FAST_BORROW_7_r12 1180
-#define _LOAD_FAST_BORROW_7_r23 1181
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1182
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1183
-#define _LOAD_FAST_CHECK_r01 1184
-#define _LOAD_FAST_CHECK_r12 1185
-#define _LOAD_FAST_CHECK_r23 1186
-#define _LOAD_FAST_LOAD_FAST_r02 1187
-#define _LOAD_FAST_LOAD_FAST_r13 1188
-#define _LOAD_FROM_DICT_OR_DEREF_r11 1189
-#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1190
-#define _LOAD_GLOBAL_r00 1191
-#define _LOAD_GLOBAL_BUILTINS_r01 1192
-#define _LOAD_GLOBAL_MODULE_r01 1193
-#define _LOAD_LOCALS_r01 1194
-#define _LOAD_LOCALS_r12 1195
-#define _LOAD_LOCALS_r23 1196
-#define _LOAD_NAME_r01 1197
-#define _LOAD_SMALL_INT_r01 1198
-#define _LOAD_SMALL_INT_r12 1199
-#define _LOAD_SMALL_INT_r23 1200
-#define _LOAD_SMALL_INT_0_r01 1201
-#define _LOAD_SMALL_INT_0_r12 1202
-#define _LOAD_SMALL_INT_0_r23 1203
-#define _LOAD_SMALL_INT_1_r01 1204
-#define _LOAD_SMALL_INT_1_r12 1205
-#define _LOAD_SMALL_INT_1_r23 1206
-#define _LOAD_SMALL_INT_2_r01 1207
-#define _LOAD_SMALL_INT_2_r12 1208
-#define _LOAD_SMALL_INT_2_r23 1209
-#define _LOAD_SMALL_INT_3_r01 1210
-#define _LOAD_SMALL_INT_3_r12 1211
-#define _LOAD_SMALL_INT_3_r23 1212
-#define _LOAD_SPECIAL_r00 1213
-#define _LOAD_SUPER_ATTR_ATTR_r31 1214
-#define _LOAD_SUPER_ATTR_METHOD_r32 1215
-#define _MAKE_CALLARGS_A_TUPLE_r33 1216
-#define _MAKE_CELL_r00 1217
-#define _MAKE_FUNCTION_r11 1218
-#define _MAKE_WARM_r00 1219
-#define _MAKE_WARM_r11 1220
-#define _MAKE_WARM_r22 1221
-#define _MAKE_WARM_r33 1222
-#define _MAP_ADD_r20 1223
-#define _MATCH_CLASS_r31 1224
-#define _MATCH_KEYS_r23 1225
-#define _MATCH_MAPPING_r02 1226
-#define _MATCH_MAPPING_r12 1227
-#define _MATCH_MAPPING_r23 1228
-#define _MATCH_SEQUENCE_r02 1229
-#define _MATCH_SEQUENCE_r12 1230
-#define _MATCH_SEQUENCE_r23 1231
-#define _MAYBE_EXPAND_METHOD_r00 1232
-#define _MAYBE_EXPAND_METHOD_KW_r11 1233
-#define _MONITOR_CALL_r00 1234
-#define _MONITOR_CALL_KW_r11 1235
-#define _MONITOR_JUMP_BACKWARD_r00 1236
-#define _MONITOR_JUMP_BACKWARD_r11 1237
-#define _MONITOR_JUMP_BACKWARD_r22 1238
-#define _MONITOR_JUMP_BACKWARD_r33 1239
-#define _MONITOR_RESUME_r00 1240
-#define _NOP_r00 1241
-#define _NOP_r11 1242
-#define _NOP_r22 1243
-#define _NOP_r33 1244
-#define _POP_CALL_r20 1245
-#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1246
-#define _POP_CALL_ONE_r30 1247
-#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1248
-#define _POP_CALL_TWO_r30 1249
-#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1250
-#define _POP_EXCEPT_r10 1251
-#define _POP_ITER_r20 1252
-#define _POP_JUMP_IF_FALSE_r00 1253
-#define _POP_JUMP_IF_FALSE_r10 1254
-#define _POP_JUMP_IF_FALSE_r21 1255
-#define _POP_JUMP_IF_FALSE_r32 1256
-#define _POP_JUMP_IF_TRUE_r00 1257
-#define _POP_JUMP_IF_TRUE_r10 1258
-#define _POP_JUMP_IF_TRUE_r21 1259
-#define _POP_JUMP_IF_TRUE_r32 1260
-#define _POP_TOP_r10 1261
-#define _POP_TOP_FLOAT_r00 1262
-#define _POP_TOP_FLOAT_r10 1263
-#define _POP_TOP_FLOAT_r21 1264
-#define _POP_TOP_FLOAT_r32 1265
-#define _POP_TOP_INT_r00 1266
-#define _POP_TOP_INT_r10 1267
-#define _POP_TOP_INT_r21 1268
-#define _POP_TOP_INT_r32 1269
-#define _POP_TOP_LOAD_CONST_INLINE_r11 1270
-#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1271
-#define _POP_TOP_NOP_r00 1272
-#define _POP_TOP_NOP_r10 1273
-#define _POP_TOP_NOP_r21 1274
-#define _POP_TOP_NOP_r32 1275
-#define _POP_TOP_UNICODE_r00 1276
-#define _POP_TOP_UNICODE_r10 1277
-#define _POP_TOP_UNICODE_r21 1278
-#define _POP_TOP_UNICODE_r32 1279
-#define _POP_TWO_r20 1280
-#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1281
-#define _PUSH_EXC_INFO_r02 1282
-#define _PUSH_EXC_INFO_r12 1283
-#define _PUSH_EXC_INFO_r23 1284
-#define _PUSH_FRAME_r10 1285
-#define _PUSH_NULL_r01 1286
-#define _PUSH_NULL_r12 1287
-#define _PUSH_NULL_r23 1288
-#define _PUSH_NULL_CONDITIONAL_r00 1289
-#define _PY_FRAME_EX_r31 1290
-#define _PY_FRAME_GENERAL_r01 1291
-#define _PY_FRAME_KW_r11 1292
-#define _QUICKEN_RESUME_r00 1293
-#define _QUICKEN_RESUME_r11 1294
-#define _QUICKEN_RESUME_r22 1295
-#define _QUICKEN_RESUME_r33 1296
-#define _REPLACE_WITH_TRUE_r02 1297
-#define _REPLACE_WITH_TRUE_r12 1298
-#define _REPLACE_WITH_TRUE_r23 1299
-#define _RESUME_CHECK_r00 1300
-#define _RESUME_CHECK_r11 1301
-#define _RESUME_CHECK_r22 1302
-#define _RESUME_CHECK_r33 1303
-#define _RETURN_GENERATOR_r01 1304
-#define _RETURN_VALUE_r11 1305
-#define _SAVE_RETURN_OFFSET_r00 1306
-#define _SAVE_RETURN_OFFSET_r11 1307
-#define _SAVE_RETURN_OFFSET_r22 1308
-#define _SAVE_RETURN_OFFSET_r33 1309
-#define _SEND_r22 1310
-#define _SEND_GEN_FRAME_r22 1311
-#define _SETUP_ANNOTATIONS_r00 1312
-#define _SET_ADD_r10 1313
-#define _SET_FUNCTION_ATTRIBUTE_r01 1314
-#define _SET_FUNCTION_ATTRIBUTE_r11 1315
-#define _SET_FUNCTION_ATTRIBUTE_r21 1316
-#define _SET_FUNCTION_ATTRIBUTE_r32 1317
-#define _SET_IP_r00 1318
-#define _SET_IP_r11 1319
-#define _SET_IP_r22 1320
-#define _SET_IP_r33 1321
-#define _SET_UPDATE_r10 1322
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1323
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1324
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1325
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1326
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1327
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1328
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1329
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1330
-#define _SPILL_OR_RELOAD_r01 1331
-#define _SPILL_OR_RELOAD_r02 1332
-#define _SPILL_OR_RELOAD_r03 1333
-#define _SPILL_OR_RELOAD_r10 1334
-#define _SPILL_OR_RELOAD_r12 1335
-#define _SPILL_OR_RELOAD_r13 1336
-#define _SPILL_OR_RELOAD_r20 1337
-#define _SPILL_OR_RELOAD_r21 1338
-#define _SPILL_OR_RELOAD_r23 1339
-#define _SPILL_OR_RELOAD_r30 1340
-#define _SPILL_OR_RELOAD_r31 1341
-#define _SPILL_OR_RELOAD_r32 1342
-#define _START_EXECUTOR_r00 1343
-#define _STORE_ATTR_r20 1344
-#define _STORE_ATTR_INSTANCE_VALUE_r21 1345
-#define _STORE_ATTR_SLOT_r21 1346
-#define _STORE_ATTR_WITH_HINT_r21 1347
-#define _STORE_DEREF_r10 1348
-#define _STORE_FAST_LOAD_FAST_r11 1349
-#define _STORE_FAST_STORE_FAST_r20 1350
-#define _STORE_GLOBAL_r10 1351
-#define _STORE_NAME_r10 1352
-#define _STORE_SLICE_r30 1353
-#define _STORE_SUBSCR_r30 1354
-#define _STORE_SUBSCR_DICT_r31 1355
-#define _STORE_SUBSCR_LIST_INT_r32 1356
-#define _SWAP_r11 1357
-#define _SWAP_2_r02 1358
-#define _SWAP_2_r12 1359
-#define _SWAP_2_r22 1360
-#define _SWAP_2_r33 1361
-#define _SWAP_3_r03 1362
-#define _SWAP_3_r13 1363
-#define _SWAP_3_r23 1364
-#define _SWAP_3_r33 1365
-#define _SWAP_FAST_r01 1366
-#define _SWAP_FAST_r11 1367
-#define _SWAP_FAST_r22 1368
-#define _SWAP_FAST_r33 1369
-#define _SWAP_FAST_0_r01 1370
-#define _SWAP_FAST_0_r11 1371
-#define _SWAP_FAST_0_r22 1372
-#define _SWAP_FAST_0_r33 1373
-#define _SWAP_FAST_1_r01 1374
-#define _SWAP_FAST_1_r11 1375
-#define _SWAP_FAST_1_r22 1376
-#define _SWAP_FAST_1_r33 1377
-#define _SWAP_FAST_2_r01 1378
-#define _SWAP_FAST_2_r11 1379
-#define _SWAP_FAST_2_r22 1380
-#define _SWAP_FAST_2_r33 1381
-#define _SWAP_FAST_3_r01 1382
-#define _SWAP_FAST_3_r11 1383
-#define _SWAP_FAST_3_r22 1384
-#define _SWAP_FAST_3_r33 1385
-#define _SWAP_FAST_4_r01 1386
-#define _SWAP_FAST_4_r11 1387
-#define _SWAP_FAST_4_r22 1388
-#define _SWAP_FAST_4_r33 1389
-#define _SWAP_FAST_5_r01 1390
-#define _SWAP_FAST_5_r11 1391
-#define _SWAP_FAST_5_r22 1392
-#define _SWAP_FAST_5_r33 1393
-#define _SWAP_FAST_6_r01 1394
-#define _SWAP_FAST_6_r11 1395
-#define _SWAP_FAST_6_r22 1396
-#define _SWAP_FAST_6_r33 1397
-#define _SWAP_FAST_7_r01 1398
-#define _SWAP_FAST_7_r11 1399
-#define _SWAP_FAST_7_r22 1400
-#define _SWAP_FAST_7_r33 1401
-#define _TIER2_RESUME_CHECK_r00 1402
-#define _TIER2_RESUME_CHECK_r11 1403
-#define _TIER2_RESUME_CHECK_r22 1404
-#define _TIER2_RESUME_CHECK_r33 1405
-#define _TO_BOOL_r11 1406
-#define _TO_BOOL_BOOL_r01 1407
-#define _TO_BOOL_BOOL_r11 1408
-#define _TO_BOOL_BOOL_r22 1409
-#define _TO_BOOL_BOOL_r33 1410
-#define _TO_BOOL_INT_r02 1411
-#define _TO_BOOL_INT_r12 1412
-#define _TO_BOOL_INT_r23 1413
-#define _TO_BOOL_LIST_r02 1414
-#define _TO_BOOL_LIST_r12 1415
-#define _TO_BOOL_LIST_r23 1416
-#define _TO_BOOL_NONE_r01 1417
-#define _TO_BOOL_NONE_r11 1418
-#define _TO_BOOL_NONE_r22 1419
-#define _TO_BOOL_NONE_r33 1420
-#define _TO_BOOL_STR_r02 1421
-#define _TO_BOOL_STR_r12 1422
-#define _TO_BOOL_STR_r23 1423
-#define _TRACE_RECORD_r00 1424
-#define _UNARY_INVERT_r12 1425
-#define _UNARY_NEGATIVE_r12 1426
-#define _UNARY_NOT_r01 1427
-#define _UNARY_NOT_r11 1428
-#define _UNARY_NOT_r22 1429
-#define _UNARY_NOT_r33 1430
-#define _UNPACK_EX_r10 1431
-#define _UNPACK_SEQUENCE_r10 1432
-#define _UNPACK_SEQUENCE_LIST_r10 1433
-#define _UNPACK_SEQUENCE_TUPLE_r10 1434
-#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1435
-#define _WITH_EXCEPT_START_r33 1436
-#define _YIELD_VALUE_r11 1437
-#define MAX_UOP_REGS_ID 1437
+#define _YIELD_VALUE 589
+#define MAX_UOP_ID 589
+#define _BINARY_OP_r23 590
+#define _BINARY_OP_ADD_FLOAT_r03 591
+#define _BINARY_OP_ADD_FLOAT_r13 592
+#define _BINARY_OP_ADD_FLOAT_r23 593
+#define _BINARY_OP_ADD_INT_r03 594
+#define _BINARY_OP_ADD_INT_r13 595
+#define _BINARY_OP_ADD_INT_r23 596
+#define _BINARY_OP_ADD_UNICODE_r03 597
+#define _BINARY_OP_ADD_UNICODE_r13 598
+#define _BINARY_OP_ADD_UNICODE_r23 599
+#define _BINARY_OP_EXTEND_r23 600
+#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 601
+#define _BINARY_OP_MULTIPLY_FLOAT_r03 602
+#define _BINARY_OP_MULTIPLY_FLOAT_r13 603
+#define _BINARY_OP_MULTIPLY_FLOAT_r23 604
+#define _BINARY_OP_MULTIPLY_INT_r03 605
+#define _BINARY_OP_MULTIPLY_INT_r13 606
+#define _BINARY_OP_MULTIPLY_INT_r23 607
+#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 608
+#define _BINARY_OP_SUBSCR_DICT_r23 609
+#define _BINARY_OP_SUBSCR_INIT_CALL_r01 610
+#define _BINARY_OP_SUBSCR_INIT_CALL_r11 611
+#define _BINARY_OP_SUBSCR_INIT_CALL_r21 612
+#define _BINARY_OP_SUBSCR_INIT_CALL_r31 613
+#define _BINARY_OP_SUBSCR_LIST_INT_r23 614
+#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 615
+#define _BINARY_OP_SUBSCR_STR_INT_r23 616
+#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 617
+#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 618
+#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 619
+#define _BINARY_OP_SUBSCR_USTR_INT_r23 620
+#define _BINARY_OP_SUBTRACT_FLOAT_r03 621
+#define _BINARY_OP_SUBTRACT_FLOAT_r13 622
+#define _BINARY_OP_SUBTRACT_FLOAT_r23 623
+#define _BINARY_OP_SUBTRACT_INT_r03 624
+#define _BINARY_OP_SUBTRACT_INT_r13 625
+#define _BINARY_OP_SUBTRACT_INT_r23 626
+#define _BINARY_SLICE_r31 627
+#define _BUILD_INTERPOLATION_r01 628
+#define _BUILD_LIST_r01 629
+#define _BUILD_MAP_r01 630
+#define _BUILD_SET_r01 631
+#define _BUILD_SLICE_r01 632
+#define _BUILD_STRING_r01 633
+#define _BUILD_TEMPLATE_r21 634
+#define _BUILD_TUPLE_r01 635
+#define _CALL_BUILTIN_CLASS_r01 636
+#define _CALL_BUILTIN_FAST_r01 637
+#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 638
+#define _CALL_BUILTIN_O_r03 639
+#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 640
+#define _CALL_INTRINSIC_1_r11 641
+#define _CALL_INTRINSIC_2_r21 642
+#define _CALL_ISINSTANCE_r31 643
+#define _CALL_KW_NON_PY_r11 644
+#define _CALL_LEN_r33 645
+#define _CALL_LIST_APPEND_r03 646
+#define _CALL_LIST_APPEND_r13 647
+#define _CALL_LIST_APPEND_r23 648
+#define _CALL_LIST_APPEND_r33 649
+#define _CALL_METHOD_DESCRIPTOR_FAST_r01 650
+#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 651
+#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 652
+#define _CALL_METHOD_DESCRIPTOR_O_r03 653
+#define _CALL_NON_PY_GENERAL_r01 654
+#define _CALL_STR_1_r32 655
+#define _CALL_TUPLE_1_r32 656
+#define _CALL_TYPE_1_r02 657
+#define _CALL_TYPE_1_r12 658
+#define _CALL_TYPE_1_r22 659
+#define _CALL_TYPE_1_r32 660
+#define _CHECK_AND_ALLOCATE_OBJECT_r00 661
+#define _CHECK_ATTR_CLASS_r01 662
+#define _CHECK_ATTR_CLASS_r11 663
+#define _CHECK_ATTR_CLASS_r22 664
+#define _CHECK_ATTR_CLASS_r33 665
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 666
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 667
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 668
+#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 669
+#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 670
+#define _CHECK_EG_MATCH_r22 671
+#define _CHECK_EXC_MATCH_r22 672
+#define _CHECK_FUNCTION_EXACT_ARGS_r00 673
+#define _CHECK_FUNCTION_VERSION_r00 674
+#define _CHECK_FUNCTION_VERSION_INLINE_r00 675
+#define _CHECK_FUNCTION_VERSION_INLINE_r11 676
+#define _CHECK_FUNCTION_VERSION_INLINE_r22 677
+#define _CHECK_FUNCTION_VERSION_INLINE_r33 678
+#define _CHECK_FUNCTION_VERSION_KW_r11 679
+#define _CHECK_IS_NOT_PY_CALLABLE_r00 680
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 681
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 682
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 683
+#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 684
+#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 685
+#define _CHECK_IS_PY_CALLABLE_EX_r03 686
+#define _CHECK_IS_PY_CALLABLE_EX_r13 687
+#define _CHECK_IS_PY_CALLABLE_EX_r23 688
+#define _CHECK_IS_PY_CALLABLE_EX_r33 689
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 690
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 691
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 692
+#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 693
+#define _CHECK_METHOD_VERSION_r00 694
+#define _CHECK_METHOD_VERSION_KW_r11 695
+#define _CHECK_PEP_523_r00 696
+#define _CHECK_PEP_523_r11 697
+#define _CHECK_PEP_523_r22 698
+#define _CHECK_PEP_523_r33 699
+#define _CHECK_PERIODIC_r00 700
+#define _CHECK_PERIODIC_AT_END_r00 701
+#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 702
+#define _CHECK_RECURSION_REMAINING_r00 703
+#define _CHECK_RECURSION_REMAINING_r11 704
+#define _CHECK_RECURSION_REMAINING_r22 705
+#define _CHECK_RECURSION_REMAINING_r33 706
+#define _CHECK_STACK_SPACE_r00 707
+#define _CHECK_STACK_SPACE_OPERAND_r00 708
+#define _CHECK_STACK_SPACE_OPERAND_r11 709
+#define _CHECK_STACK_SPACE_OPERAND_r22 710
+#define _CHECK_STACK_SPACE_OPERAND_r33 711
+#define _CHECK_VALIDITY_r00 712
+#define _CHECK_VALIDITY_r11 713
+#define _CHECK_VALIDITY_r22 714
+#define _CHECK_VALIDITY_r33 715
+#define _COLD_DYNAMIC_EXIT_r00 716
+#define _COLD_EXIT_r00 717
+#define _COMPARE_OP_r21 718
+#define _COMPARE_OP_FLOAT_r03 719
+#define _COMPARE_OP_FLOAT_r13 720
+#define _COMPARE_OP_FLOAT_r23 721
+#define _COMPARE_OP_INT_r23 722
+#define _COMPARE_OP_STR_r23 723
+#define _CONTAINS_OP_r23 724
+#define _CONTAINS_OP_DICT_r23 725
+#define _CONTAINS_OP_SET_r23 726
+#define _CONVERT_VALUE_r11 727
+#define _COPY_r01 728
+#define _COPY_1_r02 729
+#define _COPY_1_r12 730
+#define _COPY_1_r23 731
+#define _COPY_2_r03 732
+#define _COPY_2_r13 733
+#define _COPY_2_r23 734
+#define _COPY_3_r03 735
+#define _COPY_3_r13 736
+#define _COPY_3_r23 737
+#define _COPY_3_r33 738
+#define _COPY_FREE_VARS_r00 739
+#define _COPY_FREE_VARS_r11 740
+#define _COPY_FREE_VARS_r22 741
+#define _COPY_FREE_VARS_r33 742
+#define _CREATE_INIT_FRAME_r01 743
+#define _DELETE_ATTR_r10 744
+#define _DELETE_DEREF_r00 745
+#define _DELETE_FAST_r00 746
+#define _DELETE_GLOBAL_r00 747
+#define _DELETE_NAME_r00 748
+#define _DELETE_SUBSCR_r20 749
+#define _DEOPT_r00 750
+#define _DEOPT_r10 751
+#define _DEOPT_r20 752
+#define _DEOPT_r30 753
+#define _DICT_MERGE_r10 754
+#define _DICT_UPDATE_r10 755
+#define _DO_CALL_r01 756
+#define _DO_CALL_FUNCTION_EX_r31 757
+#define _DO_CALL_KW_r11 758
+#define _DYNAMIC_EXIT_r00 759
+#define _DYNAMIC_EXIT_r10 760
+#define _DYNAMIC_EXIT_r20 761
+#define _DYNAMIC_EXIT_r30 762
+#define _END_FOR_r10 763
+#define _END_SEND_r21 764
+#define _ERROR_POP_N_r00 765
+#define _EXIT_INIT_CHECK_r10 766
+#define _EXIT_TRACE_r00 767
+#define _EXIT_TRACE_r10 768
+#define _EXIT_TRACE_r20 769
+#define _EXIT_TRACE_r30 770
+#define _EXPAND_METHOD_r00 771
+#define _EXPAND_METHOD_KW_r11 772
+#define _FATAL_ERROR_r00 773
+#define _FATAL_ERROR_r11 774
+#define _FATAL_ERROR_r22 775
+#define _FATAL_ERROR_r33 776
+#define _FORMAT_SIMPLE_r11 777
+#define _FORMAT_WITH_SPEC_r21 778
+#define _FOR_ITER_r23 779
+#define _FOR_ITER_GEN_FRAME_r03 780
+#define _FOR_ITER_GEN_FRAME_r13 781
+#define _FOR_ITER_GEN_FRAME_r23 782
+#define _FOR_ITER_TIER_TWO_r23 783
+#define _GET_AITER_r11 784
+#define _GET_ANEXT_r12 785
+#define _GET_AWAITABLE_r11 786
+#define _GET_ITER_r12 787
+#define _GET_LEN_r12 788
+#define _GET_YIELD_FROM_ITER_r11 789
+#define _GUARD_BINARY_OP_EXTEND_r22 790
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 791
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 792
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 793
+#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 794
+#define _GUARD_BIT_IS_SET_POP_r00 795
+#define _GUARD_BIT_IS_SET_POP_r10 796
+#define _GUARD_BIT_IS_SET_POP_r21 797
+#define _GUARD_BIT_IS_SET_POP_r32 798
+#define _GUARD_BIT_IS_SET_POP_4_r00 799
+#define _GUARD_BIT_IS_SET_POP_4_r10 800
+#define _GUARD_BIT_IS_SET_POP_4_r21 801
+#define _GUARD_BIT_IS_SET_POP_4_r32 802
+#define _GUARD_BIT_IS_SET_POP_5_r00 803
+#define _GUARD_BIT_IS_SET_POP_5_r10 804
+#define _GUARD_BIT_IS_SET_POP_5_r21 805
+#define _GUARD_BIT_IS_SET_POP_5_r32 806
+#define _GUARD_BIT_IS_SET_POP_6_r00 807
+#define _GUARD_BIT_IS_SET_POP_6_r10 808
+#define _GUARD_BIT_IS_SET_POP_6_r21 809
+#define _GUARD_BIT_IS_SET_POP_6_r32 810
+#define _GUARD_BIT_IS_SET_POP_7_r00 811
+#define _GUARD_BIT_IS_SET_POP_7_r10 812
+#define _GUARD_BIT_IS_SET_POP_7_r21 813
+#define _GUARD_BIT_IS_SET_POP_7_r32 814
+#define _GUARD_BIT_IS_UNSET_POP_r00 815
+#define _GUARD_BIT_IS_UNSET_POP_r10 816
+#define _GUARD_BIT_IS_UNSET_POP_r21 817
+#define _GUARD_BIT_IS_UNSET_POP_r32 818
+#define _GUARD_BIT_IS_UNSET_POP_4_r00 819
+#define _GUARD_BIT_IS_UNSET_POP_4_r10 820
+#define _GUARD_BIT_IS_UNSET_POP_4_r21 821
+#define _GUARD_BIT_IS_UNSET_POP_4_r32 822
+#define _GUARD_BIT_IS_UNSET_POP_5_r00 823
+#define _GUARD_BIT_IS_UNSET_POP_5_r10 824
+#define _GUARD_BIT_IS_UNSET_POP_5_r21 825
+#define _GUARD_BIT_IS_UNSET_POP_5_r32 826
+#define _GUARD_BIT_IS_UNSET_POP_6_r00 827
+#define _GUARD_BIT_IS_UNSET_POP_6_r10 828
+#define _GUARD_BIT_IS_UNSET_POP_6_r21 829
+#define _GUARD_BIT_IS_UNSET_POP_6_r32 830
+#define _GUARD_BIT_IS_UNSET_POP_7_r00 831
+#define _GUARD_BIT_IS_UNSET_POP_7_r10 832
+#define _GUARD_BIT_IS_UNSET_POP_7_r21 833
+#define _GUARD_BIT_IS_UNSET_POP_7_r32 834
+#define _GUARD_CALLABLE_ISINSTANCE_r03 835
+#define _GUARD_CALLABLE_ISINSTANCE_r13 836
+#define _GUARD_CALLABLE_ISINSTANCE_r23 837
+#define _GUARD_CALLABLE_ISINSTANCE_r33 838
+#define _GUARD_CALLABLE_LEN_r03 839
+#define _GUARD_CALLABLE_LEN_r13 840
+#define _GUARD_CALLABLE_LEN_r23 841
+#define _GUARD_CALLABLE_LEN_r33 842
+#define _GUARD_CALLABLE_LIST_APPEND_r03 843
+#define _GUARD_CALLABLE_LIST_APPEND_r13 844
+#define _GUARD_CALLABLE_LIST_APPEND_r23 845
+#define _GUARD_CALLABLE_LIST_APPEND_r33 846
+#define _GUARD_CALLABLE_STR_1_r03 847
+#define _GUARD_CALLABLE_STR_1_r13 848
+#define _GUARD_CALLABLE_STR_1_r23 849
+#define _GUARD_CALLABLE_STR_1_r33 850
+#define _GUARD_CALLABLE_TUPLE_1_r03 851
+#define _GUARD_CALLABLE_TUPLE_1_r13 852
+#define _GUARD_CALLABLE_TUPLE_1_r23 853
+#define _GUARD_CALLABLE_TUPLE_1_r33 854
+#define _GUARD_CALLABLE_TYPE_1_r03 855
+#define _GUARD_CALLABLE_TYPE_1_r13 856
+#define _GUARD_CALLABLE_TYPE_1_r23 857
+#define _GUARD_CALLABLE_TYPE_1_r33 858
+#define _GUARD_DORV_NO_DICT_r01 859
+#define _GUARD_DORV_NO_DICT_r11 860
+#define _GUARD_DORV_NO_DICT_r22 861
+#define _GUARD_DORV_NO_DICT_r33 862
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 863
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 864
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 865
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 866
+#define _GUARD_GLOBALS_VERSION_r00 867
+#define _GUARD_GLOBALS_VERSION_r11 868
+#define _GUARD_GLOBALS_VERSION_r22 869
+#define _GUARD_GLOBALS_VERSION_r33 870
+#define _GUARD_IP_RETURN_GENERATOR_r00 871
+#define _GUARD_IP_RETURN_GENERATOR_r11 872
+#define _GUARD_IP_RETURN_GENERATOR_r22 873
+#define _GUARD_IP_RETURN_GENERATOR_r33 874
+#define _GUARD_IP_RETURN_VALUE_r00 875
+#define _GUARD_IP_RETURN_VALUE_r11 876
+#define _GUARD_IP_RETURN_VALUE_r22 877
+#define _GUARD_IP_RETURN_VALUE_r33 878
+#define _GUARD_IP_YIELD_VALUE_r00 879
+#define _GUARD_IP_YIELD_VALUE_r11 880
+#define _GUARD_IP_YIELD_VALUE_r22 881
+#define _GUARD_IP_YIELD_VALUE_r33 882
+#define _GUARD_IP__PUSH_FRAME_r00 883
+#define _GUARD_IP__PUSH_FRAME_r11 884
+#define _GUARD_IP__PUSH_FRAME_r22 885
+#define _GUARD_IP__PUSH_FRAME_r33 886
+#define _GUARD_IS_FALSE_POP_r00 887
+#define _GUARD_IS_FALSE_POP_r10 888
+#define _GUARD_IS_FALSE_POP_r21 889
+#define _GUARD_IS_FALSE_POP_r32 890
+#define _GUARD_IS_NONE_POP_r00 891
+#define _GUARD_IS_NONE_POP_r10 892
+#define _GUARD_IS_NONE_POP_r21 893
+#define _GUARD_IS_NONE_POP_r32 894
+#define _GUARD_IS_NOT_NONE_POP_r10 895
+#define _GUARD_IS_TRUE_POP_r00 896
+#define _GUARD_IS_TRUE_POP_r10 897
+#define _GUARD_IS_TRUE_POP_r21 898
+#define _GUARD_IS_TRUE_POP_r32 899
+#define _GUARD_KEYS_VERSION_r01 900
+#define _GUARD_KEYS_VERSION_r11 901
+#define _GUARD_KEYS_VERSION_r22 902
+#define _GUARD_KEYS_VERSION_r33 903
+#define _GUARD_NOS_COMPACT_ASCII_r02 904
+#define _GUARD_NOS_COMPACT_ASCII_r12 905
+#define _GUARD_NOS_COMPACT_ASCII_r22 906
+#define _GUARD_NOS_COMPACT_ASCII_r33 907
+#define _GUARD_NOS_DICT_r02 908
+#define _GUARD_NOS_DICT_r12 909
+#define _GUARD_NOS_DICT_r22 910
+#define _GUARD_NOS_DICT_r33 911
+#define _GUARD_NOS_FLOAT_r02 912
+#define _GUARD_NOS_FLOAT_r12 913
+#define _GUARD_NOS_FLOAT_r22 914
+#define _GUARD_NOS_FLOAT_r33 915
+#define _GUARD_NOS_INT_r02 916
+#define _GUARD_NOS_INT_r12 917
+#define _GUARD_NOS_INT_r22 918
+#define _GUARD_NOS_INT_r33 919
+#define _GUARD_NOS_LIST_r02 920
+#define _GUARD_NOS_LIST_r12 921
+#define _GUARD_NOS_LIST_r22 922
+#define _GUARD_NOS_LIST_r33 923
+#define _GUARD_NOS_NOT_NULL_r02 924
+#define _GUARD_NOS_NOT_NULL_r12 925
+#define _GUARD_NOS_NOT_NULL_r22 926
+#define _GUARD_NOS_NOT_NULL_r33 927
+#define _GUARD_NOS_NULL_r02 928
+#define _GUARD_NOS_NULL_r12 929
+#define _GUARD_NOS_NULL_r22 930
+#define _GUARD_NOS_NULL_r33 931
+#define _GUARD_NOS_OVERFLOWED_r02 932
+#define _GUARD_NOS_OVERFLOWED_r12 933
+#define _GUARD_NOS_OVERFLOWED_r22 934
+#define _GUARD_NOS_OVERFLOWED_r33 935
+#define _GUARD_NOS_TUPLE_r02 936
+#define _GUARD_NOS_TUPLE_r12 937
+#define _GUARD_NOS_TUPLE_r22 938
+#define _GUARD_NOS_TUPLE_r33 939
+#define _GUARD_NOS_UNICODE_r02 940
+#define _GUARD_NOS_UNICODE_r12 941
+#define _GUARD_NOS_UNICODE_r22 942
+#define _GUARD_NOS_UNICODE_r33 943
+#define _GUARD_NOT_EXHAUSTED_LIST_r02 944
+#define _GUARD_NOT_EXHAUSTED_LIST_r12 945
+#define _GUARD_NOT_EXHAUSTED_LIST_r22 946
+#define _GUARD_NOT_EXHAUSTED_LIST_r33 947
+#define _GUARD_NOT_EXHAUSTED_RANGE_r02 948
+#define _GUARD_NOT_EXHAUSTED_RANGE_r12 949
+#define _GUARD_NOT_EXHAUSTED_RANGE_r22 950
+#define _GUARD_NOT_EXHAUSTED_RANGE_r33 951
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 952
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 953
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 954
+#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 955
+#define _GUARD_THIRD_NULL_r03 956
+#define _GUARD_THIRD_NULL_r13 957
+#define _GUARD_THIRD_NULL_r23 958
+#define _GUARD_THIRD_NULL_r33 959
+#define _GUARD_TOS_ANY_SET_r01 960
+#define _GUARD_TOS_ANY_SET_r11 961
+#define _GUARD_TOS_ANY_SET_r22 962
+#define _GUARD_TOS_ANY_SET_r33 963
+#define _GUARD_TOS_DICT_r01 964
+#define _GUARD_TOS_DICT_r11 965
+#define _GUARD_TOS_DICT_r22 966
+#define _GUARD_TOS_DICT_r33 967
+#define _GUARD_TOS_FLOAT_r01 968
+#define _GUARD_TOS_FLOAT_r11 969
+#define _GUARD_TOS_FLOAT_r22 970
+#define _GUARD_TOS_FLOAT_r33 971
+#define _GUARD_TOS_INT_r01 972
+#define _GUARD_TOS_INT_r11 973
+#define _GUARD_TOS_INT_r22 974
+#define _GUARD_TOS_INT_r33 975
+#define _GUARD_TOS_LIST_r01 976
+#define _GUARD_TOS_LIST_r11 977
+#define _GUARD_TOS_LIST_r22 978
+#define _GUARD_TOS_LIST_r33 979
+#define _GUARD_TOS_OVERFLOWED_r01 980
+#define _GUARD_TOS_OVERFLOWED_r11 981
+#define _GUARD_TOS_OVERFLOWED_r22 982
+#define _GUARD_TOS_OVERFLOWED_r33 983
+#define _GUARD_TOS_SLICE_r01 984
+#define _GUARD_TOS_SLICE_r11 985
+#define _GUARD_TOS_SLICE_r22 986
+#define _GUARD_TOS_SLICE_r33 987
+#define _GUARD_TOS_TUPLE_r01 988
+#define _GUARD_TOS_TUPLE_r11 989
+#define _GUARD_TOS_TUPLE_r22 990
+#define _GUARD_TOS_TUPLE_r33 991
+#define _GUARD_TOS_UNICODE_r01 992
+#define _GUARD_TOS_UNICODE_r11 993
+#define _GUARD_TOS_UNICODE_r22 994
+#define _GUARD_TOS_UNICODE_r33 995
+#define _GUARD_TYPE_VERSION_r01 996
+#define _GUARD_TYPE_VERSION_r11 997
+#define _GUARD_TYPE_VERSION_r22 998
+#define _GUARD_TYPE_VERSION_r33 999
+#define _GUARD_TYPE_VERSION_AND_LOCK_r01 1000
+#define _GUARD_TYPE_VERSION_AND_LOCK_r11 1001
+#define _GUARD_TYPE_VERSION_AND_LOCK_r22 1002
+#define _GUARD_TYPE_VERSION_AND_LOCK_r33 1003
+#define _HANDLE_PENDING_AND_DEOPT_r00 1004
+#define _HANDLE_PENDING_AND_DEOPT_r10 1005
+#define _HANDLE_PENDING_AND_DEOPT_r20 1006
+#define _HANDLE_PENDING_AND_DEOPT_r30 1007
+#define _IMPORT_FROM_r12 1008
+#define _IMPORT_NAME_r21 1009
+#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1010
+#define _INIT_CALL_PY_EXACT_ARGS_r01 1011
+#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1012
+#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1013
+#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1014
+#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1015
+#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1016
+#define _INSERT_1_LOAD_CONST_INLINE_r02 1017
+#define _INSERT_1_LOAD_CONST_INLINE_r12 1018
+#define _INSERT_1_LOAD_CONST_INLINE_r23 1019
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1020
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1021
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1022
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1023
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1024
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1025
+#define _INSERT_NULL_r10 1026
+#define _INSTRUMENTED_FOR_ITER_r23 1027
+#define _INSTRUMENTED_INSTRUCTION_r00 1028
+#define _INSTRUMENTED_JUMP_FORWARD_r00 1029
+#define _INSTRUMENTED_JUMP_FORWARD_r11 1030
+#define _INSTRUMENTED_JUMP_FORWARD_r22 1031
+#define _INSTRUMENTED_JUMP_FORWARD_r33 1032
+#define _INSTRUMENTED_LINE_r00 1033
+#define _INSTRUMENTED_NOT_TAKEN_r00 1034
+#define _INSTRUMENTED_NOT_TAKEN_r11 1035
+#define _INSTRUMENTED_NOT_TAKEN_r22 1036
+#define _INSTRUMENTED_NOT_TAKEN_r33 1037
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1038
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1039
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1040
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1041
+#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1042
+#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1043
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1044
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1045
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1046
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1047
+#define _IS_NONE_r11 1048
+#define _IS_OP_r03 1049
+#define _IS_OP_r13 1050
+#define _IS_OP_r23 1051
+#define _ITER_CHECK_LIST_r02 1052
+#define _ITER_CHECK_LIST_r12 1053
+#define _ITER_CHECK_LIST_r22 1054
+#define _ITER_CHECK_LIST_r33 1055
+#define _ITER_CHECK_RANGE_r02 1056
+#define _ITER_CHECK_RANGE_r12 1057
+#define _ITER_CHECK_RANGE_r22 1058
+#define _ITER_CHECK_RANGE_r33 1059
+#define _ITER_CHECK_TUPLE_r02 1060
+#define _ITER_CHECK_TUPLE_r12 1061
+#define _ITER_CHECK_TUPLE_r22 1062
+#define _ITER_CHECK_TUPLE_r33 1063
+#define _ITER_JUMP_LIST_r02 1064
+#define _ITER_JUMP_LIST_r12 1065
+#define _ITER_JUMP_LIST_r22 1066
+#define _ITER_JUMP_LIST_r33 1067
+#define _ITER_JUMP_RANGE_r02 1068
+#define _ITER_JUMP_RANGE_r12 1069
+#define _ITER_JUMP_RANGE_r22 1070
+#define _ITER_JUMP_RANGE_r33 1071
+#define _ITER_JUMP_TUPLE_r02 1072
+#define _ITER_JUMP_TUPLE_r12 1073
+#define _ITER_JUMP_TUPLE_r22 1074
+#define _ITER_JUMP_TUPLE_r33 1075
+#define _ITER_NEXT_LIST_r23 1076
+#define _ITER_NEXT_LIST_TIER_TWO_r23 1077
+#define _ITER_NEXT_RANGE_r03 1078
+#define _ITER_NEXT_RANGE_r13 1079
+#define _ITER_NEXT_RANGE_r23 1080
+#define _ITER_NEXT_TUPLE_r03 1081
+#define _ITER_NEXT_TUPLE_r13 1082
+#define _ITER_NEXT_TUPLE_r23 1083
+#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1084
+#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1085
+#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1086
+#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1087
+#define _JUMP_TO_TOP_r00 1088
+#define _LIST_APPEND_r10 1089
+#define _LIST_EXTEND_r10 1090
+#define _LOAD_ATTR_r10 1091
+#define _LOAD_ATTR_CLASS_r11 1092
+#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1093
+#define _LOAD_ATTR_INSTANCE_VALUE_r02 1094
+#define _LOAD_ATTR_INSTANCE_VALUE_r12 1095
+#define _LOAD_ATTR_INSTANCE_VALUE_r23 1096
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1097
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1098
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1099
+#define _LOAD_ATTR_METHOD_NO_DICT_r02 1100
+#define _LOAD_ATTR_METHOD_NO_DICT_r12 1101
+#define _LOAD_ATTR_METHOD_NO_DICT_r23 1102
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1103
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1104
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1105
+#define _LOAD_ATTR_MODULE_r12 1106
+#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1107
+#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1108
+#define _LOAD_ATTR_PROPERTY_FRAME_r11 1109
+#define _LOAD_ATTR_SLOT_r02 1110
+#define _LOAD_ATTR_SLOT_r12 1111
+#define _LOAD_ATTR_SLOT_r23 1112
+#define _LOAD_ATTR_WITH_HINT_r12 1113
+#define _LOAD_BUILD_CLASS_r01 1114
+#define _LOAD_BYTECODE_r00 1115
+#define _LOAD_COMMON_CONSTANT_r01 1116
+#define _LOAD_COMMON_CONSTANT_r12 1117
+#define _LOAD_COMMON_CONSTANT_r23 1118
+#define _LOAD_CONST_r01 1119
+#define _LOAD_CONST_r12 1120
+#define _LOAD_CONST_r23 1121
+#define _LOAD_CONST_INLINE_r01 1122
+#define _LOAD_CONST_INLINE_r12 1123
+#define _LOAD_CONST_INLINE_r23 1124
+#define _LOAD_CONST_INLINE_BORROW_r01 1125
+#define _LOAD_CONST_INLINE_BORROW_r12 1126
+#define _LOAD_CONST_INLINE_BORROW_r23 1127
+#define _LOAD_CONST_UNDER_INLINE_r02 1128
+#define _LOAD_CONST_UNDER_INLINE_r12 1129
+#define _LOAD_CONST_UNDER_INLINE_r23 1130
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1131
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1132
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1133
+#define _LOAD_DEREF_r01 1134
+#define _LOAD_FAST_r01 1135
+#define _LOAD_FAST_r12 1136
+#define _LOAD_FAST_r23 1137
+#define _LOAD_FAST_0_r01 1138
+#define _LOAD_FAST_0_r12 1139
+#define _LOAD_FAST_0_r23 1140
+#define _LOAD_FAST_1_r01 1141
+#define _LOAD_FAST_1_r12 1142
+#define _LOAD_FAST_1_r23 1143
+#define _LOAD_FAST_2_r01 1144
+#define _LOAD_FAST_2_r12 1145
+#define _LOAD_FAST_2_r23 1146
+#define _LOAD_FAST_3_r01 1147
+#define _LOAD_FAST_3_r12 1148
+#define _LOAD_FAST_3_r23 1149
+#define _LOAD_FAST_4_r01 1150
+#define _LOAD_FAST_4_r12 1151
+#define _LOAD_FAST_4_r23 1152
+#define _LOAD_FAST_5_r01 1153
+#define _LOAD_FAST_5_r12 1154
+#define _LOAD_FAST_5_r23 1155
+#define _LOAD_FAST_6_r01 1156
+#define _LOAD_FAST_6_r12 1157
+#define _LOAD_FAST_6_r23 1158
+#define _LOAD_FAST_7_r01 1159
+#define _LOAD_FAST_7_r12 1160
+#define _LOAD_FAST_7_r23 1161
+#define _LOAD_FAST_AND_CLEAR_r01 1162
+#define _LOAD_FAST_AND_CLEAR_r12 1163
+#define _LOAD_FAST_AND_CLEAR_r23 1164
+#define _LOAD_FAST_BORROW_r01 1165
+#define _LOAD_FAST_BORROW_r12 1166
+#define _LOAD_FAST_BORROW_r23 1167
+#define _LOAD_FAST_BORROW_0_r01 1168
+#define _LOAD_FAST_BORROW_0_r12 1169
+#define _LOAD_FAST_BORROW_0_r23 1170
+#define _LOAD_FAST_BORROW_1_r01 1171
+#define _LOAD_FAST_BORROW_1_r12 1172
+#define _LOAD_FAST_BORROW_1_r23 1173
+#define _LOAD_FAST_BORROW_2_r01 1174
+#define _LOAD_FAST_BORROW_2_r12 1175
+#define _LOAD_FAST_BORROW_2_r23 1176
+#define _LOAD_FAST_BORROW_3_r01 1177
+#define _LOAD_FAST_BORROW_3_r12 1178
+#define _LOAD_FAST_BORROW_3_r23 1179
+#define _LOAD_FAST_BORROW_4_r01 1180
+#define _LOAD_FAST_BORROW_4_r12 1181
+#define _LOAD_FAST_BORROW_4_r23 1182
+#define _LOAD_FAST_BORROW_5_r01 1183
+#define _LOAD_FAST_BORROW_5_r12 1184
+#define _LOAD_FAST_BORROW_5_r23 1185
+#define _LOAD_FAST_BORROW_6_r01 1186
+#define _LOAD_FAST_BORROW_6_r12 1187
+#define _LOAD_FAST_BORROW_6_r23 1188
+#define _LOAD_FAST_BORROW_7_r01 1189
+#define _LOAD_FAST_BORROW_7_r12 1190
+#define _LOAD_FAST_BORROW_7_r23 1191
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1192
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1193
+#define _LOAD_FAST_CHECK_r01 1194
+#define _LOAD_FAST_CHECK_r12 1195
+#define _LOAD_FAST_CHECK_r23 1196
+#define _LOAD_FAST_LOAD_FAST_r02 1197
+#define _LOAD_FAST_LOAD_FAST_r13 1198
+#define _LOAD_FROM_DICT_OR_DEREF_r11 1199
+#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1200
+#define _LOAD_GLOBAL_r00 1201
+#define _LOAD_GLOBAL_BUILTINS_r01 1202
+#define _LOAD_GLOBAL_MODULE_r01 1203
+#define _LOAD_LOCALS_r01 1204
+#define _LOAD_LOCALS_r12 1205
+#define _LOAD_LOCALS_r23 1206
+#define _LOAD_NAME_r01 1207
+#define _LOAD_SMALL_INT_r01 1208
+#define _LOAD_SMALL_INT_r12 1209
+#define _LOAD_SMALL_INT_r23 1210
+#define _LOAD_SMALL_INT_0_r01 1211
+#define _LOAD_SMALL_INT_0_r12 1212
+#define _LOAD_SMALL_INT_0_r23 1213
+#define _LOAD_SMALL_INT_1_r01 1214
+#define _LOAD_SMALL_INT_1_r12 1215
+#define _LOAD_SMALL_INT_1_r23 1216
+#define _LOAD_SMALL_INT_2_r01 1217
+#define _LOAD_SMALL_INT_2_r12 1218
+#define _LOAD_SMALL_INT_2_r23 1219
+#define _LOAD_SMALL_INT_3_r01 1220
+#define _LOAD_SMALL_INT_3_r12 1221
+#define _LOAD_SMALL_INT_3_r23 1222
+#define _LOAD_SPECIAL_r00 1223
+#define _LOAD_SUPER_ATTR_ATTR_r31 1224
+#define _LOAD_SUPER_ATTR_METHOD_r32 1225
+#define _MAKE_CALLARGS_A_TUPLE_r33 1226
+#define _MAKE_CELL_r00 1227
+#define _MAKE_FUNCTION_r11 1228
+#define _MAKE_WARM_r00 1229
+#define _MAKE_WARM_r11 1230
+#define _MAKE_WARM_r22 1231
+#define _MAKE_WARM_r33 1232
+#define _MAP_ADD_r20 1233
+#define _MATCH_CLASS_r31 1234
+#define _MATCH_KEYS_r23 1235
+#define _MATCH_MAPPING_r02 1236
+#define _MATCH_MAPPING_r12 1237
+#define _MATCH_MAPPING_r23 1238
+#define _MATCH_SEQUENCE_r02 1239
+#define _MATCH_SEQUENCE_r12 1240
+#define _MATCH_SEQUENCE_r23 1241
+#define _MAYBE_EXPAND_METHOD_r00 1242
+#define _MAYBE_EXPAND_METHOD_KW_r11 1243
+#define _MONITOR_CALL_r00 1244
+#define _MONITOR_CALL_KW_r11 1245
+#define _MONITOR_JUMP_BACKWARD_r00 1246
+#define _MONITOR_JUMP_BACKWARD_r11 1247
+#define _MONITOR_JUMP_BACKWARD_r22 1248
+#define _MONITOR_JUMP_BACKWARD_r33 1249
+#define _MONITOR_RESUME_r00 1250
+#define _NOP_r00 1251
+#define _NOP_r11 1252
+#define _NOP_r22 1253
+#define _NOP_r33 1254
+#define _POP_CALL_r20 1255
+#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1256
+#define _POP_CALL_ONE_r30 1257
+#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1258
+#define _POP_CALL_TWO_r30 1259
+#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1260
+#define _POP_EXCEPT_r10 1261
+#define _POP_ITER_r20 1262
+#define _POP_JUMP_IF_FALSE_r00 1263
+#define _POP_JUMP_IF_FALSE_r10 1264
+#define _POP_JUMP_IF_FALSE_r21 1265
+#define _POP_JUMP_IF_FALSE_r32 1266
+#define _POP_JUMP_IF_TRUE_r00 1267
+#define _POP_JUMP_IF_TRUE_r10 1268
+#define _POP_JUMP_IF_TRUE_r21 1269
+#define _POP_JUMP_IF_TRUE_r32 1270
+#define _POP_TOP_r10 1271
+#define _POP_TOP_FLOAT_r00 1272
+#define _POP_TOP_FLOAT_r10 1273
+#define _POP_TOP_FLOAT_r21 1274
+#define _POP_TOP_FLOAT_r32 1275
+#define _POP_TOP_INT_r00 1276
+#define _POP_TOP_INT_r10 1277
+#define _POP_TOP_INT_r21 1278
+#define _POP_TOP_INT_r32 1279
+#define _POP_TOP_LOAD_CONST_INLINE_r11 1280
+#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1281
+#define _POP_TOP_NOP_r00 1282
+#define _POP_TOP_NOP_r10 1283
+#define _POP_TOP_NOP_r21 1284
+#define _POP_TOP_NOP_r32 1285
+#define _POP_TOP_UNICODE_r00 1286
+#define _POP_TOP_UNICODE_r10 1287
+#define _POP_TOP_UNICODE_r21 1288
+#define _POP_TOP_UNICODE_r32 1289
+#define _POP_TWO_r20 1290
+#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1291
+#define _PUSH_EXC_INFO_r02 1292
+#define _PUSH_EXC_INFO_r12 1293
+#define _PUSH_EXC_INFO_r23 1294
+#define _PUSH_FRAME_r10 1295
+#define _PUSH_NULL_r01 1296
+#define _PUSH_NULL_r12 1297
+#define _PUSH_NULL_r23 1298
+#define _PUSH_NULL_CONDITIONAL_r00 1299
+#define _PY_FRAME_EX_r31 1300
+#define _PY_FRAME_GENERAL_r01 1301
+#define _PY_FRAME_KW_r11 1302
+#define _QUICKEN_RESUME_r00 1303
+#define _QUICKEN_RESUME_r11 1304
+#define _QUICKEN_RESUME_r22 1305
+#define _QUICKEN_RESUME_r33 1306
+#define _REPLACE_WITH_TRUE_r02 1307
+#define _REPLACE_WITH_TRUE_r12 1308
+#define _REPLACE_WITH_TRUE_r23 1309
+#define _RESUME_CHECK_r00 1310
+#define _RESUME_CHECK_r11 1311
+#define _RESUME_CHECK_r22 1312
+#define _RESUME_CHECK_r33 1313
+#define _RETURN_GENERATOR_r01 1314
+#define _RETURN_VALUE_r11 1315
+#define _SAVE_RETURN_OFFSET_r00 1316
+#define _SAVE_RETURN_OFFSET_r11 1317
+#define _SAVE_RETURN_OFFSET_r22 1318
+#define _SAVE_RETURN_OFFSET_r33 1319
+#define _SEND_r22 1320
+#define _SEND_GEN_FRAME_r22 1321
+#define _SETUP_ANNOTATIONS_r00 1322
+#define _SET_ADD_r10 1323
+#define _SET_FUNCTION_ATTRIBUTE_r01 1324
+#define _SET_FUNCTION_ATTRIBUTE_r11 1325
+#define _SET_FUNCTION_ATTRIBUTE_r21 1326
+#define _SET_FUNCTION_ATTRIBUTE_r32 1327
+#define _SET_IP_r00 1328
+#define _SET_IP_r11 1329
+#define _SET_IP_r22 1330
+#define _SET_IP_r33 1331
+#define _SET_UPDATE_r10 1332
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1333
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1334
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1335
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1336
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1337
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1338
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1339
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1340
+#define _SPILL_OR_RELOAD_r01 1341
+#define _SPILL_OR_RELOAD_r02 1342
+#define _SPILL_OR_RELOAD_r03 1343
+#define _SPILL_OR_RELOAD_r10 1344
+#define _SPILL_OR_RELOAD_r12 1345
+#define _SPILL_OR_RELOAD_r13 1346
+#define _SPILL_OR_RELOAD_r20 1347
+#define _SPILL_OR_RELOAD_r21 1348
+#define _SPILL_OR_RELOAD_r23 1349
+#define _SPILL_OR_RELOAD_r30 1350
+#define _SPILL_OR_RELOAD_r31 1351
+#define _SPILL_OR_RELOAD_r32 1352
+#define _START_EXECUTOR_r00 1353
+#define _STORE_ATTR_r20 1354
+#define _STORE_ATTR_INSTANCE_VALUE_r21 1355
+#define _STORE_ATTR_SLOT_r21 1356
+#define _STORE_ATTR_WITH_HINT_r21 1357
+#define _STORE_DEREF_r10 1358
+#define _STORE_FAST_LOAD_FAST_r11 1359
+#define _STORE_FAST_STORE_FAST_r20 1360
+#define _STORE_GLOBAL_r10 1361
+#define _STORE_NAME_r10 1362
+#define _STORE_SLICE_r30 1363
+#define _STORE_SUBSCR_r30 1364
+#define _STORE_SUBSCR_DICT_r31 1365
+#define _STORE_SUBSCR_LIST_INT_r32 1366
+#define _SWAP_r11 1367
+#define _SWAP_2_r02 1368
+#define _SWAP_2_r12 1369
+#define _SWAP_2_r22 1370
+#define _SWAP_2_r33 1371
+#define _SWAP_3_r03 1372
+#define _SWAP_3_r13 1373
+#define _SWAP_3_r23 1374
+#define _SWAP_3_r33 1375
+#define _SWAP_FAST_r01 1376
+#define _SWAP_FAST_r11 1377
+#define _SWAP_FAST_r22 1378
+#define _SWAP_FAST_r33 1379
+#define _SWAP_FAST_0_r01 1380
+#define _SWAP_FAST_0_r11 1381
+#define _SWAP_FAST_0_r22 1382
+#define _SWAP_FAST_0_r33 1383
+#define _SWAP_FAST_1_r01 1384
+#define _SWAP_FAST_1_r11 1385
+#define _SWAP_FAST_1_r22 1386
+#define _SWAP_FAST_1_r33 1387
+#define _SWAP_FAST_2_r01 1388
+#define _SWAP_FAST_2_r11 1389
+#define _SWAP_FAST_2_r22 1390
+#define _SWAP_FAST_2_r33 1391
+#define _SWAP_FAST_3_r01 1392
+#define _SWAP_FAST_3_r11 1393
+#define _SWAP_FAST_3_r22 1394
+#define _SWAP_FAST_3_r33 1395
+#define _SWAP_FAST_4_r01 1396
+#define _SWAP_FAST_4_r11 1397
+#define _SWAP_FAST_4_r22 1398
+#define _SWAP_FAST_4_r33 1399
+#define _SWAP_FAST_5_r01 1400
+#define _SWAP_FAST_5_r11 1401
+#define _SWAP_FAST_5_r22 1402
+#define _SWAP_FAST_5_r33 1403
+#define _SWAP_FAST_6_r01 1404
+#define _SWAP_FAST_6_r11 1405
+#define _SWAP_FAST_6_r22 1406
+#define _SWAP_FAST_6_r33 1407
+#define _SWAP_FAST_7_r01 1408
+#define _SWAP_FAST_7_r11 1409
+#define _SWAP_FAST_7_r22 1410
+#define _SWAP_FAST_7_r33 1411
+#define _TIER2_RESUME_CHECK_r00 1412
+#define _TIER2_RESUME_CHECK_r11 1413
+#define _TIER2_RESUME_CHECK_r22 1414
+#define _TIER2_RESUME_CHECK_r33 1415
+#define _TO_BOOL_r11 1416
+#define _TO_BOOL_BOOL_r01 1417
+#define _TO_BOOL_BOOL_r11 1418
+#define _TO_BOOL_BOOL_r22 1419
+#define _TO_BOOL_BOOL_r33 1420
+#define _TO_BOOL_INT_r02 1421
+#define _TO_BOOL_INT_r12 1422
+#define _TO_BOOL_INT_r23 1423
+#define _TO_BOOL_LIST_r02 1424
+#define _TO_BOOL_LIST_r12 1425
+#define _TO_BOOL_LIST_r23 1426
+#define _TO_BOOL_NONE_r01 1427
+#define _TO_BOOL_NONE_r11 1428
+#define _TO_BOOL_NONE_r22 1429
+#define _TO_BOOL_NONE_r33 1430
+#define _TO_BOOL_STR_r02 1431
+#define _TO_BOOL_STR_r12 1432
+#define _TO_BOOL_STR_r23 1433
+#define _TRACE_RECORD_r00 1434
+#define _UNARY_INVERT_r12 1435
+#define _UNARY_NEGATIVE_r12 1436
+#define _UNARY_NOT_r01 1437
+#define _UNARY_NOT_r11 1438
+#define _UNARY_NOT_r22 1439
+#define _UNARY_NOT_r33 1440
+#define _UNPACK_EX_r10 1441
+#define _UNPACK_SEQUENCE_r10 1442
+#define _UNPACK_SEQUENCE_LIST_r10 1443
+#define _UNPACK_SEQUENCE_TUPLE_r10 1444
+#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1445
+#define _WITH_EXCEPT_START_r33 1446
+#define _YIELD_VALUE_r11 1447
+#define MAX_UOP_REGS_ID 1447
#ifdef __cplusplus
}
[_GUARD_IP_YIELD_VALUE] = HAS_EXIT_FLAG,
[_GUARD_IP_RETURN_VALUE] = HAS_EXIT_FLAG,
[_GUARD_IP_RETURN_GENERATOR] = HAS_EXIT_FLAG,
+ [_RECORD_TOS] = HAS_RECORDS_VALUE_FLAG,
+ [_RECORD_TOS_TYPE] = HAS_RECORDS_VALUE_FLAG,
+ [_RECORD_NOS] = HAS_RECORDS_VALUE_FLAG,
+ [_RECORD_4OS] = HAS_RECORDS_VALUE_FLAG,
+ [_RECORD_CALLABLE] = HAS_ARG_FLAG | HAS_RECORDS_VALUE_FLAG,
+ [_RECORD_BOUND_METHOD] = HAS_ARG_FLAG | HAS_RECORDS_VALUE_FLAG,
+ [_RECORD_CALLER_CODE] = HAS_RECORDS_VALUE_FLAG,
};
const ReplicationRange _PyUop_Replication[MAX_UOP_ID+1] = {
[_PY_FRAME_GENERAL_r01] = "_PY_FRAME_GENERAL_r01",
[_PY_FRAME_KW] = "_PY_FRAME_KW",
[_PY_FRAME_KW_r11] = "_PY_FRAME_KW_r11",
+ [_RECORD_4OS] = "_RECORD_4OS",
+ [_RECORD_BOUND_METHOD] = "_RECORD_BOUND_METHOD",
+ [_RECORD_CALLABLE] = "_RECORD_CALLABLE",
+ [_RECORD_CALLER_CODE] = "_RECORD_CALLER_CODE",
+ [_RECORD_NOS] = "_RECORD_NOS",
+ [_RECORD_TOS] = "_RECORD_TOS",
+ [_RECORD_TOS_TYPE] = "_RECORD_TOS_TYPE",
[_REPLACE_WITH_TRUE] = "_REPLACE_WITH_TRUE",
[_REPLACE_WITH_TRUE_r02] = "_REPLACE_WITH_TRUE_r02",
[_REPLACE_WITH_TRUE_r12] = "_REPLACE_WITH_TRUE_r12",
return 0;
case _GUARD_IP_RETURN_GENERATOR:
return 0;
+ case _RECORD_TOS:
+ return 0;
+ case _RECORD_TOS_TYPE:
+ return 0;
+ case _RECORD_NOS:
+ return 0;
+ case _RECORD_4OS:
+ return 0;
+ case _RECORD_CALLABLE:
+ return 0;
+ case _RECORD_BOUND_METHOD:
+ return 0;
+ case _RECORD_CALLER_CODE:
+ return 0;
default:
return -1;
}
.PHONY: regen-cases
regen-cases: \
regen-opcode-ids regen-opcode-targets regen-uop-ids regen-opcode-metadata-py \
- regen-generated-cases regen-executor-cases regen-optimizer-cases \
+ regen-generated-cases regen-executor-cases regen-optimizer-cases regen-record-functions \
regen-opcode-metadata regen-uop-metadata regen-test-cases regen-test-opcode-targets
.PHONY: regen-opcode-ids
-o $(srcdir)/Python/generated_cases.c.h.new $(srcdir)/Python/bytecodes.c
$(UPDATE_FILE) $(srcdir)/Python/generated_cases.c.h $(srcdir)/Python/generated_cases.c.h.new
+.PHONY: regen-record-functions
+regen-record-functions:
+ $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/record_function_generator.py \
+ -o $(srcdir)/Python/record_functions.c.h.new $(srcdir)/Python/bytecodes.c
+ $(UPDATE_FILE) $(srcdir)/Python/record_functions.c.h $(srcdir)/Python/record_functions.c.h.new
+
.PHONY: regen-test-cases
regen-test-cases:
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/tier1_generator.py \
$(srcdir)/Python/condvar.h \
$(srcdir)/Python/generated_cases.c.h \
$(srcdir)/Python/executor_cases.c.h \
- $(srcdir)/Python/opcode_targets.h
+ $(srcdir)/Python/opcode_targets.h \
+ $(srcdir)/Python/record_functions.c.h
Python/flowgraph.o: \
$(srcdir)/Include/internal/pycore_opcode_metadata.h
oparg >>= 8;
insert_exec_at--;
}
- int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg, NULL);
+ int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL);
if (succ) {
ENTER_TRACING();
}
_PyStackRef attr;
_PyStackRef *null;
/* Skip 1 cache entry */
- // _CHECK_ATTR_CLASS
+ // _GUARD_TYPE_VERSION
{
owner = stack_pointer[-1];
uint32_t type_version = read_u32(&this_instr[2].cache);
- PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
- if (!PyType_Check(owner_o)) {
- UPDATE_MISS_STATS(LOAD_ATTR);
- assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
- JUMP_TO_PREDICTED(LOAD_ATTR);
- }
+ PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
assert(type_version != 0);
- if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
+ if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
UPDATE_MISS_STATS(LOAD_ATTR);
assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
JUMP_TO_PREDICTED(LOAD_ATTR);
}
}
- // _GUARD_TYPE_VERSION
+ // _CHECK_ATTR_CLASS
{
uint32_t type_version = read_u32(&this_instr[4].cache);
- PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
+ PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
+ if (!PyType_Check(owner_o)) {
+ UPDATE_MISS_STATS(LOAD_ATTR);
+ assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+ JUMP_TO_PREDICTED(LOAD_ATTR);
+ }
assert(type_version != 0);
- if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
+ if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
UPDATE_MISS_STATS(LOAD_ATTR);
assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
JUMP_TO_PREDICTED(LOAD_ATTR);
_PyStackRef owner;
_PyStackRef new_frame;
/* Skip 1 cache entry */
- // _CHECK_PEP_523
- {
- if (IS_PEP523_HOOKED(tstate)) {
- UPDATE_MISS_STATS(LOAD_ATTR);
- assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
- JUMP_TO_PREDICTED(LOAD_ATTR);
- }
- }
// _GUARD_TYPE_VERSION
{
owner = stack_pointer[-1];
JUMP_TO_PREDICTED(LOAD_ATTR);
}
}
+ // _CHECK_PEP_523
+ {
+ if (IS_PEP523_HOOKED(tstate)) {
+ UPDATE_MISS_STATS(LOAD_ATTR);
+ assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+ JUMP_TO_PREDICTED(LOAD_ATTR);
+ }
+ }
/* Skip 2 cache entries */
// _LOAD_ATTR_PROPERTY_FRAME
{
next_instr += 1;
INSTRUCTION_STATS(RETURN_GENERATOR);
_PyStackRef res;
- assert(PyStackRef_FunctionCheck(frame->f_funcobj));
- PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- if (gen == NULL) {
- JUMP_TO_LABEL(error);
+ // _RETURN_GENERATOR
+ {
+ assert(PyStackRef_FunctionCheck(frame->f_funcobj));
+ PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (gen == NULL) {
+ JUMP_TO_LABEL(error);
+ }
+ assert(STACK_LEVEL() <= 2);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
+ frame->instr_ptr++;
+ _PyFrame_Copy(frame, gen_frame);
+ assert(frame->frame_obj == NULL);
+ gen->gi_frame_state = FRAME_CREATED;
+ gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
+ _Py_LeaveRecursiveCallPy(tstate);
+ _PyInterpreterFrame *prev = frame->previous;
+ _PyThreadState_PopFrame(tstate, frame);
+ frame = tstate->current_frame = prev;
+ LOAD_IP(frame->return_offset);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
+ LLTRACE_RESUME_FRAME();
}
- assert(STACK_LEVEL() <= 2);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
- frame->instr_ptr++;
- _PyFrame_Copy(frame, gen_frame);
- assert(frame->frame_obj == NULL);
- gen->gi_frame_state = FRAME_CREATED;
- gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
- _Py_LeaveRecursiveCallPy(tstate);
- _PyInterpreterFrame *prev = frame->previous;
- _PyThreadState_PopFrame(tstate, frame);
- frame = tstate->current_frame = prev;
- LOAD_IP(frame->return_offset);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
- LLTRACE_RESUME_FRAME();
stack_pointer[0] = res;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
INSTRUCTION_STATS(RETURN_VALUE);
_PyStackRef retval;
_PyStackRef res;
- retval = stack_pointer[-1];
- assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
- _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- assert(STACK_LEVEL() == 0);
- _Py_LeaveRecursiveCallPy(tstate);
- _PyInterpreterFrame *dying = frame;
- frame = tstate->current_frame = dying->previous;
- _PyEval_FrameClearAndPop(tstate, dying);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- LOAD_IP(frame->return_offset);
- res = temp;
- LLTRACE_RESUME_FRAME();
+ // _RETURN_VALUE
+ {
+ retval = stack_pointer[-1];
+ assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+ _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
+ stack_pointer += -1;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ assert(STACK_LEVEL() == 0);
+ _Py_LeaveRecursiveCallPy(tstate);
+ _PyInterpreterFrame *dying = frame;
+ frame = tstate->current_frame = dying->previous;
+ _PyEval_FrameClearAndPop(tstate, dying);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ LOAD_IP(frame->return_offset);
+ res = temp;
+ LLTRACE_RESUME_FRAME();
+ }
stack_pointer[0] = res;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
opcode == INTERPRETER_EXIT ||
(opcode >= MIN_INSTRUMENTED_OPCODE && opcode != ENTER_EXECUTOR)
);
+ _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+ _PyJitTracerState *tracer = _tstate->jit_tracer_state;
+ assert(tracer != NULL);
_PyFrame_SetStackPointer(frame, stack_pointer);
int full = !_PyJit_translate_single_bytecode_to_trace(tstate, frame, next_instr, stop_tracing ? _DEOPT : 0);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
DISPATCH();
}
- _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
- _PyJitTracerState *tracer = _tstate->jit_tracer_state;
- assert(tracer != NULL);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ Py_CLEAR(tracer->prev_state.recorded_value);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
tracer->prev_state.instr = next_instr;
PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
(&next_instr[1])->counter = trigger_backoff_counter();
}
+ uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[opcode];
+ if (record_func_index) {
+ _Py_RecordFuncPtr doesnt_escape = _PyOpcode_RecordFunctions[record_func_index];
+ doesnt_escape(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+ }
DISPATCH_GOTO_NON_TRACING();
#else
(void)prev_instr;
INSTRUCTION_STATS(YIELD_VALUE);
_PyStackRef retval;
_PyStackRef value;
- retval = stack_pointer[-1];
- assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
- frame->instr_ptr++;
- PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
- assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
- assert(oparg == 0 || oparg == 1);
- _PyStackRef temp = retval;
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- tstate->exc_info = gen->gi_exc_state.previous_item;
- gen->gi_exc_state.previous_item = NULL;
- _Py_LeaveRecursiveCallPy(tstate);
- _PyInterpreterFrame *gen_frame = frame;
- frame = tstate->current_frame = frame->previous;
- gen_frame->previous = NULL;
- ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
- FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
- assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
- #if TIER_ONE
- assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+ // _YIELD_VALUE
+ {
+ retval = stack_pointer[-1];
+ assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+ frame->instr_ptr++;
+ PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
+ assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
+ assert(oparg == 0 || oparg == 1);
+ _PyStackRef temp = retval;
+ stack_pointer += -1;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ tstate->exc_info = gen->gi_exc_state.previous_item;
+ gen->gi_exc_state.previous_item = NULL;
+ _Py_LeaveRecursiveCallPy(tstate);
+ _PyInterpreterFrame *gen_frame = frame;
+ frame = tstate->current_frame = frame->previous;
+ gen_frame->previous = NULL;
+ ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
+ FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
+ assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
+ #if TIER_ONE
+ assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
- #endif
- stack_pointer = _PyFrame_GetStackPointer(frame);
- LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
- value = PyStackRef_MakeHeapSafe(temp);
- LLTRACE_RESUME_FRAME();
+ #endif
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
+ value = PyStackRef_MakeHeapSafe(temp);
+ LLTRACE_RESUME_FRAME();
+ }
stack_pointer[0] = value;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
macro(TO_BOOL_ALWAYS_TRUE) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_REPLACE_WITH_TRUE +
POP_TOP;
}
macro(BINARY_OP_SUBSCR_GETITEM) =
+ _RECORD_TOS +
unused/5 + // Skip over the counter and cache
_CHECK_PEP_523 +
_BINARY_OP_SUBSCR_CHECK_FUNC +
// The stack effect here is a bit misleading.
// retval is popped from the stack, but res
// is pushed to a different frame, the callers' frame.
- inst(RETURN_VALUE, (retval -- res)) {
+ op(_RETURN_VALUE, (retval -- res)) {
assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
_PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
DEAD(retval);
ERROR_IF(err);
}
+ macro(RETURN_VALUE) =
+ _RECORD_CALLER_CODE +
+ _RETURN_VALUE;
+
macro(INSTRUMENTED_RETURN_VALUE) =
_RETURN_VALUE_EVENT +
- RETURN_VALUE;
+ _RETURN_VALUE;
inst(GET_AITER, (obj -- iter)) {
unaryfunc getter = NULL;
_SEND_GEN_FRAME +
_PUSH_FRAME;
- inst(YIELD_VALUE, (retval -- value)) {
+ op(_YIELD_VALUE, (retval -- value)) {
// NOTE: It's important that YIELD_VALUE never raises an exception!
// The compiler treats any exception raised here as a failed close()
// or throw() call.
LLTRACE_RESUME_FRAME();
}
+ macro(YIELD_VALUE) =
+ _RECORD_CALLER_CODE +
+ _YIELD_VALUE;
+
tier1 op(_YIELD_VALUE_EVENT, (val -- val)) {
int err = _Py_call_instrumentation_arg(
tstate, PY_MONITORING_EVENT_PY_YIELD,
macro(INSTRUMENTED_YIELD_VALUE) =
_YIELD_VALUE_EVENT +
- YIELD_VALUE;
+ _YIELD_VALUE;
inst(POP_EXCEPT, (exc_value -- )) {
_PyErr_StackItem *exc_info = tstate->exc_info;
macro(LOAD_ATTR_INSTANCE_VALUE) =
unused/1 + // Skip over the counter
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_CHECK_MANAGED_OBJECT_HAS_VALUES +
_LOAD_ATTR_INSTANCE_VALUE +
macro(LOAD_ATTR_WITH_HINT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_LOAD_ATTR_WITH_HINT +
POP_TOP +
macro(LOAD_ATTR_SLOT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_LOAD_ATTR_SLOT + // NOTE: This action may also deopt
POP_TOP +
macro(LOAD_ATTR_CLASS_WITH_METACLASS_CHECK) =
unused/1 +
- _CHECK_ATTR_CLASS +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
+ _CHECK_ATTR_CLASS +
_LOAD_ATTR_CLASS +
_PUSH_NULL_CONDITIONAL;
macro(LOAD_ATTR_PROPERTY) =
unused/1 +
- _CHECK_PEP_523 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
+ _CHECK_PEP_523 +
unused/2 +
_LOAD_ATTR_PROPERTY_FRAME +
_SAVE_RETURN_OFFSET +
macro(STORE_ATTR_WITH_HINT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_STORE_ATTR_WITH_HINT +
POP_TOP;
macro(STORE_ATTR_SLOT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_STORE_ATTR_SLOT +
POP_TOP;
oparg >>= 8;
insert_exec_at--;
}
- int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg, NULL);
+ int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL);
if (succ) {
ENTER_TRACING();
}
}
macro(FOR_ITER_GEN) =
+ _RECORD_NOS +
unused/1 +
_CHECK_PEP_523 +
_FOR_ITER_GEN_FRAME +
macro(LOAD_ATTR_METHOD_WITH_VALUES) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT +
_GUARD_KEYS_VERSION +
macro(LOAD_ATTR_METHOD_NO_DICT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
unused/2 +
_LOAD_ATTR_METHOD_NO_DICT;
macro(LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT +
_GUARD_KEYS_VERSION +
macro(LOAD_ATTR_NONDESCRIPTOR_NO_DICT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
unused/2 +
_LOAD_ATTR_NONDESCRIPTOR_NO_DICT;
macro(LOAD_ATTR_METHOD_LAZY_DICT) =
unused/1 +
+ _RECORD_TOS_TYPE +
_GUARD_TYPE_VERSION +
_CHECK_ATTR_METHOD_LAZY_DICT +
unused/1 +
}
macro(CALL_PY_GENERAL) =
+ _RECORD_CALLABLE +
unused/1 + // Skip over the counter
_CHECK_PEP_523 +
_CHECK_FUNCTION_VERSION +
}
macro(CALL_BOUND_METHOD_GENERAL) =
+ _RECORD_BOUND_METHOD +
unused/1 + // Skip over the counter
_CHECK_PEP_523 +
_CHECK_METHOD_VERSION +
}
macro(CALL_NON_PY_GENERAL) =
+ _RECORD_CALLABLE +
unused/1 + // Skip over the counter
unused/2 +
_CHECK_IS_NOT_PY_CALLABLE +
}
macro(CALL_BOUND_METHOD_EXACT_ARGS) =
+ _RECORD_BOUND_METHOD +
unused/1 + // Skip over the counter
_CHECK_PEP_523 +
_CHECK_CALL_BOUND_METHOD_EXACT_ARGS +
_PUSH_FRAME;
macro(CALL_PY_EXACT_ARGS) =
+ _RECORD_CALLABLE +
unused/1 + // Skip over the counter
_CHECK_PEP_523 +
_CHECK_FUNCTION_VERSION +
}
macro(CALL_ALLOC_AND_ENTER_INIT) =
+ _RECORD_CALLABLE +
unused/1 +
_CHECK_PEP_523 +
_CHECK_AND_ALLOCATE_OBJECT +
}
macro(CALL_BUILTIN_CLASS) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_BUILTIN_CLASS +
}
macro(CALL_BUILTIN_O) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_BUILTIN_O +
}
macro(CALL_BUILTIN_FAST) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_BUILTIN_FAST +
}
macro(CALL_BUILTIN_FAST_WITH_KEYWORDS) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_BUILTIN_FAST_WITH_KEYWORDS +
}
macro(CALL_METHOD_DESCRIPTOR_O) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_METHOD_DESCRIPTOR_O +
}
macro(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS +
}
macro(CALL_METHOD_DESCRIPTOR_NOARGS) =
+ _RECORD_CALLABLE +
unused/1 +
unused/2 +
_CALL_METHOD_DESCRIPTOR_NOARGS +
}
macro(CALL_EX_PY) =
+ _RECORD_4OS +
unused/1 +
_CHECK_PEP_523 +
_MAKE_CALLARGS_A_TUPLE +
*ptr = attr;
}
- inst(RETURN_GENERATOR, (-- res)) {
+ op(_RETURN_GENERATOR, (-- res)) {
assert(PyStackRef_FunctionCheck(frame->f_funcobj));
PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
LLTRACE_RESUME_FRAME();
}
+ macro(RETURN_GENERATOR) =
+ _RECORD_CALLER_CODE +
+ _RETURN_GENERATOR;
+
inst(BUILD_SLICE, (args[oparg] -- slice)) {
PyObject *start_o = PyStackRef_AsPyObjectBorrow(args[0]);
PyObject *stop_o = PyStackRef_AsPyObjectBorrow(args[1]);
// Note: it's safe to use target->op.arg here instead of the oparg given by EXTENDED_ARG.
// The invariant in the optimizer is the deopt target always points back to the first EXTENDED_ARG.
// So setting it to anything else is wrong.
- int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.arg, previous_executor);
+ int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, stack_pointer, chain_depth, exit, target->op.arg, previous_executor);
exit->temperature = restart_backoff_counter(exit->temperature);
if (succ) {
GOTO_TIER_ONE_CONTINUE_TRACING(target);
}
tier2 op(_GUARD_IP__PUSH_FRAME, (ip/4 --)) {
- _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(_PUSH_FRAME);
+ _Py_CODEUNIT *target = frame->instr_ptr;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += IP_OFFSET_OF(_PUSH_FRAME);
EXIT_IF(true);
}
}
tier2 op(_GUARD_IP_YIELD_VALUE, (ip/4 --)) {
- _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(YIELD_VALUE);
+ _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += IP_OFFSET_OF(YIELD_VALUE);
+ frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
EXIT_IF(true);
}
}
tier2 op(_GUARD_IP_RETURN_VALUE, (ip/4 --)) {
- _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(RETURN_VALUE);
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += IP_OFFSET_OF(RETURN_VALUE);
+ frame->instr_ptr += frame->return_offset;
EXIT_IF(true);
}
}
tier2 op(_GUARD_IP_RETURN_GENERATOR, (ip/4 --)) {
- _Py_CODEUNIT *target = frame->instr_ptr + IP_OFFSET_OF(RETURN_GENERATOR);
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += IP_OFFSET_OF(RETURN_GENERATOR);
+ frame->instr_ptr += frame->return_offset;
EXIT_IF(true);
}
}
+ /* Record ops for jit tracer.
+ *
+ * NOTE: These uops are NOPs for normal evaluation.
+ * They are only executed during trace recording */
+
+ tier2 op(_RECORD_TOS, (tos -- tos)) {
+ RECORD_VALUE(PyStackRef_AsPyObjectBorrow(tos));
+ }
+
+ tier2 op(_RECORD_TOS_TYPE, (tos -- tos)) {
+ RECORD_VALUE(Py_TYPE(PyStackRef_AsPyObjectBorrow(tos)));
+ }
+
+ tier2 op(_RECORD_NOS, (nos, tos -- nos, tos)) {
+ RECORD_VALUE(PyStackRef_AsPyObjectBorrow(nos));
+ }
+
+ tier2 op(_RECORD_4OS, (value, _3os, nos, tos -- value, _3os, nos, tos)) {
+ RECORD_VALUE(PyStackRef_AsPyObjectBorrow(value));
+ }
+
+ tier2 op(_RECORD_CALLABLE, (func, self, args[oparg] -- func, self, args[oparg])) {
+ RECORD_VALUE(PyStackRef_AsPyObjectBorrow(func));
+ }
+
+ tier2 op(_RECORD_BOUND_METHOD, (callable, self, args[oparg] -- callable, self, args[oparg])) {
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ if (Py_TYPE(callable_o) == &PyMethod_Type) {
+ PyObject *func = ((PyMethodObject *)callable_o)->im_func;
+ RECORD_VALUE(func);
+ }
+ }
+
+ tier2 op(_RECORD_CALLER_CODE, ( -- )) {
+ _PyInterpreterFrame *caller_frame = frame->previous;
+ if (caller_frame->owner < FRAME_OWNED_BY_INTERPRETER) {
+ PyCodeObject *code = _PyFrame_GetCode(frame->previous);
+ RECORD_VALUE(code);
+ }
+ }
+
label(pop_2_error) {
stack_pointer -= 2;
assert(WITHIN_STACK_BOUNDS());
opcode == INTERPRETER_EXIT ||
(opcode >= MIN_INSTRUMENTED_OPCODE && opcode != ENTER_EXECUTOR)
);
+ _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+ _PyJitTracerState *tracer = _tstate->jit_tracer_state;
+ assert(tracer != NULL);
int full = !_PyJit_translate_single_bytecode_to_trace(tstate, frame, next_instr, stop_tracing ? _DEOPT : 0);
if (full) {
LEAVE_TRACING();
ERROR_IF(err < 0);
DISPATCH();
}
- // Super instructions. Instruction deopted. There's a mismatch in what the stack expects
- // in the optimizer. So we have to reflect in the trace correctly.
- _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
- // JIT should have disabled super instructions, as we can
- // do these optimizations ourselves in the JIT.
- _PyJitTracerState *tracer = _tstate->jit_tracer_state;
- assert(tracer != NULL);
+ Py_CLEAR(tracer->prev_state.recorded_value);
tracer->prev_state.instr = next_instr;
PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
(&next_instr[1])->counter = trigger_backoff_counter();
}
+
+ uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[opcode];
+ if (record_func_index) {
+ _Py_RecordFuncPtr doesnt_escape = _PyOpcode_RecordFunctions[record_func_index];
+ doesnt_escape(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+ }
DISPATCH_GOTO_NON_TRACING();
#else
(void)prev_instr;
_PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit);
assert(tstate->current_executor == (PyObject *)previous_executor);
int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow;
- int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.arg, previous_executor);
+ int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, stack_pointer, chain_depth, exit, target->op.arg, previous_executor);
exit->temperature = restart_backoff_counter(exit->temperature);
if (succ) {
GOTO_TIER_ONE_CONTINUE_TRACING(target);
case _GUARD_IP__PUSH_FRAME_r00: {
CHECK_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- #define OFFSET_OF__PUSH_FRAME ((0))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+ _Py_CODEUNIT *target = frame->instr_ptr;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
if (true) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
}
}
SET_CURRENT_CACHED_VALUES(0);
- #undef OFFSET_OF__PUSH_FRAME
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
- #define OFFSET_OF__PUSH_FRAME ((0))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+ _Py_CODEUNIT *target = frame->instr_ptr;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = _stack_item_0;
}
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
- #undef OFFSET_OF__PUSH_FRAME
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
- #define OFFSET_OF__PUSH_FRAME ((0))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+ _Py_CODEUNIT *target = frame->instr_ptr;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache1 = _stack_item_1;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(2);
- #undef OFFSET_OF__PUSH_FRAME
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
_PyStackRef _stack_item_2 = _tos_cache2;
- #define OFFSET_OF__PUSH_FRAME ((0))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF__PUSH_FRAME;
+ _Py_CODEUNIT *target = frame->instr_ptr;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF__PUSH_FRAME;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache2 = _stack_item_2;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(3);
- #undef OFFSET_OF__PUSH_FRAME
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
case _GUARD_IP_YIELD_VALUE_r00: {
CHECK_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+ frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
if (true) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
}
}
SET_CURRENT_CACHED_VALUES(0);
- #undef OFFSET_OF_YIELD_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
- #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+ frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = _stack_item_0;
}
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
- #undef OFFSET_OF_YIELD_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
- #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+ frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache1 = _stack_item_1;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(2);
- #undef OFFSET_OF_YIELD_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
_PyStackRef _stack_item_2 = _tos_cache2;
- #define OFFSET_OF_YIELD_VALUE ((1+INLINE_CACHE_ENTRIES_SEND))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_YIELD_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + 1 + INLINE_CACHE_ENTRIES_SEND;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_YIELD_VALUE;
+ frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache2 = _stack_item_2;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(3);
- #undef OFFSET_OF_YIELD_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
case _GUARD_IP_RETURN_VALUE_r00: {
CHECK_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
}
}
SET_CURRENT_CACHED_VALUES(0);
- #undef OFFSET_OF_RETURN_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
- #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = _stack_item_0;
}
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
- #undef OFFSET_OF_RETURN_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
- #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache1 = _stack_item_1;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(2);
- #undef OFFSET_OF_RETURN_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
_PyStackRef _stack_item_2 = _tos_cache2;
- #define OFFSET_OF_RETURN_VALUE ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_VALUE;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_VALUE;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache2 = _stack_item_2;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(3);
- #undef OFFSET_OF_RETURN_VALUE
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
case _GUARD_IP_RETURN_GENERATOR_r00: {
CHECK_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
}
}
SET_CURRENT_CACHED_VALUES(0);
- #undef OFFSET_OF_RETURN_GENERATOR
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
- #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = _stack_item_0;
}
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
- #undef OFFSET_OF_RETURN_GENERATOR
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
- #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache1 = _stack_item_1;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(2);
- #undef OFFSET_OF_RETURN_GENERATOR
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
_PyStackRef _stack_item_2 = _tos_cache2;
- #define OFFSET_OF_RETURN_GENERATOR ((frame->return_offset))
PyObject *ip = (PyObject *)CURRENT_OPERAND0_64();
- _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_RETURN_GENERATOR;
+ _Py_CODEUNIT *target = frame->instr_ptr + frame->return_offset;
if (target != (_Py_CODEUNIT *)ip) {
- frame->instr_ptr += OFFSET_OF_RETURN_GENERATOR;
+ frame->instr_ptr += frame->return_offset;
if (true) {
UOP_STAT_INC(uopcode, miss);
_tos_cache2 = _stack_item_2;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(3);
- #undef OFFSET_OF_RETURN_GENERATOR
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
oparg >>= 8;
insert_exec_at--;
}
- int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg, NULL);
+ int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL);
if (succ) {
ENTER_TRACING();
}
_PyStackRef attr;
_PyStackRef *null;
/* Skip 1 cache entry */
- // _CHECK_ATTR_CLASS
+ // _GUARD_TYPE_VERSION
{
owner = stack_pointer[-1];
uint32_t type_version = read_u32(&this_instr[2].cache);
- PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
- if (!PyType_Check(owner_o)) {
- UPDATE_MISS_STATS(LOAD_ATTR);
- assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
- JUMP_TO_PREDICTED(LOAD_ATTR);
- }
+ PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
assert(type_version != 0);
- if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
+ if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
UPDATE_MISS_STATS(LOAD_ATTR);
assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
JUMP_TO_PREDICTED(LOAD_ATTR);
}
}
- // _GUARD_TYPE_VERSION
+ // _CHECK_ATTR_CLASS
{
uint32_t type_version = read_u32(&this_instr[4].cache);
- PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
+ PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
+ if (!PyType_Check(owner_o)) {
+ UPDATE_MISS_STATS(LOAD_ATTR);
+ assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+ JUMP_TO_PREDICTED(LOAD_ATTR);
+ }
assert(type_version != 0);
- if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
+ if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
UPDATE_MISS_STATS(LOAD_ATTR);
assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
JUMP_TO_PREDICTED(LOAD_ATTR);
_PyStackRef owner;
_PyStackRef new_frame;
/* Skip 1 cache entry */
- // _CHECK_PEP_523
- {
- if (IS_PEP523_HOOKED(tstate)) {
- UPDATE_MISS_STATS(LOAD_ATTR);
- assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
- JUMP_TO_PREDICTED(LOAD_ATTR);
- }
- }
// _GUARD_TYPE_VERSION
{
owner = stack_pointer[-1];
JUMP_TO_PREDICTED(LOAD_ATTR);
}
}
+ // _CHECK_PEP_523
+ {
+ if (IS_PEP523_HOOKED(tstate)) {
+ UPDATE_MISS_STATS(LOAD_ATTR);
+ assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
+ JUMP_TO_PREDICTED(LOAD_ATTR);
+ }
+ }
/* Skip 2 cache entries */
// _LOAD_ATTR_PROPERTY_FRAME
{
next_instr += 1;
INSTRUCTION_STATS(RETURN_GENERATOR);
_PyStackRef res;
- assert(PyStackRef_FunctionCheck(frame->f_funcobj));
- PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- if (gen == NULL) {
- JUMP_TO_LABEL(error);
+ // _RETURN_GENERATOR
+ {
+ assert(PyStackRef_FunctionCheck(frame->f_funcobj));
+ PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (gen == NULL) {
+ JUMP_TO_LABEL(error);
+ }
+ assert(STACK_LEVEL() <= 2);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
+ frame->instr_ptr++;
+ _PyFrame_Copy(frame, gen_frame);
+ assert(frame->frame_obj == NULL);
+ gen->gi_frame_state = FRAME_CREATED;
+ gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
+ _Py_LeaveRecursiveCallPy(tstate);
+ _PyInterpreterFrame *prev = frame->previous;
+ _PyThreadState_PopFrame(tstate, frame);
+ frame = tstate->current_frame = prev;
+ LOAD_IP(frame->return_offset);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
+ LLTRACE_RESUME_FRAME();
}
- assert(STACK_LEVEL() <= 2);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- _PyInterpreterFrame *gen_frame = &gen->gi_iframe;
- frame->instr_ptr++;
- _PyFrame_Copy(frame, gen_frame);
- assert(frame->frame_obj == NULL);
- gen->gi_frame_state = FRAME_CREATED;
- gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
- _Py_LeaveRecursiveCallPy(tstate);
- _PyInterpreterFrame *prev = frame->previous;
- _PyThreadState_PopFrame(tstate, frame);
- frame = tstate->current_frame = prev;
- LOAD_IP(frame->return_offset);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen);
- LLTRACE_RESUME_FRAME();
stack_pointer[0] = res;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
INSTRUCTION_STATS(RETURN_VALUE);
_PyStackRef retval;
_PyStackRef res;
- retval = stack_pointer[-1];
- assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
- _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- assert(STACK_LEVEL() == 0);
- _Py_LeaveRecursiveCallPy(tstate);
- _PyInterpreterFrame *dying = frame;
- frame = tstate->current_frame = dying->previous;
- _PyEval_FrameClearAndPop(tstate, dying);
- stack_pointer = _PyFrame_GetStackPointer(frame);
- LOAD_IP(frame->return_offset);
- res = temp;
- LLTRACE_RESUME_FRAME();
+ // _RETURN_VALUE
+ {
+ retval = stack_pointer[-1];
+ assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+ _PyStackRef temp = PyStackRef_MakeHeapSafe(retval);
+ stack_pointer += -1;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ assert(STACK_LEVEL() == 0);
+ _Py_LeaveRecursiveCallPy(tstate);
+ _PyInterpreterFrame *dying = frame;
+ frame = tstate->current_frame = dying->previous;
+ _PyEval_FrameClearAndPop(tstate, dying);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ LOAD_IP(frame->return_offset);
+ res = temp;
+ LLTRACE_RESUME_FRAME();
+ }
stack_pointer[0] = res;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
opcode == INTERPRETER_EXIT ||
(opcode >= MIN_INSTRUMENTED_OPCODE && opcode != ENTER_EXECUTOR)
);
+ _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+ _PyJitTracerState *tracer = _tstate->jit_tracer_state;
+ assert(tracer != NULL);
_PyFrame_SetStackPointer(frame, stack_pointer);
int full = !_PyJit_translate_single_bytecode_to_trace(tstate, frame, next_instr, stop_tracing ? _DEOPT : 0);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
DISPATCH();
}
- _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
- _PyJitTracerState *tracer = _tstate->jit_tracer_state;
- assert(tracer != NULL);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ Py_CLEAR(tracer->prev_state.recorded_value);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
tracer->prev_state.instr = next_instr;
PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
(&next_instr[1])->counter = trigger_backoff_counter();
}
+ uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[opcode];
+ if (record_func_index) {
+ _Py_RecordFuncPtr doesnt_escape = _PyOpcode_RecordFunctions[record_func_index];
+ doesnt_escape(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+ }
DISPATCH_GOTO_NON_TRACING();
#else
(void)prev_instr;
INSTRUCTION_STATS(YIELD_VALUE);
_PyStackRef retval;
_PyStackRef value;
- retval = stack_pointer[-1];
- assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
- frame->instr_ptr++;
- PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
- assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
- assert(oparg == 0 || oparg == 1);
- _PyStackRef temp = retval;
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- _PyFrame_SetStackPointer(frame, stack_pointer);
- tstate->exc_info = gen->gi_exc_state.previous_item;
- gen->gi_exc_state.previous_item = NULL;
- _Py_LeaveRecursiveCallPy(tstate);
- _PyInterpreterFrame *gen_frame = frame;
- frame = tstate->current_frame = frame->previous;
- gen_frame->previous = NULL;
- ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
- FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
- assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
- #if TIER_ONE
- assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+ // _YIELD_VALUE
+ {
+ retval = stack_pointer[-1];
+ assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
+ frame->instr_ptr++;
+ PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame);
+ assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
+ assert(oparg == 0 || oparg == 1);
+ _PyStackRef temp = retval;
+ stack_pointer += -1;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ tstate->exc_info = gen->gi_exc_state.previous_item;
+ gen->gi_exc_state.previous_item = NULL;
+ _Py_LeaveRecursiveCallPy(tstate);
+ _PyInterpreterFrame *gen_frame = frame;
+ frame = tstate->current_frame = frame->previous;
+ gen_frame->previous = NULL;
+ ((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
+ FT_ATOMIC_STORE_INT8_RELEASE(gen->gi_frame_state, FRAME_SUSPENDED + oparg);
+ assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
+ #if TIER_ONE
+ assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
_PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
- #endif
- stack_pointer = _PyFrame_GetStackPointer(frame);
- LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
- value = PyStackRef_MakeHeapSafe(temp);
- LLTRACE_RESUME_FRAME();
+ #endif
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
+ value = PyStackRef_MakeHeapSafe(temp);
+ LLTRACE_RESUME_FRAME();
+ }
stack_pointer[0] = value;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(next->op.code == STORE_FAST);
operand = next->op.arg;
}
+ else if (_PyUop_Flags[uop] & HAS_RECORDS_VALUE_FLAG) {
+ PyObject *recorded_value = tracer->prev_state.recorded_value;
+ tracer->prev_state.recorded_value = NULL;
+ operand = (uintptr_t)recorded_value;
+ }
// All other instructions
ADD_TO_TRACE(uop, oparg, operand, target);
}
Py_NO_INLINE int
_PyJit_TryInitializeTracing(
PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *curr_instr,
- _Py_CODEUNIT *start_instr, _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth,
+ _Py_CODEUNIT *start_instr, _Py_CODEUNIT *close_loop_instr, _PyStackRef *stack_pointer, int chain_depth,
_PyExitData *exit, int oparg, _PyExecutorObject *current_executor)
{
_PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
tracer->initial_state.func = (PyFunctionObject *)Py_NewRef(func);
tracer->initial_state.executor = (_PyExecutorObject *)Py_XNewRef(current_executor);
tracer->initial_state.exit = exit;
- tracer->initial_state.stack_depth = curr_stackdepth;
+ tracer->initial_state.stack_depth = stack_pointer - _PyFrame_Stackbase(frame);
tracer->initial_state.chain_depth = chain_depth;
tracer->prev_state.dependencies_still_valid = true;
tracer->prev_state.instr_code = (PyCodeObject *)Py_NewRef(_PyFrame_GetCode(frame));
tracer->prev_state.instr = curr_instr;
tracer->prev_state.instr_frame = frame;
tracer->prev_state.instr_oparg = oparg;
- tracer->prev_state.instr_stacklevel = curr_stackdepth;
+ tracer->prev_state.instr_stacklevel = tracer->initial_state.stack_depth;
+ tracer->prev_state.recorded_value = NULL;
+ uint8_t record_func_index = _PyOpcode_RecordFunctionIndices[curr_instr->op.code];
+ if (record_func_index) {
+ _Py_RecordFuncPtr record_func = _PyOpcode_RecordFunctions[record_func_index];
+ record_func(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
+ }
assert(curr_instr->op.code == JUMP_BACKWARD_JIT || (exit != NULL));
tracer->initial_state.jump_backward_instr = curr_instr;
Py_CLEAR(tracer->initial_state.func);
Py_CLEAR(tracer->initial_state.executor);
Py_CLEAR(tracer->prev_state.instr_code);
+ Py_CLEAR(tracer->prev_state.recorded_value);
uop_buffer_init(&tracer->code_buffer, &tracer->uop_array[0], UOP_MAX_TRACE_LENGTH);
tracer->is_tracing = false;
}
buffer[pc].opcode = opcode + oparg + 1 - _PyUop_Replication[opcode].start;
assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
}
+ else if (_PyUop_Flags[opcode] & HAS_RECORDS_VALUE_FLAG) {
+ Py_XDECREF((PyObject *)(uintptr_t)buffer[pc].operand0);
+ buffer[pc].opcode = _NOP;
+ }
else if (is_terminator(&buffer[pc])) {
break;
}
_Py_Executors_InvalidateAll(interp, 0);
}
+#include "record_functions.c.h"
+
static int
escape_angles(const char *input, Py_ssize_t size, char *buffer) {
int written = 0;
op(_GUARD_TYPE_VERSION, (type_version/2, owner -- owner)) {
assert(type_version);
+ assert(this_instr[-1].opcode == _RECORD_TOS_TYPE);
if (sym_matches_type_version(owner, type_version)) {
ADD_OP(_NOP, 0, 0);
} else {
owner = stack_pointer[-1];
uint32_t type_version = (uint32_t)this_instr->operand0;
assert(type_version);
+ assert(this_instr[-1].opcode == _RECORD_TOS_TYPE);
if (sym_matches_type_version(owner, type_version)) {
ADD_OP(_NOP, 0, 0);
} else {
break;
}
+ case _RECORD_TOS: {
+ break;
+ }
+
+ case _RECORD_TOS_TYPE: {
+ break;
+ }
+
+ case _RECORD_NOS: {
+ break;
+ }
+
+ case _RECORD_4OS: {
+ break;
+ }
+
+ case _RECORD_CALLABLE: {
+ break;
+ }
+
+ case _RECORD_BOUND_METHOD: {
+ break;
+ }
+
+ case _RECORD_CALLER_CODE: {
+ break;
+ }
+
/* _TRACE_RECORD is not a viable micro-op for tier 2 */
--- /dev/null
+// This file is generated by Tools/cases_generator/record_function_generator.py
+// from:
+// Python/bytecodes.c
+// Do not edit!
+
+#ifdef TIER_ONE
+ #error "This file is for Tier 2 only"
+#endif
+void _PyOpcode_RecordFunction_TOS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyStackRef tos;
+ tos = stack_pointer[-1];
+ *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(tos);
+ Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_TOS_TYPE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyStackRef tos;
+ tos = stack_pointer[-1];
+ *recorded_value = (PyObject *)Py_TYPE(PyStackRef_AsPyObjectBorrow(tos));
+ Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_NOS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyStackRef nos;
+ nos = stack_pointer[-2];
+ *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(nos);
+ Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_4OS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyStackRef value;
+ value = stack_pointer[-4];
+ *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(value);
+ Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_CALLABLE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyStackRef func;
+ func = stack_pointer[-2 - oparg];
+ *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(func);
+ Py_INCREF(*recorded_value);
+}
+
+void _PyOpcode_RecordFunction_BOUND_METHOD(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyStackRef callable;
+ callable = stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ if (Py_TYPE(callable_o) == &PyMethod_Type) {
+ PyObject *func = ((PyMethodObject *)callable_o)->im_func;
+ *recorded_value = (PyObject *)func;
+ Py_INCREF(*recorded_value);
+ }
+}
+
+void _PyOpcode_RecordFunction_CALLER_CODE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
+ _PyInterpreterFrame *caller_frame = frame->previous;
+ if (caller_frame->owner < FRAME_OWNED_BY_INTERPRETER) {
+ PyCodeObject *code = _PyFrame_GetCode(frame->previous);
+ *recorded_value = (PyObject *)code;
+ Py_INCREF(*recorded_value);
+ }
+}
+
+#define _RECORD_TOS_TYPE_INDEX 1
+#define _RECORD_TOS_INDEX 2
+#define _RECORD_CALLER_CODE_INDEX 3
+#define _RECORD_NOS_INDEX 4
+#define _RECORD_CALLABLE_INDEX 5
+#define _RECORD_BOUND_METHOD_INDEX 6
+#define _RECORD_4OS_INDEX 7
+const uint8_t _PyOpcode_RecordFunctionIndices[256] = {
+ [TO_BOOL_ALWAYS_TRUE] = _RECORD_TOS_TYPE_INDEX,
+ [BINARY_OP_SUBSCR_GETITEM] = _RECORD_TOS_INDEX,
+ [RETURN_VALUE] = _RECORD_CALLER_CODE_INDEX,
+ [YIELD_VALUE] = _RECORD_CALLER_CODE_INDEX,
+ [LOAD_ATTR_INSTANCE_VALUE] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_WITH_HINT] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_SLOT] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_PROPERTY] = _RECORD_TOS_TYPE_INDEX,
+ [STORE_ATTR_WITH_HINT] = _RECORD_TOS_TYPE_INDEX,
+ [STORE_ATTR_SLOT] = _RECORD_TOS_TYPE_INDEX,
+ [FOR_ITER_GEN] = _RECORD_NOS_INDEX,
+ [LOAD_ATTR_METHOD_WITH_VALUES] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_METHOD_NO_DICT] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = _RECORD_TOS_TYPE_INDEX,
+ [LOAD_ATTR_METHOD_LAZY_DICT] = _RECORD_TOS_TYPE_INDEX,
+ [CALL_PY_GENERAL] = _RECORD_CALLABLE_INDEX,
+ [CALL_BOUND_METHOD_GENERAL] = _RECORD_BOUND_METHOD_INDEX,
+ [CALL_NON_PY_GENERAL] = _RECORD_CALLABLE_INDEX,
+ [CALL_BOUND_METHOD_EXACT_ARGS] = _RECORD_BOUND_METHOD_INDEX,
+ [CALL_PY_EXACT_ARGS] = _RECORD_CALLABLE_INDEX,
+ [CALL_ALLOC_AND_ENTER_INIT] = _RECORD_CALLABLE_INDEX,
+ [CALL_BUILTIN_CLASS] = _RECORD_CALLABLE_INDEX,
+ [CALL_BUILTIN_O] = _RECORD_CALLABLE_INDEX,
+ [CALL_BUILTIN_FAST] = _RECORD_CALLABLE_INDEX,
+ [CALL_BUILTIN_FAST_WITH_KEYWORDS] = _RECORD_CALLABLE_INDEX,
+ [CALL_METHOD_DESCRIPTOR_O] = _RECORD_CALLABLE_INDEX,
+ [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = _RECORD_CALLABLE_INDEX,
+ [CALL_METHOD_DESCRIPTOR_NOARGS] = _RECORD_CALLABLE_INDEX,
+ [CALL_EX_PY] = _RECORD_4OS_INDEX,
+ [RETURN_GENERATOR] = _RECORD_CALLER_CODE_INDEX,
+};
+
+const _Py_RecordFuncPtr _PyOpcode_RecordFunctions[8] = {
+ [0] = NULL,
+ [_RECORD_TOS_TYPE_INDEX] = _PyOpcode_RecordFunction_TOS_TYPE,
+ [_RECORD_TOS_INDEX] = _PyOpcode_RecordFunction_TOS,
+ [_RECORD_CALLER_CODE_INDEX] = _PyOpcode_RecordFunction_CALLER_CODE,
+ [_RECORD_NOS_INDEX] = _PyOpcode_RecordFunction_NOS,
+ [_RECORD_CALLABLE_INDEX] = _PyOpcode_RecordFunction_CALLABLE,
+ [_RECORD_BOUND_METHOD_INDEX] = _PyOpcode_RecordFunction_BOUND_METHOD,
+ [_RECORD_4OS_INDEX] = _PyOpcode_RecordFunction_4OS,
+};
'Python/generated_cases.c.h',
'Python/executor_cases.c.h',
'Python/optimizer_cases.c.h',
+ 'Python/record_functions.c.h',
'Python/opcode_targets.h',
'Modules/_testinternalcapi/test_targets.h',
'Modules/_testinternalcapi/test_cases.c.h',
uses_opcode: bool
needs_guard_ip: bool
unpredictable_jump: bool
+ records_value: bool
tier: int | None = None
const_oparg: int = -1
needs_prev: bool = False
no_save_ip=all(p.no_save_ip for p in properties),
needs_guard_ip=any(p.needs_guard_ip for p in properties),
unpredictable_jump=any(p.unpredictable_jump for p in properties),
+ records_value=any(p.records_value for p in properties),
)
@property
no_save_ip=False,
needs_guard_ip=False,
unpredictable_jump=False,
+ records_value=False,
)
"_Py_set_eval_breaker_bit",
"trigger_backoff_counter",
"_PyThreadState_PopCStackRefSteal",
+ "doesnt_escape",
+
)
or variable_used(op, "LOAD_IP")
or variable_used(op, "DISPATCH_INLINED"),
unpredictable_jump=unpredictable_jump,
+ records_value=variable_used(op, "RECORD_VALUE")
)
def expand(items: list[StackItem], oparg: int) -> list[StackItem]:
macro: parser.Macro, instructions: dict[str, Instruction], uops: dict[str, Uop]
) -> None:
parts: list[Part] = []
+ first = True
for part in macro.uops:
match part:
case parser.OpName():
raise analysis_error(
f"No Uop named {part.name}", macro.tokens[0]
)
- parts.append(uops[part.name])
+ uop = uops[part.name]
+ if uop.properties.records_value and not first:
+ raise analysis_error(
+ f"Recording uop {part.name} must be first in macro",
+ macro.tokens[0])
+ parts.append(uop)
+ first = False
case parser.CacheEffect():
parts.append(Skip(part.size))
case _:
flags.append("HAS_UNPREDICTABLE_JUMP_FLAG")
if p.needs_guard_ip:
flags.append("HAS_NEEDS_GUARD_IP_FLAG")
+ if p.records_value:
+ flags.append("HAS_RECORDS_VALUE_FLAG")
if flags:
return " | ".join(flags)
else:
"PERIODIC",
"UNPREDICTABLE_JUMP",
"NEEDS_GUARD_IP",
+ "RECORDS_VALUE",
]
--- /dev/null
+
+import argparse
+
+from analyzer import (
+ Analysis,
+ Instruction,
+ analyze_files,
+ CodeSection,
+)
+
+from generators_common import (
+ DEFAULT_INPUT,
+ ROOT,
+ write_header,
+ emit_to,
+ TokenIterator,
+)
+
+from cwriter import CWriter
+
+from tier1_generator import write_uop, Emitter, declare_variable
+from typing import TextIO
+from lexer import Token
+from stack import Stack, Storage
+
+DEFAULT_OUTPUT = ROOT / "Python/recorder_functions.c.h"
+
+
+class RecorderEmitter(Emitter):
+ def __init__(self, out: CWriter):
+ super().__init__(out, {})
+ self._replacers["RECORD_VALUE"] = self.record_value
+
+ def record_value(
+ self,
+ tkn: Token,
+ tkn_iter: TokenIterator,
+ uop: CodeSection,
+ storage: Storage,
+ inst: Instruction | None,
+ ) -> bool:
+ lparen = next(tkn_iter)
+ self.out.start_line()
+ self.emit("*recorded_value = (PyObject *)")
+ emit_to(self.out, tkn_iter, "RPAREN")
+ next(tkn_iter) # Semi colon
+ self.emit(";\n")
+ self.emit("Py_INCREF(*recorded_value);\n")
+ return True
+
+
+def generate_recorder_functions(filenames: list[str], analysis: Analysis, out: CWriter) -> None:
+ write_header(__file__, filenames, outfile)
+ outfile.write(
+ """
+#ifdef TIER_ONE
+ #error "This file is for Tier 2 only"
+#endif
+"""
+ )
+ args = "_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value"
+ emitter = RecorderEmitter(out)
+ func_count = 0
+ nop = analysis.instructions["NOP"]
+ function_table: dict[str, int] = dict()
+ for name, uop in analysis.uops.items():
+ if not uop.properties.records_value:
+ continue
+ func_count += 1
+ out.emit(f"void _PyOpcode_RecordFunction{uop.name[7:]}({args}) {{\n")
+ seen = {"unused"}
+ for var in uop.stack.inputs:
+ if var.used and var.name not in seen:
+ seen.add(var.name)
+ declare_variable(var, out)
+ stack = Stack()
+ write_uop(uop, emitter, 0, stack, nop, False)
+ out.start_line()
+ out.emit("}")
+ out.emit("\n\n")
+
+def generate_recorder_tables(analysis: Analysis, out: CWriter) -> None:
+ record_function_indexes: dict[str, int] = dict()
+ record_table: dict[str, str] = {}
+ index = 1
+ for inst in analysis.instructions.values():
+ if not inst.properties.records_value:
+ continue
+ for part in inst.parts:
+ if not part.properties.records_value:
+ continue
+ if part.name not in record_function_indexes:
+ record_function_indexes[part.name] = index
+ index += 1
+ record_table[inst.name] = part.name
+ break
+ func_count = len(record_function_indexes)
+
+ for name, index in record_function_indexes.items():
+ out.emit(f"#define {name}_INDEX {index}\n")
+ args = "_PyJitTracerState *tracer, _PyInterpreterFrame *frame, _PyStackRef *stackpointer, int oparg"
+ out.emit("const uint8_t _PyOpcode_RecordFunctionIndices[256] = {\n")
+ for inst_name, record_name in record_table.items():
+ out.emit(f" [{inst_name}] = {record_name}_INDEX,\n")
+ out.emit("};\n\n")
+ out.emit(f"const _Py_RecordFuncPtr _PyOpcode_RecordFunctions[{func_count+1}] = {{\n")
+ out.emit(" [0] = NULL,\n")
+ for name in record_function_indexes:
+ out.emit(f" [{name}_INDEX] = _PyOpcode_RecordFunction{name[7:]},\n")
+ out.emit("};\n")
+
+
+arg_parser = argparse.ArgumentParser(
+ description="Generate the record functions for the trace recorder.",
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+)
+
+arg_parser.add_argument(
+ "-o", "--output", type=str, help="Generated code", default=DEFAULT_OUTPUT
+)
+
+arg_parser.add_argument(
+ "input", nargs=argparse.REMAINDER, help="Instruction definition file(s)"
+)
+
+if __name__ == "__main__":
+ args = arg_parser.parse_args()
+ if len(args.input) == 0:
+ args.input.append(DEFAULT_INPUT)
+ data = analyze_files(args.input)
+ with open(args.output, "w") as outfile:
+ out = CWriter(outfile, 0, False)
+ generate_recorder_functions(args.input, data, out)
+ generate_recorder_tables(data, out)
raise analysis_error(ex.args[0], inst.where) from None
seen = {"unused"}
for part in inst.parts:
- if not isinstance(part, Uop):
+ if not isinstance(part, Uop) or part.properties.records_value:
continue
for var in part.stack.inputs:
if var.used and var.name not in seen:
offset = 1 # The instruction itself
stack = Stack()
for part in inst.parts:
+ if part.properties.records_value:
+ continue
# Only emit braces if more than one uop
insert_braces = len([p for p in inst.parts if isinstance(p, Uop)]) > 1
reachable, offset, stack = write_uop(part, emitter, offset, stack, inst, insert_braces)
self.emit(f"SET_CURRENT_CACHED_VALUES({cached_items});\n")
-def write_uop(uop: Uop, emitter: Tier2Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]], cached_items: int = 0) -> tuple[bool, Stack]:
+def write_uop(uop: Uop, emitter: Tier2Emitter, stack: Stack, cached_items: int = 0) -> tuple[bool, Stack]:
locals: dict[str, Local] = {}
zero_regs = is_large(uop) or uop.properties.escapes
try:
- if name_offset_pair := offset_strs.get(uop.name):
- emitter.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n")
emitter.out.start_line()
if uop.properties.oparg:
emitter.emit("oparg = CURRENT_OPARG();\n")
storage.stack._print(emitter.out)
emitter.cache_items(storage.stack, cached_items, zero_regs)
storage.flush(emitter.out)
- if name_offset_pair:
- emitter.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")
return reachable, storage.stack
except StackError as ex:
raise analysis_error(ex.args[0], uop.body.open) from None
"_GUARD_NOT_EXHAUSTED_TUPLE", "_FOR_ITER_TIER_TWO"
)
-def populate_offset_strs(analysis: Analysis) -> dict[str, tuple[str, str]]:
- offset_strs: dict[str, tuple[str, str]] = {}
- for name, uop in analysis.uops.items():
- if not f"_GUARD_IP_{name}" in analysis.uops:
- continue
- tkn_iter = uop.body.tokens()
- found = False
- offset_str = ""
- for token in tkn_iter:
- if token.kind == "IDENTIFIER" and token.text == "LOAD_IP":
- if found:
- raise analysis_error("Cannot have two LOAD_IP in a guarded single uop.", uop.body.open)
- offset = []
- while token.kind != "SEMI":
- offset.append(token.text)
- token = next(tkn_iter)
- # 1: to remove the LOAD_IP text
- offset_str = "".join(offset[1:])
- found = True
- assert offset_str
- offset_strs[f"_GUARD_IP_{name}"] = (name, offset_str)
- return offset_strs
-
def generate_tier2(
filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool
) -> None:
"""
)
out = CWriter(outfile, 2, lines)
- offset_strs = populate_offset_strs(analysis)
out.emit("\n")
for name, uop in analysis.uops.items():
continue
if uop.is_super():
continue
+ if uop.properties.records_value:
+ continue
why_not_viable = uop.why_not_viable()
if why_not_viable is not None:
out.emit(
stack = Stack()
stack.push_cache([f"_tos_cache{i}" for i in range(inputs)], out)
stack._print(out)
- reachable, stack = write_uop(uop, emitter, stack, offset_strs, outputs)
+ reachable, stack = write_uop(uop, emitter, stack, outputs)
out.start_line()
if reachable:
out.emit("assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());\n")
for name, uop in sorted(uops):
if uop.properties.tier == 1:
continue
+ if uop.properties.records_value:
+ continue
for inputs, outputs, _ in sorted(get_uop_cache_depths(uop)):
out.emit(f"#define {name}_r{inputs}{outputs} {next_id}\n")
next_id += 1
def uop_cache_info(uop: Uop) -> list[str] | None:
if uop.name == "_SPILL_OR_RELOAD":
return None
+ if uop.properties.records_value:
+ return None
default = "{ -1, -1, -1 },\n"
table_size = MAX_CACHED_REGISTER + 1
entries = [ default ] * table_size
out.emit("};\n\n")
out.emit("const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {\n");
for uop in analysis.uops.values():
- if uop.is_viable() and uop.properties.tier != 1 and not uop.is_super():
+ if uop.is_viable() and uop.properties.tier != 1 and not uop.is_super() and not uop.properties.records_value:
for inputs, outputs, _ in get_uop_cache_depths(uop):
out.emit(f"[{uop.name}_r{inputs}{outputs}] = {uop.name},\n")
out.emit("};\n\n")
for uop in sorted(analysis.uops.values(), key=lambda t: t.name):
if uop.is_viable() and uop.properties.tier != 1 and not uop.is_super():
out.emit(f'[{uop.name}] = "{uop.name}",\n')
- for inputs, outputs, _ in get_uop_cache_depths(uop):
- out.emit(f'[{uop.name}_r{inputs}{outputs}] = "{uop.name}_r{inputs}{outputs}",\n')
+ if not uop.properties.records_value:
+ for inputs, outputs, _ in get_uop_cache_depths(uop):
+ out.emit(f'[{uop.name}_r{inputs}{outputs}] = "{uop.name}_r{inputs}{outputs}",\n')
out.emit("};\n")
out.emit("int _PyUop_num_popped(int opcode, int oparg)\n{\n")
out.emit("switch(opcode) {\n")
out.emit("}\n\n")
out.emit("#endif // NEED_OPCODE_METADATA\n\n")
-
def generate_uop_metadata(
filenames: list[str], analysis: Analysis, outfile: TextIO
) -> None: