Skip to content

Commit f277c2f

Browse files
committed
Tools/cases_generator/tier2_generator.py
1 parent bc5ed3c commit f277c2f

2 files changed

Lines changed: 28 additions & 6 deletions

File tree

Tools/cases_generator/tier2_generator.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,12 @@ def generate_tier2(
279279
continue
280280
for inputs, outputs, exit_depth in get_uop_cache_depths(uop):
281281
emitter = Tier2Emitter(out, analysis.labels, exit_depth)
282+
opname = f"{uop.name}_r{inputs}{outputs}"
282283
needed_cached_registers = max(inputs, outputs)
284+
out.emit(f"/* BEGIN_JIT_CASE {opname} */\n")
283285
if needed_cached_registers:
284286
out.emit(f"#if MAX_CACHED_REGISTER >= {needed_cached_registers}\n")
285-
out.emit(f"case {uop.name}_r{inputs}{outputs}: {{\n")
287+
out.emit(f"case {opname}: {{\n")
286288
out.emit(f"CHECK_CURRENT_CACHED_VALUES({inputs});\n")
287289
out.emit("assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());\n")
288290
declare_variables(uop, out)
@@ -300,6 +302,8 @@ def generate_tier2(
300302
out.emit("\n\n")
301303
if needed_cached_registers:
302304
out.emit("#endif\n\n")
305+
out.emit(f"/* END_JIT_CASE {opname} */\n")
306+
out.emit("\n")
303307
out.emit("\n")
304308
outfile.write("#undef TIER_TWO\n")
305309

Tools/jit/_targets.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,28 @@
3636
"_R", _schema.COFFRelocation, _schema.ELFRelocation, _schema.MachORelocation
3737
)
3838

39+
def _extract_jit_cases(generated_cases: str) -> list[tuple[str, str]]:
40+
begin_case = re.compile(r"\s*/\* BEGIN_JIT_CASE (\w+) \*/\n")
41+
cases_and_opnames: list[tuple[str, str]] = []
42+
current_opname: str | None = None
43+
current_lines: list[str] = []
44+
for line in generated_cases.splitlines(keepends=True):
45+
if current_opname is None:
46+
match = begin_case.fullmatch(line)
47+
if match is not None:
48+
current_opname = match.group(1)
49+
current_lines = []
50+
continue
51+
if line.strip() == f"/* END_JIT_CASE {current_opname} */":
52+
cases_and_opnames.append(("".join(current_lines), current_opname))
53+
current_opname = None
54+
current_lines = []
55+
continue
56+
current_lines.append(line)
57+
if current_opname is not None:
58+
raise RuntimeError(f"Unterminated JIT case block for {current_opname}")
59+
return cases_and_opnames
60+
3961

4062
@dataclasses.dataclass
4163
class _Target(typing.Generic[_S, _R]):
@@ -195,11 +217,7 @@ async def _compile(
195217

196218
async def _build_stencils(self) -> dict[str, _stencils.StencilGroup]:
197219
generated_cases = PYTHON_EXECUTOR_CASES_C_H.read_text()
198-
cases_and_opnames = sorted(
199-
re.findall(
200-
r"\n {8}(case (\w+): \{\n.*?\n {8}\})", generated_cases, flags=re.DOTALL
201-
)
202-
)
220+
cases_and_opnames = _extract_jit_cases(generated_cases)
203221
tasks = []
204222
with tempfile.TemporaryDirectory() as tempdir:
205223
work = pathlib.Path(tempdir).resolve()

0 commit comments

Comments
 (0)