summaryrefslogtreecommitdiffstats
path: root/Tools/scripts/generate_opcode_h.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/scripts/generate_opcode_h.py')
-rw-r--r--Tools/scripts/generate_opcode_h.py17
1 files changed, 14 insertions, 3 deletions
diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py
index 75a9c3f..3b79dc6 100644
--- a/Tools/scripts/generate_opcode_h.py
+++ b/Tools/scripts/generate_opcode_h.py
@@ -28,7 +28,7 @@ footer = """
#endif /* !Py_OPCODE_H */
"""
-DEFINE = "#define {:<31} {:>3}\n"
+DEFINE = "#define {:<38} {:>3}\n"
UINT32_MASK = (1<<32)-1
@@ -75,16 +75,27 @@ def main(opcode_py, outfile='Include/opcode.h'):
fobj.write(DEFINE.format(name, next_op))
used[next_op] = True
fobj.write(DEFINE.format('DO_TRACING', 255))
- fobj.write("\nextern const uint8_t _PyOpcode_InlineCacheEntries[256];\n")
+ fobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n")
+ fobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n")
fobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], fobj)
write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], fobj)
- fobj.write("\nconst uint8_t _PyOpcode_InlineCacheEntries[256] = {\n")
+ fobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
for i, entries in enumerate(opcode["_inline_cache_entries"]):
if entries:
fobj.write(f" [{opname[i]}] = {entries},\n")
fobj.write("};\n")
+ deoptcodes = {}
+ for basic in opmap:
+ deoptcodes[basic] = basic
+ for basic, family in opcode["_specializations"].items():
+ for specialized in family:
+ deoptcodes[specialized] = basic
+ fobj.write("\nconst uint8_t _PyOpcode_Deopt[256] = {\n")
+ for opt, deopt in sorted(deoptcodes.items()):
+ fobj.write(f" [{opt}] = {deopt},\n")
+ fobj.write("};\n")
fobj.write("#endif /* OPCODE_TABLES */\n")
fobj.write("\n")