]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-102738: remove from cases generator the code related to register instructions...
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>
Wed, 15 Mar 2023 21:25:31 +0000 (21:25 +0000)
committerGitHub <noreply@github.com>
Wed, 15 Mar 2023 21:25:31 +0000 (21:25 +0000)
Python/opcode_metadata.h
Tools/cases_generator/generate_cases.py

index 93f3c76c5b82406b443003a2e2b03bdb81463499..ee760ab78af2178fa86c2d5ee7d5b170d00c4347 100644 (file)
@@ -707,12 +707,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
 }
 #endif
 
-enum Direction { DIR_NONE, DIR_READ, DIR_WRITE };
 enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC0, INSTR_FMT_IBC000, INSTR_FMT_IBC00000000, INSTR_FMT_IBIB, INSTR_FMT_IX, INSTR_FMT_IXC, INSTR_FMT_IXC000 };
 struct opcode_metadata {
-    enum Direction dir_op1;
-    enum Direction dir_op2;
-    enum Direction dir_op3;
     bool valid_entry;
     enum InstructionFormat instr_format;
 };
@@ -721,175 +717,175 @@ struct opcode_metadata {
 extern const struct opcode_metadata _PyOpcode_opcode_metadata[256];
 #else
 const struct opcode_metadata _PyOpcode_opcode_metadata[256] = {
-    [NOP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [RESUME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_CLOSURE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_FAST_CHECK] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_CONST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [STORE_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_FAST__LOAD_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBIB },
-    [LOAD_FAST__LOAD_CONST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBIB },
-    [STORE_FAST__LOAD_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBIB },
-    [STORE_FAST__STORE_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBIB },
-    [LOAD_CONST__LOAD_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBIB },
-    [POP_TOP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [PUSH_NULL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [END_FOR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [UNARY_NEGATIVE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [UNARY_NOT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [UNARY_INVERT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [BINARY_OP_MULTIPLY_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_OP_MULTIPLY_FLOAT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_OP_SUBTRACT_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_OP_SUBTRACT_FLOAT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_OP_ADD_UNICODE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_OP_INPLACE_ADD_UNICODE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [BINARY_OP_ADD_FLOAT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_OP_ADD_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [BINARY_SUBSCR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [BINARY_SLICE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [STORE_SLICE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [BINARY_SUBSCR_LIST_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [BINARY_SUBSCR_TUPLE_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [BINARY_SUBSCR_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [BINARY_SUBSCR_GETITEM] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [LIST_APPEND] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [SET_ADD] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [STORE_SUBSCR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [STORE_SUBSCR_LIST_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [STORE_SUBSCR_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC },
-    [DELETE_SUBSCR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [CALL_INTRINSIC_1] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [CALL_INTRINSIC_2] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [RAISE_VARARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [INTERPRETER_EXIT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [RETURN_VALUE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [RETURN_CONST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [GET_AITER] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [GET_ANEXT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [GET_AWAITABLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [SEND] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [SEND_GEN] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [YIELD_VALUE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [POP_EXCEPT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [RERAISE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [END_ASYNC_FOR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [CLEANUP_THROW] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [LOAD_ASSERTION_ERROR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [LOAD_BUILD_CLASS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [STORE_NAME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [DELETE_NAME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [UNPACK_SEQUENCE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [UNPACK_SEQUENCE_TWO_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [UNPACK_SEQUENCE_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [UNPACK_SEQUENCE_LIST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [UNPACK_EX] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [STORE_ATTR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [DELETE_ATTR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [STORE_GLOBAL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [DELETE_GLOBAL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_NAME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_GLOBAL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [LOAD_GLOBAL_MODULE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [LOAD_GLOBAL_BUILTIN] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [DELETE_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [MAKE_CELL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [DELETE_DEREF] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_CLASSDEREF] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_DEREF] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [STORE_DEREF] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [COPY_FREE_VARS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [BUILD_STRING] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [BUILD_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [BUILD_LIST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LIST_EXTEND] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [SET_UPDATE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [BUILD_SET] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [BUILD_MAP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [SETUP_ANNOTATIONS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [BUILD_CONST_KEY_MAP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [DICT_UPDATE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [DICT_MERGE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [MAP_ADD] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [LOAD_ATTR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_INSTANCE_VALUE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_MODULE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_WITH_HINT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_SLOT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_CLASS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_PROPERTY] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [STORE_ATTR_INSTANCE_VALUE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [STORE_ATTR_WITH_HINT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [STORE_ATTR_SLOT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC000 },
-    [COMPARE_OP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [COMPARE_AND_BRANCH] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 },
-    [COMPARE_AND_BRANCH_FLOAT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 },
-    [COMPARE_AND_BRANCH_INT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 },
-    [COMPARE_AND_BRANCH_STR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 },
-    [IS_OP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [CONTAINS_OP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [CHECK_EG_MATCH] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [CHECK_EXC_MATCH] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [IMPORT_NAME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [IMPORT_FROM] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [JUMP_FORWARD] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [JUMP_BACKWARD] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [POP_JUMP_IF_FALSE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [POP_JUMP_IF_TRUE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [POP_JUMP_IF_NOT_NONE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [POP_JUMP_IF_NONE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [JUMP_IF_FALSE_OR_POP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [JUMP_IF_TRUE_OR_POP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [JUMP_BACKWARD_NO_INTERRUPT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [GET_LEN] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [MATCH_CLASS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [MATCH_MAPPING] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [MATCH_SEQUENCE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [MATCH_KEYS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [GET_ITER] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [GET_YIELD_FROM_ITER] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [FOR_ITER] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [FOR_ITER_LIST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [FOR_ITER_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [FOR_ITER_RANGE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [FOR_ITER_GEN] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [BEFORE_ASYNC_WITH] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [BEFORE_WITH] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [WITH_EXCEPT_START] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [PUSH_EXC_INFO] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [LOAD_ATTR_METHOD_WITH_VALUES] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_METHOD_NO_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [LOAD_ATTR_METHOD_LAZY_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
-    [KW_NAMES] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [CALL] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_BOUND_METHOD_EXACT_ARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_PY_EXACT_ARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_PY_WITH_DEFAULTS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_TYPE_1] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_STR_1] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_TUPLE_1] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_BUILTIN_CLASS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_BUILTIN_O] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_BUILTIN_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_LEN] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_ISINSTANCE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_LIST_APPEND] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_METHOD_DESCRIPTOR_O] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC000 },
-    [CALL_FUNCTION_EX] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [MAKE_FUNCTION] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [RETURN_GENERATOR] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
-    [BUILD_SLICE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [FORMAT_VALUE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [COPY] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [BINARY_OP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC },
-    [SWAP] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [EXTENDED_ARG] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
-    [CACHE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
+    [NOP] = { true, INSTR_FMT_IX },
+    [RESUME] = { true, INSTR_FMT_IB },
+    [LOAD_CLOSURE] = { true, INSTR_FMT_IB },
+    [LOAD_FAST_CHECK] = { true, INSTR_FMT_IB },
+    [LOAD_FAST] = { true, INSTR_FMT_IB },
+    [LOAD_CONST] = { true, INSTR_FMT_IB },
+    [STORE_FAST] = { true, INSTR_FMT_IB },
+    [LOAD_FAST__LOAD_FAST] = { true, INSTR_FMT_IBIB },
+    [LOAD_FAST__LOAD_CONST] = { true, INSTR_FMT_IBIB },
+    [STORE_FAST__LOAD_FAST] = { true, INSTR_FMT_IBIB },
+    [STORE_FAST__STORE_FAST] = { true, INSTR_FMT_IBIB },
+    [LOAD_CONST__LOAD_FAST] = { true, INSTR_FMT_IBIB },
+    [POP_TOP] = { true, INSTR_FMT_IX },
+    [PUSH_NULL] = { true, INSTR_FMT_IX },
+    [END_FOR] = { true, INSTR_FMT_IB },
+    [UNARY_NEGATIVE] = { true, INSTR_FMT_IX },
+    [UNARY_NOT] = { true, INSTR_FMT_IX },
+    [UNARY_INVERT] = { true, INSTR_FMT_IX },
+    [BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC },
+    [BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC },
+    [BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC },
+    [BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC },
+    [BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC },
+    [BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IX },
+    [BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC },
+    [BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC },
+    [BINARY_SUBSCR] = { true, INSTR_FMT_IXC000 },
+    [BINARY_SLICE] = { true, INSTR_FMT_IX },
+    [STORE_SLICE] = { true, INSTR_FMT_IX },
+    [BINARY_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC000 },
+    [BINARY_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC000 },
+    [BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC000 },
+    [BINARY_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC000 },
+    [LIST_APPEND] = { true, INSTR_FMT_IB },
+    [SET_ADD] = { true, INSTR_FMT_IB },
+    [STORE_SUBSCR] = { true, INSTR_FMT_IXC },
+    [STORE_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC },
+    [STORE_SUBSCR_DICT] = { true, INSTR_FMT_IXC },
+    [DELETE_SUBSCR] = { true, INSTR_FMT_IX },
+    [CALL_INTRINSIC_1] = { true, INSTR_FMT_IB },
+    [CALL_INTRINSIC_2] = { true, INSTR_FMT_IB },
+    [RAISE_VARARGS] = { true, INSTR_FMT_IB },
+    [INTERPRETER_EXIT] = { true, INSTR_FMT_IX },
+    [RETURN_VALUE] = { true, INSTR_FMT_IX },
+    [RETURN_CONST] = { true, INSTR_FMT_IB },
+    [GET_AITER] = { true, INSTR_FMT_IX },
+    [GET_ANEXT] = { true, INSTR_FMT_IX },
+    [GET_AWAITABLE] = { true, INSTR_FMT_IB },
+    [SEND] = { true, INSTR_FMT_IBC },
+    [SEND_GEN] = { true, INSTR_FMT_IBC },
+    [YIELD_VALUE] = { true, INSTR_FMT_IX },
+    [POP_EXCEPT] = { true, INSTR_FMT_IX },
+    [RERAISE] = { true, INSTR_FMT_IB },
+    [END_ASYNC_FOR] = { true, INSTR_FMT_IX },
+    [CLEANUP_THROW] = { true, INSTR_FMT_IX },
+    [LOAD_ASSERTION_ERROR] = { true, INSTR_FMT_IX },
+    [LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX },
+    [STORE_NAME] = { true, INSTR_FMT_IB },
+    [DELETE_NAME] = { true, INSTR_FMT_IB },
+    [UNPACK_SEQUENCE] = { true, INSTR_FMT_IBC },
+    [UNPACK_SEQUENCE_TWO_TUPLE] = { true, INSTR_FMT_IBC },
+    [UNPACK_SEQUENCE_TUPLE] = { true, INSTR_FMT_IBC },
+    [UNPACK_SEQUENCE_LIST] = { true, INSTR_FMT_IBC },
+    [UNPACK_EX] = { true, INSTR_FMT_IB },
+    [STORE_ATTR] = { true, INSTR_FMT_IBC000 },
+    [DELETE_ATTR] = { true, INSTR_FMT_IB },
+    [STORE_GLOBAL] = { true, INSTR_FMT_IB },
+    [DELETE_GLOBAL] = { true, INSTR_FMT_IB },
+    [LOAD_NAME] = { true, INSTR_FMT_IB },
+    [LOAD_GLOBAL] = { true, INSTR_FMT_IBC000 },
+    [LOAD_GLOBAL_MODULE] = { true, INSTR_FMT_IBC000 },
+    [LOAD_GLOBAL_BUILTIN] = { true, INSTR_FMT_IBC000 },
+    [DELETE_FAST] = { true, INSTR_FMT_IB },
+    [MAKE_CELL] = { true, INSTR_FMT_IB },
+    [DELETE_DEREF] = { true, INSTR_FMT_IB },
+    [LOAD_CLASSDEREF] = { true, INSTR_FMT_IB },
+    [LOAD_DEREF] = { true, INSTR_FMT_IB },
+    [STORE_DEREF] = { true, INSTR_FMT_IB },
+    [COPY_FREE_VARS] = { true, INSTR_FMT_IB },
+    [BUILD_STRING] = { true, INSTR_FMT_IB },
+    [BUILD_TUPLE] = { true, INSTR_FMT_IB },
+    [BUILD_LIST] = { true, INSTR_FMT_IB },
+    [LIST_EXTEND] = { true, INSTR_FMT_IB },
+    [SET_UPDATE] = { true, INSTR_FMT_IB },
+    [BUILD_SET] = { true, INSTR_FMT_IB },
+    [BUILD_MAP] = { true, INSTR_FMT_IB },
+    [SETUP_ANNOTATIONS] = { true, INSTR_FMT_IX },
+    [BUILD_CONST_KEY_MAP] = { true, INSTR_FMT_IB },
+    [DICT_UPDATE] = { true, INSTR_FMT_IB },
+    [DICT_MERGE] = { true, INSTR_FMT_IB },
+    [MAP_ADD] = { true, INSTR_FMT_IB },
+    [LOAD_ATTR] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_MODULE] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_CLASS] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_PROPERTY] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = { true, INSTR_FMT_IBC00000000 },
+    [STORE_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IXC000 },
+    [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000 },
+    [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000 },
+    [COMPARE_OP] = { true, INSTR_FMT_IBC },
+    [COMPARE_AND_BRANCH] = { true, INSTR_FMT_IBC0 },
+    [COMPARE_AND_BRANCH_FLOAT] = { true, INSTR_FMT_IBC0 },
+    [COMPARE_AND_BRANCH_INT] = { true, INSTR_FMT_IBC0 },
+    [COMPARE_AND_BRANCH_STR] = { true, INSTR_FMT_IBC0 },
+    [IS_OP] = { true, INSTR_FMT_IB },
+    [CONTAINS_OP] = { true, INSTR_FMT_IB },
+    [CHECK_EG_MATCH] = { true, INSTR_FMT_IX },
+    [CHECK_EXC_MATCH] = { true, INSTR_FMT_IX },
+    [IMPORT_NAME] = { true, INSTR_FMT_IB },
+    [IMPORT_FROM] = { true, INSTR_FMT_IB },
+    [JUMP_FORWARD] = { true, INSTR_FMT_IB },
+    [JUMP_BACKWARD] = { true, INSTR_FMT_IB },
+    [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IB },
+    [POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IB },
+    [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IB },
+    [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IB },
+    [JUMP_IF_FALSE_OR_POP] = { true, INSTR_FMT_IB },
+    [JUMP_IF_TRUE_OR_POP] = { true, INSTR_FMT_IB },
+    [JUMP_BACKWARD_NO_INTERRUPT] = { true, INSTR_FMT_IB },
+    [GET_LEN] = { true, INSTR_FMT_IX },
+    [MATCH_CLASS] = { true, INSTR_FMT_IB },
+    [MATCH_MAPPING] = { true, INSTR_FMT_IX },
+    [MATCH_SEQUENCE] = { true, INSTR_FMT_IX },
+    [MATCH_KEYS] = { true, INSTR_FMT_IX },
+    [GET_ITER] = { true, INSTR_FMT_IX },
+    [GET_YIELD_FROM_ITER] = { true, INSTR_FMT_IX },
+    [FOR_ITER] = { true, INSTR_FMT_IBC },
+    [FOR_ITER_LIST] = { true, INSTR_FMT_IBC },
+    [FOR_ITER_TUPLE] = { true, INSTR_FMT_IBC },
+    [FOR_ITER_RANGE] = { true, INSTR_FMT_IBC },
+    [FOR_ITER_GEN] = { true, INSTR_FMT_IBC },
+    [BEFORE_ASYNC_WITH] = { true, INSTR_FMT_IX },
+    [BEFORE_WITH] = { true, INSTR_FMT_IX },
+    [WITH_EXCEPT_START] = { true, INSTR_FMT_IX },
+    [PUSH_EXC_INFO] = { true, INSTR_FMT_IX },
+    [LOAD_ATTR_METHOD_WITH_VALUES] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000 },
+    [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000 },
+    [KW_NAMES] = { true, INSTR_FMT_IB },
+    [CALL] = { true, INSTR_FMT_IBC000 },
+    [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC000 },
+    [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC000 },
+    [CALL_PY_WITH_DEFAULTS] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_TYPE_1] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_STR_1] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_TUPLE_1] = { true, INSTR_FMT_IBC000 },
+    [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_BUILTIN_O] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_BUILTIN_FAST] = { true, INSTR_FMT_IBC000 },
+    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_LEN] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_ISINSTANCE] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_LIST_APPEND] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC000 },
+    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC000 },
+    [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC000 },
+    [CALL_FUNCTION_EX] = { true, INSTR_FMT_IB },
+    [MAKE_FUNCTION] = { true, INSTR_FMT_IB },
+    [RETURN_GENERATOR] = { true, INSTR_FMT_IX },
+    [BUILD_SLICE] = { true, INSTR_FMT_IB },
+    [FORMAT_VALUE] = { true, INSTR_FMT_IB },
+    [COPY] = { true, INSTR_FMT_IB },
+    [BINARY_OP] = { true, INSTR_FMT_IBC },
+    [SWAP] = { true, INSTR_FMT_IB },
+    [EXTENDED_ARG] = { true, INSTR_FMT_IB },
+    [CACHE] = { true, INSTR_FMT_IX },
 };
 #endif
index b16c927a4a2870c04f3c4fdadf007fdd32203d8c..f1b655b8b0545b58caa4f9426c34da26df1d18d6 100644 (file)
@@ -229,7 +229,6 @@ class Instruction:
 
     # Parts of the underlying instruction definition
     inst: parser.InstDef
-    register: bool
     kind: typing.Literal["inst", "op", "legacy"]  # Legacy means no (input -- output)
     name: str
     block: parser.Block
@@ -246,17 +245,12 @@ class Instruction:
     unmoved_names: frozenset[str]
     instr_fmt: str
 
-    # Parallel to input_effects; set later
-    input_registers: list[str] = dataclasses.field(repr=False)
-    output_registers: list[str] = dataclasses.field(repr=False)
-
     # Set later
     family: parser.Family | None = None
     predicted: bool = False
 
     def __init__(self, inst: parser.InstDef):
         self.inst = inst
-        self.register = inst.register
         self.kind = inst.kind
         self.name = inst.name
         self.block = inst.block
@@ -278,15 +272,10 @@ class Instruction:
             else:
                 break
         self.unmoved_names = frozenset(unmoved_names)
-        if self.register:
-            num_regs = len(self.input_effects) + len(self.output_effects)
-            num_dummies = (num_regs // 2) * 2 + 1 - num_regs
-            fmt = "I" + "B" * num_regs + "X" * num_dummies
+        if variable_used(inst, "oparg"):
+            fmt = "IB"
         else:
-            if variable_used(inst, "oparg"):
-                fmt = "IB"
-            else:
-                fmt = "IX"
+            fmt = "IX"
         cache = "C"
         for ce in self.cache_effects:
             for _ in range(ce.size):
@@ -294,20 +283,6 @@ class Instruction:
                 cache = "0"
         self.instr_fmt = fmt
 
-    def analyze_registers(self, a: "Analyzer") -> None:
-        regs = iter(("REG(oparg1)", "REG(oparg2)", "REG(oparg3)"))
-        try:
-            self.input_registers = [
-                next(regs) for ieff in self.input_effects if ieff.name != UNUSED
-            ]
-            self.output_registers = [
-                next(regs) for oeff in self.output_effects if oeff.name != UNUSED
-            ]
-        except StopIteration:  # Running out of registers
-            a.error(
-                f"Instruction {self.name} has too many register effects", node=self.inst
-            )
-
     def write(self, out: Formatter) -> None:
         """Write one instruction, sans prologue and epilogue."""
         # Write a static assertion that a family's cache size is correct
@@ -319,25 +294,19 @@ class Instruction:
                         f'{self.cache_offset}, "incorrect cache size");'
                     )
 
-        if not self.register:
-            # Write input stack effect variable declarations and initializations
-            ieffects = list(reversed(self.input_effects))
-            for i, ieffect in enumerate(ieffects):
-                isize = string_effect_size(
-                    list_effect_size([ieff for ieff in ieffects[: i + 1]])
-                )
-                if ieffect.size:
-                    src = StackEffect(f"(stack_pointer - {maybe_parenthesize(isize)})", "PyObject **")
-                elif ieffect.cond:
-                    src = StackEffect(f"({ieffect.cond}) ? stack_pointer[-{maybe_parenthesize(isize)}] : NULL", "")
-                else:
-                    src = StackEffect(f"stack_pointer[-{maybe_parenthesize(isize)}]", "")
-                out.declare(ieffect, src)
-        else:
-            # Write input register variable declarations and initializations
-            for ieffect, reg in zip(self.input_effects, self.input_registers):
-                src = StackEffect(reg, "")
-                out.declare(ieffect, src)
+        # Write input stack effect variable declarations and initializations
+        ieffects = list(reversed(self.input_effects))
+        for i, ieffect in enumerate(ieffects):
+            isize = string_effect_size(
+                list_effect_size([ieff for ieff in ieffects[: i + 1]])
+            )
+            if ieffect.size:
+                src = StackEffect(f"(stack_pointer - {maybe_parenthesize(isize)})", "PyObject **")
+            elif ieffect.cond:
+                src = StackEffect(f"({ieffect.cond}) ? stack_pointer[-{maybe_parenthesize(isize)}] : NULL", "")
+            else:
+                src = StackEffect(f"stack_pointer[-{maybe_parenthesize(isize)}]", "")
+            out.declare(ieffect, src)
 
         # Write output stack effect variable declarations
         isize = string_effect_size(list_effect_size(self.input_effects))
@@ -367,32 +336,26 @@ class Instruction:
         if self.always_exits:
             return
 
-        if not self.register:
-            # Write net stack growth/shrinkage
-            out.stack_adjust(
-                0,
-                [ieff for ieff in self.input_effects],
-                [oeff for oeff in self.output_effects],
-            )
+        # Write net stack growth/shrinkage
+        out.stack_adjust(
+            0,
+            [ieff for ieff in self.input_effects],
+            [oeff for oeff in self.output_effects],
+        )
 
-            # Write output stack effect assignments
-            oeffects = list(reversed(self.output_effects))
-            for i, oeffect in enumerate(oeffects):
-                if oeffect.name in self.unmoved_names:
-                    continue
-                osize = string_effect_size(
-                    list_effect_size([oeff for oeff in oeffects[: i + 1]])
-                )
-                if oeffect.size:
-                    dst = StackEffect(f"stack_pointer - {maybe_parenthesize(osize)}", "PyObject **")
-                else:
-                    dst = StackEffect(f"stack_pointer[-{maybe_parenthesize(osize)}]", "")
-                out.assign(dst, oeffect)
-        else:
-            # Write output register assignments
-            for oeffect, reg in zip(self.output_effects, self.output_registers):
-                dst = StackEffect(reg, "")
-                out.assign(dst, oeffect)
+        # Write output stack effect assignments
+        oeffects = list(reversed(self.output_effects))
+        for i, oeffect in enumerate(oeffects):
+            if oeffect.name in self.unmoved_names:
+                continue
+            osize = string_effect_size(
+                list_effect_size([oeff for oeff in oeffects[: i + 1]])
+            )
+            if oeffect.size:
+                dst = StackEffect(f"stack_pointer - {maybe_parenthesize(osize)}", "PyObject **")
+            else:
+                dst = StackEffect(f"stack_pointer[-{maybe_parenthesize(osize)}]", "")
+            out.assign(dst, oeffect)
 
         # Write cache effect
         if self.cache_offset:
@@ -438,19 +401,17 @@ class Instruction:
                 # ERROR_IF() must pop the inputs from the stack.
                 # The code block is responsible for DECREF()ing them.
                 # NOTE: If the label doesn't exist, just add it to ceval.c.
-                if not self.register:
-                    # Don't pop common input/output effects at the bottom!
-                    # These aren't DECREF'ed so they can stay.
-                    ieffs = list(self.input_effects)
-                    oeffs = list(self.output_effects)
-                    while ieffs and oeffs and ieffs[0] == oeffs[0]:
-                        ieffs.pop(0)
-                        oeffs.pop(0)
-                    ninputs, symbolic = list_effect_size(ieffs)
-                    if ninputs:
-                        label = f"pop_{ninputs}_{label}"
-                else:
-                    symbolic = ""
+
+                # Don't pop common input/output effects at the bottom!
+                # These aren't DECREF'ed so they can stay.
+                ieffs = list(self.input_effects)
+                oeffs = list(self.output_effects)
+                while ieffs and oeffs and ieffs[0] == oeffs[0]:
+                    ieffs.pop(0)
+                    oeffs.pop(0)
+                ninputs, symbolic = list_effect_size(ieffs)
+                if ninputs:
+                    label = f"pop_{ninputs}_{label}"
                 if symbolic:
                     out.write_raw(
                         f"{space}if ({cond}) {{ STACK_SHRINK({symbolic}); goto {label}; }}\n"
@@ -458,21 +419,20 @@ class Instruction:
                 else:
                     out.write_raw(f"{space}if ({cond}) goto {label};\n")
             elif m := re.match(r"(\s*)DECREF_INPUTS\(\);\s*(?://.*)?$", line):
-                if not self.register:
-                    out.reset_lineno()
-                    space = extra + m.group(1)
-                    for ieff in self.input_effects:
-                        if ieff.name in names_to_skip:
-                            continue
-                        if ieff.size:
-                            out.write_raw(
-                                f"{space}for (int _i = {ieff.size}; --_i >= 0;) {{\n"
-                            )
-                            out.write_raw(f"{space}    Py_DECREF({ieff.name}[_i]);\n")
-                            out.write_raw(f"{space}}}\n")
-                        else:
-                            decref = "XDECREF" if ieff.cond else "DECREF"
-                            out.write_raw(f"{space}Py_{decref}({ieff.name});\n")
+                out.reset_lineno()
+                space = extra + m.group(1)
+                for ieff in self.input_effects:
+                    if ieff.name in names_to_skip:
+                        continue
+                    if ieff.size:
+                        out.write_raw(
+                            f"{space}for (int _i = {ieff.size}; --_i >= 0;) {{\n"
+                        )
+                        out.write_raw(f"{space}    Py_DECREF({ieff.name}[_i]);\n")
+                        out.write_raw(f"{space}}}\n")
+                    else:
+                        decref = "XDECREF" if ieff.cond else "DECREF"
+                        out.write_raw(f"{space}Py_{decref}({ieff.name});\n")
             else:
                 out.write_raw(extra + line)
         out.reset_lineno()
@@ -672,7 +632,6 @@ class Analyzer:
         Raises SystemExit if there is an error.
         """
         self.find_predictions()
-        self.analyze_register_instrs()
         self.analyze_supers_and_macros()
         self.map_families()
         self.check_families()
@@ -782,11 +741,6 @@ class Analyzer:
             assert False, f"Unknown instruction {name!r}"
         return cache, input, output
 
-    def analyze_register_instrs(self) -> None:
-        for instr in self.instrs.values():
-            if instr.register:
-                instr.analyze_registers(self)
-
     def analyze_supers_and_macros(self) -> None:
         """Analyze each super- and macro instruction."""
         self.super_instrs = {}
@@ -816,7 +770,7 @@ class Analyzer:
         stack, initial_sp = self.stack_analysis(components)
         sp = initial_sp
         parts: list[Component | parser.CacheEffect] = []
-        format = "IB"  # Macros don't support register instructions yet
+        format = "IB"
         cache = "C"
         for component in components:
             match component:
@@ -1034,13 +988,9 @@ class Analyzer:
             self.write_stack_effect_functions()
 
             # Write type definitions
-            self.out.emit("enum Direction { DIR_NONE, DIR_READ, DIR_WRITE };")
             self.out.emit(f"enum InstructionFormat {{ {', '.join(format_enums)} }};")
             self.out.emit("struct opcode_metadata {")
             with self.out.indent():
-                self.out.emit("enum Direction dir_op1;")
-                self.out.emit("enum Direction dir_op2;")
-                self.out.emit("enum Direction dir_op3;")
                 self.out.emit("bool valid_entry;")
                 self.out.emit("enum InstructionFormat instr_format;")
             self.out.emit("};")
@@ -1073,32 +1023,20 @@ class Analyzer:
 
     def write_metadata_for_inst(self, instr: Instruction) -> None:
         """Write metadata for a single instruction."""
-        dir_op1 = dir_op2 = dir_op3 = "DIR_NONE"
-        if instr.kind == "legacy":
-            assert not instr.register
-        else:
-            if instr.register:
-                directions: list[str] = []
-                directions.extend("DIR_READ" for _ in instr.input_effects)
-                directions.extend("DIR_WRITE" for _ in instr.output_effects)
-                directions.extend("DIR_NONE" for _ in range(3))
-                dir_op1, dir_op2, dir_op3 = directions[:3]
         self.out.emit(
-            f"    [{instr.name}] = {{ {dir_op1}, {dir_op2}, {dir_op3}, true, {INSTR_FMT_PREFIX}{instr.instr_fmt} }},"
+            f"    [{instr.name}] = {{ true, {INSTR_FMT_PREFIX}{instr.instr_fmt} }},"
         )
 
     def write_metadata_for_super(self, sup: SuperInstruction) -> None:
         """Write metadata for a super-instruction."""
-        dir_op1 = dir_op2 = dir_op3 = "DIR_NONE"
         self.out.emit(
-            f"    [{sup.name}] = {{ {dir_op1}, {dir_op2}, {dir_op3}, true, {INSTR_FMT_PREFIX}{sup.instr_fmt} }},"
+            f"    [{sup.name}] = {{ true, {INSTR_FMT_PREFIX}{sup.instr_fmt} }},"
         )
 
     def write_metadata_for_macro(self, mac: MacroInstruction) -> None:
         """Write metadata for a macro-instruction."""
-        dir_op1 = dir_op2 = dir_op3 = "DIR_NONE"
         self.out.emit(
-            f"    [{mac.name}] = {{ {dir_op1}, {dir_op2}, {dir_op3}, true, {INSTR_FMT_PREFIX}{mac.instr_fmt} }},"
+            f"    [{mac.name}] = {{ true, {INSTR_FMT_PREFIX}{mac.instr_fmt} }},"
         )
 
     def write_instructions(self) -> None: