mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
Some checks are pending
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Ubuntu SSL tests with AWS-LC (push) Blocked by required conditions
Tests / Android (aarch64) (push) Blocked by required conditions
Tests / Android (x86_64) (push) Blocked by required conditions
Tests / iOS (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Sanitizers (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
JIT / Interpreter (Debug) (push) Waiting to run
JIT / aarch64-pc-windows-msvc/msvc (Release) (push) Blocked by required conditions
JIT / aarch64-pc-windows-msvc/msvc (Debug) (push) Blocked by required conditions
JIT / i686-pc-windows-msvc/msvc (Release) (push) Blocked by required conditions
JIT / i686-pc-windows-msvc/msvc (Debug) (push) Blocked by required conditions
JIT / aarch64-apple-darwin/clang (Release) (push) Blocked by required conditions
JIT / aarch64-unknown-linux-gnu/gcc (Release) (push) Blocked by required conditions
JIT / aarch64-apple-darwin/clang (Debug) (push) Blocked by required conditions
JIT / aarch64-unknown-linux-gnu/gcc (Debug) (push) Blocked by required conditions
JIT / x86_64-pc-windows-msvc/msvc (Release) (push) Blocked by required conditions
JIT / x86_64-pc-windows-msvc/msvc (Debug) (push) Blocked by required conditions
JIT / x86_64-apple-darwin/clang (Release) (push) Blocked by required conditions
JIT / x86_64-unknown-linux-gnu/gcc (Release) (push) Blocked by required conditions
JIT / x86_64-apple-darwin/clang (Debug) (push) Blocked by required conditions
JIT / x86_64-unknown-linux-gnu/gcc (Debug) (push) Blocked by required conditions
JIT / Free-Threaded (Debug) (push) Blocked by required conditions
JIT / JIT without optimizations (Debug) (push) Blocked by required conditions
JIT / JIT with tail calling interpreter (push) Blocked by required conditions
Lint / lint (push) Waiting to run
mypy / Run mypy on Lib/_pyrepl (push) Waiting to run
mypy / Run mypy on Lib/test/libregrtest (push) Waiting to run
mypy / Run mypy on Lib/tomllib (push) Waiting to run
mypy / Run mypy on Tools/build (push) Waiting to run
mypy / Run mypy on Tools/cases_generator (push) Waiting to run
mypy / Run mypy on Tools/clinic (push) Waiting to run
mypy / Run mypy on Tools/jit (push) Waiting to run
mypy / Run mypy on Tools/peg_generator (push) Waiting to run
Tail calling interpreter / aarch64-apple-darwin/clang (push) Waiting to run
Tail calling interpreter / aarch64-unknown-linux-gnu/gcc (push) Waiting to run
Tail calling interpreter / x86_64-pc-windows-msvc/msvc (push) Waiting to run
Tail calling interpreter / x86_64-apple-darwin/clang (push) Waiting to run
Tail calling interpreter / free-threading (push) Waiting to run
Tail calling interpreter / x86_64-unknown-linux-gnu/gcc (push) Waiting to run
Uses three registers to cache values at the top of the evaluation stack This significantly reduces memory traffic for smaller, more common uops.
84 lines
3.2 KiB
Python
84 lines
3.2 KiB
Python
"""Utilities for writing StencilGroups out to a C header file."""
|
|
|
|
import itertools
|
|
import typing
|
|
import math
|
|
|
|
import _stencils
|
|
|
|
|
|
def _dump_footer(
|
|
groups: dict[str, _stencils.StencilGroup], symbols: dict[str, int]
|
|
) -> typing.Iterator[str]:
|
|
symbol_mask_size = max(math.ceil(len(symbols) / 32), 1)
|
|
yield f'static_assert(SYMBOL_MASK_WORDS >= {symbol_mask_size}, "SYMBOL_MASK_WORDS too small");'
|
|
yield ""
|
|
yield "typedef struct {"
|
|
yield " void (*emit)("
|
|
yield " unsigned char *code, unsigned char *data, _PyExecutorObject *executor,"
|
|
yield " const _PyUOpInstruction *instruction, jit_state *state);"
|
|
yield " size_t code_size;"
|
|
yield " size_t data_size;"
|
|
yield " symbol_mask trampoline_mask;"
|
|
yield " symbol_mask got_mask;"
|
|
yield "} StencilGroup;"
|
|
yield ""
|
|
yield f"static const StencilGroup trampoline = {groups['trampoline'].as_c('trampoline')};"
|
|
yield ""
|
|
yield "static const StencilGroup stencil_groups[MAX_UOP_REGS_ID + 1] = {"
|
|
for opname, group in sorted(groups.items()):
|
|
if opname == "trampoline":
|
|
continue
|
|
yield f" [{opname}] = {group.as_c(opname)},"
|
|
yield "};"
|
|
yield ""
|
|
yield f"static const void * const symbols_map[{max(len(symbols), 1)}] = {{"
|
|
if symbols:
|
|
for symbol, ordinal in symbols.items():
|
|
yield f" [{ordinal}] = &{symbol},"
|
|
else:
|
|
yield " 0"
|
|
yield "};"
|
|
|
|
|
|
def _dump_stencil(opname: str, group: _stencils.StencilGroup) -> typing.Iterator[str]:
|
|
yield "void"
|
|
yield f"emit_{opname}("
|
|
yield " unsigned char *code, unsigned char *data, _PyExecutorObject *executor,"
|
|
yield " const _PyUOpInstruction *instruction, jit_state *state)"
|
|
yield "{"
|
|
for part, stencil in [("code", group.code), ("data", group.data)]:
|
|
for line in stencil.disassembly:
|
|
yield f" // {line}"
|
|
stripped = stencil.body.rstrip(b"\x00")
|
|
if stripped:
|
|
yield f" const unsigned char {part}_body[{len(stencil.body)}] = {{"
|
|
for i in range(0, len(stripped), 8):
|
|
row = " ".join(f"{byte:#04x}," for byte in stripped[i : i + 8])
|
|
yield f" {row}"
|
|
yield " };"
|
|
# Data is written first (so relaxations in the code work properly):
|
|
for part, stencil in [("data", group.data), ("code", group.code)]:
|
|
if stencil.body.rstrip(b"\x00"):
|
|
yield f" memcpy({part}, {part}_body, sizeof({part}_body));"
|
|
skip = False
|
|
stencil.holes.sort(key=lambda hole: hole.offset)
|
|
for hole, pair in itertools.zip_longest(stencil.holes, stencil.holes[1:]):
|
|
if skip:
|
|
skip = False
|
|
continue
|
|
if pair and (folded := hole.fold(pair, stencil.body)):
|
|
skip = True
|
|
hole = folded
|
|
yield f" {hole.as_c(part)}"
|
|
yield "}"
|
|
yield ""
|
|
|
|
|
|
def dump(
|
|
groups: dict[str, _stencils.StencilGroup], symbols: dict[str, int]
|
|
) -> typing.Iterator[str]:
|
|
"""Yield a JIT compiler line-by-line as a C header file."""
|
|
for opname, group in groups.items():
|
|
yield from _dump_stencil(opname, group)
|
|
yield from _dump_footer(groups, symbols)
|