Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-130887: remove trailing jump in AArch64 JIT stencils #131042

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Optimize the AArch64 code generation for the JIT. Patch by Diego Russo
17 changes: 13 additions & 4 deletions Tools/jit/_stencils.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,15 @@ def pad(self, alignment: int) -> None:
self.disassembly.append(f"{offset:x}: {' '.join(['00'] * padding)}")
self.body.extend([0] * padding)

def remove_jump(self, *, alignment: int = 1) -> None:
def add_nop(self, alignment: int) -> None:
"""Add a NOP if the offset is not aligned."""
offset = len(self.body)
nop = b"\x1f\x20\x03\xD5"
if offset % alignment:
self.disassembly.append(f"{offset:x}: d503201f\t\t nop")
self.body.extend(nop)
Comment on lines +212 to +218
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like that this is ARM-specific, and only really happens to work because of the current alignment values we chose.

I wonder how messy it would be to make nop an attribute of _Target, and pass it into process_relocations, which passes it here (sort of like alignment).

I think that we should probably also make this so that it can add several nops if the alignment is larger (such as 16), and fail if this isn't possible (when adding nops overshoots the intended alignment).


def remove_jump(self) -> None:
"""Remove a zero-length continuation jump, if it exists."""
hole = max(self.holes, key=lambda hole: hole.offset)
match hole:
Expand Down Expand Up @@ -244,8 +252,9 @@ def remove_jump(self, *, alignment: int = 1) -> None:
jump = b"\x00\x00\x00\x14"
case _:
return
if self.body[offset:] == jump and offset % alignment == 0:
if self.body[offset:] == jump:
self.body = self.body[:offset]
self.disassembly = self.disassembly[:-2]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh, I'd leave the disassembly alone. I get what you're doing here, but I'd rather leave it as what the preprocessed stencil used to look like and not try to do anything too clever.

self.holes.remove(hole)


Expand Down Expand Up @@ -289,8 +298,8 @@ def process_relocations(
self._trampolines.add(ordinal)
hole.addend = ordinal
hole.symbol = None
self.code.remove_jump(alignment=alignment)
self.code.pad(alignment)
self.code.remove_jump()
self.code.add_nop(alignment=alignment)
self.data.pad(8)
for stencil in [self.code, self.data]:
for hole in stencil.holes:
Expand Down
Loading