Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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)
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).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Have a look. I think I have addressed all your comments.


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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Removed.

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