summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
Diffstat (limited to 'Tools')
-rw-r--r--Tools/cases_generator/analyzer.py4
-rw-r--r--Tools/cases_generator/generators_common.py2
-rw-r--r--Tools/cases_generator/lexer.py1
-rw-r--r--Tools/cases_generator/opcode_metadata_generator.py5
-rw-r--r--Tools/cases_generator/tier1_generator.py7
5 files changed, 15 insertions, 4 deletions
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index 73c8717..c0a370a 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -27,6 +27,7 @@ class Properties:
oparg_and_1: bool = False
const_oparg: int = -1
needs_prev: bool = False
+ no_save_ip: bool = False
def dump(self, indent: str) -> None:
simple_properties = self.__dict__.copy()
@@ -60,6 +61,7 @@ class Properties:
side_exit=any(p.side_exit for p in properties),
pure=all(p.pure for p in properties),
needs_prev=any(p.needs_prev for p in properties),
+ no_save_ip=all(p.no_save_ip for p in properties),
)
@property
@@ -87,6 +89,7 @@ SKIP_PROPERTIES = Properties(
has_free=False,
side_exit=False,
pure=True,
+ no_save_ip=False,
)
@@ -829,6 +832,7 @@ def compute_properties(op: parser.InstDef) -> Properties:
and not has_free,
has_free=has_free,
pure="pure" in op.annotations,
+ no_save_ip="no_save_ip" in op.annotations,
tier=tier_variable(op),
needs_prev=variable_used(op, "prev_instr"),
)
diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py
index d17617c..8df9a9c 100644
--- a/Tools/cases_generator/generators_common.py
+++ b/Tools/cases_generator/generators_common.py
@@ -583,6 +583,8 @@ def cflags(p: Properties) -> str:
flags.append("HAS_ESCAPES_FLAG")
if p.pure:
flags.append("HAS_PURE_FLAG")
+ if p.no_save_ip:
+ flags.append("HAS_NO_SAVE_IP_FLAG")
if p.oparg_and_1:
flags.append("HAS_OPARG_AND_1_FLAG")
if flags:
diff --git a/Tools/cases_generator/lexer.py b/Tools/cases_generator/lexer.py
index 37f9639..bee2a18 100644
--- a/Tools/cases_generator/lexer.py
+++ b/Tools/cases_generator/lexer.py
@@ -226,6 +226,7 @@ annotations = {
"replicate",
"tier1",
"tier2",
+ "no_save_ip",
}
__all__ = []
diff --git a/Tools/cases_generator/opcode_metadata_generator.py b/Tools/cases_generator/opcode_metadata_generator.py
index 1a9849c..453db69 100644
--- a/Tools/cases_generator/opcode_metadata_generator.py
+++ b/Tools/cases_generator/opcode_metadata_generator.py
@@ -53,6 +53,7 @@ FLAGS = [
"PASSTHROUGH",
"OPARG_AND_1",
"ERROR_NO_POP",
+ "NO_SAVE_IP",
]
@@ -285,8 +286,8 @@ def generate_metadata_table(analysis: Analysis, out: CWriter) -> None:
table_size = 256 + len(analysis.pseudos)
out.emit("struct opcode_metadata {\n")
out.emit("uint8_t valid_entry;\n")
- out.emit("int8_t instr_format;\n")
- out.emit("int16_t flags;\n")
+ out.emit("uint8_t instr_format;\n")
+ out.emit("uint16_t flags;\n")
out.emit("};\n\n")
out.emit(
f"extern const struct opcode_metadata _PyOpcode_opcode_metadata[{table_size}];\n"
diff --git a/Tools/cases_generator/tier1_generator.py b/Tools/cases_generator/tier1_generator.py
index fcdd3bd..40562da 100644
--- a/Tools/cases_generator/tier1_generator.py
+++ b/Tools/cases_generator/tier1_generator.py
@@ -151,9 +151,12 @@ def generate_tier1(
if inst.properties.needs_prev:
out.emit(f"_Py_CODEUNIT* const prev_instr = frame->instr_ptr;\n")
if needs_this and not inst.is_target:
- out.emit(f"_Py_CODEUNIT* const this_instr = frame->instr_ptr = next_instr;\n")
+ if inst.properties.no_save_ip:
+ out.emit(f"_Py_CODEUNIT* const this_instr = next_instr;\n")
+ else:
+ out.emit(f"_Py_CODEUNIT* const this_instr = frame->instr_ptr = next_instr;\n")
out.emit(unused_guard)
- else:
+ elif not inst.properties.no_save_ip:
out.emit(f"frame->instr_ptr = next_instr;\n")
out.emit(f"next_instr += {inst.size};\n")
out.emit(f"INSTRUCTION_STATS({name});\n")